@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.
Files changed (105) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +94 -49
  2. package/.claude/skills/event-modeling/reference/conform.md +30 -8
  3. package/.claude/skills/event-modeling/reference/em-dsl.md +194 -73
  4. package/.claude/skills/event-modeling/reference/extract.md +14 -11
  5. package/.claude/skills/event-modeling/reference/implement.md +172 -0
  6. package/.claude/skills/event-modeling/reference/methodology.md +40 -33
  7. package/.claude/skills/event-modeling/templates/conformance-report.md +15 -9
  8. package/.claude/skills/event-modeling/templates/model-readme.md +7 -7
  9. package/.claude/skills/event-modeling/templates/slice.md +73 -7
  10. package/.claude/skills/event-modeling/templates/state.md +7 -6
  11. package/README.md +1 -0
  12. package/dist/catalog/build.d.ts +5 -0
  13. package/dist/catalog/build.js +1 -3
  14. package/dist/catalog/build.js.map +1 -1
  15. package/dist/catalog/classify.d.ts +7 -8
  16. package/dist/catalog/classify.js +7 -8
  17. package/dist/catalog/classify.js.map +1 -1
  18. package/dist/catalog/docJoin.d.ts +39 -0
  19. package/dist/catalog/docJoin.js +86 -0
  20. package/dist/catalog/docJoin.js.map +1 -0
  21. package/dist/catalog/driftSignal.d.ts +16 -0
  22. package/dist/catalog/driftSignal.js +24 -0
  23. package/dist/catalog/driftSignal.js.map +1 -0
  24. package/dist/catalog/frontmatterCoherenceValidate.d.ts +8 -0
  25. package/dist/catalog/frontmatterCoherenceValidate.js +52 -0
  26. package/dist/catalog/frontmatterCoherenceValidate.js.map +1 -0
  27. package/dist/catalog/lineageValidate.d.ts +9 -0
  28. package/dist/catalog/lineageValidate.js +161 -0
  29. package/dist/catalog/lineageValidate.js.map +1 -0
  30. package/dist/catalog/readSliceDoc.d.ts +2 -0
  31. package/dist/catalog/readSliceDoc.js +21 -0
  32. package/dist/catalog/readSliceDoc.js.map +1 -0
  33. package/dist/catalog/sliceDoc.d.ts +94 -3
  34. package/dist/catalog/sliceDoc.js +157 -7
  35. package/dist/catalog/sliceDoc.js.map +1 -1
  36. package/dist/catalog/sliceReadyValidate.d.ts +11 -0
  37. package/dist/catalog/sliceReadyValidate.js +85 -0
  38. package/dist/catalog/sliceReadyValidate.js.map +1 -0
  39. package/dist/cli/diff-inputs.d.ts +20 -0
  40. package/dist/cli/diff-inputs.js +75 -18
  41. package/dist/cli/diff-inputs.js.map +1 -1
  42. package/dist/cli/ledgerCheck.d.ts +38 -0
  43. package/dist/cli/ledgerCheck.js +116 -0
  44. package/dist/cli/ledgerCheck.js.map +1 -0
  45. package/dist/cli/skillCheck.d.ts +18 -0
  46. package/dist/cli/skillCheck.js +63 -0
  47. package/dist/cli/skillCheck.js.map +1 -0
  48. package/dist/cli/skillSync.d.ts +22 -0
  49. package/dist/cli/skillSync.js +69 -0
  50. package/dist/cli/skillSync.js.map +1 -0
  51. package/dist/cli/skillVersionCheck.d.ts +32 -0
  52. package/dist/cli/skillVersionCheck.js +145 -0
  53. package/dist/cli/skillVersionCheck.js.map +1 -0
  54. package/dist/cli.d.ts +3 -1
  55. package/dist/cli.js +203 -32
  56. package/dist/cli.js.map +1 -1
  57. package/dist/emit/diffJson.d.ts +1 -1
  58. package/dist/emit/diffJson.js +18 -14
  59. package/dist/emit/diffJson.js.map +1 -1
  60. package/dist/emit/dot.js +46 -5
  61. package/dist/emit/dot.js.map +1 -1
  62. package/dist/emit/json.d.ts +10 -25
  63. package/dist/emit/json.js +70 -103
  64. package/dist/emit/json.js.map +1 -1
  65. package/dist/emit/ledgerJson.d.ts +5 -0
  66. package/dist/emit/ledgerJson.js +25 -0
  67. package/dist/emit/ledgerJson.js.map +1 -0
  68. package/dist/emit/skillCheckJson.d.ts +5 -0
  69. package/dist/emit/skillCheckJson.js +32 -0
  70. package/dist/emit/skillCheckJson.js.map +1 -0
  71. package/dist/model/diff.d.ts +44 -1
  72. package/dist/model/diff.js +51 -9
  73. package/dist/model/diff.js.map +1 -1
  74. package/dist/model/edges.js +17 -17
  75. package/dist/model/edges.js.map +1 -1
  76. package/dist/model/model.d.ts +1 -1
  77. package/dist/model/refs.d.ts +23 -0
  78. package/dist/model/refs.js +75 -0
  79. package/dist/model/refs.js.map +1 -0
  80. package/dist/model/rules.d.ts +253 -0
  81. package/dist/model/rules.js +254 -0
  82. package/dist/model/rules.js.map +1 -0
  83. package/dist/model/validate.d.ts +23 -1
  84. package/dist/model/validate.js +207 -69
  85. package/dist/model/validate.js.map +1 -1
  86. package/dist/parser/ast.d.ts +3 -2
  87. package/dist/parser/lexer.d.ts +17 -2
  88. package/dist/parser/lexer.js +119 -13
  89. package/dist/parser/lexer.js.map +1 -1
  90. package/dist/parser/parser.js +75 -34
  91. package/dist/parser/parser.js.map +1 -1
  92. package/dist/pipeline.d.ts +9 -0
  93. package/dist/pipeline.js +4 -2
  94. package/dist/pipeline.js.map +1 -1
  95. package/dist/render/sliceDiagram.js +33 -35
  96. package/dist/render/sliceDiagram.js.map +1 -1
  97. package/dist/render/sliceStatus.js +1 -1
  98. package/dist/render/sliceStatus.js.map +1 -1
  99. package/dist/util/isMainModule.d.ts +14 -0
  100. package/dist/util/isMainModule.js +33 -0
  101. package/dist/util/isMainModule.js.map +1 -0
  102. package/dist/util/walkDir.d.ts +4 -0
  103. package/dist/util/walkDir.js +28 -0
  104. package/dist/util/walkDir.js.map +1 -0
  105. 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=${CELL_H}];`);
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 (cur && (cur + " " + w).length > max) {
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 = w;
161
+ cur = "";
143
162
  }
144
- else {
145
- cur = cur ? cur + " " + w : w;
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, '\\"')}"`;
@@ -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":"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"}
@@ -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.3";
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 plus any ref-collision warnings raised while exporting. */
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
- export declare function buildExport(model: NormalizedModel, diagnostics: Diagnostic[], source: string, path: string): ExportResult;
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 { dedupe, kebabSlug } from "../util/slug.js";
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
- export const SCHEMA_VERSION = "1.3";
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 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
- export function buildExport(model, diagnostics, source, path) {
104
- const { sliceKeys, refById, refByTypeId, diagnostics: extra } = computeRefs(model);
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
- const doc = {
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: model.slices.map((slice, sliceIndex) => ({
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: [...diagnostics, ...extra].map((d) => ({
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(doc, null, 2), diagnostics: [...diagnostics, ...extra] };
137
+ return { text: JSON.stringify(exportDoc, null, 2), diagnostics: allDiagnostics };
171
138
  }
172
139
  //# sourceMappingURL=json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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
- export declare function diffModels(oldModel: NormalizedModel, newModel: NormalizedModel): ModelDiff;
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;