fae4e48f72
Use exact jj snapshots and one candidate-bound Nix builder for incremental checks, template validation and activation. Keep provenance internal and separate recovery checkpoint failures from local command success. Provision workspace-scoped managed package/interface repositories with recoverable Central effects. Add TypeScript/React presets, function and dependency commands, and scaffold enrollment for all TODO packages. Install authoring guides and controlled Codex sandbox rules. Invalidate module resolutions across cutover, including in-flight races, and content-address host platform entries. Strengthen domain-model and verification instructions. Validated real jj/Nix authoring, React/Slate dependency installation, bottom-up local Git publication, packaged CLI tests, PostgreSQL recovery/auth tests, Web Studio tests and host configuration. Public protocol/helpers and the validated 19-resource TODO template are published. Retained the approved exact private baseline and updated the installation's default template pin to 68d54f0d52be433ebf60bdc1faf7646c57f90307. Master and live deployments remain unchanged. See docs/WORKSPACE_AUTHORING_PROGRESS.md.
51 lines
3.1 KiB
TypeScript
51 lines
3.1 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
import os from "node:os";
|
|
import { execFile as callback } from "node:child_process";
|
|
import { promisify } from "node:util";
|
|
import { snapshotRepository, checkWorkspaceCandidate } from "../src/capability-language/candidate-check.js";
|
|
const execFile = promisify(callback);
|
|
|
|
test("candidate snapshots include dirty and new files without changing Git history or index", async (context) => {
|
|
const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-candidate-test-"));
|
|
context.after(() => fs.rm(directory, { recursive: true, force: true }));
|
|
const root = path.join(directory, "source");
|
|
await fs.mkdir(root);
|
|
const git = (...args: string[]) => execFile("git", ["-C", root, ...args]);
|
|
await git("init");
|
|
await fs.writeFile(path.join(root, "tracked"), "original");
|
|
await fs.writeFile(path.join(root, ".gitignore"), "ignored\n");
|
|
await git("add", ".");
|
|
const index = await fs.readFile(path.join(root, ".git/index"));
|
|
await fs.writeFile(path.join(root, "tracked"), "edited");
|
|
await fs.writeFile(path.join(root, "new"), "new content");
|
|
await fs.writeFile(path.join(root, "ignored"), "not source");
|
|
const snapshot = await snapshotRepository(root, path.join(directory, "snapshot"));
|
|
assert.equal(await fs.readFile(path.join(snapshot.directory, "tracked"), "utf8"), "edited");
|
|
assert.equal(await fs.readFile(path.join(snapshot.directory, "new"), "utf8"), "new content");
|
|
await assert.rejects(fs.access(path.join(snapshot.directory, "ignored")));
|
|
assert.deepEqual(await fs.readFile(path.join(root, ".git/index")), index);
|
|
await assert.rejects(git("rev-parse", "--verify", "HEAD"), "no commit was created");
|
|
await fs.symlink("tracked", path.join(root, "link"));
|
|
await assert.rejects(snapshotRepository(root, path.join(directory, "rejected")), /regular file/);
|
|
});
|
|
|
|
test("candidate check produces explicitly non-activation evidence and never overwrites a report", async (context) => {
|
|
const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-check-test-"));
|
|
context.after(() => fs.rm(directory, { recursive: true, force: true }));
|
|
const root = path.join(directory, "source"), output = path.join(directory, "check");
|
|
await fs.mkdir(root);
|
|
await execFile("jj", ["git", "init", "--colocate", root]);
|
|
await fs.writeFile(path.join(root, "quixos.lock"), `quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${"a".repeat(40)}"; } }`);
|
|
await fs.writeFile(path.join(root, "workspace.qx"), `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"b".repeat(40)}" { atom Subject id "atom:subject"; }`);
|
|
const result = await checkWorkspaceCandidate({root, output});
|
|
assert.equal(result.candidateOnly, true);
|
|
assert.equal(result.activationEvidence, false);
|
|
assert.deepEqual(result.blockers, []);
|
|
const report = await fs.readFile(path.join(output, "report.json"));
|
|
await assert.rejects(checkWorkspaceCandidate({root, output}), /EEXIST/);
|
|
assert.deepEqual(await fs.readFile(path.join(output, "report.json")), report);
|
|
});
|