@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
@@ -0,0 +1,260 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // MIL-21: MCP server for em models — agent-facing structured access to `em export`'s data
3
+ // layer over the Model Context Protocol, for tool surfaces beyond Claude Code + a shell
4
+ // (the Slicewright story's cross-agent demonstration).
5
+ //
6
+ // Deliberately outside the CLI core: nothing here imports src/cli.ts or commander. Every tool
7
+ // is a thin adapter — compile the named file fresh (stateless per call, no session state, no
8
+ // caching) and hand back the EXACT SAME JSON document the matching `em <cmd> --json` CLI
9
+ // surface emits (src/emit/json.ts, src/emit/validateJson.ts), so there is exactly one schema
10
+ // per surface and no drift between "em from a shell" and "em over MCP". No new judgment lives
11
+ // here: this module only wires existing builders to MCP's tool-call shape.
12
+ //
13
+ // Diagnostic scope per tool deliberately mirrors src/cli.ts's own per-command choice, not a
14
+ // single shared "compile everything" helper:
15
+ // - `validate`/`slice_ready`/`list_markers` fold in the same fs-aware checks `em validate`
16
+ // does (lineage, frontmatter coherence, note bindings, doc↔model consistency) — see
17
+ // compileWithValidation() below.
18
+ // - `export_model`/`export_slice` gate refusal on compile()'s own diagnostics only, same as
19
+ // `em export` — the doc-join/note-binding diagnostics buildExport() adds are folded into
20
+ // the returned document, never into the refusal gate itself.
21
+ //
22
+ // Every tool takes the model file path as an input parameter; nothing is held across calls.
23
+ import { existsSync, readFileSync, statSync } from "node:fs";
24
+ import { dirname, join } from "node:path";
25
+ import { fileURLToPath } from "node:url";
26
+ import { z } from "zod";
27
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
28
+ import { compile } from "../pipeline.js";
29
+ import { ParseError } from "../parser/parser.js";
30
+ import { hasErrors } from "../model/validate.js";
31
+ import { buildExport, buildSliceExport, GENERATOR_VERSION } from "../emit/json.js";
32
+ import { buildValidateJson, buildSliceReadyJson, buildValidateListJson, collectMarkers } from "../emit/validateJson.js";
33
+ import { validateLineage } from "../catalog/lineageValidate.js";
34
+ import { validateFrontmatterCoherence } from "../catalog/frontmatterCoherenceValidate.js";
35
+ import { validateNoteBindings } from "../catalog/noteBindingValidate.js";
36
+ import { validateDocModelConsistency } from "../catalog/docModelConsistencyValidate.js";
37
+ import { validateSliceReady, computeSliceReadyGates } from "../catalog/sliceReadyValidate.js";
38
+ import { buildCoverageReport } from "../cli/coverage.js";
39
+ import { buildCoverageJson } from "../emit/coverageJson.js";
40
+ import { readContract, contractPath } from "../cli/contract.js";
41
+ /** MCP server identity: name "em", version = the installed package's own version — same
42
+ * `GENERATOR_VERSION` `em export`'s `generator.version` field already reads from package.json,
43
+ * so `em --version`/`em export`'s `generator.version`/this server's version never drift apart. */
44
+ export const SERVER_NAME = "em";
45
+ export const SERVER_VERSION = GENERATOR_VERSION;
46
+ /** Path to the packaged skill directory bundled with whatever em package is actually running —
47
+ * same resolution as src/cli.ts's own packagedSkillDir(), computed independently here (this
48
+ * module never imports cli.ts) since `contract` needs it for readContract()/contractPath().
49
+ * One directory level deeper than cli.ts's own version (src/mcp/server.ts, not src/cli.ts, so
50
+ * dist/mcp/server.js sits one level further from the package root than dist/cli.js does). */
51
+ function packagedSkillDir() {
52
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "..", ".claude", "skills", "event-modeling");
53
+ }
54
+ function textResult(text) {
55
+ return { content: [{ type: "text", text }] };
56
+ }
57
+ function errorResult(message) {
58
+ return { content: [{ type: "text", text: message }], isError: true };
59
+ }
60
+ /** Read + compile `file`, mirroring src/cli.ts's compileFile() but returning a result instead
61
+ * of calling process.exit(): a missing file or parse error becomes an `{ error }`, never a
62
+ * crash or a process exit (MCP tools must survive both — see this module's header). */
63
+ function compileFile(file) {
64
+ let source;
65
+ try {
66
+ source = readFileSync(file, "utf8");
67
+ }
68
+ catch {
69
+ return { error: `cannot read ${file}` };
70
+ }
71
+ try {
72
+ const { model, refs, diagnostics } = compile(source);
73
+ return { model, refs, source, diagnostics };
74
+ }
75
+ catch (e) {
76
+ if (e instanceof ParseError)
77
+ return { error: `parse error in ${file} ${e.message}` };
78
+ throw e;
79
+ }
80
+ }
81
+ /** compileFile() plus the same fs-aware checks `em validate` folds into its own diagnostic set
82
+ * unconditionally (lineage, frontmatter coherence, note bindings, doc↔model consistency) —
83
+ * shared by the `validate`, `slice_ready`, and `list_markers` tools, same as src/cli.ts's
84
+ * `validate` action computes them once and reuses the result for all three of its own modes
85
+ * (--slice-ready, --list-*, plain). */
86
+ function compileWithValidation(file) {
87
+ const compiled = compileFile(file);
88
+ if ("error" in compiled)
89
+ return compiled;
90
+ const { model, refs } = compiled;
91
+ const baseDir = dirname(file);
92
+ const allDiagnostics = [
93
+ ...compiled.diagnostics,
94
+ ...validateLineage(model, refs, baseDir),
95
+ ...validateFrontmatterCoherence(model, refs, baseDir),
96
+ ...validateNoteBindings(model, refs, baseDir),
97
+ ...validateDocModelConsistency(model, refs, baseDir),
98
+ ];
99
+ return { ...compiled, allDiagnostics };
100
+ }
101
+ const fileParam = z.string().describe("path to the .em model file, resolved relative to the server's working directory");
102
+ const sliceKeyParam = z
103
+ .string()
104
+ .describe('the slice\'s export key (its stable JSON identity, e.g. "place-order" — see `em export`\'s slice.key)');
105
+ /** Registers all seven MCP tools on a fresh McpServer instance and returns it, unconnected — the
106
+ * caller (src/mcp/main.ts's stdio entry, or a test harness using an in-memory transport)
107
+ * decides how to connect it. Building the server is a pure, side-effect-free function so tests
108
+ * can exercise it directly with the SDK's in-memory transport, no child process required. */
109
+ export function createServer() {
110
+ const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
111
+ server.registerTool("validate", {
112
+ title: "Validate an em model",
113
+ description: "Check a .em model against event-modeling rules and return the same JSON document " +
114
+ "`em validate <file> --json` prints: a pass/fail summary plus every diagnostic (code, " +
115
+ "message, line, refs, usageCategory). Works even when the model has errors — this is " +
116
+ "the tool to call first when you just need to know what's wrong, or to confirm a model " +
117
+ "is clean before exporting it.",
118
+ inputSchema: { file: fileParam },
119
+ }, async ({ file }) => {
120
+ const compiled = compileWithValidation(file);
121
+ if ("error" in compiled)
122
+ return errorResult(compiled.error);
123
+ return textResult(buildValidateJson(file, compiled.allDiagnostics));
124
+ });
125
+ server.registerTool("slice_ready", {
126
+ title: "Check whether a slice is ready to implement",
127
+ description: "Return the machine-readable readiness verdict for one slice — the same JSON document " +
128
+ "`em validate <file> --slice-ready <key> --json` prints: 4 named gates (doc bound, " +
129
+ "frontmatter usable, status ready-to-implement, no unchecked Open Questions), the " +
130
+ "overall `ready` boolean, and the scoped diagnostics behind it. Call this before " +
131
+ "implementing a slice — never infer readiness yourself from `export_slice`'s content.",
132
+ inputSchema: { file: fileParam, sliceKey: sliceKeyParam },
133
+ }, async ({ file, sliceKey }) => {
134
+ const compiled = compileWithValidation(file);
135
+ if ("error" in compiled)
136
+ return errorResult(compiled.error);
137
+ const { model, refs, allDiagnostics } = compiled;
138
+ const baseDir = dirname(file);
139
+ const readyDiagnostics = validateSliceReady(model, refs, baseDir, sliceKey);
140
+ const combined = [...allDiagnostics, ...readyDiagnostics];
141
+ const scoped = combined.filter((d) => d.refs?.some((r) => r === sliceKey || r.startsWith(`${sliceKey}/`)));
142
+ const ready = scoped.length === 0;
143
+ const gates = computeSliceReadyGates(model, refs, baseDir, sliceKey);
144
+ return textResult(buildSliceReadyJson(file, sliceKey, gates, scoped, ready));
145
+ });
146
+ server.registerTool("list_markers", {
147
+ title: "List issue/divergence/public markers",
148
+ description: "Return the structured marker enumeration `em validate <file> --list-issues " +
149
+ "--list-divergences --list-public --json` prints: every open `issue` annotation, " +
150
+ "accepted `divergence` annotation, and `public`-marked event/view in the model, each " +
151
+ "with its slice/element ref and line. All three kinds default to included — pass " +
152
+ "`issues`/`divergences`/`public: false` to narrow. Never fails the model on its own; " +
153
+ "genuine errors still appear in the `diagnostics` field.",
154
+ inputSchema: {
155
+ file: fileParam,
156
+ issues: z.boolean().default(true).describe("include open `issue` markers"),
157
+ divergences: z.boolean().default(true).describe("include accepted `divergence` markers"),
158
+ public: z.boolean().default(true).describe("include `public`-marked events/views"),
159
+ },
160
+ }, async ({ file, issues, divergences, public: pub }) => {
161
+ const compiled = compileWithValidation(file);
162
+ if ("error" in compiled)
163
+ return errorResult(compiled.error);
164
+ const { model, refs, allDiagnostics } = compiled;
165
+ const errorsOnly = allDiagnostics.filter((d) => d.severity === "error");
166
+ const markers = collectMarkers(model, refs, { issues, divergences, public: pub });
167
+ return textResult(buildValidateListJson(file, markers, errorsOnly));
168
+ });
169
+ server.registerTool("export_model", {
170
+ title: "Export the full normalized model",
171
+ description: "Return the same JSON document `em export <file>` prints: a versioned, deterministic " +
172
+ "snapshot of the whole normalized model — types, slices (pattern, fields, doc, " +
173
+ "elements), arrows, and export-stable refs. Refuses (tool error) when the model has " +
174
+ "errors, same as the CLI — call `validate` first, or use `export_slice` to read one " +
175
+ "already-ratified slice while the rest of the model is still broken.",
176
+ inputSchema: { file: fileParam },
177
+ }, async ({ file }) => {
178
+ const compiled = compileFile(file);
179
+ if ("error" in compiled)
180
+ return errorResult(compiled.error);
181
+ const { model, refs, diagnostics, source } = compiled;
182
+ if (hasErrors(diagnostics)) {
183
+ return errorResult(`not exporting: "${file}" has errors — run \`validate\` first and fix them`);
184
+ }
185
+ const exported = buildExport(model, refs, diagnostics, source, file);
186
+ return textResult(exported.text);
187
+ });
188
+ server.registerTool("export_slice", {
189
+ title: "Export one slice, scoped",
190
+ description: "Return the same JSON document `em export <file> --slice <key>` prints: just that " +
191
+ "slice's object (pattern, fields, doc, elements) plus the export envelope. Refuses " +
192
+ "(tool error) only if THIS slice has an error, or if `sliceKey` names no slice in the " +
193
+ "model — an unrelated slice's breakage elsewhere never blocks it. Use this to " +
194
+ "implement one already-ratified slice while the rest of a large, still-WIP model has " +
195
+ "unrelated errors.",
196
+ inputSchema: { file: fileParam, sliceKey: sliceKeyParam },
197
+ }, async ({ file, sliceKey }) => {
198
+ const compiled = compileFile(file);
199
+ if ("error" in compiled)
200
+ return errorResult(compiled.error);
201
+ const { model, refs, diagnostics, source } = compiled;
202
+ const scopedErrors = diagnostics.filter((d) => d.severity === "error" && d.refs?.some((r) => r === sliceKey || r.startsWith(`${sliceKey}/`)));
203
+ if (scopedErrors.length > 0) {
204
+ return errorResult(`not exporting: slice "${sliceKey}" has errors — fix them first`);
205
+ }
206
+ const sliceExport = buildSliceExport(model, refs, diagnostics, source, file, sliceKey);
207
+ if (!sliceExport.found) {
208
+ return errorResult(`no slice with export key "${sliceKey}" in "${file}"`);
209
+ }
210
+ return textResult(sliceExport.text);
211
+ });
212
+ server.registerTool("coverage", {
213
+ title: "Check invariant-to-test citation coverage",
214
+ description: "Return the same JSON document `em coverage <file> --tests <dir> --json` prints: for " +
215
+ "every slice whose joined doc status is ready-to-implement or implemented, each INV-* " +
216
+ "invariant ID found in the doc body, whether a test file under `testsDir` cites it " +
217
+ "(word-boundary match on the exact ID), and every citing file:line. Mechanizes " +
218
+ "reference/implement.md's definition-of-done citation check — confirms an ID is cited, " +
219
+ "not that the citing test is good or passing (that stays with review and CI). Refuses " +
220
+ "(tool error) if the model has errors, or if `testsDir` doesn't exist.",
221
+ inputSchema: {
222
+ file: fileParam,
223
+ testsDir: z.string().describe("directory to scan recursively for test files citing invariant IDs"),
224
+ },
225
+ }, async ({ file, testsDir }) => {
226
+ const compiled = compileFile(file);
227
+ if ("error" in compiled)
228
+ return errorResult(compiled.error);
229
+ const { model, refs, diagnostics } = compiled;
230
+ if (hasErrors(diagnostics)) {
231
+ return errorResult(`not checking coverage: "${file}" has errors — run \`validate\` first and fix them`);
232
+ }
233
+ if (!existsSync(testsDir)) {
234
+ return errorResult(`--tests directory not found: ${testsDir}`);
235
+ }
236
+ if (!statSync(testsDir).isDirectory()) {
237
+ return errorResult(`--tests is not a directory: ${testsDir}`);
238
+ }
239
+ const report = buildCoverageReport(model, refs, dirname(file), testsDir);
240
+ return textResult(buildCoverageJson(file, testsDir, report));
241
+ });
242
+ server.registerTool("contract", {
243
+ title: "Print the implementation contract",
244
+ description: "Return the packaged implementation contract (reference/implement.md) verbatim — the " +
245
+ "same text `em contract` prints to stdout. Read this before implementing any slice: it " +
246
+ "defines what \"ready\" means, treats the slice doc as the read-only spec, and says " +
247
+ "when to stop and hand a gap to a human instead of deciding it silently. Takes no " +
248
+ "input.",
249
+ inputSchema: {},
250
+ }, async () => {
251
+ try {
252
+ return textResult(readContract(packagedSkillDir()));
253
+ }
254
+ catch {
255
+ return errorResult(`cannot read the packaged contract at ${contractPath(packagedSkillDir())} — broken em installation`);
256
+ }
257
+ });
258
+ return server;
259
+ }
260
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ElementKind, Field, ModelNode } from "../parser/ast.js";
1
+ import { ElementKind, Field, ModelNode, TagClause } from "../parser/ast.js";
2
2
  /** A declared named type (`type Name { … }`) — its own top-level namespace, separate from
3
3
  * elements (a type and an element may share a name without colliding). */
4
4
  export interface TypeDecl {
@@ -40,9 +40,38 @@ export interface Element {
40
40
  again?: boolean;
41
41
  /** event or view: marks this element as part of the published integration surface. */
42
42
  public?: boolean;
43
+ /** Element-level `tag` clauses (composite/external) — events only. Inline field identity
44
+ * tags live on `Field.tag` instead (see `collectTags` for the merged view). */
45
+ tags?: TagClause[];
46
+ /** `renamed from "Old1", "Old2"` on the element's own name — event or command only
47
+ * (MIL-68). `undefined` when absent. Purely export/codegen metadata: `em diff` never reads
48
+ * this, and continues reporting a rename as remove+add. */
49
+ renamedFrom?: string[];
43
50
  /** id of the first instance of this logical element (== id for everything except later view instances). */
44
51
  logicalId: string;
45
52
  }
53
+ export type TagEntryKind = "identity" | "composite" | "external";
54
+ /** One tag key in an event's merged tag set, as both `emit/json.ts` (the `tags` export array)
55
+ * and `validate.ts` (duplicate-key / composite-field-exists rules) need to see it. */
56
+ export interface TagEntry {
57
+ key: string;
58
+ kind: TagEntryKind;
59
+ /** identity: `[fieldName]`. composite: the listed field names. external: `null`. */
60
+ fields: string[] | null;
61
+ /** external: the documentation string. identity/composite: `null`. */
62
+ description: string | null;
63
+ }
64
+ /**
65
+ * Every tag key an element carries, merged from its two sources and ordered per the export
66
+ * contract: inline field identity tags first (`Field.tag === true`, in field declaration
67
+ * order), then element-level `tag` clauses — composite and external — in declaration order
68
+ * (`Element.tags`). Returns `[]` for an element with no tags at all (never null — callers
69
+ * decide their own "no tags" representation, e.g. `emit/json.ts` exports `null` instead).
70
+ * Shared by `emit/json.ts` and `validate.ts` so both see the identical merged view; in
71
+ * practice only ever meaningful for `kind === "event"` (the only kind `tag` clauses can attach
72
+ * to — enforced at parse time), but takes no kind dependency itself.
73
+ */
74
+ export declare function collectTags(element: Element): TagEntry[];
46
75
  export interface Slice {
47
76
  name: string;
48
77
  index: number;
@@ -5,6 +5,30 @@ import { AUTOMATION_KINDS } from "../parser/ast.js";
5
5
  import { dedupe, slug } from "../util/slug.js";
6
6
  export const DEFAULT_PERSONA = "User";
7
7
  export const DEFAULT_CONTEXT = "Domain";
8
+ /**
9
+ * Every tag key an element carries, merged from its two sources and ordered per the export
10
+ * contract: inline field identity tags first (`Field.tag === true`, in field declaration
11
+ * order), then element-level `tag` clauses — composite and external — in declaration order
12
+ * (`Element.tags`). Returns `[]` for an element with no tags at all (never null — callers
13
+ * decide their own "no tags" representation, e.g. `emit/json.ts` exports `null` instead).
14
+ * Shared by `emit/json.ts` and `validate.ts` so both see the identical merged view; in
15
+ * practice only ever meaningful for `kind === "event"` (the only kind `tag` clauses can attach
16
+ * to — enforced at parse time), but takes no kind dependency itself.
17
+ */
18
+ export function collectTags(element) {
19
+ const entries = [];
20
+ for (const f of element.fields ?? []) {
21
+ if (f.tag === true)
22
+ entries.push({ key: f.name, kind: "identity", fields: [f.name], description: null });
23
+ }
24
+ for (const t of element.tags ?? []) {
25
+ if (t.kind === "composite")
26
+ entries.push({ key: t.key, kind: "composite", fields: t.fields ?? [], description: null });
27
+ else
28
+ entries.push({ key: t.key, kind: "external", fields: null, description: t.description ?? null });
29
+ }
30
+ return entries;
31
+ }
8
32
  export function normalizeName(name) {
9
33
  return name.trim().toLowerCase().replace(/\s+/g, " ");
10
34
  }
@@ -59,6 +83,8 @@ export function normalize(ast) {
59
83
  issue: el.issue,
60
84
  divergence: el.divergence,
61
85
  fields: el.fields,
86
+ tags: el.tags,
87
+ renamedFrom: el.renamedFrom,
62
88
  };
63
89
  if (el.kind === "ui") {
64
90
  const persona = el.persona ?? personas[0] ?? DEFAULT_PERSONA;
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"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"}