@sdd-method/sdd-cli 1.29.2 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/snapshot/advance.d.ts +57 -0
- package/dist/lib/snapshot/advance.d.ts.map +1 -0
- package/dist/lib/snapshot/advance.js +347 -0
- package/dist/lib/snapshot/advance.js.map +1 -0
- package/dist/lib/snapshot/catalogue-diff.d.ts +27 -0
- package/dist/lib/snapshot/catalogue-diff.d.ts.map +1 -0
- package/dist/lib/snapshot/catalogue-diff.js +154 -0
- package/dist/lib/snapshot/catalogue-diff.js.map +1 -0
- package/dist/lib/snapshot/diff.d.ts +73 -0
- package/dist/lib/snapshot/diff.d.ts.map +1 -0
- package/dist/lib/snapshot/diff.js +177 -0
- package/dist/lib/snapshot/diff.js.map +1 -0
- package/dist/lib/snapshot/fold.d.ts +14 -0
- package/dist/lib/snapshot/fold.d.ts.map +1 -0
- package/dist/lib/snapshot/fold.js +106 -0
- package/dist/lib/snapshot/fold.js.map +1 -0
- package/dist/lib/snapshot/land.d.ts +21 -0
- package/dist/lib/snapshot/land.d.ts.map +1 -0
- package/dist/lib/snapshot/land.js +166 -0
- package/dist/lib/snapshot/land.js.map +1 -0
- package/dist/lib/snapshot/manifest.d.ts +63 -0
- package/dist/lib/snapshot/manifest.d.ts.map +1 -0
- package/dist/lib/snapshot/manifest.js +159 -0
- package/dist/lib/snapshot/manifest.js.map +1 -0
- package/dist/lib/snapshot/targets.d.ts +33 -0
- package/dist/lib/snapshot/targets.d.ts.map +1 -0
- package/dist/lib/snapshot/targets.js +147 -0
- package/dist/lib/snapshot/targets.js.map +1 -0
- package/dist/lib/snapshot/verify.d.ts +18 -0
- package/dist/lib/snapshot/verify.d.ts.map +1 -0
- package/dist/lib/snapshot/verify.js +85 -0
- package/dist/lib/snapshot/verify.js.map +1 -0
- package/dist/verbs/catalogue.d.ts.map +1 -1
- package/dist/verbs/catalogue.js +13 -0
- package/dist/verbs/catalogue.js.map +1 -1
- package/dist/verbs/snapshot.d.ts +9 -0
- package/dist/verbs/snapshot.d.ts.map +1 -0
- package/dist/verbs/snapshot.js +128 -0
- package/dist/verbs/snapshot.js.map +1 -0
- package/package.json +2 -2
- package/scripts/build-verify-package.mjs +23 -2
- package/scripts/verify-acceptance.sh +39 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/lib/snapshot/verify.ts"],"names":[],"mappings":"AAoBA,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAElC,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAsD1G"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// `sdd-cli snapshot verify` — T0 provenance before the diff is trusted
|
|
2
|
+
// (delta-reverse.md §3).
|
|
3
|
+
//
|
|
4
|
+
// Two legs. LOCAL, checked here: each member folder exists, its `@revision`
|
|
5
|
+
// suffix matches source_revision, and where the export kept its `.git`, HEAD is
|
|
6
|
+
// that revision. CANONICAL — that the revision is a real commit on the canonical
|
|
7
|
+
// repo — cannot be proven from an export, so it is supplied: `--confirmed
|
|
8
|
+
// key=<how it was checked>` per member, or one recorded `--waiver` (who, why,
|
|
9
|
+
// date). A member with neither is "cannot assert", which FAILS: could-not-check
|
|
10
|
+
// is never silently checked. The result is written beside the baseline as
|
|
11
|
+
// provenance.yaml, so the waiver travels with the baseline it excuses.
|
|
12
|
+
import { execFile as execFileCb } from "node:child_process";
|
|
13
|
+
import { writeFile } from "node:fs/promises";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { promisify } from "node:util";
|
|
16
|
+
import { stringify } from "yaml";
|
|
17
|
+
import { SnapshotError, credentialNotice, exists, isIsoDate, memberBytesDir, readManifest, splitFolder } from "./manifest.js";
|
|
18
|
+
const execFile = promisify(execFileCb);
|
|
19
|
+
export async function runSnapshotVerify(inputs, write) {
|
|
20
|
+
try {
|
|
21
|
+
const m = await readManifest(inputs.areaRoot, inputs.id);
|
|
22
|
+
const notice = credentialNotice(m);
|
|
23
|
+
if (notice)
|
|
24
|
+
write(`${notice}\n`);
|
|
25
|
+
const w = inputs.waiver;
|
|
26
|
+
if (w && (!w.who || !w.why || !isIsoDate(w.date))) {
|
|
27
|
+
throw new SnapshotError("--waiver needs who=…,why=…,date=YYYY-MM-DD — an unattributed waiver is a skip with a name on it");
|
|
28
|
+
}
|
|
29
|
+
const rows = [];
|
|
30
|
+
const failures = [];
|
|
31
|
+
for (const mem of m.members) {
|
|
32
|
+
const dir = memberBytesDir(inputs.areaRoot, m, mem);
|
|
33
|
+
let local = "ok";
|
|
34
|
+
if (!(await exists(dir)))
|
|
35
|
+
local = `FAIL: ${dir} does not exist`;
|
|
36
|
+
else if (splitFolder(mem.exported_folder_name)?.revision !== mem.source_revision) {
|
|
37
|
+
local = `FAIL: folder revision does not match source_revision ${mem.source_revision}`;
|
|
38
|
+
}
|
|
39
|
+
else if (await exists(join(dir, ".git"))) {
|
|
40
|
+
const head = (await execFile("git", ["-C", dir, "rev-parse", "HEAD"])).stdout.trim();
|
|
41
|
+
if (!head.startsWith(mem.source_revision))
|
|
42
|
+
local = `FAIL: .git HEAD ${head} is not ${mem.source_revision}`;
|
|
43
|
+
else
|
|
44
|
+
local = "ok (git HEAD matches)";
|
|
45
|
+
}
|
|
46
|
+
const how = inputs.confirmed?.get(mem.canonical_repo_key);
|
|
47
|
+
const canonical = how ? `confirmed: ${how}` : w ? "waived" : "CANNOT ASSERT";
|
|
48
|
+
if (local.startsWith("FAIL"))
|
|
49
|
+
failures.push(`${mem.canonical_repo_key}: ${local}`);
|
|
50
|
+
if (canonical === "CANNOT ASSERT")
|
|
51
|
+
failures.push(`${mem.canonical_repo_key}: canonical provenance not confirmed and no waiver`);
|
|
52
|
+
rows.push({ canonical_repo_key: mem.canonical_repo_key, local, canonical });
|
|
53
|
+
}
|
|
54
|
+
for (const k of inputs.confirmed?.keys() ?? []) {
|
|
55
|
+
if (!m.members.some((x) => x.canonical_repo_key === k))
|
|
56
|
+
throw new SnapshotError(`--confirmed ${k}: not a member of ${inputs.id}`);
|
|
57
|
+
}
|
|
58
|
+
const report = {
|
|
59
|
+
baseline: inputs.id,
|
|
60
|
+
verified_at: inputs.today ?? new Date().toISOString().slice(0, 10),
|
|
61
|
+
result: failures.length === 0 ? (w ? "pass-with-waiver" : "pass") : "fail",
|
|
62
|
+
...(w ? { waiver: w } : {}),
|
|
63
|
+
members: rows,
|
|
64
|
+
};
|
|
65
|
+
await writeFile(join(inputs.areaRoot, inputs.id, "provenance.yaml"), stringify(report, { lineWidth: 0 }));
|
|
66
|
+
for (const r of rows)
|
|
67
|
+
write(`${r.canonical_repo_key}: local ${r.local}; canonical ${r.canonical}\n`);
|
|
68
|
+
if (w)
|
|
69
|
+
write(`WAIVER in force — ${w.who}, ${w.date}: ${w.why}\n`);
|
|
70
|
+
if (failures.length > 0) {
|
|
71
|
+
write(`FAIL: ${failures.length} problem(s); written to provenance.yaml\n`);
|
|
72
|
+
return { exitCode: 1 };
|
|
73
|
+
}
|
|
74
|
+
write(`${report.result}: ${rows.length} member(s)\n`);
|
|
75
|
+
return { exitCode: 0 };
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (e instanceof SnapshotError) {
|
|
79
|
+
write(`REFUSED: ${e.message}\n`);
|
|
80
|
+
return { exitCode: 1 };
|
|
81
|
+
}
|
|
82
|
+
throw e;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/lib/snapshot/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgKxD"}
|
package/dist/verbs/catalogue.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
1
2
|
import { registerCatalogueBaselineCheck, registerCatalogueImpact, registerCatalogueValidate, registerCatalogueVersion, } from "./catalogue-verify.js";
|
|
2
3
|
import { runCatalogueBuild, runCatalogueAggregate, runCatalogueMigrationMap, } from "../lib/catalogue/index.js";
|
|
3
4
|
import { runCatalogueGraph } from "../lib/catalogue/graph-run.js";
|
|
5
|
+
import { runCatalogueDiff } from "../lib/snapshot/catalogue-diff.js";
|
|
4
6
|
export function registerCatalogue(program) {
|
|
5
7
|
const catalogue = program
|
|
6
8
|
.command("catalogue")
|
|
@@ -40,6 +42,17 @@ export function registerCatalogue(program) {
|
|
|
40
42
|
process.exit(result.exitCode);
|
|
41
43
|
});
|
|
42
44
|
registerCatalogueValidate(catalogue);
|
|
45
|
+
catalogue
|
|
46
|
+
.command("diff")
|
|
47
|
+
.description("Build the catalogues at a git ref and at the working tree in ONE process (so one CLI), and attribute the change at file grain: every SDD source file changed since the ref must be a target of some delta.yaml finding. Exit 1 on any unattributed change. Writes nothing into the SDD.")
|
|
48
|
+
.requiredOption("--from <ref>", "the git ref of the SDD before the snapshot update")
|
|
49
|
+
.requiredOption("--attribute <delta.yaml>", "the snapshot's delta.yaml, whose findings' targets attribute the change")
|
|
50
|
+
.option("--sdd-path <path>", "Path to the SDD repo root (defaults to cwd)")
|
|
51
|
+
.action(async (opts) => {
|
|
52
|
+
const r = await runCatalogueDiff({ sddPath: resolve(opts.sddPath ?? process.cwd()), from: opts.from, attribute: resolve(opts.attribute) }, (s) => process.stdout.write(s));
|
|
53
|
+
if (r.exitCode !== 0)
|
|
54
|
+
process.exit(r.exitCode);
|
|
55
|
+
});
|
|
43
56
|
catalogue
|
|
44
57
|
.command("graph")
|
|
45
58
|
.description("Emit the graph projection (typed node/edge JSON Lines) derived from built catalogues (M-ADR 0205 §4.6) — regenerated every run, digest-stamped, never committed")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../src/verbs/catalogue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* `a=1,b=2` → object (for records like the credential scan and a waiver). A comma
|
|
4
|
+
* splits only where the next part starts a new `key=`, so free text — a
|
|
5
|
+
* disposition, a waiver's reason — may contain commas without being cut short.
|
|
6
|
+
*/
|
|
7
|
+
export declare function record(value: string | undefined): Record<string, string> | undefined;
|
|
8
|
+
export declare function registerSnapshot(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/verbs/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BzC;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAQpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoIvD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { runSnapshotAdvance } from "../lib/snapshot/advance.js";
|
|
3
|
+
import { runSnapshotDiff } from "../lib/snapshot/diff.js";
|
|
4
|
+
import { runSnapshotFold } from "../lib/snapshot/fold.js";
|
|
5
|
+
import { runSnapshotLand } from "../lib/snapshot/land.js";
|
|
6
|
+
import { runSnapshotTargets } from "../lib/snapshot/targets.js";
|
|
7
|
+
import { runSnapshotVerify } from "../lib/snapshot/verify.js";
|
|
8
|
+
const out = (s) => process.stdout.write(s);
|
|
9
|
+
const exit = ({ exitCode }) => {
|
|
10
|
+
if (exitCode !== 0)
|
|
11
|
+
process.exit(exitCode);
|
|
12
|
+
};
|
|
13
|
+
/** Repeatable `key=value` option → Map. The value may itself contain `=`. */
|
|
14
|
+
function collectPairs(value, prior) {
|
|
15
|
+
const i = value.indexOf("=");
|
|
16
|
+
if (i <= 0)
|
|
17
|
+
throw new Error(`expected key=value, got '${value}'`);
|
|
18
|
+
prior.set(value.slice(0, i), value.slice(i + 1));
|
|
19
|
+
return prior;
|
|
20
|
+
}
|
|
21
|
+
function collectList(value, prior) {
|
|
22
|
+
prior.push(value);
|
|
23
|
+
return prior;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* `a=1,b=2` → object (for records like the credential scan and a waiver). A comma
|
|
27
|
+
* splits only where the next part starts a new `key=`, so free text — a
|
|
28
|
+
* disposition, a waiver's reason — may contain commas without being cut short.
|
|
29
|
+
*/
|
|
30
|
+
export function record(value) {
|
|
31
|
+
if (value === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
const o = {};
|
|
34
|
+
for (const part of value.split(/,(?=\s*[A-Za-z_]+=)/)) {
|
|
35
|
+
const i = part.indexOf("=");
|
|
36
|
+
if (i > 0)
|
|
37
|
+
o[part.slice(0, i).trim()] = part.slice(i + 1).trim();
|
|
38
|
+
}
|
|
39
|
+
return o;
|
|
40
|
+
}
|
|
41
|
+
export function registerSnapshot(program) {
|
|
42
|
+
const snapshot = program
|
|
43
|
+
.command("snapshot")
|
|
44
|
+
.description("Implementation-set snapshots: the deterministic steps of delta-reverse (M-ADR 0180 §2.7, M-ADR 0181 §2.5), run by the reverse-snapshot-delta skill");
|
|
45
|
+
snapshot
|
|
46
|
+
.command("fold <area>")
|
|
47
|
+
.description("Move a flat <repo>@<rev>/ area into its first dated baseline, write its manifest, and list every reference to the old paths")
|
|
48
|
+
.option("--id <date>", "the date the flat exports were OBSERVED (YYYY-MM-DD); no default")
|
|
49
|
+
.option("--implementation <id>", "the durable system identity")
|
|
50
|
+
.option("--key <folder=key>", "canonical_repo_key for a folder (repeatable)", collectPairs, new Map())
|
|
51
|
+
.option("--scan <root>", "a root to search for references to the old paths — scan the estate, not only the SDD (repeatable)", collectList, [])
|
|
52
|
+
.action(async (area, o) => exit(await runSnapshotFold({
|
|
53
|
+
areaRoot: resolve(area),
|
|
54
|
+
...(o.id !== undefined ? { id: o.id } : {}),
|
|
55
|
+
...(o.implementation !== undefined ? { implementation: o.implementation } : {}),
|
|
56
|
+
keys: o.key,
|
|
57
|
+
scanRoots: o.scan.map((r) => resolve(r)),
|
|
58
|
+
}, out)));
|
|
59
|
+
snapshot
|
|
60
|
+
.command("land <area>")
|
|
61
|
+
.description("Write a new baseline's manifest: every prior member re-observed, carried (with a reason) or removed (with a reason); refuses without a recorded credential scan")
|
|
62
|
+
.option("--id <date>", "the date the snapshot was OBSERVED (YYYY-MM-DD); no default, so the processing date cannot slip in")
|
|
63
|
+
.option("--prior <date>", "the baseline this supersedes (default: the latest earlier one)")
|
|
64
|
+
.option("--implementation <id>", "the durable system identity (default: the prior baseline's)")
|
|
65
|
+
.option("--member-date <key=date>", "a member observed on another day than the set (repeatable)", collectPairs, new Map())
|
|
66
|
+
.option("--carried <key=reason>", "a prior member not re-exported, and why (repeatable)", collectPairs, new Map())
|
|
67
|
+
.option("--removed <key=reason>", "a prior member that left the set, and why (repeatable)", collectPairs, new Map())
|
|
68
|
+
.option("--key <folder=key>", "canonical_repo_key for a new member's folder (repeatable)", collectPairs, new Map())
|
|
69
|
+
.option("--credential-scan <record>", "tool=…,version=…,date=YYYY-MM-DD,result=clean — or result=<findings>,disposition=<what, and why it stands>")
|
|
70
|
+
.option("--notes <text>", "coherence caveats for the manifest")
|
|
71
|
+
.action(async (area, o) => {
|
|
72
|
+
const scan = record(o.credentialScan);
|
|
73
|
+
exit(await runSnapshotLand({
|
|
74
|
+
areaRoot: resolve(area),
|
|
75
|
+
...(o.id !== undefined ? { id: o.id } : {}),
|
|
76
|
+
...(o.prior !== undefined ? { prior: o.prior } : {}),
|
|
77
|
+
...(o.implementation !== undefined ? { implementation: o.implementation } : {}),
|
|
78
|
+
memberDates: o.memberDate,
|
|
79
|
+
carried: o.carried,
|
|
80
|
+
removed: o.removed,
|
|
81
|
+
keys: o.key,
|
|
82
|
+
...(scan ? { credentialScan: scan } : {}),
|
|
83
|
+
...(o.notes !== undefined ? { notes: o.notes } : {}),
|
|
84
|
+
}, out));
|
|
85
|
+
});
|
|
86
|
+
snapshot
|
|
87
|
+
.command("verify <area>")
|
|
88
|
+
.description("Check a baseline's provenance: local folder/revision consistency here, canonical-repo confirmation supplied per member or waived on the record; cannot-assert FAILS")
|
|
89
|
+
.requiredOption("--id <date>", "the baseline to verify (normally T0)")
|
|
90
|
+
.option("--confirmed <key=how>", "how a member's revision was confirmed on its canonical repo (repeatable)", collectPairs, new Map())
|
|
91
|
+
.option("--waiver <record>", "who=…,why=…,date=YYYY-MM-DD — recorded in provenance.yaml and printed on every run")
|
|
92
|
+
.action(async (area, o) => {
|
|
93
|
+
const w = record(o.waiver);
|
|
94
|
+
exit(await runSnapshotVerify({ areaRoot: resolve(area), id: o.id, confirmed: o.confirmed, ...(w ? { waiver: w } : {}) }, out));
|
|
95
|
+
});
|
|
96
|
+
snapshot
|
|
97
|
+
.command("diff <area>")
|
|
98
|
+
.description("Classify members from the two manifests and diff changed members by evidence class into delta.yaml (status: proposed); refuses once any finding carries judgement")
|
|
99
|
+
.requiredOption("--to <date>", "the new baseline (T1)")
|
|
100
|
+
.option("--from <date>", "the prior baseline (default: T1's prior_snapshot)")
|
|
101
|
+
.action(async (area, o) => exit(await runSnapshotDiff({ areaRoot: resolve(area), to: o.to, ...(o.from !== undefined ? { from: o.from } : {}) }, out)));
|
|
102
|
+
snapshot
|
|
103
|
+
.command("targets <area>")
|
|
104
|
+
.description("Route each delta.yaml finding to the SDD artefacts that cite it, recording the grain (file | repo) of each route")
|
|
105
|
+
.requiredOption("--id <date>", "the baseline whose delta.yaml to route")
|
|
106
|
+
.option("--sdd-path <path>", "the SDD repo root (defaults to cwd)")
|
|
107
|
+
.option("--derived <glob>", "SDD-relative glob of GENERATED artefacts (scores, reports, registries) — marked to regenerate, not re-derive (repeatable)", collectList, [])
|
|
108
|
+
.action(async (area, o) => exit(await runSnapshotTargets({ areaRoot: resolve(area), id: o.id, sddPath: resolve(o.sddPath ?? process.cwd()), derived: o.derived }, out)));
|
|
109
|
+
snapshot
|
|
110
|
+
.command("advance <area>")
|
|
111
|
+
.description("Advance each member's evidence pin to the baseline and append one history entry; refuses before delta.yaml, without impact, on legacy history or an unknown reverse_status")
|
|
112
|
+
.requiredOption("--to <date>", "the baseline to advance to (T1)")
|
|
113
|
+
.option("--sdd-path <path>", "the SDD repo root (defaults to cwd)")
|
|
114
|
+
.option("--member <key>", "limit to these members (repeatable)", collectList, [])
|
|
115
|
+
.option("--migrate-history", "convert legacy entries: histories to history[] first (phase: scan rows only)")
|
|
116
|
+
.option("--record-only", "for a pin already moved to --to by hand: write its history row, leave the pin")
|
|
117
|
+
.option("--notes <key=text>", "prose for a member's history row, beside the notes composed from its findings (repeatable)", collectPairs, new Map())
|
|
118
|
+
.action(async (area, o) => exit(await runSnapshotAdvance({
|
|
119
|
+
areaRoot: resolve(area),
|
|
120
|
+
to: o.to,
|
|
121
|
+
sddPath: resolve(o.sddPath ?? process.cwd()),
|
|
122
|
+
...(o.member.length > 0 ? { members: o.member } : {}),
|
|
123
|
+
migrateHistory: o.migrateHistory === true,
|
|
124
|
+
recordOnly: o.recordOnly === true,
|
|
125
|
+
notes: o.notes,
|
|
126
|
+
}, out)));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/verbs/snapshot.ts"],"names":[],"mappings":"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"}
|