@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
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAC;AAwBpD,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED,wBAAgB,YAAY,IAAI,OAAO,CAqCtC"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import { registerPack } from "./verbs/pack.js";
|
|
|
13
13
|
import { registerPlan } from "./verbs/plan.js";
|
|
14
14
|
import { registerRender } from "./verbs/render.js";
|
|
15
15
|
import { registerScaffold } from "./verbs/scaffold.js";
|
|
16
|
+
import { registerSnapshot } from "./verbs/snapshot.js";
|
|
16
17
|
import { registerSync } from "./verbs/sync.js";
|
|
17
18
|
import { registerValidate } from "./verbs/validate.js";
|
|
18
19
|
const SPEC_URL = "https://github.com/tomfosteruk/sdd-method/blob/main/docs/method/cli/sdd-cli-specification.md";
|
|
@@ -59,6 +60,7 @@ export function buildProgram() {
|
|
|
59
60
|
registerRender(program);
|
|
60
61
|
registerScaffold(program);
|
|
61
62
|
registerMetamodel(program);
|
|
63
|
+
registerSnapshot(program);
|
|
62
64
|
for (const { verb, summary } of NOT_YET_IMPLEMENTED) {
|
|
63
65
|
registerNotYetImplemented(program, verb, summary);
|
|
64
66
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
type Writer = (s: string) => void;
|
|
2
|
+
export declare const REVERSE_STATUSES: readonly ["classified", "reversed"];
|
|
3
|
+
export declare const IMPACTS: readonly ["none", "repo-minor", "repo-major", "product-major"];
|
|
4
|
+
export interface AdvanceInputs {
|
|
5
|
+
sddPath: string;
|
|
6
|
+
areaRoot: string;
|
|
7
|
+
to: string;
|
|
8
|
+
members?: readonly string[];
|
|
9
|
+
migrateHistory?: boolean;
|
|
10
|
+
/** Write the history row for a pin already moved by hand, without moving it. */
|
|
11
|
+
recordOnly?: boolean;
|
|
12
|
+
/** Per-member prose appended to the composed notes. */
|
|
13
|
+
notes?: ReadonlyMap<string, string>;
|
|
14
|
+
}
|
|
15
|
+
interface Plan {
|
|
16
|
+
key: string;
|
|
17
|
+
dir: string;
|
|
18
|
+
history: Record<string, unknown>;
|
|
19
|
+
migrated: boolean;
|
|
20
|
+
metadataText: string;
|
|
21
|
+
entry: Record<string, unknown>;
|
|
22
|
+
metadata: Record<string, string>;
|
|
23
|
+
movePin: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The snapshot identity of a metadata file, deriving what the folder-name
|
|
27
|
+
* convention `<repo>-<branch>@<rev>` makes certain: the revision always, the
|
|
28
|
+
* branch only when the suffix is a known branch name. What was derived is
|
|
29
|
+
* returned so the caller can say so.
|
|
30
|
+
*/
|
|
31
|
+
export declare function identityOf(metadata: Record<string, unknown>): {
|
|
32
|
+
fields: Record<string, string>;
|
|
33
|
+
derived: string[];
|
|
34
|
+
missing: string[];
|
|
35
|
+
};
|
|
36
|
+
export declare function runSnapshotAdvance(inputs: AdvanceInputs, write: Writer): Promise<{
|
|
37
|
+
exitCode: number;
|
|
38
|
+
}>;
|
|
39
|
+
/** Convert a legacy `entries:` history. Only `phase: scan` rows convert mechanically. */
|
|
40
|
+
export declare function migrateLegacy(legacy: {
|
|
41
|
+
entries?: unknown[];
|
|
42
|
+
}, metadata: Record<string, unknown>): Record<string, unknown> & {
|
|
43
|
+
derived: string[];
|
|
44
|
+
};
|
|
45
|
+
/** Re-point a source_path at another baseline and folder; null if it has no dated segment. */
|
|
46
|
+
export declare function repoint(sourcePath: string, newBaseline: string, newFolder: string): string | null;
|
|
47
|
+
export declare function advance(inputs: AdvanceInputs, write: Writer): Promise<Plan[]>;
|
|
48
|
+
/** Replace (or append) top-level `key: value` lines, leaving every other byte alone. */
|
|
49
|
+
export declare function setTopLevelScalars(text: string, values: Readonly<Record<string, string>>): string;
|
|
50
|
+
/**
|
|
51
|
+
* Append one entry to a `history:` list that ends the file, at the list's own
|
|
52
|
+
* indentation. Falls back to a document edit when `history:` is not the last
|
|
53
|
+
* top-level key; the caller's post-write check covers both paths.
|
|
54
|
+
*/
|
|
55
|
+
export declare function appendHistoryEntry(text: string, entry: Record<string, unknown>): string;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=advance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advance.d.ts","sourceRoot":"","sources":["../../../src/lib/snapshot/advance.ts"],"names":[],"mappings":"AAyCA,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAElC,eAAO,MAAM,gBAAgB,qCAAsC,CAAC;AACpE,eAAO,MAAM,OAAO,gEAAiE,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,UAAU,IAAI;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;CAClB;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAsBtI;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAY5G;AAgBD,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAuBjJ;AAgBD,8FAA8F;AAC9F,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjG;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA8KnF;AAMD,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAQjG;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAavF"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
// `sdd-cli snapshot advance` — move each member's evidence pin to T1 and
|
|
2
|
+
// append one history entry (delta-reverse.md §8).
|
|
3
|
+
//
|
|
4
|
+
// Refusals, each a failure a hand run made:
|
|
5
|
+
// - no delta.yaml for T1 (the pin advanced before the diff existed);
|
|
6
|
+
// - no `impact` recorded (step 5a not done);
|
|
7
|
+
// - a legacy `entries:` history, unless --migrate-history converts it first;
|
|
8
|
+
// - a `phase:` key or a `reverse_status` outside {classified, reversed};
|
|
9
|
+
// - a source_path with no dated baseline segment (the area is not folded);
|
|
10
|
+
// - a finding of the member still unclassified (step 5 before step 8);
|
|
11
|
+
// - a pin already at the target revision, moved by hand before the tool
|
|
12
|
+
// existed (--record-only writes the row without moving it), or at a
|
|
13
|
+
// revision that is neither the prior baseline's nor the target's.
|
|
14
|
+
// `impact: none` is decided from the two MANIFESTS (same revision at T0 and
|
|
15
|
+
// T1), never from the pin: a pin moved by hand already holds T1's revision, and
|
|
16
|
+
// reading it would record a changed member as unchanged.
|
|
17
|
+
// It checks everything before it writes anything, and it only ever APPENDS:
|
|
18
|
+
// after writing it re-reads each history and asserts the prior entries are
|
|
19
|
+
// unchanged and exactly one was added. Entries are never cut or rewritten —
|
|
20
|
+
// for an unchanged member the T0 and T1 entries share folder name and
|
|
21
|
+
// revision, so any edit keyed on those removes both.
|
|
22
|
+
import { isDeepStrictEqual } from "node:util";
|
|
23
|
+
import { readdir, readFile, writeFile } from "node:fs/promises";
|
|
24
|
+
import { join } from "node:path";
|
|
25
|
+
import { parse, parseDocument, stringify } from "yaml";
|
|
26
|
+
// Both writers below edit TEXT, not a re-serialised document: re-serialising
|
|
27
|
+
// reflows every long string in the file, so an evidence pin would arrive with
|
|
28
|
+
// unrelated churn in lines the tool had no business touching.
|
|
29
|
+
import { deltaPath } from "./diff.js";
|
|
30
|
+
import { SnapshotError, credentialNotice, exists, isIsoDate, readManifest, splitFolder, } from "./manifest.js";
|
|
31
|
+
export const REVERSE_STATUSES = ["classified", "reversed"];
|
|
32
|
+
export const IMPACTS = ["none", "repo-minor", "repo-major", "product-major"];
|
|
33
|
+
const BRANCH = /-(master|main|develop|trunk)$/;
|
|
34
|
+
/**
|
|
35
|
+
* The snapshot identity of a metadata file, deriving what the folder-name
|
|
36
|
+
* convention `<repo>-<branch>@<rev>` makes certain: the revision always, the
|
|
37
|
+
* branch only when the suffix is a known branch name. What was derived is
|
|
38
|
+
* returned so the caller can say so.
|
|
39
|
+
*/
|
|
40
|
+
export function identityOf(metadata) {
|
|
41
|
+
const str = (v) => (v === undefined || v === null || v === "" ? undefined : String(v));
|
|
42
|
+
const folder = str(metadata.exported_folder_name);
|
|
43
|
+
const split = folder ? splitFolder(folder) : null;
|
|
44
|
+
const derived = [];
|
|
45
|
+
let rev = str(metadata.source_revision);
|
|
46
|
+
if (!rev && split) {
|
|
47
|
+
rev = split.revision;
|
|
48
|
+
derived.push("source_revision");
|
|
49
|
+
}
|
|
50
|
+
let branch = str(metadata.exported_branch);
|
|
51
|
+
if (!branch && split) {
|
|
52
|
+
branch = split.stem.match(BRANCH)?.[1];
|
|
53
|
+
if (branch)
|
|
54
|
+
derived.push("exported_branch");
|
|
55
|
+
}
|
|
56
|
+
const fields = {};
|
|
57
|
+
const missing = [];
|
|
58
|
+
for (const [k, v] of [["exported_folder_name", folder], ["exported_branch", branch], ["source_revision", rev], ["source_path", str(metadata.source_path)]]) {
|
|
59
|
+
if (v)
|
|
60
|
+
fields[k] = v;
|
|
61
|
+
else
|
|
62
|
+
missing.push(k);
|
|
63
|
+
}
|
|
64
|
+
return { fields, derived, missing };
|
|
65
|
+
}
|
|
66
|
+
export async function runSnapshotAdvance(inputs, write) {
|
|
67
|
+
try {
|
|
68
|
+
const plans = await advance(inputs, write);
|
|
69
|
+
write(`advanced ${plans.length} member(s) to ${inputs.to}\n`);
|
|
70
|
+
return { exitCode: 0 };
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if (e instanceof SnapshotError) {
|
|
74
|
+
write(`REFUSED (nothing written): ${e.message}\n`);
|
|
75
|
+
return { exitCode: 1 };
|
|
76
|
+
}
|
|
77
|
+
throw e;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function evidenceDirs(sddPath) {
|
|
81
|
+
const out = new Map();
|
|
82
|
+
const repos = join(sddPath, "repos");
|
|
83
|
+
if (!(await exists(repos)))
|
|
84
|
+
return out;
|
|
85
|
+
for (const e of await readdir(repos, { withFileTypes: true })) {
|
|
86
|
+
if (!e.isDirectory())
|
|
87
|
+
continue;
|
|
88
|
+
const md = join(repos, e.name, "reverse-metadata.yaml");
|
|
89
|
+
if (!(await exists(md)))
|
|
90
|
+
continue;
|
|
91
|
+
const key = parse(await readFile(md, "utf8"))?.canonical_repo_key;
|
|
92
|
+
out.set(key ?? e.name, join(repos, e.name));
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/** Convert a legacy `entries:` history. Only `phase: scan` rows convert mechanically. */
|
|
97
|
+
export function migrateLegacy(legacy, metadata) {
|
|
98
|
+
const entries = (legacy.entries ?? []);
|
|
99
|
+
const other = entries.filter((e) => e.phase !== undefined && e.phase !== "scan");
|
|
100
|
+
if (other.length > 0) {
|
|
101
|
+
throw new SnapshotError(`legacy history has ${other.length} row(s) with phase other than 'scan' (${[...new Set(other.map((e) => String(e.phase)))].join(", ")}): ` +
|
|
102
|
+
"which snapshot each describes cannot be derived, so convert those by hand");
|
|
103
|
+
}
|
|
104
|
+
const id = identityOf(metadata);
|
|
105
|
+
if (id.missing.length > 0) {
|
|
106
|
+
throw new SnapshotError(`cannot migrate: reverse-metadata.yaml has no ${id.missing.join(", ")}, and the folder name does not supply it`);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
derived: id.derived,
|
|
110
|
+
canonical_repo_key: metadata.canonical_repo_key,
|
|
111
|
+
history: entries.map((e) => ({
|
|
112
|
+
...id.fields,
|
|
113
|
+
scanned_at: e.date,
|
|
114
|
+
reverse_status: "reversed",
|
|
115
|
+
notes: `${String(e.notes ?? "").trim()} (Migrated from the legacy entries: shape — originally phase: ${String(e.phase ?? "unset")}, actor: ${String(e.actor ?? "unset")}; identity fields taken from reverse-metadata.yaml at migration${id.derived.length > 0 ? `, ${id.derived.join(" and ")} derived from the folder name` : ""}.)`.trim(),
|
|
116
|
+
})),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function checkHistory(file, h) {
|
|
120
|
+
const problems = [];
|
|
121
|
+
const hist = h.history;
|
|
122
|
+
if (!Array.isArray(hist))
|
|
123
|
+
return [`${file}: no history[] list`];
|
|
124
|
+
for (const [i, e] of hist.entries()) {
|
|
125
|
+
if (e.phase !== undefined)
|
|
126
|
+
problems.push(`${file}: history[${i}] has a 'phase' key — not a field of the convention`);
|
|
127
|
+
const s = e.reverse_status;
|
|
128
|
+
if (s !== undefined && !REVERSE_STATUSES.includes(s)) {
|
|
129
|
+
problems.push(`${file}: history[${i}].reverse_status '${String(s)}' is not one of ${REVERSE_STATUSES.join(", ")}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return problems;
|
|
133
|
+
}
|
|
134
|
+
/** Re-point a source_path at another baseline and folder; null if it has no dated segment. */
|
|
135
|
+
export function repoint(sourcePath, newBaseline, newFolder) {
|
|
136
|
+
const parts = sourcePath.split("/");
|
|
137
|
+
const i = parts.findIndex((p) => isIsoDate(p));
|
|
138
|
+
if (i < 0)
|
|
139
|
+
return null;
|
|
140
|
+
return [...parts.slice(0, i), newBaseline, newFolder].join("/");
|
|
141
|
+
}
|
|
142
|
+
export async function advance(inputs, write) {
|
|
143
|
+
const { sddPath, areaRoot, to } = inputs;
|
|
144
|
+
const t1 = await readManifest(areaRoot, to);
|
|
145
|
+
const dp = deltaPath(areaRoot, to);
|
|
146
|
+
if (!(await exists(dp))) {
|
|
147
|
+
throw new SnapshotError(`no ${dp}: the pin advances after the delta is recorded (run snapshot diff, then classify)`);
|
|
148
|
+
}
|
|
149
|
+
const delta = parse(await readFile(dp, "utf8"));
|
|
150
|
+
const fromId = delta.from_snapshot ?? t1.prior_snapshot;
|
|
151
|
+
const t0 = fromId ? await readManifest(areaRoot, fromId) : null;
|
|
152
|
+
const t0Rev = new Map((t0?.members ?? []).map((x) => [x.canonical_repo_key, x.source_revision]));
|
|
153
|
+
const notice = credentialNotice(t1);
|
|
154
|
+
if (notice)
|
|
155
|
+
write(`${notice}\n`);
|
|
156
|
+
if (!delta.impact)
|
|
157
|
+
throw new SnapshotError(`${dp} has no impact: classify first (delta-reverse.md §5a)`);
|
|
158
|
+
const impactOk = (v) => IMPACTS.includes(v);
|
|
159
|
+
if (!impactOk(delta.impact))
|
|
160
|
+
throw new SnapshotError(`${dp}: impact '${delta.impact}' is not one of ${IMPACTS.join(", ")}`);
|
|
161
|
+
const changed = new Map((delta.members_changed ?? []).map((c) => [c.canonical_repo_key, c]));
|
|
162
|
+
const dirs = await evidenceDirs(sddPath);
|
|
163
|
+
const wanted = inputs.members ? new Set(inputs.members) : null;
|
|
164
|
+
const problems = [];
|
|
165
|
+
const plans = [];
|
|
166
|
+
for (const m of t1.members) {
|
|
167
|
+
if (wanted && !wanted.has(m.canonical_repo_key))
|
|
168
|
+
continue;
|
|
169
|
+
if (m.carried_from !== undefined)
|
|
170
|
+
continue; // carried: no new entry — the manifest records where its bytes are
|
|
171
|
+
const key = m.canonical_repo_key;
|
|
172
|
+
const dir = dirs.get(key);
|
|
173
|
+
if (!dir) {
|
|
174
|
+
problems.push(`${key}: no repos/*/reverse-metadata.yaml with this canonical_repo_key — a new member is seeded (step 7) before its pin advances`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const hFile = join(dir, "reverse-history.yaml");
|
|
178
|
+
const mFile = join(dir, "reverse-metadata.yaml");
|
|
179
|
+
const metadataText = await readFile(mFile, "utf8");
|
|
180
|
+
const metadata = parse(metadataText);
|
|
181
|
+
let history = (await exists(hFile)) ? parse(await readFile(hFile, "utf8")) : { canonical_repo_key: key, history: [] };
|
|
182
|
+
let migrated = false;
|
|
183
|
+
if (Array.isArray(history.entries)) {
|
|
184
|
+
if (!inputs.migrateHistory) {
|
|
185
|
+
problems.push(`${hFile}: legacy entries: history — pass --migrate-history to convert it first`);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
// Legacy rows describe the snapshot the pin held when they were written. If
|
|
190
|
+
// the pin was moved to T1 by hand, that was T0 — so T0's identity, never
|
|
191
|
+
// the current pin's, or a pre-T1 scan row would claim T1's revision.
|
|
192
|
+
let source = metadata;
|
|
193
|
+
const t0m = t0?.members.find((x) => x.canonical_repo_key === key);
|
|
194
|
+
const pinnedNow = identityOf(metadata).fields.source_revision;
|
|
195
|
+
if (t0m && pinnedNow === m.source_revision && t0m.source_revision !== m.source_revision) {
|
|
196
|
+
const t0Path = repoint(String(metadata.source_path ?? ""), t0m.carried_from ?? t0.snapshot_id, t0m.exported_folder_name);
|
|
197
|
+
source = { ...metadata, exported_folder_name: t0m.exported_folder_name, source_revision: t0m.source_revision, exported_branch: undefined, source_path: t0Path ?? undefined };
|
|
198
|
+
write(`${key}: pin was moved by hand, so its legacy rows take ${fromId}'s identity (${t0m.exported_folder_name})\n`);
|
|
199
|
+
}
|
|
200
|
+
const mig = migrateLegacy(history, source);
|
|
201
|
+
// A row cannot describe a baseline observed after it was written.
|
|
202
|
+
const rows = mig.history;
|
|
203
|
+
const baseline = String(rows[0]?.source_path ?? "").split("/").find((p) => isIsoDate(p));
|
|
204
|
+
const early = rows.filter((e) => baseline !== undefined && String(e.scanned_at) < baseline);
|
|
205
|
+
if (early.length > 0) {
|
|
206
|
+
throw new SnapshotError(`${early.length} legacy row(s) dated before baseline ${baseline}, the one their identity would name — which snapshot they describe must be set by hand`);
|
|
207
|
+
}
|
|
208
|
+
const { derived, ...doc } = mig;
|
|
209
|
+
// The key the evidence dir was matched by, where the metadata does not carry one.
|
|
210
|
+
history = { ...doc, canonical_repo_key: doc.canonical_repo_key ?? key };
|
|
211
|
+
migrated = true;
|
|
212
|
+
for (const d of derived)
|
|
213
|
+
write(`${key}: ${d} derived from folder name ${metadata.exported_folder_name}\n`);
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
problems.push(`${hFile}: ${e.message}`);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
problems.push(...checkHistory(hFile, history));
|
|
221
|
+
const hist = history.history;
|
|
222
|
+
const last = hist[hist.length - 1];
|
|
223
|
+
const scannedAt = m.observed_at ?? t1.observed_at;
|
|
224
|
+
if (last && last.exported_folder_name === m.exported_folder_name && last.scanned_at === scannedAt) {
|
|
225
|
+
write(`${key}: already at ${to} — skipped\n`);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const newPath = repoint(String(metadata.source_path ?? ""), to, m.exported_folder_name);
|
|
229
|
+
if (newPath === null) {
|
|
230
|
+
problems.push(`${mFile}: source_path '${metadata.source_path}' has no dated baseline segment — fold the area first`);
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const priorRev = t0Rev.get(key);
|
|
234
|
+
const pinned = identityOf(metadata).fields.source_revision;
|
|
235
|
+
const sameRevision = priorRev !== undefined && priorRev === m.source_revision;
|
|
236
|
+
let movePin = true;
|
|
237
|
+
if (pinned === m.source_revision && !sameRevision) {
|
|
238
|
+
if (!inputs.recordOnly) {
|
|
239
|
+
problems.push(`${key}: pin is already at ${to} (${m.source_revision}), moved before this run — pass --record-only to write its history row without moving it`);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
movePin = false;
|
|
243
|
+
}
|
|
244
|
+
else if (priorRev !== undefined && pinned !== undefined && pinned !== priorRev && pinned !== m.source_revision) {
|
|
245
|
+
problems.push(`${key}: pin is at ${pinned}, which is neither ${fromId} (${priorRev}) nor ${to} (${m.source_revision})`);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const impact = sameRevision ? "none" : (changed.get(key)?.impact ?? delta.impact);
|
|
249
|
+
if (!impactOk(impact))
|
|
250
|
+
problems.push(`${dp}: ${key} impact '${impact}' is not one of ${IMPACTS.join(", ")}`);
|
|
251
|
+
const mine = (delta.findings ?? []).filter((f) => f.member === key);
|
|
252
|
+
const unclassified = mine.filter((f) => f.classification === null || f.classification === undefined).map((f) => f.id);
|
|
253
|
+
if (unclassified.length > 0) {
|
|
254
|
+
problems.push(`${key}: ${unclassified.length} finding(s) not yet classified (${unclassified.join(", ")}) — classify before the pin advances (delta-reverse.md §5)`);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const findingNotes = mine.map((f) => `${f.id} [${f.classification}]${f.summary ? `: ${f.summary}` : ""}${f.spec_impact ? ` — spec: ${f.spec_impact}` : ""}`);
|
|
258
|
+
const extra = inputs.notes?.get(key);
|
|
259
|
+
const branch = splitFolder(m.exported_folder_name)?.stem.match(BRANCH)?.[1] ?? metadata.exported_branch;
|
|
260
|
+
const entry = {
|
|
261
|
+
exported_folder_name: m.exported_folder_name,
|
|
262
|
+
...(branch ? { exported_branch: branch } : {}),
|
|
263
|
+
source_revision: m.source_revision,
|
|
264
|
+
source_path: newPath,
|
|
265
|
+
scanned_at: scannedAt,
|
|
266
|
+
reverse_status: "reversed",
|
|
267
|
+
impact,
|
|
268
|
+
...(sameRevision
|
|
269
|
+
? { impact_rationale: `re-observed at the same revision (${describeReverification(m)})` }
|
|
270
|
+
: delta.impact_rationale
|
|
271
|
+
? { impact_rationale: delta.impact_rationale }
|
|
272
|
+
: {}),
|
|
273
|
+
notes: `${movePin ? "advanced" : "recorded (pin moved by hand before this run)"} to ${to} from ${fromId} by sdd-cli snapshot advance.` +
|
|
274
|
+
`${extra ? ` ${extra}` : ""} Findings: ${findingNotes.length > 0 ? findingNotes.join("; ") : "none"}.`,
|
|
275
|
+
};
|
|
276
|
+
plans.push({
|
|
277
|
+
key,
|
|
278
|
+
dir,
|
|
279
|
+
history,
|
|
280
|
+
migrated,
|
|
281
|
+
metadataText,
|
|
282
|
+
entry,
|
|
283
|
+
metadata: {
|
|
284
|
+
source_path: newPath,
|
|
285
|
+
exported_folder_name: m.exported_folder_name,
|
|
286
|
+
source_revision: m.source_revision,
|
|
287
|
+
scanned_at: scannedAt,
|
|
288
|
+
...(branch ? { exported_branch: branch } : {}),
|
|
289
|
+
},
|
|
290
|
+
movePin,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
if (problems.length > 0)
|
|
294
|
+
throw new SnapshotError(`${problems.length} problem(s):\n - ${problems.join("\n - ")}`);
|
|
295
|
+
for (const p of plans) {
|
|
296
|
+
const hFile = join(p.dir, "reverse-history.yaml");
|
|
297
|
+
const before = structuredClone(p.history.history ?? []);
|
|
298
|
+
if (p.migrated || !(await exists(hFile))) {
|
|
299
|
+
const h = { ...p.history, history: [...before, p.entry] };
|
|
300
|
+
await writeFile(hFile, stringify(h, { lineWidth: 0 }));
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
await writeFile(hFile, appendHistoryEntry(await readFile(hFile, "utf8"), p.entry));
|
|
304
|
+
}
|
|
305
|
+
const after = parse(await readFile(hFile, "utf8")).history;
|
|
306
|
+
if (after.length !== before.length + 1 || !isDeepStrictEqual(after.slice(0, before.length), before)) {
|
|
307
|
+
throw new Error(`${hFile}: post-write check failed — prior entries changed or not exactly one appended`);
|
|
308
|
+
}
|
|
309
|
+
if (p.movePin)
|
|
310
|
+
await writeFile(join(p.dir, "reverse-metadata.yaml"), setTopLevelScalars(p.metadataText, p.metadata));
|
|
311
|
+
write(`${p.key}: ${p.migrated ? "history migrated, " : ""}${p.movePin ? "pin →" : "row recorded, pin already at"} ${p.metadata.exported_folder_name} (impact ${String(p.entry.impact)})\n`);
|
|
312
|
+
}
|
|
313
|
+
return plans;
|
|
314
|
+
}
|
|
315
|
+
function describeReverification(m) {
|
|
316
|
+
return m.reverification ?? `revision ${m.source_revision} unchanged`;
|
|
317
|
+
}
|
|
318
|
+
/** Replace (or append) top-level `key: value` lines, leaving every other byte alone. */
|
|
319
|
+
export function setTopLevelScalars(text, values) {
|
|
320
|
+
let out = text;
|
|
321
|
+
for (const [k, v] of Object.entries(values)) {
|
|
322
|
+
const line = `${k}: ${stringify(v).trimEnd()}`;
|
|
323
|
+
const re = new RegExp(`^${k}:[^\\n]*$`, "m");
|
|
324
|
+
out = re.test(out) ? out.replace(re, line) : `${out.replace(/\n*$/, "\n")}${line}\n`;
|
|
325
|
+
}
|
|
326
|
+
return out;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Append one entry to a `history:` list that ends the file, at the list's own
|
|
330
|
+
* indentation. Falls back to a document edit when `history:` is not the last
|
|
331
|
+
* top-level key; the caller's post-write check covers both paths.
|
|
332
|
+
*/
|
|
333
|
+
export function appendHistoryEntry(text, entry) {
|
|
334
|
+
const lines = text.replace(/\n*$/, "").split("\n");
|
|
335
|
+
const h = lines.findIndex((l) => /^history:\s*$/.test(l));
|
|
336
|
+
const laterTopLevel = h >= 0 && lines.slice(h + 1).some((l) => /^[A-Za-z_][\w-]*:/.test(l));
|
|
337
|
+
const item = lines.slice(h + 1).find((l) => /^\s*- /.test(l));
|
|
338
|
+
if (h < 0 || laterTopLevel || item === undefined) {
|
|
339
|
+
const doc = parseDocument(text);
|
|
340
|
+
doc.addIn(["history"], doc.createNode(entry));
|
|
341
|
+
return doc.toString({ lineWidth: 0 });
|
|
342
|
+
}
|
|
343
|
+
const indent = item.match(/^(\s*)- /)[1];
|
|
344
|
+
const body = stringify([entry], { lineWidth: 0 }).trimEnd().split("\n").map((l) => indent + l).join("\n");
|
|
345
|
+
return `${lines.join("\n")}\n${body}\n`;
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=advance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advance.js","sourceRoot":"","sources":["../../../src/lib/snapshot/advance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type Writer = (s: string) => void;
|
|
2
|
+
export interface CatalogueDiffInputs {
|
|
3
|
+
sddPath: string;
|
|
4
|
+
from: string;
|
|
5
|
+
attribute: string;
|
|
6
|
+
}
|
|
7
|
+
/** Every file changed since `ref`, tracked or untracked. */
|
|
8
|
+
export declare function changedFiles(sddPath: string, ref: string): Promise<string[]>;
|
|
9
|
+
/** The changed files that must be attributed: minus catalogues and advance's pin bookkeeping. */
|
|
10
|
+
export declare function changedSourceFiles(sddPath: string, ref: string): Promise<string[]>;
|
|
11
|
+
export interface AttributionTarget {
|
|
12
|
+
artefact: string;
|
|
13
|
+
precise: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Every target, and whether it is precise (file / confirmed grain, or hand-written) or a repo-grain mention. */
|
|
16
|
+
export declare function targetSet(delta: unknown): AttributionTarget[];
|
|
17
|
+
/** "precise" | "mention" | null — how, if at all, a changed file is attributed. */
|
|
18
|
+
export declare function attributed(file: string, targets: readonly AttributionTarget[]): "precise" | "mention" | null;
|
|
19
|
+
export declare function rowDelta(before: readonly string[], after: readonly string[]): {
|
|
20
|
+
added: number;
|
|
21
|
+
removed: number;
|
|
22
|
+
};
|
|
23
|
+
export declare function runCatalogueDiff(inputs: CatalogueDiffInputs, write: Writer): Promise<{
|
|
24
|
+
exitCode: number;
|
|
25
|
+
}>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=catalogue-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue-diff.d.ts","sourceRoot":"","sources":["../../../src/lib/snapshot/catalogue-diff.ts"],"names":[],"mappings":"AAiCA,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAElC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,4DAA4D;AAC5D,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIlF;AAED,iGAAiG;AACjG,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAExF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iHAAiH;AACjH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAgB7D;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAI5G;AAYD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAYhH;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqDhH"}
|