@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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/behaviour-store/archive.d.ts +12 -0
- package/dist/lib/behaviour-store/archive.d.ts.map +1 -1
- package/dist/lib/behaviour-store/archive.js +13 -0
- package/dist/lib/behaviour-store/archive.js.map +1 -1
- package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
- package/dist/lib/catalogue/aggregate.js +64 -0
- package/dist/lib/catalogue/aggregate.js.map +1 -1
- package/dist/lib/catalogue/build.d.ts +3 -1
- package/dist/lib/catalogue/build.d.ts.map +1 -1
- package/dist/lib/catalogue/build.js +45 -2
- package/dist/lib/catalogue/build.js.map +1 -1
- package/dist/lib/catalogue/builders/adr-governs.d.ts +4 -0
- package/dist/lib/catalogue/builders/adr-governs.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/adr-governs.js +39 -0
- package/dist/lib/catalogue/builders/adr-governs.js.map +1 -0
- package/dist/lib/catalogue/builders/adrs.d.ts +2 -0
- package/dist/lib/catalogue/builders/adrs.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/adrs.js +11 -0
- package/dist/lib/catalogue/builders/adrs.js.map +1 -1
- package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/capability-spec.js +1 -0
- package/dist/lib/catalogue/builders/capability-spec.js.map +1 -1
- package/dist/lib/catalogue/builders/contract-revisions.d.ts +12 -0
- package/dist/lib/catalogue/builders/contract-revisions.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/contract-revisions.js +126 -0
- package/dist/lib/catalogue/builders/contract-revisions.js.map +1 -0
- package/dist/lib/catalogue/builders/data-model.d.ts +73 -0
- package/dist/lib/catalogue/builders/data-model.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/data-model.js +316 -0
- package/dist/lib/catalogue/builders/data-model.js.map +1 -0
- package/dist/lib/catalogue/builders/entities-mermaid.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/entities-mermaid.js +18 -85
- package/dist/lib/catalogue/builders/entities-mermaid.js.map +1 -1
- package/dist/lib/catalogue/builders/feature-grounding.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/feature-grounding.js +1 -0
- package/dist/lib/catalogue/builders/feature-grounding.js.map +1 -1
- package/dist/lib/catalogue/builders/features.d.ts +12 -0
- package/dist/lib/catalogue/builders/features.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/features.js +23 -2
- package/dist/lib/catalogue/builders/features.js.map +1 -1
- package/dist/lib/catalogue/builders/integration-components.js +49 -5
- package/dist/lib/catalogue/builders/integration-components.js.map +1 -1
- package/dist/lib/catalogue/builders/journey-requirement.d.ts +22 -0
- package/dist/lib/catalogue/builders/journey-requirement.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/journey-requirement.js +144 -0
- package/dist/lib/catalogue/builders/journey-requirement.js.map +1 -0
- package/dist/lib/catalogue/builders/quality-scores.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/quality-scores.js +17 -0
- package/dist/lib/catalogue/builders/quality-scores.js.map +1 -1
- package/dist/lib/catalogue/builders/requirements.d.ts +15 -3
- package/dist/lib/catalogue/builders/requirements.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/requirements.js +168 -32
- package/dist/lib/catalogue/builders/requirements.js.map +1 -1
- package/dist/lib/catalogue/canonical-schema.yaml +845 -28
- package/dist/lib/catalogue/manifest-loader.d.ts +5 -0
- package/dist/lib/catalogue/manifest-loader.d.ts.map +1 -1
- package/dist/lib/catalogue/manifest-loader.js +13 -0
- package/dist/lib/catalogue/manifest-loader.js.map +1 -1
- package/dist/lib/catalogue/retired-catalogues.d.ts +6 -0
- package/dist/lib/catalogue/retired-catalogues.d.ts.map +1 -0
- package/dist/lib/catalogue/retired-catalogues.js +25 -0
- package/dist/lib/catalogue/retired-catalogues.js.map +1 -0
- package/dist/lib/catalogue/rubric-coverage-map.yaml +108 -2
- package/dist/lib/catalogue/schema-compat.d.ts +1 -1
- package/dist/lib/catalogue/schema-compat.js +1 -1
- package/dist/lib/catalogue/schema-loader.d.ts +6 -0
- package/dist/lib/catalogue/schema-loader.d.ts.map +1 -1
- package/dist/lib/catalogue/schema-loader.js +3 -0
- package/dist/lib/catalogue/schema-loader.js.map +1 -1
- package/dist/lib/catalogue/staleness-verdicts.d.ts.map +1 -1
- package/dist/lib/catalogue/staleness-verdicts.js +75 -6
- package/dist/lib/catalogue/staleness-verdicts.js.map +1 -1
- package/dist/lib/intents/migrate.d.ts.map +1 -1
- package/dist/lib/intents/migrate.js +35 -9
- package/dist/lib/intents/migrate.js.map +1 -1
- package/dist/lib/metamodel/roundtrip-gate.d.ts.map +1 -1
- package/dist/lib/metamodel/roundtrip-gate.js +11 -2
- package/dist/lib/metamodel/roundtrip-gate.js.map +1 -1
- package/dist/lib/metamodel/schema-projection.d.ts +6 -0
- package/dist/lib/metamodel/schema-projection.d.ts.map +1 -1
- package/dist/lib/metamodel/schema-projection.js +40 -1
- package/dist/lib/metamodel/schema-projection.js.map +1 -1
- package/dist/lib/metamodel/tql-subset-parser.d.ts +6 -0
- package/dist/lib/metamodel/tql-subset-parser.d.ts.map +1 -1
- package/dist/lib/metamodel/tql-subset-parser.js +35 -2
- package/dist/lib/metamodel/tql-subset-parser.js.map +1 -1
- package/dist/lib/structure/apply.d.ts +8 -0
- package/dist/lib/structure/apply.d.ts.map +1 -0
- package/dist/lib/structure/apply.js +71 -0
- package/dist/lib/structure/apply.js.map +1 -0
- package/dist/lib/structure/archive.d.ts +21 -0
- package/dist/lib/structure/archive.d.ts.map +1 -0
- package/dist/lib/structure/archive.js +318 -0
- package/dist/lib/structure/archive.js.map +1 -0
- package/dist/lib/structure/catalogue.d.ts +33 -0
- package/dist/lib/structure/catalogue.d.ts.map +1 -0
- package/dist/lib/structure/catalogue.js +183 -0
- package/dist/lib/structure/catalogue.js.map +1 -0
- package/dist/lib/structure/compose.d.ts +30 -0
- package/dist/lib/structure/compose.d.ts.map +1 -0
- package/dist/lib/structure/compose.js +174 -0
- package/dist/lib/structure/compose.js.map +1 -0
- package/dist/lib/structure/effects.d.ts +16 -0
- package/dist/lib/structure/effects.d.ts.map +1 -0
- package/dist/lib/structure/effects.js +36 -0
- package/dist/lib/structure/effects.js.map +1 -0
- package/dist/lib/structure/extract.d.ts +19 -0
- package/dist/lib/structure/extract.d.ts.map +1 -0
- package/dist/lib/structure/extract.js +123 -0
- package/dist/lib/structure/extract.js.map +1 -0
- package/dist/lib/structure/model.d.ts +57 -0
- package/dist/lib/structure/model.d.ts.map +1 -0
- package/dist/lib/structure/model.js +212 -0
- package/dist/lib/structure/model.js.map +1 -0
- package/dist/lib/structure/render.d.ts +11 -0
- package/dist/lib/structure/render.d.ts.map +1 -0
- package/dist/lib/structure/render.js +242 -0
- package/dist/lib/structure/render.js.map +1 -0
- package/dist/lib/structure/view.d.ts +36 -0
- package/dist/lib/structure/view.d.ts.map +1 -0
- package/dist/lib/structure/view.js +301 -0
- package/dist/lib/structure/view.js.map +1 -0
- package/dist/lib/validate/agreement-evidence.d.ts +58 -0
- package/dist/lib/validate/agreement-evidence.d.ts.map +1 -0
- package/dist/lib/validate/agreement-evidence.js +216 -0
- package/dist/lib/validate/agreement-evidence.js.map +1 -0
- package/dist/lib/validate/behaviour-store.d.ts +22 -1
- package/dist/lib/validate/behaviour-store.d.ts.map +1 -1
- package/dist/lib/validate/behaviour-store.js +516 -28
- package/dist/lib/validate/behaviour-store.js.map +1 -1
- package/dist/lib/validate/dispatch.d.ts.map +1 -1
- package/dist/lib/validate/dispatch.js +21 -0
- package/dist/lib/validate/dispatch.js.map +1 -1
- package/dist/lib/validate/feature-spec-pointers.d.ts +12 -0
- package/dist/lib/validate/feature-spec-pointers.d.ts.map +1 -0
- package/dist/lib/validate/feature-spec-pointers.js +175 -0
- package/dist/lib/validate/feature-spec-pointers.js.map +1 -0
- package/dist/lib/validate/journey-impact.d.ts +10 -0
- package/dist/lib/validate/journey-impact.d.ts.map +1 -0
- package/dist/lib/validate/journey-impact.js +193 -0
- package/dist/lib/validate/journey-impact.js.map +1 -0
- package/dist/lib/validate/structural-model.d.ts +11 -0
- package/dist/lib/validate/structural-model.d.ts.map +1 -0
- package/dist/lib/validate/structural-model.js +265 -0
- package/dist/lib/validate/structural-model.js.map +1 -0
- package/dist/maintain-version.json +2 -2
- package/dist/verbs/change.d.ts +3 -0
- package/dist/verbs/change.d.ts.map +1 -0
- package/dist/verbs/change.js +15 -0
- package/dist/verbs/change.js.map +1 -0
- package/dist/verbs/structure.d.ts +10 -0
- package/dist/verbs/structure.d.ts.map +1 -0
- package/dist/verbs/structure.js +124 -0
- package/dist/verbs/structure.js.map +1 -0
- package/dist/verify-version.json +2 -2
- package/package.json +1 -1
- package/scripts/author-version.json +2 -2
- package/scripts/build-persona-package.mjs +5 -0
- package/scripts/maintain-version.json +2 -2
- package/scripts/verify-version.json +2 -2
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Views over the structural model, and how changes compose (M-ADR 0230 §4.5, §4.7, Proposed).
|
|
2
|
+
// current the model as published
|
|
3
|
+
// at a change current with that change's deltas and those of its dependency closure, dependencies first
|
|
4
|
+
// intended current with every agreed change's deltas
|
|
5
|
+
// Distinct ids do not prove independence, so three checks run:
|
|
6
|
+
// 1 write overlap two agreed changes never MODIFY or REMOVE one element, and never ADD one id; a change
|
|
7
|
+
// not yet agreed that overlaps an agreed one cannot be agreed while that one is open
|
|
8
|
+
// 2 composed validation each view is validated on its own; what fails in a view and not in current is reported
|
|
9
|
+
// against the changes that write the elements it names
|
|
10
|
+
// 3 read dependencies base revisions still current (validateDeltas); a dependency withdrawn invalidates its
|
|
11
|
+
// dependants; an agreed change depending on one not yet agreed; a cycle of dependencies
|
|
12
|
+
// Pure: reads nothing; the structural-model validator uses it.
|
|
13
|
+
import { elementKey } from "./model.js";
|
|
14
|
+
/** Element key -> the write a change makes to it. */
|
|
15
|
+
export function writesOf(s) {
|
|
16
|
+
const out = new Map();
|
|
17
|
+
for (const d of s.deltas) {
|
|
18
|
+
for (const e of d.added)
|
|
19
|
+
out.set(elementKey(e.catalogue, e.id), "ADDED");
|
|
20
|
+
for (const e of d.modified)
|
|
21
|
+
out.set(elementKey(e.catalogue, e.id), "MODIFIED");
|
|
22
|
+
for (const r of d.removed)
|
|
23
|
+
out.set(elementKey(r.catalogue, r.id), "REMOVED");
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function copy(view) {
|
|
28
|
+
const out = new Map();
|
|
29
|
+
for (const [c, m] of view)
|
|
30
|
+
out.set(c, new Map(m));
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/** The view with one change's deltas applied: an addition or modification replaces whole, a removal deletes. */
|
|
34
|
+
export function apply(view, s) {
|
|
35
|
+
const out = copy(view);
|
|
36
|
+
const put = (e) => {
|
|
37
|
+
const m = out.get(e.catalogue) ?? new Map();
|
|
38
|
+
m.set(e.id, e);
|
|
39
|
+
out.set(e.catalogue, m);
|
|
40
|
+
};
|
|
41
|
+
for (const d of s.deltas) {
|
|
42
|
+
for (const e of d.added)
|
|
43
|
+
put(e);
|
|
44
|
+
for (const e of d.modified)
|
|
45
|
+
put(e);
|
|
46
|
+
for (const r of d.removed)
|
|
47
|
+
out.get(r.catalogue)?.delete(r.id);
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* A change's dependency closure, dependencies first and the change last. A dependency that is not open is skipped
|
|
53
|
+
* here (archived: its additions are current; otherwise reported as withdrawn by checkDependencies). A cycle stops the
|
|
54
|
+
* walk and is reported there too.
|
|
55
|
+
*/
|
|
56
|
+
export function closure(change, open) {
|
|
57
|
+
const order = [];
|
|
58
|
+
const visiting = new Set();
|
|
59
|
+
const visit = (c) => {
|
|
60
|
+
if (order.includes(c) || visiting.has(c))
|
|
61
|
+
return;
|
|
62
|
+
const oc = open.get(c);
|
|
63
|
+
if (!oc)
|
|
64
|
+
return;
|
|
65
|
+
visiting.add(c);
|
|
66
|
+
for (const d of oc.structure.deltas)
|
|
67
|
+
for (const dep of d.dependsOn)
|
|
68
|
+
visit(dep);
|
|
69
|
+
visiting.delete(c);
|
|
70
|
+
order.push(c);
|
|
71
|
+
};
|
|
72
|
+
visit(change);
|
|
73
|
+
return order;
|
|
74
|
+
}
|
|
75
|
+
export function viewAt(current, change, open) {
|
|
76
|
+
let v = current;
|
|
77
|
+
for (const c of closure(change, open))
|
|
78
|
+
v = apply(v, open.get(c).structure);
|
|
79
|
+
return v;
|
|
80
|
+
}
|
|
81
|
+
/** Agreed changes in an order that applies each after its dependencies. */
|
|
82
|
+
export function agreedOrder(open) {
|
|
83
|
+
const order = [];
|
|
84
|
+
for (const [name, oc] of [...open].sort(([a], [b]) => a.localeCompare(b))) {
|
|
85
|
+
if (oc.status !== "agreed")
|
|
86
|
+
continue;
|
|
87
|
+
for (const c of closure(name, open))
|
|
88
|
+
if (!order.includes(c) && open.get(c).status === "agreed")
|
|
89
|
+
order.push(c);
|
|
90
|
+
}
|
|
91
|
+
return order;
|
|
92
|
+
}
|
|
93
|
+
export function intended(current, open) {
|
|
94
|
+
let v = current;
|
|
95
|
+
for (const c of agreedOrder(open))
|
|
96
|
+
v = apply(v, open.get(c).structure);
|
|
97
|
+
return v;
|
|
98
|
+
}
|
|
99
|
+
/** Check 1: write overlap. */
|
|
100
|
+
export function checkOverlap(open, problems) {
|
|
101
|
+
const names = [...open.keys()].sort();
|
|
102
|
+
const writes = new Map(names.map((n) => [n, writesOf(open.get(n).structure)]));
|
|
103
|
+
for (let i = 0; i < names.length; i++) {
|
|
104
|
+
for (let j = i + 1; j < names.length; j++) {
|
|
105
|
+
const a = names[i];
|
|
106
|
+
const b = names[j];
|
|
107
|
+
const sa = open.get(a).status;
|
|
108
|
+
const sb = open.get(b).status;
|
|
109
|
+
if (sa !== "agreed" && sb !== "agreed")
|
|
110
|
+
continue;
|
|
111
|
+
for (const [key, wa] of writes.get(a)) {
|
|
112
|
+
const wb = writes.get(b).get(key);
|
|
113
|
+
if (wb === undefined)
|
|
114
|
+
continue;
|
|
115
|
+
// One adding what the other modifies or removes is reported by the other's own deltas, whose base cannot exist.
|
|
116
|
+
// Two additions of one id are one id claimed twice, whatever their content.
|
|
117
|
+
if ((wa === "ADDED") !== (wb === "ADDED"))
|
|
118
|
+
continue;
|
|
119
|
+
const verb = wa === "ADDED" ? "both ADD" : wa === wb ? `both ${wa}` : `${wa} and ${wb}`;
|
|
120
|
+
if (sa === "agreed" && sb === "agreed")
|
|
121
|
+
problems.push(`write overlap: agreed changes ${a} and ${b} ${verb} ${key}; reorder or merge them`);
|
|
122
|
+
else {
|
|
123
|
+
const [held, waiting] = sa === "agreed" ? [a, b] : [b, a];
|
|
124
|
+
problems.push(`write overlap: ${waiting} ${verb === "both ADD" ? "adds" : "writes"} ${key}, which agreed change ${held} also ${verb === "both ADD" ? "adds" : "writes"}; it cannot be agreed while ${held} is open`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Check 3, beyond base revisions: withdrawn dependencies, agreement before a dependency, cycles. */
|
|
131
|
+
export function checkDependencies(open, archived, problems) {
|
|
132
|
+
for (const [name, oc] of [...open].sort(([a], [b]) => a.localeCompare(b))) {
|
|
133
|
+
const deps = new Set(oc.structure.deltas.flatMap((d) => [...d.dependsOn]));
|
|
134
|
+
for (const dep of deps) {
|
|
135
|
+
const target = open.get(dep);
|
|
136
|
+
if (target === undefined) {
|
|
137
|
+
if (!archived.has(dep))
|
|
138
|
+
problems.push(`read dependency: ${name} depends on ${dep}, which is neither open nor archived: withdrawn, so ${name} is invalidated until it no longer needs it`);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (target.status === "withdrawn" || target.status === "superseded") {
|
|
142
|
+
problems.push(`read dependency: ${name} depends on ${dep}, whose agreement record is ${target.status}: ${name} is invalidated until it no longer needs it`);
|
|
143
|
+
}
|
|
144
|
+
else if (oc.status === "agreed" && target.status !== "agreed") {
|
|
145
|
+
problems.push(`read dependency: ${name} is agreed and depends on ${dep}, which is not: a change is agreed with its dependency closure`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// A cycle through this change.
|
|
149
|
+
const seen = new Set();
|
|
150
|
+
const stack = [...deps];
|
|
151
|
+
while (stack.length > 0) {
|
|
152
|
+
const c = stack.pop();
|
|
153
|
+
if (c === name) {
|
|
154
|
+
problems.push(`read dependency: ${name} depends on itself through depends_on; a cycle can never archive`);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
if (seen.has(c))
|
|
158
|
+
continue;
|
|
159
|
+
seen.add(c);
|
|
160
|
+
for (const d of open.get(c)?.structure.deltas ?? [])
|
|
161
|
+
stack.push(...d.dependsOn);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const KEY_RE = /\b([a-z][a-z0-9_]*)\/([^\s,;:()"]+)/g;
|
|
166
|
+
/** The changes that write any element a finding names. */
|
|
167
|
+
export function attribute(problem, open, among) {
|
|
168
|
+
const keys = new Set([...problem.matchAll(KEY_RE)].map((m) => `${m[1]}/${m[2]}`));
|
|
169
|
+
return among.filter((c) => {
|
|
170
|
+
const w = writesOf(open.get(c).structure);
|
|
171
|
+
return [...keys].some((k) => w.has(k));
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/lib/structure/compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ChangeStructure, type Element } from "./model.js";
|
|
2
|
+
export interface Effect {
|
|
3
|
+
readonly element: string;
|
|
4
|
+
readonly operation: "ADDED" | "MODIFIED" | "REMOVED";
|
|
5
|
+
/** The revision written against (MODIFIED, REMOVED). */
|
|
6
|
+
readonly base?: string;
|
|
7
|
+
/** The revision the change leaves (ADDED, MODIFIED). */
|
|
8
|
+
readonly target?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function effectsOf(s: ChangeStructure, current: ReadonlyMap<string, ReadonlyMap<string, Element>>): Effect[];
|
|
11
|
+
export declare function parseAppliedRecord(text: string): {
|
|
12
|
+
change: string;
|
|
13
|
+
baseCommit: string;
|
|
14
|
+
effects: Effect[];
|
|
15
|
+
} | null;
|
|
16
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../src/lib/structure/effects.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACrD,wDAAwD;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,CAkBlH;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAQjH"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// A change's structural effect, and the effect record an archive leaves (M-ADR 0230 §4.6, §4.7, Proposed). Pure reads,
|
|
2
|
+
// so the catalogue builder and the verify-only CLI can carry them; writing the record is apply.ts's.
|
|
3
|
+
import { parseDocument } from "yaml";
|
|
4
|
+
import { elementKey, revision } from "./model.js";
|
|
5
|
+
export function effectsOf(s, current) {
|
|
6
|
+
const out = [];
|
|
7
|
+
const rev = (catalogue, id) => {
|
|
8
|
+
const e = current.get(catalogue)?.get(id);
|
|
9
|
+
return e ? revision(e.catalogue, e.id, e.columns) : undefined;
|
|
10
|
+
};
|
|
11
|
+
for (const d of s.deltas) {
|
|
12
|
+
for (const e of d.added)
|
|
13
|
+
out.push({ element: elementKey(e.catalogue, e.id), operation: "ADDED", target: revision(e.catalogue, e.id, e.columns) });
|
|
14
|
+
for (const e of d.modified) {
|
|
15
|
+
const base = rev(e.catalogue, e.id);
|
|
16
|
+
out.push({ element: elementKey(e.catalogue, e.id), operation: "MODIFIED", ...(base ? { base } : {}), target: revision(e.catalogue, e.id, e.columns) });
|
|
17
|
+
}
|
|
18
|
+
for (const r of d.removed) {
|
|
19
|
+
const base = rev(r.catalogue, r.id);
|
|
20
|
+
out.push({ element: elementKey(r.catalogue, r.id), operation: "REMOVED", ...(base ? { base } : {}) });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return out.sort((a, b) => a.element.localeCompare(b.element));
|
|
24
|
+
}
|
|
25
|
+
export function parseAppliedRecord(text) {
|
|
26
|
+
try {
|
|
27
|
+
const v = parseDocument(text).toJS();
|
|
28
|
+
if (!v || typeof v.change !== "string" || !Array.isArray(v.effects))
|
|
29
|
+
return null;
|
|
30
|
+
return { change: v.change, baseCommit: String(v.base_commit ?? ""), effects: v.effects };
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../../src/lib/structure/effects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { runCatalogueBuild } from "../catalogue/build.js";
|
|
2
|
+
import type { Finding } from "../catalogue/findings.js";
|
|
3
|
+
export declare const REPORT_FILE = "extraction-report.md";
|
|
4
|
+
export interface Extraction {
|
|
5
|
+
/** Why nothing was extracted, or null. */
|
|
6
|
+
readonly refused: string | null;
|
|
7
|
+
/** Partition -> file text. */
|
|
8
|
+
readonly files: ReadonlyMap<string, string>;
|
|
9
|
+
/** Catalogue -> element count, structure catalogues with elements only. */
|
|
10
|
+
readonly counts: ReadonlyMap<string, number>;
|
|
11
|
+
readonly loss: readonly string[];
|
|
12
|
+
readonly extraction: readonly Finding[];
|
|
13
|
+
readonly report: string;
|
|
14
|
+
}
|
|
15
|
+
/** Extract the model. Writes nothing; `writeExtraction` writes it. `build` is the catalogue build, replaceable in tests. */
|
|
16
|
+
export declare function extractStructure(sddPath: string, build?: typeof runCatalogueBuild): Promise<Extraction>;
|
|
17
|
+
/** Write the partition files and the report under openspec/structure/. Returns the paths written. */
|
|
18
|
+
export declare function writeExtraction(sddPath: string, x: Extraction): Promise<string[]>;
|
|
19
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/lib/structure/extract.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAMxD,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAKlD,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAoDD,4HAA4H;AAC5H,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,OAAO,iBAAqC,GAAG,OAAO,CAAC,UAAU,CAAC,CAoChI;AAED,qGAAqG;AACrG,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWvF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// An SDD's first structural model, extracted from its sources (M-ADR 0230 §5.3, §6 step 1, Proposed). The builders
|
|
2
|
+
// already parse the sources: the diagrams, data models, service tables, configuration, traceability manifests,
|
|
3
|
+
// feature trees and groundings. So extraction builds the catalogue from the sources into a scratch directory, and
|
|
4
|
+
// projects the model it implies (modelFromRows). It writes the partition files and an extraction report beside
|
|
5
|
+
// them, and touches no source file. From the moment openspec/structure/ exists, committed or not, the catalogue is
|
|
6
|
+
// built from the model, so writing it is the admission: review the extraction against the code first, with --dry-run
|
|
7
|
+
// (which writes nothing) or in a scratch copy, and keep the originals until that review is complete.
|
|
8
|
+
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { mkdir, mkdtemp, readdir, rm, writeFile } from "node:fs/promises";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { runCatalogueBuild } from "../catalogue/build.js";
|
|
13
|
+
import { readCatalogueCsv } from "../catalogue/csv-reader.js";
|
|
14
|
+
import { loadCanonicalSchema } from "../catalogue/schema-loader.js";
|
|
15
|
+
import { modelFileText, modelFromRows } from "./catalogue.js";
|
|
16
|
+
import { STRUCTURE_DIR } from "./model.js";
|
|
17
|
+
import { STRUCTURE } from "./view.js";
|
|
18
|
+
export const REPORT_FILE = "extraction-report.md";
|
|
19
|
+
/** Derived path columns of structure catalogues: the source files the elements were read from. */
|
|
20
|
+
const SOURCE_PATH_COLUMNS = ["doc_path", "diagram_path", "spec_path"];
|
|
21
|
+
function head(sddPath) {
|
|
22
|
+
try {
|
|
23
|
+
const sha = execFileSync("git", ["-C", sddPath, "rev-parse", "--short", "HEAD"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
24
|
+
const dirty = execFileSync("git", ["-C", sddPath, "status", "--porcelain"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() !== "";
|
|
25
|
+
return dirty ? `${sha}, with uncommitted changes` : sha;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return "not a git repository";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function report(sddId, at, schemaVersion, x, sources, otherFindings) {
|
|
32
|
+
const lines = [
|
|
33
|
+
"# Structural model extraction",
|
|
34
|
+
"",
|
|
35
|
+
`Extracted by \`sdd-cli migrate structure\` from ${sddId}'s sources at ${at}, against catalogue schema ${schemaVersion} (M-ADR 0230, Proposed).`,
|
|
36
|
+
"",
|
|
37
|
+
"**Writing this model admits it as the baseline** (M-ADR 0230 §6 step 1). From the moment `openspec/structure/` exists, committed or not, it is the record of structure: the catalogue is built from it, and the structural-model check asks every open change for its structural deltas or a `none.yaml` (report only while M-ADR 0230 is Proposed). Review it against the code before it is written (`sdd-cli migrate structure --dry-run` prints this report and writes nothing), and keep the sources listed below until that review is complete; nothing here changed them. Removing `openspec/structure/` withdraws a model written too soon. After admission, structure changes only through a change's structural deltas, and the diagrams and tables are generated by `sdd-cli structure render`.",
|
|
38
|
+
"",
|
|
39
|
+
"## Elements",
|
|
40
|
+
"",
|
|
41
|
+
"| Catalogue | Elements |",
|
|
42
|
+
"| --- | --- |",
|
|
43
|
+
...[...x.counts].map(([c, n]) => `| ${c} | ${n} |`),
|
|
44
|
+
"",
|
|
45
|
+
`Partitions: ${[...x.files.keys()].map((p) => `\`${p}\``).join(", ") || "none"}.`,
|
|
46
|
+
"",
|
|
47
|
+
"## What the extraction could not carry",
|
|
48
|
+
"",
|
|
49
|
+
];
|
|
50
|
+
if (x.loss.length === 0 && x.extraction.length === 0)
|
|
51
|
+
lines.push("Nothing: every structural fact the sources state that a builder reads is in the model.", "");
|
|
52
|
+
for (const l of x.loss)
|
|
53
|
+
lines.push(`- ${l}`);
|
|
54
|
+
for (const f of x.extraction)
|
|
55
|
+
lines.push(`- ${f.summary}`);
|
|
56
|
+
if (x.loss.length + x.extraction.length > 0)
|
|
57
|
+
lines.push("");
|
|
58
|
+
lines.push("Prose, and anything a builder does not read, stays in the original files only. A diagram's layout and styling are not structure, and the generated views do not reproduce them.", "", "## Sources the elements were read from", "", ...(sources.length > 0 ? sources.map((s) => `- \`${s}\``) : ["- (no element names its source file)"]), "", "## Other findings of the build", "", ...(otherFindings.size > 0 ? [...otherFindings].map(([c, n]) => `- ${c}: ${n}`) : ["- none"]), "", "These are the build's findings about the sources. They are reported by `sdd-cli catalogue build` as before, and extraction does not change them.", "");
|
|
59
|
+
return lines.join("\n");
|
|
60
|
+
}
|
|
61
|
+
/** Extract the model. Writes nothing; `writeExtraction` writes it. `build` is the catalogue build, replaceable in tests. */
|
|
62
|
+
export async function extractStructure(sddPath, build = runCatalogueBuild) {
|
|
63
|
+
const none = { files: new Map(), counts: new Map(), loss: [], extraction: [], report: "" };
|
|
64
|
+
try {
|
|
65
|
+
await readdir(join(sddPath, STRUCTURE_DIR));
|
|
66
|
+
return { ...none, refused: `${STRUCTURE_DIR}/ already exists; an SDD's first model is extracted once, and after that structure changes through a change's structural deltas` };
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// no model yet
|
|
70
|
+
}
|
|
71
|
+
const schema = await loadCanonicalSchema();
|
|
72
|
+
const scratch = await mkdtemp(join(tmpdir(), "sdd-migrate-structure-"));
|
|
73
|
+
try {
|
|
74
|
+
const built = await build({ sddPath, outDir: scratch }, () => undefined);
|
|
75
|
+
if (built.exitCode !== 0) {
|
|
76
|
+
return { ...none, refused: `the sources do not build cleanly (sdd-cli catalogue build exits ${built.exitCode}: ${built.internalFkPass ? "" : "dangling references, "}${built.pkConflicts} key conflict(s)); a model extracted from them would carry the same faults. Fix the build first` };
|
|
77
|
+
}
|
|
78
|
+
const rows = new Map();
|
|
79
|
+
for (const c of schema.catalogues) {
|
|
80
|
+
if (c.sourceOfTruth !== STRUCTURE)
|
|
81
|
+
continue;
|
|
82
|
+
rows.set(c.name, (await readCatalogueCsv(join(scratch, `${c.name}.csv`)).catch(() => ({ rows: [] }))).rows);
|
|
83
|
+
}
|
|
84
|
+
const loss = [];
|
|
85
|
+
const model = modelFromRows(schema, rows, { platform: built.profile === "platform-profile", sddId: built.sddId }, loss);
|
|
86
|
+
const files = new Map([...model].sort(([a], [b]) => a.localeCompare(b)).map(([p, els]) => [p, modelFileText(p, els)]));
|
|
87
|
+
const counts = new Map();
|
|
88
|
+
for (const els of model.values())
|
|
89
|
+
for (const [c, list] of Object.entries(els))
|
|
90
|
+
counts.set(c, (counts.get(c) ?? 0) + list.length);
|
|
91
|
+
const sortedCounts = new Map([...counts].sort(([a], [b]) => a.localeCompare(b)));
|
|
92
|
+
const sources = new Set();
|
|
93
|
+
for (const list of rows.values())
|
|
94
|
+
for (const r of list)
|
|
95
|
+
for (const col of SOURCE_PATH_COLUMNS)
|
|
96
|
+
if (r[col])
|
|
97
|
+
sources.add(String(r[col]));
|
|
98
|
+
const extraction = built.findings.filter((f) => f.category === "extraction");
|
|
99
|
+
const other = new Map();
|
|
100
|
+
for (const f of built.findings)
|
|
101
|
+
if (f.category !== "extraction")
|
|
102
|
+
other.set(String(f.category), (other.get(String(f.category)) ?? 0) + 1);
|
|
103
|
+
const x = { files, counts: sortedCounts, loss, extraction };
|
|
104
|
+
return { ...x, refused: null, report: report(built.sddId, head(sddPath), schema.schemaVersion, x, [...sources].sort(), new Map([...other].sort())) };
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await rm(scratch, { recursive: true, force: true });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Write the partition files and the report under openspec/structure/. Returns the paths written. */
|
|
111
|
+
export async function writeExtraction(sddPath, x) {
|
|
112
|
+
const dir = join(sddPath, STRUCTURE_DIR);
|
|
113
|
+
await mkdir(dir, { recursive: true });
|
|
114
|
+
const written = [];
|
|
115
|
+
for (const [p, text] of x.files) {
|
|
116
|
+
await writeFile(join(dir, `${p}.yaml`), text, "utf8");
|
|
117
|
+
written.push(join(STRUCTURE_DIR, `${p}.yaml`));
|
|
118
|
+
}
|
|
119
|
+
await writeFile(join(dir, REPORT_FILE), x.report, "utf8");
|
|
120
|
+
written.push(join(STRUCTURE_DIR, REPORT_FILE));
|
|
121
|
+
return written;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/lib/structure/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare const STRUCTURE_DIR: string;
|
|
2
|
+
export declare const NO_OP_FILE = "none.yaml";
|
|
3
|
+
/** An archived change's record of its structural effect, beside its deltas (M-ADR 0230 §4.6). */
|
|
4
|
+
export declare const APPLIED_FILE = "applied.yaml";
|
|
5
|
+
/** Partition names a file name would confuse with the no-op claim or the effect record. */
|
|
6
|
+
export declare const RESERVED_PARTITIONS: ReadonlySet<string>;
|
|
7
|
+
export declare const FORMAT_VERSION = "1.0.0";
|
|
8
|
+
export type Value = string | number | boolean;
|
|
9
|
+
export interface Element {
|
|
10
|
+
readonly catalogue: string;
|
|
11
|
+
readonly id: string;
|
|
12
|
+
/** Every stated column except `id`. */
|
|
13
|
+
readonly columns: Readonly<Record<string, Value>>;
|
|
14
|
+
readonly partition: string;
|
|
15
|
+
/** The file it was read from, relative to the SDD. */
|
|
16
|
+
readonly file: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ModelFile {
|
|
19
|
+
readonly partition: string;
|
|
20
|
+
readonly file: string;
|
|
21
|
+
readonly elements: readonly Element[];
|
|
22
|
+
}
|
|
23
|
+
export interface Removal {
|
|
24
|
+
readonly catalogue: string;
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly reason: string;
|
|
27
|
+
}
|
|
28
|
+
export interface Delta {
|
|
29
|
+
readonly change: string;
|
|
30
|
+
readonly partition: string;
|
|
31
|
+
readonly file: string;
|
|
32
|
+
readonly dependsOn: readonly string[];
|
|
33
|
+
readonly added: readonly Element[];
|
|
34
|
+
readonly modified: readonly Element[];
|
|
35
|
+
readonly removed: readonly Removal[];
|
|
36
|
+
/** `<catalogue>/<id>` -> the revision the change was written against. */
|
|
37
|
+
readonly base: ReadonlyMap<string, string>;
|
|
38
|
+
}
|
|
39
|
+
export interface ChangeStructure {
|
|
40
|
+
readonly change: string;
|
|
41
|
+
readonly deltas: readonly Delta[];
|
|
42
|
+
/** The no-op claim's reason, when the change makes one. */
|
|
43
|
+
readonly noOp: {
|
|
44
|
+
readonly file: string;
|
|
45
|
+
readonly reason: string;
|
|
46
|
+
} | null;
|
|
47
|
+
/** True when the change has a structure/ directory at all. */
|
|
48
|
+
readonly present: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** `sha256:<hex>` of the element's canonical JSON: {catalogue, columns (sorted), id}, no whitespace, UTF-8. */
|
|
51
|
+
export declare function revision(catalogue: string, id: string, columns: Readonly<Record<string, Value>>): string;
|
|
52
|
+
export declare function elementKey(catalogue: string, id: string): string;
|
|
53
|
+
/** The model, or null when the SDD has no openspec/structure/ directory. */
|
|
54
|
+
export declare function loadModel(repo: string, problems: string[]): Promise<ModelFile[] | null>;
|
|
55
|
+
/** A change's structural artifact. */
|
|
56
|
+
export declare function loadChangeStructure(repo: string, change: string, problems: string[]): Promise<ChangeStructure>;
|
|
57
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/lib/structure/model.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,QAAgC,CAAC;AAC3D,eAAO,MAAM,UAAU,cAAc,CAAC;AACtC,iGAAiG;AACjG,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAgC,CAAC;AACrF,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,+GAA+G;AAC/G,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAKxG;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AA0FD,4EAA4E;AAC5E,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAqB7F;AAED,sCAAsC;AACtC,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAyDpH"}
|