@sdd-method/sdd-cli 2.5.0 → 4.0.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.
Files changed (163) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/behaviour-store/archive.d.ts +12 -0
  5. package/dist/lib/behaviour-store/archive.d.ts.map +1 -1
  6. package/dist/lib/behaviour-store/archive.js +13 -0
  7. package/dist/lib/behaviour-store/archive.js.map +1 -1
  8. package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
  9. package/dist/lib/catalogue/aggregate.js +64 -0
  10. package/dist/lib/catalogue/aggregate.js.map +1 -1
  11. package/dist/lib/catalogue/build.d.ts +3 -1
  12. package/dist/lib/catalogue/build.d.ts.map +1 -1
  13. package/dist/lib/catalogue/build.js +45 -2
  14. package/dist/lib/catalogue/build.js.map +1 -1
  15. package/dist/lib/catalogue/builders/adr-governs.d.ts +4 -0
  16. package/dist/lib/catalogue/builders/adr-governs.d.ts.map +1 -0
  17. package/dist/lib/catalogue/builders/adr-governs.js +39 -0
  18. package/dist/lib/catalogue/builders/adr-governs.js.map +1 -0
  19. package/dist/lib/catalogue/builders/adrs.d.ts +2 -0
  20. package/dist/lib/catalogue/builders/adrs.d.ts.map +1 -1
  21. package/dist/lib/catalogue/builders/adrs.js +11 -0
  22. package/dist/lib/catalogue/builders/adrs.js.map +1 -1
  23. package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -1
  24. package/dist/lib/catalogue/builders/capability-spec.js +1 -0
  25. package/dist/lib/catalogue/builders/capability-spec.js.map +1 -1
  26. package/dist/lib/catalogue/builders/contract-revisions.d.ts +12 -0
  27. package/dist/lib/catalogue/builders/contract-revisions.d.ts.map +1 -0
  28. package/dist/lib/catalogue/builders/contract-revisions.js +126 -0
  29. package/dist/lib/catalogue/builders/contract-revisions.js.map +1 -0
  30. package/dist/lib/catalogue/builders/data-model.d.ts +73 -0
  31. package/dist/lib/catalogue/builders/data-model.d.ts.map +1 -0
  32. package/dist/lib/catalogue/builders/data-model.js +316 -0
  33. package/dist/lib/catalogue/builders/data-model.js.map +1 -0
  34. package/dist/lib/catalogue/builders/entities-mermaid.d.ts.map +1 -1
  35. package/dist/lib/catalogue/builders/entities-mermaid.js +18 -85
  36. package/dist/lib/catalogue/builders/entities-mermaid.js.map +1 -1
  37. package/dist/lib/catalogue/builders/feature-grounding.d.ts.map +1 -1
  38. package/dist/lib/catalogue/builders/feature-grounding.js +1 -0
  39. package/dist/lib/catalogue/builders/feature-grounding.js.map +1 -1
  40. package/dist/lib/catalogue/builders/features.d.ts +12 -0
  41. package/dist/lib/catalogue/builders/features.d.ts.map +1 -1
  42. package/dist/lib/catalogue/builders/features.js +23 -2
  43. package/dist/lib/catalogue/builders/features.js.map +1 -1
  44. package/dist/lib/catalogue/builders/integration-components.js +49 -5
  45. package/dist/lib/catalogue/builders/integration-components.js.map +1 -1
  46. package/dist/lib/catalogue/builders/journey-requirement.d.ts +22 -0
  47. package/dist/lib/catalogue/builders/journey-requirement.d.ts.map +1 -0
  48. package/dist/lib/catalogue/builders/journey-requirement.js +144 -0
  49. package/dist/lib/catalogue/builders/journey-requirement.js.map +1 -0
  50. package/dist/lib/catalogue/builders/quality-scores.d.ts.map +1 -1
  51. package/dist/lib/catalogue/builders/quality-scores.js +17 -0
  52. package/dist/lib/catalogue/builders/quality-scores.js.map +1 -1
  53. package/dist/lib/catalogue/builders/requirements.d.ts +15 -3
  54. package/dist/lib/catalogue/builders/requirements.d.ts.map +1 -1
  55. package/dist/lib/catalogue/builders/requirements.js +168 -32
  56. package/dist/lib/catalogue/builders/requirements.js.map +1 -1
  57. package/dist/lib/catalogue/canonical-schema.yaml +845 -28
  58. package/dist/lib/catalogue/manifest-loader.d.ts +5 -0
  59. package/dist/lib/catalogue/manifest-loader.d.ts.map +1 -1
  60. package/dist/lib/catalogue/manifest-loader.js +13 -0
  61. package/dist/lib/catalogue/manifest-loader.js.map +1 -1
  62. package/dist/lib/catalogue/retired-catalogues.d.ts +6 -0
  63. package/dist/lib/catalogue/retired-catalogues.d.ts.map +1 -0
  64. package/dist/lib/catalogue/retired-catalogues.js +25 -0
  65. package/dist/lib/catalogue/retired-catalogues.js.map +1 -0
  66. package/dist/lib/catalogue/rubric-coverage-map.yaml +108 -2
  67. package/dist/lib/catalogue/schema-compat.d.ts +1 -1
  68. package/dist/lib/catalogue/schema-compat.js +1 -1
  69. package/dist/lib/catalogue/schema-loader.d.ts +6 -0
  70. package/dist/lib/catalogue/schema-loader.d.ts.map +1 -1
  71. package/dist/lib/catalogue/schema-loader.js +3 -0
  72. package/dist/lib/catalogue/schema-loader.js.map +1 -1
  73. package/dist/lib/catalogue/staleness-verdicts.d.ts.map +1 -1
  74. package/dist/lib/catalogue/staleness-verdicts.js +75 -6
  75. package/dist/lib/catalogue/staleness-verdicts.js.map +1 -1
  76. package/dist/lib/intents/migrate.d.ts.map +1 -1
  77. package/dist/lib/intents/migrate.js +35 -9
  78. package/dist/lib/intents/migrate.js.map +1 -1
  79. package/dist/lib/metamodel/roundtrip-gate.d.ts.map +1 -1
  80. package/dist/lib/metamodel/roundtrip-gate.js +11 -2
  81. package/dist/lib/metamodel/roundtrip-gate.js.map +1 -1
  82. package/dist/lib/metamodel/schema-projection.d.ts +6 -0
  83. package/dist/lib/metamodel/schema-projection.d.ts.map +1 -1
  84. package/dist/lib/metamodel/schema-projection.js +40 -1
  85. package/dist/lib/metamodel/schema-projection.js.map +1 -1
  86. package/dist/lib/metamodel/tql-subset-parser.d.ts +6 -0
  87. package/dist/lib/metamodel/tql-subset-parser.d.ts.map +1 -1
  88. package/dist/lib/metamodel/tql-subset-parser.js +35 -2
  89. package/dist/lib/metamodel/tql-subset-parser.js.map +1 -1
  90. package/dist/lib/structure/apply.d.ts +8 -0
  91. package/dist/lib/structure/apply.d.ts.map +1 -0
  92. package/dist/lib/structure/apply.js +71 -0
  93. package/dist/lib/structure/apply.js.map +1 -0
  94. package/dist/lib/structure/archive.d.ts +21 -0
  95. package/dist/lib/structure/archive.d.ts.map +1 -0
  96. package/dist/lib/structure/archive.js +318 -0
  97. package/dist/lib/structure/archive.js.map +1 -0
  98. package/dist/lib/structure/catalogue.d.ts +33 -0
  99. package/dist/lib/structure/catalogue.d.ts.map +1 -0
  100. package/dist/lib/structure/catalogue.js +183 -0
  101. package/dist/lib/structure/catalogue.js.map +1 -0
  102. package/dist/lib/structure/compose.d.ts +30 -0
  103. package/dist/lib/structure/compose.d.ts.map +1 -0
  104. package/dist/lib/structure/compose.js +174 -0
  105. package/dist/lib/structure/compose.js.map +1 -0
  106. package/dist/lib/structure/effects.d.ts +16 -0
  107. package/dist/lib/structure/effects.d.ts.map +1 -0
  108. package/dist/lib/structure/effects.js +36 -0
  109. package/dist/lib/structure/effects.js.map +1 -0
  110. package/dist/lib/structure/extract.d.ts +19 -0
  111. package/dist/lib/structure/extract.d.ts.map +1 -0
  112. package/dist/lib/structure/extract.js +123 -0
  113. package/dist/lib/structure/extract.js.map +1 -0
  114. package/dist/lib/structure/model.d.ts +57 -0
  115. package/dist/lib/structure/model.d.ts.map +1 -0
  116. package/dist/lib/structure/model.js +212 -0
  117. package/dist/lib/structure/model.js.map +1 -0
  118. package/dist/lib/structure/render.d.ts +11 -0
  119. package/dist/lib/structure/render.d.ts.map +1 -0
  120. package/dist/lib/structure/render.js +242 -0
  121. package/dist/lib/structure/render.js.map +1 -0
  122. package/dist/lib/structure/view.d.ts +36 -0
  123. package/dist/lib/structure/view.d.ts.map +1 -0
  124. package/dist/lib/structure/view.js +301 -0
  125. package/dist/lib/structure/view.js.map +1 -0
  126. package/dist/lib/validate/agreement-evidence.d.ts +58 -0
  127. package/dist/lib/validate/agreement-evidence.d.ts.map +1 -0
  128. package/dist/lib/validate/agreement-evidence.js +216 -0
  129. package/dist/lib/validate/agreement-evidence.js.map +1 -0
  130. package/dist/lib/validate/behaviour-store.d.ts +22 -1
  131. package/dist/lib/validate/behaviour-store.d.ts.map +1 -1
  132. package/dist/lib/validate/behaviour-store.js +516 -28
  133. package/dist/lib/validate/behaviour-store.js.map +1 -1
  134. package/dist/lib/validate/dispatch.d.ts.map +1 -1
  135. package/dist/lib/validate/dispatch.js +21 -0
  136. package/dist/lib/validate/dispatch.js.map +1 -1
  137. package/dist/lib/validate/feature-spec-pointers.d.ts +12 -0
  138. package/dist/lib/validate/feature-spec-pointers.d.ts.map +1 -0
  139. package/dist/lib/validate/feature-spec-pointers.js +175 -0
  140. package/dist/lib/validate/feature-spec-pointers.js.map +1 -0
  141. package/dist/lib/validate/journey-impact.d.ts +10 -0
  142. package/dist/lib/validate/journey-impact.d.ts.map +1 -0
  143. package/dist/lib/validate/journey-impact.js +193 -0
  144. package/dist/lib/validate/journey-impact.js.map +1 -0
  145. package/dist/lib/validate/structural-model.d.ts +11 -0
  146. package/dist/lib/validate/structural-model.d.ts.map +1 -0
  147. package/dist/lib/validate/structural-model.js +265 -0
  148. package/dist/lib/validate/structural-model.js.map +1 -0
  149. package/dist/maintain-version.json +2 -2
  150. package/dist/verbs/change.d.ts +3 -0
  151. package/dist/verbs/change.d.ts.map +1 -0
  152. package/dist/verbs/change.js +15 -0
  153. package/dist/verbs/change.js.map +1 -0
  154. package/dist/verbs/structure.d.ts +10 -0
  155. package/dist/verbs/structure.d.ts.map +1 -0
  156. package/dist/verbs/structure.js +124 -0
  157. package/dist/verbs/structure.js.map +1 -0
  158. package/dist/verify-version.json +2 -2
  159. package/package.json +1 -1
  160. package/scripts/author-version.json +2 -2
  161. package/scripts/build-persona-package.mjs +5 -0
  162. package/scripts/maintain-version.json +2 -2
  163. package/scripts/verify-version.json +2 -2
@@ -0,0 +1,318 @@
1
+ // The method's archive operation (M-ADR 0230 §4.6, Proposed): behaviour and structure published as one unit.
2
+ // 1. prepare the full candidate in a scratch worktree at the store's current commit: OpenSpec archives the
3
+ // change there (behaviour), and its structural deltas are applied to the model with a record of
4
+ // their effect (structure/applied.yaml in the archived change)
5
+ // 2. validate the candidate as a whole: the change's deltas still apply (§4.5 again at archive), the model as it
6
+ // would stand fails nowhere the current model does not, and the behaviour-store check finds nothing
7
+ // wrong with the archived change (its agreed content, its verdict)
8
+ // 3. publish one commit, fast-forwarded onto the store only if the store has not moved since preparation
9
+ // Readers take a published commit, so they see the old state or the new. A retry is idempotent: an archived change
10
+ // whose effect record holds at the commit that wrote it is reported as already archived. Recovery works from what
11
+ // the store holds: an archived change with structural deltas and no effect record (a raw `openspec archive`) has its
12
+ // deltas applied only if each element it writes is still at the revision it was written against.
13
+ //
14
+ // The store is the SDD's own `openspec/` in a git repository. Writes; never part of the verify-only CLI.
15
+ import { execFile as execFileCb } from "node:child_process";
16
+ import { mkdtemp, readdir, readFile, rm, stat, writeFile } from "node:fs/promises";
17
+ import { tmpdir } from "node:os";
18
+ import { join, relative } from "node:path";
19
+ import { promisify } from "node:util";
20
+ import { parseRequirements, resolveImplements } from "../behaviour-store/archive.js";
21
+ import { buildRequirements } from "../catalogue/builders/requirements.js";
22
+ import { parseCatalogueCsv } from "../catalogue/csv-reader.js";
23
+ import { FindingsLog } from "../catalogue/findings.js";
24
+ import { loadCanonicalSchema } from "../catalogue/schema-loader.js";
25
+ import { checkBehaviourStore, parseAgreementRecord } from "../validate/behaviour-store.js";
26
+ import { appliedRecord, applyToModel, effectsOf, parseAppliedRecord } from "./apply.js";
27
+ import { APPLIED_FILE, loadChangeStructure, loadModel } from "./model.js";
28
+ import { revisionOf, validateDeltas, validateView, viewOf } from "./view.js";
29
+ const execFile = promisify(execFileCb);
30
+ const CHANGES = join("openspec", "changes");
31
+ /** Exit codes: 0 archived or already archived, 1 refused, 75 interrupted (tests). */
32
+ export const INTERRUPTED = 75;
33
+ async function git(cwd, ...args) {
34
+ return (await execFile("git", ["-C", cwd, ...args], { maxBuffer: 64 * 1024 * 1024 })).stdout.trim();
35
+ }
36
+ async function exists(p) {
37
+ return stat(p).then(() => true, () => false);
38
+ }
39
+ async function subdirs(p) {
40
+ try {
41
+ return (await readdir(p, { withFileTypes: true })).filter((e) => e.isDirectory()).map((e) => e.name).sort();
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ }
47
+ async function archivedDir(sddPath, change) {
48
+ const found = (await subdirs(join(sddPath, CHANGES, "archive"))).filter((d) => d.replace(/^\d{4}-\d{2}-\d{2}-/, "") === change);
49
+ return found.length > 0 ? found[found.length - 1] : null;
50
+ }
51
+ async function defaultOpenspecArchive(cwd, change) {
52
+ try {
53
+ const r = await execFile("openspec", ["archive", change, "--yes"], { cwd, env: { ...process.env, OPENSPEC_TELEMETRY: "0" }, maxBuffer: 16 * 1024 * 1024 });
54
+ return { code: 0, output: r.stdout + r.stderr };
55
+ }
56
+ catch (err) {
57
+ const e = err;
58
+ return { code: typeof e.code === "number" ? e.code : 127, output: `${e.stdout ?? ""}${e.stderr ?? ""}` };
59
+ }
60
+ }
61
+ async function defaultBehaviourFindings(sddPath, archiveDir) {
62
+ const r = await checkBehaviourStore(sddPath);
63
+ return r.stdout.split("\n").filter((l) => l.startsWith("[FAIL]") && l.includes(archiveDir));
64
+ }
65
+ function viewProblems(schema, view) {
66
+ const out = [];
67
+ validateView(schema, view, () => null, out, new Set());
68
+ return new Set(out);
69
+ }
70
+ /** Does the effect record hold at `commit`? Each added or modified element at its target, each removed one absent. */
71
+ async function verifyAt(root, relSdd, commit, effects) {
72
+ const scratch = await mkdtemp(join(tmpdir(), "sdd-archive-verify-"));
73
+ try {
74
+ await git(root, "worktree", "add", "--detach", "-q", scratch, commit);
75
+ const problems = [];
76
+ const files = (await loadModel(join(scratch, relSdd), problems)) ?? [];
77
+ const view = viewOf(files, problems);
78
+ const bad = [];
79
+ for (const e of effects) {
80
+ const [catalogue, ...rest] = e.element.split("/");
81
+ const el = view.get(catalogue)?.get(rest.join("/"));
82
+ if (e.operation === "REMOVED") {
83
+ if (el)
84
+ bad.push(`${e.element} is still present`);
85
+ }
86
+ else if (!el)
87
+ bad.push(`${e.element} is absent`);
88
+ else if (revisionOf(el) !== e.target)
89
+ bad.push(`${e.element} is at ${revisionOf(el).slice(0, 19)}…, not the recorded ${String(e.target).slice(0, 19)}…`);
90
+ }
91
+ return bad;
92
+ }
93
+ finally {
94
+ await git(root, "worktree", "remove", "--force", scratch).catch(() => undefined);
95
+ await rm(scratch, { recursive: true, force: true });
96
+ }
97
+ }
98
+ export async function archiveChange(o) {
99
+ const say = (s) => o.write(`${s}\n`);
100
+ const refuse = (s) => {
101
+ say(`[FAIL] change archive ${o.change}: ${s}`);
102
+ return 1;
103
+ };
104
+ let root;
105
+ try {
106
+ root = await git(o.sddPath, "rev-parse", "--show-toplevel");
107
+ }
108
+ catch {
109
+ return refuse(`${o.sddPath} is not in a git repository; the archive is published as a commit`);
110
+ }
111
+ const relSdd = relative(root, o.sddPath) || ".";
112
+ const schema = o.schema ?? (await loadCanonicalSchema());
113
+ const openDir = join(CHANGES, o.change);
114
+ const isOpen = await exists(join(o.sddPath, openDir));
115
+ const archived = await archivedDir(o.sddPath, o.change);
116
+ // Already archived: verify, or recover a raw archive.
117
+ if (!isOpen && archived !== null) {
118
+ const archRel = join(CHANGES, "archive", archived);
119
+ const problems = [];
120
+ const s = await loadChangeStructure(o.sddPath, join("archive", archived), problems);
121
+ if (problems.length > 0)
122
+ return refuse(`its archived structural artifact is malformed: ${problems.join("; ")}`);
123
+ if (s.deltas.length === 0) {
124
+ say(`[PASS] change archive ${o.change}: already archived (${archRel}); it carries no structural deltas`);
125
+ return 0;
126
+ }
127
+ const recordPath = join(o.sddPath, archRel, "structure", APPLIED_FILE);
128
+ const text = await readFile(recordPath, "utf8").catch(() => null);
129
+ if (text !== null) {
130
+ const rec = parseAppliedRecord(text);
131
+ if (rec === null)
132
+ return refuse(`${join(archRel, "structure", APPLIED_FILE)} is not a valid effect record`);
133
+ const at = await git(root, "log", "-1", "--format=%H", "--", relative(root, recordPath));
134
+ if (at === "")
135
+ return refuse(`${join(archRel, "structure", APPLIED_FILE)} is not committed; the archive was not published`);
136
+ const bad = await verifyAt(root, relSdd, at, rec.effects);
137
+ if (bad.length > 0)
138
+ return refuse(`its effect record does not hold at ${at.slice(0, 12)}, the commit that wrote it: ${bad.join("; ")}`);
139
+ say(`[PASS] change archive ${o.change}: already archived at ${at.slice(0, 12)}; its ${rec.effects.length} structural effect(s) verified there`);
140
+ return 0;
141
+ }
142
+ // A raw archive: the behaviour moved, the structure did not. Apply it, guarded by each written element's base.
143
+ return publish(o, root, relSdd, schema, s, archRel, "recover");
144
+ }
145
+ if (!isOpen)
146
+ return refuse(`no open change ${openDir}, and none archived`);
147
+ // An open change: preconditions.
148
+ const baseline = await exists(join(o.sddPath, openDir, "baseline-evidence.md"));
149
+ if (!baseline) {
150
+ const recFile = join("docs", "agreements", `${o.change}.yaml`);
151
+ const recText = await readFile(join(o.sddPath, recFile), "utf8").catch(() => null);
152
+ if (recText === null)
153
+ return refuse(`no agreement record (${recFile}); a change archives on its judge's PASS`);
154
+ const { record } = parseAgreementRecord(recFile, recText);
155
+ if (!record)
156
+ return refuse(`${recFile} does not parse as an agreement record`);
157
+ if (record.status !== "agreed")
158
+ return refuse(`${recFile} says status ${record.status}, not agreed`);
159
+ if (String(record.verdict?.result ?? "") !== "PASS")
160
+ return refuse(`${recFile} has no verdict.result PASS; a change archives on its judge's PASS`);
161
+ const left = await leftOut(o.sddPath, o.change, record.workOrders, record.noLongerImplements);
162
+ if (left.length > 0)
163
+ return refuse(left.join("\n "));
164
+ }
165
+ const problems = [];
166
+ const s = await loadChangeStructure(o.sddPath, o.change, problems);
167
+ if (problems.length > 0)
168
+ return refuse(`its structural artifact is malformed: ${problems.join("; ")}`);
169
+ for (const dep of new Set(s.deltas.flatMap((d) => [...d.dependsOn]))) {
170
+ if ((await archivedDir(o.sddPath, dep)) === null)
171
+ return refuse(`it depends on ${dep}, which has not archived; a change archives after its dependencies`);
172
+ }
173
+ return publish(o, root, relSdd, schema, s, openDir, "archive");
174
+ }
175
+ /**
176
+ * M-ADR 0230 §4.7: when a change moves a requirement to a new revision, each repository with evidence about the
177
+ * current one implements the new one too, through a work order, or the record says it no longer implements it
178
+ * (`no_longer_implements`). Otherwise the archive would leave that repository's evidence about a revision that is no
179
+ * longer live, and nothing about the one that is. Reads the store as the catalogue builder does.
180
+ */
181
+ async function leftOut(sddPath, change, workOrders, noLonger) {
182
+ // Only a change that modifies a requirement can leave a repository behind; any change can name a requirement
183
+ // ambiguously.
184
+ const delta = [];
185
+ let modifies = false;
186
+ for (const feature of await subdirs(join(sddPath, CHANGES, change, "specs"))) {
187
+ const text = await readFile(join(sddPath, CHANGES, change, "specs", feature, "spec.md"), "utf8").catch(() => "");
188
+ for (const x of parseRequirements(text)) {
189
+ if (x.operation === "MODIFIED")
190
+ modifies = true;
191
+ if (x.operation !== "REMOVED")
192
+ delta.push({ feature, name: x.name });
193
+ }
194
+ }
195
+ // A requirement named in a work order or under no_longer_implements: `<feature>::<name>`, or a bare name only one
196
+ // feature in the change has, as the record schema says. An ambiguous bare name names neither, and is refused.
197
+ const ambiguous = [];
198
+ const resolve = (entry, where) => {
199
+ const r = resolveImplements(delta, entry);
200
+ if (r.ambiguous.length > 0)
201
+ ambiguous.push(`${where} names "${entry}", a requirement ${r.ambiguous.length} features in the change share (${r.ambiguous.join(", ")}); qualify it as <feature>::<name>`);
202
+ return new Set(r.matches.map((d) => `${d.feature}::${d.name}`));
203
+ };
204
+ const implementsOf = workOrders.map((w) => ({ repo: w.repo, ids: new Set(w.implements.flatMap((i) => [...resolve(i, `the work order for ${w.repo}`)])) }));
205
+ const excusedOf = noLonger.map((n) => ({ repo: n.repo, ids: resolve(n.requirement, `no_longer_implements for ${n.repo}`) }));
206
+ if (ambiguous.length > 0)
207
+ return ambiguous;
208
+ if (!modifies)
209
+ return [];
210
+ const ids = async (catalogue) => {
211
+ const text = await readFile(join(sddPath, "catalogues", `${catalogue}.csv`), "utf8").catch(() => null);
212
+ return text === null ? null : new Set(parseCatalogueCsv(text).rows.map((r) => String(r["id"])));
213
+ };
214
+ const features = await ids("features");
215
+ const repos = await ids("repositories");
216
+ if (features === null || repos === null)
217
+ return ["the catalogue (catalogues/features.csv and repositories.csv) is needed to tell which repositories implement the requirements this change modifies; build it first"];
218
+ const r = await buildRequirements({ sddPath, findings: new FindingsLog(), knownFeatureIds: features, knownRepoIds: repos, sddId: "local" });
219
+ const state = new Map(r.revisions.map((x) => [String(x["id"]), String(x["state"])]));
220
+ const modified = r.effects
221
+ .filter((e) => e["change_id"] === `local::${change}` && e["element_kind"] === "requirement" && e["operation"] === "MODIFIED")
222
+ .map((e) => String(e["element_id"]));
223
+ const out = [];
224
+ for (const req of modified) {
225
+ const implementers = new Set(r.assertions.filter((a) => a["requirement_id"] === req && state.get(String(a["revision_id"])) === "current").map((a) => String(a["repo_id"])));
226
+ const covered = new Set(implementsOf.filter((w) => w.ids.has(req)).map((w) => w.repo));
227
+ const excused = new Set(excusedOf.filter((n) => n.ids.has(req)).map((n) => n.repo));
228
+ const missing = [...implementers].filter((repo) => !covered.has(repo) && !excused.has(repo)).sort();
229
+ if (missing.length > 0) {
230
+ out.push(`${req}: ${missing.join(", ")} ${missing.length === 1 ? "implements" : "implement"} its current revision, and no work order of this change implements the new one; add a work order for ${missing.length === 1 ? "it" : "each"}, or record it under no_longer_implements`);
231
+ }
232
+ }
233
+ return out;
234
+ }
235
+ async function publish(o, root, relSdd, schema, s, changeRel, mode) {
236
+ const say = (x) => o.write(`${x}\n`);
237
+ const refuse = (x) => {
238
+ say(`[FAIL] change archive ${o.change}: ${x}`);
239
+ return 1;
240
+ };
241
+ const storeRel = join(relSdd, "openspec");
242
+ const dirty = await git(root, "status", "--porcelain", "--", storeRel);
243
+ if (dirty !== "")
244
+ return refuse(`the store has uncommitted changes (${dirty.split("\n").length} path(s) under ${storeRel}); the archive is published as one commit onto a clean store`);
245
+ const base = await git(root, "rev-parse", "HEAD");
246
+ // §4.5 again, against the model as it now is.
247
+ const problems = [];
248
+ const current = viewOf((await loadModel(o.sddPath, problems)) ?? [], problems);
249
+ const before = viewProblems(schema, current);
250
+ const deltaProblems = [];
251
+ validateDeltas(schema, current, s.deltas, new Map(), deltaProblems);
252
+ if (deltaProblems.length > 0)
253
+ return refuse(`its structural deltas no longer apply to the model as it stands:\n ${deltaProblems.join("\n ")}`);
254
+ const effects = effectsOf(s, current);
255
+ const scratch = await mkdtemp(join(tmpdir(), "sdd-archive-"));
256
+ let added = false;
257
+ try {
258
+ await git(root, "worktree", "add", "--detach", "-q", scratch, base);
259
+ added = true;
260
+ const scratchSdd = join(scratch, relSdd);
261
+ // 1. Prepare.
262
+ let archiveRel = changeRel;
263
+ if (mode === "archive") {
264
+ const beforeDirs = new Set(await subdirs(join(scratchSdd, CHANGES, "archive")));
265
+ const r = await (o.openspecArchive ?? defaultOpenspecArchive)(scratchSdd, o.change);
266
+ if (r.code !== 0)
267
+ return refuse(`openspec archive failed (exit ${r.code}): ${r.output.trim().split("\n").slice(-3).join(" ")}`);
268
+ const fresh = (await subdirs(join(scratchSdd, CHANGES, "archive"))).filter((d) => !beforeDirs.has(d));
269
+ if (fresh.length !== 1)
270
+ return refuse(`openspec archive left ${fresh.length} new archive folder(s), not one`);
271
+ archiveRel = join(CHANGES, "archive", fresh[0]);
272
+ }
273
+ await applyToModel(scratchSdd, s);
274
+ if (s.deltas.length > 0)
275
+ await writeFile(join(scratchSdd, archiveRel, "structure", APPLIED_FILE), appliedRecord(o.change, base, effects), "utf8");
276
+ // 2. Validate the candidate as a whole.
277
+ const cp = [];
278
+ const candidate = viewOf((await loadModel(scratchSdd, cp)) ?? [], cp);
279
+ const after = viewProblems(schema, candidate);
280
+ const worse = [...cp, ...[...after].filter((p) => !before.has(p))];
281
+ if (worse.length > 0)
282
+ return refuse(`the model as it would stand fails where it did not:\n ${worse.join("\n ")}`);
283
+ if (mode === "archive") {
284
+ const bf = await (o.behaviourFindings ?? defaultBehaviourFindings)(scratchSdd, archiveRel.split("/").pop());
285
+ if (bf.length > 0)
286
+ return refuse(`the behaviour-store check refuses the archived change:\n ${bf.join("\n ")}`);
287
+ }
288
+ if (o.interrupt === "prepared")
289
+ return INTERRUPTED;
290
+ // 3. Publish: one commit, fast-forwarded only onto the commit it was prepared from.
291
+ await git(scratch, "add", "-A", "--", storeRel);
292
+ const message = mode === "archive"
293
+ ? `Archive ${o.change}: its behaviour and structure (M-ADR 0230 §4.6)`
294
+ : `Apply the structure of archived ${o.change}, which was archived without it (M-ADR 0230 §4.6)`;
295
+ await git(scratch, "commit", "-q", "-m", message);
296
+ const commit = await git(scratch, "rev-parse", "HEAD");
297
+ if (o.interrupt === "committed")
298
+ return INTERRUPTED;
299
+ if ((await git(root, "rev-parse", "HEAD")) !== base)
300
+ return refuse(`the store moved since the candidate was prepared (from ${base.slice(0, 12)}); run it again`);
301
+ try {
302
+ await git(root, "merge", "--ff-only", "-q", commit);
303
+ }
304
+ catch (err) {
305
+ return refuse(`the store moved since the candidate was prepared, so nothing was published: ${err.message.split("\n")[0]}`);
306
+ }
307
+ if (o.interrupt === "published")
308
+ return INTERRUPTED;
309
+ say(`[PASS] change archive ${o.change}: ${mode === "archive" ? "archived" : "its structure applied"} in ${commit.slice(0, 12)}, ${effects.length} structural effect(s)${s.deltas.length > 0 ? `, recorded in ${join(archiveRel, "structure", APPLIED_FILE)}` : ""}`);
310
+ return 0;
311
+ }
312
+ finally {
313
+ if (added)
314
+ await git(root, "worktree", "remove", "--force", scratch).catch(() => undefined);
315
+ await rm(scratch, { recursive: true, force: true });
316
+ }
317
+ }
318
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/lib/structure/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { CatalogueRow } from "../catalogue/csv-writer.js";
2
+ import type { FindingsLog } from "../catalogue/findings.js";
3
+ import type { CanonicalSchema } from "../catalogue/schema-loader.js";
4
+ import { type Value } from "./model.js";
5
+ import { type View } from "./view.js";
6
+ /** The view each generated file renders, for a derived path column of an element only the model holds. */
7
+ export declare const VIEW_PATHS: {
8
+ readonly c4Context: "docs/structure/c4-context.md";
9
+ readonly c4Containers: "docs/structure/c4-containers.md";
10
+ readonly services: "docs/structure/services.md";
11
+ readonly featureTree: "docs/structure/feature-tree.md";
12
+ readonly dataModel: "docs/structure/data-model.md";
13
+ };
14
+ /**
15
+ * Replace every structure catalogue's rows with the view's. Rows of other catalogues are returned as they are. Source
16
+ * rows sharing an id are merged first, later values filling earlier gaps, as the keyed-table dedupe would.
17
+ */
18
+ export declare function overlayModel(schema: CanonicalSchema, view: View, rows: ReadonlyMap<string, readonly CatalogueRow[]>, findings: FindingsLog): Map<string, readonly CatalogueRow[]>;
19
+ /** Partition naming, from the manifest: a platform's domains and `platform`, or the SDD's own id. */
20
+ export interface Partitioning {
21
+ readonly platform: boolean;
22
+ readonly sddId: string;
23
+ }
24
+ /**
25
+ * The model a built catalogue implies: each structure row as an element of its non-empty structure columns, typed by
26
+ * column. A platform's element goes to its domain's partition (its own `domain_id`, or the first element it references
27
+ * that has one; a domain is its own), else to `platform`; an application or integration SDD's to its sdd_id. A cell
28
+ * that does not parse as its column's type is reported and left out, which is the projection's only loss.
29
+ */
30
+ export declare function modelFromRows(schema: CanonicalSchema, rows: ReadonlyMap<string, readonly CatalogueRow[]>, partitioning: Partitioning, loss: string[]): Map<string, Record<string, Record<string, Value>[]>>;
31
+ /** One partition's model file, in the format loadModel reads. */
32
+ export declare function modelFileText(partition: string, elements: Record<string, Record<string, Value>[]>): string;
33
+ //# sourceMappingURL=catalogue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../../src/lib/structure/catalogue.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAgC,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjD,0GAA0G;AAC1G,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AA+BX;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,EAClD,QAAQ,EAAE,WAAW,GACpB,GAAG,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAkDtC;AAiBD,qGAAqG;AACrG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,EAClD,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,EAAE,GACb,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAgDtD;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,CAE1G"}
@@ -0,0 +1,183 @@
1
+ // The catalogue from the structural model, and the model a built catalogue implies (M-ADR 0230 §4.3, §5.3,
2
+ // Proposed). Where an SDD has a model, it is the record of structure, so every structure catalogue is built from it whole:
3
+ // a row per element of the current view, with the model's structure columns;
4
+ // its other columns (every class but structure: derived, declaration, evidence, intent, execution) from the
5
+ // source-built row with the same id;
6
+ // for an element only the model holds, the derived columns the model itself settles (MODEL_DERIVED).
7
+ // What the sources hold and the model does not, and a structure column where they disagree, is reported once per
8
+ // catalogue. The model wins: either finding means the sources moved outside a change. Pure: no file is read or written.
9
+ import { stringify } from "yaml";
10
+ import { FORMAT_VERSION } from "./model.js";
11
+ import { STRUCTURE } from "./view.js";
12
+ /** The view each generated file renders, for a derived path column of an element only the model holds. */
13
+ export const VIEW_PATHS = {
14
+ c4Context: "docs/structure/c4-context.md",
15
+ c4Containers: "docs/structure/c4-containers.md",
16
+ services: "docs/structure/services.md",
17
+ featureTree: "docs/structure/feature-tree.md",
18
+ dataModel: "docs/structure/data-model.md",
19
+ };
20
+ const EXAMPLES = 5;
21
+ const cell = (v) => (v === null || v === undefined ? "" : typeof v === "boolean" ? (v ? "true" : "false") : String(v));
22
+ /** The derived columns of a row built from an element the sources do not hold. */
23
+ function modelDerived(catalogue, e, view) {
24
+ switch (catalogue) {
25
+ case "features":
26
+ case "capabilities":
27
+ return { source: "structural-model" };
28
+ case "domain_models":
29
+ return { doc_path: VIEW_PATHS.dataModel };
30
+ case "c4_systems":
31
+ return { diagram_path: VIEW_PATHS.c4Context };
32
+ case "domains":
33
+ return { repo_count: [...(view.get("repositories")?.values() ?? [])].filter((r) => r.columns["domain_id"] === e.id).length };
34
+ default:
35
+ return {};
36
+ }
37
+ }
38
+ function structureColumns(cat) {
39
+ return cat.columns.filter((c) => c.name !== cat.primaryKey && c.sourceOfTruth === STRUCTURE).map((c) => c.name);
40
+ }
41
+ function sample(ids) {
42
+ return ids.slice(0, EXAMPLES).join(", ") + (ids.length > EXAMPLES ? `, and ${ids.length - EXAMPLES} more` : "");
43
+ }
44
+ /**
45
+ * Replace every structure catalogue's rows with the view's. Rows of other catalogues are returned as they are. Source
46
+ * rows sharing an id are merged first, later values filling earlier gaps, as the keyed-table dedupe would.
47
+ */
48
+ export function overlayModel(schema, view, rows, findings) {
49
+ const out = new Map(rows);
50
+ for (const cat of schema.catalogues) {
51
+ if (cat.sourceOfTruth !== STRUCTURE)
52
+ continue;
53
+ const pk = cat.primaryKey;
54
+ const structural = structureColumns(cat);
55
+ const source = new Map();
56
+ for (const r of rows.get(cat.name) ?? []) {
57
+ const id = cell(r[pk]);
58
+ const prior = source.get(id);
59
+ if (!prior)
60
+ source.set(id, { ...r });
61
+ else
62
+ for (const [k, v] of Object.entries(r))
63
+ if (cell(prior[k]) === "" && cell(v) !== "")
64
+ prior[k] = v;
65
+ }
66
+ const elements = view.get(cat.name) ?? new Map();
67
+ const built = [];
68
+ const differ = [];
69
+ for (const e of elements.values()) {
70
+ const from = source.get(e.id);
71
+ const row = {};
72
+ if (from) {
73
+ for (const [k, v] of Object.entries(from))
74
+ if (!structural.includes(k))
75
+ row[k] = v;
76
+ const cols = structural.filter((c) => cell(from[c]) !== "" && cell(from[c]) !== cell(e.columns[c]));
77
+ if (cols.length > 0)
78
+ differ.push(`${e.id} (${cols.join(", ")})`);
79
+ }
80
+ else {
81
+ Object.assign(row, modelDerived(cat.name, e, view));
82
+ }
83
+ row[pk] = e.id;
84
+ for (const c of structural)
85
+ row[c] = e.columns[c];
86
+ built.push(row);
87
+ }
88
+ const missing = [...source.keys()].filter((id) => id !== "" && !elements.has(id)).sort();
89
+ if (missing.length > 0) {
90
+ findings.add("divergence", `${cat.name}: the sources hold ${missing.length} row(s) the structural model does not (${sample(missing)}); the model is the record of structure, so they are not catalogued. Add them through a change's structural deltas, or remove them from the sources (M-ADR 0230 §4.3, Proposed)`, "warn", `catalogue:${cat.name}`);
91
+ }
92
+ if (differ.length > 0) {
93
+ findings.add("divergence", `${cat.name}: ${differ.length} element(s) where the sources and the structural model disagree, catalogued as the model states them: ${sample(differ.sort())}. A source that is a generated view is rendered again; any other is brought into line through a change (M-ADR 0230 §4.3, Proposed)`, "warn", `catalogue:${cat.name}`);
94
+ }
95
+ out.set(cat.name, built);
96
+ }
97
+ return out;
98
+ }
99
+ function typed(type, v) {
100
+ switch (type) {
101
+ case "int":
102
+ case "integer":
103
+ case "number": {
104
+ const n = Number(v);
105
+ return Number.isFinite(n) ? n : null;
106
+ }
107
+ case "boolean":
108
+ return v === "true" ? true : v === "false" ? false : null;
109
+ default:
110
+ return v;
111
+ }
112
+ }
113
+ /**
114
+ * The model a built catalogue implies: each structure row as an element of its non-empty structure columns, typed by
115
+ * column. A platform's element goes to its domain's partition (its own `domain_id`, or the first element it references
116
+ * that has one; a domain is its own), else to `platform`; an application or integration SDD's to its sdd_id. A cell
117
+ * that does not parse as its column's type is reported and left out, which is the projection's only loss.
118
+ */
119
+ export function modelFromRows(schema, rows, partitioning, loss) {
120
+ const byKey = new Map();
121
+ for (const cat of schema.catalogues) {
122
+ if (cat.sourceOfTruth !== STRUCTURE)
123
+ continue;
124
+ for (const r of rows.get(cat.name) ?? [])
125
+ byKey.set(`${cat.name}/${cell(r[cat.primaryKey])}`, r);
126
+ }
127
+ const memo = new Map();
128
+ const domainOf = (catName, row, seen) => {
129
+ const cat = schema.catalogues.find((c) => c.name === catName);
130
+ const key = `${catName}/${cell(row[cat.primaryKey])}`;
131
+ if (memo.has(key))
132
+ return memo.get(key);
133
+ if (seen.has(key))
134
+ return null;
135
+ seen.add(key);
136
+ let d = catName === "domains" ? cell(row[cat.primaryKey]) : cell(row["domain_id"]) || null;
137
+ for (const fk of d === null ? cat.foreignKeys : []) {
138
+ const [target, column] = fk.references.split(".");
139
+ if (fk.external || column !== "id" || cell(row[fk.column]) === "")
140
+ continue;
141
+ const next = byKey.get(`${target}/${cell(row[fk.column])}`);
142
+ if (next && (d = domainOf(target, next, seen)) !== null)
143
+ break;
144
+ }
145
+ memo.set(key, d);
146
+ return d;
147
+ };
148
+ const out = new Map();
149
+ for (const cat of schema.catalogues) {
150
+ if (cat.sourceOfTruth !== STRUCTURE)
151
+ continue;
152
+ const cols = cat.columns.filter((c) => c.name !== cat.primaryKey && c.sourceOfTruth === STRUCTURE);
153
+ const sorted = [...(rows.get(cat.name) ?? [])].sort((a, b) => cell(a[cat.primaryKey]).localeCompare(cell(b[cat.primaryKey])));
154
+ const seen = new Set();
155
+ for (const r of sorted) {
156
+ const id = cell(r[cat.primaryKey]);
157
+ if (id === "" || seen.has(id))
158
+ continue;
159
+ seen.add(id);
160
+ const element = { id };
161
+ for (const c of cols) {
162
+ const v = cell(r[c.name]);
163
+ if (v === "")
164
+ continue;
165
+ const t = typed(c.type, v);
166
+ if (t === null)
167
+ loss.push(`${cat.name}/${id}.${c.name}: ${JSON.stringify(v)} is not of type ${c.type}`);
168
+ else
169
+ element[c.name] = t;
170
+ }
171
+ const partition = partitioning.platform ? (domainOf(cat.name, r, new Set()) ?? "platform") : partitioning.sddId;
172
+ const file = out.get(partition) ?? {};
173
+ (file[cat.name] ??= []).push(element);
174
+ out.set(partition, file);
175
+ }
176
+ }
177
+ return out;
178
+ }
179
+ /** One partition's model file, in the format loadModel reads. */
180
+ export function modelFileText(partition, elements) {
181
+ return stringify({ schema_version: FORMAT_VERSION, partition, elements });
182
+ }
183
+ //# sourceMappingURL=catalogue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../../src/lib/structure/catalogue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type ChangeStructure } from "./model.js";
2
+ import type { View } from "./view.js";
3
+ export type Lifecycle = "proposed" | "agreed" | "withdrawn" | "superseded" | "unrecorded";
4
+ export interface OpenChange {
5
+ readonly structure: ChangeStructure;
6
+ /** The agreement record's status, or `unrecorded` when the change has no record. */
7
+ readonly status: Lifecycle;
8
+ }
9
+ export type Write = "ADDED" | "MODIFIED" | "REMOVED";
10
+ /** Element key -> the write a change makes to it. */
11
+ export declare function writesOf(s: ChangeStructure): Map<string, Write>;
12
+ /** The view with one change's deltas applied: an addition or modification replaces whole, a removal deletes. */
13
+ export declare function apply(view: View, s: ChangeStructure): View;
14
+ /**
15
+ * A change's dependency closure, dependencies first and the change last. A dependency that is not open is skipped
16
+ * here (archived: its additions are current; otherwise reported as withdrawn by checkDependencies). A cycle stops the
17
+ * walk and is reported there too.
18
+ */
19
+ export declare function closure(change: string, open: ReadonlyMap<string, OpenChange>): string[];
20
+ export declare function viewAt(current: View, change: string, open: ReadonlyMap<string, OpenChange>): View;
21
+ /** Agreed changes in an order that applies each after its dependencies. */
22
+ export declare function agreedOrder(open: ReadonlyMap<string, OpenChange>): string[];
23
+ export declare function intended(current: View, open: ReadonlyMap<string, OpenChange>): View;
24
+ /** Check 1: write overlap. */
25
+ export declare function checkOverlap(open: ReadonlyMap<string, OpenChange>, problems: string[]): void;
26
+ /** Check 3, beyond base revisions: withdrawn dependencies, agreement before a dependency, cycles. */
27
+ export declare function checkDependencies(open: ReadonlyMap<string, OpenChange>, archived: ReadonlySet<string>, problems: string[]): void;
28
+ /** The changes that write any element a finding names. */
29
+ export declare function attribute(problem: string, open: ReadonlyMap<string, OpenChange>, among: readonly string[]): string[];
30
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/lib/structure/compose.ts"],"names":[],"mappings":"AAYA,OAAO,EAAc,KAAK,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;AAE1F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAErD,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAQ/D;AAQD,gHAAgH;AAChH,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,eAAe,GAAG,IAAI,CAa1D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAcvF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAIjG;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAO3E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAInF;AAED,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAyB5F;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EACrC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAC7B,QAAQ,EAAE,MAAM,EAAE,GACjB,IAAI,CA6BN;AAID,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAMpH"}