@milehimikey/em 1.6.1 → 1.7.1
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/.claude/skills/event-modeling/SKILL.md +94 -49
- package/.claude/skills/event-modeling/reference/conform.md +30 -8
- package/.claude/skills/event-modeling/reference/em-dsl.md +194 -73
- package/.claude/skills/event-modeling/reference/extract.md +14 -11
- package/.claude/skills/event-modeling/reference/implement.md +172 -0
- package/.claude/skills/event-modeling/reference/methodology.md +40 -33
- package/.claude/skills/event-modeling/templates/conformance-report.md +15 -9
- package/.claude/skills/event-modeling/templates/model-readme.md +7 -7
- package/.claude/skills/event-modeling/templates/slice.md +73 -7
- package/.claude/skills/event-modeling/templates/state.md +7 -6
- package/README.md +1 -0
- package/dist/catalog/build.d.ts +5 -0
- package/dist/catalog/build.js +1 -3
- package/dist/catalog/build.js.map +1 -1
- package/dist/catalog/classify.d.ts +7 -8
- package/dist/catalog/classify.js +7 -8
- package/dist/catalog/classify.js.map +1 -1
- package/dist/catalog/docJoin.d.ts +39 -0
- package/dist/catalog/docJoin.js +86 -0
- package/dist/catalog/docJoin.js.map +1 -0
- package/dist/catalog/driftSignal.d.ts +16 -0
- package/dist/catalog/driftSignal.js +24 -0
- package/dist/catalog/driftSignal.js.map +1 -0
- package/dist/catalog/frontmatterCoherenceValidate.d.ts +8 -0
- package/dist/catalog/frontmatterCoherenceValidate.js +52 -0
- package/dist/catalog/frontmatterCoherenceValidate.js.map +1 -0
- package/dist/catalog/lineageValidate.d.ts +9 -0
- package/dist/catalog/lineageValidate.js +161 -0
- package/dist/catalog/lineageValidate.js.map +1 -0
- package/dist/catalog/readSliceDoc.d.ts +2 -0
- package/dist/catalog/readSliceDoc.js +21 -0
- package/dist/catalog/readSliceDoc.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +94 -3
- package/dist/catalog/sliceDoc.js +157 -7
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +11 -0
- package/dist/catalog/sliceReadyValidate.js +85 -0
- package/dist/catalog/sliceReadyValidate.js.map +1 -0
- package/dist/cli/diff-inputs.d.ts +20 -0
- package/dist/cli/diff-inputs.js +75 -18
- package/dist/cli/diff-inputs.js.map +1 -1
- package/dist/cli/ledgerCheck.d.ts +38 -0
- package/dist/cli/ledgerCheck.js +116 -0
- package/dist/cli/ledgerCheck.js.map +1 -0
- package/dist/cli/skillCheck.d.ts +18 -0
- package/dist/cli/skillCheck.js +63 -0
- package/dist/cli/skillCheck.js.map +1 -0
- package/dist/cli/skillSync.d.ts +22 -0
- package/dist/cli/skillSync.js +69 -0
- package/dist/cli/skillSync.js.map +1 -0
- package/dist/cli/skillVersionCheck.d.ts +32 -0
- package/dist/cli/skillVersionCheck.js +145 -0
- package/dist/cli/skillVersionCheck.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +203 -32
- package/dist/cli.js.map +1 -1
- package/dist/emit/diffJson.d.ts +1 -1
- package/dist/emit/diffJson.js +18 -14
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/dot.js +46 -5
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/json.d.ts +10 -25
- package/dist/emit/json.js +70 -103
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/ledgerJson.d.ts +5 -0
- package/dist/emit/ledgerJson.js +25 -0
- package/dist/emit/ledgerJson.js.map +1 -0
- package/dist/emit/skillCheckJson.d.ts +5 -0
- package/dist/emit/skillCheckJson.js +32 -0
- package/dist/emit/skillCheckJson.js.map +1 -0
- package/dist/model/diff.d.ts +44 -1
- package/dist/model/diff.js +51 -9
- package/dist/model/diff.js.map +1 -1
- package/dist/model/edges.js +17 -17
- package/dist/model/edges.js.map +1 -1
- package/dist/model/model.d.ts +1 -1
- package/dist/model/refs.d.ts +23 -0
- package/dist/model/refs.js +75 -0
- package/dist/model/refs.js.map +1 -0
- package/dist/model/rules.d.ts +253 -0
- package/dist/model/rules.js +254 -0
- package/dist/model/rules.js.map +1 -0
- package/dist/model/validate.d.ts +23 -1
- package/dist/model/validate.js +207 -69
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +3 -2
- package/dist/parser/lexer.d.ts +17 -2
- package/dist/parser/lexer.js +119 -13
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.js +75 -34
- package/dist/parser/parser.js.map +1 -1
- package/dist/pipeline.d.ts +9 -0
- package/dist/pipeline.js +4 -2
- package/dist/pipeline.js.map +1 -1
- package/dist/render/sliceDiagram.js +33 -35
- package/dist/render/sliceDiagram.js.map +1 -1
- package/dist/render/sliceStatus.js +1 -1
- package/dist/render/sliceStatus.js.map +1 -1
- package/dist/util/isMainModule.d.ts +14 -0
- package/dist/util/isMainModule.js +33 -0
- package/dist/util/isMainModule.js.map +1 -0
- package/dist/util/walkDir.d.ts +4 -0
- package/dist/util/walkDir.js +28 -0
- package/dist/util/walkDir.js.map +1 -0
- package/package.json +5 -2
package/dist/emit/dot.js
CHANGED
|
@@ -83,9 +83,13 @@ function elementCell(el) {
|
|
|
83
83
|
`color="${s.stroke}", fontcolor="${s.fontColor}", style=${shape}, ` +
|
|
84
84
|
`shape=box, fixedsize=false, width=${CELL_W}, margin="0.04,0.03"];`);
|
|
85
85
|
}
|
|
86
|
+
const lineCount = wrap(el.name, 18).length;
|
|
87
|
+
const LINE_H = 0.1833; // inches, ~13.2pt at fontsize 11
|
|
88
|
+
const V_PAD = 0.1667; // inches, ~12pt top+bottom padding inside a fixedsize box
|
|
89
|
+
const height = Math.max(CELL_H, lineCount * LINE_H + V_PAD);
|
|
86
90
|
return (`${el.id} [label=${q(wrapLabel(el.name))}, fillcolor="${s.fill}", ` +
|
|
87
91
|
`color="${s.stroke}", fontcolor="${s.fontColor}", style=${shape}, ` +
|
|
88
|
-
`fixedsize=true, width=${CELL_W}, height=${
|
|
92
|
+
`fixedsize=true, width=${CELL_W}, height=${height}];`);
|
|
89
93
|
}
|
|
90
94
|
/** Graphviz HTML-table label: bold title, a horizontal rule, one row per field. */
|
|
91
95
|
function fieldLabel(el) {
|
|
@@ -137,18 +141,55 @@ function wrap(name, max) {
|
|
|
137
141
|
const lines = [];
|
|
138
142
|
let cur = "";
|
|
139
143
|
for (const w of words) {
|
|
140
|
-
if (
|
|
144
|
+
if (w.length <= max) {
|
|
145
|
+
if (cur && (cur + " " + w).length > max) {
|
|
146
|
+
lines.push(cur);
|
|
147
|
+
cur = w;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
cur = cur ? cur + " " + w : w;
|
|
151
|
+
}
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// w has no whitespace and is longer than max on its own (e.g. a
|
|
155
|
+
// PascalCase/camelCase identifier pasted in place of a phrase): break it
|
|
156
|
+
// at natural boundaries so it still wraps instead of overflowing the
|
|
157
|
+
// fixed-width box. Hard-chop any leftover piece still too long (e.g. a
|
|
158
|
+
// single unbroken run of lowercase characters) as a last resort.
|
|
159
|
+
if (cur) {
|
|
141
160
|
lines.push(cur);
|
|
142
|
-
cur =
|
|
161
|
+
cur = "";
|
|
143
162
|
}
|
|
144
|
-
|
|
145
|
-
|
|
163
|
+
for (const piece of splitLongToken(w, max)) {
|
|
164
|
+
if (cur && (cur + piece).length > max) {
|
|
165
|
+
lines.push(cur);
|
|
166
|
+
cur = piece;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
cur = cur + piece;
|
|
170
|
+
}
|
|
146
171
|
}
|
|
147
172
|
}
|
|
148
173
|
if (cur)
|
|
149
174
|
lines.push(cur);
|
|
150
175
|
return lines;
|
|
151
176
|
}
|
|
177
|
+
/** Break a single unspaced token at camelCase/PascalCase transitions and
|
|
178
|
+
* -, _, / separators; hard-chop any resulting piece still longer than max. */
|
|
179
|
+
function splitLongToken(word, max) {
|
|
180
|
+
const pieces = word.split(/(?=[A-Z][a-z])|(?<=[a-z0-9])(?=[A-Z])|[-_/]/).filter(Boolean);
|
|
181
|
+
const result = [];
|
|
182
|
+
for (const p of pieces) {
|
|
183
|
+
if (p.length <= max) {
|
|
184
|
+
result.push(p);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
for (let i = 0; i < p.length; i += max)
|
|
188
|
+
result.push(p.slice(i, i + max));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
152
193
|
/** Quote a string for DOT (label newlines already encoded as \n). */
|
|
153
194
|
function q(s) {
|
|
154
195
|
return `"${s.replace(/"/g, '\\"')}"`;
|
package/dist/emit/dot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dot.js","sourceRoot":"","sources":["../../src/emit/dot.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dot.js","sourceRoot":"","sources":["../../src/emit/dot.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6EAA6E;AAC7E,kFAAkF;AAClF,8EAA8E;AAC9E,mEAAmE;AACnE,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,2DAA2D;AAG3D,OAAO,EAAQ,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,6EAA6E;AAC7E,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,+EAA+E;AAC/E,+EAA+E;AAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS;AAC7B,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,QAAQ,GAAG,IAAI,CAAC;AAEtB,MAAM,UAAU,OAAO,CAAC,KAAsB,EAAE,IAAU;IACxD,MAAM,CAAC,GAAa,EAAE,CAAC;IAEvB,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC/B,CAAC,CAAC,IAAI,CACJ,2EAA2E;QACzE,0DAA0D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAC9E,CAAC;IACF,CAAC,CAAC,IAAI,CACJ,wEAAwE;QACtE,oCAAoC,CACvC,CAAC;IACF,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACrD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,8CAA8C;IAC9C,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC3B,CAAC,CAAC,IAAI,CACJ,KAAK,UAAU,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;YACtE,oCAAoC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,uBAAuB;IACvB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,sEAAsE;IACtE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAC7D,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe;IAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,kDAAkD;IAClD,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAAC,EAAW;IAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACjE,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,2DAA2D;QAC3D,OAAO,CACL,GAAG,EAAE,CAAC,EAAE,WAAW,UAAU,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,KAAK;YAC5D,UAAU,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC,SAAS,YAAY,KAAK,IAAI;YACnE,qCAAqC,MAAM,wBAAwB,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,iCAAiC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,0DAA0D;IAChF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;IAC5D,OAAO,CACL,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,KAAK;QACnE,UAAU,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC,SAAS,YAAY,KAAK,IAAI;QACnE,yBAAyB,MAAM,YAAY,MAAM,IAAI,CACtD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,UAAU,CAAC,EAAW;IAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC,IAAI,CACP,6CAA6C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,mBAAmB,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,CACL,oEAAoE;QACpE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACb,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,mFAAmF;AACnF,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,OAAO,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,kDAAkD,MAAM,YAAY,MAAM,IAAI,CAAC;AAC9G,CAAC;AAED,iFAAiF;AACjF,SAAS,UAAU,CAAC,CAAS,EAAE,IAAY;IACzC,OAAO,CACL,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe;QAClE,4BAA4B,WAAW,aAAa,aAAa,KAAK;QACtE,cAAc,WAAW,6CAA6C;QACtE,yBAAyB,MAAM,YAAY,QAAQ,gBAAgB,CACpE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAU,EAAE,GAAW;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;gDAEgD;AAChD,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,SAAS,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,kEAAkE;AAClE,SAAS,SAAS,CAAC,IAAY,EAAE,GAAG,GAAG,EAAE;IACvC,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,GAAW;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,GAAG,GAAG,CAAC,CAAC;YACV,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;YACD,SAAS;QACX,CAAC;QACD,gEAAgE;QAChE,yEAAyE;QACzE,qEAAqE;QACrE,uEAAuE;QACvE,iEAAiE;QACjE,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,GAAG,GAAG,KAAK,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;+EAC+E;AAC/E,SAAS,cAAc,CAAC,IAAY,EAAE,GAAW;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,SAAS,CAAC,CAAC,CAAS;IAClB,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AACvC,CAAC"}
|
package/dist/emit/json.d.ts
CHANGED
|
@@ -1,35 +1,16 @@
|
|
|
1
1
|
import { NormalizedModel } from "../model/model.js";
|
|
2
2
|
import { Diagnostic } from "../model/validate.js";
|
|
3
|
+
import { RefsResult } from "../model/refs.js";
|
|
3
4
|
export declare const GENERATOR_NAME = "@milehimikey/em";
|
|
4
5
|
export declare const GENERATOR_VERSION: string;
|
|
5
|
-
export declare const SCHEMA_VERSION = "1.
|
|
6
|
+
export declare const SCHEMA_VERSION = "1.5";
|
|
6
7
|
export interface ExportResult {
|
|
7
8
|
/** Pretty-printed JSON, no trailing newline. */
|
|
8
9
|
text: string;
|
|
9
|
-
/** validate()'s diagnostics
|
|
10
|
+
/** validate()'s diagnostics, refs' ref-collision warnings, and the doc-join's
|
|
11
|
+
* binding-missing-file/frontmatter-invalid warnings raised while exporting. */
|
|
10
12
|
diagnostics: Diagnostic[];
|
|
11
13
|
}
|
|
12
|
-
export interface RefsResult {
|
|
13
|
-
/** Export key per slice, same order/index as `model.slices`. */
|
|
14
|
-
sliceKeys: string[];
|
|
15
|
-
/** Internal `Element.id` -> stable export `ref`. */
|
|
16
|
-
refById: Map<string, string>;
|
|
17
|
-
/** Internal `TypeDecl.id` -> stable export `ref` (`types/<slug(name)>`). */
|
|
18
|
-
refByTypeId: Map<string, string>;
|
|
19
|
-
/** Ref-collision warnings raised while assigning keys/refs (duplicate names). */
|
|
20
|
-
diagnostics: Diagnostic[];
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Assign every slice its export key (`slug(name)`) and every element its
|
|
24
|
-
* export ref (`<sliceKey>/<kind>.<slug(name)>`), in document order, deduped
|
|
25
|
-
* with a `~2`, `~3`, … suffix on collision. Shared by `em export` (this
|
|
26
|
-
* module) and `em diff` (`src/model/diff.ts`), which both need the same
|
|
27
|
-
* edit-stable identity scheme to match elements/slices across models. Also
|
|
28
|
-
* assigns every declared type its export ref (`types/<slug(name)>`) — types
|
|
29
|
-
* aren't slice-scoped, so no sliceKey prefix, same dedup-with-warning
|
|
30
|
-
* machinery otherwise.
|
|
31
|
-
*/
|
|
32
|
-
export declare function computeRefs(model: NormalizedModel): RefsResult;
|
|
33
14
|
export interface FieldExport {
|
|
34
15
|
name: string;
|
|
35
16
|
type: string | null;
|
|
@@ -39,5 +20,9 @@ export interface FieldExport {
|
|
|
39
20
|
array: boolean;
|
|
40
21
|
} | null;
|
|
41
22
|
}
|
|
42
|
-
/** Build the `em export` document for an already-validated (error-free) model.
|
|
43
|
-
|
|
23
|
+
/** Build the `em export` document for an already-validated (error-free) model. `refs` is
|
|
24
|
+
* `compile()`'s already-computed `RefsResult` (MIL-91) — never recomputed here, so its
|
|
25
|
+
* ref-collision diagnostics (already folded into `diagnostics` by `compile()`) aren't
|
|
26
|
+
* emitted a second time. `path` is the `.em` file's own path — the doc join resolves
|
|
27
|
+
* `slices/*.md` relative to its directory, same convention `em catalog`'s doc lookup uses. */
|
|
28
|
+
export declare function buildExport(model: NormalizedModel, refs: RefsResult, diagnostics: Diagnostic[], source: string, path: string): ExportResult;
|
package/dist/emit/json.js
CHANGED
|
@@ -8,79 +8,26 @@
|
|
|
8
8
|
// `<sliceKey>/<kind>.<slug(name)>`, so inserting or reordering slices never
|
|
9
9
|
// changes an existing element's public identity.
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
11
|
-
import { readFileSync } from "node:fs";
|
|
12
11
|
import { dirname, join } from "node:path";
|
|
13
12
|
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { readFileSync } from "node:fs";
|
|
14
14
|
import { resolveByName, resolveTypeRef } from "../model/model.js";
|
|
15
|
-
import {
|
|
15
|
+
import { serializeDiagnostic } from "../model/validate.js";
|
|
16
|
+
import { classifySlicePattern } from "../catalog/classify.js";
|
|
17
|
+
import { resolveSliceDocJoin } from "../catalog/docJoin.js";
|
|
16
18
|
// Read once from package.json (two levels up from src/emit/ and dist/emit/
|
|
17
19
|
// alike) so `generator.version` can never drift from the released version.
|
|
18
20
|
// tsconfig targets NodeNext without resolveJsonModule, hence fs over import.
|
|
19
21
|
export const GENERATOR_NAME = "@milehimikey/em";
|
|
20
22
|
export const GENERATOR_VERSION = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json"), "utf8")).version;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
* aren't slice-scoped, so no sliceKey prefix, same dedup-with-warning
|
|
30
|
-
* machinery otherwise.
|
|
31
|
-
*/
|
|
32
|
-
export function computeRefs(model) {
|
|
33
|
-
const diagnostics = [];
|
|
34
|
-
// Pass 1: assign every slice its export key and every element its export
|
|
35
|
-
// ref, in document order, before resolving any cross-references. Doing
|
|
36
|
-
// refs and cross-references in separate passes means a `from` or arrow
|
|
37
|
-
// can point at any element regardless of declaration order within a slice.
|
|
38
|
-
const usedSliceKeys = new Set();
|
|
39
|
-
const sliceKeys = model.slices.map((slice) => {
|
|
40
|
-
const base = kebabSlug(slice.name);
|
|
41
|
-
const key = dedupe(base, usedSliceKeys, "~");
|
|
42
|
-
if (key !== base) {
|
|
43
|
-
diagnostics.push({
|
|
44
|
-
severity: "warning",
|
|
45
|
-
message: `duplicate slice name "${slice.name}" (export key "${base}" already used); rename slices uniquely for stable export refs`,
|
|
46
|
-
line: slice.line,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
return key;
|
|
50
|
-
});
|
|
51
|
-
const usedElementRefs = new Set();
|
|
52
|
-
const refById = new Map();
|
|
53
|
-
model.slices.forEach((slice, sliceIndex) => {
|
|
54
|
-
const sliceKey = sliceKeys[sliceIndex];
|
|
55
|
-
for (const el of slice.elements) {
|
|
56
|
-
const base = `${sliceKey}/${el.kind}.${kebabSlug(el.name)}`;
|
|
57
|
-
const ref = dedupe(base, usedElementRefs, "~");
|
|
58
|
-
if (ref !== base) {
|
|
59
|
-
diagnostics.push({
|
|
60
|
-
severity: "warning",
|
|
61
|
-
message: `duplicate ${el.kind} "${el.name}" in slice "${slice.name}" (export ref "${base}" already used); rename for a stable export ref`,
|
|
62
|
-
line: el.line,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
refById.set(el.id, ref);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
const usedTypeRefs = new Set();
|
|
69
|
-
const refByTypeId = new Map();
|
|
70
|
-
for (const t of model.types) {
|
|
71
|
-
const base = `types/${kebabSlug(t.name)}`;
|
|
72
|
-
const ref = dedupe(base, usedTypeRefs, "~");
|
|
73
|
-
if (ref !== base) {
|
|
74
|
-
diagnostics.push({
|
|
75
|
-
severity: "warning",
|
|
76
|
-
message: `duplicate type "${t.name}" (export ref "${base}" already used); rename for a stable export ref`,
|
|
77
|
-
line: t.line,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
refByTypeId.set(t.id, ref);
|
|
81
|
-
}
|
|
82
|
-
return { sliceKeys, refById, refByTypeId, diagnostics };
|
|
83
|
-
}
|
|
23
|
+
// 1.4 (MIL-91): each slice gains `pattern` (model-derived, classifySlicePattern — same
|
|
24
|
+
// function `em catalog` already uses) and `doc` (the slice-doc frontmatter join, always a
|
|
25
|
+
// non-null object; see catalog/docJoin.ts). Diagnostics gain `code`/`refs`. Additive-only per
|
|
26
|
+
// the versioning policy below — a minor bump.
|
|
27
|
+
// 1.5 (MIL-85): `slice.doc` gains `driftSignal` — the status/implementedIn coherence
|
|
28
|
+
// classification (catalog/driftSignal.ts), computed from the same doc parse as `doc.status`/
|
|
29
|
+
// `doc.version`/`doc.implementedIn`. Additive-only.
|
|
30
|
+
export const SCHEMA_VERSION = "1.5";
|
|
84
31
|
/**
|
|
85
32
|
* Export a single field, additively: `name`/`type` are exactly what today's consumers already
|
|
86
33
|
* see. `typeRef` is the new, purely-additive key — non-null only when `type` (bare or `[]`-
|
|
@@ -99,16 +46,67 @@ function fieldExport(f, typesByName, refByTypeId) {
|
|
|
99
46
|
: null,
|
|
100
47
|
};
|
|
101
48
|
}
|
|
102
|
-
/** Build the `em export` document for an already-validated (error-free) model.
|
|
103
|
-
|
|
104
|
-
|
|
49
|
+
/** Build the `em export` document for an already-validated (error-free) model. `refs` is
|
|
50
|
+
* `compile()`'s already-computed `RefsResult` (MIL-91) — never recomputed here, so its
|
|
51
|
+
* ref-collision diagnostics (already folded into `diagnostics` by `compile()`) aren't
|
|
52
|
+
* emitted a second time. `path` is the `.em` file's own path — the doc join resolves
|
|
53
|
+
* `slices/*.md` relative to its directory, same convention `em catalog`'s doc lookup uses. */
|
|
54
|
+
export function buildExport(model, refs, diagnostics, source, path) {
|
|
55
|
+
const { sliceKeys, refById, refByTypeId } = refs;
|
|
56
|
+
const baseDir = dirname(path);
|
|
57
|
+
const docDiagnostics = [];
|
|
105
58
|
const refOf = (id) => id ? refById.get(id) ?? null : null;
|
|
106
59
|
const fromOf = (el) => {
|
|
107
60
|
if (!el.from || el.from.length === 0)
|
|
108
61
|
return null;
|
|
109
62
|
return el.from.map((name) => ({ name, ref: refOf(resolveByName(model.byName, name)) }));
|
|
110
63
|
};
|
|
111
|
-
|
|
64
|
+
// Built ahead of exportDoc (rather than inline) so docDiagnostics is fully populated before
|
|
65
|
+
// allDiagnostics is computed once, below — no repeating the [...diagnostics, ...docDiagnostics]
|
|
66
|
+
// concatenation for both the JSON diagnostics field and the returned ExportResult.
|
|
67
|
+
const slices = model.slices.map((slice, sliceIndex) => {
|
|
68
|
+
const sliceKey = sliceKeys[sliceIndex];
|
|
69
|
+
const { doc, diagnostics: sliceDocDiags } = resolveSliceDocJoin(slice, sliceKey, baseDir, (id) => refById.get(id));
|
|
70
|
+
docDiagnostics.push(...sliceDocDiags);
|
|
71
|
+
return {
|
|
72
|
+
key: sliceKey,
|
|
73
|
+
name: slice.name,
|
|
74
|
+
index: slice.index,
|
|
75
|
+
// Link to the ticket/conversation this slice traces back to (MIL-69).
|
|
76
|
+
// Distinct from the document's top-level `source` (the .em file's own
|
|
77
|
+
// path/sha256 provenance) — same key name, different scope.
|
|
78
|
+
source: slice.source ?? null,
|
|
79
|
+
line: slice.line,
|
|
80
|
+
// Model-derived (MIL-91) — same classifySlicePattern() `em catalog` already uses.
|
|
81
|
+
// The frontmatter's own authored `pattern:` stays unread (informational only, per
|
|
82
|
+
// docs/slice-doc-schema.md) — this is not that value.
|
|
83
|
+
pattern: classifySlicePattern(slice),
|
|
84
|
+
// The slice-doc frontmatter join (MIL-91) — see catalog/docJoin.ts for the
|
|
85
|
+
// found/reason state machine. Never the markdown body: doc.html/doc.raw never
|
|
86
|
+
// appear here (the hard boundary the ticket requires).
|
|
87
|
+
doc,
|
|
88
|
+
elements: slice.elements.map((el) => ({
|
|
89
|
+
ref: refById.get(el.id),
|
|
90
|
+
kind: el.kind,
|
|
91
|
+
name: el.name,
|
|
92
|
+
line: el.line,
|
|
93
|
+
fields: el.fields
|
|
94
|
+
? el.fields.map((f) => fieldExport(f, model.typesByName, refByTypeId))
|
|
95
|
+
: null,
|
|
96
|
+
note: el.note ?? null,
|
|
97
|
+
issue: el.issue ?? null,
|
|
98
|
+
divergence: el.divergence ?? null,
|
|
99
|
+
from: fromOf(el),
|
|
100
|
+
persona: el.persona ?? null,
|
|
101
|
+
context: el.context ?? null,
|
|
102
|
+
again: el.again === true,
|
|
103
|
+
public: el.public === true,
|
|
104
|
+
logicalRef: el.kind === "view" && el.again === true ? refOf(el.logicalId) : null,
|
|
105
|
+
})),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
const allDiagnostics = [...diagnostics, ...docDiagnostics];
|
|
109
|
+
const exportDoc = {
|
|
112
110
|
schemaVersion: SCHEMA_VERSION,
|
|
113
111
|
generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
|
|
114
112
|
source: { path, sha256: createHash("sha256").update(source, "utf8").digest("hex") },
|
|
@@ -125,34 +123,7 @@ export function buildExport(model, diagnostics, source, path) {
|
|
|
125
123
|
line: t.line,
|
|
126
124
|
fields: t.fields.map((f) => fieldExport(f, model.typesByName, refByTypeId)),
|
|
127
125
|
})),
|
|
128
|
-
slices
|
|
129
|
-
key: sliceKeys[sliceIndex],
|
|
130
|
-
name: slice.name,
|
|
131
|
-
index: slice.index,
|
|
132
|
-
// Link to the ticket/conversation this slice traces back to (MIL-69).
|
|
133
|
-
// Distinct from the document's top-level `source` (the .em file's own
|
|
134
|
-
// path/sha256 provenance) — same key name, different scope.
|
|
135
|
-
source: slice.source ?? null,
|
|
136
|
-
line: slice.line,
|
|
137
|
-
elements: slice.elements.map((el) => ({
|
|
138
|
-
ref: refById.get(el.id),
|
|
139
|
-
kind: el.kind,
|
|
140
|
-
name: el.name,
|
|
141
|
-
line: el.line,
|
|
142
|
-
fields: el.fields
|
|
143
|
-
? el.fields.map((f) => fieldExport(f, model.typesByName, refByTypeId))
|
|
144
|
-
: null,
|
|
145
|
-
note: el.note ?? null,
|
|
146
|
-
issue: el.issue ?? null,
|
|
147
|
-
divergence: el.divergence ?? null,
|
|
148
|
-
from: fromOf(el),
|
|
149
|
-
persona: el.persona ?? null,
|
|
150
|
-
context: el.context ?? null,
|
|
151
|
-
again: el.again === true,
|
|
152
|
-
public: el.public === true,
|
|
153
|
-
logicalRef: el.kind === "view" && el.again === true ? refOf(el.logicalId) : null,
|
|
154
|
-
})),
|
|
155
|
-
})),
|
|
126
|
+
slices,
|
|
156
127
|
arrows: model.arrows.map((a) => ({
|
|
157
128
|
from: a.from,
|
|
158
129
|
to: a.to,
|
|
@@ -161,12 +132,8 @@ export function buildExport(model, diagnostics, source, path) {
|
|
|
161
132
|
line: a.line,
|
|
162
133
|
})),
|
|
163
134
|
},
|
|
164
|
-
diagnostics:
|
|
165
|
-
severity: d.severity,
|
|
166
|
-
message: d.message,
|
|
167
|
-
line: d.line ?? null,
|
|
168
|
-
})),
|
|
135
|
+
diagnostics: allDiagnostics.map(serializeDiagnostic),
|
|
169
136
|
};
|
|
170
|
-
return { text: JSON.stringify(
|
|
137
|
+
return { text: JSON.stringify(exportDoc, null, 2), diagnostics: allDiagnostics };
|
|
171
138
|
}
|
|
172
139
|
//# sourceMappingURL=json.js.map
|
package/dist/emit/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,gFAAgF;AAChF,yEAAyE;AACzE,4EAA4E;AAC5E,iDAAiD;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,gFAAgF;AAChF,yEAAyE;AACzE,4EAA4E;AAC5E,iDAAiD;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAsC,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtG,OAAO,EAAc,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAW,IAAI,CAAC,KAAK,CACjD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAChG,CAAC,OAAO,CAAC;AAEV,uFAAuF;AACvF,0FAA0F;AAC1F,8FAA8F;AAC9F,8CAA8C;AAC9C,qFAAqF;AACrF,6FAA6F;AAC7F,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AAgBpC;;;;;;;GAOG;AACH,SAAS,WAAW,CAClB,CAAQ,EACR,WAAkC,EAClC,WAAgC;IAEhC,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,OAAO,EAAE,QAAQ;YACf,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;YACtG,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED;;;;+FAI+F;AAC/F,MAAM,UAAU,WAAW,CACzB,KAAsB,EACtB,IAAgB,EAChB,WAAyB,EACzB,MAAc,EACd,IAAY;IAEZ,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,cAAc,GAAiB,EAAE,CAAC;IAExC,MAAM,KAAK,GAAG,CAAC,EAAsB,EAAiB,EAAE,CACtD,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtC,MAAM,MAAM,GAAG,CAAC,EAAW,EAAiD,EAAE;QAC5E,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC;IAEF,4FAA4F;IAC5F,gGAAgG;IAChG,mFAAmF;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,mBAAmB,CAC7D,KAAK,EACL,QAAQ,EACR,OAAO,EACP,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CACzB,CAAC;QACF,cAAc,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;QACtC,OAAO;YACL,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,sEAAsE;YACtE,sEAAsE;YACtE,4DAA4D;YAC5D,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,kFAAkF;YAClF,kFAAkF;YAClF,sDAAsD;YACtD,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC;YACpC,2EAA2E;YAC3E,8EAA8E;YAC9E,uDAAuD;YACvD,GAAG;YACH,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE;gBACxB,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,MAAM,EAAE,EAAE,CAAC,MAAM;oBACf,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACtE,CAAC,CAAC,IAAI;gBACR,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI;gBACrB,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI;gBACvB,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI;gBACjC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI;gBAC3B,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI;gBAC3B,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI;gBACxB,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI;gBAC1B,UAAU,EACR,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;aACvE,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,cAAc,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG;QAChB,aAAa,EAAE,cAAc;QAC7B,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACnF,KAAK,EAAE;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,+EAA+E;YAC/E,iDAAiD;YACjD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE;gBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;aAC5E,CAAC,CAAC;YACH,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;SACJ;QACD,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,mBAAmB,CAAC;KACrD,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LedgerCheckResult } from "../cli/ledgerCheck.js";
|
|
2
|
+
export declare const LEDGER_SCHEMA_VERSION = "1.0";
|
|
3
|
+
/** Build the `em ledger --json` document. Pretty-printed (2-space), no trailing newline — the
|
|
4
|
+
* caller adds it, same convention as buildDiffJson/buildGlossaryJson. */
|
|
5
|
+
export declare function buildLedgerJson(result: LedgerCheckResult, from: string, to: string | null): string;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Builds the `em ledger --json` document: a versioned envelope around `LedgerCheckResult`
|
|
3
|
+
// (see ../cli/ledgerCheck.ts). Follows `em diff`/`em glossary`'s conventions (emit/diffJson.ts,
|
|
4
|
+
// emit/glossaryJson.ts): a schema field versioned independently of both the npm package and
|
|
5
|
+
// every other command's own schema, explicit `null` for "no --to" (working tree) so a consumer
|
|
6
|
+
// can destructure without sniffing.
|
|
7
|
+
import { GENERATOR_NAME, GENERATOR_VERSION } from "./json.js";
|
|
8
|
+
// 1.0: initial shape (MIL-89).
|
|
9
|
+
export const LEDGER_SCHEMA_VERSION = "1.0";
|
|
10
|
+
/** Build the `em ledger --json` document. Pretty-printed (2-space), no trailing newline — the
|
|
11
|
+
* caller adds it, same convention as buildDiffJson/buildGlossaryJson. */
|
|
12
|
+
export function buildLedgerJson(result, from, to) {
|
|
13
|
+
const doc = {
|
|
14
|
+
ledgerSchemaVersion: LEDGER_SCHEMA_VERSION,
|
|
15
|
+
generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
|
|
16
|
+
from,
|
|
17
|
+
to,
|
|
18
|
+
checkedCount: result.checkedCount,
|
|
19
|
+
findings: result.findings,
|
|
20
|
+
skipped: result.skipped,
|
|
21
|
+
ok: result.findings.length === 0,
|
|
22
|
+
};
|
|
23
|
+
return JSON.stringify(doc, null, 2);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ledgerJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledgerJson.js","sourceRoot":"","sources":["../../src/emit/ledgerJson.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0FAA0F;AAC1F,gGAAgG;AAChG,4FAA4F;AAC5F,+FAA+F;AAC/F,oCAAoC;AAGpC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9D,+BAA+B;AAC/B,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAE3C;0EAC0E;AAC1E,MAAM,UAAU,eAAe,CAAC,MAAyB,EAAE,IAAY,EAAE,EAAiB;IACxF,MAAM,GAAG,GAAG;QACV,mBAAmB,EAAE,qBAAqB;QAC1C,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,IAAI;QACJ,EAAE;QACF,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;KACjC,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SkillCheckResult } from "../cli/skillCheck.js";
|
|
2
|
+
export declare const SKILL_CHECK_SCHEMA_VERSION = "1.0";
|
|
3
|
+
/** Build the `em skill check --json` document. Pretty-printed (2-space), no trailing newline —
|
|
4
|
+
* the caller adds it, same convention as buildLedgerJson/buildDiffJson/buildGlossaryJson. */
|
|
5
|
+
export declare function buildSkillCheckJson(result: SkillCheckResult, vendoredDir: string, installedVersion: string): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Builds the `em skill check --json` document: a versioned envelope around SkillCheckResult
|
|
3
|
+
// (see ../cli/skillCheck.ts). Follows em ledger/em diff/em glossary's conventions
|
|
4
|
+
// (ledgerJson.ts, diffJson.ts, glossaryJson.ts): a schema field versioned independently of
|
|
5
|
+
// both the npm package and every other command's own schema.
|
|
6
|
+
import { GENERATOR_NAME, GENERATOR_VERSION } from "./json.js";
|
|
7
|
+
// 1.0: initial shape (MIL-93).
|
|
8
|
+
export const SKILL_CHECK_SCHEMA_VERSION = "1.0";
|
|
9
|
+
/** `SkillCheckFinding` with every optional field present, explicit `null` when unused by `code`. */
|
|
10
|
+
function serializeFinding(f) {
|
|
11
|
+
return {
|
|
12
|
+
code: f.code,
|
|
13
|
+
message: f.message,
|
|
14
|
+
vendoredStamp: f.vendoredStamp ?? null,
|
|
15
|
+
installedVersion: f.installedVersion ?? null,
|
|
16
|
+
driftedFiles: f.driftedFiles ?? null,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Build the `em skill check --json` document. Pretty-printed (2-space), no trailing newline —
|
|
20
|
+
* the caller adds it, same convention as buildLedgerJson/buildDiffJson/buildGlossaryJson. */
|
|
21
|
+
export function buildSkillCheckJson(result, vendoredDir, installedVersion) {
|
|
22
|
+
const doc = {
|
|
23
|
+
skillCheckSchemaVersion: SKILL_CHECK_SCHEMA_VERSION,
|
|
24
|
+
generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
|
|
25
|
+
vendoredDir,
|
|
26
|
+
installedVersion,
|
|
27
|
+
findings: result.findings.map(serializeFinding),
|
|
28
|
+
ok: result.ok,
|
|
29
|
+
};
|
|
30
|
+
return JSON.stringify(doc, null, 2);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=skillCheckJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillCheckJson.js","sourceRoot":"","sources":["../../src/emit/skillCheckJson.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,4FAA4F;AAC5F,kFAAkF;AAClF,2FAA2F;AAC3F,6DAA6D;AAG7D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9D,+BAA+B;AAC/B,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAYhD,oGAAoG;AACpG,SAAS,gBAAgB,CAAC,CAAoB;IAC5C,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI;QACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;QAC5C,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;KACrC,CAAC;AACJ,CAAC;AAED;8FAC8F;AAC9F,MAAM,UAAU,mBAAmB,CAAC,MAAwB,EAAE,WAAmB,EAAE,gBAAwB;IACzG,MAAM,GAAG,GAAG;QACV,uBAAuB,EAAE,0BAA0B;QACnD,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,WAAW;QACX,gBAAgB;QAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC/C,EAAE,EAAE,MAAM,CAAC,EAAE;KACd,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/model/diff.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { RefsResult } from "./refs.js";
|
|
1
2
|
import { NormalizedModel } from "./model.js";
|
|
2
3
|
import { ElementKind } from "../parser/ast.js";
|
|
4
|
+
import { SliceDoc, SliceRef } from "../catalog/sliceDoc.js";
|
|
3
5
|
export type ChangeType = "slice-added" | "slice-removed" | "source-added" | "source-removed" | "source-changed" | "element-added" | "element-removed" | "element-moved" | "field-added" | "field-removed" | "field-changed" | "from-added" | "from-removed" | "note-added" | "note-removed" | "note-changed" | "issue-opened" | "issue-resolved" | "issue-changed" | "event-marked-public" | "event-unmarked-public" | "arrow-added" | "arrow-removed" | "type-added" | "type-removed" | "type-field-added" | "type-field-removed" | "type-field-changed";
|
|
4
6
|
/**
|
|
5
7
|
* One reported change. Not every field applies to every `type` — see
|
|
@@ -46,6 +48,22 @@ export interface ChangeEntry {
|
|
|
46
48
|
* `element-added`, `element-moved` — out of scope for v1, see model.ts's `divergence` doc).
|
|
47
49
|
*/
|
|
48
50
|
acceptedDivergence?: string | null;
|
|
51
|
+
/**
|
|
52
|
+
* MIL-84: the added slice's own doc frontmatter lineage — attached to `slice-added` entries
|
|
53
|
+
* only, and only when the new-side doc resolves (readable + parseable; see `LineageResolvers`
|
|
54
|
+
* below). Same shape/defaults as `em export`'s `slice.doc.splitFrom` (catalog/docJoin.ts's
|
|
55
|
+
* `SliceDocExport`). `undefined` when the doc doesn't resolve or lineage wasn't requested
|
|
56
|
+
* (`diffModels()` called without a `lineage` argument) — never cross-checked here (does
|
|
57
|
+
* `checkout@v3` really exist/match? that's `em validate`'s job, catalog/lineageValidate.ts).
|
|
58
|
+
*/
|
|
59
|
+
splitFrom?: SliceRef | null;
|
|
60
|
+
/** MIL-84: same as `splitFrom`, for `merged-from`. Attached to `slice-added` entries. */
|
|
61
|
+
mergedFrom?: SliceRef[];
|
|
62
|
+
/**
|
|
63
|
+
* MIL-84: the removed slice's own (old-side) doc frontmatter `superseded-by` — attached to
|
|
64
|
+
* `slice-removed` entries only, when the old-side doc resolves. Never cross-checked here.
|
|
65
|
+
*/
|
|
66
|
+
supersededBy?: SliceRef[];
|
|
49
67
|
}
|
|
50
68
|
export interface DiffCounts {
|
|
51
69
|
slicesAdded: number;
|
|
@@ -73,6 +91,12 @@ export interface DiffCounts {
|
|
|
73
91
|
typesAdded: number;
|
|
74
92
|
typesRemoved: number;
|
|
75
93
|
typeFieldChanges: number;
|
|
94
|
+
/** `slice-added` entries whose new-side doc resolved with a non-null `splitFrom` (MIL-84). */
|
|
95
|
+
slicesSplit: number;
|
|
96
|
+
/** `slice-added` entries whose new-side doc resolved with a non-empty `mergedFrom` (MIL-84). */
|
|
97
|
+
slicesMerged: number;
|
|
98
|
+
/** `slice-removed` entries whose old-side doc resolved with a non-empty `supersededBy` (MIL-84). */
|
|
99
|
+
slicesSuperseded: number;
|
|
76
100
|
}
|
|
77
101
|
export interface ModelDiff {
|
|
78
102
|
/** Additions and changes, in new-file document order. */
|
|
@@ -81,7 +105,26 @@ export interface ModelDiff {
|
|
|
81
105
|
removals: ChangeEntry[];
|
|
82
106
|
counts: DiffCounts;
|
|
83
107
|
}
|
|
84
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Optional per-side slice-doc lookups for lineage annotation (MIL-84) — resolve a slice's own
|
|
110
|
+
* doc, by its `em export` key, on that side of the diff. `newDoc` reads the *new*-side doc of a
|
|
111
|
+
* `slice-added` entry (for `split-from`/`merged-from`, which are claims a slice makes about
|
|
112
|
+
* itself); `oldDoc` reads the *old*-side doc of a `slice-removed` entry (for `superseded-by`).
|
|
113
|
+
* Each resolver returns `null` when the doc doesn't exist or can't be read — `diffModels()`
|
|
114
|
+
* never fails on that, it just omits the annotation, same report-not-gate philosophy as `em
|
|
115
|
+
* export`'s doc join (catalog/docJoin.ts). Omit `lineage` entirely (the default) to get today's
|
|
116
|
+
* plain add/remove behavior with no fs access at all — `em changelog`'s `diffModels()` calls
|
|
117
|
+
* deliberately don't pass one.
|
|
118
|
+
*/
|
|
119
|
+
export interface LineageResolvers {
|
|
120
|
+
newDoc?: (sliceKey: string) => SliceDoc | null;
|
|
121
|
+
oldDoc?: (sliceKey: string) => SliceDoc | null;
|
|
122
|
+
}
|
|
123
|
+
/** `oldRefs`/`newRefs` are each side's already-computed `RefsResult` (MIL-91) — sourced from
|
|
124
|
+
* the same `compile()` call that produced `oldModel`/`newModel`, never recomputed here, so
|
|
125
|
+
* their ref-collision diagnostics (already in each compile's own `diagnostics`) aren't
|
|
126
|
+
* silently dropped or double-computed. */
|
|
127
|
+
export declare function diffModels(oldModel: NormalizedModel, newModel: NormalizedModel, oldRefs: RefsResult, newRefs: RefsResult, lineage?: LineageResolvers): ModelDiff;
|
|
85
128
|
export declare function hasChanges(diff: ModelDiff): boolean;
|
|
86
129
|
/** Full `em diff` report: rollup line + blank + one line per change, or just "no structural changes". */
|
|
87
130
|
export declare function formatModelDiff(diff: ModelDiff): string;
|