@milehimikey/em 1.5.0 → 1.6.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 +62 -17
- package/.claude/skills/event-modeling/reference/conform.md +33 -6
- package/.claude/skills/event-modeling/reference/em-dsl.md +144 -43
- package/.claude/skills/event-modeling/reference/extract.md +12 -2
- package/.claude/skills/event-modeling/reference/methodology.md +34 -14
- package/.claude/skills/event-modeling/templates/conformance-report.md +9 -7
- package/.claude/skills/event-modeling/templates/slice.md +6 -1
- package/.claude/skills/event-modeling/templates/state.md +8 -0
- package/README.md +1 -0
- package/dist/catalog/build.d.ts +33 -0
- package/dist/catalog/build.js +117 -0
- package/dist/catalog/build.js.map +1 -0
- package/dist/catalog/classify.d.ts +14 -0
- package/dist/catalog/classify.js +44 -0
- package/dist/catalog/classify.js.map +1 -0
- package/dist/catalog/pages.d.ts +45 -0
- package/dist/catalog/pages.js +174 -0
- package/dist/catalog/pages.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +10 -0
- package/dist/catalog/sliceDoc.js +20 -0
- package/dist/catalog/sliceDoc.js.map +1 -0
- package/dist/cli/catalog-inputs.d.ts +16 -0
- package/dist/cli/catalog-inputs.js +18 -0
- package/dist/cli/catalog-inputs.js.map +1 -0
- package/dist/cli/glossary-inputs.d.ts +15 -0
- package/dist/cli/glossary-inputs.js +17 -0
- package/dist/cli/glossary-inputs.js.map +1 -0
- package/dist/cli/render-inputs.d.ts +27 -0
- package/dist/cli/render-inputs.js +41 -0
- package/dist/cli/render-inputs.js.map +1 -0
- package/dist/cli.js +188 -10
- package/dist/cli.js.map +1 -1
- package/dist/emit/diffJson.d.ts +1 -1
- package/dist/emit/diffJson.js +8 -1
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/dot.d.ts +7 -0
- package/dist/emit/dot.js +10 -4
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/glossaryJson.d.ts +13 -0
- package/dist/emit/glossaryJson.js +36 -0
- package/dist/emit/glossaryJson.js.map +1 -0
- package/dist/emit/json.d.ts +16 -2
- package/dist/emit/json.js +57 -6
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/theme.d.ts +3 -0
- package/dist/emit/theme.js +19 -0
- package/dist/emit/theme.js.map +1 -1
- package/dist/model/diff.d.ts +36 -1
- package/dist/model/diff.js +198 -35
- package/dist/model/diff.js.map +1 -1
- package/dist/model/edges.d.ts +12 -1
- package/dist/model/edges.js +19 -8
- package/dist/model/edges.js.map +1 -1
- package/dist/model/glossary.d.ts +68 -0
- package/dist/model/glossary.js +138 -0
- package/dist/model/glossary.js.map +1 -0
- package/dist/model/model.d.ts +35 -0
- package/dist/model/model.js +41 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/validate.js +114 -3
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +20 -0
- package/dist/parser/parser.js +170 -31
- package/dist/parser/parser.js.map +1 -1
- package/dist/render/drawNotes.d.ts +7 -3
- package/dist/render/drawNotes.js +75 -28
- package/dist/render/drawNotes.js.map +1 -1
- package/dist/render/render.d.ts +20 -1
- package/dist/render/render.js +52 -14
- package/dist/render/render.js.map +1 -1
- package/dist/render/serve.js +155 -0
- package/dist/render/serve.js.map +1 -1
- package/dist/render/sliceDiagram.d.ts +11 -0
- package/dist/render/sliceDiagram.js +198 -0
- package/dist/render/sliceDiagram.js.map +1 -0
- package/dist/render/sliceOverlay.d.ts +21 -0
- package/dist/render/sliceOverlay.js +111 -0
- package/dist/render/sliceOverlay.js.map +1 -0
- package/dist/render/sliceStatus.d.ts +5 -0
- package/dist/render/sliceStatus.js +26 -0
- package/dist/render/sliceStatus.js.map +1 -0
- package/dist/render/statusOverlay.d.ts +16 -0
- package/dist/render/statusOverlay.js +110 -0
- package/dist/render/statusOverlay.js.map +1 -0
- package/dist/render/svgGeometry.d.ts +30 -0
- package/dist/render/svgGeometry.js +33 -14
- package/dist/render/svgGeometry.js.map +1 -1
- package/dist/render/watch.d.ts +1 -1
- package/dist/render/watch.js +5 -2
- package/dist/render/watch.js.map +1 -1
- package/package.json +3 -2
package/dist/emit/dot.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { NormalizedModel } from "../model/model.js";
|
|
2
2
|
import { Grid } from "../layout/grid.js";
|
|
3
|
+
export declare const HEADER_FILL = "#E3E7EB";
|
|
4
|
+
export declare const HEADER_BORDER = "#C7CDD4";
|
|
5
|
+
export declare const HEADER_FONT = "#1F2933";
|
|
3
6
|
export declare function emitDot(model: NormalizedModel, grid: Grid): string;
|
|
7
|
+
/** Node id of a row's swimlane label (leftmost column). Shared with the renderer
|
|
8
|
+
* so it can read the label column's rect for the storyboard viewer's slice
|
|
9
|
+
* overlay — see src/render/sliceOverlay.ts. */
|
|
10
|
+
export declare function rowLabelId(r: number): string;
|
package/dist/emit/dot.js
CHANGED
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
// lines instead of fighting Graphviz's global edge router.
|
|
13
13
|
import { headerCellId, nodeIdAt, placeholderId } from "../layout/grid.js";
|
|
14
14
|
import { styleFor } from "./theme.js";
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
// Exported: src/render/statusOverlay.ts matches/replaces these exact strings
|
|
16
|
+
// to recolor a header cell post-layout based on its slice's doc status.
|
|
17
|
+
export const HEADER_FILL = "#E3E7EB";
|
|
18
|
+
export const HEADER_BORDER = "#C7CDD4";
|
|
19
|
+
export const HEADER_FONT = "#1F2933";
|
|
17
20
|
// Every cell is the same width so columns are evenly spaced and the header row
|
|
18
21
|
// lines up with the element columns. Header width (pt) must match CELL_W (in).
|
|
19
22
|
const CELL_W = 2.0; // inches
|
|
@@ -109,7 +112,7 @@ function emptyCell(r, c) {
|
|
|
109
112
|
function headerCell(c, name) {
|
|
110
113
|
return (`${headerCellId(c)} [label=${q(wrapLabel(name, 20))}, shape=box, ` +
|
|
111
114
|
`style=filled, fillcolor="${HEADER_FILL}", color="${HEADER_BORDER}", ` +
|
|
112
|
-
`fontcolor="
|
|
115
|
+
`fontcolor="${HEADER_FONT}", fontname="Helvetica-Bold", fontsize=10, ` +
|
|
113
116
|
`fixedsize=true, width=${CELL_W}, height=${HEADER_H}, penwidth=1];`);
|
|
114
117
|
}
|
|
115
118
|
function columnChain(grid, col) {
|
|
@@ -119,7 +122,10 @@ function columnChain(grid, col) {
|
|
|
119
122
|
});
|
|
120
123
|
return ids.join(" -> ");
|
|
121
124
|
}
|
|
122
|
-
|
|
125
|
+
/** Node id of a row's swimlane label (leftmost column). Shared with the renderer
|
|
126
|
+
* so it can read the label column's rect for the storyboard viewer's slice
|
|
127
|
+
* overlay — see src/render/sliceOverlay.ts. */
|
|
128
|
+
export function rowLabelId(r) {
|
|
123
129
|
return `__row_${r}`;
|
|
124
130
|
}
|
|
125
131
|
/** Word-wrap long labels onto multiple lines for tidier boxes. */
|
package/dist/emit/dot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dot.js","sourceRoot":"","sources":["../../src/emit/dot.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6EAA6E;AAC7E,kFAAkF;AAClF,8EAA8E;AAC9E,mEAAmE;AACnE,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,2DAA2D;AAG3D,OAAO,EAAQ,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"dot.js","sourceRoot":"","sources":["../../src/emit/dot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Glossary, GlossaryConflict } from "../model/glossary.js";
|
|
2
|
+
export declare const GLOSSARY_SCHEMA_VERSION = "1.0";
|
|
3
|
+
/** One input file: what it was called on the command line, hashed source. */
|
|
4
|
+
export interface GlossaryFileSide {
|
|
5
|
+
label: string;
|
|
6
|
+
source: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Build the `em glossary --json` document. Pretty-printed (2-space), no
|
|
10
|
+
* trailing newline — the caller adds it, same convention as `buildExport`/
|
|
11
|
+
* `buildDiffJson`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildGlossaryJson(glossary: Glossary, conflicts: GlossaryConflict[], sources: GlossaryFileSide[]): string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Builds the `em glossary --json` document: a versioned, deterministic
|
|
3
|
+
// envelope around a `Glossary` + its `GlossaryConflict[]` (see
|
|
4
|
+
// ../model/glossary.ts). Its own `glossarySchemaVersion`, independent of `em
|
|
5
|
+
// export`'s `SCHEMA_VERSION` — a glossary is an N-model aggregate term
|
|
6
|
+
// dictionary, a different-shaped artifact than a single model's snapshot, and
|
|
7
|
+
// `em glossary` never reads or requires an existing `em export` document (it
|
|
8
|
+
// recompiles each input file itself, the same way `em diff` does).
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { GENERATOR_NAME, GENERATOR_VERSION } from "./json.js";
|
|
11
|
+
export const GLOSSARY_SCHEMA_VERSION = "1.0";
|
|
12
|
+
function serializeSide(side) {
|
|
13
|
+
return {
|
|
14
|
+
label: side.label,
|
|
15
|
+
sha256: createHash("sha256").update(side.source, "utf8").digest("hex"),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build the `em glossary --json` document. Pretty-printed (2-space), no
|
|
20
|
+
* trailing newline — the caller adds it, same convention as `buildExport`/
|
|
21
|
+
* `buildDiffJson`.
|
|
22
|
+
*/
|
|
23
|
+
export function buildGlossaryJson(glossary, conflicts, sources) {
|
|
24
|
+
const doc = {
|
|
25
|
+
glossarySchemaVersion: GLOSSARY_SCHEMA_VERSION,
|
|
26
|
+
generator: { name: GENERATOR_NAME, version: GENERATOR_VERSION },
|
|
27
|
+
models: sources.map(serializeSide),
|
|
28
|
+
elements: glossary.elements,
|
|
29
|
+
fields: glossary.fields,
|
|
30
|
+
personas: glossary.personas,
|
|
31
|
+
contexts: glossary.contexts,
|
|
32
|
+
conflicts,
|
|
33
|
+
};
|
|
34
|
+
return JSON.stringify(doc, null, 2);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=glossaryJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossaryJson.js","sourceRoot":"","sources":["../../src/emit/glossaryJson.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,uEAAuE;AACvE,+DAA+D;AAC/D,6EAA6E;AAC7E,uEAAuE;AACvE,8EAA8E;AAC9E,6EAA6E;AAC7E,mEAAmE;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9D,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAQ7C,SAAS,aAAa,CAAC,IAAsB;IAC3C,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KACvE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,SAA6B,EAC7B,OAA2B;IAE3B,MAAM,GAAG,GAAG;QACV,qBAAqB,EAAE,uBAAuB;QAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC/D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAClC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,SAAS;KACV,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/emit/json.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { NormalizedModel } from "../model/model.js";
|
|
|
2
2
|
import { Diagnostic } from "../model/validate.js";
|
|
3
3
|
export declare const GENERATOR_NAME = "@milehimikey/em";
|
|
4
4
|
export declare const GENERATOR_VERSION: string;
|
|
5
|
-
export declare const SCHEMA_VERSION = "1.
|
|
5
|
+
export declare const SCHEMA_VERSION = "1.3";
|
|
6
6
|
export interface ExportResult {
|
|
7
7
|
/** Pretty-printed JSON, no trailing newline. */
|
|
8
8
|
text: string;
|
|
@@ -14,6 +14,8 @@ export interface RefsResult {
|
|
|
14
14
|
sliceKeys: string[];
|
|
15
15
|
/** Internal `Element.id` -> stable export `ref`. */
|
|
16
16
|
refById: Map<string, string>;
|
|
17
|
+
/** Internal `TypeDecl.id` -> stable export `ref` (`types/<slug(name)>`). */
|
|
18
|
+
refByTypeId: Map<string, string>;
|
|
17
19
|
/** Ref-collision warnings raised while assigning keys/refs (duplicate names). */
|
|
18
20
|
diagnostics: Diagnostic[];
|
|
19
21
|
}
|
|
@@ -22,8 +24,20 @@ export interface RefsResult {
|
|
|
22
24
|
* export ref (`<sliceKey>/<kind>.<slug(name)>`), in document order, deduped
|
|
23
25
|
* with a `~2`, `~3`, … suffix on collision. Shared by `em export` (this
|
|
24
26
|
* module) and `em diff` (`src/model/diff.ts`), which both need the same
|
|
25
|
-
* edit-stable identity scheme to match elements/slices across models.
|
|
27
|
+
* edit-stable identity scheme to match elements/slices across models. Also
|
|
28
|
+
* assigns every declared type its export ref (`types/<slug(name)>`) — types
|
|
29
|
+
* aren't slice-scoped, so no sliceKey prefix, same dedup-with-warning
|
|
30
|
+
* machinery otherwise.
|
|
26
31
|
*/
|
|
27
32
|
export declare function computeRefs(model: NormalizedModel): RefsResult;
|
|
33
|
+
export interface FieldExport {
|
|
34
|
+
name: string;
|
|
35
|
+
type: string | null;
|
|
36
|
+
typeRef: {
|
|
37
|
+
name: string;
|
|
38
|
+
ref: string;
|
|
39
|
+
array: boolean;
|
|
40
|
+
} | null;
|
|
41
|
+
}
|
|
28
42
|
/** Build the `em export` document for an already-validated (error-free) model. */
|
|
29
43
|
export declare function buildExport(model: NormalizedModel, diagnostics: Diagnostic[], source: string, path: string): ExportResult;
|
package/dist/emit/json.js
CHANGED
|
@@ -11,20 +11,23 @@ import { createHash } from "node:crypto";
|
|
|
11
11
|
import { readFileSync } from "node:fs";
|
|
12
12
|
import { dirname, join } from "node:path";
|
|
13
13
|
import { fileURLToPath } from "node:url";
|
|
14
|
-
import { resolveByName } from "../model/model.js";
|
|
14
|
+
import { resolveByName, resolveTypeRef } from "../model/model.js";
|
|
15
15
|
import { dedupe, kebabSlug } from "../util/slug.js";
|
|
16
16
|
// Read once from package.json (two levels up from src/emit/ and dist/emit/
|
|
17
17
|
// alike) so `generator.version` can never drift from the released version.
|
|
18
18
|
// tsconfig targets NodeNext without resolveJsonModule, hence fs over import.
|
|
19
19
|
export const GENERATOR_NAME = "@milehimikey/em";
|
|
20
20
|
export const GENERATOR_VERSION = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json"), "utf8")).version;
|
|
21
|
-
export const SCHEMA_VERSION = "1.
|
|
21
|
+
export const SCHEMA_VERSION = "1.3";
|
|
22
22
|
/**
|
|
23
23
|
* Assign every slice its export key (`slug(name)`) and every element its
|
|
24
24
|
* export ref (`<sliceKey>/<kind>.<slug(name)>`), in document order, deduped
|
|
25
25
|
* with a `~2`, `~3`, … suffix on collision. Shared by `em export` (this
|
|
26
26
|
* module) and `em diff` (`src/model/diff.ts`), which both need the same
|
|
27
|
-
* edit-stable identity scheme to match elements/slices across models.
|
|
27
|
+
* edit-stable identity scheme to match elements/slices across models. Also
|
|
28
|
+
* assigns every declared type its export ref (`types/<slug(name)>`) — types
|
|
29
|
+
* aren't slice-scoped, so no sliceKey prefix, same dedup-with-warning
|
|
30
|
+
* machinery otherwise.
|
|
28
31
|
*/
|
|
29
32
|
export function computeRefs(model) {
|
|
30
33
|
const diagnostics = [];
|
|
@@ -62,11 +65,43 @@ export function computeRefs(model) {
|
|
|
62
65
|
refById.set(el.id, ref);
|
|
63
66
|
}
|
|
64
67
|
});
|
|
65
|
-
|
|
68
|
+
const usedTypeRefs = new Set();
|
|
69
|
+
const refByTypeId = new Map();
|
|
70
|
+
for (const t of model.types) {
|
|
71
|
+
const base = `types/${kebabSlug(t.name)}`;
|
|
72
|
+
const ref = dedupe(base, usedTypeRefs, "~");
|
|
73
|
+
if (ref !== base) {
|
|
74
|
+
diagnostics.push({
|
|
75
|
+
severity: "warning",
|
|
76
|
+
message: `duplicate type "${t.name}" (export ref "${base}" already used); rename for a stable export ref`,
|
|
77
|
+
line: t.line,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
refByTypeId.set(t.id, ref);
|
|
81
|
+
}
|
|
82
|
+
return { sliceKeys, refById, refByTypeId, diagnostics };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Export a single field, additively: `name`/`type` are exactly what today's consumers already
|
|
86
|
+
* see. `typeRef` is the new, purely-additive key — non-null only when `type` (bare or `[]`-
|
|
87
|
+
* suffixed) names a declared `type`, else `null`, same as every field in a model that declares
|
|
88
|
+
* no `type` blocks at all. Shared by both a declared type's own fields (`model.types[].fields`)
|
|
89
|
+
* and ordinary element fields (`model.slices[].elements[].fields`) so both get identical
|
|
90
|
+
* resolution.
|
|
91
|
+
*/
|
|
92
|
+
function fieldExport(f, typesByName, refByTypeId) {
|
|
93
|
+
const resolved = resolveTypeRef(f.type, typesByName);
|
|
94
|
+
return {
|
|
95
|
+
name: f.name,
|
|
96
|
+
type: f.type ?? null,
|
|
97
|
+
typeRef: resolved
|
|
98
|
+
? { name: resolved.typeDecl.name, ref: refByTypeId.get(resolved.typeDecl.id), array: resolved.array }
|
|
99
|
+
: null,
|
|
100
|
+
};
|
|
66
101
|
}
|
|
67
102
|
/** Build the `em export` document for an already-validated (error-free) model. */
|
|
68
103
|
export function buildExport(model, diagnostics, source, path) {
|
|
69
|
-
const { sliceKeys, refById, diagnostics: extra } = computeRefs(model);
|
|
104
|
+
const { sliceKeys, refById, refByTypeId, diagnostics: extra } = computeRefs(model);
|
|
70
105
|
const refOf = (id) => id ? refById.get(id) ?? null : null;
|
|
71
106
|
const fromOf = (el) => {
|
|
72
107
|
if (!el.from || el.from.length === 0)
|
|
@@ -82,23 +117,39 @@ export function buildExport(model, diagnostics, source, path) {
|
|
|
82
117
|
personas: model.personas,
|
|
83
118
|
contexts: model.contexts,
|
|
84
119
|
hasAutomation: model.hasAutomation,
|
|
120
|
+
// Declared named types (MIL-64) — independent of the slice timeline, so listed
|
|
121
|
+
// once here rather than nested inside any slice.
|
|
122
|
+
types: model.types.map((t) => ({
|
|
123
|
+
ref: refByTypeId.get(t.id),
|
|
124
|
+
name: t.name,
|
|
125
|
+
line: t.line,
|
|
126
|
+
fields: t.fields.map((f) => fieldExport(f, model.typesByName, refByTypeId)),
|
|
127
|
+
})),
|
|
85
128
|
slices: model.slices.map((slice, sliceIndex) => ({
|
|
86
129
|
key: sliceKeys[sliceIndex],
|
|
87
130
|
name: slice.name,
|
|
88
131
|
index: slice.index,
|
|
132
|
+
// Link to the ticket/conversation this slice traces back to (MIL-69).
|
|
133
|
+
// Distinct from the document's top-level `source` (the .em file's own
|
|
134
|
+
// path/sha256 provenance) — same key name, different scope.
|
|
135
|
+
source: slice.source ?? null,
|
|
89
136
|
line: slice.line,
|
|
90
137
|
elements: slice.elements.map((el) => ({
|
|
91
138
|
ref: refById.get(el.id),
|
|
92
139
|
kind: el.kind,
|
|
93
140
|
name: el.name,
|
|
94
141
|
line: el.line,
|
|
95
|
-
fields: el.fields
|
|
142
|
+
fields: el.fields
|
|
143
|
+
? el.fields.map((f) => fieldExport(f, model.typesByName, refByTypeId))
|
|
144
|
+
: null,
|
|
96
145
|
note: el.note ?? null,
|
|
97
146
|
issue: el.issue ?? null,
|
|
147
|
+
divergence: el.divergence ?? null,
|
|
98
148
|
from: fromOf(el),
|
|
99
149
|
persona: el.persona ?? null,
|
|
100
150
|
context: el.context ?? null,
|
|
101
151
|
again: el.again === true,
|
|
152
|
+
public: el.public === true,
|
|
102
153
|
logicalRef: el.kind === "view" && el.again === true ? refOf(el.logicalId) : null,
|
|
103
154
|
})),
|
|
104
155
|
})),
|
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,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/emit/json.ts"],"names":[],"mappings":"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"}
|
package/dist/emit/theme.d.ts
CHANGED
|
@@ -5,5 +5,8 @@ export interface NodeStyle {
|
|
|
5
5
|
fontColor: string;
|
|
6
6
|
}
|
|
7
7
|
export declare function styleFor(kind: ElementKind): NodeStyle;
|
|
8
|
+
/** Color for a slice's header cell given its doc's Status value (already
|
|
9
|
+
* lowercased by parseSliceDoc), or null to keep the default header color. */
|
|
10
|
+
export declare function statusStyle(status: string | null): NodeStyle | null;
|
|
8
11
|
/** Arrow colour keyed on the source element's kind. */
|
|
9
12
|
export declare function edgeColorFor(kind: ElementKind | undefined): string;
|
package/dist/emit/theme.js
CHANGED
|
@@ -13,6 +13,25 @@ const STYLES = {
|
|
|
13
13
|
export function styleFor(kind) {
|
|
14
14
|
return STYLES[kind];
|
|
15
15
|
}
|
|
16
|
+
// Slice-status colors — recognized values from the slice.md template's
|
|
17
|
+
// `- **Status:** {{draft | reviewed | ready-to-implement | implemented}}`
|
|
18
|
+
// (see src/catalog/sliceDoc.ts / .claude/skills/event-modeling/templates/slice.md).
|
|
19
|
+
// Deliberately reuses the element-kind palette above rather than inventing new
|
|
20
|
+
// hexes, so the diagram's color vocabulary stays small. `draft`, a missing doc,
|
|
21
|
+
// and any unrecognized string are NOT in this map on purpose — statusStyle()
|
|
22
|
+
// returns null for those and the caller keeps the existing neutral header gray
|
|
23
|
+
// (see HEADER_FILL/HEADER_BORDER in emit/dot.ts), since "no signal yet" and "not
|
|
24
|
+
// reviewed yet" both read the same visually.
|
|
25
|
+
const STATUS_STYLES = {
|
|
26
|
+
reviewed: STYLES.command,
|
|
27
|
+
"ready-to-implement": STYLES.event,
|
|
28
|
+
implemented: STYLES.view,
|
|
29
|
+
};
|
|
30
|
+
/** Color for a slice's header cell given its doc's Status value (already
|
|
31
|
+
* lowercased by parseSliceDoc), or null to keep the default header color. */
|
|
32
|
+
export function statusStyle(status) {
|
|
33
|
+
return status ? (STATUS_STYLES[status.toLowerCase()] ?? null) : null;
|
|
34
|
+
}
|
|
16
35
|
/** Arrow colour keyed on the source element's kind. */
|
|
17
36
|
export function edgeColorFor(kind) {
|
|
18
37
|
switch (kind) {
|
package/dist/emit/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/emit/theme.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qCAAqC;AAUrC,MAAM,MAAM,GAAmC;IAC7C,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IAChE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACrE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IAClE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACnE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACxE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACvE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IAClE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;CAC1E,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,IAAiB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAA6B;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/emit/theme.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qCAAqC;AAUrC,MAAM,MAAM,GAAmC;IAC7C,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IAChE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACrE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IAClE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACnE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACxE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IACvE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;IAClE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;CAC1E,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,IAAiB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,uEAAuE;AACvE,0EAA0E;AAC1E,oFAAoF;AACpF,+EAA+E;AAC/E,gFAAgF;AAChF,6EAA6E;AAC7E,+EAA+E;AAC/E,iFAAiF;AACjF,6CAA6C;AAC7C,MAAM,aAAa,GAA8B;IAC/C,QAAQ,EAAE,MAAM,CAAC,OAAO;IACxB,oBAAoB,EAAE,MAAM,CAAC,KAAK;IAClC,WAAW,EAAE,MAAM,CAAC,IAAI;CACzB,CAAC;AAEF;8EAC8E;AAC9E,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAA6B;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
package/dist/model/diff.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NormalizedModel } from "./model.js";
|
|
2
2
|
import { ElementKind } from "../parser/ast.js";
|
|
3
|
-
export type ChangeType = "slice-added" | "slice-removed" | "element-added" | "element-removed" | "element-moved" | "field-added" | "field-removed" | "field-changed" | "from-added" | "from-removed" | "note-added" | "note-removed" | "note-changed" | "issue-opened" | "issue-resolved" | "issue-changed" | "arrow-added" | "arrow-removed";
|
|
3
|
+
export type ChangeType = "slice-added" | "slice-removed" | "source-added" | "source-removed" | "source-changed" | "element-added" | "element-removed" | "element-moved" | "field-added" | "field-removed" | "field-changed" | "from-added" | "from-removed" | "note-added" | "note-removed" | "note-changed" | "issue-opened" | "issue-resolved" | "issue-changed" | "event-marked-public" | "event-unmarked-public" | "arrow-added" | "arrow-removed" | "type-added" | "type-removed" | "type-field-added" | "type-field-removed" | "type-field-changed";
|
|
4
4
|
/**
|
|
5
5
|
* One reported change. Not every field applies to every `type` — see
|
|
6
6
|
* formatEntry() for which fields each variant reads.
|
|
@@ -9,24 +9,48 @@ export interface ChangeEntry {
|
|
|
9
9
|
type: ChangeType;
|
|
10
10
|
kind?: ElementKind;
|
|
11
11
|
name?: string;
|
|
12
|
+
/** This entry's `em export` element/type ref (`<sliceKey>/<kind>.<slug>` or `types/<slug>`)
|
|
13
|
+
* — lets a JSON consumer join back to an `em export` document without re-deriving the
|
|
14
|
+
* slug. Undefined for change types with no single ref (`slice-added/removed`, `source-*`,
|
|
15
|
+
* `arrow-*`). */
|
|
16
|
+
ref?: string;
|
|
12
17
|
sliceName?: string;
|
|
18
|
+
/** This entry's `em export` slice key. Undefined for types (not slice-scoped) and arrows. */
|
|
19
|
+
sliceKey?: string;
|
|
13
20
|
fromSlice?: string;
|
|
21
|
+
/** `fromSlice`'s `em export` slice key, for `element-moved` only. */
|
|
22
|
+
fromSliceKey?: string;
|
|
14
23
|
toSlice?: string;
|
|
24
|
+
/** `toSlice`'s `em export` slice key, for `element-moved` only. */
|
|
25
|
+
toSliceKey?: string;
|
|
15
26
|
field?: string;
|
|
16
27
|
fieldType?: string | null;
|
|
17
28
|
oldType?: string | null;
|
|
18
29
|
newType?: string | null;
|
|
19
30
|
source?: string;
|
|
31
|
+
oldSource?: string;
|
|
32
|
+
newSource?: string;
|
|
20
33
|
oldNote?: string;
|
|
21
34
|
newNote?: string;
|
|
22
35
|
oldText?: string;
|
|
23
36
|
newText?: string;
|
|
24
37
|
from?: string;
|
|
25
38
|
to?: string;
|
|
39
|
+
/**
|
|
40
|
+
* The canonical (old-side) element's `divergence` annotation, when this change/removal
|
|
41
|
+
* involves an element that carries one — not a suppression, a citation: the finding is
|
|
42
|
+
* still reported in full, annotated with the reasoned, ratified deviation a consumer (e.g.
|
|
43
|
+
* the conform loop) can use to classify it as accepted rather than real drift. `null` when
|
|
44
|
+
* the involved element (if any) carries no annotation, or when the change type has no
|
|
45
|
+
* single canonical-side element to check (`slice-added/removed`, `arrow-added/removed`,
|
|
46
|
+
* `element-added`, `element-moved` — out of scope for v1, see model.ts's `divergence` doc).
|
|
47
|
+
*/
|
|
48
|
+
acceptedDivergence?: string | null;
|
|
26
49
|
}
|
|
27
50
|
export interface DiffCounts {
|
|
28
51
|
slicesAdded: number;
|
|
29
52
|
slicesRemoved: number;
|
|
53
|
+
sourceChanges: number;
|
|
30
54
|
elementsAdded: number;
|
|
31
55
|
elementsRemoved: number;
|
|
32
56
|
elementsMoved: number;
|
|
@@ -36,8 +60,19 @@ export interface DiffCounts {
|
|
|
36
60
|
issuesOpened: number;
|
|
37
61
|
issuesResolved: number;
|
|
38
62
|
issuesChanged: number;
|
|
63
|
+
eventsMarkedPublic: number;
|
|
64
|
+
eventsUnmarkedPublic: number;
|
|
39
65
|
arrowsAdded: number;
|
|
40
66
|
arrowsRemoved: number;
|
|
67
|
+
/** Changes/removals whose `acceptedDivergence` is non-null — cited, not subtracted, from
|
|
68
|
+
* the other counts above (an element-removed with an accepted divergence still counts
|
|
69
|
+
* toward `elementsRemoved` too; this is a cross-cutting tally, not a separate bucket). */
|
|
70
|
+
acceptedDivergences: number;
|
|
71
|
+
/** Declared `type` (MIL-64) additions/removals and field changes on surviving types. No
|
|
72
|
+
* move detection — types aren't slice-scoped, so there's nothing to move between. */
|
|
73
|
+
typesAdded: number;
|
|
74
|
+
typesRemoved: number;
|
|
75
|
+
typeFieldChanges: number;
|
|
41
76
|
}
|
|
42
77
|
export interface ModelDiff {
|
|
43
78
|
/** Additions and changes, in new-file document order. */
|