@milehimikey/em 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +4 -2
  2. package/.claude/skills/event-modeling-conform/SKILL.md +20 -9
  3. package/.claude/skills/event-modeling-conform/reference/conform.md +107 -10
  4. package/.claude/skills/event-modeling-design/SKILL.md +22 -6
  5. package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
  6. package/.claude/skills/event-modeling-implement/SKILL.md +12 -6
  7. package/.claude/skills/event-modeling-implement/reference/implement.md +165 -18
  8. package/.claude/skills/event-modeling-review/SKILL.md +5 -1
  9. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +57 -8
  10. package/.claude/skills/event-modeling-shared/reference/operating-principles.md +13 -3
  11. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +69 -0
  12. package/.claude/skills/event-modeling-shared/templates/conformance-report.md +8 -1
  13. package/.claude/skills/event-modeling-shared/templates/constitution.md +8 -1
  14. package/.claude/skills/event-modeling-shared/templates/state.md +3 -0
  15. package/README.md +1 -0
  16. package/dist/catalog/build.js +42 -1
  17. package/dist/catalog/build.js.map +1 -1
  18. package/dist/catalog/coverage.d.ts +15 -0
  19. package/dist/catalog/coverage.js +34 -0
  20. package/dist/catalog/coverage.js.map +1 -0
  21. package/dist/catalog/docJoin.d.ts +20 -2
  22. package/dist/catalog/docJoin.js +32 -4
  23. package/dist/catalog/docJoin.js.map +1 -1
  24. package/dist/catalog/docModelConsistencyValidate.js +1 -1
  25. package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
  26. package/dist/catalog/driftSignal.d.ts +11 -5
  27. package/dist/catalog/driftSignal.js +18 -4
  28. package/dist/catalog/driftSignal.js.map +1 -1
  29. package/dist/catalog/modelVersionValidate.d.ts +9 -0
  30. package/dist/catalog/modelVersionValidate.js +38 -0
  31. package/dist/catalog/modelVersionValidate.js.map +1 -0
  32. package/dist/catalog/noteBindingValidate.js +18 -0
  33. package/dist/catalog/noteBindingValidate.js.map +1 -1
  34. package/dist/catalog/orphanedSliceDocValidate.d.ts +8 -1
  35. package/dist/catalog/orphanedSliceDocValidate.js +33 -6
  36. package/dist/catalog/orphanedSliceDocValidate.js.map +1 -1
  37. package/dist/catalog/pages.d.ts +16 -1
  38. package/dist/catalog/pages.js +16 -4
  39. package/dist/catalog/pages.js.map +1 -1
  40. package/dist/catalog/sliceDoc.d.ts +12 -0
  41. package/dist/catalog/sliceDoc.js +15 -0
  42. package/dist/catalog/sliceDoc.js.map +1 -1
  43. package/dist/catalog/sliceReadyValidate.d.ts +12 -1
  44. package/dist/catalog/sliceReadyValidate.js +4 -4
  45. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  46. package/dist/cli/agentsMd.js +9 -3
  47. package/dist/cli/agentsMd.js.map +1 -1
  48. package/dist/cli/ciInit.js +20 -0
  49. package/dist/cli/ciInit.js.map +1 -1
  50. package/dist/cli/conformScope.d.ts +1 -0
  51. package/dist/cli/conformScope.js +13 -4
  52. package/dist/cli/conformScope.js.map +1 -1
  53. package/dist/cli/conformSupersede.d.ts +24 -2
  54. package/dist/cli/conformSupersede.js +44 -3
  55. package/dist/cli/conformSupersede.js.map +1 -1
  56. package/dist/cli/coverage.d.ts +34 -9
  57. package/dist/cli/coverage.js +61 -24
  58. package/dist/cli/coverage.js.map +1 -1
  59. package/dist/cli/findings.d.ts +134 -0
  60. package/dist/cli/findings.js +355 -0
  61. package/dist/cli/findings.js.map +1 -0
  62. package/dist/cli/markImplemented.js +12 -1
  63. package/dist/cli/markImplemented.js.map +1 -1
  64. package/dist/cli/metrics.d.ts +93 -0
  65. package/dist/cli/metrics.js +331 -0
  66. package/dist/cli/metrics.js.map +1 -0
  67. package/dist/cli/modelVersion.d.ts +139 -0
  68. package/dist/cli/modelVersion.js +256 -0
  69. package/dist/cli/modelVersion.js.map +1 -0
  70. package/dist/cli/ratify.js +17 -1
  71. package/dist/cli/ratify.js.map +1 -1
  72. package/dist/cli/reratify.d.ts +17 -0
  73. package/dist/cli/reratify.js +37 -2
  74. package/dist/cli/reratify.js.map +1 -1
  75. package/dist/cli/review.js +12 -1
  76. package/dist/cli/review.js.map +1 -1
  77. package/dist/cli/skillCheck.js +2 -2
  78. package/dist/cli/skillCheck.js.map +1 -1
  79. package/dist/cli/sliceConform.d.ts +50 -0
  80. package/dist/cli/sliceConform.js +206 -0
  81. package/dist/cli/sliceConform.js.map +1 -0
  82. package/dist/cli/sliceIndex.d.ts +2 -0
  83. package/dist/cli/sliceIndex.js +24 -7
  84. package/dist/cli/sliceIndex.js.map +1 -1
  85. package/dist/cli/sliceLink.js +16 -0
  86. package/dist/cli/sliceLink.js.map +1 -1
  87. package/dist/cli/sliceNew.d.ts +12 -0
  88. package/dist/cli/sliceNew.js +23 -0
  89. package/dist/cli/sliceNew.js.map +1 -1
  90. package/dist/cli/sliceStubAll.d.ts +76 -0
  91. package/dist/cli/sliceStubAll.js +189 -0
  92. package/dist/cli/sliceStubAll.js.map +1 -0
  93. package/dist/cli/stateFile.d.ts +63 -7
  94. package/dist/cli/stateFile.js +179 -18
  95. package/dist/cli/stateFile.js.map +1 -1
  96. package/dist/cli/status.d.ts +90 -1
  97. package/dist/cli/status.js +151 -16
  98. package/dist/cli/status.js.map +1 -1
  99. package/dist/cli/upgrade.d.ts +122 -0
  100. package/dist/cli/upgrade.js +476 -0
  101. package/dist/cli/upgrade.js.map +1 -0
  102. package/dist/cli.js +586 -66
  103. package/dist/cli.js.map +1 -1
  104. package/dist/emit/coverageJson.d.ts +2 -2
  105. package/dist/emit/coverageJson.js +6 -2
  106. package/dist/emit/coverageJson.js.map +1 -1
  107. package/dist/emit/freshnessJson.d.ts +1 -1
  108. package/dist/emit/freshnessJson.js +3 -1
  109. package/dist/emit/freshnessJson.js.map +1 -1
  110. package/dist/emit/json.d.ts +34 -1
  111. package/dist/emit/json.js +84 -2
  112. package/dist/emit/json.js.map +1 -1
  113. package/dist/emit/metricsJson.d.ts +7 -0
  114. package/dist/emit/metricsJson.js +27 -0
  115. package/dist/emit/metricsJson.js.map +1 -0
  116. package/dist/emit/statusJson.d.ts +1 -1
  117. package/dist/emit/statusJson.js +22 -1
  118. package/dist/emit/statusJson.js.map +1 -1
  119. package/dist/emit/upgradeJson.d.ts +5 -0
  120. package/dist/emit/upgradeJson.js +26 -0
  121. package/dist/emit/upgradeJson.js.map +1 -0
  122. package/dist/emit/validateJson.d.ts +10 -5
  123. package/dist/emit/validateJson.js +22 -8
  124. package/dist/emit/validateJson.js.map +1 -1
  125. package/dist/mcp/server.d.ts +1 -1
  126. package/dist/mcp/server.js +151 -22
  127. package/dist/mcp/server.js.map +1 -1
  128. package/dist/model/continuation.d.ts +23 -0
  129. package/dist/model/continuation.js +49 -0
  130. package/dist/model/continuation.js.map +1 -0
  131. package/dist/model/queryIndex.js +1 -1
  132. package/dist/model/queryIndex.js.map +1 -1
  133. package/dist/model/rules.d.ts +13 -0
  134. package/dist/model/rules.js +18 -0
  135. package/dist/model/rules.js.map +1 -1
  136. package/dist/model/sliceDocIndex.d.ts +12 -5
  137. package/dist/model/sliceDocIndex.js +18 -7
  138. package/dist/model/sliceDocIndex.js.map +1 -1
  139. package/dist/model/validate.d.ts +20 -0
  140. package/dist/model/validate.js +94 -45
  141. package/dist/model/validate.js.map +1 -1
  142. package/dist/render/sliceStatus.d.ts +3 -3
  143. package/dist/render/sliceStatus.js +27 -29
  144. package/dist/render/sliceStatus.js.map +1 -1
  145. package/dist/templates.d.ts +3 -3
  146. package/dist/templates.js +15 -2
  147. package/dist/templates.js.map +1 -1
  148. package/dist/util/localDate.d.ts +2 -0
  149. package/dist/util/localDate.js +17 -0
  150. package/dist/util/localDate.js.map +1 -0
  151. package/dist/util/semver.d.ts +19 -0
  152. package/dist/util/semver.js +54 -0
  153. package/dist/util/semver.js.map +1 -0
  154. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // `em slice conform` (MIL-214): the per-slice-per-version certification act — "a conform sweep
3
+ // walked THIS version of this slice's code, against target-repo revision R, and found nothing
4
+ // left unruled." Nothing wrote this before now: `implementedIn` only ever said "code exists
5
+ // somewhere for this slice," never "the code that's there was actually checked against version N
6
+ // of this doc" — the gap the whole engagement (MIL-214) exists to close. Sets exactly three
7
+ // frontmatter fields — `conformedVersion: <doc.version>`, `conformedAt: <rev>`,
8
+ // `conformedOn: <local date>` — on the slice doc resolved from the key via the SAME note-binding
9
+ // resolution `ratify`/`reratify`/`mark-implemented`/`em export` use (catalog/docJoin.ts's
10
+ // resolveSliceDocJoin).
11
+ //
12
+ // Write strategy: the same surgical index-math splicing ratify.ts/markImplemented.ts use, via
13
+ // the shared primitives in ./frontmatterSurgery.js — never a parse+re-serialize. New fields are
14
+ // inserted directly after `implementedIn:` (the anchor this ticket's ruling names) when none of
15
+ // the three exist yet; an existing triple is edited in place. Everything else — the body,
16
+ // `version:` itself (read, never written), `status:`, lineage/`covers` keys, and (best-effort)
17
+ // the file's own line-ending style — is copied through verbatim.
18
+ //
19
+ // Preconditions (the owner's ruling, MIL-214):
20
+ // - Legal only for `status: implemented` — a slice that hasn't shipped has no code to certify.
21
+ // - Refuses when there's no `implementedIn:` link at all (the OLD, pre-MIL-214
22
+ // driftSignal-would-be-"in-sync" precondition, computed directly from status+implementedIn
23
+ // here rather than via classifyImplementationDrift — that function is now conformedVersion-
24
+ // aware, so calling it here would always read "uncertified" before the first-ever certify and
25
+ // make this command permanently refuse itself).
26
+ // - Idempotent on the SAME (conformedVersion, conformedAt) pair — re-running with the exact
27
+ // triple already recorded is a no-op, `conformedOn` untouched. A DIFFERENT `--at` (a
28
+ // re-certification at a later revision — "legal and common," the ruling's words) simply
29
+ // OVERWRITES rather than refusing/needing a `--force` escape hatch: `em` has no way to tell
30
+ // "later" from "earlier" for an arbitrary target-repo revision string without walking that
31
+ // repo's git history, which this pure, fs-scoped command never does.
32
+ // - Refuses a continuation key (MIL-208 pattern) — no doc of its own to flip.
33
+ // - Refuses when the newest `conformance/*-findings.json` beside this model whose `revision`
34
+ // equals `--at` still has an unruled finding (`locus: null`) in scope for this slice —
35
+ // the whole point (docs the code was never fully certified, so bumping/certifying past it
36
+ // would be exactly the sequencing bug MIL-214 exists to close). `--skip-findings-check`
37
+ // escapes with a loud notice, never silently.
38
+ import { readFileSync, writeFileSync } from "node:fs";
39
+ import { join } from "node:path";
40
+ import { continuationOf } from "../model/continuation.js";
41
+ import { resolveSliceDocJoin } from "../catalog/docJoin.js";
42
+ import { fieldLineRegex, locateFrontmatterInner, normalizeFieldValue } from "./frontmatterSurgery.js";
43
+ import { isValidDateString } from "./stateFile.js";
44
+ import { listAllFindingsFiles, unruledFindingsInScope } from "./findings.js";
45
+ /**
46
+ * Pure text transform: reads the CURRENT `version:` value (never writes it) and writes
47
+ * `conformedVersion:`/`conformedAt:`/`conformedOn:` in `raw`'s frontmatter block. See module
48
+ * header for the full precondition/idempotency contract. No fs access — the caller reads/writes;
49
+ * see `runSliceConform` below.
50
+ */
51
+ export function applyConformFrontmatter(raw, sliceKey, at, on) {
52
+ const trimmedAt = at.trim();
53
+ if (!trimmedAt)
54
+ return { ok: false, message: "a target-repo revision is required (--at)" };
55
+ if (/[\x00-\x1f\x7f\s]/.test(trimmedAt)) {
56
+ return { ok: false, message: "revision (--at) must not contain control characters or whitespace" };
57
+ }
58
+ if (!isValidDateString(on)) {
59
+ return { ok: false, message: `invalid date "${on}" — expected YYYY-MM-DD` };
60
+ }
61
+ const range = locateFrontmatterInner(raw);
62
+ if (!range)
63
+ return { ok: false, message: "no frontmatter block found" };
64
+ const inner = raw.slice(range.innerStart, range.innerEnd);
65
+ const statusMatch = fieldLineRegex("status").exec(inner);
66
+ if (!statusMatch)
67
+ return { ok: false, message: "no `status:` field found in frontmatter" };
68
+ const currentStatus = normalizeFieldValue(statusMatch[2])?.toLowerCase() ?? null;
69
+ if (currentStatus !== "implemented") {
70
+ return {
71
+ ok: false,
72
+ message: `slice "${sliceKey}" is \`status: ${currentStatus ?? "(empty)"}\` — only a slice at ` +
73
+ "`status: implemented` can be certified; run `em slice mark-implemented` first",
74
+ };
75
+ }
76
+ const implMatch = fieldLineRegex("implementedIn").exec(inner);
77
+ const currentImplementedIn = implMatch ? normalizeFieldValue(implMatch[2]) : null;
78
+ if (currentImplementedIn === null) {
79
+ return {
80
+ ok: false,
81
+ message: `slice "${sliceKey}" has \`status: implemented\` but no \`implementedIn:\` link — nothing to certify against`,
82
+ };
83
+ }
84
+ const versionMatch = fieldLineRegex("version").exec(inner);
85
+ const currentVersionRaw = versionMatch ? normalizeFieldValue(versionMatch[2]) : null;
86
+ const version = currentVersionRaw !== null ? Number(currentVersionRaw) : NaN;
87
+ if (!Number.isInteger(version) || version < 1) {
88
+ return { ok: false, message: `doc's \`version:\` value "${currentVersionRaw ?? ""}" isn't a positive integer — refusing to certify` };
89
+ }
90
+ const cvMatch = fieldLineRegex("conformedVersion").exec(inner);
91
+ const caMatch = fieldLineRegex("conformedAt").exec(inner);
92
+ const coMatch = fieldLineRegex("conformedOn").exec(inner);
93
+ const currentConformedVersion = cvMatch ? normalizeFieldValue(cvMatch[2]) : null;
94
+ const currentConformedAt = caMatch ? normalizeFieldValue(caMatch[2]) : null;
95
+ // Idempotent on the (conformedVersion, conformedAt) pair — see module header. `conformedOn` is
96
+ // deliberately excluded from the identity check: it's a timestamp, not provenance identity the
97
+ // way ratifiedBy/ratifiedOn's PAIR is for ratify (there, either differing refuses; here, only
98
+ // the (version, revision) pair is the thing that must not silently change without the caller
99
+ // noticing — a same-day-different-time rerun is not a conflict).
100
+ if (currentConformedVersion === String(version) && currentConformedAt === trimmedAt) {
101
+ return { ok: true, content: raw, changed: false, version };
102
+ }
103
+ // Match the file's own line-ending style for any freshly-inserted line — same trick
104
+ // ratify.ts/markImplemented.ts use.
105
+ const afterImpl = inner.slice(implMatch.index + implMatch[0].length);
106
+ const eol = afterImpl.startsWith("\r\n") ? "\r\n" : "\n";
107
+ const missingLines = [];
108
+ if (!cvMatch)
109
+ missingLines.push(`conformedVersion: ${version}`);
110
+ if (!caMatch)
111
+ missingLines.push(`conformedAt: ${trimmedAt}`);
112
+ if (!coMatch)
113
+ missingLines.push(`conformedOn: ${on}`);
114
+ const implNext = missingLines.length > 0 ? `${implMatch[0]}${eol}${missingLines.join(eol)}` : null;
115
+ const edits = [];
116
+ if (implNext !== null)
117
+ edits.push({ index: implMatch.index, oldLen: implMatch[0].length, next: implNext });
118
+ if (cvMatch)
119
+ edits.push({ index: cvMatch.index, oldLen: cvMatch[0].length, next: `${cvMatch[1]}${version}` });
120
+ if (caMatch)
121
+ edits.push({ index: caMatch.index, oldLen: caMatch[0].length, next: `${caMatch[1]}${trimmedAt}` });
122
+ if (coMatch)
123
+ edits.push({ index: coMatch.index, oldLen: coMatch[0].length, next: `${coMatch[1]}${on}` });
124
+ edits.sort((a, b) => b.index - a.index);
125
+ let updatedInner = inner;
126
+ for (const edit of edits) {
127
+ updatedInner = updatedInner.slice(0, edit.index) + edit.next + updatedInner.slice(edit.index + edit.oldLen);
128
+ }
129
+ const content = raw.slice(0, range.innerStart) + updatedInner + raw.slice(range.innerEnd);
130
+ return { ok: true, content, changed: true, version };
131
+ }
132
+ /** Scan `<baseDir>/conformance/*-findings.json`, newest filename first, for the first one whose
133
+ * `revision` matches `at` — the "newest findings JSON whose revision == --at" the ruling
134
+ * describes. A malformed candidate is silently skipped (not refused): this is a best-effort
135
+ * lookup for the findings-check gate below, not itself a validator — `em conform-findings
136
+ * check` is where a broken findings file gets a loud diagnosis. Returns null when the
137
+ * `conformance/` directory doesn't exist, or no candidate matches `at`. */
138
+ export function findLatestFindingsForRevision(baseDir, at) {
139
+ return listAllFindingsFiles(baseDir).find((f) => f.doc.revision === at) ?? null;
140
+ }
141
+ /**
142
+ * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`reratify`/
143
+ * `mark-implemented`/`em export` use (MIL-121 cross-binding included), runs the findings-check
144
+ * gate, then reads/applies/writes it. `baseDir` is the `.em` file's directory, same convention
145
+ * every doc/note path in `em` uses.
146
+ */
147
+ export function runSliceConform(model, refs, baseDir, sliceKey, at, on, skipFindingsCheck = false) {
148
+ const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
149
+ if (sliceIndex === -1) {
150
+ return { ok: false, message: `no slice with export key "${sliceKey}" in this model` };
151
+ }
152
+ const slice = model.slices[sliceIndex];
153
+ const { doc, continuationOf: continuationOfKey } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
154
+ // MIL-208: see ratify.ts's runRatify — a continuation slice has no doc of its own to certify.
155
+ if (continuationOfKey) {
156
+ const continuation = continuationOf(model, refs, sliceIndex);
157
+ const viewName = model.byId.get(continuation.viewLogicalId).name;
158
+ return {
159
+ ok: false,
160
+ message: `"${sliceKey}" is a continuation of "${continuationOfKey}" (view "${viewName}" again) — ` +
161
+ `it has no doc of its own; conform "${continuationOfKey}" instead`,
162
+ };
163
+ }
164
+ if (doc.reason === "no-doc-bound") {
165
+ return {
166
+ ok: false,
167
+ message: `slice "${sliceKey}" has no doc bound via \`note "slices/${sliceKey}.md"\` — bind a slice doc before certifying it`,
168
+ };
169
+ }
170
+ if (doc.reason === "binding-missing-file") {
171
+ return { ok: false, message: `slice "${sliceKey}" notes "${doc.path}" but no such file exists` };
172
+ }
173
+ if (doc.reason === "frontmatter-invalid") {
174
+ return {
175
+ ok: false,
176
+ message: `slice doc "${doc.path}" has missing or invalid frontmatter — run \`em validate\` for details`,
177
+ };
178
+ }
179
+ const found = findLatestFindingsForRevision(baseDir, at);
180
+ let skippedFindingsCheck = null;
181
+ if (found) {
182
+ const unruled = unruledFindingsInScope(found.doc.findings, new Set([sliceKey]));
183
+ if (unruled.length > 0) {
184
+ if (!skipFindingsCheck) {
185
+ return {
186
+ ok: false,
187
+ message: `slice "${sliceKey}" has ${unruled.length} unruled conformance finding(s) in ${found.path} ` +
188
+ `(id ${unruled.map((f) => f.id).join(", ")}) — rule on them (\`em conform-supersede --locus --by\`) ` +
189
+ "or pass --skip-findings-check to certify anyway",
190
+ };
191
+ }
192
+ skippedFindingsCheck = unruled.map((f) => f.id);
193
+ }
194
+ }
195
+ const absPath = join(baseDir, doc.path);
196
+ const raw = readFileSync(absPath, "utf8");
197
+ const result = applyConformFrontmatter(raw, sliceKey, at, on);
198
+ if (!result.ok) {
199
+ return { ok: false, message: `${doc.path}: ${result.message}` };
200
+ }
201
+ if (result.changed) {
202
+ writeFileSync(absPath, result.content, "utf8");
203
+ }
204
+ return { ok: true, path: doc.path, changed: result.changed, version: result.version, skippedFindingsCheck };
205
+ }
206
+ //# sourceMappingURL=sliceConform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sliceConform.js","sourceRoot":"","sources":["../../src/cli/sliceConform.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@ export interface SliceIndexRow {
16
16
  owner: string;
17
17
  tracking: string;
18
18
  implementedIn: string;
19
+ /** MIL-214: `v<N> @ <rev>`, or `—` — see `conformedCell`. */
20
+ conformed: string;
19
21
  docPath: string;
20
22
  }
21
23
  export interface SliceIndexTable {
@@ -16,8 +16,19 @@ import { applyMarker } from "../util/markers.js";
16
16
  /** The marker name wrapping the Slices table: `<!-- GENERATED:slices:start -->` /
17
17
  * `<!-- GENERATED:slices:end -->`, matching templates/model-readme.md. */
18
18
  export const SLICE_INDEX_MARKER = "slices";
19
- const TABLE_HEADER = "| # | Slice | Pattern | Status | Reviewed by | Ratified by | Owner | Tracking | Implemented in | Design doc |\n" +
20
- "|---|-------|---------|--------|-------------|-------------|-------|----------|----------------|------------|";
19
+ const TABLE_HEADER = "| # | Slice | Pattern | Status | Reviewed by | Ratified by | Owner | Tracking | Implemented in | Conformed | Design doc |\n" +
20
+ "|---|-------|---------|--------|-------------|-------------|-------|----------|----------------|-----------|------------|";
21
+ /** MIL-214: `v<N> @ <rev>` when this slice's current version has a conformance certification
22
+ * (`doc.conformedVersion`/`doc.conformedAt` both set — always set together, `em slice conform`'s
23
+ * only write path), `—` otherwise. Deliberately reports the RECORDED certification verbatim,
24
+ * even when it's stale (`conformedVersion !== doc.version`, the `uncertified` driftSignal case)
25
+ * — `em status`/`em export`'s `driftSignal` is where "is this still current" is judged; this
26
+ * column is just "what was last certified, and against what revision". */
27
+ function conformedCell(doc) {
28
+ if (doc.conformedVersion === null || doc.conformedAt === null)
29
+ return "—";
30
+ return `v${doc.conformedVersion} @ ${doc.conformedAt}`;
31
+ }
21
32
  /** Escape characters that would break a markdown table cell: `|` (the column separator) and
22
33
  * newlines (a slice name is always one line, but a doc's freeform `implementedIn` text isn't
23
34
  * guaranteed to be). */
@@ -33,8 +44,13 @@ function escapeCell(s) {
33
44
  * templates/model-readme.md and reference/extract.md already use for a slice that hasn't
34
45
  * reached the `slice` phase. `doc.found` false covers both of docJoin's not-found reasons
35
46
  * (no-doc-bound and binding-missing-file) — catalog doesn't distinguish them either, since a
36
- * broken binding still means "there's no doc a human can currently read." */
37
- function statusCell(doc) {
47
+ * broken binding still means "there's no doc a human can currently read." `continuationOf`
48
+ * (MIL-208) wins over both: a continuation slice's row names the originating slice instead of
49
+ * echoing its (borrowed) status verbatim, which would otherwise look like an independent slice
50
+ * happens to share the same status by coincidence. */
51
+ function statusCell(doc, continuationOf) {
52
+ if (continuationOf)
53
+ return `continuation of \`${continuationOf}\``;
38
54
  if (!doc.found)
39
55
  return "no doc yet";
40
56
  return doc.status ?? "unknown";
@@ -46,24 +62,25 @@ export function buildSliceIndexTable(model, refs, baseDir) {
46
62
  const rows = model.slices.map((slice, i) => {
47
63
  const sliceKey = refs.sliceKeys[i];
48
64
  const pattern = classifySlicePattern(slice);
49
- const { doc, diagnostics: docDiags } = resolveSliceDocJoin(slice, sliceKey, baseDir, (id) => refs.refById.get(id));
65
+ const { doc, diagnostics: docDiags, continuationOf } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
50
66
  diagnostics.push(...docDiags);
51
67
  return {
52
68
  index: i + 1,
53
69
  name: slice.name,
54
70
  pattern: slicePatternLabel(pattern),
55
- status: statusCell(doc),
71
+ status: statusCell(doc, continuationOf),
56
72
  reviewedBy: doc.reviewedBy ?? "—",
57
73
  ratifiedBy: doc.ratifiedBy ?? "—",
58
74
  owner: doc.owner ?? "—",
59
75
  tracking: doc.tracking ?? "—",
60
76
  implementedIn: doc.implementedIn ?? "—",
77
+ conformed: conformedCell(doc),
61
78
  docPath: doc.path,
62
79
  };
63
80
  });
64
81
  const lines = rows.map((r) => `| ${r.index} | ${escapeCell(r.name)} | ${escapeCell(r.pattern)} | ${escapeCell(r.status)} | ` +
65
82
  `${escapeCell(r.reviewedBy)} | ${escapeCell(r.ratifiedBy)} | ${escapeCell(r.owner)} | ` +
66
- `${escapeCell(r.tracking)} | ${escapeCell(r.implementedIn)} | [${r.docPath}](${r.docPath}) |`);
83
+ `${escapeCell(r.tracking)} | ${escapeCell(r.implementedIn)} | ${escapeCell(r.conformed)} | [${r.docPath}](${r.docPath}) |`);
67
84
  return { markdown: [TABLE_HEADER, ...lines].join("\n"), rows, diagnostics };
68
85
  }
69
86
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sliceIndex.js","sourceRoot":"","sources":["../../src/cli/sliceIndex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sliceIndex.js","sourceRoot":"","sources":["../../src/cli/sliceIndex.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,7 @@
36
36
  // Refuses (never overwrites/duplicates) when the header line already carries a `note` clause —
37
37
  // the caller falls back to printing the line for a hand edit, same as when `--wire` isn't passed
38
38
  // at all.
39
+ import { continuationOf } from "../model/continuation.js";
39
40
  import { indexOfUnquoted, stripComment } from "../parser/lexer.js";
40
41
  /** Which element kind(s) count as a slice's "primary" element per pattern — the one `note
41
42
  * "slices/<key>.md"` binds to (SKILL.md's slice phase, step 4): the command for State Change,
@@ -73,6 +74,21 @@ export function resolvePrimaryElement(model, refs, sliceKey, pattern) {
73
74
  message: `slice "${slice.name}" has ${candidates.length} ${kinds.join("/")} elements — ambiguous, wire the note by hand`,
74
75
  };
75
76
  }
77
+ // MIL-208: the sole candidate view is `again` — this slice is a CONTINUATION of the view's
78
+ // originating slice, which has no doc of its own to scaffold/wire. Refuse and point at the
79
+ // originating slice's key and doc path instead of wiring a doc this slice can never be
80
+ // ratified against.
81
+ if (candidates[0].kind === "view" && candidates[0].again === true) {
82
+ const continuation = continuationOf(model, refs, sliceIndex);
83
+ if (continuation) {
84
+ const viewName = model.byId.get(continuation.viewLogicalId).name;
85
+ return {
86
+ ok: false,
87
+ message: `slice "${slice.name}" is a later instance of "${viewName}" (again) — it has no doc of ` +
88
+ `its own; the doc lives at slices/${continuation.sliceKey}.md (slice "${continuation.sliceKey}")`,
89
+ };
90
+ }
91
+ }
76
92
  return { ok: true, sliceIndex, element: candidates[0] };
77
93
  }
78
94
  /** Insert `note "<notePath>"` into one raw source line — see module header for the placement
@@ -1 +1 @@
1
- {"version":3,"file":"sliceLink.js","sourceRoot":"","sources":["../../src/cli/sliceLink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sliceLink.js","sourceRoot":"","sources":["../../src/cli/sliceLink.ts"],"names":[],"mappings":"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"}
@@ -16,3 +16,15 @@ export declare function sliceDocKey(displayName: string): string;
16
16
  * ...) is deliberately left out, staying hand-authored per templates/slice.md.
17
17
  */
18
18
  export declare function buildSliceDocContent(displayName: string, key: string, pattern: SlicePattern, swimlane: string): string;
19
+ /**
20
+ * Build the full contents of a fresh, near-free `slices/<key>.md` STUB (MIL-184: `em slice new
21
+ * --stub` / `em slice stub-all`) — the same 5 frontmatter keys `buildSliceDocContent` writes
22
+ * (nothing else, same as above), but the body is one placeholder line instead of the
23
+ * diagram-image stub and every judgment section (Intent, Command, Scenarios, Open Questions,
24
+ * ...) a full slice doc eventually carries. Exists purely so the slice has a real, single-
25
+ * source-of-truth `status` — every lifecycle tool that reads `doc.status` (render coloring,
26
+ * `em status`, `driftSignal`, `em slice index`) treats a stub exactly like any other doc, since
27
+ * it's the same frontmatter dialect. Deepen it later with `em slice new` (no `--stub`) + `-f` to
28
+ * overwrite this placeholder body once the team is ready to write the real spec.
29
+ */
30
+ export declare function buildStubDocContent(displayName: string, pattern: SlicePattern, swimlane: string): string;
@@ -50,4 +50,27 @@ export function buildSliceDocContent(displayName, key, pattern, swimlane) {
50
50
  `\n` +
51
51
  `![Diagram](./${key}.svg)\n`);
52
52
  }
53
+ /**
54
+ * Build the full contents of a fresh, near-free `slices/<key>.md` STUB (MIL-184: `em slice new
55
+ * --stub` / `em slice stub-all`) — the same 5 frontmatter keys `buildSliceDocContent` writes
56
+ * (nothing else, same as above), but the body is one placeholder line instead of the
57
+ * diagram-image stub and every judgment section (Intent, Command, Scenarios, Open Questions,
58
+ * ...) a full slice doc eventually carries. Exists purely so the slice has a real, single-
59
+ * source-of-truth `status` — every lifecycle tool that reads `doc.status` (render coloring,
60
+ * `em status`, `driftSignal`, `em slice index`) treats a stub exactly like any other doc, since
61
+ * it's the same frontmatter dialect. Deepen it later with `em slice new` (no `--stub`) + `-f` to
62
+ * overwrite this placeholder body once the team is ready to write the real spec.
63
+ */
64
+ export function buildStubDocContent(displayName, pattern, swimlane) {
65
+ return (`---\n` +
66
+ `schemaVersion: ${SCHEMA_VERSION}\n` +
67
+ `pattern: ${pattern}\n` +
68
+ `swimlane: ${swimlane}\n` +
69
+ `status: draft\n` +
70
+ `version: 1\n` +
71
+ `---\n` +
72
+ `# Slice: ${displayName}\n` +
73
+ `\n` +
74
+ `_Stub — deepen with the slice phase (see slice-doc-schema.md)._\n`);
75
+ }
53
76
  //# sourceMappingURL=sliceNew.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sliceNew.js","sourceRoot":"","sources":["../../src/cli/sliceNew.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qFAAqF;AACrF,6FAA6F;AAC7F,6FAA6F;AAC7F,4FAA4F;AAC5F,8FAA8F;AAC9F,+FAA+F;AAC/F,8FAA8F;AAC9F,+FAA+F;AAC/F,6FAA6F;AAC7F,EAAE;AACF,8FAA8F;AAC9F,oFAAoF;AACpF,6BAA6B;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAU,CAAC;AAGnG,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;8BAG8B;AAC9B,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB;;;6EAG6E;AAC7E,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,GAAW,EAAE,OAAqB,EAAE,QAAgB;IAC5G,OAAO,CACL,OAAO;QACP,kBAAkB,cAAc,IAAI;QACpC,YAAY,OAAO,IAAI;QACvB,aAAa,QAAQ,IAAI;QACzB,iBAAiB;QACjB,cAAc;QACd,OAAO;QACP,YAAY,WAAW,IAAI;QAC3B,IAAI;QACJ,gBAAgB,GAAG,SAAS,CAC7B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sliceNew.js","sourceRoot":"","sources":["../../src/cli/sliceNew.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qFAAqF;AACrF,6FAA6F;AAC7F,6FAA6F;AAC7F,4FAA4F;AAC5F,8FAA8F;AAC9F,+FAA+F;AAC/F,8FAA8F;AAC9F,+FAA+F;AAC/F,6FAA6F;AAC7F,EAAE;AACF,8FAA8F;AAC9F,oFAAoF;AACpF,6BAA6B;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAU,CAAC;AAGnG,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;8BAG8B;AAC9B,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB;;;6EAG6E;AAC7E,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,GAAW,EAAE,OAAqB,EAAE,QAAgB;IAC5G,OAAO,CACL,OAAO;QACP,kBAAkB,cAAc,IAAI;QACpC,YAAY,OAAO,IAAI;QACvB,aAAa,QAAQ,IAAI;QACzB,iBAAiB;QACjB,cAAc;QACd,OAAO;QACP,YAAY,WAAW,IAAI;QAC3B,IAAI;QACJ,gBAAgB,GAAG,SAAS,CAC7B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAqB,EAAE,QAAgB;IAC9F,OAAO,CACL,OAAO;QACP,kBAAkB,cAAc,IAAI;QACpC,YAAY,OAAO,IAAI;QACvB,aAAa,QAAQ,IAAI;QACzB,iBAAiB;QACjB,cAAc;QACd,OAAO;QACP,YAAY,WAAW,IAAI;QAC3B,IAAI;QACJ,mEAAmE,CACpE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { NormalizedModel, Slice } from "../model/model.js";
2
+ import { RefsResult } from "../model/refs.js";
3
+ import { SlicePattern } from "./sliceNew.js";
4
+ /** `--status`'s exact 4-value enum — the same lifecycle values every slice doc already uses
5
+ * (docs/slice-doc-schema.md); `stub-all` never invents a 5th "backbone"/"existing" value. */
6
+ export declare const STUB_STATUSES: readonly ["draft", "reviewed", "ready-to-implement", "implemented"];
7
+ export type StubStatus = (typeof STUB_STATUSES)[number];
8
+ export declare function isStubStatus(value: string): value is StubStatus;
9
+ /**
10
+ * MIL-184: derive a stub's `swimlane` from the slice's own shape rather than asking for one per
11
+ * slice — the slice's first `ui` element's resolved `persona`, arrow-joined to its first `event`
12
+ * element's resolved `context`, both in declaration order (matching `wireSliceNote`'s own
13
+ * "first candidate wins" convention). Falls back to the literal placeholder `"— → —"` when either
14
+ * side is missing (a slice with no `ui` at all — a pure Automation/Translation reaction never
15
+ * has a screen of its own — or, vanishingly rare, no `event` either): a placeholder is honest
16
+ * about "nobody's filled this in yet," which is exactly a stub's whole premise, rather than
17
+ * guessing a lane from unrelated context.
18
+ */
19
+ export declare function deriveStubSwimlane(slice: Slice): string;
20
+ export type ApplyStubStatusResult = {
21
+ ok: true;
22
+ content: string;
23
+ } | {
24
+ ok: false;
25
+ message: string;
26
+ };
27
+ /**
28
+ * Escalates a freshly-built `status: draft` stub's content to `status`, reusing review/ratify/
29
+ * mark-implemented's own pure frontmatter writers (see module header) — never a second
30
+ * implementation of what those statuses write. `by`/`on` are required by the CALLER (the CLI
31
+ * action, which enforces `--by` before compiling anything) whenever `status !== "draft"`; this
32
+ * function has no opinion about CLI flag requiredness, only about what each writer itself
33
+ * validates (a blank `by`, a malformed `on`). `implementedInUrl` only matters for `status ===
34
+ * "implemented"` — required there, ignored otherwise.
35
+ */
36
+ export declare function applyStubStatus(content: string, sliceKey: string, status: StubStatus, by: string, on: string, implementedInUrl: string | null): ApplyStubStatusResult;
37
+ export type StubAllOutcome = {
38
+ kind: "stubbed";
39
+ sliceKey: string;
40
+ path: string;
41
+ pattern: SlicePattern;
42
+ swimlane: string;
43
+ status: StubStatus;
44
+ /** False only for the `binding-missing-file` case: a note already pointed at this path, so
45
+ * there was nothing left to wire. */
46
+ wired: boolean;
47
+ elementName: string | null;
48
+ } | {
49
+ kind: "skip";
50
+ sliceKey: string;
51
+ reason: string;
52
+ };
53
+ export interface StubAllOptions {
54
+ status: StubStatus;
55
+ /** Required by the caller whenever `status !== "draft"` — `null` only ever legal for `draft`. */
56
+ by: string | null;
57
+ on: string;
58
+ implementedInUrl: string | null;
59
+ dryRun: boolean;
60
+ }
61
+ export interface StubAllResult {
62
+ outcomes: StubAllOutcome[];
63
+ /** The `.em` file's source text with every successful `--wire` insertion applied, in slice
64
+ * order — byte-identical to the input `source` when nothing needed wiring, or when `dryRun`.
65
+ * The caller (the CLI action) writes this back to `<file>`, same read/resolve/write split
66
+ * `em slice new --wire`'s own CLI action keeps. */
67
+ source: string;
68
+ }
69
+ /**
70
+ * Walks `model.slices` in declaration order and, for every slice with no resolvable doc, writes
71
+ * a stub `slices/<key>.md` (skipped entirely when `opts.dryRun`) and wires it into `source` —
72
+ * see the module header for the full per-slice decision tree. `baseDir` is the `.em` file's
73
+ * directory, same convention every doc/note path in `em` uses. Never throws on a per-slice
74
+ * problem — every failure becomes a `"skip"` outcome so one bad slice doesn't abort the batch.
75
+ */
76
+ export declare function runStubAll(model: NormalizedModel, refs: RefsResult, baseDir: string, source: string, opts: StubAllOptions): StubAllResult;