@milehimikey/em 1.7.2 → 1.8.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 (119) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +92 -65
  2. package/.claude/skills/event-modeling/reference/conform.md +45 -20
  3. package/.claude/skills/event-modeling/reference/em-dsl.md +132 -55
  4. package/.claude/skills/event-modeling/reference/extract.md +5 -4
  5. package/.claude/skills/event-modeling/reference/implement.md +34 -22
  6. package/.claude/skills/event-modeling/templates/model-readme.md +8 -5
  7. package/.claude/skills/event-modeling/templates/slice.md +19 -5
  8. package/README.md +6 -4
  9. package/dist/catalog/docJoin.d.ts +28 -3
  10. package/dist/catalog/docJoin.js +82 -13
  11. package/dist/catalog/docJoin.js.map +1 -1
  12. package/dist/catalog/docModelConsistencyValidate.d.ts +8 -0
  13. package/dist/catalog/docModelConsistencyValidate.js +335 -0
  14. package/dist/catalog/docModelConsistencyValidate.js.map +1 -0
  15. package/dist/catalog/noteBindingValidate.d.ts +8 -0
  16. package/dist/catalog/noteBindingValidate.js +133 -0
  17. package/dist/catalog/noteBindingValidate.js.map +1 -0
  18. package/dist/catalog/pages.js +3 -3
  19. package/dist/catalog/pages.js.map +1 -1
  20. package/dist/catalog/sliceDoc.d.ts +14 -0
  21. package/dist/catalog/sliceDoc.js +22 -0
  22. package/dist/catalog/sliceDoc.js.map +1 -1
  23. package/dist/catalog/sliceReadyValidate.d.ts +18 -0
  24. package/dist/catalog/sliceReadyValidate.js +25 -1
  25. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  26. package/dist/cli/agentsMd.d.ts +15 -0
  27. package/dist/cli/agentsMd.js +72 -0
  28. package/dist/cli/agentsMd.js.map +1 -0
  29. package/dist/cli/conformScope.d.ts +86 -0
  30. package/dist/cli/conformScope.js +156 -0
  31. package/dist/cli/conformScope.js.map +1 -0
  32. package/dist/cli/contract.d.ts +7 -0
  33. package/dist/cli/contract.js +27 -0
  34. package/dist/cli/contract.js.map +1 -0
  35. package/dist/cli/coverage.d.ts +71 -0
  36. package/dist/cli/coverage.js +177 -0
  37. package/dist/cli/coverage.js.map +1 -0
  38. package/dist/cli/markImplemented.d.ts +34 -0
  39. package/dist/cli/markImplemented.js +180 -0
  40. package/dist/cli/markImplemented.js.map +1 -0
  41. package/dist/cli/migrateReactionShape.d.ts +62 -0
  42. package/dist/cli/migrateReactionShape.js +283 -0
  43. package/dist/cli/migrateReactionShape.js.map +1 -0
  44. package/dist/cli/sliceIndex.d.ts +49 -0
  45. package/dist/cli/sliceIndex.js +115 -0
  46. package/dist/cli/sliceIndex.js.map +1 -0
  47. package/dist/cli/sliceNew.d.ts +18 -0
  48. package/dist/cli/sliceNew.js +53 -0
  49. package/dist/cli/sliceNew.js.map +1 -0
  50. package/dist/cli/stateFile.d.ts +74 -0
  51. package/dist/cli/stateFile.js +191 -0
  52. package/dist/cli/stateFile.js.map +1 -0
  53. package/dist/cli.js +535 -43
  54. package/dist/cli.js.map +1 -1
  55. package/dist/emit/coverageJson.d.ts +8 -0
  56. package/dist/emit/coverageJson.js +30 -0
  57. package/dist/emit/coverageJson.js.map +1 -0
  58. package/dist/emit/diffJson.d.ts +9 -1
  59. package/dist/emit/diffJson.js +44 -1
  60. package/dist/emit/diffJson.js.map +1 -1
  61. package/dist/emit/dot.js +41 -10
  62. package/dist/emit/dot.js.map +1 -1
  63. package/dist/emit/json.d.ts +77 -4
  64. package/dist/emit/json.js +78 -4
  65. package/dist/emit/json.js.map +1 -1
  66. package/dist/emit/validateJson.d.ts +52 -0
  67. package/dist/emit/validateJson.js +120 -0
  68. package/dist/emit/validateJson.js.map +1 -0
  69. package/dist/mcp/main.d.ts +2 -0
  70. package/dist/mcp/main.js +20 -0
  71. package/dist/mcp/main.js.map +1 -0
  72. package/dist/mcp/server.d.ts +11 -0
  73. package/dist/mcp/server.js +260 -0
  74. package/dist/mcp/server.js.map +1 -0
  75. package/dist/model/model.d.ts +30 -1
  76. package/dist/model/model.js +26 -0
  77. package/dist/model/model.js.map +1 -1
  78. package/dist/model/rules.d.ts +114 -0
  79. package/dist/model/rules.js +116 -4
  80. package/dist/model/rules.js.map +1 -1
  81. package/dist/model/validate.js +92 -8
  82. package/dist/model/validate.js.map +1 -1
  83. package/dist/parser/ast.d.ts +47 -0
  84. package/dist/parser/lexer.d.ts +16 -0
  85. package/dist/parser/lexer.js +44 -2
  86. package/dist/parser/lexer.js.map +1 -1
  87. package/dist/parser/parser.js +354 -20
  88. package/dist/parser/parser.js.map +1 -1
  89. package/dist/render/drawNotes.d.ts +11 -1
  90. package/dist/render/drawNotes.js +28 -3
  91. package/dist/render/drawNotes.js.map +1 -1
  92. package/dist/render/render.js +116 -23
  93. package/dist/render/render.js.map +1 -1
  94. package/dist/render/serve.d.ts +4 -0
  95. package/dist/render/serve.js +27 -239
  96. package/dist/render/serve.js.map +1 -1
  97. package/dist/render/sliceOverlay.d.ts +7 -2
  98. package/dist/render/sliceOverlay.js +19 -7
  99. package/dist/render/sliceOverlay.js.map +1 -1
  100. package/dist/render/sliceStatus.d.ts +7 -3
  101. package/dist/render/sliceStatus.js +48 -12
  102. package/dist/render/sliceStatus.js.map +1 -1
  103. package/dist/render/viewerHtml.d.ts +1 -0
  104. package/dist/render/viewerHtml.js +5 -0
  105. package/dist/render/viewerHtml.js.map +1 -0
  106. package/dist/render/watch.d.ts +10 -0
  107. package/dist/render/watch.js +29 -0
  108. package/dist/render/watch.js.map +1 -1
  109. package/dist/templates.d.ts +20 -1
  110. package/dist/templates.js +172 -3
  111. package/dist/templates.js.map +1 -1
  112. package/dist/util/markers.d.ts +13 -0
  113. package/dist/util/markers.js +30 -0
  114. package/dist/util/markers.js.map +1 -0
  115. package/dist/util/walkDir.d.ts +10 -1
  116. package/dist/util/walkDir.js +11 -7
  117. package/dist/util/walkDir.js.map +1 -1
  118. package/package.json +12 -3
  119. package/.claude/skills/event-modeling/templates/live.html +0 -117
@@ -14,10 +14,50 @@
14
14
  // note binding is a normal, unremarkable state (a slice that hasn't reached specify yet); a
15
15
  // binding pointing at a missing file, or a doc whose frontmatter is missing or malformed, are
16
16
  // both broken-contract states and warn.
17
+ //
18
+ // Cross-slice binding (MIL-121): the canonical two-slice Automation/Translation shape (MIL-120)
19
+ // splits one design conversation across a view-only slice and its reaction+command+event slice,
20
+ // but a team may still want ONE doc to cover both. A `note "slices/<other-key>.md"` pointing at
21
+ // a DIFFERENT slice's canonical path is an explicit request to borrow that doc — honored only
22
+ // when the other end also ratifies it, via that doc's own frontmatter `covers:` list naming this
23
+ // slice's key. This is a two-ended handshake by design: an unratified cross-note (the target
24
+ // doc doesn't list this slice in `covers`, is missing, or has unusable frontmatter) leaves the
25
+ // slice silently unbound (`no-doc-bound`) rather than warning here — a one-sided note is exactly
26
+ // the same "hasn't reached specify yet" state as no note at all *from this module's point of
27
+ // view*. Canonical binding (a note naming this slice's own path) always takes precedence and is
28
+ // checked first, unchanged from before this ticket.
29
+ //
30
+ // MIL-126 gives the silent cases above (and a canonically-bound slice's OTHER, now-pointless
31
+ // notes) their own diagnostic instead of staying silent forever: see
32
+ // catalog/noteBindingValidate.ts, a sibling module, not folded in here — same reasoning as
33
+ // lineageValidate.ts/frontmatterCoherenceValidate.ts staying separate from this one, and it
34
+ // needs a second, cross-cutting pass over EVERY doc-shaped note on a slice (not just the winning
35
+ // one) to tell "extra" from "dangling" from "unratified". It reuses `NOTE_SLICE_PATH` and
36
+ // `resolveCrossCandidate` below rather than re-deriving the ratification predicate.
17
37
  import { makeDiag } from "../model/rules.js";
18
38
  import { classifyImplementationDrift } from "./driftSignal.js";
19
39
  import { readSliceDoc } from "./readSliceDoc.js";
20
40
  import { hasUsableFrontmatter } from "./sliceDoc.js";
41
+ // Matches a `note "slices/<key>.md"` value's path shape, to pull `<key>` back out for the
42
+ // MIL-121 cross-binding search below (and MIL-126's mismatch sweep, catalog/noteBindingValidate.ts)
43
+ // — same kebab-slug grammar sliceDoc.ts's SLICE_REF uses.
44
+ export const NOTE_SLICE_PATH = /^slices\/([a-z0-9]+(?:-[a-z0-9]+)*)\.md$/i;
45
+ /**
46
+ * Resolves a single `slices/<candidateKey>.md` cross-binding candidate — the exact ratification
47
+ * predicate `resolveSliceDocJoin`'s cross-binding search (MIL-121) applies, extracted so
48
+ * `noteBindingValidate.ts` (MIL-126) can classify a *non*-winning candidate's reason without
49
+ * re-deriving what "ratifies" means. One source of truth for both.
50
+ */
51
+ export function resolveCrossCandidate(baseDir, candidateKey, sliceKey) {
52
+ const doc = readSliceDoc(baseDir, candidateKey);
53
+ if (!doc)
54
+ return { status: "missing" };
55
+ if (!hasUsableFrontmatter(doc))
56
+ return { status: "unusable" };
57
+ if (!doc.covers.includes(sliceKey))
58
+ return { status: "unratified" };
59
+ return { status: "ratified", doc };
60
+ }
21
61
  const EMPTY_CONTENT = {
22
62
  status: null,
23
63
  version: null,
@@ -38,6 +78,33 @@ export function resolveSliceDocJoin(slice, sliceKey, baseDir, elementRefOf) {
38
78
  const path = `slices/${sliceKey}.md`;
39
79
  const boundEls = slice.elements.filter((el) => el.note === path);
40
80
  if (boundEls.length === 0) {
81
+ // No canonical binding — MIL-121: look for a ratified cross-binding before giving up. Walk
82
+ // elements in declaration order (deterministic "first wins") for a `note "slices/<other>.md"`
83
+ // naming a DIFFERENT slice, and accept the first one `resolveCrossCandidate` reports as
84
+ // ratified. Anything short of that (missing file, unusable frontmatter, or no ratifying
85
+ // `covers` entry) is silently not a binding at all here (same as no note ever having been
86
+ // written) — MIL-126's noteBindingValidate.ts is where that non-winning candidate's specific
87
+ // reason becomes its own diagnostic, using this same predicate.
88
+ for (const el of slice.elements) {
89
+ if (!el.note)
90
+ continue;
91
+ const m = el.note.match(NOTE_SLICE_PATH);
92
+ if (!m)
93
+ continue;
94
+ const otherKey = m[1].toLowerCase();
95
+ if (otherKey === sliceKey)
96
+ continue; // already handled above; can't happen if we got here
97
+ const result = resolveCrossCandidate(baseDir, otherKey, sliceKey);
98
+ if (result.status !== "ratified")
99
+ continue;
100
+ // Normalized (lowercased) path, NOT `el.note` verbatim: `otherKey` is lowercased before
101
+ // the readSliceDoc() call above (NOTE_SLICE_PATH is case-insensitive), so a mixed-case
102
+ // note like `note "slices/Request-Payment.md"` must still report the path it actually
103
+ // read — `slices/request-payment.md` — not the note's original casing. Otherwise a
104
+ // consumer that re-derives the key from `doc.path` (sliceReadyValidate.ts) would try to
105
+ // re-read the mixed-case path and get null on a case-sensitive filesystem.
106
+ return { doc: foundDoc(`slices/${otherKey}.md`, result.doc), diagnostics: [] };
107
+ }
41
108
  return { doc: { found: false, path, reason: "no-doc-bound", ...EMPTY_CONTENT }, diagnostics: [] };
42
109
  }
43
110
  const parsed = readSliceDoc(baseDir, sliceKey);
@@ -67,20 +134,22 @@ export function resolveSliceDocJoin(slice, sliceKey, baseDir, elementRefOf) {
67
134
  ],
68
135
  };
69
136
  }
137
+ return { doc: foundDoc(path, parsed), diagnostics: [] };
138
+ }
139
+ /** Builds the `found: true, reason: null` doc join result shared by a canonical binding and a
140
+ * ratified MIL-121 cross-binding — `path` is whichever path the content actually came from. */
141
+ function foundDoc(path, parsed) {
70
142
  return {
71
- doc: {
72
- found: true,
73
- path,
74
- reason: null,
75
- status: parsed.status,
76
- version: parsed.version,
77
- implementedIn: parsed.implementedIn,
78
- splitFrom: parsed.splitFrom,
79
- mergedFrom: parsed.mergedFrom,
80
- supersededBy: parsed.supersededBy,
81
- driftSignal: classifyImplementationDrift(parsed),
82
- },
83
- diagnostics: [],
143
+ found: true,
144
+ path,
145
+ reason: null,
146
+ status: parsed.status,
147
+ version: parsed.version,
148
+ implementedIn: parsed.implementedIn,
149
+ splitFrom: parsed.splitFrom,
150
+ mergedFrom: parsed.mergedFrom,
151
+ supersededBy: parsed.supersededBy,
152
+ driftSignal: classifyImplementationDrift(parsed),
84
153
  };
85
154
  }
86
155
  //# sourceMappingURL=docJoin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docJoin.js","sourceRoot":"","sources":["../../src/catalog/docJoin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docJoin.js","sourceRoot":"","sources":["../../src/catalog/docJoin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { NormalizedModel } from "../model/model.js";
2
+ import { RefsResult } from "../model/refs.js";
3
+ import { Diagnostic } from "../model/validate.js";
4
+ /**
5
+ * Resolve every slice's doc consistency findings. `baseDir` is the `.em` file's directory, same
6
+ * convention every other doc/note path in em uses.
7
+ */
8
+ export declare function validateDocModelConsistency(model: NormalizedModel, refs: RefsResult, baseDir: string): Diagnostic[];
@@ -0,0 +1,335 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // `em validate`'s doc↔model consistency check (MIL-124): the "internal surface" of the conform
3
+ // phase (does a bound slice doc's structured claims still agree with the `.em` model?) has always
4
+ // been checked by agent judgment. This module makes the mechanically-checkable core of that
5
+ // judgment call deterministic — the same fs-aware-sibling shape as catalog/lineageValidate.ts
6
+ // (MIL-84), catalog/frontmatterCoherenceValidate.ts (MIL-85), and catalog/noteBindingValidate.ts
7
+ // (MIL-126): a module next to model/validate.ts, not folded into it, because it needs
8
+ // `baseDir`/fs access the rest of validate deliberately never touches.
9
+ //
10
+ // Four things are checked, each declare-gated so a thin/draft doc stays silent rather than
11
+ // nagging (matching this codebase's bar for an unconditional rule — see the sibling modules
12
+ // above):
13
+ //
14
+ // 1. pattern: frontmatter `pattern:` vs the deterministic classification `classify.ts`'s
15
+ // `classifySlicePattern()` computes from the `.em` AST — the same function `em export`
16
+ // publishes as `slice.pattern`. Checked against the doc's OWNING slice only (the slice whose
17
+ // own export key the doc's canonical path names) — `classifySlicePattern` is inherently
18
+ // single-slice, so a MIL-121 cross-covered doc's `pattern:` is compared against the primary
19
+ // slice it's canonically bound to, not some blend of the whole covered union. Silent when
20
+ // the owning slice classifies as `unclassified` — nothing authoritative to compare against.
21
+ //
22
+ // 2. element rosters, per kind (command/event/view), both directions: the doc body's own
23
+ // stable markers (`**Command:** \`Name\``, `**Event:** \`Name\`` [`→ context \`Ctx\``],
24
+ // `- **View:** \`Name\` ...`) versus the model's elements of that kind. A kind with zero
25
+ // markers in the doc is silent for that kind entirely — partial/draft docs are normal, and
26
+ // this mirrors the field-level declare-gating below. `→ context` is deliberately never
27
+ // compared against the model's `@Context` tag — out of scope for this ticket (judgment call,
28
+ // see this module's test file / the MIL-124 report).
29
+ //
30
+ // 3. fields, per matched Command/Event: a markdown field table (first column = field name)
31
+ // found in the marker's own section (before the next `##` heading or marker) versus the
32
+ // model element's `{ fields }` block. Compared only when BOTH sides declare at least one
33
+ // field — either side lacking fields entirely is silent, matching the roster gating above.
34
+ // Name comparison (rosters and fields alike) uses `model.ts`'s own `normalizeName()`, so
35
+ // case/spacing conventions match how the DSL itself resolves names — never a second,
36
+ // independently-invented comparison.
37
+ //
38
+ // MIL-121 cross-covered docs: a doc can be the resolved binding (via `docJoin.ts`'s
39
+ // `resolveSliceDocJoin`) for more than one slice — its own canonical slice, plus any slice whose
40
+ // `covers:`-ratified cross-note points at it. This module resolves every slice's binding exactly
41
+ // that way (never re-deriving binding semantics), groups slices by resolved doc path, and checks
42
+ // each doc ONCE against the UNION of elements across every slice it's bound to — not once per
43
+ // slice, which would double-report the same disagreement. Findings anchor at whichever slice the
44
+ // model-side element actually lives in (element line + refs) for "model has it, doc doesn't
45
+ // mention it"; at the doc's OWNING slice (the one canonically bound to this doc's path — falling
46
+ // back to the earliest-declared covered slice if none is, an edge case that needs a floating
47
+ // `covers`-only doc with no slice of its own) for "doc names it, nothing in the model does" and
48
+ // for the pattern check, since neither has one specific model element to point at.
49
+ //
50
+ // Body-marker/table parsing lives here, not in sliceDoc.ts: it operates on `SliceDoc.body` (the
51
+ // post-frontmatter text sliceDoc.ts already exposes) but needs to talk in terms of element
52
+ // *kinds*, which is this rule's vocabulary, not the doc parser's. `pattern` is the one exception
53
+ // — a genuine frontmatter scalar sliceDoc.ts didn't parse onto the struct before this ticket — so
54
+ // it was added there instead (one line, alongside `status`/`version`), keeping every other
55
+ // frontmatter field's parsing in one place.
56
+ //
57
+ // All warnings, never errors — a genuine doc/model disagreement is worth flagging, but it's
58
+ // never a build-breaking condition (same posture every other fs-aware validate rule takes).
59
+ import { normalizeName } from "../model/model.js";
60
+ import { pushDiag } from "../model/rules.js";
61
+ import { classifySlicePattern, slicePatternLabel } from "./classify.js";
62
+ import { resolveSliceDocJoin } from "./docJoin.js";
63
+ import { readSliceDoc } from "./readSliceDoc.js";
64
+ const COMMAND_MARKER = /^\*\*Command:\*\*\s*`([^`]+)`\s*$/;
65
+ const EVENT_MARKER = /^\*\*Event:\*\*\s*`([^`]+)`(?:\s*→\s*context\s*`[^`]+`\s*)?$/;
66
+ const VIEW_MARKER = /^-\s*\*\*View:\*\*\s*`([^`]+)`/;
67
+ function matchMarker(line) {
68
+ const cmd = COMMAND_MARKER.exec(line);
69
+ if (cmd)
70
+ return { kind: "command", name: cmd[1].trim() };
71
+ const evt = EVENT_MARKER.exec(line);
72
+ if (evt)
73
+ return { kind: "event", name: evt[1].trim() };
74
+ const view = VIEW_MARKER.exec(line);
75
+ if (view)
76
+ return { kind: "view", name: view[1].trim() };
77
+ return null;
78
+ }
79
+ const TABLE_ROW = /^\s*\|/;
80
+ const TABLE_SEPARATOR_CELL = /^:?-+:?$/;
81
+ const PLACEHOLDER = /\{\{.*\}\}/;
82
+ function splitRow(line) {
83
+ const trimmed = line.trim().replace(/^\|/, "").replace(/\|$/, "");
84
+ return trimmed.split("|").map((c) => c.trim());
85
+ }
86
+ function cleanCell(raw) {
87
+ if (raw === undefined)
88
+ return null;
89
+ const stripped = raw.replace(/^`|`$/g, "").trim();
90
+ if (!stripped || PLACEHOLDER.test(raw))
91
+ return null;
92
+ return stripped;
93
+ }
94
+ /** Finds the first markdown table between `start` and `end` (exclusive) whose header's first
95
+ * column reads "Field" (case/spacing-insensitive) — the shape every field table in the template
96
+ * uses (`| Field | Type | ... |`). Returns null when no such table exists, or every data row is
97
+ * a template placeholder (an unfilled `{{field}}` row is the same as no table — nothing real was
98
+ * declared yet). */
99
+ function findFieldTable(lines, start, end) {
100
+ for (let i = start; i < end - 1; i++) {
101
+ if (!TABLE_ROW.test(lines[i]) || !TABLE_ROW.test(lines[i + 1]))
102
+ continue;
103
+ const sepCells = splitRow(lines[i + 1]);
104
+ if (sepCells.length === 0 || !sepCells.every((c) => TABLE_SEPARATOR_CELL.test(c)))
105
+ continue;
106
+ const headerCells = splitRow(lines[i]);
107
+ if (normalizeName(headerCells[0] ?? "") !== "field")
108
+ continue;
109
+ const typeIdx = headerCells.findIndex((c, idx) => idx > 0 && normalizeName(c) === "type");
110
+ const fields = [];
111
+ for (let j = i + 2; j < end; j++) {
112
+ if (!TABLE_ROW.test(lines[j]))
113
+ break;
114
+ const cells = splitRow(lines[j]);
115
+ const name = cleanCell(cells[0]);
116
+ if (!name)
117
+ continue; // blank or placeholder row — not a real field declaration
118
+ const type = typeIdx >= 0 ? cleanCell(cells[typeIdx]) : null;
119
+ fields.push({ name, type });
120
+ }
121
+ return fields.length > 0 ? fields : null;
122
+ }
123
+ return null;
124
+ }
125
+ /** Parses every Command/Event/View marker out of a slice doc's body, each paired with its own
126
+ * field table (command/event only) when one follows before the next `##` heading or marker.
127
+ * Tolerant by construction: only the exact template marker shapes match at all (see the regexes
128
+ * above); anything else — prose, a differently-shaped table, a heading that isn't `##` — is
129
+ * simply not recognized, never a parse error. */
130
+ function parseDocMarkers(body) {
131
+ const lines = body.split(/\r?\n/);
132
+ const hits = [];
133
+ for (let i = 0; i < lines.length; i++) {
134
+ const m = matchMarker(lines[i]);
135
+ if (m)
136
+ hits.push({ ...m, idx: i });
137
+ }
138
+ return hits.map((hit) => {
139
+ let end = lines.length;
140
+ for (let j = hit.idx + 1; j < lines.length; j++) {
141
+ if (/^##\s/.test(lines[j]) || matchMarker(lines[j])) {
142
+ end = j;
143
+ break;
144
+ }
145
+ }
146
+ const fieldsTable = hit.kind === "view" ? null : findFieldTable(lines, hit.idx + 1, end);
147
+ return { kind: hit.kind, name: hit.name, bodyLine: hit.idx, fieldsTable };
148
+ });
149
+ }
150
+ /** First-occurrence-wins map of a marker kind's declared names, normalized — mirrors every other
151
+ * "first wins" dedup convention in this codebase (docJoin.ts's cross-binding search, etc.). A
152
+ * doc that (unusually) declares the same command/event/view name twice is not this rule's
153
+ * business; only the first table (if any) is what gets compared. */
154
+ function firstByName(markers, kind) {
155
+ const map = new Map();
156
+ for (const m of markers) {
157
+ if (m.kind !== kind)
158
+ continue;
159
+ const key = normalizeName(m.name);
160
+ if (!map.has(key))
161
+ map.set(key, m);
162
+ }
163
+ return map;
164
+ }
165
+ /**
166
+ * Resolve every slice's doc consistency findings. `baseDir` is the `.em` file's directory, same
167
+ * convention every other doc/note path in em uses.
168
+ */
169
+ export function validateDocModelConsistency(model, refs, baseDir) {
170
+ const diags = [];
171
+ // Resolve every slice's actual doc binding exactly the way `em export` does — never re-deriving
172
+ // canonical-vs-cross-binding precedence — and group slices by the resolved doc path so a
173
+ // MIL-121 cross-covered doc is checked once against the union, not once per covered slice.
174
+ const groups = new Map();
175
+ model.slices.forEach((slice, i) => {
176
+ const sliceKey = refs.sliceKeys[i];
177
+ const { doc } = resolveSliceDocJoin(slice, sliceKey, baseDir, (id) => refs.refById.get(id));
178
+ if (!doc.found || doc.reason !== null)
179
+ return; // unbound, missing file, or unusable frontmatter
180
+ const arr = groups.get(doc.path);
181
+ if (arr)
182
+ arr.push(i);
183
+ else
184
+ groups.set(doc.path, [i]);
185
+ });
186
+ const docCache = new Map();
187
+ const docForKey = (key) => {
188
+ if (!docCache.has(key))
189
+ docCache.set(key, readSliceDoc(baseDir, key));
190
+ return docCache.get(key);
191
+ };
192
+ for (const [docPath, sliceIndices] of groups) {
193
+ const docKey = docPath.replace(/^slices\//, "").replace(/\.md$/, "");
194
+ const parsed = docForKey(docKey);
195
+ if (!parsed)
196
+ continue; // defensive — resolveSliceDocJoin already guaranteed this file parses
197
+ // The "owning" slice is the one canonically bound to this exact doc (its own export key ==
198
+ // docKey) — the anchor for findings with no single model element to point at. A doc reached
199
+ // ONLY via a `covers`-ratified cross-note, whose own canonical key names no slice currently
200
+ // in the model, has no such slice; fall back to the earliest-declared covered slice instead,
201
+ // same "first wins" determinism as everywhere else in this module.
202
+ const ownerIdx = sliceIndices.find((i) => refs.sliceKeys[i] === docKey) ?? Math.min(...sliceIndices);
203
+ const ownerSlice = model.slices[ownerIdx];
204
+ const ownerKey = refs.sliceKeys[ownerIdx];
205
+ checkPattern(diags, parsed, ownerSlice, ownerKey, docPath);
206
+ const markers = parseDocMarkers(parsed.body);
207
+ const coveredNames = sliceIndices.map((i) => model.slices[i].name);
208
+ for (const kind of ["command", "event", "view"]) {
209
+ const docByName = firstByName(markers, kind);
210
+ if (docByName.size === 0)
211
+ continue; // kind not declared in this doc at all — silent
212
+ const modelEls = [];
213
+ for (const i of sliceIndices)
214
+ for (const el of model.slices[i].elements)
215
+ if (el.kind === kind)
216
+ modelEls.push(el);
217
+ const modelByName = new Map();
218
+ for (const el of modelEls) {
219
+ const key = normalizeName(el.name);
220
+ const list = modelByName.get(key);
221
+ if (list)
222
+ list.push(el);
223
+ else
224
+ modelByName.set(key, [el]);
225
+ }
226
+ checkRosterDirections(diags, kind, docPath, docByName, modelByName, ownerSlice, ownerKey, coveredNames, model, refs);
227
+ if (kind !== "view")
228
+ checkFields(diags, kind, docPath, docByName, modelByName, model, refs);
229
+ }
230
+ }
231
+ return diags;
232
+ }
233
+ function checkPattern(diags, doc, ownerSlice, ownerKey, docPath) {
234
+ if (!doc.pattern)
235
+ return; // usable-frontmatter gate already guarantees presence in practice; defensive
236
+ const classified = classifySlicePattern(ownerSlice);
237
+ if (classified === "unclassified")
238
+ return; // nothing authoritative to compare the doc's claim against
239
+ if (normalizeName(doc.pattern) === classified)
240
+ return;
241
+ pushDiag(diags, "doc-model-pattern-mismatch", {
242
+ message: `slice doc "${docPath}" declares \`pattern: ${doc.pattern}\`, but the model classifies slice ` +
243
+ `"${ownerSlice.name}" as "${classified}" (${slicePatternLabel(classified)}) — see src/catalog/classify.ts`,
244
+ line: ownerSlice.line,
245
+ refs: [ownerKey],
246
+ });
247
+ }
248
+ function checkRosterDirections(diags, kind, docPath, docByName, modelByName, ownerSlice, ownerKey, coveredNames, model, refs) {
249
+ const coverage = coveredNames.length > 1 ? ` (covering slices: ${coveredNames.map((n) => `"${n}"`).join(", ")})` : "";
250
+ // (a) the doc names a command/event/view the model doesn't have.
251
+ for (const [key, marker] of docByName) {
252
+ if (modelByName.has(key))
253
+ continue;
254
+ pushDiag(diags, "doc-model-element-not-in-model", {
255
+ message: `slice doc "${docPath}" declares ${kind} \`${marker.name}\`, but no ${kind} named "${marker.name}" exists in the model${coverage}`,
256
+ line: ownerSlice.line,
257
+ refs: [ownerKey],
258
+ });
259
+ }
260
+ // (b) the model has a command/event/view this doc never mentions.
261
+ for (const [key, els] of modelByName) {
262
+ if (docByName.has(key))
263
+ continue;
264
+ const el = els[0];
265
+ const sliceKey = refs.sliceKeys[el.sliceIndex];
266
+ const sliceName = model.slices[el.sliceIndex].name;
267
+ pushDiag(diags, "doc-model-element-not-in-doc", {
268
+ message: `slice "${sliceName}" has ${kind} "${el.name}", but slice doc "${docPath}" doesn't declare it — expected ${markerHint(kind, el.name)}`,
269
+ line: el.line,
270
+ refs: [sliceKey, refs.refById.get(el.id)],
271
+ });
272
+ }
273
+ }
274
+ function markerHint(kind, name) {
275
+ if (kind === "view")
276
+ return `a "- **View:** \`${name}\` ..." marker`;
277
+ const label = kind === "command" ? "Command" : "Event";
278
+ return `a "**${label}:** \`${name}\`" marker`;
279
+ }
280
+ function checkFields(diags, kind, docPath, docByName, modelByName, model, refs) {
281
+ for (const [key, marker] of docByName) {
282
+ if (!marker.fieldsTable)
283
+ continue; // doc declares no fields for this element — silent
284
+ const modelMatches = modelByName.get(key);
285
+ if (!modelMatches)
286
+ continue; // already reported as doc-model-element-not-in-model above
287
+ const el = modelMatches[0];
288
+ if (!el.fields || el.fields.length === 0)
289
+ continue; // model declares no fields — silent
290
+ const docFields = new Map();
291
+ for (const f of marker.fieldsTable) {
292
+ const k = normalizeName(f.name);
293
+ if (!docFields.has(k))
294
+ docFields.set(k, f);
295
+ }
296
+ const modelFields = new Map();
297
+ for (const f of el.fields) {
298
+ const k = normalizeName(f.name);
299
+ if (!modelFields.has(k))
300
+ modelFields.set(k, f);
301
+ }
302
+ const sliceKey = refs.sliceKeys[el.sliceIndex];
303
+ const sliceName = model.slices[el.sliceIndex].name;
304
+ const elRef = refs.refById.get(el.id);
305
+ const elRefs = [sliceKey, elRef];
306
+ for (const [fk, df] of docFields) {
307
+ if (modelFields.has(fk))
308
+ continue;
309
+ pushDiag(diags, "doc-model-field-mismatch", {
310
+ message: `slice doc "${docPath}"'s ${kind} \`${marker.name}\` field table lists "${df.name}", but ${kind} "${el.name}" (slice "${sliceName}") has no such field`,
311
+ line: el.line,
312
+ refs: elRefs,
313
+ });
314
+ }
315
+ for (const [fk, mf] of modelFields) {
316
+ const df = docFields.get(fk);
317
+ if (!df) {
318
+ pushDiag(diags, "doc-model-field-mismatch", {
319
+ message: `${kind} "${el.name}" (slice "${sliceName}") has field "${mf.name}", but slice doc "${docPath}"'s ${kind} \`${marker.name}\` field table doesn't list it`,
320
+ line: el.line,
321
+ refs: elRefs,
322
+ });
323
+ continue;
324
+ }
325
+ if (df.type && mf.type && normalizeName(df.type) !== normalizeName(mf.type)) {
326
+ pushDiag(diags, "doc-model-field-mismatch", {
327
+ message: `field "${mf.name}" on ${kind} "${el.name}" (slice "${sliceName}") is typed \`${mf.type}\` in the model but \`${df.type}\` in slice doc "${docPath}"`,
328
+ line: el.line,
329
+ refs: elRefs,
330
+ });
331
+ }
332
+ }
333
+ }
334
+ }
335
+ //# sourceMappingURL=docModelConsistencyValidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docModelConsistencyValidate.js","sourceRoot":"","sources":["../../src/catalog/docModelConsistencyValidate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { NormalizedModel } from "../model/model.js";
2
+ import { RefsResult } from "../model/refs.js";
3
+ import { Diagnostic } from "../model/validate.js";
4
+ /**
5
+ * Resolve every slice's note-binding mismatches. `baseDir` is the `.em` file's directory, same
6
+ * convention every other doc/note path in em uses.
7
+ */
8
+ export declare function validateNoteBindings(model: NormalizedModel, refs: RefsResult, baseDir: string): Diagnostic[];