@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.
- package/.claude/skills/event-modeling/SKILL.md +92 -65
- package/.claude/skills/event-modeling/reference/conform.md +45 -20
- package/.claude/skills/event-modeling/reference/em-dsl.md +132 -55
- package/.claude/skills/event-modeling/reference/extract.md +5 -4
- package/.claude/skills/event-modeling/reference/implement.md +34 -22
- package/.claude/skills/event-modeling/templates/model-readme.md +8 -5
- package/.claude/skills/event-modeling/templates/slice.md +19 -5
- package/README.md +6 -4
- package/dist/catalog/docJoin.d.ts +28 -3
- package/dist/catalog/docJoin.js +82 -13
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.d.ts +8 -0
- package/dist/catalog/docModelConsistencyValidate.js +335 -0
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -0
- package/dist/catalog/noteBindingValidate.d.ts +8 -0
- package/dist/catalog/noteBindingValidate.js +133 -0
- package/dist/catalog/noteBindingValidate.js.map +1 -0
- package/dist/catalog/pages.js +3 -3
- package/dist/catalog/pages.js.map +1 -1
- package/dist/catalog/sliceDoc.d.ts +14 -0
- package/dist/catalog/sliceDoc.js +22 -0
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +18 -0
- package/dist/catalog/sliceReadyValidate.js +25 -1
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/cli/agentsMd.d.ts +15 -0
- package/dist/cli/agentsMd.js +72 -0
- package/dist/cli/agentsMd.js.map +1 -0
- package/dist/cli/conformScope.d.ts +86 -0
- package/dist/cli/conformScope.js +156 -0
- package/dist/cli/conformScope.js.map +1 -0
- package/dist/cli/contract.d.ts +7 -0
- package/dist/cli/contract.js +27 -0
- package/dist/cli/contract.js.map +1 -0
- package/dist/cli/coverage.d.ts +71 -0
- package/dist/cli/coverage.js +177 -0
- package/dist/cli/coverage.js.map +1 -0
- package/dist/cli/markImplemented.d.ts +34 -0
- package/dist/cli/markImplemented.js +180 -0
- package/dist/cli/markImplemented.js.map +1 -0
- package/dist/cli/migrateReactionShape.d.ts +62 -0
- package/dist/cli/migrateReactionShape.js +283 -0
- package/dist/cli/migrateReactionShape.js.map +1 -0
- package/dist/cli/sliceIndex.d.ts +49 -0
- package/dist/cli/sliceIndex.js +115 -0
- package/dist/cli/sliceIndex.js.map +1 -0
- package/dist/cli/sliceNew.d.ts +18 -0
- package/dist/cli/sliceNew.js +53 -0
- package/dist/cli/sliceNew.js.map +1 -0
- package/dist/cli/stateFile.d.ts +74 -0
- package/dist/cli/stateFile.js +191 -0
- package/dist/cli/stateFile.js.map +1 -0
- package/dist/cli.js +535 -43
- package/dist/cli.js.map +1 -1
- package/dist/emit/coverageJson.d.ts +8 -0
- package/dist/emit/coverageJson.js +30 -0
- package/dist/emit/coverageJson.js.map +1 -0
- package/dist/emit/diffJson.d.ts +9 -1
- package/dist/emit/diffJson.js +44 -1
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/dot.js +41 -10
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/json.d.ts +77 -4
- package/dist/emit/json.js +78 -4
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/validateJson.d.ts +52 -0
- package/dist/emit/validateJson.js +120 -0
- package/dist/emit/validateJson.js.map +1 -0
- package/dist/mcp/main.d.ts +2 -0
- package/dist/mcp/main.js +20 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.js +260 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/model/model.d.ts +30 -1
- package/dist/model/model.js +26 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/rules.d.ts +114 -0
- package/dist/model/rules.js +116 -4
- package/dist/model/rules.js.map +1 -1
- package/dist/model/validate.js +92 -8
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +47 -0
- package/dist/parser/lexer.d.ts +16 -0
- package/dist/parser/lexer.js +44 -2
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.js +354 -20
- package/dist/parser/parser.js.map +1 -1
- package/dist/render/drawNotes.d.ts +11 -1
- package/dist/render/drawNotes.js +28 -3
- package/dist/render/drawNotes.js.map +1 -1
- package/dist/render/render.js +116 -23
- package/dist/render/render.js.map +1 -1
- package/dist/render/serve.d.ts +4 -0
- package/dist/render/serve.js +27 -239
- package/dist/render/serve.js.map +1 -1
- package/dist/render/sliceOverlay.d.ts +7 -2
- package/dist/render/sliceOverlay.js +19 -7
- package/dist/render/sliceOverlay.js.map +1 -1
- package/dist/render/sliceStatus.d.ts +7 -3
- package/dist/render/sliceStatus.js +48 -12
- package/dist/render/sliceStatus.js.map +1 -1
- package/dist/render/viewerHtml.d.ts +1 -0
- package/dist/render/viewerHtml.js +5 -0
- package/dist/render/viewerHtml.js.map +1 -0
- package/dist/render/watch.d.ts +10 -0
- package/dist/render/watch.js +29 -0
- package/dist/render/watch.js.map +1 -1
- package/dist/templates.d.ts +20 -1
- package/dist/templates.js +172 -3
- package/dist/templates.js.map +1 -1
- package/dist/util/markers.d.ts +13 -0
- package/dist/util/markers.js +30 -0
- package/dist/util/markers.js.map +1 -0
- package/dist/util/walkDir.d.ts +10 -1
- package/dist/util/walkDir.js +11 -7
- package/dist/util/walkDir.js.map +1 -1
- package/package.json +12 -3
- 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
|
-
|
|
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
|
-
|
|
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 {
|
|
211
|
+
return { doc: exportDoc, diagnostics: allDiagnostics };
|
|
138
212
|
}
|
|
139
213
|
//# sourceMappingURL=json.js.map
|
package/dist/emit/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,gFAAgF;AAChF,yEAAyE;AACzE,4EAA4E;AAC5E,iDAAiD;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAsC,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
package/dist/mcp/main.js
ADDED
|
@@ -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;
|