@milehimikey/em 1.16.1 → 1.18.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 (219) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +1 -1
  2. package/.claude/skills/event-modeling-conform/SKILL.md +3 -2
  3. package/.claude/skills/event-modeling-conform/reference/conform.md +7 -0
  4. package/.claude/skills/event-modeling-design/SKILL.md +46 -5
  5. package/.claude/skills/event-modeling-discover/SKILL.md +43 -8
  6. package/.claude/skills/event-modeling-discover/reference/extract.md +6 -1
  7. package/.claude/skills/event-modeling-discover/reference/prd-rubric.md +102 -0
  8. package/.claude/skills/event-modeling-discover/reference/prd-spec-path.md +171 -0
  9. package/.claude/skills/event-modeling-engagement/SKILL.md +28 -6
  10. package/.claude/skills/event-modeling-engagement/reference/engagement.md +5 -4
  11. package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
  12. package/.claude/skills/event-modeling-implement/reference/implement.md +18 -8
  13. package/.claude/skills/event-modeling-review/SKILL.md +1 -1
  14. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +107 -10
  15. package/.claude/skills/event-modeling-shared/reference/methodology.md +268 -0
  16. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +122 -15
  17. package/.claude/skills/event-modeling-shared/templates/slice.md +11 -3
  18. package/.claude-plugin/marketplace.json +2 -2
  19. package/dist/catalog/docJoin.d.ts +13 -5
  20. package/dist/catalog/docJoin.js +6 -1
  21. package/dist/catalog/docJoin.js.map +1 -1
  22. package/dist/catalog/docModelConsistencyValidate.js +160 -0
  23. package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
  24. package/dist/catalog/invariantsValidate.d.ts +2 -0
  25. package/dist/catalog/invariantsValidate.js +67 -1
  26. package/dist/catalog/invariantsValidate.js.map +1 -1
  27. package/dist/catalog/scenarioQualityValidate.d.ts +4 -0
  28. package/dist/catalog/scenarioQualityValidate.js +148 -0
  29. package/dist/catalog/scenarioQualityValidate.js.map +1 -0
  30. package/dist/catalog/scenarios.d.ts +5 -0
  31. package/dist/catalog/scenarios.js +80 -0
  32. package/dist/catalog/scenarios.js.map +1 -1
  33. package/dist/catalog/signedBodyValidate.d.ts +7 -0
  34. package/dist/catalog/signedBodyValidate.js +29 -0
  35. package/dist/catalog/signedBodyValidate.js.map +1 -0
  36. package/dist/catalog/sliceDoc.d.ts +53 -7
  37. package/dist/catalog/sliceDoc.js +89 -10
  38. package/dist/catalog/sliceDoc.js.map +1 -1
  39. package/dist/catalog/sliceReadyValidate.d.ts +23 -2
  40. package/dist/catalog/sliceReadyValidate.js +54 -22
  41. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  42. package/dist/catalog/sliceSections.d.ts +3 -2
  43. package/dist/catalog/sliceSections.js +99 -9
  44. package/dist/catalog/sliceSections.js.map +1 -1
  45. package/dist/cli/ciInit.d.ts +4 -11
  46. package/dist/cli/ciInit.js +24 -6
  47. package/dist/cli/ciInit.js.map +1 -1
  48. package/dist/cli/coverage.d.ts +9 -0
  49. package/dist/cli/coverage.js +18 -0
  50. package/dist/cli/coverage.js.map +1 -1
  51. package/dist/cli/defer.d.ts +60 -17
  52. package/dist/cli/defer.js +187 -86
  53. package/dist/cli/defer.js.map +1 -1
  54. package/dist/cli/engagement.d.ts +46 -0
  55. package/dist/cli/engagement.js +156 -1
  56. package/dist/cli/engagement.js.map +1 -1
  57. package/dist/cli/engagementFoundation.d.ts +47 -0
  58. package/dist/cli/engagementFoundation.js +164 -0
  59. package/dist/cli/engagementFoundation.js.map +1 -0
  60. package/dist/cli/frontmatterSurgery.d.ts +5 -0
  61. package/dist/cli/frontmatterSurgery.js +15 -0
  62. package/dist/cli/frontmatterSurgery.js.map +1 -1
  63. package/dist/cli/ledgerCheck.d.ts +5 -1
  64. package/dist/cli/ledgerCheck.js +50 -20
  65. package/dist/cli/ledgerCheck.js.map +1 -1
  66. package/dist/cli/markImplemented.d.ts +14 -10
  67. package/dist/cli/markImplemented.js +49 -1
  68. package/dist/cli/markImplemented.js.map +1 -1
  69. package/dist/cli/prdTriage.d.ts +109 -0
  70. package/dist/cli/prdTriage.js +378 -0
  71. package/dist/cli/prdTriage.js.map +1 -0
  72. package/dist/cli/ratify.d.ts +14 -2
  73. package/dist/cli/ratify.js +34 -6
  74. package/dist/cli/ratify.js.map +1 -1
  75. package/dist/cli/refsCheck.d.ts +78 -0
  76. package/dist/cli/refsCheck.js +153 -0
  77. package/dist/cli/refsCheck.js.map +1 -0
  78. package/dist/cli/render-inputs.d.ts +2 -0
  79. package/dist/cli/render-inputs.js +4 -0
  80. package/dist/cli/render-inputs.js.map +1 -1
  81. package/dist/cli/revise.d.ts +12 -3
  82. package/dist/cli/revise.js +43 -10
  83. package/dist/cli/revise.js.map +1 -1
  84. package/dist/cli/shape.d.ts +27 -0
  85. package/dist/cli/shape.js +77 -0
  86. package/dist/cli/shape.js.map +1 -0
  87. package/dist/cli/sliceConform.js +9 -0
  88. package/dist/cli/sliceConform.js.map +1 -1
  89. package/dist/cli/sliceIndex.d.ts +6 -1
  90. package/dist/cli/sliceIndex.js +28 -13
  91. package/dist/cli/sliceIndex.js.map +1 -1
  92. package/dist/cli/sliceNew.d.ts +4 -1
  93. package/dist/cli/sliceNew.js +26 -9
  94. package/dist/cli/sliceNew.js.map +1 -1
  95. package/dist/cli/status.d.ts +26 -5
  96. package/dist/cli/status.js +28 -6
  97. package/dist/cli/status.js.map +1 -1
  98. package/dist/cli/storylineSuggest.d.ts +26 -0
  99. package/dist/cli/storylineSuggest.js +252 -0
  100. package/dist/cli/storylineSuggest.js.map +1 -0
  101. package/dist/cli/upgrade.d.ts +15 -3
  102. package/dist/cli/upgrade.js +537 -8
  103. package/dist/cli/upgrade.js.map +1 -1
  104. package/dist/cli/upgradeReshape.d.ts +60 -0
  105. package/dist/cli/upgradeReshape.js +425 -0
  106. package/dist/cli/upgradeReshape.js.map +1 -0
  107. package/dist/cli.js +430 -57
  108. package/dist/cli.js.map +1 -1
  109. package/dist/emit/dot.d.ts +2 -0
  110. package/dist/emit/dot.js +44 -8
  111. package/dist/emit/dot.js.map +1 -1
  112. package/dist/emit/engagementJson.d.ts +4 -1
  113. package/dist/emit/engagementJson.js +27 -1
  114. package/dist/emit/engagementJson.js.map +1 -1
  115. package/dist/emit/json.d.ts +21 -1
  116. package/dist/emit/json.js +29 -2
  117. package/dist/emit/json.js.map +1 -1
  118. package/dist/emit/ledgerJson.d.ts +1 -1
  119. package/dist/emit/ledgerJson.js +6 -1
  120. package/dist/emit/ledgerJson.js.map +1 -1
  121. package/dist/emit/queryJson.d.ts +1 -1
  122. package/dist/emit/queryJson.js +3 -1
  123. package/dist/emit/queryJson.js.map +1 -1
  124. package/dist/emit/refsJson.d.ts +4 -0
  125. package/dist/emit/refsJson.js +19 -0
  126. package/dist/emit/refsJson.js.map +1 -0
  127. package/dist/emit/statusJson.d.ts +1 -1
  128. package/dist/emit/statusJson.js +6 -1
  129. package/dist/emit/statusJson.js.map +1 -1
  130. package/dist/emit/theme.d.ts +1 -0
  131. package/dist/emit/theme.js +13 -0
  132. package/dist/emit/theme.js.map +1 -1
  133. package/dist/emit/validateJson.d.ts +5 -2
  134. package/dist/emit/validateJson.js +41 -2
  135. package/dist/emit/validateJson.js.map +1 -1
  136. package/dist/layout/grid.d.ts +5 -1
  137. package/dist/layout/grid.js +93 -2
  138. package/dist/layout/grid.js.map +1 -1
  139. package/dist/mcp/server.js +79 -14
  140. package/dist/mcp/server.js.map +1 -1
  141. package/dist/model/edges.d.ts +7 -0
  142. package/dist/model/edges.js +33 -16
  143. package/dist/model/edges.js.map +1 -1
  144. package/dist/model/model.d.ts +33 -0
  145. package/dist/model/model.js +87 -3
  146. package/dist/model/model.js.map +1 -1
  147. package/dist/model/queryIndex.js +2 -2
  148. package/dist/model/queryIndex.js.map +1 -1
  149. package/dist/model/refs.js +8 -5
  150. package/dist/model/refs.js.map +1 -1
  151. package/dist/model/rules.d.ts +167 -1
  152. package/dist/model/rules.js +164 -3
  153. package/dist/model/rules.js.map +1 -1
  154. package/dist/model/shapeLint.d.ts +12 -0
  155. package/dist/model/shapeLint.js +170 -0
  156. package/dist/model/shapeLint.js.map +1 -0
  157. package/dist/model/storylines.d.ts +51 -0
  158. package/dist/model/storylines.js +188 -0
  159. package/dist/model/storylines.js.map +1 -0
  160. package/dist/model/validate.d.ts +6 -1
  161. package/dist/model/validate.js +317 -14
  162. package/dist/model/validate.js.map +1 -1
  163. package/dist/parser/againSugar.d.ts +30 -0
  164. package/dist/parser/againSugar.js +105 -0
  165. package/dist/parser/againSugar.js.map +1 -0
  166. package/dist/parser/ast.d.ts +33 -0
  167. package/dist/parser/lexer.d.ts +9 -1
  168. package/dist/parser/lexer.js +17 -2
  169. package/dist/parser/lexer.js.map +1 -1
  170. package/dist/parser/parser.js +284 -4
  171. package/dist/parser/parser.js.map +1 -1
  172. package/dist/query/format.js +1 -0
  173. package/dist/query/format.js.map +1 -1
  174. package/dist/query/verbs.d.ts +4 -0
  175. package/dist/query/verbs.js +30 -3
  176. package/dist/query/verbs.js.map +1 -1
  177. package/dist/render/drawEdges.js +100 -4
  178. package/dist/render/drawEdges.js.map +1 -1
  179. package/dist/render/render.js +20 -2
  180. package/dist/render/render.js.map +1 -1
  181. package/dist/render/sliceDiagram.js +5 -5
  182. package/dist/render/sliceDiagram.js.map +1 -1
  183. package/dist/render/storylineBands.d.ts +11 -0
  184. package/dist/render/storylineBands.js +80 -0
  185. package/dist/render/storylineBands.js.map +1 -0
  186. package/dist/render/storylineDiagram.d.ts +14 -0
  187. package/dist/render/storylineDiagram.js +142 -0
  188. package/dist/render/storylineDiagram.js.map +1 -0
  189. package/dist/roster/check.d.ts +32 -0
  190. package/dist/roster/check.js +92 -0
  191. package/dist/roster/check.js.map +1 -0
  192. package/dist/roster/context.d.ts +3 -0
  193. package/dist/roster/context.js +23 -0
  194. package/dist/roster/context.js.map +1 -0
  195. package/dist/roster/init.d.ts +15 -0
  196. package/dist/roster/init.js +52 -0
  197. package/dist/roster/init.js.map +1 -0
  198. package/dist/roster/roster.d.ts +79 -0
  199. package/dist/roster/roster.js +298 -0
  200. package/dist/roster/roster.js.map +1 -0
  201. package/package.json +1 -1
  202. package/plugin/.claude-plugin/plugin.json +2 -2
  203. package/plugin/shared/reference/em-dsl.md +107 -10
  204. package/plugin/shared/reference/methodology.md +268 -0
  205. package/plugin/shared/reference/slice-doc-schema.md +122 -15
  206. package/plugin/shared/templates/slice.md +11 -3
  207. package/plugin/skills/conform/SKILL.md +3 -2
  208. package/plugin/skills/conform/reference/conform.md +7 -0
  209. package/plugin/skills/design/SKILL.md +46 -5
  210. package/plugin/skills/discover/SKILL.md +43 -8
  211. package/plugin/skills/discover/reference/extract.md +6 -1
  212. package/plugin/skills/discover/reference/prd-rubric.md +103 -0
  213. package/plugin/skills/discover/reference/prd-spec-path.md +172 -0
  214. package/plugin/skills/engagement/SKILL.md +28 -6
  215. package/plugin/skills/engagement/reference/engagement.md +5 -4
  216. package/plugin/skills/event-modeling/SKILL.md +1 -1
  217. package/plugin/skills/implement/SKILL.md +1 -1
  218. package/plugin/skills/implement/reference/implement.md +18 -8
  219. package/plugin/skills/review/SKILL.md +1 -1
@@ -0,0 +1,78 @@
1
+ import { NormalizedModel } from "../model/model.js";
2
+ import { RefsResult } from "../model/refs.js";
3
+ import { GitRunner } from "./diff-inputs.js";
4
+ export type RefField = "ratifiedRef" | "shippedRef" | "conformedAt";
5
+ export type RefStatus = "ancestor" | "not-ancestor" | "unresolved" | "undecidable";
6
+ export interface RefResult {
7
+ sliceKey: string;
8
+ /** The doc the ref was read from, relative to the model directory (`slices/<key>.md`). */
9
+ path: string;
10
+ field: RefField;
11
+ ref: string;
12
+ status: RefStatus;
13
+ /** Why, when `status` is not `ancestor`: git's own words, or the shallow-clone note. */
14
+ detail: string | null;
15
+ }
16
+ /** Where a waiver came from: the repeatable `--waive <slice-key>` flag, or a line of the
17
+ * `--waive-file` baseline. A waived result is still fully reported, just not counted toward
18
+ * the exit code — the `em ledger` convention (MIL-185). */
19
+ export type RefWaiveSource = {
20
+ source: "flag";
21
+ } | {
22
+ source: "file";
23
+ path: string;
24
+ };
25
+ export interface WaivedRefResult extends RefResult {
26
+ waivedBy: RefWaiveSource;
27
+ }
28
+ /** A waiver naming a slice key with nothing to excuse — surfaced, never swallowed (a typo'd
29
+ * baseline line would otherwise silently stop meaning anything). */
30
+ export interface UnknownRefWaiver {
31
+ sliceKey: string;
32
+ source: RefWaiveSource;
33
+ }
34
+ export interface RefsCheckResult {
35
+ reachableFrom: string;
36
+ /** The full sha `--reachable-from` resolved to. */
37
+ target: string;
38
+ /** True when the repository is a shallow clone — every result is then `undecidable`. */
39
+ shallow: boolean;
40
+ /** Docs that carried at least one ref field. */
41
+ checkedDocs: number;
42
+ /** Every (doc, field) that was examined, waived or not. */
43
+ checkedRefs: number;
44
+ /** Active results: everything that is not `ancestor` and was not waived. `ancestor` results
45
+ * are listed too (a CI log should show what WAS verified), so filter on `status` to count. */
46
+ results: RefResult[];
47
+ waived: WaivedRefResult[];
48
+ /** False when any active result is not `ancestor` — `undecidable` included. */
49
+ ok: boolean;
50
+ }
51
+ export type CheckRefsOutcome = {
52
+ ok: true;
53
+ result: RefsCheckResult;
54
+ } | {
55
+ ok: false;
56
+ message: string;
57
+ };
58
+ /** The git-facing half, exposed for tests: classify one ref against an already-resolved target. */
59
+ export declare function classifyRef(run: GitRunner, baseDir: string, ref: string, target: string, shallow: boolean): {
60
+ status: RefStatus;
61
+ detail: string | null;
62
+ };
63
+ /**
64
+ * Check every recorded ref on every slice doc of `model` against `reachableFrom`. `baseDir` is the
65
+ * `.em` file's directory (the docs' repository is located from it with `-C`, never the process
66
+ * cwd). Returns a message instead of a result when the directory is not in a git work tree or
67
+ * `reachableFrom` itself does not resolve — those are the caller's mistakes, not findings.
68
+ */
69
+ export declare function checkRefs(model: NormalizedModel, refs: RefsResult, baseDir: string, reachableFrom: string, run?: GitRunner): CheckRefsOutcome;
70
+ /** One slice key per line; blank lines and `#` comments ignored. Missing file → empty list, so a
71
+ * recipe can reference a baseline before anyone has needed one. */
72
+ export declare function readWaiveFile(path: string): string[];
73
+ /** Excuse every non-`ancestor` result on a waived slice key — the exit code ignores them, the
74
+ * report still shows them under `waived`. `ancestor` results need no excuse and stay put. */
75
+ export declare function applyRefWaivers(result: RefsCheckResult, flagKeys: string[], fileKeys: string[], filePath: string | null): {
76
+ result: RefsCheckResult;
77
+ unknownWaivers: UnknownRefWaiver[];
78
+ };
@@ -0,0 +1,153 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // `em refs` (GH #258): are the commits a model's slice docs point at still real, and still on the
3
+ // branch the docs live on? `ratifiedRef:` (MIL-284) is `HEAD` of whatever branch `em slice ratify`
4
+ // ran on, `shippedRef:` is its copy taken at `mark-implemented`, and a bare `conformedAt:` is the
5
+ // target-repo revision a conform sweep diffed against. Under squash or rebase merges every one of
6
+ // them can name a commit that exists only on a deleted PR branch — unreachable from the target
7
+ // branch, then garbage-collected — while `em validate`, `--slice-ready` and `em ledger` all keep
8
+ // passing, because none of them resolves a ref. This command does, once, per field, per doc.
9
+ //
10
+ // Three outcomes per (doc, field) plus one for "I can't tell":
11
+ // ancestor — resolves and is reachable from `--reachable-from` (the healthy case)
12
+ // not-ancestor — resolves (still in the object store) but is NOT reachable: the squash-merge
13
+ // signature before the orphaned commit is pruned
14
+ // unresolved — does not resolve at all: pruned, never fetched, or a typo
15
+ // undecidable — a shallow clone, or git failed in a way that is neither yes nor no; never
16
+ // reported as a pass (the issue's third acceptance line)
17
+ // Opt-in, CI-recipe tier like `em ledger`: it reads git, so it is deliberately not part of
18
+ // `em validate` (docs/ci.md). Local object store only — no network. Pure aside from the
19
+ // injectable GitRunner and fs reads via readSliceDoc; no process.exit, no console.
20
+ //
21
+ // Kinded `conformedAt:` values (`build:1234`, GH #261) are not git revisions and are skipped —
22
+ // `parseConformedAt` decides. Docs with no ref fields are not reported.
23
+ import { existsSync, readFileSync } from "node:fs";
24
+ import { readSliceDoc } from "../catalog/readSliceDoc.js";
25
+ import { hasUsableFrontmatter, parseConformedAt } from "../catalog/sliceDoc.js";
26
+ import { realGit } from "./diff-inputs.js";
27
+ function git(run, baseDir, args) {
28
+ return run(["-C", baseDir, ...args]);
29
+ }
30
+ /** The git-facing half, exposed for tests: classify one ref against an already-resolved target. */
31
+ export function classifyRef(run, baseDir, ref, target, shallow) {
32
+ if (shallow) {
33
+ return { status: "undecidable", detail: "shallow clone — history is truncated, reachability cannot be decided (checkout with fetch-depth: 0)" };
34
+ }
35
+ const exists = git(run, baseDir, ["cat-file", "-e", `${ref}^{commit}`]);
36
+ if (exists.status !== 0) {
37
+ return { status: "unresolved", detail: "does not resolve to a commit in this repository (pruned after its branch was deleted, never fetched, or mistyped)" };
38
+ }
39
+ const anc = git(run, baseDir, ["merge-base", "--is-ancestor", ref, target]);
40
+ if (anc.status === 0)
41
+ return { status: "ancestor", detail: null };
42
+ if (anc.status === 1)
43
+ return { status: "not-ancestor", detail: `resolves but is not an ancestor of ${target.slice(0, 7)} — reachable only from a branch that was squash/rebase-merged and deleted` };
44
+ return { status: "undecidable", detail: `git merge-base failed: ${anc.stderr.trim() || `exit ${anc.status}`}` };
45
+ }
46
+ /**
47
+ * Check every recorded ref on every slice doc of `model` against `reachableFrom`. `baseDir` is the
48
+ * `.em` file's directory (the docs' repository is located from it with `-C`, never the process
49
+ * cwd). Returns a message instead of a result when the directory is not in a git work tree or
50
+ * `reachableFrom` itself does not resolve — those are the caller's mistakes, not findings.
51
+ */
52
+ export function checkRefs(model, refs, baseDir, reachableFrom, run = realGit) {
53
+ const inside = git(run, baseDir, ["rev-parse", "--is-inside-work-tree"]);
54
+ if (inside.status !== 0 || inside.stdout.trim() !== "true") {
55
+ return { ok: false, message: `${baseDir} is not inside a git work tree — em refs resolves commits, so it needs one` };
56
+ }
57
+ const target = git(run, baseDir, ["rev-parse", "--verify", "--quiet", `${reachableFrom}^{commit}`]);
58
+ if (target.status !== 0 || !/^[0-9a-f]{40,64}$/.test(target.stdout.trim())) {
59
+ return { ok: false, message: `--reachable-from "${reachableFrom}" does not resolve to a commit (fetch it first? \`git fetch origin main\`)` };
60
+ }
61
+ const targetSha = target.stdout.trim();
62
+ const shallowProbe = git(run, baseDir, ["rev-parse", "--is-shallow-repository"]);
63
+ const shallow = shallowProbe.status === 0 && shallowProbe.stdout.trim() === "true";
64
+ const results = [];
65
+ const seen = new Set();
66
+ let checkedDocs = 0;
67
+ model.slices.forEach((_slice, i) => {
68
+ const sliceKey = refs.sliceKeys[i];
69
+ if (seen.has(sliceKey))
70
+ return;
71
+ seen.add(sliceKey);
72
+ const doc = readSliceDoc(baseDir, sliceKey);
73
+ if (!doc || !hasUsableFrontmatter(doc))
74
+ return;
75
+ const path = `slices/${sliceKey}.md`;
76
+ const fields = [
77
+ ["ratifiedRef", doc.ratifiedRef],
78
+ ["shippedRef", doc.shippedRef],
79
+ ["conformedAt", doc.conformedAt !== null && parseConformedAt(doc.conformedAt).kind === "git" ? doc.conformedAt : null],
80
+ ];
81
+ const present = fields.filter((f) => f[1] !== null);
82
+ if (present.length === 0)
83
+ return;
84
+ checkedDocs++;
85
+ for (const [field, ref] of present) {
86
+ const { status, detail } = classifyRef(run, baseDir, ref, targetSha, shallow);
87
+ results.push({ sliceKey, path, field, ref, status, detail });
88
+ }
89
+ });
90
+ return {
91
+ ok: true,
92
+ result: {
93
+ reachableFrom,
94
+ target: targetSha,
95
+ shallow,
96
+ checkedDocs,
97
+ checkedRefs: results.length,
98
+ results,
99
+ waived: [],
100
+ ok: results.every((r) => r.status === "ancestor"),
101
+ },
102
+ };
103
+ }
104
+ /** One slice key per line; blank lines and `#` comments ignored. Missing file → empty list, so a
105
+ * recipe can reference a baseline before anyone has needed one. */
106
+ export function readWaiveFile(path) {
107
+ if (!existsSync(path))
108
+ return [];
109
+ return readFileSync(path, "utf8")
110
+ .split(/\r?\n/)
111
+ .map((l) => l.replace(/#.*$/, "").trim())
112
+ .filter((l) => l.length > 0);
113
+ }
114
+ /** Excuse every non-`ancestor` result on a waived slice key — the exit code ignores them, the
115
+ * report still shows them under `waived`. `ancestor` results need no excuse and stay put. */
116
+ export function applyRefWaivers(result, flagKeys, fileKeys, filePath) {
117
+ const excusable = new Set(result.results.filter((r) => r.status !== "ancestor").map((r) => r.sliceKey));
118
+ const waivedKeys = new Map();
119
+ const unknownWaivers = [];
120
+ const noted = new Set();
121
+ // First mention of a key wins (flags are considered before the file); a key with nothing to
122
+ // excuse is noted once, whichever sources name it.
123
+ const consider = (keys, source) => {
124
+ for (const key of keys) {
125
+ if (waivedKeys.has(key) || noted.has(key))
126
+ continue;
127
+ if (excusable.has(key))
128
+ waivedKeys.set(key, source);
129
+ else {
130
+ noted.add(key);
131
+ unknownWaivers.push({ sliceKey: key, source });
132
+ }
133
+ }
134
+ };
135
+ consider(flagKeys, { source: "flag" });
136
+ if (filePath !== null)
137
+ consider(fileKeys, { source: "file", path: filePath });
138
+ const waived = [...result.waived];
139
+ const kept = [];
140
+ for (const r of result.results) {
141
+ const by = waivedKeys.get(r.sliceKey);
142
+ if (by && r.status !== "ancestor")
143
+ waived.push({ ...r, waivedBy: by });
144
+ else
145
+ kept.push(r);
146
+ }
147
+ waived.sort((a, b) => a.sliceKey.localeCompare(b.sliceKey) || a.field.localeCompare(b.field));
148
+ return {
149
+ result: { ...result, results: kept, waived, ok: kept.every((r) => r.status === "ancestor") },
150
+ unknownWaivers,
151
+ };
152
+ }
153
+ //# sourceMappingURL=refsCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refsCheck.js","sourceRoot":"","sources":["../../src/cli/refsCheck.ts"],"names":[],"mappings":"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"}
@@ -24,4 +24,6 @@ export declare function resolveSliceArg(name: string, slices: Slice[]): SliceLoo
24
24
  * .em file — the same slices/ + kebabSlug convention em catalog's sibling-file
25
25
  * lookup and the event-modeling skill's slice-doc path already use.
26
26
  */
27
+ /** `em render --storyline`'s default output: `<dir of the .em file>/storylines/<kebab-slug>.svg`. */
28
+ export declare function defaultStorylineOut(file: string, storylineName: string): string;
27
29
  export declare function defaultSliceOut(file: string, sliceName: string): string;
@@ -35,6 +35,10 @@ export function resolveSliceArg(name, slices) {
35
35
  * .em file — the same slices/ + kebabSlug convention em catalog's sibling-file
36
36
  * lookup and the event-modeling skill's slice-doc path already use.
37
37
  */
38
+ /** `em render --storyline`'s default output: `<dir of the .em file>/storylines/<kebab-slug>.svg`. */
39
+ export function defaultStorylineOut(file, storylineName) {
40
+ return join(dirname(file), "storylines", `${kebabSlug(storylineName)}.svg`);
41
+ }
38
42
  export function defaultSliceOut(file, sliceName) {
39
43
  return join(dirname(file), "slices", `${kebabSlug(sliceName)}.svg`);
40
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render-inputs.js","sourceRoot":"","sources":["../../src/cli/render-inputs.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,qDAAqD;AAErD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAe;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO;QACL,KAAK,EAAE,8BAA8B,IAAI,qBAAqB,KAAK,IAAI,uBAAuB,EAAE;KACjG,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"render-inputs.js","sourceRoot":"","sources":["../../src/cli/render-inputs.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,qDAAqD;AAErD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAe;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO;QACL,KAAK,EAAE,8BAA8B,IAAI,qBAAqB,KAAK,IAAI,uBAAuB,EAAE;KACjG,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,qGAAqG;AACrG,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,aAAqB;IACrE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC"}
@@ -3,13 +3,15 @@ import { RefsResult } from "../model/refs.js";
3
3
  import { QueuedItem } from "../catalog/deferQueue.js";
4
4
  /** Every key that describes the version being left behind — cleared on every path that bumps. */
5
5
  export declare const SIGN_OFF_KEYS: readonly string[];
6
- /** See the module header. `unsigned` is the only kind that does not bump `version:`. */
7
- export type ReviseKind = "shipped" | "unshipped" | "unsigned";
6
+ /** See the module header. `unsigned` and `unshipped-kept` are the kinds that do not bump
7
+ * `version:` — the latter is `--keep-version` on a ratified, never-shipped doc (GH #262). */
8
+ export type ReviseKind = "shipped" | "unshipped" | "unshipped-kept" | "unsigned";
8
9
  export type ApplyReviseResult = {
9
10
  ok: true;
10
11
  content: string;
11
12
  newVersion: number;
12
13
  kind: ReviseKind;
14
+ shippedVersion: number | null;
13
15
  reopened: number;
14
16
  injected: number;
15
17
  } | {
@@ -22,6 +24,12 @@ export type ApplyReviseResult = {
22
24
  export interface ReviseOptions {
23
25
  withdraw?: boolean;
24
26
  queuedFor?: (version: number) => QueuedItem[];
27
+ /** GH #262: reopen a ratified, never-shipped doc at the SAME `version:` — the status flip and
28
+ * sign-off clearing of the unshipped path with no bump. For a project that holds every slice at
29
+ * its initial version until a first release, where a change before that release is a correction,
30
+ * not a delta (a `version` above 1 with no `## Delta` sits between the two implementation modes).
31
+ * Refused on a shipped doc: the shipped version must stay distinct from the next one. */
32
+ keepVersion?: boolean;
25
33
  }
26
34
  /**
27
35
  * Pure: the shipped → draft transition shared by `revise` and `mark-implemented`'s auto-open.
@@ -52,6 +60,7 @@ export type RunReviseResult = {
52
60
  path: string;
53
61
  newVersion: number;
54
62
  kind: ReviseKind;
63
+ shippedVersion: number | null;
55
64
  advisory: ReviseAdvisory | null;
56
65
  reopened: number;
57
66
  injected: number;
@@ -64,4 +73,4 @@ export type RunReviseResult = {
64
73
  * `ratify`/`--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/
65
74
  * writes it. `baseDir` is the `.em` file's directory.
66
75
  */
67
- export declare function runRevise(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, withdraw?: boolean): RunReviseResult;
76
+ export declare function runRevise(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, withdraw?: boolean, keepVersion?: boolean): RunReviseResult;
@@ -56,6 +56,7 @@ const IMPLEMENTED_STATUS = "implemented";
56
56
  export const SIGN_OFF_KEYS = [
57
57
  "ratifiedBy",
58
58
  "ratifiedOn",
59
+ "reviewSkipped",
59
60
  "ratifiedRef",
60
61
  "ratifiedHash",
61
62
  "reviewedBy",
@@ -89,19 +90,44 @@ export function applyReviseFrontmatter(raw, opts = {}) {
89
90
  const hasShipped = currentStatus === IMPLEMENTED_STATUS || (shippedVersionMatch !== null && normalizeFieldValue(shippedVersionMatch[2]) !== null);
90
91
  const ratifiedByMatch = fieldLineRegex("ratifiedBy").exec(inner);
91
92
  const hasRatifiedBy = ratifiedByMatch !== null && normalizeFieldValue(ratifiedByMatch[2]) !== null;
93
+ if (currentStatus === IMPLEMENTED_STATUS && opts.keepVersion) {
94
+ // GH #262: the version in production must keep its number; the next one is a new number.
95
+ return {
96
+ ok: false,
97
+ message: "doc is shipped (`status: implemented`) — --keep-version applies only to a ratified doc that never shipped; " +
98
+ "the shipped version must stay distinct from the next one. Use plain `em slice revise` to open the next version as a draft",
99
+ };
100
+ }
92
101
  if (currentStatus === IMPLEMENTED_STATUS)
93
102
  return applyRevise(raw, "shipped", opts);
94
103
  if (currentStatus === RATIFIED_STATUS && hasRatifiedBy && !hasShipped && !opts.withdraw) {
95
104
  // GH #236: a ratified, never-shipped doc is the ONLY implementable version of the slice;
96
- // revising it withdraws that. A question found mid-build does not need this — it is queued.
105
+ // revising it withdraws that. A question found mid-build does not need this — `em slice
106
+ // defer` records it on the doc outside the hash (GH #253), ratification intact.
97
107
  return {
98
108
  ok: false,
99
109
  message: "doc is ratified and has never shipped — revising it would withdraw the ratification of the only implementable " +
100
- "version. To record a question found mid-build, queue it instead (the ratification stays valid): " +
110
+ "version. To record a question found mid-build, defer it instead (the ratification stays valid): " +
101
111
  '`em slice defer <model> <key> "<question>" --until v<n> --decision "<what this version does>"`. ' +
102
112
  "If the spec itself must change, pass --withdraw to open the next version as a draft",
103
113
  };
104
114
  }
115
+ if (currentStatus === RATIFIED_STATUS && hasRatifiedBy && opts.keepVersion) {
116
+ // GH #262: a later version ratified over a shipped one may keep its number too — unless that
117
+ // number IS the shipped one (a hand-edited state no command produces), which plain revise
118
+ // handles by bumping.
119
+ const versionMatch = fieldLineRegex("version").exec(inner);
120
+ const current = versionMatch ? normalizeFieldValue(versionMatch[2]) : null;
121
+ const shippedVersion = shippedVersionMatch ? normalizeFieldValue(shippedVersionMatch[2]) : null;
122
+ if (shippedVersion !== null && current !== null && shippedVersion === current) {
123
+ return {
124
+ ok: false,
125
+ message: `doc's \`version: ${current}\` is the version that shipped (\`shippedVersion: ${shippedVersion}\`) — --keep-version would ` +
126
+ "reopen the shipped version in place; use plain `em slice revise` to open the next version as a draft",
127
+ };
128
+ }
129
+ return applyRevise(raw, "unshipped-kept", opts);
130
+ }
105
131
  if (currentStatus === RATIFIED_STATUS)
106
132
  return applyRevise(raw, hasRatifiedBy ? "unshipped" : "unsigned", opts);
107
133
  if (currentStatus === DRAFT_STATUS || currentStatus === "reviewed") {
@@ -133,7 +159,8 @@ function applyRevise(raw, kind, opts = {}) {
133
159
  message: `doc's \`version:\` value "${currentVersionRaw ?? ""}" isn't a positive integer — refusing to guess a bump`,
134
160
  };
135
161
  }
136
- const newVersion = kind === "unsigned" ? currentVersion : currentVersion + 1;
162
+ const keepsNumber = kind === "unsigned" || kind === "unshipped-kept";
163
+ const newVersion = keepsNumber ? currentVersion : currentVersion + 1;
137
164
  // Materialise the shipped record on a pre-1.15 doc BEFORE the status leaves `implemented`,
138
165
  // otherwise `shippedRecordOf`'s read-both rule would forget that v<N> shipped. Inserted right
139
166
  // after `implementedIn:` when present (where mark-implemented puts it), else after `version:`.
@@ -165,13 +192,19 @@ function applyRevise(raw, kind, opts = {}) {
165
192
  updatedInner = updatedInner.slice(0, edit.index) + edit.next + updatedInner.slice(edit.index + edit.oldLen);
166
193
  }
167
194
  const content = raw.slice(0, range.innerStart) + updatedInner + raw.slice(range.innerEnd);
168
- // MIL-275: questions deferred to the version this opens come back as `- [ ]`.
169
- const reopened = kind === "unsigned" ? { content, count: 0 } : reopenDeferred(content, newVersion);
195
+ // MIL-275: questions deferred to the version this opens come back as `- [ ]`. Nothing to reopen
196
+ // or inject when the number did not move (GH #262: a deferral to v<N+1> still waits for v<N+1>).
197
+ const reopened = keepsNumber ? { content, count: 0 } : reopenDeferred(content, newVersion);
170
198
  // GH #236: questions queued while the old version was ratified/shipped join the new draft.
171
- const injected = kind === "unsigned" || !opts.queuedFor
199
+ const injected = keepsNumber || !opts.queuedFor
172
200
  ? { content: reopened.content, count: 0 }
173
201
  : injectQueuedQuestions(reopened.content, opts.queuedFor(newVersion));
174
- return { ok: true, content: injected.content, newVersion, kind, reopened: reopened.count, injected: injected.count };
202
+ // GH #284: the version that stays shipped, when the doc carries one (the message must not say
203
+ // "never shipped" over a doc that has a shipped version).
204
+ const shippedRaw = fieldLineRegex("shippedVersion").exec(inner);
205
+ const shippedNum = shippedRaw ? Number(normalizeFieldValue(shippedRaw[2])) : NaN;
206
+ const shippedVersion = Number.isInteger(shippedNum) && shippedNum >= 1 ? shippedNum : kind === "shipped" ? currentVersion : null;
207
+ return { ok: true, content: injected.content, newVersion, kind, shippedVersion, reopened: reopened.count, injected: injected.count };
175
208
  }
176
209
  export function reviseAdvisory(baseDir, sliceKey, shippedVersion, conformedVersion) {
177
210
  const neverCertified = conformedVersion === null || conformedVersion !== shippedVersion;
@@ -186,7 +219,7 @@ export function reviseAdvisory(baseDir, sliceKey, shippedVersion, conformedVersi
186
219
  * `ratify`/`--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/
187
220
  * writes it. `baseDir` is the `.em` file's directory.
188
221
  */
189
- export function runRevise(model, refs, baseDir, sliceKey, withdraw = false) {
222
+ export function runRevise(model, refs, baseDir, sliceKey, withdraw = false, keepVersion = false) {
190
223
  const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
191
224
  if (sliceIndex === -1)
192
225
  return { ok: false, message: `no slice with export key "${sliceKey}" in this model` };
@@ -215,7 +248,7 @@ export function runRevise(model, refs, baseDir, sliceKey, withdraw = false) {
215
248
  }
216
249
  const absPath = join(baseDir, doc.path);
217
250
  const raw = readFileSync(absPath, "utf8");
218
- const result = applyReviseFrontmatter(raw, { withdraw, queuedFor: (v) => readQueue(baseDir, sliceKey, v).items });
251
+ const result = applyReviseFrontmatter(raw, { withdraw, keepVersion, queuedFor: (v) => readQueue(baseDir, sliceKey, v).items });
219
252
  if (!result.ok)
220
253
  return { ok: false, message: `${doc.path}: ${result.message}` };
221
254
  // MIL-214: "was the version we are leaving behind ever certified" — only meaningful when one
@@ -224,6 +257,6 @@ export function runRevise(model, refs, baseDir, sliceKey, withdraw = false) {
224
257
  writeFileSync(absPath, result.content, "utf8");
225
258
  if (result.injected > 0)
226
259
  clearQueue(baseDir, sliceKey, result.newVersion);
227
- return { ok: true, path: doc.path, newVersion: result.newVersion, kind: result.kind, advisory, reopened: result.reopened, injected: result.injected };
260
+ return { ok: true, path: doc.path, newVersion: result.newVersion, kind: result.kind, shippedVersion: result.shippedVersion, advisory, reopened: result.reopened, injected: result.injected };
228
261
  }
229
262
  //# sourceMappingURL=revise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"revise.js","sourceRoot":"","sources":["../../src/cli/revise.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"revise.js","sourceRoot":"","sources":["../../src/cli/revise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Diagnostic } from "../model/validate.js";
2
+ import { type RuleCode } from "../model/rules.js";
3
+ import { readWaiveFile } from "./refsCheck.js";
4
+ export { readWaiveFile };
5
+ /** Every registered rule code in the shape family, registry order. */
6
+ export declare function shapeRuleCodes(): RuleCode[];
7
+ export interface ShapeRuleReport {
8
+ code: string;
9
+ title: string;
10
+ /** docs/validation.md anchor for the rule (`shape` unless the registry names another). */
11
+ docAnchor: string;
12
+ /** Findings that count (not waived). */
13
+ findings: Diagnostic[];
14
+ /** Findings a waive file excused — listed, never counted. */
15
+ waived: Diagnostic[];
16
+ }
17
+ export interface ShapeReport {
18
+ rules: ShapeRuleReport[];
19
+ /** Total findings that count / that were waived. */
20
+ findings: number;
21
+ waived: number;
22
+ /** Waive-file lines that excused nothing (stale key, unknown rule code). */
23
+ staleWaivers: string[];
24
+ }
25
+ export declare function buildShapeReport(diagnostics: Diagnostic[], waiveLines: string[]): ShapeReport;
26
+ /** Text table: rule, count, first ref, docs anchor; waived findings listed separately below. */
27
+ export declare function formatShapeText(report: ShapeReport, modelErrors: number): string;
@@ -0,0 +1,77 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // GH #282: `em validate --shape` — the focused view of the advisory storyline-shape lints. A rule
3
+ // belongs to it by one field alone, `family: "shape"` on its RULES entry (model/rules.ts), so a new
4
+ // shape lint plugs in by registering that field; nothing here names a rule. Advisory by
5
+ // construction: this module only groups and partitions diagnostics the validator already computed,
6
+ // and the CLI exits 0 whatever it finds. `--waive-file` reuses `em refs`'s waiver file (one line per waiver, `#` comments, missing file = no waivers) so an estate can baseline accepted shapes.
7
+ import { RULES } from "../model/rules.js";
8
+ import { readWaiveFile } from "./refsCheck.js";
9
+ export { readWaiveFile };
10
+ /** Every registered rule code in the shape family, registry order. */
11
+ export function shapeRuleCodes() {
12
+ return Object.keys(RULES).filter((c) => RULES[c].family === "shape");
13
+ }
14
+ function parseWaivers(lines, codes) {
15
+ const waivers = [];
16
+ const stale = [];
17
+ for (const line of lines) {
18
+ const parts = line.split(/\s+/);
19
+ if (parts.length === 1)
20
+ waivers.push({ line, rule: null, key: parts[0], used: false });
21
+ else if (parts.length === 2 && codes.has(parts[0]))
22
+ waivers.push({ line, rule: parts[0], key: parts[1], used: false });
23
+ else
24
+ stale.push(line); // unknown rule code, or a malformed line
25
+ }
26
+ return { waivers, stale };
27
+ }
28
+ const under = (ref, key) => ref === key || ref.startsWith(`${key}/`);
29
+ export function buildShapeReport(diagnostics, waiveLines) {
30
+ const codes = shapeRuleCodes();
31
+ const { waivers, stale } = parseWaivers(waiveLines, new Set(codes));
32
+ const rules = codes.map((code) => {
33
+ const def = RULES[code];
34
+ const findings = [];
35
+ const waived = [];
36
+ for (const d of diagnostics.filter((x) => x.code === code)) {
37
+ const refs = d.refs ?? [];
38
+ // Waived when it has refs and every ref lies under a waiver that applies to this rule.
39
+ const applicable = waivers.filter((w) => w.rule === null || w.rule === code);
40
+ const covering = refs.length === 0 ? null : refs.map((r) => applicable.filter((w) => under(r, w.key)));
41
+ if (covering && covering.every((c) => c.length > 0)) {
42
+ waived.push(d);
43
+ for (const c of covering)
44
+ for (const w of c)
45
+ w.used = true;
46
+ }
47
+ else
48
+ findings.push(d);
49
+ }
50
+ return { code, title: def.title, docAnchor: def.docAnchor ?? "shape", findings, waived };
51
+ });
52
+ return {
53
+ rules,
54
+ findings: rules.reduce((n, r) => n + r.findings.length, 0),
55
+ waived: rules.reduce((n, r) => n + r.waived.length, 0),
56
+ staleWaivers: [...stale, ...waivers.filter((w) => !w.used).map((w) => w.line)],
57
+ };
58
+ }
59
+ /** Text table: rule, count, first ref, docs anchor; waived findings listed separately below. */
60
+ export function formatShapeText(report, modelErrors) {
61
+ const rows = report.rules.map((r) => [r.code, String(r.findings.length), r.findings[0]?.refs?.[0] ?? "-", `docs/validation.md#${r.docAnchor}`]);
62
+ const head = ["rule", "count", "first ref", "docs"];
63
+ const widths = head.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
64
+ const line = (cells) => cells.map((c, i) => c.padEnd(widths[i])).join(" ").trimEnd();
65
+ const out = [line(head), ...rows.map(line)];
66
+ if (report.waived > 0) {
67
+ out.push("", `waived (${report.waived}, not counted):`);
68
+ for (const r of report.rules)
69
+ for (const d of r.waived)
70
+ out.push(` ${r.code}: ${(d.refs ?? []).join(", ")}`);
71
+ }
72
+ out.push("", report.findings === 0 ? "ok — no shape findings" : `${report.findings} shape finding(s) — fix each, or record it as \`shape-accepted: <rule> <refs> — <reason>\` in \`.event-modeling.md\` \`## Decisions log\` (advisory: exit 0)`);
73
+ if (modelErrors > 0)
74
+ out.push(`note: the model has ${modelErrors} error(s) — run \`em validate\`; shape findings may be incomplete`);
75
+ return out.join("\n");
76
+ }
77
+ //# sourceMappingURL=shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/cli/shape.ts"],"names":[],"mappings":"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"}
@@ -60,6 +60,15 @@ export function applyConformFrontmatter(raw, sliceKey, at, on) {
60
60
  if (/[\x00-\x1f\x7f\s]/.test(trimmedAt)) {
61
61
  return { ok: false, message: "revision (--at) must not contain control characters or whitespace" };
62
62
  }
63
+ // GH #261: a `<kind>:<id>` value is an opaque, non-git identifier (what the sweep exercised —
64
+ // a build, deployment or environment) recorded verbatim; `:` anywhere else is malformed, so a
65
+ // reader never has to guess whether a value is a revision. See `parseConformedAt`.
66
+ if (trimmedAt.includes(":") && !/^[a-z][a-z0-9-]*:.+$/.test(trimmedAt)) {
67
+ return {
68
+ ok: false,
69
+ message: `--at "${trimmedAt}" is neither a git revision nor \`<kind>:<id>\` (kind = lowercase letters, digits, dashes — e.g. build:1234, deploy:eu-1-2026-10-15)`,
70
+ };
71
+ }
63
72
  if (!isValidDateString(on)) {
64
73
  return { ok: false, message: `invalid date "${on}" — expected YYYY-MM-DD` };
65
74
  }