@milehimikey/em 1.9.1 → 1.10.0

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 (77) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +1 -1
  2. package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
  3. package/.claude/skills/event-modeling-design/SKILL.md +1 -1
  4. package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
  5. package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
  6. package/.claude/skills/event-modeling-review/SKILL.md +1 -1
  7. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +46 -1
  8. package/README.md +8 -1
  9. package/dist/cli/ciInit.d.ts +10 -3
  10. package/dist/cli/ciInit.js +22 -14
  11. package/dist/cli/ciInit.js.map +1 -1
  12. package/dist/cli/systemInputs.d.ts +34 -0
  13. package/dist/cli/systemInputs.js +129 -0
  14. package/dist/cli/systemInputs.js.map +1 -0
  15. package/dist/cli.js +220 -5
  16. package/dist/cli.js.map +1 -1
  17. package/dist/emit/json.d.ts +16 -1
  18. package/dist/emit/json.js +36 -1
  19. package/dist/emit/json.js.map +1 -1
  20. package/dist/emit/queryJson.d.ts +6 -0
  21. package/dist/emit/queryJson.js +29 -0
  22. package/dist/emit/queryJson.js.map +1 -0
  23. package/dist/emit/systemJson.d.ts +8 -0
  24. package/dist/emit/systemJson.js +38 -0
  25. package/dist/emit/systemJson.js.map +1 -0
  26. package/dist/mcp/server.d.ts +1 -1
  27. package/dist/mcp/server.js +185 -6
  28. package/dist/mcp/server.js.map +1 -1
  29. package/dist/model/edges.d.ts +13 -1
  30. package/dist/model/edges.js +43 -15
  31. package/dist/model/edges.js.map +1 -1
  32. package/dist/model/model.d.ts +2 -0
  33. package/dist/model/model.js +1 -0
  34. package/dist/model/model.js.map +1 -1
  35. package/dist/model/qualifiedRef.d.ts +47 -0
  36. package/dist/model/qualifiedRef.js +100 -0
  37. package/dist/model/qualifiedRef.js.map +1 -0
  38. package/dist/model/queryIndex.d.ts +50 -0
  39. package/dist/model/queryIndex.js +111 -0
  40. package/dist/model/queryIndex.js.map +1 -0
  41. package/dist/model/rules.d.ts +69 -0
  42. package/dist/model/rules.js +82 -0
  43. package/dist/model/rules.js.map +1 -1
  44. package/dist/model/sliceDocIndex.d.ts +30 -0
  45. package/dist/model/sliceDocIndex.js +110 -0
  46. package/dist/model/sliceDocIndex.js.map +1 -0
  47. package/dist/model/validate.js +4 -11
  48. package/dist/model/validate.js.map +1 -1
  49. package/dist/parser/ast.d.ts +4 -0
  50. package/dist/parser/parser.d.ts +2 -0
  51. package/dist/parser/parser.js +8 -2
  52. package/dist/parser/parser.js.map +1 -1
  53. package/dist/query/format.d.ts +8 -0
  54. package/dist/query/format.js +80 -0
  55. package/dist/query/format.js.map +1 -0
  56. package/dist/query/pipeline.d.ts +17 -0
  57. package/dist/query/pipeline.js +38 -0
  58. package/dist/query/pipeline.js.map +1 -0
  59. package/dist/query/system.d.ts +60 -0
  60. package/dist/query/system.js +87 -0
  61. package/dist/query/system.js.map +1 -0
  62. package/dist/query/verbs.d.ts +100 -0
  63. package/dist/query/verbs.js +306 -0
  64. package/dist/query/verbs.js.map +1 -0
  65. package/dist/render/drawEdges.js +8 -4
  66. package/dist/render/drawEdges.js.map +1 -1
  67. package/dist/render/sliceDiagram.js +1 -0
  68. package/dist/render/sliceDiagram.js.map +1 -1
  69. package/dist/system/manifest.d.ts +45 -0
  70. package/dist/system/manifest.js +178 -0
  71. package/dist/system/manifest.js.map +1 -0
  72. package/dist/system/verify.d.ts +88 -0
  73. package/dist/system/verify.js +263 -0
  74. package/dist/system/verify.js.map +1 -0
  75. package/dist/util/slug.js +16 -10
  76. package/dist/util/slug.js.map +1 -1
  77. package/package.json +10 -1
@@ -0,0 +1,178 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Parses a seam manifest (`system.yaml`, MIL-194) into a plain, validated shape — the declared
3
+ // list of models in a system plus the seams binding one model's `public` event/view to another
4
+ // model's reaction. This is the one place the manifest's own schema is enforced; everything
5
+ // downstream (src/system/verify.ts) trusts the returned `SystemManifest`.
6
+ //
7
+ // YAML because the manifest is human-authored (and JSON is a YAML subset, so a `.json` manifest
8
+ // parses here unchanged). Pure: text in, manifest + diagnostics out — the caller (src/cli/
9
+ // systemInputs.ts) owns reading the file and resolving each model's `source` path, so this
10
+ // module never touches the filesystem. Line numbers come from the YAML parser's own
11
+ // `LineCounter`, so a shape error points at the offending entry, not just "the manifest".
12
+ import { LineCounter, parseDocument, isMap, isSeq, isScalar } from "yaml";
13
+ import { pushDiag } from "../model/rules.js";
14
+ /** The only manifest schema version accepted (`systemSchemaVersion`). Bumped, with a range
15
+ * check here, the day the manifest's shape changes incompatibly. */
16
+ export const SYSTEM_MANIFEST_SCHEMA_VERSION = "1.0";
17
+ const TOP_KEYS = new Set(["systemSchemaVersion", "name", "models", "seams"]);
18
+ const MODEL_KEYS = new Set(["source", "owner"]);
19
+ const SEAM_KEYS = new Set(["from", "to", "description"]);
20
+ /** Parse and shape-check manifest text. Every problem is a `system-manifest-invalid` error
21
+ * diagnostic (never a throw), and `ok: false` means the manifest can't be used at all — the
22
+ * caller refuses rather than verifying a partial system. Unknown keys are errors, not ignored:
23
+ * a misspelled `seam:` silently declaring zero seams would defeat the whole check. */
24
+ export function parseManifest(text) {
25
+ const diagnostics = [];
26
+ const lineCounter = new LineCounter();
27
+ const doc = parseDocument(text, { lineCounter, prettyErrors: false });
28
+ const lineOf = (node) => {
29
+ const range = node && "range" in node ? node.range : isPairLike(node) ? node.key?.range : undefined;
30
+ return range ? lineCounter.linePos(range[0]).line : undefined;
31
+ };
32
+ const invalid = (message, line) => pushDiag(diagnostics, "system-manifest-invalid", { message, line });
33
+ if (doc.errors.length > 0) {
34
+ for (const e of doc.errors) {
35
+ const line = e.linePos?.[0]?.line;
36
+ invalid(`YAML parse error: ${e.message.trim()}`, line);
37
+ }
38
+ return { ok: false, diagnostics };
39
+ }
40
+ const root = doc.contents;
41
+ if (!isMap(root)) {
42
+ invalid("manifest must be a YAML mapping with `systemSchemaVersion`, `models`, and optionally `name`/`seams`");
43
+ return { ok: false, diagnostics };
44
+ }
45
+ for (const pair of root.items) {
46
+ const key = scalarString(pair.key);
47
+ if (key === undefined || !TOP_KEYS.has(key)) {
48
+ invalid(`unknown top-level key ${describeKey(pair.key)} — expected one of: ${[...TOP_KEYS].join(", ")}`, lineOf(pair));
49
+ }
50
+ }
51
+ // systemSchemaVersion — required, and exactly the one version this em understands.
52
+ const versionNode = root.get("systemSchemaVersion", true);
53
+ const version = scalarString(versionNode);
54
+ if (version === undefined) {
55
+ invalid(`missing or non-string \`systemSchemaVersion\` — set \`systemSchemaVersion: "${SYSTEM_MANIFEST_SCHEMA_VERSION}"\``, lineOf(versionNode));
56
+ }
57
+ else if (version !== SYSTEM_MANIFEST_SCHEMA_VERSION) {
58
+ invalid(`unsupported systemSchemaVersion "${version}" — this em accepts "${SYSTEM_MANIFEST_SCHEMA_VERSION}"`, lineOf(versionNode));
59
+ }
60
+ // name — optional string.
61
+ const nameNode = root.get("name", true);
62
+ let name = null;
63
+ if (nameNode !== undefined) {
64
+ const n = scalarString(nameNode);
65
+ if (n === undefined)
66
+ invalid("`name` must be a string", lineOf(nameNode));
67
+ else
68
+ name = n;
69
+ }
70
+ // models — required mapping, ≥ 1 entry, each `{ source, owner? }`.
71
+ const models = [];
72
+ const modelsNode = root.get("models", true);
73
+ if (!isMap(modelsNode)) {
74
+ invalid("`models` must be a mapping of model key -> { source, owner? } with at least one entry", lineOf(modelsNode ?? root));
75
+ }
76
+ else if (modelsNode.items.length === 0) {
77
+ invalid("`models` must declare at least one model", lineOf(modelsNode));
78
+ }
79
+ else {
80
+ for (const pair of modelsNode.items) {
81
+ const key = scalarString(pair.key);
82
+ const line = lineOf(pair) ?? lineOf(modelsNode);
83
+ if (key === undefined || key.trim() === "") {
84
+ invalid(`model key ${describeKey(pair.key)} must be a non-empty string`, line);
85
+ continue;
86
+ }
87
+ const entry = pair.value;
88
+ if (!isMap(entry)) {
89
+ invalid(`model "${key}" must be a mapping with a \`source\` (a .em file or an \`em export --json\` document)`, line);
90
+ continue;
91
+ }
92
+ for (const p of entry.items) {
93
+ const k = scalarString(p.key);
94
+ if (k === undefined || !MODEL_KEYS.has(k))
95
+ invalid(`model "${key}": unknown key ${describeKey(p.key)} — expected source, owner`, lineOf(p));
96
+ }
97
+ const source = scalarString(entry.get("source", true));
98
+ if (source === undefined || source.trim() === "") {
99
+ invalid(`model "${key}": \`source\` must be a non-empty path string`, line);
100
+ continue;
101
+ }
102
+ const ownerNode = entry.get("owner", true);
103
+ let owner = null;
104
+ if (ownerNode !== undefined) {
105
+ const o = scalarString(ownerNode);
106
+ if (o === undefined)
107
+ invalid(`model "${key}": \`owner\` must be a string`, lineOf(ownerNode));
108
+ else
109
+ owner = o;
110
+ }
111
+ models.push({ key, source, owner, line: line ?? 1 });
112
+ }
113
+ }
114
+ // seams — optional sequence of `{ from, to, description? }`.
115
+ const seams = [];
116
+ const seamsNode = root.get("seams", true);
117
+ if (seamsNode !== undefined && !(isScalar(seamsNode) && seamsNode.value === null)) {
118
+ if (!isSeq(seamsNode)) {
119
+ invalid("`seams` must be a list of { from, to, description? } entries", lineOf(seamsNode));
120
+ }
121
+ else {
122
+ seamsNode.items.forEach((item, i) => {
123
+ const line = lineOf(item) ?? lineOf(seamsNode);
124
+ if (!isMap(item)) {
125
+ invalid(`seams[${i}] must be a mapping with \`from\` and \`to\``, line);
126
+ return;
127
+ }
128
+ for (const p of item.items) {
129
+ const k = scalarString(p.key);
130
+ if (k === undefined || !SEAM_KEYS.has(k))
131
+ invalid(`seams[${i}]: unknown key ${describeKey(p.key)} — expected from, to, description`, lineOf(p));
132
+ }
133
+ const from = scalarString(item.get("from", true));
134
+ const to = scalarString(item.get("to", true));
135
+ if (from === undefined || from.trim() === "")
136
+ invalid(`seams[${i}]: \`from\` must be a qualified ref string (<modelKey>:<sliceKey>/<kind>.<slug>)`, line);
137
+ if (to === undefined || to.trim() === "")
138
+ invalid(`seams[${i}]: \`to\` must be a qualified ref string (<modelKey>:<sliceKey>/<kind>.<slug>, or <modelKey>:<sliceKey>)`, line);
139
+ const descNode = item.get("description", true);
140
+ let description = null;
141
+ if (descNode !== undefined && !(isScalar(descNode) && descNode.value === null)) {
142
+ const d = scalarString(descNode);
143
+ if (d === undefined)
144
+ invalid(`seams[${i}]: \`description\` must be a string`, lineOf(descNode));
145
+ else
146
+ description = d;
147
+ }
148
+ if (from !== undefined && from.trim() !== "" && to !== undefined && to.trim() !== "") {
149
+ seams.push({ from: from.trim(), to: to.trim(), description, line: line ?? 1 });
150
+ }
151
+ });
152
+ }
153
+ }
154
+ if (diagnostics.length > 0)
155
+ return { ok: false, diagnostics };
156
+ return {
157
+ ok: true,
158
+ manifest: { systemSchemaVersion: version, name, models, seams },
159
+ diagnostics,
160
+ };
161
+ }
162
+ function isPairLike(node) {
163
+ return typeof node === "object" && node !== null && "key" in node && "value" in node && !("range" in node);
164
+ }
165
+ /** A scalar node's value as a string — `undefined` for a missing node, a non-scalar, or a
166
+ * non-string scalar (numbers/booleans/null are never accepted where a string is required, so
167
+ * `systemSchemaVersion: 1.0` — a YAML float — is rejected, not silently coerced). */
168
+ function scalarString(node) {
169
+ if (!isScalar(node))
170
+ return undefined;
171
+ return typeof node.value === "string" ? node.value : undefined;
172
+ }
173
+ function describeKey(node) {
174
+ if (isScalar(node))
175
+ return `"${String(node.value)}"`;
176
+ return "(non-scalar key)";
177
+ }
178
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/system/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { ElementKind } from "../parser/ast.js";
2
+ import type { Diagnostic } from "../model/validate.js";
3
+ import type { SystemManifest } from "./manifest.js";
4
+ /** The subset of one `em export --json` document `verifySystem` reads. */
5
+ export interface SystemExportElement {
6
+ ref: string;
7
+ kind: ElementKind;
8
+ name: string;
9
+ line: number;
10
+ public: boolean;
11
+ }
12
+ export interface SystemExportSlice {
13
+ key: string;
14
+ name: string;
15
+ elements: SystemExportElement[];
16
+ }
17
+ export interface SystemExportDoc {
18
+ schemaVersion: string;
19
+ model: {
20
+ key: string;
21
+ name: string | null;
22
+ slices: SystemExportSlice[];
23
+ edges: {
24
+ from: string;
25
+ to: string;
26
+ }[];
27
+ };
28
+ }
29
+ export type SystemSourceKind = "em" | "export";
30
+ /** One model, loaded by the caller: the manifest's entry plus its export document and the
31
+ * path diagnostics about it should point at (the `.em` file, or the export `.json`). */
32
+ export interface SystemModelInput {
33
+ key: string;
34
+ source: string;
35
+ sourceKind: SystemSourceKind;
36
+ owner: string | null;
37
+ /** Path diagnostics about this model's elements point at — resolved, as the CLI prints it. */
38
+ file: string;
39
+ doc: SystemExportDoc;
40
+ }
41
+ /** A diagnostic plus the file it concerns — `em status --json`'s multi-model convention. */
42
+ export interface SystemDiagnostic extends Diagnostic {
43
+ file: string;
44
+ }
45
+ export interface SystemModelReport {
46
+ key: string;
47
+ name: string | null;
48
+ source: string;
49
+ sourceKind: SystemSourceKind;
50
+ owner: string | null;
51
+ /** Unqualified (`<sliceKey>/<kind>.<slug>`) refs of every `public` element, export order. */
52
+ publicSurface: string[];
53
+ }
54
+ export interface SystemSeamReport {
55
+ /** Resolved, element-level qualified ref when the endpoint resolved; else the ref as written. */
56
+ from: string;
57
+ to: string;
58
+ fromSlice: string | null;
59
+ toSlice: string | null;
60
+ description: string | null;
61
+ status: "verified" | "error";
62
+ /** Codes of every diagnostic raised on this seam (errors and warnings), in raise order. */
63
+ diagnostics: string[];
64
+ }
65
+ export interface ContextMap {
66
+ nodes: {
67
+ key: string;
68
+ name: string | null;
69
+ owner: string | null;
70
+ }[];
71
+ /** One edge per ordered model pair with at least one declared seam (verified or not), sorted
72
+ * by (from, to); `seams` counts the declarations. */
73
+ edges: {
74
+ from: string;
75
+ to: string;
76
+ seams: number;
77
+ }[];
78
+ }
79
+ export interface SystemReport {
80
+ name: string | null;
81
+ models: SystemModelReport[];
82
+ seams: SystemSeamReport[];
83
+ contextMap: ContextMap;
84
+ diagnostics: SystemDiagnostic[];
85
+ }
86
+ /** Verify `manifest` against the loaded `models` (one per manifest entry, same order).
87
+ * `manifestFile` is the path manifest-level diagnostics point at. */
88
+ export declare function verifySystem(manifest: SystemManifest, models: SystemModelInput[], manifestFile: string): SystemReport;
@@ -0,0 +1,263 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Verifies a seam manifest against the models' export documents (MIL-194) — the cross-model
3
+ // half of the bedrock "both ends of a flow" rule. A seam is a `public` event/view on one side
4
+ // bound to a reaction (translation/automation-kind element) on the other; `em` already has both
5
+ // ends of every seam, it just never had them as data. This module makes the binding explicit and
6
+ // checks it: both endpoints resolve, the source really is `public`, the consumer really is a
7
+ // reaction, nothing published goes unread, nothing externally fed goes unclaimed, and the old
8
+ // portal name-matching heuristic is demoted to a lint (`undeclared-seam-candidate`).
9
+ //
10
+ // It reads EXPORT DOCUMENTS ONLY — the `SystemExportDoc` shape below is the slice of `em
11
+ // export --json` (schema >= 1.10: `model.key`, `model.edges`) this check needs, and nothing here
12
+ // touches a NormalizedModel. That's the constraint the ticket sets ("models still compile
13
+ // independently — no compile-time coupling"): a `.em` source is compiled into the same export
14
+ // document by the caller (src/cli/systemInputs.ts), so this verifier can't tell a co-located
15
+ // repo from a CI job aggregating exports from ten repos. Pure: no fs, no clock; output order
16
+ // is manifest order for models/seams and stable derivation order for everything else.
17
+ import { AUTOMATION_KINDS } from "../parser/ast.js";
18
+ import { normalizeName } from "../model/model.js";
19
+ import { formatQualifiedRef, parseQualifiedRef } from "../model/qualifiedRef.js";
20
+ import { pushDiag } from "../model/rules.js";
21
+ const SEAM_ERROR_CODES = new Set([
22
+ "system-manifest-invalid",
23
+ "seam-endpoint-unresolved",
24
+ "seam-source-not-public",
25
+ "seam-consumer-not-reaction",
26
+ ]);
27
+ /** Verify `manifest` against the loaded `models` (one per manifest entry, same order).
28
+ * `manifestFile` is the path manifest-level diagnostics point at. */
29
+ export function verifySystem(manifest, models, manifestFile) {
30
+ const diagnostics = [];
31
+ const raise = (file, code, extra) => {
32
+ const bucket = [];
33
+ pushDiag(bucket, code, extra);
34
+ diagnostics.push({ ...bucket[0], file });
35
+ };
36
+ const qualify = formatQualifiedRef;
37
+ // Models are addressed by their MANIFEST key throughout — even on a mismatch, so a seam
38
+ // written against the manifest's own vocabulary still verifies and the one error tells the
39
+ // author exactly which key to change.
40
+ const byKey = new Map();
41
+ for (const m of models) {
42
+ byKey.set(m.key, m);
43
+ if (m.doc.model.key !== m.key) {
44
+ const entry = manifest.models.find((e) => e.key === m.key);
45
+ const modelLabel = m.doc.model.name === null ? "(unnamed model)" : `model "${m.doc.model.name}"`;
46
+ raise(manifestFile, "system-model-key-mismatch", {
47
+ message: `manifest key "${m.key}" does not match the computed key "${m.doc.model.key}" of ${modelLabel} ` +
48
+ `(${m.source}) — rename the manifest entry to "${m.doc.model.key}"`,
49
+ line: entry?.line,
50
+ });
51
+ }
52
+ }
53
+ const isReaction = (el) => AUTOMATION_KINDS.has(el.kind);
54
+ const isSurface = (el) => el.public === true && (el.kind === "event" || el.kind === "view");
55
+ const findElement = (model, ref) => {
56
+ for (const slice of model.doc.model.slices) {
57
+ for (const element of slice.elements)
58
+ if (element.ref === ref)
59
+ return { slice, element };
60
+ }
61
+ return undefined;
62
+ };
63
+ // ---- Seams: resolve both endpoints, then check what each one is. ----
64
+ const consumedSurface = new Set(); // qualified refs named as a resolved `from`
65
+ const boundReactions = new Set(); // qualified refs named as a resolved `to`
66
+ const declaredPairs = new Map(); // fromQualified -> set of toQualified
67
+ const seenPairs = new Set();
68
+ const seamsByModelPair = new Map();
69
+ const seams = manifest.seams.map((seam, i) => {
70
+ const codes = [];
71
+ const seamRaise = (code, message, refs) => {
72
+ codes.push(code);
73
+ raise(manifestFile, code, { message: `seams[${i}] (${seam.from} -> ${seam.to}): ${message}`, line: seam.line, refs });
74
+ };
75
+ const resolveModel = (raw, side) => {
76
+ const parsed = parseQualifiedRef(raw);
77
+ if (parsed.modelKey === null) {
78
+ seamRaise("system-manifest-invalid", `\`${side}\` must be a model-qualified ref (<modelKey>:<sliceKey>/<kind>.<slug>), got "${raw}"`);
79
+ return undefined;
80
+ }
81
+ const model = byKey.get(parsed.modelKey);
82
+ if (!model) {
83
+ seamRaise("system-manifest-invalid", `\`${side}\` names unknown model key "${parsed.modelKey}" — declared models are: ${manifest.models.map((m) => m.key).join(", ")}`);
84
+ return undefined;
85
+ }
86
+ return { modelKey: parsed.modelKey, ref: parsed.ref, model };
87
+ };
88
+ // `from`: an element ref that must be a `public` event/view.
89
+ let from;
90
+ const fromModel = resolveModel(seam.from, "from");
91
+ if (fromModel) {
92
+ const hit = findElement(fromModel.model, fromModel.ref);
93
+ if (!hit) {
94
+ seamRaise("seam-endpoint-unresolved", `no element "${fromModel.ref}" in model "${fromModel.modelKey}" — check \`em export\`'s refs, or re-declare the seam after a rename`);
95
+ }
96
+ else {
97
+ from = { modelKey: fromModel.modelKey, model: fromModel.model, ...hit };
98
+ if (!isSurface(hit.element)) {
99
+ const why = hit.element.kind === "event" || hit.element.kind === "view"
100
+ ? "is not marked `public`"
101
+ : `is a ${hit.element.kind}, not a \`public\` event or view`;
102
+ seamRaise("seam-source-not-public", `${hit.element.kind} "${hit.element.name}" ${why}`, [qualify(from.modelKey, hit.element.ref)]);
103
+ }
104
+ }
105
+ }
106
+ // `to`: an element ref to a reaction, or a bare slice ref containing exactly one reaction.
107
+ let to;
108
+ const toModel = resolveModel(seam.to, "to");
109
+ if (toModel) {
110
+ if (toModel.ref.includes("/")) {
111
+ const hit = findElement(toModel.model, toModel.ref);
112
+ if (!hit) {
113
+ seamRaise("seam-endpoint-unresolved", `no element "${toModel.ref}" in model "${toModel.modelKey}" — check \`em export\`'s refs, or re-declare the seam after a rename`);
114
+ }
115
+ else {
116
+ to = { modelKey: toModel.modelKey, model: toModel.model, ...hit };
117
+ if (!isReaction(hit.element)) {
118
+ seamRaise("seam-consumer-not-reaction", `${hit.element.kind} "${hit.element.name}" is not a reaction — \`to\` must name a translation/automation/processor/saga element`, [qualify(to.modelKey, hit.element.ref)]);
119
+ }
120
+ }
121
+ }
122
+ else {
123
+ const slice = toModel.model.doc.model.slices.find((s) => s.key === toModel.ref);
124
+ if (!slice) {
125
+ seamRaise("seam-endpoint-unresolved", `no slice "${toModel.ref}" in model "${toModel.modelKey}"`);
126
+ }
127
+ else {
128
+ const reactions = slice.elements.filter(isReaction);
129
+ if (reactions.length === 1) {
130
+ to = { modelKey: toModel.modelKey, model: toModel.model, slice, element: reactions[0] };
131
+ }
132
+ else {
133
+ seamRaise("seam-consumer-not-reaction", reactions.length === 0
134
+ ? `slice "${slice.name}" has no reaction element — \`to\` must name (or contain exactly one) translation/automation element`
135
+ : `slice "${slice.name}" has ${reactions.length} reaction elements (${reactions.map((r) => r.ref).join(", ")}) — name one explicitly`, [qualify(toModel.modelKey, slice.key)]);
136
+ }
137
+ }
138
+ }
139
+ }
140
+ const fromQualified = from ? qualify(from.modelKey, from.element.ref) : seam.from;
141
+ const toQualified = to ? qualify(to.modelKey, to.element.ref) : seam.to;
142
+ // Duplicate: same resolved (from, to) pair declared twice (a bare-slice `to` and its
143
+ // element-level spelling are the same seam). Warned on the second occurrence.
144
+ const pairKey = `${fromQualified} -> ${toQualified}`;
145
+ if (seenPairs.has(pairKey)) {
146
+ seamRaise("seam-duplicate", "already declared earlier in the manifest");
147
+ }
148
+ seenPairs.add(pairKey);
149
+ // A half-resolved seam still claims the endpoint it did resolve, so a typo on one side
150
+ // doesn't ALSO report the other side as dangling/unbound on top of the resolution error.
151
+ if (from)
152
+ consumedSurface.add(fromQualified);
153
+ if (to)
154
+ boundReactions.add(toQualified);
155
+ if (from && to) {
156
+ if (!declaredPairs.has(fromQualified))
157
+ declaredPairs.set(fromQualified, new Set());
158
+ declaredPairs.get(fromQualified).add(toQualified);
159
+ }
160
+ if (fromModel && toModel) {
161
+ const k = `${fromModel.modelKey} ${toModel.modelKey}`;
162
+ seamsByModelPair.set(k, (seamsByModelPair.get(k) ?? 0) + 1);
163
+ }
164
+ const hasError = codes.some((c) => SEAM_ERROR_CODES.has(c));
165
+ return {
166
+ from: fromQualified,
167
+ to: toQualified,
168
+ fromSlice: from ? qualify(from.modelKey, from.slice.key) : null,
169
+ toSlice: to ? qualify(to.modelKey, to.slice.key) : null,
170
+ description: seam.description,
171
+ status: hasError ? "error" : "verified",
172
+ diagnostics: codes,
173
+ };
174
+ });
175
+ // ---- Per-model surface + the two "other end missing" checks, manifest order. ----
176
+ const modelReports = models.map((m) => {
177
+ const publicSurface = [];
178
+ for (const slice of m.doc.model.slices) {
179
+ for (const el of slice.elements) {
180
+ if (!isSurface(el))
181
+ continue;
182
+ publicSurface.push(el.ref);
183
+ const q = qualify(m.key, el.ref);
184
+ if (!consumedSurface.has(q)) {
185
+ raise(m.file, "dangling-public-event", {
186
+ message: `public ${el.kind} "${el.name}" (${q}) is consumed by no declared seam — declare its reader, or drop \`public\``,
187
+ line: el.line,
188
+ refs: [q],
189
+ });
190
+ }
191
+ }
192
+ }
193
+ return { key: m.key, name: m.doc.model.name, source: m.source, sourceKind: m.sourceKind, owner: m.owner, publicSurface };
194
+ });
195
+ // "Externally fed" is computed from the export's own edge list, never re-derived: a reaction
196
+ // with no incoming edge in `model.edges` (no `from` view feeds it — pattern, `from`, or arrow)
197
+ // is fed from outside its model by construction. With no seam claiming it, nobody in the
198
+ // system says what feeds it.
199
+ for (const m of models) {
200
+ const fedInside = new Set(m.doc.model.edges.map((e) => e.to));
201
+ for (const slice of m.doc.model.slices) {
202
+ for (const el of slice.elements) {
203
+ if (!isReaction(el) || fedInside.has(el.ref))
204
+ continue;
205
+ const q = qualify(m.key, el.ref);
206
+ if (boundReactions.has(q))
207
+ continue;
208
+ raise(m.file, "unbound-translation", {
209
+ message: `${el.kind} "${el.name}" (${q}) has no in-model source and no seam feeds it — declare the seam whose \`to\` is this reaction, or add a \`from\``,
210
+ line: el.line,
211
+ refs: [q],
212
+ });
213
+ }
214
+ }
215
+ }
216
+ // The old portal heuristic, demoted: a public element in model A sharing its normalized
217
+ // name with a reaction or event in model B (B != A), with no seam between them.
218
+ for (const a of models) {
219
+ for (const aSlice of a.doc.model.slices) {
220
+ for (const el of aSlice.elements) {
221
+ if (!isSurface(el))
222
+ continue;
223
+ const aq = qualify(a.key, el.ref);
224
+ const wanted = normalizeName(el.name);
225
+ for (const b of models) {
226
+ if (b === a)
227
+ continue;
228
+ for (const bSlice of b.doc.model.slices) {
229
+ for (const other of bSlice.elements) {
230
+ const matchKind = isReaction(other) ? "reaction" : other.kind === "event" ? "event" : undefined;
231
+ if (!matchKind || normalizeName(other.name) !== wanted)
232
+ continue;
233
+ const bq = qualify(b.key, other.ref);
234
+ const declared = declaredPairs.get(aq);
235
+ const connected = matchKind === "reaction"
236
+ ? declared?.has(bq) === true
237
+ : [...(declared ?? [])].some((t) => t.startsWith(`${b.key}:`));
238
+ if (connected)
239
+ continue;
240
+ raise(a.file, "undeclared-seam-candidate", {
241
+ message: `public ${el.kind} "${el.name}" (${aq}) and ${other.kind} "${other.name}" (${bq}) look connected by name, ` +
242
+ "but no seam declares it — declare the seam or rename",
243
+ line: el.line,
244
+ refs: [aq, bq],
245
+ });
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ const contextMap = {
253
+ nodes: modelReports.map((m) => ({ key: m.key, name: m.name, owner: m.owner })),
254
+ edges: [...seamsByModelPair.entries()]
255
+ .map(([k, count]) => {
256
+ const [from, to] = k.split(" ");
257
+ return { from, to, seams: count };
258
+ })
259
+ .sort((x, y) => x.from.localeCompare(y.from) || x.to.localeCompare(y.to)),
260
+ };
261
+ return { name: manifest.name, models: modelReports, seams, contextMap, diagnostics };
262
+ }
263
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/system/verify.ts"],"names":[],"mappings":"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"}
package/dist/util/slug.js CHANGED
@@ -5,21 +5,27 @@
5
5
  // filenames (matches the skill's existing "kebab-case the slice name"
6
6
  // convention). These are distinct namespaces — do not conflate them.
7
7
  export function slug(name) {
8
- const s = name
9
- .trim()
10
- .toLowerCase()
11
- .replace(/[^a-z0-9]+/g, "_")
12
- .replace(/^_+|_+$/g, "");
8
+ const s = trimChar(name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_"), "_");
13
9
  return s || "n";
14
10
  }
15
11
  export function kebabSlug(name) {
16
- const s = name
17
- .trim()
18
- .toLowerCase()
19
- .replace(/[^a-z0-9]+/g, "-")
20
- .replace(/^-+|-+$/g, "");
12
+ const s = trimChar(name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-"), "-");
21
13
  return s || "n";
22
14
  }
15
+ /** Strip leading/trailing runs of `ch` — a linear scan rather than `/^-+|-+$/`, which CodeQL
16
+ * flags as polynomial (js/polynomial-redos) now that MIL-193's `@milehimikey/em/refs` subpath
17
+ * export makes `kebabSlug()` reachable from library input. (The preceding collapse leaves at
18
+ * most one separator per run, so it was never slow in practice; the scan is simply provably
19
+ * linear.) */
20
+ function trimChar(s, ch) {
21
+ let start = 0;
22
+ let end = s.length;
23
+ while (start < end && s[start] === ch)
24
+ start++;
25
+ while (end > start && s[end - 1] === ch)
26
+ end--;
27
+ return s.slice(start, end);
28
+ }
23
29
  /** Append a numeric suffix (`${sep}2`, `${sep}3`, ...) until `id` isn't in `used`. Adds the result to `used`. */
24
30
  export function dedupe(id, used, sep) {
25
31
  let candidate = id;
@@ -1 +1 @@
1
- {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/util/slug.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qEAAqE;AACrE,wEAAwE;AACxE,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI;SACX,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,GAAG,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,CAAC,GAAG,IAAI;SACX,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,GAAG,CAAC;AAClB,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,MAAM,CAAC,EAAU,EAAE,IAAiB,EAAE,GAAW;IAC/D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,SAAS,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpB,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/util/slug.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qEAAqE;AACrE,wEAAwE;AACxE,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,GAAG,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,GAAG,CAAC;AAClB,CAAC;AAED;;;;eAIe;AACf,SAAS,QAAQ,CAAC,CAAS,EAAE,EAAU;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,OAAO,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC;IAC/C,OAAO,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,CAAC;IAC/C,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,MAAM,CAAC,EAAU,EAAE,IAAiB,EAAE,GAAW;IAC/D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,SAAS,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpB,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milehimikey/em",
3
- "version": "1.9.1",
3
+ "version": "1.10.0",
4
4
  "description": "AI-friendly Event Modeling — a slice-first text DSL rendered to a strict, self-contained Graphviz grid (SVG/PNG)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,6 +8,14 @@
8
8
  "em-mcp": "./dist/mcp/main.js"
9
9
  },
10
10
  "main": "./dist/cli.js",
11
+ "exports": {
12
+ ".": "./dist/cli.js",
13
+ "./refs": {
14
+ "types": "./dist/model/qualifiedRef.d.ts",
15
+ "default": "./dist/model/qualifiedRef.js"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
11
19
  "files": [
12
20
  "dist",
13
21
  "README.md",
@@ -63,6 +71,7 @@
63
71
  "marked": "^18.0.0",
64
72
  "pdfkit": "^0.19.1",
65
73
  "svg-to-pdfkit": "^0.1.8",
74
+ "yaml": "^2.9.0",
66
75
  "zod": "^4.4.3"
67
76
  },
68
77
  "devDependencies": {