@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
package/dist/emit/json.js CHANGED
@@ -11,10 +11,11 @@ import { createHash } from "node:crypto";
11
11
  import { dirname, join } from "node:path";
12
12
  import { fileURLToPath } from "node:url";
13
13
  import { readFileSync } from "node:fs";
14
- import { resolveByName, resolveTypeRef } from "../model/model.js";
14
+ import { collectTags, resolveByName, resolveTypeRef } from "../model/model.js";
15
15
  import { serializeDiagnostic } from "../model/validate.js";
16
16
  import { classifySlicePattern } from "../catalog/classify.js";
17
17
  import { resolveSliceDocJoin } from "../catalog/docJoin.js";
18
+ import { validateNoteBindings } from "../catalog/noteBindingValidate.js";
18
19
  // Read once from package.json (two levels up from src/emit/ and dist/emit/
19
20
  // alike) so `generator.version` can never drift from the released version.
20
21
  // tsconfig targets NodeNext without resolveJsonModule, hence fs over import.
@@ -27,7 +28,23 @@ export const GENERATOR_VERSION = JSON.parse(readFileSync(join(dirname(fileURLToP
27
28
  // 1.5 (MIL-85): `slice.doc` gains `driftSignal` — the status/implementedIn coherence
28
29
  // classification (catalog/driftSignal.ts), computed from the same doc parse as `doc.status`/
29
30
  // `doc.version`/`doc.implementedIn`. Additive-only.
30
- export const SCHEMA_VERSION = "1.5";
31
+ // 1.6 (MIL-66): field `tag: boolean` (identity tag marker, always present, `=== true`
32
+ // convention like `public`), and element `tags: [{ key, kind, fields, description }] | null`
33
+ // (identity/composite/external DCB tag metadata — events only; `null` when the element has
34
+ // none). See `model/model.ts`'s `collectTags`. Additive-only.
35
+ // Also 1.6 (MIL-68, same unreleased cycle as MIL-66 — no separate bump): field
36
+ // `renamedFrom: string[] | null` (the prior name(s) a field was known as, most-recent-first;
37
+ // `null` — not the `tag`-style boolean-default convention — when the field carries no
38
+ // `renamed from` clause, which includes every field of a declared `type`, since the clause
39
+ // can't parse there), and element `renamedFrom: string[] | null` (same shape, on the
40
+ // element's own name; events and commands only — `null` on every other kind and on an
41
+ // event/command that declares none). Both are purely codegen/export metadata: `em diff`
42
+ // does not read either and keeps reporting a rename as remove+add. Additive-only.
43
+ // 1.7 (MIL-148): field `assigned: boolean` (system-assigned marker, always present, `=== true`
44
+ // convention like `tag`) — event fields only; a trailing `assigned` clause records that the
45
+ // server/handler sets the field rather than the triggering command supplying it, and exempts
46
+ // it from `fields-completeness/event-field-no-source`. See `model/validate.ts`. Additive-only.
47
+ export const SCHEMA_VERSION = "1.7";
31
48
  /**
32
49
  * Export a single field, additively: `name`/`type` are exactly what today's consumers already
33
50
  * see. `typeRef` is the new, purely-additive key — non-null only when `type` (bare or `[]`-
@@ -44,6 +61,9 @@ function fieldExport(f, typesByName, refByTypeId) {
44
61
  typeRef: resolved
45
62
  ? { name: resolved.typeDecl.name, ref: refByTypeId.get(resolved.typeDecl.id), array: resolved.array }
46
63
  : null,
64
+ tag: f.tag === true,
65
+ renamedFrom: f.renamedFrom ?? null,
66
+ assigned: f.assigned === true,
47
67
  };
48
68
  }
49
69
  /** Build the `em export` document for an already-validated (error-free) model. `refs` is
@@ -52,6 +72,45 @@ function fieldExport(f, typesByName, refByTypeId) {
52
72
  * emitted a second time. `path` is the `.em` file's own path — the doc join resolves
53
73
  * `slices/*.md` relative to its directory, same convention `em catalog`'s doc lookup uses. */
54
74
  export function buildExport(model, refs, diagnostics, source, path) {
75
+ const { doc, diagnostics: allDiagnostics } = buildExportDoc(model, refs, diagnostics, source, path);
76
+ return { text: JSON.stringify(doc, null, 2), diagnostics: allDiagnostics };
77
+ }
78
+ /** Build one slice's `em export` object, scoped (MIL-128): same `pattern`/`fields`/`doc` shape
79
+ * as that slice's entry in the full `em export` document (`ExportDoc.model.slices[i]`), plus
80
+ * the envelope fields (`schemaVersion`, `generator`, `source`) every em JSON surface carries.
81
+ * Reuses `buildExportDoc` wholesale rather than re-deriving the doc join for one slice — the
82
+ * cost of computing every slice's join even though only one is returned is the same tradeoff
83
+ * `validateSliceReady` already accepts for a single-slice check, and keeps this function from
84
+ * drifting from the full export's own slice shape. `diagnostics` in the result is the same
85
+ * scan `buildExport` would have raised for the whole model (unfiltered) — deciding whether an
86
+ * error elsewhere in the model should block a *scoped* export is the caller's call (cli.ts
87
+ * scopes the refusal to diagnostics that concern this slice, so an unrelated slice's breakage
88
+ * never closes the structured path for one that's fine — the whole point of MIL-128). Returns
89
+ * `found: false` (and a `null` `text`) when `sliceKey` matches no slice — the caller reports
90
+ * that as a CLI error. */
91
+ export function buildSliceExport(model, refs, diagnostics, source, path, sliceKey) {
92
+ const { doc, diagnostics: allDiagnostics } = buildExportDoc(model, refs, diagnostics, source, path);
93
+ const slice = doc.model.slices.find((s) => s.key === sliceKey);
94
+ if (!slice)
95
+ return { text: null, found: false, diagnostics: allDiagnostics };
96
+ const sliceDoc = {
97
+ schemaVersion: doc.schemaVersion,
98
+ generator: doc.generator,
99
+ source: doc.source,
100
+ sliceKey,
101
+ slice,
102
+ // Same scoping predicate as `em validate --slice-ready`'s own filter (cli.ts): a bare
103
+ // sliceKey ref (slice-level facts) or an element ref prefixed `<sliceKey>/` — never a
104
+ // second identifier scheme, always the refs the `slice` object above already uses.
105
+ diagnostics: doc.diagnostics.filter((d) => d.refs?.some((r) => r === sliceKey || r.startsWith(`${sliceKey}/`))),
106
+ };
107
+ return { text: JSON.stringify(sliceDoc, null, 2), found: true, diagnostics: allDiagnostics };
108
+ }
109
+ /** The shared body of `buildExport`/`buildSliceExport`: builds the full export document as a
110
+ * JS object (pre-stringify) so a scoped export can pick one slice back out without
111
+ * re-parsing JSON text or re-deriving the doc join. See `buildExport`'s own docstring for the
112
+ * parameter contract — unchanged here, just split out. */
113
+ function buildExportDoc(model, refs, diagnostics, source, path) {
55
114
  const { sliceKeys, refById, refByTypeId } = refs;
56
115
  const baseDir = dirname(path);
57
116
  const docDiagnostics = [];
@@ -61,6 +120,14 @@ export function buildExport(model, refs, diagnostics, source, path) {
61
120
  return null;
62
121
  return el.from.map((name) => ({ name, ref: refOf(resolveByName(model.byName, name)) }));
63
122
  };
123
+ // Identity/composite/external DCB tag metadata (MIL-66) — events only in practice (`tag`
124
+ // clauses are a parse error on any other kind), `null` when the event carries none. Order:
125
+ // inline field identity tags in field order, then element-level composite/external clauses
126
+ // in declaration order (see `model/model.ts`'s `collectTags`).
127
+ const tagsOf = (el) => {
128
+ const tags = collectTags(el);
129
+ return tags.length > 0 ? tags : null;
130
+ };
64
131
  // Built ahead of exportDoc (rather than inline) so docDiagnostics is fully populated before
65
132
  // allDiagnostics is computed once, below — no repeating the [...diagnostics, ...docDiagnostics]
66
133
  // concatenation for both the JSON diagnostics field and the returned ExportResult.
@@ -101,11 +168,18 @@ export function buildExport(model, refs, diagnostics, source, path) {
101
168
  context: el.context ?? null,
102
169
  again: el.again === true,
103
170
  public: el.public === true,
171
+ tags: tagsOf(el),
172
+ renamedFrom: el.renamedFrom ?? null,
104
173
  logicalRef: el.kind === "view" && el.again === true ? refOf(el.logicalId) : null,
105
174
  })),
106
175
  };
107
176
  });
108
- const allDiagnostics = [...diagnostics, ...docDiagnostics];
177
+ // MIL-126: a note that looks like a doc binding but doesn't actually participate in one
178
+ // (already-bound slice, dangling/unusable/unratified cross-note) — computed once per model,
179
+ // not once per slice like the per-slice docDiagnostics loop above, since it needs to see every
180
+ // element on a slice at once to tell "extra" from "dangling" from "unratified".
181
+ const noteBindingDiagnostics = validateNoteBindings(model, refs, baseDir);
182
+ const allDiagnostics = [...diagnostics, ...docDiagnostics, ...noteBindingDiagnostics];
109
183
  const exportDoc = {
110
184
  schemaVersion: SCHEMA_VERSION,
111
185
  generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
@@ -134,6 +208,6 @@ export function buildExport(model, refs, diagnostics, source, path) {
134
208
  },
135
209
  diagnostics: allDiagnostics.map(serializeDiagnostic),
136
210
  };
137
- return { text: JSON.stringify(exportDoc, null, 2), diagnostics: allDiagnostics };
211
+ return { doc: exportDoc, diagnostics: allDiagnostics };
138
212
  }
139
213
  //# 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":"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,EAAE,WAAW,EAAsC,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnH,OAAO,EAAc,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,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,sFAAsF;AACtF,6FAA6F;AAC7F,2FAA2F;AAC3F,8DAA8D;AAC9D,+EAA+E;AAC/E,6FAA6F;AAC7F,sFAAsF;AACtF,2FAA2F;AAC3F,qFAAqF;AACrF,sFAAsF;AACtF,wFAAwF;AACxF,kFAAkF;AAClF,+FAA+F;AAC/F,4FAA4F;AAC5F,6FAA6F;AAC7F,+FAA+F;AAC/F,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AAqEpC;;;;;;;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;QACR,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI;QACnB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;QAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI;KAC9B,CAAC;AACJ,CAAC;AAED;;;;+FAI+F;AAC/F,MAAM,UAAU,WAAW,CACzB,KAAsB,EACtB,IAAgB,EAChB,WAAyB,EACzB,MAAc,EACd,IAAY;IAEZ,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpG,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;;2BAY2B;AAC3B,MAAM,UAAU,gBAAgB,CAC9B,KAAsB,EACtB,IAAgB,EAChB,WAAyB,EACzB,MAAc,EACd,IAAY,EACZ,QAAgB;IAEhB,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpG,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAE7E,MAAM,QAAQ,GAAG;QACf,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ;QACR,KAAK;QACL,sFAAsF;QACtF,sFAAsF;QACtF,mFAAmF;QACnF,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAC3E;KACF,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAC/F,CAAC;AAED;;;2DAG2D;AAC3D,SAAS,cAAc,CACrB,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,yFAAyF;IACzF,2FAA2F;IAC3F,2FAA2F;IAC3F,+DAA+D;IAC/D,MAAM,MAAM,GAAG,CAAC,EAAW,EAAsB,EAAE;QACjD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,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,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;gBAChB,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI;gBACnC,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,wFAAwF;IACxF,4FAA4F;IAC5F,+FAA+F;IAC/F,gFAAgF;IAChF,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,sBAAsB,CAAC,CAAC;IAEtF,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,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { Diagnostic } from "../model/validate.js";
2
+ import { NormalizedModel } from "../model/model.js";
3
+ import { RefsResult } from "../model/refs.js";
4
+ import { SliceReadyGates } from "../catalog/sliceReadyValidate.js";
5
+ export declare const VALIDATE_SCHEMA_VERSION = "1.0";
6
+ /** Build the plain `em validate <file> --json` document — the serialized diagnostics array
7
+ * (stable `code`s, `refs`, line numbers, `usageCategory`) plus a pass/fail summary. Works on
8
+ * a model with errors; `ok` mirrors `!hasErrors(diagnostics)`, the same predicate that gates
9
+ * `em validate`'s exit code. */
10
+ export declare function buildValidateJson(file: string, diagnostics: Diagnostic[]): string;
11
+ export declare const VALIDATE_SLICE_READY_SCHEMA_VERSION = "1.0";
12
+ /** Build the `em validate <file> --slice-ready <key> --json` document — the machine verdict
13
+ * replacing the two hand-parsed English sentences ("is ready-to-implement" /
14
+ * "is NOT ready-to-implement") plus scraped warning prose. `gates` names each of the 4
15
+ * conditions individually (see `computeSliceReadyGates`, catalog/sliceReadyValidate.ts);
16
+ * `null` when `sliceKey` matches no slice in the model (the `slice-ready-unknown-slice` error
17
+ * case — nothing to gate). `ready` is the same predicate driving `em validate`'s exit code
18
+ * for `--slice-ready` (scoped diagnostics empty) — it is the AND of the 4 gates only when
19
+ * `gates` is non-null AND nothing else concerning this slice is broken (e.g. a plain
20
+ * both-ends-of-a-flow diagnostic on one of its own elements); `diagnostics` carries that full
21
+ * scoped list so a consumer sees exactly why, never just the 4 named gates. */
22
+ export declare function buildSliceReadyJson(file: string, sliceKey: string, gates: SliceReadyGates | null, diagnostics: Diagnostic[], ready: boolean): string;
23
+ export declare const VALIDATE_LIST_SCHEMA_VERSION = "1.0";
24
+ /** One `--list-issues`/`--list-divergences`/`--list-public` entry — the structured replacement
25
+ * for the ` issue :12 slice "X" command "Y": text` eyeball format. `elementRef` is the same
26
+ * export-stable ref (`<sliceKey>/<kind>.<slug>`) `em export`/`em diff` use — never a second
27
+ * identifier scheme. `text` is the `issue`/`divergence` annotation's own text; `null` for a
28
+ * `public` marker, which carries no text. */
29
+ export interface MarkerEntry {
30
+ markerKind: "issue" | "divergence" | "public";
31
+ sliceKey: string;
32
+ sliceName: string;
33
+ elementRef: string;
34
+ elementKind: string;
35
+ elementName: string;
36
+ text: string | null;
37
+ line: number;
38
+ }
39
+ /** Collects `--list-issues`/`--list-divergences`/`--list-public` markers straight off the
40
+ * model, in document order — the same element sets cli.ts's `printIssues`/`printDivergences`/
41
+ * `printPublicElements` already walk, just refs-aware and machine-shaped instead of printed.
42
+ * Each `kinds` flag independently gates its own marker kind, same as the text-mode flags. */
43
+ export declare function collectMarkers(model: NormalizedModel, refs: RefsResult, kinds: {
44
+ issues?: boolean;
45
+ divergences?: boolean;
46
+ public?: boolean;
47
+ }): MarkerEntry[];
48
+ /** Build the `--list-issues`/`--list-divergences`/`--list-public --json` document. `markers`
49
+ * is whatever `collectMarkers` returned for the flags actually passed; `diagnostics` is the
50
+ * same errors-only list text mode still prints (`em validate` fails the run on genuine
51
+ * errors regardless of which `--list-*` flag was passed). */
52
+ export declare function buildValidateListJson(file: string, markers: MarkerEntry[], diagnostics: Diagnostic[]): string;
@@ -0,0 +1,120 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Builds the three `em validate --json` document shapes (MIL-128): the plain diagnostics
3
+ // document, the `--slice-ready <key>` machine verdict, and the `--list-issues`/
4
+ // `--list-divergences`/`--list-public` structured enumeration. Follows `em export`/`em diff`'s
5
+ // conventions (json.ts/diffJson.ts): a schema field versioned independently of the npm package
6
+ // and of every other command's own schema, explicit `null` for an unused optional field, and
7
+ // byte-deterministic output for the same inputs.
8
+ //
9
+ // Why `em validate` needed `--json` at all (the ticket's own framing): `em export`'s
10
+ // diagnostics carry `code`/`refs` already, but `em export` refuses to run on an errored model —
11
+ // precisely when an agent most needs structured diagnostics, the structured path was closed.
12
+ // `em validate --json` works on an errored model by design; that's the whole point.
13
+ //
14
+ // Every diagnostic emitted here also carries `usageCategory`, sourced from the `RULES`
15
+ // registry (model/rules.ts) — the same fixed vocabulary docs/usage-data.md's Categories tables
16
+ // already draw from. No new judgment: this module only reshapes what the validator and
17
+ // `RULES` already compute, never adds a check of its own.
18
+ import { serializeDiagnostic } from "../model/validate.js";
19
+ import { RULES } from "../model/rules.js";
20
+ import { GENERATOR_NAME, GENERATOR_VERSION } from "./json.js";
21
+ /** `serializeDiagnostic()`'s shape plus `usageCategory`, looked up from `RULES` — every
22
+ * diagnostic `em validate --json` emits, in all three modes below, carries it. Trusts the
23
+ * same invariant `makeDiag`/`pushDiag` (model/rules.ts) already enforce: a diagnostic's
24
+ * `code` is always a registered `RuleCode`, or construction would have thrown already. */
25
+ function serializeDiagnosticWithUsage(d) {
26
+ return { ...serializeDiagnostic(d), usageCategory: RULES[d.code].usageCategory };
27
+ }
28
+ // 1.0 (MIL-128): initial shape.
29
+ export const VALIDATE_SCHEMA_VERSION = "1.0";
30
+ /** Build the plain `em validate <file> --json` document — the serialized diagnostics array
31
+ * (stable `code`s, `refs`, line numbers, `usageCategory`) plus a pass/fail summary. Works on
32
+ * a model with errors; `ok` mirrors `!hasErrors(diagnostics)`, the same predicate that gates
33
+ * `em validate`'s exit code. */
34
+ export function buildValidateJson(file, diagnostics) {
35
+ const errors = diagnostics.filter((d) => d.severity === "error").length;
36
+ const doc = {
37
+ validateSchemaVersion: VALIDATE_SCHEMA_VERSION,
38
+ generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
39
+ file,
40
+ ok: errors === 0,
41
+ summary: { errors, warnings: diagnostics.length - errors, total: diagnostics.length },
42
+ diagnostics: diagnostics.map(serializeDiagnosticWithUsage),
43
+ };
44
+ return JSON.stringify(doc, null, 2);
45
+ }
46
+ // 1.0 (MIL-128): initial shape.
47
+ export const VALIDATE_SLICE_READY_SCHEMA_VERSION = "1.0";
48
+ /** Build the `em validate <file> --slice-ready <key> --json` document — the machine verdict
49
+ * replacing the two hand-parsed English sentences ("is ready-to-implement" /
50
+ * "is NOT ready-to-implement") plus scraped warning prose. `gates` names each of the 4
51
+ * conditions individually (see `computeSliceReadyGates`, catalog/sliceReadyValidate.ts);
52
+ * `null` when `sliceKey` matches no slice in the model (the `slice-ready-unknown-slice` error
53
+ * case — nothing to gate). `ready` is the same predicate driving `em validate`'s exit code
54
+ * for `--slice-ready` (scoped diagnostics empty) — it is the AND of the 4 gates only when
55
+ * `gates` is non-null AND nothing else concerning this slice is broken (e.g. a plain
56
+ * both-ends-of-a-flow diagnostic on one of its own elements); `diagnostics` carries that full
57
+ * scoped list so a consumer sees exactly why, never just the 4 named gates. */
58
+ export function buildSliceReadyJson(file, sliceKey, gates, diagnostics, ready) {
59
+ const doc = {
60
+ validateSliceReadySchemaVersion: VALIDATE_SLICE_READY_SCHEMA_VERSION,
61
+ generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
62
+ file,
63
+ sliceKey,
64
+ gates,
65
+ ready,
66
+ diagnostics: diagnostics.map(serializeDiagnosticWithUsage),
67
+ };
68
+ return JSON.stringify(doc, null, 2);
69
+ }
70
+ // 1.0 (MIL-128): initial shape.
71
+ export const VALIDATE_LIST_SCHEMA_VERSION = "1.0";
72
+ /** Collects `--list-issues`/`--list-divergences`/`--list-public` markers straight off the
73
+ * model, in document order — the same element sets cli.ts's `printIssues`/`printDivergences`/
74
+ * `printPublicElements` already walk, just refs-aware and machine-shaped instead of printed.
75
+ * Each `kinds` flag independently gates its own marker kind, same as the text-mode flags. */
76
+ export function collectMarkers(model, refs, kinds) {
77
+ const markers = [];
78
+ const entryFor = (el, markerKind, text) => ({
79
+ markerKind,
80
+ sliceKey: refs.sliceKeys[el.sliceIndex],
81
+ sliceName: model.slices[el.sliceIndex].name,
82
+ elementRef: refs.refById.get(el.id),
83
+ elementKind: el.kind,
84
+ elementName: el.name,
85
+ text,
86
+ line: el.line,
87
+ });
88
+ if (kinds.issues) {
89
+ for (const el of model.elements)
90
+ if (el.issue)
91
+ markers.push(entryFor(el, "issue", el.issue));
92
+ }
93
+ if (kinds.divergences) {
94
+ for (const el of model.elements)
95
+ if (el.divergence)
96
+ markers.push(entryFor(el, "divergence", el.divergence));
97
+ }
98
+ if (kinds.public) {
99
+ for (const el of model.elements) {
100
+ if (el.public && (el.kind === "event" || el.kind === "view"))
101
+ markers.push(entryFor(el, "public", null));
102
+ }
103
+ }
104
+ return markers;
105
+ }
106
+ /** Build the `--list-issues`/`--list-divergences`/`--list-public --json` document. `markers`
107
+ * is whatever `collectMarkers` returned for the flags actually passed; `diagnostics` is the
108
+ * same errors-only list text mode still prints (`em validate` fails the run on genuine
109
+ * errors regardless of which `--list-*` flag was passed). */
110
+ export function buildValidateListJson(file, markers, diagnostics) {
111
+ const doc = {
112
+ validateListSchemaVersion: VALIDATE_LIST_SCHEMA_VERSION,
113
+ generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
114
+ file,
115
+ markers,
116
+ diagnostics: diagnostics.map(serializeDiagnosticWithUsage),
117
+ };
118
+ return JSON.stringify(doc, null, 2);
119
+ }
120
+ //# sourceMappingURL=validateJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateJson.js","sourceRoot":"","sources":["../../src/emit/validateJson.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,yFAAyF;AACzF,gFAAgF;AAChF,+FAA+F;AAC/F,+FAA+F;AAC/F,6FAA6F;AAC7F,iDAAiD;AACjD,EAAE;AACF,qFAAqF;AACrF,gGAAgG;AAChG,6FAA6F;AAC7F,oFAAoF;AACpF,EAAE;AACF,uFAAuF;AACvF,+FAA+F;AAC/F,uFAAuF;AACvF,0DAA0D;AAE1D,OAAO,EAAc,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,KAAK,EAAY,MAAM,mBAAmB,CAAC;AAIpD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9D;;;2FAG2F;AAC3F,SAAS,4BAA4B,CAAC,CAAa;IACjD,OAAO,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,IAAgB,CAAC,CAAC,aAAa,EAAE,CAAC;AAC/F,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C;;;iCAGiC;AACjC,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,WAAyB;IACvE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,GAAG,GAAG;QACV,qBAAqB,EAAE,uBAAuB;QAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,IAAI;QACJ,EAAE,EAAE,MAAM,KAAK,CAAC;QAChB,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE;QACrF,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,4BAA4B,CAAC;KAC3D,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,mCAAmC,GAAG,KAAK,CAAC;AAEzD;;;;;;;;;gFASgF;AAChF,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,QAAgB,EAChB,KAA6B,EAC7B,WAAyB,EACzB,KAAc;IAEd,MAAM,GAAG,GAAG;QACV,+BAA+B,EAAE,mCAAmC;QACpE,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,IAAI;QACJ,QAAQ;QACR,KAAK;QACL,KAAK;QACL,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,4BAA4B,CAAC;KAC3D,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAkBlD;;;8FAG8F;AAC9F,MAAM,UAAU,cAAc,CAC5B,KAAsB,EACtB,IAAgB,EAChB,KAAoE;IAEpE,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,EAAW,EAAE,UAAqC,EAAE,IAAmB,EAAe,EAAE,CAAC,CAAC;QAC1G,UAAU;QACV,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC;QACvC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI;QAC3C,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE;QACpC,WAAW,EAAE,EAAE,CAAC,IAAI;QACpB,WAAW,EAAE,EAAE,CAAC,IAAI;QACpB,IAAI;QACJ,IAAI,EAAE,EAAE,CAAC,IAAI;KACd,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,EAAE,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,EAAE,CAAC,UAAU;gBAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;8DAG8D;AAC9D,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAsB,EAAE,WAAyB;IACnG,MAAM,GAAG,GAAG;QACV,yBAAyB,EAAE,4BAA4B;QACvD,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,IAAI;QACJ,OAAO;QACP,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,4BAA4B,CAAC;KAC3D,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(): Promise<void>;
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: MIT
3
+ // `em-mcp`'s stdio entry point (MIL-21). Thin on purpose: build the server (src/mcp/server.ts),
4
+ // connect it to stdio, done. The stdio transport IS the protocol channel — nothing here or in
5
+ // server.ts may write to stdout outside it, so every diagnostic goes to stderr instead.
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { createServer } from "./server.js";
8
+ import { isMainModule } from "../util/isMainModule.js";
9
+ export async function main() {
10
+ const server = createServer();
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
13
+ }
14
+ if (isMainModule(import.meta.url)) {
15
+ main().catch((e) => {
16
+ console.error(e instanceof Error ? e.message : String(e));
17
+ process.exit(1);
18
+ });
19
+ }
20
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/mcp/main.ts"],"names":[],"mappings":";AACA,+BAA+B;AAC/B,gGAAgG;AAChG,8FAA8F;AAC9F,wFAAwF;AAExF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /** MCP server identity: name "em", version = the installed package's own version — same
3
+ * `GENERATOR_VERSION` `em export`'s `generator.version` field already reads from package.json,
4
+ * so `em --version`/`em export`'s `generator.version`/this server's version never drift apart. */
5
+ export declare const SERVER_NAME = "em";
6
+ export declare const SERVER_VERSION: string;
7
+ /** Registers all seven MCP tools on a fresh McpServer instance and returns it, unconnected — the
8
+ * caller (src/mcp/main.ts's stdio entry, or a test harness using an in-memory transport)
9
+ * decides how to connect it. Building the server is a pure, side-effect-free function so tests
10
+ * can exercise it directly with the SDK's in-memory transport, no child process required. */
11
+ export declare function createServer(): McpServer;