@milehimikey/em 1.13.1 → 1.14.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.
- package/.claude/agents/em-critic.md +26 -0
- package/.claude/agents/em-implementer.md +34 -0
- package/.claude/agents/em-reviewer.md +31 -0
- package/.claude/agents/em-validator.md +27 -0
- package/.claude/skills/event-modeling/SKILL.md +50 -11
- package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
- package/.claude/skills/event-modeling-design/SKILL.md +126 -18
- package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
- package/.claude/skills/event-modeling-engagement/SKILL.md +192 -0
- package/.claude/skills/event-modeling-engagement/reference/engagement.md +143 -0
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +38 -11
- package/.claude/skills/event-modeling-review/SKILL.md +1 -1
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +274 -189
- package/.claude/skills/event-modeling-shared/reference/operating-principles.md +61 -0
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +108 -5
- package/.claude/skills/event-modeling-shared/templates/constitution.md +18 -1
- package/.claude/skills/event-modeling-shared/templates/slice.md +64 -39
- package/.claude/skills/event-modeling-shared/templates/state.md +5 -1
- package/.claude-plugin/marketplace.json +14 -0
- package/README.md +25 -11
- package/dist/catalog/apiFirst.d.ts +28 -0
- package/dist/catalog/apiFirst.js +49 -0
- package/dist/catalog/apiFirst.js.map +1 -0
- package/dist/catalog/docJoin.d.ts +13 -0
- package/dist/catalog/docJoin.js +11 -0
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.js +44 -4
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/invariantsValidate.d.ts +4 -0
- package/dist/catalog/invariantsValidate.js +102 -0
- package/dist/catalog/invariantsValidate.js.map +1 -0
- package/dist/catalog/scenarios.d.ts +15 -0
- package/dist/catalog/scenarios.js +97 -0
- package/dist/catalog/scenarios.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +8 -0
- package/dist/catalog/sliceDoc.js +9 -0
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +31 -4
- package/dist/catalog/sliceReadyValidate.js +66 -8
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/catalog/sliceSections.d.ts +55 -0
- package/dist/catalog/sliceSections.js +317 -0
- package/dist/catalog/sliceSections.js.map +1 -0
- package/dist/cli/agentsMd.js +7 -1
- package/dist/cli/agentsMd.js.map +1 -1
- package/dist/cli/api.d.ts +90 -0
- package/dist/cli/api.js +318 -0
- package/dist/cli/api.js.map +1 -0
- package/dist/cli/ciInit.d.ts +82 -21
- package/dist/cli/ciInit.js +468 -64
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/conformScope.d.ts +28 -0
- package/dist/cli/conformScope.js +67 -0
- package/dist/cli/conformScope.js.map +1 -1
- package/dist/cli/coverage.d.ts +9 -0
- package/dist/cli/coverage.js +60 -8
- package/dist/cli/coverage.js.map +1 -1
- package/dist/cli/engagement.d.ts +210 -0
- package/dist/cli/engagement.js +444 -0
- package/dist/cli/engagement.js.map +1 -0
- package/dist/cli/engagementFile.d.ts +86 -0
- package/dist/cli/engagementFile.js +255 -0
- package/dist/cli/engagementFile.js.map +1 -0
- package/dist/cli/metrics.d.ts +10 -0
- package/dist/cli/metrics.js +49 -1
- package/dist/cli/metrics.js.map +1 -1
- package/dist/cli/pluginPin.d.ts +55 -0
- package/dist/cli/pluginPin.js +188 -0
- package/dist/cli/pluginPin.js.map +1 -0
- package/dist/cli/ratify.d.ts +27 -2
- package/dist/cli/ratify.js +112 -13
- package/dist/cli/ratify.js.map +1 -1
- package/dist/cli/reratify.d.ts +3 -2
- package/dist/cli/reratify.js +36 -14
- package/dist/cli/reratify.js.map +1 -1
- package/dist/cli/scopeInputs.d.ts +48 -0
- package/dist/cli/scopeInputs.js +176 -0
- package/dist/cli/scopeInputs.js.map +1 -0
- package/dist/cli/skillCheck.d.ts +15 -1
- package/dist/cli/skillCheck.js +22 -1
- package/dist/cli/skillCheck.js.map +1 -1
- package/dist/cli/skillDirs.d.ts +5 -0
- package/dist/cli/skillDirs.js +13 -1
- package/dist/cli/skillDirs.js.map +1 -1
- package/dist/cli/skillSync.d.ts +4 -0
- package/dist/cli/skillSync.js +23 -0
- package/dist/cli/skillSync.js.map +1 -1
- package/dist/cli/sliceNew.d.ts +11 -7
- package/dist/cli/sliceNew.js +91 -18
- package/dist/cli/sliceNew.js.map +1 -1
- package/dist/cli/sliceSync.d.ts +50 -0
- package/dist/cli/sliceSync.js +170 -0
- package/dist/cli/sliceSync.js.map +1 -0
- package/dist/cli/status.d.ts +24 -1
- package/dist/cli/status.js +20 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/systemInputs.d.ts +53 -10
- package/dist/cli/systemInputs.js +186 -11
- package/dist/cli/systemInputs.js.map +1 -1
- package/dist/cli/upgrade.d.ts +16 -3
- package/dist/cli/upgrade.js +366 -30
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli/usageLog.d.ts +4 -2
- package/dist/cli/usageLog.js +4 -2
- package/dist/cli/usageLog.js.map +1 -1
- package/dist/cli.js +554 -94
- package/dist/cli.js.map +1 -1
- package/dist/emit/api.d.ts +29 -0
- package/dist/emit/api.js +220 -0
- package/dist/emit/api.js.map +1 -0
- package/dist/emit/apiCheckJson.d.ts +3 -0
- package/dist/emit/apiCheckJson.js +21 -0
- package/dist/emit/apiCheckJson.js.map +1 -0
- package/dist/emit/codeownersJson.d.ts +3 -0
- package/dist/emit/codeownersJson.js +19 -0
- package/dist/emit/codeownersJson.js.map +1 -0
- 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/engagementJson.d.ts +8 -0
- package/dist/emit/engagementJson.js +46 -0
- package/dist/emit/engagementJson.js.map +1 -0
- package/dist/emit/glossaryJson.d.ts +1 -1
- package/dist/emit/glossaryJson.js +4 -1
- package/dist/emit/glossaryJson.js.map +1 -1
- package/dist/emit/json.d.ts +17 -1
- package/dist/emit/json.js +30 -1
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/metricsJson.d.ts +1 -1
- package/dist/emit/metricsJson.js +4 -1
- package/dist/emit/metricsJson.js.map +1 -1
- package/dist/emit/queryJson.d.ts +1 -1
- package/dist/emit/queryJson.js +7 -1
- package/dist/emit/queryJson.js.map +1 -1
- package/dist/emit/scopeJson.d.ts +12 -0
- package/dist/emit/scopeJson.js +26 -0
- package/dist/emit/scopeJson.js.map +1 -0
- package/dist/emit/skillCheckJson.d.ts +3 -2
- package/dist/emit/skillCheckJson.js +10 -2
- package/dist/emit/skillCheckJson.js.map +1 -1
- package/dist/emit/statusJson.d.ts +1 -1
- package/dist/emit/statusJson.js +15 -1
- package/dist/emit/statusJson.js.map +1 -1
- package/dist/emit/systemJson.d.ts +15 -8
- package/dist/emit/systemJson.js +28 -13
- package/dist/emit/systemJson.js.map +1 -1
- package/dist/emit/validateJson.d.ts +3 -3
- package/dist/emit/validateJson.js +10 -4
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +163 -31
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/diff.d.ts +4 -1
- package/dist/model/diff.js +44 -8
- package/dist/model/diff.js.map +1 -1
- package/dist/model/glossary.d.ts +2 -0
- package/dist/model/glossary.js +1 -0
- package/dist/model/glossary.js.map +1 -1
- package/dist/model/model.d.ts +55 -2
- package/dist/model/model.js +57 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/qualifiedRef.d.ts +18 -0
- package/dist/model/qualifiedRef.js +26 -0
- package/dist/model/qualifiedRef.js.map +1 -1
- package/dist/model/queryIndex.d.ts +9 -1
- package/dist/model/queryIndex.js +18 -2
- package/dist/model/queryIndex.js.map +1 -1
- package/dist/model/rules.d.ts +143 -2
- package/dist/model/rules.js +162 -3
- package/dist/model/rules.js.map +1 -1
- package/dist/model/validate.d.ts +40 -0
- package/dist/model/validate.js +147 -1
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +31 -3
- package/dist/parser/parser.js +148 -14
- package/dist/parser/parser.js.map +1 -1
- package/dist/query/format.js +1 -1
- package/dist/query/format.js.map +1 -1
- package/dist/query/verbs.d.ts +6 -0
- package/dist/query/verbs.js +6 -2
- package/dist/query/verbs.js.map +1 -1
- package/dist/system/adaptation.d.ts +14 -0
- package/dist/system/adaptation.js +49 -0
- package/dist/system/adaptation.js.map +1 -0
- package/dist/system/codeowners.d.ts +77 -0
- package/dist/system/codeowners.js +242 -0
- package/dist/system/codeowners.js.map +1 -0
- package/dist/system/manifest.d.ts +10 -5
- package/dist/system/manifest.js +54 -26
- package/dist/system/manifest.js.map +1 -1
- package/dist/system/migrateManifest.d.ts +28 -0
- package/dist/system/migrateManifest.js +155 -0
- package/dist/system/migrateManifest.js.map +1 -0
- package/dist/system/scope.d.ts +46 -0
- package/dist/system/scope.js +132 -0
- package/dist/system/scope.js.map +1 -0
- package/dist/system/verify.d.ts +50 -13
- package/dist/system/verify.js +179 -58
- package/dist/system/verify.js.map +1 -1
- package/dist/templates.d.ts +2 -2
- package/dist/templates.js +23 -2
- package/dist/templates.js.map +1 -1
- package/package.json +5 -2
- package/plugin/.claude-plugin/plugin.json +18 -0
- package/plugin/agents/em-critic.md +27 -0
- package/plugin/agents/em-implementer.md +35 -0
- package/plugin/agents/em-reviewer.md +32 -0
- package/plugin/agents/em-validator.md +28 -0
- package/plugin/shared/reference/em-dsl.md +866 -0
- package/plugin/shared/reference/methodology.md +329 -0
- package/plugin/shared/reference/operating-principles.md +222 -0
- package/plugin/shared/reference/slice-doc-schema.md +566 -0
- package/plugin/shared/templates/conformance-report.md +85 -0
- package/plugin/shared/templates/constitution.md +136 -0
- package/plugin/shared/templates/model-readme.md +46 -0
- package/plugin/shared/templates/slice.md +251 -0
- package/plugin/shared/templates/state.md +77 -0
- package/plugin/skills/conform/SKILL.md +93 -0
- package/plugin/skills/conform/reference/conform.md +428 -0
- package/plugin/skills/design/SKILL.md +297 -0
- package/plugin/skills/discover/SKILL.md +90 -0
- package/plugin/skills/discover/reference/extract.md +147 -0
- package/plugin/skills/engagement/SKILL.md +193 -0
- package/plugin/skills/engagement/reference/engagement.md +144 -0
- package/plugin/skills/event-modeling/SKILL.md +132 -0
- package/plugin/skills/implement/SKILL.md +61 -0
- package/plugin/skills/implement/reference/implement.md +439 -0
- package/plugin/skills/review/SKILL.md +74 -0
- package/dist/emit/typespec.d.ts +0 -26
- package/dist/emit/typespec.js +0 -356
- package/dist/emit/typespec.js.map +0 -1
|
@@ -12,189 +12,228 @@ Keep `.em` files focused on **structure**; put deep design in markdown linked vi
|
|
|
12
12
|
|
|
13
13
|
<!-- GENERATED:cli:start -- run `npm run docs:generate` to refresh, do not hand-edit -->
|
|
14
14
|
```bash
|
|
15
|
-
em --version
|
|
16
|
-
em init [file]
|
|
17
|
-
em init [file] -f, --force
|
|
18
|
-
em scaffold <name>
|
|
19
|
-
em scaffold <name> -f, --force
|
|
20
|
-
em scaffold <name> --under <dir>
|
|
21
|
-
em render <file>
|
|
22
|
-
em render <file> -o, --out <path>
|
|
23
|
-
em render <file> -T, --format <fmt>
|
|
24
|
-
em render <file> --slice <name>
|
|
25
|
-
em render <file> --emit-dot
|
|
26
|
-
em render <file> --keep-empty-lanes
|
|
27
|
-
em export <file>
|
|
28
|
-
em export <file> -o, --out <path>
|
|
29
|
-
em export <file> --slice <key>
|
|
30
|
-
em
|
|
31
|
-
em
|
|
32
|
-
em
|
|
33
|
-
em
|
|
34
|
-
em
|
|
35
|
-
em
|
|
36
|
-
em
|
|
37
|
-
em
|
|
38
|
-
em
|
|
39
|
-
em
|
|
40
|
-
em
|
|
41
|
-
em
|
|
42
|
-
em
|
|
43
|
-
em
|
|
44
|
-
em
|
|
45
|
-
em
|
|
46
|
-
em
|
|
47
|
-
em
|
|
48
|
-
em
|
|
49
|
-
em
|
|
50
|
-
em
|
|
51
|
-
em
|
|
52
|
-
em
|
|
53
|
-
em slice
|
|
54
|
-
em slice
|
|
55
|
-
em slice
|
|
56
|
-
em slice
|
|
57
|
-
em slice
|
|
58
|
-
em slice
|
|
59
|
-
em slice
|
|
60
|
-
em slice
|
|
61
|
-
em slice
|
|
62
|
-
em slice
|
|
63
|
-
em slice
|
|
64
|
-
em slice
|
|
65
|
-
em slice
|
|
66
|
-
em slice
|
|
67
|
-
em slice
|
|
68
|
-
em slice
|
|
69
|
-
em slice
|
|
70
|
-
em slice
|
|
71
|
-
em slice
|
|
72
|
-
em slice
|
|
73
|
-
em
|
|
74
|
-
em
|
|
75
|
-
em
|
|
76
|
-
em
|
|
77
|
-
em
|
|
78
|
-
em
|
|
79
|
-
em
|
|
80
|
-
em
|
|
81
|
-
em
|
|
82
|
-
em
|
|
83
|
-
em
|
|
84
|
-
em
|
|
85
|
-
em
|
|
86
|
-
em
|
|
87
|
-
em
|
|
88
|
-
em
|
|
89
|
-
em
|
|
90
|
-
em
|
|
91
|
-
em
|
|
92
|
-
em
|
|
93
|
-
em
|
|
94
|
-
em
|
|
95
|
-
em
|
|
96
|
-
em
|
|
97
|
-
em
|
|
98
|
-
em
|
|
99
|
-
em
|
|
100
|
-
em
|
|
101
|
-
em
|
|
102
|
-
em
|
|
103
|
-
em
|
|
104
|
-
em
|
|
105
|
-
em
|
|
106
|
-
em
|
|
107
|
-
em
|
|
108
|
-
em
|
|
109
|
-
em
|
|
110
|
-
em
|
|
111
|
-
em
|
|
112
|
-
em
|
|
113
|
-
em
|
|
114
|
-
em
|
|
115
|
-
em
|
|
116
|
-
em
|
|
117
|
-
em
|
|
118
|
-
em
|
|
119
|
-
em
|
|
120
|
-
em
|
|
121
|
-
em
|
|
122
|
-
em
|
|
123
|
-
em
|
|
124
|
-
em
|
|
125
|
-
em
|
|
126
|
-
em
|
|
127
|
-
em
|
|
128
|
-
em
|
|
129
|
-
em
|
|
130
|
-
em
|
|
131
|
-
em
|
|
132
|
-
em
|
|
133
|
-
em
|
|
134
|
-
em
|
|
135
|
-
em
|
|
136
|
-
em
|
|
137
|
-
em
|
|
138
|
-
em
|
|
139
|
-
em
|
|
140
|
-
em
|
|
141
|
-
em
|
|
142
|
-
em
|
|
143
|
-
em
|
|
144
|
-
em
|
|
145
|
-
em
|
|
146
|
-
em
|
|
147
|
-
em
|
|
148
|
-
em
|
|
149
|
-
em
|
|
150
|
-
em
|
|
151
|
-
em
|
|
152
|
-
em
|
|
153
|
-
em
|
|
154
|
-
em
|
|
155
|
-
em
|
|
156
|
-
em
|
|
157
|
-
em
|
|
158
|
-
em
|
|
159
|
-
em query
|
|
160
|
-
em query
|
|
161
|
-
em query
|
|
162
|
-
em query
|
|
163
|
-
em query
|
|
164
|
-
em query
|
|
165
|
-
em query
|
|
166
|
-
em query
|
|
167
|
-
em query
|
|
168
|
-
em query
|
|
169
|
-
em query
|
|
170
|
-
em query
|
|
171
|
-
em query
|
|
172
|
-
em query
|
|
173
|
-
em query
|
|
174
|
-
em query
|
|
175
|
-
em query
|
|
176
|
-
em query
|
|
177
|
-
em query
|
|
178
|
-
em query
|
|
179
|
-
em
|
|
180
|
-
em
|
|
181
|
-
em
|
|
182
|
-
em
|
|
183
|
-
em
|
|
184
|
-
em
|
|
185
|
-
em
|
|
186
|
-
em
|
|
187
|
-
em
|
|
188
|
-
em
|
|
189
|
-
em
|
|
190
|
-
em
|
|
191
|
-
em
|
|
192
|
-
em
|
|
193
|
-
em
|
|
194
|
-
em
|
|
195
|
-
em
|
|
196
|
-
em
|
|
197
|
-
em
|
|
15
|
+
em --version # print the installed em version
|
|
16
|
+
em init [file] # scaffold a starter .em model
|
|
17
|
+
em init [file] -f, --force # overwrite if the file exists
|
|
18
|
+
em scaffold <name> # scaffold a full project: <slug>/<slug>.em, README.md, .event-modeling.md, and constitution.md (the implementation constitution — skipped, with a note, in a spec-kit project, where `.specify/memory/constitution.md` IS that document) (see docs/cli.md — for just a starter .em, use `em init`; for a multi-model project, pass --under to nest it under a shared parent directory)
|
|
19
|
+
em scaffold <name> -f, --force # overwrite the directory's contents if it already exists
|
|
20
|
+
em scaffold <name> --under <dir> # parent directory to scaffold into — writes <dir>/<slug>/ instead of ./<slug>/, the supported multi-model layout (docs/cli.md, "Multi-model projects"): one directory per model, so each model's slices/ never collides with a sibling model's
|
|
21
|
+
em render <file> # transpile a model and render it (or emit DOT)
|
|
22
|
+
em render <file> -o, --out <path> # output path (extension picks the format)
|
|
23
|
+
em render <file> -T, --format <fmt> # output format (svg, png, pdf, ...)
|
|
24
|
+
em render <file> --slice <name> # render only this slice, redrawn in its own canonical pattern shape (default out: slices/<kebab-slug>.svg)
|
|
25
|
+
em render <file> --emit-dot # print the generated DOT instead of rendering
|
|
26
|
+
em render <file> --keep-empty-lanes # keep the API lane even when empty
|
|
27
|
+
em export <file> # export a versioned JSON snapshot of the normalized model
|
|
28
|
+
em export <file> -o, --out <path> # write to a file instead of stdout
|
|
29
|
+
em export <file> --slice <key> # export only this slice's object (pattern/fields/doc) instead of the whole model (export key, MIL-128) — refuses only if THIS slice has an error; an unrelated slice's breakage elsewhere in the model doesn't block it (see docs/cli.md)
|
|
30
|
+
em api generate <file> # write the TypeSpec contract for the model's public commands, events and views to <model dir>/contracts/<model key>.tsp
|
|
31
|
+
em api generate <file> -o, --out <path> # write to this path instead of <model dir>/contracts/<model key>.tsp
|
|
32
|
+
em api generate <file> --stdout # print the contract instead of writing it
|
|
33
|
+
em api check <file> # is the committed contract current? With --base, annotate each public-surface change since that revision additive or breaking (annotation only — exits 1 only when stale)
|
|
34
|
+
em api check <file> --base <rev> # git revision to diff the public surface against
|
|
35
|
+
em api check <file> --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
36
|
+
em typespec <file> # DEPRECATED alias of `em api generate --stdout` (use em api generate)
|
|
37
|
+
em typespec <file> -o, --out <path> # write to a file instead of stdout
|
|
38
|
+
em diff <old> [new] # compare two models structurally (two files, or one file across git revisions)
|
|
39
|
+
em diff <old> [new] --from <rev> # diff <old> against this git revision instead of a second file
|
|
40
|
+
em diff <old> [new] --to <rev> # diff against this git revision instead of the current file (requires --from)
|
|
41
|
+
em diff <old> [new] --exit-code # exit 1 if the models differ, 0 if identical (git-diff convention)
|
|
42
|
+
em diff <old> [new] --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
43
|
+
em glossary <files> # cross-model glossary of terms, with consistency checks across models (see docs/cli.md)
|
|
44
|
+
em glossary <files> --json # print the full glossary document instead of the text report
|
|
45
|
+
em glossary <files> -o, --out <path> # write the JSON document to a file instead of stdout (requires --json)
|
|
46
|
+
em glossary <files> --list-conflicts # print only the conflict lines, no summary
|
|
47
|
+
em glossary <files> --fail-on-conflicts # exit non-zero if any cross-model term conflicts were found (opt-in — conflicts are warnings and don't block by default)
|
|
48
|
+
em catalog <files> # generate a browsable static HTML catalog site over one or more .em models (see docs/cli.md)
|
|
49
|
+
em catalog <files> -o, --out <dir> # output directory
|
|
50
|
+
em catalog <files> -T, --format <fmt> # diagram format embedded in the catalog (svg or png)
|
|
51
|
+
em catalog <files> --title <text> # catalog site title
|
|
52
|
+
em catalog <files> --keep-empty-lanes # keep the API lane even when empty
|
|
53
|
+
em slice new <name> # scaffold a fresh slices/<key>.md doc — the 5 frontmatter keys required at `status: draft`, the `# Slice:` heading and diagram-image stub, then every template section: the generated regions (command/event/view field tables, Invariants) filled from the model with --wire (template placeholders otherwise — `em slice sync` fills them), the authored sections (Intent, Scenarios, Open Questions, ...) with placeholder bullets (see .claude/skills/event-modeling-shared/reference/slice-doc-schema.md, templates/slice.md)
|
|
54
|
+
em slice new <name> --pattern <pattern> # slice pattern: state-change | state-view | automation | translation
|
|
55
|
+
em slice new <name> --swimlane <swimlane> # swimlane, e.g. "Persona → Context"
|
|
56
|
+
em slice new <name> -f, --force # overwrite the file if it already exists
|
|
57
|
+
em slice new <name> --wire <model-file> # also insert the `note "slices/<key>.md"` line onto the slice's primary element in this .em file (matched by export key), instead of just printing it to paste by hand (MIL-161)
|
|
58
|
+
em slice new <name> --stub # write a near-free stub instead: same 5 frontmatter keys, but a one-line placeholder body instead of the diagram-image stub and every judgment section (MIL-184) — deepen it later by re-running without --stub and -f
|
|
59
|
+
em slice sync <model-file> [key] # regenerate the GENERATED regions (command/event/view field tables, the Invariants list) of existing slice docs in place from the model, authored sections untouched (MIL-266); docs without regions are skipped with a note. --check never writes and exits 1 when a doc is stale
|
|
60
|
+
em slice sync <model-file> [key] --check # report ok / stale / no-regions per doc without writing; exit 1 when any is stale
|
|
61
|
+
em slice sync <model-file> [key] --json # print the machine-readable report (sliceSyncSchemaVersion 1.0)
|
|
62
|
+
em slice stub-all <file> # scaffold + wire a near-free stub (`em slice new --stub`'s content, MIL-184) for every slice in <file> with no resolvable doc — the fast path to status coloring for an exploratory/backbone model without hand-running `slice new` per slice. Skips a continuation slice (MIL-208, it has no doc of its own), an already-documented slice, and a slice whose pattern can't be classified
|
|
63
|
+
em slice stub-all <file> --status <status> # target status for every stub: draft | reviewed | ready-to-implement | implemented
|
|
64
|
+
em slice stub-all <file> --by <name> # identity for reviewedBy/ratifiedBy — required unless --status draft
|
|
65
|
+
em slice stub-all <file> --implemented-in <url> # PR/commit URL for implementedIn — required with --status implemented
|
|
66
|
+
em slice stub-all <file> --dry-run # list what would be stubbed/wired without writing anything
|
|
67
|
+
em slice index <file> # rewrite the model's sibling README.md's GENERATED Slices table from `em export`'s slice facts (key, pattern, doc status/implementedIn) — the hand-maintained table is deprecated
|
|
68
|
+
em slice index <file> --check # verify the table is current; exit non-zero on drift without writing (CI)
|
|
69
|
+
em slice mark-implemented <file> <slice-key> <pr-url> # flip a slice doc's frontmatter to `status: implemented` / `implementedIn: <pr-url>` — the one edit an implementing agent makes to a ratified doc at merge (MIL-103, replaces the em-sdd-bridge `em-sdd-mark-implemented` script; see reference/implement.md §6). Idempotent on the same URL; refuses to overwrite a different one; never touches `version:` or the doc body
|
|
70
|
+
em slice review <file> <slice-key> # flip a slice doc's frontmatter to `status: reviewed` and record `reviewedBy:`/`reviewedOn:` — the FIRST of the two human gates (MIL-201, docs/process.md#the-slice-lifecycle-gates): the room walked this slice and every open question it raised is resolved. Ratification is a separate, later gate (`em slice ratify`). Legal from `status: draft`; idempotent on the same --by/--on pair; refuses to overwrite a different one already recorded; refuses a doc already `ready-to-implement`/`implemented`; never touches `version:` or the doc body
|
|
71
|
+
em slice review <file> <slice-key> --by <name> # the reviewer's (or facilitator's) name
|
|
72
|
+
em slice review <file> <slice-key> --on <date> # review date, YYYY-MM-DD (default: today, local date)
|
|
73
|
+
em slice ratify <file> <slice-key> # flip a slice doc's frontmatter to `status: ready-to-implement` and record `ratifiedBy:`/`ratifiedOn:` — the handoff sign-off (MIL-165, docs/process.md#the-slice-lifecycle-gates) that makes who ratified, and when, a first-class recorded fact. The review gate is a check on the doc's current `status:`, not on whether `reviewedBy:`/`reviewedOn:` are populated: a doc at `reviewed` or `ready-to-implement` passes (the latter is where `em slice reratify` leaves a doc, so the follow-up ratify needs no --skip-review); any other status — a `draft` that never went through `em slice review` — is refused unless --skip-review is passed. Idempotent on the same --by/--on pair; refuses to overwrite a different one already recorded; never touches `version:` or the doc body
|
|
74
|
+
em slice ratify <file> <slice-key> --by <name> # the ratifier's name
|
|
75
|
+
em slice ratify <file> <slice-key> --on <date> # ratification date, YYYY-MM-DD (default: today, local date)
|
|
76
|
+
em slice ratify <file> <slice-key> --skip-review # ratify without a recorded review — prints a loud notice on stderr
|
|
77
|
+
em slice ratify <file> <slice-key> --meaning-unchanged # API-first sign-off (MIL-238): this version does not change what the public contract means — records `meaningConfirmed: true`; required (or --contract-change) on a slice touching a `public` element
|
|
78
|
+
em slice ratify <file> <slice-key> --contract-change <why> # API-first sign-off (MIL-238): a consumer must read this change differently, and why — records `contractChange: "<why>"`
|
|
79
|
+
em slice reratify <file> <slice-key> # bump `version:` and flip a shipped slice doc's frontmatter back to `status: ready-to-implement` — the re-ratification mechanical edit (MIL-161, mirrors `em slice mark-implemented`). Applies to a doc at `status: implemented`, or (MIL-258) to a `ready-to-implement` doc that is ratified but not yet shipped — there it bumps `version:` and clears the sign-off but leaves `status:` alone; a `ready-to-implement` doc with no `ratifiedBy:` refuses (awaiting `em slice ratify --by`). Clears any stale `ratifiedBy:`/`ratifiedOn:`/`reviewedBy:`/`reviewedOn:` (they describe the PRIOR version's review and sign-off) so a follow-up `em slice ratify --by` applies cleanly — and needs no fresh review; never touches `implementedIn:` or the doc body
|
|
80
|
+
em slice reratify <file> <slice-key> --meaning-unchanged # API-first sign-off (MIL-238): the new version does not change what the public contract means — records `meaningConfirmed: true`; required (or --contract-change) on a slice touching a `public` element
|
|
81
|
+
em slice reratify <file> <slice-key> --contract-change <why> # API-first sign-off (MIL-238): a consumer must read the new version differently, and why — records `contractChange: "<why>"`
|
|
82
|
+
em slice conform <file> <slice-key> # record per-slice-per-version conformance certification: sets `conformedVersion:`/`conformedAt:`/`conformedOn:` on a slice doc (MIL-214) — the fact `driftSignal: in-sync` now depends on. Legal only for `status: implemented` with an `implementedIn:` link. Idempotent on the same (version, --at) pair; a different --at simply overwrites (a later re-certification is normal — there's no way for em to tell 'later' from 'earlier' for an arbitrary revision string, so there's no --force to reach for). Refuses when the newest conformance/*-findings.json matching --at still has an unruled finding in scope for this slice; --skip-findings-check overrides with a loud notice.
|
|
83
|
+
em slice conform <file> <slice-key> --at <rev> # the target-repo revision this certification sweep diffed against
|
|
84
|
+
em slice conform <file> <slice-key> --on <date> # certification date, YYYY-MM-DD (default: today, local date)
|
|
85
|
+
em slice conform <file> <slice-key> --skip-findings-check # certify even with unruled findings in scope — prints a loud notice on stderr
|
|
86
|
+
em changelog <file> # render a model's git history as a business-readable ledger (see docs/cli.md)
|
|
87
|
+
em changelog <file> --from <rev> # start the walk at this revision (inclusive)
|
|
88
|
+
em changelog <file> --to <rev> # end the walk at this revision (inclusive; default HEAD)
|
|
89
|
+
em changelog <file> -o, --out <path> # write to a file instead of stdout
|
|
90
|
+
em state read [dir] # print the state file's mechanical fields as JSON
|
|
91
|
+
em state set-phase <phase> [dir] # rewrite Current phase: (and Last updated:); --step also rewrites Current step:
|
|
92
|
+
em state set-phase <phase> [dir] --step <n> # also set Current step: to this value
|
|
93
|
+
em state set-conformance <revision> [dir] # rewrite Last conformance: (and Last updated:) in the exact format reference/conform.md parses. Refuses (MIL-214) while any `implemented` slice has an unruled conformance finding in the findings JSON beside --report (a `slice: null` finding blocks every slice); --partial records the marker with a ` (partial)` suffix instead, with a loud notice. Without a findings JSON beside --report: warns once and records the marker as given (migration path for a report predating `em conform-findings`)
|
|
94
|
+
em state set-conformance <revision> [dir] --report <path> # path to the conformance report just written
|
|
95
|
+
em state set-conformance <revision> [dir] --partial # record the marker as PARTIAL even though some in-scope findings are still unruled
|
|
96
|
+
em state set-review <date> [dir] # rewrite Last stakeholder review: (and Last updated:)
|
|
97
|
+
em state log-usage <file> # append one Usage log line — phase(s) touched + em validate's diagnostic categories hit, deduped and canonically formatted (MIL-161, docs/usage-data.md) — the mechanical half of 'save state at the end of every session' that used to be run-validate-then-hand-format; state file resolved next to <file>, same convention as em conform-scope
|
|
98
|
+
em state log-usage <file> --phases <list> # comma-separated phase(s) touched this session: discover, extract, model, slice, implement, conform, review, validate, watch, engagement
|
|
99
|
+
em model version bump <file> # bump the model's design version: write model-versions/v<N+1>.json (sibling of slices/, conformance/) and rewrite the state file's `Model version:` bullet (MIL-218). Refuses when the state file is missing (run `em scaffold` first), when --by is empty, and when nothing has changed since the current version (same model content hash AND same slice-version vector) unless --force — a no-op bump is the one case --force is right for.
|
|
100
|
+
em model version bump <file> --by <name> # the bumper's name
|
|
101
|
+
em model version bump <file> --on <date> # bump date, YYYY-MM-DD (default: today, local date)
|
|
102
|
+
em model version bump <file> --force # bump even though nothing has changed since the current version
|
|
103
|
+
em model version show <file> # print the model's current design version and the most recently certified version, if any (model-versions/*.json — MIL-218)
|
|
104
|
+
em model version show <file> --json # print a JSON document instead of text
|
|
105
|
+
em usage-report [root] # aggregate every .event-modeling.md's Usage log under [root] into phase/diagnostic-category tallies (MIL-161) — replaces docs/usage-data.md's hand-rolled grep/awk/sort pipeline; a logged line that doesn't match the canonical em state log-usage format is reported under unparseableLines rather than silently mistallied or dropped
|
|
106
|
+
em usage-report [root] --json # print a JSON document instead of the text report
|
|
107
|
+
em conform-scope <file> # mechanize conform phase step 1 (reference/conform.md): map the target repo's changed paths since Last conformance: to slices via each slice doc's implementedIn, JSON to stdout — --seed-asis also seeds the <model>-asis.em scratch model (see docs/cli.md)
|
|
108
|
+
em conform-scope <file> --repo <path> # path to (or inside) the target codebase's git repository
|
|
109
|
+
em conform-scope <file> --full # ignore Last conformance:/changed paths; scope every implemented slice
|
|
110
|
+
em conform-scope <file> --seed-asis # write <model>-asis.em as a byte copy of the canonical model and ensure it's gitignored
|
|
111
|
+
em conform-supersede <file> <report-path> # stamp a conformance report with a "superseded as of <rev>" banner once its findings have been ruled on (MIL-164, docs/process.md#what-ratified-means) — the companion step to run at ratification time so a reader following the report's file:line citations knows they describe an ancestor of the current model. Additive-only splice, never a rewrite of the report; idempotent on the same --as-of/--findings/--on stamp; refuses if the report doesn't exist. --locus/--by (MIL-214, both required together) additionally record the ruling itself — locus/resolvedBy/resolvedOn — on the findings named by --findings in the sibling conformance/<date>-findings.json, when one exists (warns once and stamps the banner only when it doesn't — the migration path for a report predating em conform-findings)
|
|
112
|
+
em conform-supersede <file> <report-path> --as-of <rev> # the revision this ruling was made against — same value passed to `em state set-conformance`
|
|
113
|
+
em conform-supersede <file> <report-path> --findings <spec> # which finding number(s) this stamps as ruled, e.g. "1-3" or "1,2,4"
|
|
114
|
+
em conform-supersede <file> <report-path> --on <date> # ruling date, YYYY-MM-DD (default: today, local date)
|
|
115
|
+
em conform-supersede <file> <report-path> --locus <locus> # who/what the named finding(s) say is wrong: model | doc | code | none (requires --by)
|
|
116
|
+
em conform-supersede <file> <report-path> --by <name> # who ruled on the named finding(s) (requires --locus)
|
|
117
|
+
em conform-findings check <path> # shape-validate a conformance/<date>-findings.json file (findingsSchemaVersion, required fields, enum values, ids sorted+unique, a ruled finding carries resolvedBy+resolvedOn) — exit 1 on shape errors. The conform skill writes this file directly alongside its report; this is how a headless run verifies what it just wrote.
|
|
118
|
+
em conform-findings check <path> --json # print a JSON document instead of the text report
|
|
119
|
+
em watch <file> # re-render on every save
|
|
120
|
+
em watch <file> -o, --out <path> # output path (extension picks the format)
|
|
121
|
+
em watch <file> -T, --format <fmt> # output format (svg, png, pdf, ...)
|
|
122
|
+
em watch <file> --keep-empty-lanes # keep the API lane even when empty
|
|
123
|
+
em watch <file> --serve # serve a live viewer with instant push-reload (no polling)
|
|
124
|
+
em watch <file> --port <n> # port for --serve (default 5173)
|
|
125
|
+
em validate <file> # check a model against event-modeling rules
|
|
126
|
+
em validate <file> --list-issues # print only open `issue` diagnostics (slice, element, line, text)
|
|
127
|
+
em validate <file> --list-divergences # print only accepted-divergence annotations (slice, element, line, text) — never fails the build
|
|
128
|
+
em validate <file> --list-public # print only commands, events and views marked `public` (slice, kind, name, line) — an integration-surface audit, never fails the build
|
|
129
|
+
em validate <file> --fail-on-issues # exit non-zero if the model has any open `issue`s (opt-in — issues are warnings and don't block by default)
|
|
130
|
+
em validate <file> --slice-ready <key> # readiness gate for one slice (export key): status ready-to-implement, doc resolvable via note binding, zero unchecked Open Questions, a recorded ratifiedBy, and — for a slice touching a `public` element — a current contracts/<model key>.tsp; exits non-zero if not ready (MIL-87, MIL-259, MIL-238)
|
|
131
|
+
em validate <file> --json # print a JSON document instead of text — works on a model WITH errors, unlike `em export` (MIL-128, see docs/cli.md); exit codes are unchanged
|
|
132
|
+
em migrate <file> # rewrite the old two-slice Automation/Translation shape into the merged single-slice shape MIL-120 made canonical (see docs/cli.md)
|
|
133
|
+
em migrate <file> --write # apply the rewrite to the file (default: dry run — report only, write nothing)
|
|
134
|
+
em ledger <file> # check slice docs' version: field agrees with their content across two git revisions (opt-in CI check, MIL-89 — never part of `em validate`, see docs/ci.md)
|
|
135
|
+
em ledger <file> --from <rev> # baseline revision
|
|
136
|
+
em ledger <file> --to <rev> # compare revision (default: current working tree)
|
|
137
|
+
em ledger <file> --waive <slice-key> # excuse a doc-content-without-version-bump finding for this slice key (repeatable; MIL-185, see docs/cli.md) — never waives a version regression or bump-without-content-change
|
|
138
|
+
em ledger <file> --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
139
|
+
em coverage <file> # check that every INV-* invariant ID cited in an implemented slice doc is cited by a test under --tests <dir> (MIL-130/MIL-207) — mechanizes reference/implement.md's definition-of-done citation check; advisory by default, --strict for CI; --include-ready also counts ready-to-implement docs (forward-looking report); a continuation slice (an `again` view instance with no doc of its own, MIL-208) is excluded from the report — its invariants, if any, live in the originating slice's own doc; --slice <key> scopes the report to one slice whatever its status (MIL-255), the pre-merge definition-of-done check
|
|
140
|
+
em coverage <file> --tests <dir> # directory to scan recursively for test files citing invariant IDs
|
|
141
|
+
em coverage <file> --slice <key> # only this slice (export key), whether ready-to-implement or implemented — no --include-ready needed; --strict then fails on this slice's uncited invariants, or if the slice is not in scope (draft/reviewed/unbound: nothing checked) (MIL-255)
|
|
142
|
+
em coverage <file> --strict # exit non-zero if any invariant ID has zero citations (CI)
|
|
143
|
+
em coverage <file> --include-ready # also count ready-to-implement docs, not just implemented (MIL-207)
|
|
144
|
+
em coverage <file> --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
145
|
+
em status <files> # deterministic state-of-the-system rollup over one or more .em models: slices by lifecycle status, driftSignal breakdown, invariant coverage totals (with --tests), open issue markers + unchecked Open Questions, and last-conformance commits-behind-HEAD (MIL-163, see docs/cli.md)
|
|
146
|
+
em status <files> --tests <dir> # directory to scan for INV-* test citations — enables invariant coverage totals
|
|
147
|
+
em status <files> --repo <path> # git repo to compute commits-behind-HEAD in (default: each model's own directory)
|
|
148
|
+
em status <files> --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
149
|
+
em status <files> --md # print a markdown block suited for README embedding
|
|
150
|
+
em status <files> --badge # print a generated SVG badge
|
|
151
|
+
em status <files> -o, --out <path> # write output to a file instead of stdout
|
|
152
|
+
em freshness <file> # standalone freshness signal for one model's conformance record (MIL-164): "last conformed <rev> — N commits and M slice-PRs behind HEAD", computed from the same conform-scope machinery `em status`'s conformance clause uses — for when you want just this fact, no full state-of-the-system rollup (see docs/cli.md)
|
|
153
|
+
em freshness <file> --repo <path> # git repo to compute behind-HEAD in (default: the model's own directory)
|
|
154
|
+
em freshness <file> --json # print a JSON document instead of the text line
|
|
155
|
+
em metrics <file> # the pilot metrics named in advance by the register, computed from git history alone (MIL-170): ratification turnaround (reviewed -> ratified -> implemented), conform-cycle cadence + finding counts, and status-vs-reality disagreement over time — plus a fourth, reported as not computable from history (see docs/usage-data.md). `<file>` is an anchor .em file, used only to locate slices/, conformance/, and .event-modeling.md relative to it — same convention as em ledger; never parsed or compiled
|
|
156
|
+
em metrics <file> --from <rev> # baseline revision
|
|
157
|
+
em metrics <file> --to <rev> # compare revision (default: HEAD)
|
|
158
|
+
em metrics <file> --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
159
|
+
em query consumers <files> # views/reactions consuming an event, plus their slices
|
|
160
|
+
em query consumers <files> --event <ref-or-name> # the event's export ref or display name
|
|
161
|
+
em query consumers <files> --json # print a JSON document instead of the text report
|
|
162
|
+
em query producers <files> # commands producing an event, plus their slices and ui triggers
|
|
163
|
+
em query producers <files> --event <ref-or-name> # the event's export ref or display name
|
|
164
|
+
em query producers <files> --json # print a JSON document instead of the text report
|
|
165
|
+
em query downstream <files> # transitive closure along legal edges from an element — impact analysis
|
|
166
|
+
em query downstream <files> --of <ref-or-name> # the starting element's export ref or display name
|
|
167
|
+
em query downstream <files> --depth <n> # limit traversal to n hops (default: unlimited)
|
|
168
|
+
em query downstream <files> --json # print a JSON document instead of the text report
|
|
169
|
+
em query upstream <files> # transitive closure against legal-edge direction from an element
|
|
170
|
+
em query upstream <files> --of <ref-or-name> # the starting element's export ref or display name
|
|
171
|
+
em query upstream <files> --depth <n> # limit traversal to n hops (default: unlimited)
|
|
172
|
+
em query upstream <files> --json # print a JSON document instead of the text report
|
|
173
|
+
em query slices <files> # filtered slice list — pattern/status/context/persona/tag filters AND-combine
|
|
174
|
+
em query slices <files> --pattern <p> # state-change | state-view | automation | translation | unclassified
|
|
175
|
+
em query slices <files> --status <s> # the slice's joined doc status (draft, reviewed, ready-to-implement, implemented, ...)
|
|
176
|
+
em query slices <files> --context <c> # match a slice with an event in this @Context
|
|
177
|
+
em query slices <files> --persona <p> # match a slice with a ui in this @Persona
|
|
178
|
+
em query slices <files> --tag <t> # match a slice with an event carrying this tag key
|
|
179
|
+
em query slices <files> --json # print a JSON document instead of the text report
|
|
180
|
+
em query invariant <files> # declaring slice + doc facts for one INV-* id, and (with --tests) its test citations
|
|
181
|
+
em query invariant <files> --id <inv-id> # the INV-* id to look up
|
|
182
|
+
em query invariant <files> --tests <dir> # directory to scan for test files citing this id
|
|
183
|
+
em query invariant <files> --json # print a JSON document instead of the text report
|
|
184
|
+
em query field <files> # one field's facts on an element — type, tag/assigned markers, renamed-from chain
|
|
185
|
+
em query field <files> --of <element-ref> # the element's export ref or display name
|
|
186
|
+
em query field <files> --name <field> # the field's name
|
|
187
|
+
em query field <files> --json # print a JSON document instead of the text report
|
|
188
|
+
em query path <files> # shortest path between two elements through the six legal connection types
|
|
189
|
+
em query path <files> --from <ref-or-name> # the starting element's export ref or display name
|
|
190
|
+
em query path <files> --to <ref-or-name> # the ending element's export ref or display name
|
|
191
|
+
em query path <files> --json # print a JSON document instead of the text report
|
|
192
|
+
em engagement new <file> <slug> # write <model dir>/engagements/<slug>.md — frontmatter (slices, parallel ceiling) plus the generated Ledger table; selection by --slices, --context, or --downstream-of (exactly one)
|
|
193
|
+
em engagement new <file> <slug> --slices <keys> # comma-separated slice export keys
|
|
194
|
+
em engagement new <file> <slug> --context <name> # every slice with an event in this context
|
|
195
|
+
em engagement new <file> <slug> --downstream-of <ref> # a slice key, element ref, or display name: it and everything downstream of it (loops-to excluded)
|
|
196
|
+
em engagement new <file> <slug> --parallel <n> # how many slices of one level may be in flight at once
|
|
197
|
+
em engagement new <file> <slug> --by <name> # who created the engagement (createdBy)
|
|
198
|
+
em engagement new <file> <slug> --force # overwrite an existing engagement file with this slug
|
|
199
|
+
em engagement plan <file> <slug> # the engagement's build plan: dependency levels over model.edges (loops-to excluded), and per slice its readiness, branch impl/<key>, base (main or impl/<upstream>), and any hold
|
|
200
|
+
em engagement plan <file> <slug> --json # print a JSON document instead of text (same document as the MCP engagement_plan tool)
|
|
201
|
+
em engagement set <file> <slug> <key> # the only write path to the Ledger: set one slice's state (and optionally branch/base/pr); idempotent; merged is terminal; --state held records a human hold
|
|
202
|
+
em engagement set <file> <slug> <key> --state <state> # one of: planned | building | validating | review | awaiting-merge | merged | held | gap
|
|
203
|
+
em engagement set <file> <slug> <key> --branch <name> # the slice's branch
|
|
204
|
+
em engagement set <file> <slug> <key> --base <name> # the branch the slice's PR targets
|
|
205
|
+
em engagement set <file> <slug> <key> --pr <url> # the slice's PR URL
|
|
206
|
+
em engagement status <file> <slug> # the Ledger joined with each slice doc's current status, plus whether the engagement is closable
|
|
207
|
+
em engagement status <file> <slug> --json # print a JSON document instead of text (same document as the MCP engagement_status tool)
|
|
208
|
+
em engagement close <file> <slug> # set status: closed — refuses unless every slice is merged (recorded or inferred) or gap
|
|
209
|
+
em system [target] # verify a system — every model's `consumes` refs resolved against the other models' `public` events/views, the cross-model half of "both ends of a flow" (MIL-194/MIL-235, see docs/cli.md). Reads system.yaml when given (or found in the directory), else discovers every *.em in the repo
|
|
210
|
+
em system [target] --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
211
|
+
em system codeowners [target] # generate (or --check) the managed CODEOWNERS block that routes review: each model's team on its design directory, and every team that `consumes` a model's public surface on that model's contract file (MIL-234, see docs/ci.md and docs/cli.md)
|
|
212
|
+
em system codeowners [target] -o, --output <path> # the CODEOWNERS file to splice into (default: the first of CODEOWNERS, .github/CODEOWNERS, docs/CODEOWNERS that exists, else CODEOWNERS at the repo root)
|
|
213
|
+
em system codeowners [target] --check # verify the committed file already carries the generated block; never writes, exit 1 on drift (CI)
|
|
214
|
+
em system codeowners [target] --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
215
|
+
em system scope [target] # check a change set against the seams (MIL-240): fail only when it alters a producer's public surface (or contract file) AND a consuming model's design dir together (`seam-crossing`); warn on other multi-model change sets. Files changed only by `Em-Upgrade:` commits are exempt. There is no override - review on the contract file is the gate (see docs/cli.md, docs/ci.md)
|
|
216
|
+
em system scope [target] --base <rev> # the change set committed since <rev> (merge-base form, <rev>...HEAD); CI passes the PR base
|
|
217
|
+
em system scope [target] --staged # also (or only) check what is staged right now; never exempted
|
|
218
|
+
em system scope [target] --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
219
|
+
em contract # print the packaged implementation contract (reference/implement.md) to stdout — the agent-neutral discovery path for any agent that can run a shell, not just Claude Code (MIL-129); see docs/cli.md
|
|
220
|
+
em mcp # start an MCP (Model Context Protocol) server over stdio (MIL-21) — a structured, agent-facing alternative to shelling out to `em`; every tool mirrors a CLI `--json` surface byte-for-byte. docs/mcp.md isn't vendored into the skill bundle — for the handshake and the full, current tool table (the list changes as commands gain MCP parity, so it's not repeated here — MIL-187) see https://github.com/milehimikey/em/blob/main/docs/mcp.md. Equivalent to running the `em-mcp` bin directly
|
|
221
|
+
em skill install # copy the event-modeling skill bundle into .claude/skills/ (event-modeling, event-modeling-discover/-design/-implement/-conform/-review, event-modeling-shared); across a structural bundle change (e.g. the MIL-157 split of the old single event-modeling/ directory into this six-directory bundle), `em skill sync` is the migration path — --force now performs the same reconcile (MIL-180)
|
|
222
|
+
em skill install -f, --force # overwrite an existing installation, reconciling added/updated/removed files within the bundle's own managed directories the same way `em skill sync` does — never touching an unrelated sibling skill (MIL-180)
|
|
223
|
+
em skill install --no-agents-md # skip writing/updating the AGENTS.md agent-contract section (on by default, MIL-129)
|
|
224
|
+
em skill sync [path] # update the vendored .claude/skills/ event-modeling skill bundle in [path] to match the installed em package (overwrites unconditionally; local edits are never merged, MIL-93)
|
|
225
|
+
em skill sync [path] --no-agents-md # skip writing/updating the AGENTS.md agent-contract section (on by default, MIL-129)
|
|
226
|
+
em skill check [path] # check [path]'s em skills for drift against the installed em package: the em Claude Code plugin's pin (settings + this machine's marketplace registry) when the repo declares it, and the vendored .claude/skills/ bundle when present; exits non-zero on any mismatch (CI-ready, MIL-93, MIL-231)
|
|
227
|
+
em skill check [path] --json # print a JSON document instead of the text report (see docs/cli.md)
|
|
228
|
+
em skill check [path] --ci # also fail (exit 1) when the declared plugin is not registered on this machine (implied by CI=true in the environment); without it that finding prints the install commands on stderr and exits 0
|
|
229
|
+
em ci init <model> # install .github/workflows/em-ci.yml (PR gates: em validate, em slice index --check, em coverage --strict, em ledger, em skill check, em glossary --fail-on-conflicts, plus a push-triggered status-badge rebuild) and em-conform.yml (scheduled, advisory-only conformance cadence) — same install discipline as `em skill install`: marker-delimited, idempotent, --check for CI self-verification (MIL-166, see docs/ci.md). Give it a system.yaml (or its directory) instead of a model to cover every model in the system: one workflow, per-model jobs, a conform matrix (MIL-233)
|
|
230
|
+
em ci init <model> --tests <dir> # test directory the coverage/status steps scan for INV-* citations
|
|
231
|
+
em ci init <model> -f, --force # replace an existing workflow file that has no GENERATED markers, or a managed block generated for a different set of models
|
|
232
|
+
em ci init <model> --check # verify both files match the current preset; exit non-zero on drift without writing (CI)
|
|
233
|
+
em upgrade <file> # bring a model repo authored under an older em (1.6 forward) up to the installed version: an ordered list of mechanical steps (skill bundle, reaction shape, state-file bullets, generated CI blocks, constitution scaffold) plus a human list of things no command can safely decide by itself (MIL-219, see docs/upgrading.md). Dry-run by default; --apply makes one git commit per applicable step, refusing on a dirty working tree
|
|
234
|
+
em upgrade <file> --apply # apply every applicable mechanical step, one git commit each, then a final `Em version:` commit
|
|
235
|
+
em upgrade <file> --check # exit non-zero only on a hard incompatibility (an existing but unparseable state file, an un-migratable .em shape) — writes nothing; what CI runs; the final line says why
|
|
236
|
+
em upgrade <file> --json # print a JSON document instead of text (dry-run/--check only, never with --apply)
|
|
198
237
|
```
|
|
199
238
|
<!-- GENERATED:cli:end -->
|
|
200
239
|
|
|
@@ -206,7 +245,7 @@ deps; only rarer formats (ps, eps, ...) need `rsvg-convert`.
|
|
|
206
245
|
## Grammar
|
|
207
246
|
|
|
208
247
|
```
|
|
209
|
-
model "Name"
|
|
248
|
+
model "Name" [owner "Team"] # diagram title; optional owning team(s), quoted free text
|
|
210
249
|
|
|
211
250
|
persona Name # a UI swimlane row (actor)
|
|
212
251
|
context Name # an event swimlane row (bounded context / aggregate)
|
|
@@ -214,10 +253,12 @@ context Name # an event swimlane row (bounded context / aggr
|
|
|
214
253
|
slice "Name" [source "url"] { # one vertical time step (a column); source is optional
|
|
215
254
|
ui Free Text @Persona # screen; @Persona picks its row (defaults to first/"User")
|
|
216
255
|
command Free Text # state-changing request (API band)
|
|
256
|
+
invariant INV-ORD-1 "Rule" # rule guarding the command/event just above (see Clauses)
|
|
217
257
|
view Free Text from "Event A", "Event B" # read model fed by event(s)
|
|
218
258
|
view Free Text again from "Event C" # later instance of an evolving read model (see Clauses)
|
|
219
259
|
event Free Text @Context # recorded fact; @Context picks its row (defaults to "Domain")
|
|
220
260
|
processor Free Text from "View" # automation; aliases: automation | saga | translation
|
|
261
|
+
translation Free Text consumes other-model:event.slug # binds another model's public event/view
|
|
221
262
|
}
|
|
222
263
|
|
|
223
264
|
arrow From Element -> To Element # explicit cross-slice edge (overrides inferred flow)
|
|
@@ -229,10 +270,10 @@ type Name { field: Type, ... } # named structured type, reusable from any f
|
|
|
229
270
|
| Keyword | Band | Meaning | Tag | Extra clauses |
|
|
230
271
|
|---|---|---|---|---|
|
|
231
272
|
| `ui` | persona | screen / interface | `@Persona` | `note`, `issue`, `divergence`, `{ fields }` |
|
|
232
|
-
| `command` | API | state-changing request | — | `note`, `issue`, `divergence`, `renamed from`, `{ fields }` |
|
|
273
|
+
| `command` | API | state-changing request | — | `note`, `issue`, `divergence`, `renamed from`, `{ fields }`, standalone `invariant` line |
|
|
233
274
|
| `view` | API | read model / projection | — | `from "Event"…`, `note`, `issue`, `divergence`, `public`, `{ fields }` |
|
|
234
|
-
| `event` | context | recorded fact (past tense) | `@Context` | `note`, `issue`, `divergence`, `public`, `tag`, `renamed from`, `loops-to`, field-level `assigned`, `{ fields }` |
|
|
235
|
-
| `processor` / `automation` / `saga` / `translation` | automation | system reaction / adapter | — | `from "…"`, `note`, `issue`, `divergence`, `{ fields }` |
|
|
275
|
+
| `event` | context | recorded fact (past tense) | `@Context` | `note`, `issue`, `divergence`, `public`, `tag`, `renamed from`, `loops-to`, field-level `assigned`, `{ fields }`, standalone `invariant` line |
|
|
276
|
+
| `processor` / `automation` / `saga` / `translation` | automation | system reaction / adapter | — | `from "…"`, `note`, `issue`, `divergence`, `{ fields }`; `translation` only: `consumes` |
|
|
236
277
|
|
|
237
278
|
### Clauses
|
|
238
279
|
- **Tags:** `@Persona` only on `ui`; `@Context` only on `event`. Undeclared tags auto-create a
|
|
@@ -302,12 +343,28 @@ type Name { field: Type, ... } # named structured type, reusable from any f
|
|
|
302
343
|
view flip reads `view "X"`); `em validate --list-public` audits the whole public surface.
|
|
303
344
|
**Exposure of a read model (MIL-215) is three cases, no dedicated keyword:** a person/client
|
|
304
345
|
reads it → draw the `ui` that reads it (ships the endpoint); another model/system reads it →
|
|
305
|
-
`public` (a cross-model contract
|
|
346
|
+
`public` (a cross-model contract its consumer binds with `consumes`, verified by `em system`, not `em validate`); only
|
|
306
347
|
an automation reads it → nothing — internal by design, the read a reaction is required to
|
|
307
348
|
make, not an endpoint. `em validate --list-public` flags a `public` view with no `ui`/reaction
|
|
308
349
|
reading it anywhere in this model as an audit note ("no in-model reader"), not a warning — a
|
|
309
350
|
cross-model `public` view's reader legitimately lives outside this file (see "`em validate`
|
|
310
351
|
rules" below).
|
|
352
|
+
- **`consumes`** (translation only, MIL-235): `translation X consumes <modelKey>:<kind>.<slug>[, …]`
|
|
353
|
+
binds this boundary-crossing reaction to another model's `public` event or view. The binding is
|
|
354
|
+
declared on the consumer and has no version. `kind` is `event` or `view` (never `command`).
|
|
355
|
+
`modelKey` is the kebab-slug of the producer's `model "Name"`, and `slug` is the kebab-slug of
|
|
356
|
+
the element's name. There is no slice segment, so the producer can move the element between
|
|
357
|
+
slices without breaking consumers. Refs are unquoted and comma-separated. Write the clause before
|
|
358
|
+
or after `from "…"`, before or after a `{ … }` block, never inside the braces. On any other kind
|
|
359
|
+
it is a parse error: ``line N: `consumes` is only valid on translation — only a boundary-crossing
|
|
360
|
+
reaction binds to another model's public surface``. `em validate` checks the grammar only.
|
|
361
|
+
`em system` resolves the ref (`consumes-unknown-model` / `consumes-unknown-element`) and
|
|
362
|
+
derives `dangling-public-event` / `unbound-translation` from it. Two `public` elements of one
|
|
363
|
+
kind sharing a slug are a `public-name-not-unique` error, because a ref couldn't tell them
|
|
364
|
+
apart. Exported as `consumes: string[] | null`.
|
|
365
|
+
- **`owner`** (model header, MIL-235): `model "Checkout" owner "Storefront team"[, "…"]`. Quoted
|
|
366
|
+
free text, kept as written, exported as `model.owner: string[]`. It replaces a 1.0
|
|
367
|
+
`system.yaml`'s per-model `owner:`.
|
|
311
368
|
- **`tag`** (events only): declares a DCB (Dynamic Consistency Boundary) tag key. Three forms:
|
|
312
369
|
a trailing `tag` on a field line inside the event's `{ … }` block (`priceId: UUID tag`, or
|
|
313
370
|
typeless `priceId tag`) — an identity tag, key defaults to the field's own name; a bare field
|
|
@@ -367,6 +424,17 @@ type Name { field: Type, ... } # named structured type, reusable from any f
|
|
|
367
424
|
one-per-line. Types are free text (no semantic checking) UNLESS the type string names a
|
|
368
425
|
declared `type` (see Named types below), in which case it resolves to a structured
|
|
369
426
|
reference. Keep these light; full field specs with rules live in the slice doc.
|
|
427
|
+
- **`invariant`** (command/event only, MIL-265): a standalone line directly after the element,
|
|
428
|
+
`invariant INV-ORD-1 "Order total must be positive"` — ID, then an optional quoted rule
|
|
429
|
+
sentence (always write one). Several lines accumulate in order. Parse error after a
|
|
430
|
+
view/`ui`/reaction, before any element, or inside a `{ … }` block. The ID must match
|
|
431
|
+
`INV-<MNEMONIC>-<n>` (2-4 uppercase letters/digits, a number) — `invariants/malformed-id` and
|
|
432
|
+
`invariants/duplicate-id` are errors. **The model declares the ID and the rule; the slice doc's
|
|
433
|
+
Invariants section cites the ID and elaborates** (`- INV-ORD-1 — why, edge cases`), never
|
|
434
|
+
restating it as a `**INV-ORD-1:**` rule (`invariants/declared-in-both`). A model-declared ID
|
|
435
|
+
belongs to its element's slice for `em coverage`/`em query invariant`; doc-declared IDs (the
|
|
436
|
+
1.13 style) still work as the fallback. `em export` carries `invariants: [{ id, rule }] | null`
|
|
437
|
+
per element.
|
|
370
438
|
- **Comments:** `# ...` anywhere outside quotes (full-line or trailing).
|
|
371
439
|
- **Quoted strings:** everything between a `"` and its matching `"` is literal — `{`, `}`, `#`
|
|
372
440
|
included, never re-interpreted as a field block or comment — so REST path-template
|
|
@@ -693,7 +761,11 @@ not the prose above has caught up yet. `--slice-ready <key>`-only codes are excl
|
|
|
693
761
|
| `both-ends-of-a-flow/reaction-no-command` | warning | Reaction with no command | Add the command it triggers, in this slice, or an explicit arrow to one. |
|
|
694
762
|
| `both-ends-of-a-flow/ui-unbacked` | warning | `ui` with no read model or command | Add a `view` it displays, or the command it triggers. |
|
|
695
763
|
| `both-ends-of-a-flow/view-unconsumed` | warning | Read model with no consumer | Add a `ui` or reaction that consumes it, or drop this instance. |
|
|
764
|
+
| `code-spans-seam` | warning | Code change spans a seam | Keep one code module per model and change the two sides of a seam in separate change sets. |
|
|
696
765
|
| `connection-legality/illegal-pair` | error | Illegal connection | Only ui→command→event→view→ui and view→reaction→command are legal — the message names the missing step. |
|
|
766
|
+
| `consumer-not-adapted` | error | Consuming translation no longer matches the producer's public element | Update the translation's field block to the producer's current fields (a renamed field names its new name in the message). Additive producer changes never raise this — consumers tolerate unknown fields. |
|
|
767
|
+
| `consumes-unknown-element` | error | `consumes` names no public element of that model | Point the ref at an element the producer marks `public` (`em export` lists them), or ask the producer to publish it. |
|
|
768
|
+
| `consumes-unknown-model` | error | `consumes` names a model the system does not have | Fix the model key (the kebab-slug of the producer's `model "Name"`), or add that model to the system. |
|
|
697
769
|
| `continuation-has-own-doc` | warning | Continuation slice has its own doc | Fold this doc's scenarios into slices/<originating-key>.md and delete it; a later `view X again` instance is documented by the view's originating slice. |
|
|
698
770
|
| `cross-model-slice-doc-collision` | warning | Colliding slice doc path across models | Give each model its own directory (see docs/cli.md, "Multi-model projects"). |
|
|
699
771
|
| `dangling-public-event` | warning | Public event/view no seam consumes | Declare the seam that reads it, or drop `public` if nothing outside the model does. |
|
|
@@ -713,6 +785,11 @@ not the prose above has caught up yet. `--slice-ready <key>`-only codes are excl
|
|
|
713
785
|
| `frontmatter-coherence-implemented-without-link` | warning | Implemented without a link | Add `implementedIn` once the slice ships. |
|
|
714
786
|
| `frontmatter-invalid` | warning | Invalid or missing frontmatter | Add the required frontmatter keys, or add a frontmatter block. |
|
|
715
787
|
| `grid-collision` | error | Band collision | Split the colliding elements into separate slices. |
|
|
788
|
+
| `invariants/declared-in-both` | warning | Invariant declared in the model and in a slice doc | Keep the model's `invariant` line; in the doc, cite the ID and elaborate instead of restating it as a `**INV-…:**` rule. |
|
|
789
|
+
| `invariants/doc-cites-undeclared` | warning | Slice doc cites an undeclared invariant | Declare the ID in the model (or in a slice doc's Invariants section), or fix the citation. |
|
|
790
|
+
| `invariants/duplicate-id` | error | Duplicate invariant ID | Give each model-declared invariant its own ID — a rule is declared once, on the element it guards. |
|
|
791
|
+
| `invariants/malformed-id` | error | Malformed invariant ID | Rename the ID to the `INV-<MNEMONIC>-<n>` shape, e.g. `INV-ORD-1` (2-4 uppercase letters/digits, then a number). |
|
|
792
|
+
| `invariants/public-command-without-invariants` | warning | Public command declares no invariants | Add an `invariant INV-<MNEMONIC>-<n> "rule"` line after the command, or declare its rules in the slice doc's Invariants section. |
|
|
716
793
|
| `lineage-forward-dangling` | error | Dangling forward lineage ref | Fix the key, or remove the stale successor. |
|
|
717
794
|
| `lineage-ref-cycle` | error | Lineage cycle | Break the cycle — a slice can't be its own ancestor. |
|
|
718
795
|
| `lineage-ref-malformed` | error | Malformed lineage ref | Fix the value to `<slice-key>@v<N>`, or remove it. |
|
|
@@ -720,19 +797,27 @@ not the prose above has caught up yet. `--slice-ready <key>`-only codes are excl
|
|
|
720
797
|
| `loops-to-forward` | error | `loops-to` target not earlier on the timeline | Point `loops-to` at an earlier view, or use `from` on a later `view … again` instance instead. |
|
|
721
798
|
| `loops-to-unresolved` | error | `loops-to` target unresolved | Name a view that exists, or declare it before this event. |
|
|
722
799
|
| `model-version-stale` | warning | Model version stale | Run `em model version bump` to record the current model content/slice-version vector. |
|
|
800
|
+
| `multi-model-change-set` | warning | Change set touches more than one model | Prefer one model per change set. Unrelated models in one change set are fine; models joined by a seam are not, once a contract changes. |
|
|
723
801
|
| `note-binding-dangling` | warning | Dangling cross-slice note | Create the doc at that path, or fix/remove the note. |
|
|
724
802
|
| `note-binding-extra` | warning | Extra doc-binding note, ignored | Remove the note, or point it at the slice's actual bound doc. |
|
|
725
803
|
| `note-binding-unratified` | warning | Unratified cross-slice note | Add `covers: <this-slice-key>` to that doc's frontmatter, or correct the note's path. |
|
|
726
804
|
| `note-binding-unusable` | warning | Cross-slice note to a doc with unusable frontmatter | Fix that doc's frontmatter, or fix/remove the note. |
|
|
727
805
|
| `open-issue` | warning | Open issue | Resolve the question, then remove the `issue` clause. |
|
|
728
806
|
| `orphaned-slice-doc` | warning | Orphaned slice doc | Rename it to a current slice's key, add `covers:` (plus a `note` binding) to attach it to a live slice, or delete it. |
|
|
807
|
+
| `owner-not-a-handle` | warning | Model owner is not a CODEOWNERS handle | Write the owner as a GitHub user (`@alice`), a team (`@org/team`), or an email address, so `em system codeowners` can route review to it. |
|
|
808
|
+
| `public-field-type-unresolved` | error | Public field type unresolved | Give the field a type from the public type table (string, text, int, long, decimal, boolean, uuid, date, datetime, duration, bytes), `X[]` of one, or a declared `type` — or drop `public`. |
|
|
809
|
+
| `public-name-not-unique` | error | Two public elements of one kind share a name | Rename one of them (or drop `public` from one): a consumer's `consumes <model>:<kind>.<slug>` must name exactly one element. |
|
|
729
810
|
| `reaction-from-future-view` | error | Backward timeline (reaction reads a future view) | Declare the view in or before the reaction's slice. |
|
|
730
811
|
| `reaction-from-unresolved` | error | Unknown read-model source | Project the event into a view first, or fix the `from` reference. |
|
|
731
812
|
| `seam-consumer-not-reaction` | error | Seam consumer is not a reaction | Point `to` at a translation/automation element (or a slice containing exactly one). |
|
|
813
|
+
| `seam-crossing` | error | Change set alters a contract and its consumer together | Split the change set: land the producer's public-surface change first, then adapt the consuming model in a later change. Review on the contract file is the only override. |
|
|
814
|
+
| `seam-crossing-greenfield` | warning | New public surface lands with its first consumer | Nothing to fix: a public element no consumer was bound to at the base revision is new surface, not a crossing. Later changes to it are crossings. |
|
|
732
815
|
| `seam-duplicate` | warning | Duplicate seam | Remove the repeated `from`/`to` pair. |
|
|
733
816
|
| `seam-endpoint-unresolved` | error | Seam endpoint does not resolve | Fix the ref to an element the named model actually exports (`em export` lists every ref), or re-declare the seam after a rename. |
|
|
734
817
|
| `seam-source-not-public` | error | Seam source is not `public` | Mark the event/view `public` in its model, or point the seam at the element that is. |
|
|
735
|
-
| `
|
|
818
|
+
| `slice-doc/structured-section-malformed` | warning | Malformed structured section | Balance the `<!-- GENERATED:em-slice-…:start -->`/`:end -->` markers (re-create the doc with `em slice new --force` if they are lost), restore the template's table header and run `em slice sync`, and give every `### Scenario:` block a Given, When and Then bullet. |
|
|
819
|
+
| `system-manifest-invalid` | error | Seam manifest invalid | Fix the manifest: `systemSchemaVersion: "2.0"`, `models:` with a readable `source` per model, and nothing else (`seams:`/`owner:` moved into the models — run `em upgrade`). |
|
|
820
|
+
| `system-manifest-outdated` | warning | Seam manifest is schema 1.0 | Run `em upgrade <model>.em --apply` once: it moves `seams:` into `consumes` clauses and `owner:` onto each model header, and rewrites the manifest to 2.0. |
|
|
736
821
|
| `system-model-key-mismatch` | error | Manifest model key differs from the export's `model.key` | Rename the manifest's `models:` key to the computed key the message prints. |
|
|
737
822
|
| `tag-composite-unknown-field` | error | Composite tag names an unknown field | Fix the field name, or add it to the event's fields. |
|
|
738
823
|
| `tag-duplicate-key` | error | Duplicate tag key | Rename one of the tags so every key on the event is unique. |
|