@milehimikey/em 1.17.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.claude/agents/em-implementer.md +7 -4
  2. package/.claude/agents/em-validator.md +2 -2
  3. package/.claude/skills/event-modeling/SKILL.md +1 -1
  4. package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
  5. package/.claude/skills/event-modeling-design/SKILL.md +46 -5
  6. package/.claude/skills/event-modeling-discover/SKILL.md +43 -8
  7. package/.claude/skills/event-modeling-discover/reference/extract.md +6 -1
  8. package/.claude/skills/event-modeling-discover/reference/prd-rubric.md +102 -0
  9. package/.claude/skills/event-modeling-discover/reference/prd-spec-path.md +171 -0
  10. package/.claude/skills/event-modeling-engagement/SKILL.md +21 -9
  11. package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
  12. package/.claude/skills/event-modeling-implement/reference/implement.md +18 -0
  13. package/.claude/skills/event-modeling-review/SKILL.md +4 -2
  14. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +94 -6
  15. package/.claude/skills/event-modeling-shared/reference/methodology.md +268 -0
  16. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +96 -2
  17. package/.claude/skills/event-modeling-shared/templates/slice.md +11 -3
  18. package/.claude-plugin/marketplace.json +2 -2
  19. package/dist/catalog/docModelConsistencyValidate.js +160 -0
  20. package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
  21. package/dist/catalog/invariantsValidate.d.ts +2 -0
  22. package/dist/catalog/invariantsValidate.js +67 -1
  23. package/dist/catalog/invariantsValidate.js.map +1 -1
  24. package/dist/catalog/scenarioQualityValidate.d.ts +4 -0
  25. package/dist/catalog/scenarioQualityValidate.js +148 -0
  26. package/dist/catalog/scenarioQualityValidate.js.map +1 -0
  27. package/dist/catalog/scenarios.d.ts +5 -0
  28. package/dist/catalog/scenarios.js +80 -0
  29. package/dist/catalog/scenarios.js.map +1 -1
  30. package/dist/catalog/sliceDoc.d.ts +4 -0
  31. package/dist/catalog/sliceDoc.js +16 -7
  32. package/dist/catalog/sliceDoc.js.map +1 -1
  33. package/dist/catalog/sliceReadyValidate.d.ts +11 -2
  34. package/dist/catalog/sliceReadyValidate.js +62 -3
  35. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  36. package/dist/catalog/sliceSections.d.ts +3 -2
  37. package/dist/catalog/sliceSections.js +99 -9
  38. package/dist/catalog/sliceSections.js.map +1 -1
  39. package/dist/cli/ciInit.d.ts +4 -11
  40. package/dist/cli/ciInit.js +24 -6
  41. package/dist/cli/ciInit.js.map +1 -1
  42. package/dist/cli/coverage.d.ts +9 -0
  43. package/dist/cli/coverage.js +18 -0
  44. package/dist/cli/coverage.js.map +1 -1
  45. package/dist/cli/defer.d.ts +28 -0
  46. package/dist/cli/defer.js +87 -4
  47. package/dist/cli/defer.js.map +1 -1
  48. package/dist/cli/engagement.d.ts +13 -2
  49. package/dist/cli/engagement.js +60 -5
  50. package/dist/cli/engagement.js.map +1 -1
  51. package/dist/cli/engagementFile.d.ts +2 -0
  52. package/dist/cli/engagementFile.js +3 -1
  53. package/dist/cli/engagementFile.js.map +1 -1
  54. package/dist/cli/markImplemented.d.ts +14 -10
  55. package/dist/cli/markImplemented.js +49 -1
  56. package/dist/cli/markImplemented.js.map +1 -1
  57. package/dist/cli/prdTriage.d.ts +109 -0
  58. package/dist/cli/prdTriage.js +393 -0
  59. package/dist/cli/prdTriage.js.map +1 -0
  60. package/dist/cli/render-inputs.d.ts +2 -0
  61. package/dist/cli/render-inputs.js +4 -0
  62. package/dist/cli/render-inputs.js.map +1 -1
  63. package/dist/cli/review.d.ts +17 -2
  64. package/dist/cli/review.js +39 -10
  65. package/dist/cli/review.js.map +1 -1
  66. package/dist/cli/revise.d.ts +2 -0
  67. package/dist/cli/revise.js +7 -2
  68. package/dist/cli/revise.js.map +1 -1
  69. package/dist/cli/shape.d.ts +27 -0
  70. package/dist/cli/shape.js +77 -0
  71. package/dist/cli/shape.js.map +1 -0
  72. package/dist/cli/sliceIndex.d.ts +6 -1
  73. package/dist/cli/sliceIndex.js +28 -13
  74. package/dist/cli/sliceIndex.js.map +1 -1
  75. package/dist/cli/sliceNew.d.ts +4 -1
  76. package/dist/cli/sliceNew.js +26 -9
  77. package/dist/cli/sliceNew.js.map +1 -1
  78. package/dist/cli/status.d.ts +21 -1
  79. package/dist/cli/status.js +25 -3
  80. package/dist/cli/status.js.map +1 -1
  81. package/dist/cli/storylineSuggest.d.ts +26 -0
  82. package/dist/cli/storylineSuggest.js +252 -0
  83. package/dist/cli/storylineSuggest.js.map +1 -0
  84. package/dist/cli/upgrade.d.ts +15 -3
  85. package/dist/cli/upgrade.js +516 -7
  86. package/dist/cli/upgrade.js.map +1 -1
  87. package/dist/cli/upgradeReshape.d.ts +60 -0
  88. package/dist/cli/upgradeReshape.js +425 -0
  89. package/dist/cli/upgradeReshape.js.map +1 -0
  90. package/dist/cli.js +311 -35
  91. package/dist/cli.js.map +1 -1
  92. package/dist/emit/dot.d.ts +2 -0
  93. package/dist/emit/dot.js +44 -8
  94. package/dist/emit/dot.js.map +1 -1
  95. package/dist/emit/engagementJson.d.ts +4 -3
  96. package/dist/emit/engagementJson.js +11 -4
  97. package/dist/emit/engagementJson.js.map +1 -1
  98. package/dist/emit/json.d.ts +21 -1
  99. package/dist/emit/json.js +26 -2
  100. package/dist/emit/json.js.map +1 -1
  101. package/dist/emit/queryJson.d.ts +1 -1
  102. package/dist/emit/queryJson.js +3 -1
  103. package/dist/emit/queryJson.js.map +1 -1
  104. package/dist/emit/statusJson.d.ts +1 -1
  105. package/dist/emit/statusJson.js +6 -1
  106. package/dist/emit/statusJson.js.map +1 -1
  107. package/dist/emit/theme.d.ts +1 -0
  108. package/dist/emit/theme.js +13 -0
  109. package/dist/emit/theme.js.map +1 -1
  110. package/dist/emit/validateJson.d.ts +9 -5
  111. package/dist/emit/validateJson.js +40 -5
  112. package/dist/emit/validateJson.js.map +1 -1
  113. package/dist/layout/grid.d.ts +5 -1
  114. package/dist/layout/grid.js +93 -2
  115. package/dist/layout/grid.js.map +1 -1
  116. package/dist/mcp/server.js +46 -11
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/model/edges.d.ts +7 -0
  119. package/dist/model/edges.js +33 -16
  120. package/dist/model/edges.js.map +1 -1
  121. package/dist/model/model.d.ts +33 -0
  122. package/dist/model/model.js +87 -3
  123. package/dist/model/model.js.map +1 -1
  124. package/dist/model/queryIndex.js +2 -2
  125. package/dist/model/queryIndex.js.map +1 -1
  126. package/dist/model/refs.js +8 -5
  127. package/dist/model/refs.js.map +1 -1
  128. package/dist/model/rules.d.ts +149 -0
  129. package/dist/model/rules.js +144 -0
  130. package/dist/model/rules.js.map +1 -1
  131. package/dist/model/shapeLint.d.ts +12 -0
  132. package/dist/model/shapeLint.js +170 -0
  133. package/dist/model/shapeLint.js.map +1 -0
  134. package/dist/model/storylines.d.ts +51 -0
  135. package/dist/model/storylines.js +188 -0
  136. package/dist/model/storylines.js.map +1 -0
  137. package/dist/model/validate.d.ts +6 -1
  138. package/dist/model/validate.js +317 -14
  139. package/dist/model/validate.js.map +1 -1
  140. package/dist/parser/againSugar.d.ts +30 -0
  141. package/dist/parser/againSugar.js +105 -0
  142. package/dist/parser/againSugar.js.map +1 -0
  143. package/dist/parser/ast.d.ts +33 -0
  144. package/dist/parser/lexer.d.ts +2 -0
  145. package/dist/parser/lexer.js +4 -0
  146. package/dist/parser/lexer.js.map +1 -1
  147. package/dist/parser/parser.js +284 -4
  148. package/dist/parser/parser.js.map +1 -1
  149. package/dist/query/format.js +1 -0
  150. package/dist/query/format.js.map +1 -1
  151. package/dist/query/verbs.d.ts +4 -0
  152. package/dist/query/verbs.js +30 -3
  153. package/dist/query/verbs.js.map +1 -1
  154. package/dist/render/drawEdges.js +100 -4
  155. package/dist/render/drawEdges.js.map +1 -1
  156. package/dist/render/render.js +20 -2
  157. package/dist/render/render.js.map +1 -1
  158. package/dist/render/sliceDiagram.js +5 -5
  159. package/dist/render/sliceDiagram.js.map +1 -1
  160. package/dist/render/storylineBands.d.ts +11 -0
  161. package/dist/render/storylineBands.js +80 -0
  162. package/dist/render/storylineBands.js.map +1 -0
  163. package/dist/render/storylineDiagram.d.ts +14 -0
  164. package/dist/render/storylineDiagram.js +142 -0
  165. package/dist/render/storylineDiagram.js.map +1 -0
  166. package/dist/roster/check.d.ts +32 -0
  167. package/dist/roster/check.js +92 -0
  168. package/dist/roster/check.js.map +1 -0
  169. package/dist/roster/context.d.ts +3 -0
  170. package/dist/roster/context.js +23 -0
  171. package/dist/roster/context.js.map +1 -0
  172. package/dist/roster/init.d.ts +15 -0
  173. package/dist/roster/init.js +52 -0
  174. package/dist/roster/init.js.map +1 -0
  175. package/dist/roster/roster.d.ts +79 -0
  176. package/dist/roster/roster.js +298 -0
  177. package/dist/roster/roster.js.map +1 -0
  178. package/package.json +1 -1
  179. package/plugin/.claude-plugin/plugin.json +2 -2
  180. package/plugin/agents/em-implementer.md +7 -4
  181. package/plugin/agents/em-validator.md +2 -2
  182. package/plugin/shared/reference/em-dsl.md +94 -6
  183. package/plugin/shared/reference/methodology.md +268 -0
  184. package/plugin/shared/reference/slice-doc-schema.md +96 -2
  185. package/plugin/shared/templates/slice.md +11 -3
  186. package/plugin/skills/conform/SKILL.md +1 -1
  187. package/plugin/skills/design/SKILL.md +46 -5
  188. package/plugin/skills/discover/SKILL.md +43 -8
  189. package/plugin/skills/discover/reference/extract.md +6 -1
  190. package/plugin/skills/discover/reference/prd-rubric.md +103 -0
  191. package/plugin/skills/discover/reference/prd-spec-path.md +172 -0
  192. package/plugin/skills/engagement/SKILL.md +21 -9
  193. package/plugin/skills/event-modeling/SKILL.md +1 -1
  194. package/plugin/skills/implement/SKILL.md +1 -1
  195. package/plugin/skills/implement/reference/implement.md +18 -0
  196. package/plugin/skills/review/SKILL.md +4 -2
@@ -0,0 +1,393 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // GH #295: the PRD/spec discovery path's record — `discovery/prd-triage.json`. The discover skill
3
+ // (reference/prd-spec-path.md) walks an input document: walkthroughs -> storylines, split into
4
+ // single-claim statements, classify against the SHIPPED rubric, group by reaction, rewrite-don't-
5
+ // drop, record. The LLM does the judgment; em does the part that must not be judged: the shape,
6
+ // the verbatim quotes (the LLM may reword, never invent — every statement and storyline quotes
7
+ // the input and the quote must appear in it), the rubric version, and "every statement has a
8
+ // group and an outcome". `em discover triage-check <file>` (cli.ts) and the MCP tool
9
+ // `discover_triage_check` are thin wrappers over `checkPrdTriage` below.
10
+ //
11
+ // The rubric's source of truth for the checker is PRD_RUBRIC here; the same data ships in the
12
+ // skill bundle as reference/prd-rubric.md (a ```json block — the bundle is markdown-only) so the
13
+ // agent reads it, and test/prdTriage.test.ts asserts the two are identical.
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { dirname, isAbsolute, resolve } from "node:path";
16
+ export const PRD_TRIAGE_SCHEMA_VERSION = "1.0";
17
+ export const TRIAGE_OUTCOMES = ["modeled", "rewritten", "constraint", "parked", "question"];
18
+ export const TRIAGE_CONFIDENCE = ["high", "low"];
19
+ export const TRIAGE_PROVENANCE = ["walkthrough", "reference"];
20
+ /** A quote shorter than this is too short to prove anything (`"order"` appears everywhere). */
21
+ export const MIN_QUOTE_CHARS = 12;
22
+ export const PRD_RUBRIC = {
23
+ rubricVersion: "1.0",
24
+ independentCheck: "Is this about the business, independent of how it is built?",
25
+ categories: [
26
+ { id: "business-fact", aboutBusiness: true, outcomes: ["modeled", "rewritten", "parked", "question"], meaning: "Something that happens or is true in the business; candidate event or field." },
27
+ { id: "user-intent", aboutBusiness: true, outcomes: ["modeled", "rewritten", "parked", "question"], meaning: "What an actor wants to accomplish; candidate command with its trigger." },
28
+ { id: "information-need", aboutBusiness: true, outcomes: ["modeled", "rewritten", "parked", "question"], meaning: "What an actor needs to see or know to act; candidate read model." },
29
+ { id: "actor", aboutBusiness: true, outcomes: ["modeled", "parked", "question"], meaning: "A person, role or calling system; candidate persona." },
30
+ { id: "business-rule", aboutBusiness: true, outcomes: ["modeled", "rewritten", "parked", "question"], meaning: "A constraint the business imposes; candidate invariant or scenario." },
31
+ { id: "external-system", aboutBusiness: "either", outcomes: ["modeled", "rewritten", "constraint", "parked", "question"], meaning: "A system outside the boundary; candidate translation slice or constraint." },
32
+ { id: "implementation-detail", aboutBusiness: false, outcomes: ["rewritten", "constraint", "parked", "question"], meaning: "How it is built. Rewritten in business language when it implies a business fact; a real tech choice goes to the constraints list." },
33
+ { id: "nfr", aboutBusiness: "either", outcomes: ["constraint", "parked", "question"], meaning: "Performance, availability, security, compliance: feeds the constitution, never a slice." },
34
+ { id: "goal-background", aboutBusiness: true, outcomes: ["parked", "rewritten", "question"], meaning: "Why the product exists; context for the main storyline, not a slice." },
35
+ { id: "question", aboutBusiness: "either", outcomes: ["question", "parked"], meaning: "An open question in the source; becomes a Socratic question, never an invented answer." },
36
+ { id: "resource-or-endpoint", aboutBusiness: false, outcomes: ["rewritten", "parked", "question"], meaning: "Describes an API resource or endpoint. Rewritten to the intent it serves (one endpoint may carry several); never promoted to a command as-is." },
37
+ ],
38
+ };
39
+ export const RUBRIC_CATEGORY_IDS = PRD_RUBRIC.categories.map((c) => c.id);
40
+ const norm = (s) => s.replace(/\s+/g, " ").trim();
41
+ /** Comparison form for the verbatim check, applied to BOTH sides: Markdown emphasis/code marks
42
+ * stripped, smart quotes straightened, whitespace collapsed. */
43
+ const normQuote = (s) => norm(s
44
+ .replace(/[‘’]/g, "'")
45
+ .replace(/[“”]/g, '"')
46
+ .replace(/[`*_]/g, ""));
47
+ function isObj(v) {
48
+ return typeof v === "object" && v !== null && !Array.isArray(v);
49
+ }
50
+ /** Shape + cross-reference validation of a parsed triage document (no file access). When
51
+ * `sourceText` is given, also checks every quote appears verbatim (see `normQuote`). Quotes
52
+ * shorter than MIN_QUOTE_CHARS are always rejected. `referenceOnlyGroups` lists the groups whose
53
+ * every statement came from the resource/endpoint reference rather than a walkthrough. */
54
+ export function validatePrdTriage(input, sourceText) {
55
+ const errors = [];
56
+ const err = (m) => errors.push(m);
57
+ if (!isObj(input))
58
+ return { ok: false, errors: ["top level must be a JSON object"] };
59
+ if (input.prdTriageSchemaVersion !== PRD_TRIAGE_SCHEMA_VERSION) {
60
+ err(`prdTriageSchemaVersion must be "${PRD_TRIAGE_SCHEMA_VERSION}" (got ${JSON.stringify(input.prdTriageSchemaVersion)})`);
61
+ }
62
+ if (input.rubricVersion !== PRD_RUBRIC.rubricVersion) {
63
+ err(`rubricVersion must be "${PRD_RUBRIC.rubricVersion}", the shipped rubric (got ${JSON.stringify(input.rubricVersion)})`);
64
+ }
65
+ if (typeof input.source !== "string" || input.source === "")
66
+ err("source must be a non-empty string (the input document path)");
67
+ for (const k of ["storylines", "groups", "statements", "constraints"]) {
68
+ if (!Array.isArray(input[k]))
69
+ err(`${k} must be an array`);
70
+ }
71
+ if (errors.length > 0)
72
+ return { ok: false, errors };
73
+ const nonEmpty = (v) => typeof v === "string" && v.trim() !== "";
74
+ const quoteIn = (where, q) => {
75
+ if (normQuote(q).length < MIN_QUOTE_CHARS) {
76
+ err(`${where}: quote is shorter than ${MIN_QUOTE_CHARS} characters ("${q}"); quote the whole claim`);
77
+ }
78
+ else if (sourceText !== undefined && !normQuote(sourceText).includes(normQuote(q))) {
79
+ err(`${where}: quote does not appear verbatim in the source: "${q.length > 60 ? q.slice(0, 57) + "..." : q}"`);
80
+ }
81
+ };
82
+ const seen = (kind, ids, id) => {
83
+ if (!nonEmpty(id)) {
84
+ err(`${kind}: id must be a non-empty string`);
85
+ return false;
86
+ }
87
+ if (ids.has(id)) {
88
+ err(`${kind} ${id}: duplicate id`);
89
+ return false;
90
+ }
91
+ ids.add(id);
92
+ return true;
93
+ };
94
+ const storylineIds = new Set();
95
+ const storylineSpan = new Map();
96
+ let mains = 0;
97
+ input.storylines.forEach((raw, i) => {
98
+ const w = `storylines[${i}]`;
99
+ if (!isObj(raw))
100
+ return err(`${w}: must be an object`);
101
+ if (!seen(w, storylineIds, raw.id))
102
+ return;
103
+ if (!nonEmpty(raw.name))
104
+ err(`${w} ${raw.id}: name required`);
105
+ if (typeof raw.main !== "boolean")
106
+ err(`${w} ${raw.id}: main must be a boolean`);
107
+ else if (raw.main)
108
+ mains++;
109
+ if (!nonEmpty(raw.quote))
110
+ err(`${w} ${raw.id}: quote required (the walkthrough's source span)`);
111
+ else {
112
+ quoteIn(`${w} ${raw.id}`, raw.quote);
113
+ storylineSpan.set(raw.id, normQuote(raw.quote));
114
+ }
115
+ });
116
+ if (storylineIds.size === 0)
117
+ err("storylines must name at least one storyline (the main end-to-end journey)");
118
+ else if (mains !== 1)
119
+ err(`exactly one storyline must be main (found ${mains})`);
120
+ const groupIds = new Set();
121
+ const groupStoryline = new Map();
122
+ const groupName = new Map();
123
+ input.groups.forEach((raw, i) => {
124
+ const w = `groups[${i}]`;
125
+ if (!isObj(raw))
126
+ return err(`${w}: must be an object`);
127
+ if (!seen(w, groupIds, raw.id))
128
+ return;
129
+ groupStoryline.set(raw.id, typeof raw.storyline === "string" ? raw.storyline : null);
130
+ groupName.set(raw.id, typeof raw.name === "string" ? raw.name : raw.id);
131
+ for (const k of ["name", "trigger", "actor"])
132
+ if (!nonEmpty(raw[k]))
133
+ err(`${w} ${raw.id}: ${k} required`);
134
+ // null = a reference-only group (outside every storyline); verified against its statements below.
135
+ if (raw.storyline !== null && (!nonEmpty(raw.storyline) || !storylineIds.has(raw.storyline))) {
136
+ err(`${w} ${raw.id}: storyline must name a declared storyline, or be null for a reference-only group`);
137
+ }
138
+ });
139
+ const statementIds = new Set();
140
+ const byId = new Map();
141
+ const usedGroups = new Set();
142
+ const groupMembers = new Map();
143
+ const quoteOwner = new Map();
144
+ // Each statement's character range (first occurrence) in the normalised source, for the
145
+ // partial-overlap check; only when the source is available.
146
+ const normSource = sourceText === undefined ? undefined : normQuote(sourceText);
147
+ const quoteRanges = new Map();
148
+ input.statements.forEach((raw, i) => {
149
+ const w = `statements[${i}]`;
150
+ if (!isObj(raw))
151
+ return err(`${w}: must be an object`);
152
+ if (!seen(w, statementIds, raw.id))
153
+ return;
154
+ const id = raw.id;
155
+ byId.set(id, raw);
156
+ const at = `${w} ${id}`;
157
+ if (!nonEmpty(raw.quote))
158
+ err(`${at}: quote required`);
159
+ else {
160
+ quoteIn(at, raw.quote);
161
+ const nq = normQuote(raw.quote);
162
+ for (const [pq, pid] of quoteOwner) {
163
+ if (pq === nq)
164
+ err(`${at}: quote duplicates statement ${pid}'s; one statement per claim`);
165
+ else if (pq.includes(nq) || nq.includes(pq))
166
+ err(`${at}: quote overlaps statement ${pid}'s (one contains the other); one statement per claim`);
167
+ else {
168
+ const a = quoteRanges.get(pid);
169
+ const b = normSource === undefined ? -1 : normSource.indexOf(nq);
170
+ if (a && b >= 0 && b < a[1] && a[0] < b + nq.length)
171
+ err(`${at}: quote overlaps statement ${pid}'s (their quotes share source text); one statement per claim`);
172
+ }
173
+ }
174
+ if (normSource !== undefined) {
175
+ const at0 = normSource.indexOf(nq);
176
+ if (at0 >= 0)
177
+ quoteRanges.set(id, [at0, at0 + nq.length]);
178
+ }
179
+ if (!quoteOwner.has(nq))
180
+ quoteOwner.set(nq, id);
181
+ // Provenance is checked, not declared: walkthrough quotes lie inside a storyline span,
182
+ // reference quotes lie outside every span.
183
+ const inside = [...storylineSpan].filter(([, span]) => span.includes(nq)).map(([sid]) => sid);
184
+ if (raw.provenance === "walkthrough" && inside.length === 0) {
185
+ err(`${at}: provenance is walkthrough but its quote lies inside no storyline's span (a walkthrough statement must quote a storyline's span)`);
186
+ }
187
+ if (raw.provenance === "reference" && inside.length > 0) {
188
+ err(`${at}: provenance is reference but its quote lies inside storyline ${inside[0]}'s span (a reference statement must quote text outside every storyline span)`);
189
+ }
190
+ }
191
+ const cat = PRD_RUBRIC.categories.find((c) => c.id === raw.category);
192
+ if (!cat)
193
+ err(`${at}: category must be one of ${RUBRIC_CATEGORY_IDS.join(", ")} (got ${JSON.stringify(raw.category)})`);
194
+ if (typeof raw.aboutBusiness !== "boolean")
195
+ err(`${at}: aboutBusiness must be a boolean (the independent check)`);
196
+ if (!TRIAGE_CONFIDENCE.includes(raw.confidence))
197
+ err(`${at}: confidence must be high or low`);
198
+ const outcome = raw.outcome;
199
+ if (!TRIAGE_OUTCOMES.includes(outcome)) {
200
+ err(`${at}: outcome must be one of ${TRIAGE_OUTCOMES.join(", ")}`);
201
+ return;
202
+ }
203
+ if (cat && !cat.outcomes.includes(outcome))
204
+ err(`${at}: category ${cat.id} may not have outcome ${outcome} (allowed: ${cat.outcomes.join(", ")})`);
205
+ if (!TRIAGE_PROVENANCE.includes(raw.provenance))
206
+ err(`${at}: provenance must be walkthrough or reference`);
207
+ // The independent check contradicting the category's expectation is a disagreement: a human's call.
208
+ if (cat && cat.aboutBusiness !== "either" && typeof raw.aboutBusiness === "boolean" && raw.aboutBusiness !== cat.aboutBusiness && outcome !== "question") {
209
+ err(`${at}: aboutBusiness is ${raw.aboutBusiness} but category ${cat.id} expects ${cat.aboutBusiness}; a disagreement must have outcome question (carry the proposed rewrite in the question), not ${outcome}`);
210
+ }
211
+ const needsGroup = outcome === "modeled" || outcome === "rewritten";
212
+ if (needsGroup || (outcome === "question" && raw.group !== null && raw.group !== undefined)) {
213
+ if (!nonEmpty(raw.group) || !groupIds.has(raw.group))
214
+ err(`${at}: outcome ${outcome} needs a group naming a declared group`);
215
+ else {
216
+ usedGroups.add(raw.group);
217
+ const members = groupMembers.get(raw.group) ?? [];
218
+ members.push(raw);
219
+ groupMembers.set(raw.group, members);
220
+ }
221
+ const gs = nonEmpty(raw.group) && groupStoryline.has(raw.group) ? groupStoryline.get(raw.group) : undefined;
222
+ if (gs === null) {
223
+ if (raw.storyline !== null && raw.storyline !== undefined)
224
+ err(`${at}: its group ${String(raw.group)} is reference-only (storyline null), so the statement's storyline must be null`);
225
+ }
226
+ else if (!nonEmpty(raw.storyline) || !storylineIds.has(raw.storyline)) {
227
+ err(`${at}: outcome ${outcome} needs a storyline naming a declared storyline`);
228
+ }
229
+ else if (gs !== undefined && gs !== raw.storyline) {
230
+ err(`${at}: storyline ${raw.storyline} differs from its group ${String(raw.group)}'s storyline ${gs}`);
231
+ }
232
+ }
233
+ else if (raw.group !== null && raw.group !== undefined) {
234
+ err(`${at}: outcome ${outcome} must have group null (only modeled/rewritten statements join a slice group; a question may name the group it would join)`);
235
+ }
236
+ if (outcome === "rewritten" && !nonEmpty(raw.rewrite))
237
+ err(`${at}: outcome rewritten needs a rewrite (business-language text)`);
238
+ if (outcome === "parked" && !nonEmpty(raw.reason))
239
+ err(`${at}: outcome parked needs a reason (it also goes in the Decisions log)`);
240
+ if (outcome === "question" && !nonEmpty(raw.question))
241
+ err(`${at}: outcome question needs a question`);
242
+ if (cat?.id === "resource-or-endpoint" && outcome === "modeled") {
243
+ err(`${at}: a resource-or-endpoint statement is never modeled as-is; rewrite it to the intent it serves`);
244
+ }
245
+ if (raw.confidence === "low" && outcome !== "question")
246
+ err(`${at}: low confidence must become a question, not ${outcome}`);
247
+ if (raw.scenarioOf !== undefined && (!nonEmpty(raw.scenarioOf) || !groupIds.has(raw.scenarioOf))) {
248
+ err(`${at}: scenarioOf must name a declared group`);
249
+ }
250
+ });
251
+ if (statementIds.size === 0)
252
+ err("statements must not be empty");
253
+ const constrained = new Set();
254
+ input.constraints.forEach((raw, i) => {
255
+ const w = `constraints[${i}]`;
256
+ if (!isObj(raw))
257
+ return err(`${w}: must be an object`);
258
+ if (!nonEmpty(raw.id))
259
+ err(`${w}: id required`);
260
+ if (!nonEmpty(raw.text))
261
+ err(`${w}: text required`);
262
+ if (!Array.isArray(raw.statements) || raw.statements.length === 0)
263
+ return err(`${w}: statements must list at least one statement id`);
264
+ for (const s of raw.statements) {
265
+ const st = typeof s === "string" ? byId.get(s) : undefined;
266
+ if (!st)
267
+ err(`${w}: unknown statement ${JSON.stringify(s)}`);
268
+ else if (st.outcome !== "constraint")
269
+ err(`${w}: statement ${String(s)} has outcome ${String(st.outcome)}, not constraint`);
270
+ else
271
+ constrained.add(s);
272
+ }
273
+ });
274
+ for (const [id, st] of byId) {
275
+ if (st.outcome === "constraint" && !constrained.has(id))
276
+ err(`statement ${id}: outcome constraint but no constraints[] entry lists it`);
277
+ }
278
+ for (const g of groupIds)
279
+ if (!usedGroups.has(g))
280
+ err(`group ${g}: no statement joins it`);
281
+ // Walkthrough-first: a group is EITHER anchored (a walkthrough statement whose quote lies inside
282
+ // its named storyline's span) OR reference-only (every statement `reference`, the group and its
283
+ // statements outside every storyline: storyline null). Reference-only groups are listed in the
284
+ // report for the human to inspect.
285
+ const referenceOnlyGroups = [];
286
+ for (const g of groupIds) {
287
+ const members = groupMembers.get(g);
288
+ if (!members)
289
+ continue;
290
+ const named = groupStoryline.get(g) ?? null;
291
+ if (members.every((m) => m.provenance === "reference")) {
292
+ if (named !== null)
293
+ err(`group ${g}: every statement is reference, so it is a reference-only group and must have storyline null (it joins no walkthrough storyline), not ${named}`);
294
+ else
295
+ referenceOnlyGroups.push(groupName.get(g) ?? g);
296
+ continue;
297
+ }
298
+ if (named === null) {
299
+ err(`group ${g}: storyline is null but it has walkthrough statements; name the storyline they advance`);
300
+ continue;
301
+ }
302
+ const span = storylineSpan.get(named);
303
+ // Only modeled/rewritten walkthrough statements anchor; a question is a pointer, never an anchor.
304
+ const inSpan = (m) => m.provenance === "walkthrough" && span !== undefined && typeof m.quote === "string" && span.includes(normQuote(m.quote));
305
+ const anchored = members.some((m) => (m.outcome === "modeled" || m.outcome === "rewritten") && inSpan(m));
306
+ if (!anchored && members.some((m) => m.outcome === "question" && inSpan(m))) {
307
+ err(`group ${g}: anchored by questions only — answer them or make the group reference-only`);
308
+ }
309
+ else if (!anchored)
310
+ err(`group ${g}: no walkthrough statement lies inside storyline ${named}'s span; anchor it in that walkthrough, or move it to a reference-only group`);
311
+ }
312
+ return errors.length > 0 ? { ok: false, errors } : { ok: true, doc: input, referenceOnlyGroups };
313
+ }
314
+ /** Check a `discovery/prd-triage.json`. The input document is `opts.source` when given, else the
315
+ * file's own `source`, resolved relative to the triage file's directory. */
316
+ export function checkPrdTriage(path, opts = {}) {
317
+ if (!existsSync(path))
318
+ return { ok: false, path, errors: [`no such file: ${path}`] };
319
+ let parsed;
320
+ try {
321
+ parsed = JSON.parse(readFileSync(path, "utf8"));
322
+ }
323
+ catch {
324
+ return { ok: false, path, errors: [`${path} is not valid JSON`] };
325
+ }
326
+ const declared = isObj(parsed) && typeof parsed.source === "string" ? parsed.source : undefined;
327
+ const sourceRef = opts.source ?? declared;
328
+ let sourcePath;
329
+ let sourceText;
330
+ const pre = [];
331
+ if (sourceRef) {
332
+ sourcePath = opts.source ? resolve(opts.source) : isAbsolute(sourceRef) ? sourceRef : resolve(dirname(path), sourceRef);
333
+ if (!existsSync(sourcePath))
334
+ pre.push(`source document not found: ${sourcePath}`);
335
+ else
336
+ sourceText = readFileSync(sourcePath, "utf8");
337
+ }
338
+ const shape = validatePrdTriage(parsed, sourceText);
339
+ const errors = [...pre, ...(shape.ok ? [] : shape.errors)];
340
+ if (errors.length > 0 || !shape.ok)
341
+ return { ok: false, path, errors };
342
+ return {
343
+ ok: true,
344
+ path,
345
+ source: sourcePath ?? shape.doc.source,
346
+ statements: shape.doc.statements.length,
347
+ storylines: shape.doc.storylines.length,
348
+ groups: shape.doc.groups.length,
349
+ referenceOnlyGroups: shape.referenceOnlyGroups,
350
+ errors: [],
351
+ };
352
+ }
353
+ /** `em discover triage-check --json` document. */
354
+ export function buildCheckPrdTriageJson(result) {
355
+ const doc = result.ok
356
+ ? { ok: true, path: result.path, source: result.source, storylines: result.storylines, groups: result.groups, statements: result.statements, referenceOnlyGroups: result.referenceOnlyGroups, errors: [] }
357
+ : { ok: false, path: result.path, errors: result.errors };
358
+ return JSON.stringify(doc, null, 2);
359
+ }
360
+ /** The Markdown view of a triage record (`--markdown`): deterministic, for the engagement reader. */
361
+ export function renderPrdTriageMarkdown(doc, referenceOnlyGroups = []) {
362
+ const L = ["# PRD triage", "", `Source: \`${doc.source}\` · rubric ${doc.rubricVersion} · schema ${doc.prdTriageSchemaVersion}`, ""];
363
+ L.push("## Storylines", "");
364
+ for (const s of doc.storylines)
365
+ L.push(`- **${s.name}**${s.main ? " (main)" : ""} — "${norm(s.quote)}"`);
366
+ L.push("", "## Slice groups", "");
367
+ for (const g of doc.groups) {
368
+ L.push(`### ${g.name}`, "", `Storyline: ${g.storyline ?? "none (reference-only)"} · trigger: ${g.trigger} · acting: ${g.actor}`, "");
369
+ for (const s of doc.statements.filter((x) => x.group === g.id)) {
370
+ const body = s.outcome === "rewritten" ? `${s.rewrite} _(from: "${norm(s.quote)}")_` : `"${norm(s.quote)}"`;
371
+ L.push(`- \`${s.id}\` [${s.category}] ${body}${s.scenarioOf ? ` — scenario of ${s.scenarioOf}` : ""}`);
372
+ }
373
+ L.push("");
374
+ }
375
+ if (referenceOnlyGroups.length > 0) {
376
+ L.push("## Reference-only groups — operations no walkthrough touches; check these are not CRUD fill", "");
377
+ for (const g of referenceOnlyGroups)
378
+ L.push(`- ${g}`);
379
+ L.push("");
380
+ }
381
+ const withOutcome = (o) => doc.statements.filter((s) => s.outcome === o);
382
+ L.push("## Constraints (feed the constitution)", "");
383
+ for (const c of doc.constraints)
384
+ L.push(`- ${c.text} (${c.statements.join(", ")})`);
385
+ L.push("", "## Parked", "");
386
+ for (const s of withOutcome("parked"))
387
+ L.push(`- \`${s.id}\` "${norm(s.quote)}" — ${s.reason}`);
388
+ L.push("", "## Questions for the owner", "");
389
+ for (const s of withOutcome("question"))
390
+ L.push(`- \`${s.id}\` ${s.question} _(source: "${norm(s.quote)}")_`);
391
+ return L.join("\n") + "\n";
392
+ }
393
+ //# sourceMappingURL=prdTriage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prdTriage.js","sourceRoot":"","sources":["../../src/cli/prdTriage.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"}
@@ -8,6 +8,10 @@ export type ApplyReviewResult = {
8
8
  ok: true;
9
9
  content: string;
10
10
  changed: boolean;
11
+ previous?: {
12
+ by: string;
13
+ on: string;
14
+ };
11
15
  } | {
12
16
  ok: false;
13
17
  message: string;
@@ -21,18 +25,29 @@ export type ApplyReviewResult = {
21
25
  * Refuses from `ready-to-implement`/`implemented` (see module header). No fs access — the caller
22
26
  * reads/writes; see `runReview` below.
23
27
  */
24
- export declare function applyReviewFrontmatter(raw: string, reviewedBy: string, reviewedOn: string): ApplyReviewResult;
28
+ export declare function applyReviewFrontmatter(raw: string, reviewedBy: string, reviewedOn: string, again?: boolean): ApplyReviewResult;
25
29
  export type RunReviewResult = {
26
30
  ok: true;
27
31
  path: string;
28
32
  changed: boolean;
33
+ previous?: {
34
+ by: string;
35
+ on: string;
36
+ };
37
+ allowedOpen?: number;
29
38
  } | {
30
39
  ok: false;
31
40
  message: string;
32
41
  };
42
+ export interface ReviewOptions {
43
+ /** GH #333: re-record reviewedBy/reviewedOn on a doc that is already `status: reviewed`. */
44
+ again?: boolean;
45
+ /** GH #333: record the review although `## Open Questions` still has unchecked items. */
46
+ allowOpen?: boolean;
47
+ }
33
48
  /**
34
49
  * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`mark-implemented`/
35
50
  * `--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/writes it.
36
51
  * `baseDir` is the `.em` file's directory, same convention every doc/note path in `em` uses.
37
52
  */
38
- export declare function runReview(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, reviewedBy: string, reviewedOn: string): RunReviewResult;
53
+ export declare function runReview(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, reviewedBy: string, reviewedOn: string, opts?: ReviewOptions): RunReviewResult;
@@ -30,6 +30,7 @@ import { join } from "node:path";
30
30
  import { continuationOf } from "../model/continuation.js";
31
31
  import { resolveSliceDocJoin } from "../catalog/docJoin.js";
32
32
  import { fieldLineRegex, locateFrontmatterInner, normalizeFieldValue } from "./frontmatterSurgery.js";
33
+ import { parseSliceDoc, uncheckedOpenQuestions } from "../catalog/sliceDoc.js";
33
34
  import { isValidDateString } from "./stateFile.js";
34
35
  /** The status this command flips a slice doc to — the review gate
35
36
  * (docs/process.md#the-slice-lifecycle-gates): the room walked the slice and every open question
@@ -48,7 +49,7 @@ const POST_REVIEW_STATUSES = ["ready-to-implement", "implemented"];
48
49
  * Refuses from `ready-to-implement`/`implemented` (see module header). No fs access — the caller
49
50
  * reads/writes; see `runReview` below.
50
51
  */
51
- export function applyReviewFrontmatter(raw, reviewedBy, reviewedOn) {
52
+ export function applyReviewFrontmatter(raw, reviewedBy, reviewedOn, again = false) {
52
53
  const trimmedBy = reviewedBy.trim();
53
54
  if (!trimmedBy)
54
55
  return { ok: false, message: "a reviewer name is required (--by)" };
@@ -76,11 +77,14 @@ export function applyReviewFrontmatter(raw, reviewedBy, reviewedOn) {
76
77
  if (currentBy === trimmedBy && currentOn === reviewedOn) {
77
78
  return { ok: true, content: raw, changed: false }; // idempotent no-op
78
79
  }
79
- return {
80
- ok: false,
81
- message: `already reviewed by ${currentBy} on ${currentOn} — refusing to overwrite with ` +
82
- `${trimmedBy} on ${reviewedOn}`,
83
- };
80
+ if (!again) {
81
+ return {
82
+ ok: false,
83
+ message: `already reviewed by ${currentBy} on ${currentOn} — refusing to overwrite with ` +
84
+ `${trimmedBy} on ${reviewedOn} (re-record with --again)`,
85
+ };
86
+ }
87
+ // GH #333 --again: fall through to the normal edit below, which replaces both values in place.
84
88
  }
85
89
  if (currentStatus !== null && POST_REVIEW_STATUSES.includes(currentStatus)) {
86
90
  return {
@@ -118,14 +122,17 @@ export function applyReviewFrontmatter(raw, reviewedBy, reviewedOn) {
118
122
  updatedInner = updatedInner.slice(0, edit.index) + edit.next + updatedInner.slice(edit.index + edit.oldLen);
119
123
  }
120
124
  const content = raw.slice(0, range.innerStart) + updatedInner + raw.slice(range.innerEnd);
121
- return { ok: true, content, changed: true };
125
+ const previous = currentStatus === REVIEWED_STATUS && currentBy !== null && currentOn !== null
126
+ ? { by: currentBy, on: currentOn }
127
+ : undefined;
128
+ return { ok: true, content, changed: true, ...(previous ? { previous } : {}) };
122
129
  }
123
130
  /**
124
131
  * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`mark-implemented`/
125
132
  * `--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/writes it.
126
133
  * `baseDir` is the `.em` file's directory, same convention every doc/note path in `em` uses.
127
134
  */
128
- export function runReview(model, refs, baseDir, sliceKey, reviewedBy, reviewedOn) {
135
+ export function runReview(model, refs, baseDir, sliceKey, reviewedBy, reviewedOn, opts = {}) {
129
136
  const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
130
137
  if (sliceIndex === -1) {
131
138
  return { ok: false, message: `no slice with export key "${sliceKey}" in this model` };
@@ -159,13 +166,35 @@ export function runReview(model, refs, baseDir, sliceKey, reviewedBy, reviewedOn
159
166
  }
160
167
  const absPath = join(baseDir, doc.path);
161
168
  const raw = readFileSync(absPath, "utf8");
162
- const result = applyReviewFrontmatter(raw, reviewedBy, reviewedOn);
169
+ const result = applyReviewFrontmatter(raw, reviewedBy, reviewedOn, opts.again === true);
163
170
  if (!result.ok) {
164
171
  return { ok: false, message: `${doc.path}: ${result.message}` };
165
172
  }
173
+ // GH #333: review is the "every open question is resolved" gate. A no-op re-run records
174
+ // nothing, so only a write is gated — same unchecked-item grammar as --slice-ready.
175
+ let allowedOpen;
176
+ if (result.changed) {
177
+ const open = uncheckedOpenQuestions(parseSliceDoc(raw).body);
178
+ if (open.length > 0) {
179
+ if (!opts.allowOpen) {
180
+ return {
181
+ ok: false,
182
+ message: `${doc.path}: ${open.length} unchecked Open Questions item(s) — first: "${open[0]}". ` +
183
+ "Resolve or defer them (`em slice defer`), or pass --allow-open to record a deliberately partial walk",
184
+ };
185
+ }
186
+ allowedOpen = open.length;
187
+ }
188
+ }
166
189
  if (result.changed) {
167
190
  writeFileSync(absPath, result.content, "utf8");
168
191
  }
169
- return { ok: true, path: doc.path, changed: result.changed };
192
+ return {
193
+ ok: true,
194
+ path: doc.path,
195
+ changed: result.changed,
196
+ ...(result.previous ? { previous: result.previous } : {}),
197
+ ...(allowedOpen !== undefined ? { allowedOpen } : {}),
198
+ };
170
199
  }
171
200
  //# sourceMappingURL=review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/cli/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/cli/review.ts"],"names":[],"mappings":"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"}