@milehimikey/em 1.14.0 → 1.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/event-modeling/SKILL.md +1 -1
- package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
- package/.claude/skills/event-modeling-design/SKILL.md +2 -1
- package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
- package/.claude/skills/event-modeling-engagement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +4 -1
- package/.claude/skills/event-modeling-review/SKILL.md +2 -2
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +227 -222
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +8 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/README.md +12 -0
- package/dist/cli/defer.d.ts +55 -0
- package/dist/cli/defer.js +244 -0
- package/dist/cli/defer.js.map +1 -0
- package/dist/cli/markImplemented.d.ts +9 -0
- package/dist/cli/markImplemented.js +20 -1
- package/dist/cli/markImplemented.js.map +1 -1
- package/dist/cli/reratify.d.ts +1 -0
- package/dist/cli/reratify.js +5 -2
- package/dist/cli/reratify.js.map +1 -1
- package/dist/cli.js +48 -2
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/shared/reference/em-dsl.md +227 -222
- package/plugin/shared/reference/slice-doc-schema.md +8 -0
- package/plugin/skills/conform/SKILL.md +1 -1
- package/plugin/skills/design/SKILL.md +2 -1
- package/plugin/skills/discover/SKILL.md +1 -1
- package/plugin/skills/engagement/SKILL.md +1 -1
- package/plugin/skills/event-modeling/SKILL.md +1 -1
- package/plugin/skills/implement/SKILL.md +1 -1
- package/plugin/skills/implement/reference/implement.md +4 -1
- package/plugin/skills/review/SKILL.md +2 -2
|
@@ -479,6 +479,14 @@ diverges from git, grows unboundedly over a long-lived slice's life, and forces
|
|
|
479
479
|
work out which resolutions are still relevant to the *current* version versus leftover from a
|
|
480
480
|
prior one — exactly the ambiguity a live, current-version-only section avoids.
|
|
481
481
|
|
|
482
|
+
**Deferral marker (MIL-275).** A question this version will not answer is not left `- [ ]` and
|
|
483
|
+
not deleted: `em slice defer` checks it and rewrites it as `- [x] <original> — v<current>:
|
|
484
|
+
<decision>; deferred to v<n> (<date>[, <by>])`. The `deferred to v<n>` marker is what
|
|
485
|
+
`em slice reratify` reads: when a bump reaches v<n> it rewrites each such item back to
|
|
486
|
+
`- [ ] <original>`, so the question must be resolved or re-deferred before `--slice-ready` passes
|
|
487
|
+
again. The prune rule above does not apply to a deferred item before v<n> (it stays as the
|
|
488
|
+
record); once reopened it is an ordinary open question.
|
|
489
|
+
|
|
482
490
|
**Not a parsing/grammar change.** `countOpenQuestions()` (`sliceDoc.ts`) and
|
|
483
491
|
`slice-ready-open-questions-unchecked` (`sliceReadyValidate.ts`,
|
|
484
492
|
[validation.md#slice-readiness](https://github.com/milehimikey/em/blob/main/docs/validation.md#slice-readiness)) are unaffected: both already
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "em-1-14-
|
|
2
|
+
"name": "em-1-14-2",
|
|
3
3
|
"owner": {
|
|
4
4
|
"name": "Mike Key"
|
|
5
5
|
},
|
|
6
|
-
"description": "em v1.14.
|
|
6
|
+
"description": "em v1.14.2: the Event Modeling skill bundle and MCP server as a Claude Code plugin.",
|
|
7
7
|
"plugins": [
|
|
8
8
|
{
|
|
9
9
|
"name": "em",
|
package/README.md
CHANGED
|
@@ -21,6 +21,18 @@ Requires Node ≥ 18. SVG, PNG, and PDF rendering are all fully self-contained (
|
|
|
21
21
|
as bundled WebAssembly); nothing else to install. Only rarer formats (ps, eps, ...) need an
|
|
22
22
|
optional system dependency — see [docs/dependencies.md](docs/dependencies.md).
|
|
23
23
|
|
|
24
|
+
**Working in a team, or across several repos?** Pin `em` per project instead, so every
|
|
25
|
+
contributor, agent and CI job runs the same version — with [mise](https://mise.jdx.dev) it's one
|
|
26
|
+
line and needs no `package.json`:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
mise use npm:@milehimikey/em@1.14.1 # writes the pin to mise.toml; bare `em` now resolves to it
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Pair it with the Claude Code plugin pin (below) and the CLI, the skills and the MCP server are all
|
|
33
|
+
on one version. See [docs/ai-workflow.md](docs/ai-workflow.md#pinning-the-cli-to-the-same-version)
|
|
34
|
+
for the full motion, including the `npx` route for repos without mise.
|
|
35
|
+
|
|
24
36
|
## Quickstart
|
|
25
37
|
|
|
26
38
|
```bash
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { NormalizedModel } from "../model/model.js";
|
|
2
|
+
import { RefsResult } from "../model/refs.js";
|
|
3
|
+
/** `v<int>` → int, else null. */
|
|
4
|
+
export declare function parseUntil(s: string): number | null;
|
|
5
|
+
export interface DeferInput {
|
|
6
|
+
question: string;
|
|
7
|
+
until: string;
|
|
8
|
+
decision: string;
|
|
9
|
+
by?: string;
|
|
10
|
+
on: string;
|
|
11
|
+
currentVersion: number;
|
|
12
|
+
}
|
|
13
|
+
export type ApplyDeferResult = {
|
|
14
|
+
ok: true;
|
|
15
|
+
content: string;
|
|
16
|
+
changed: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Pure: rewrites the single `- [ ]` item of `## Open Questions` whose text contains
|
|
23
|
+
* `question` (case-sensitive substring) as
|
|
24
|
+
* `- [x] <original> — v<current>: <decision>; deferred to v<n> (<on>[, <by>])`.
|
|
25
|
+
* Already deferred to the same version → `{ok: true, changed: false}` (idempotent no-op).
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyDefer(raw: string, input: DeferInput): ApplyDeferResult;
|
|
28
|
+
export interface StateMirrorInput {
|
|
29
|
+
question: string;
|
|
30
|
+
sliceKey: string;
|
|
31
|
+
until: number;
|
|
32
|
+
decision: string;
|
|
33
|
+
by?: string;
|
|
34
|
+
on: string;
|
|
35
|
+
currentVersion: number;
|
|
36
|
+
}
|
|
37
|
+
/** Pure: mirrors the deferral into the state file's parking lot and Decisions log. */
|
|
38
|
+
export declare function applyDeferStateFile(raw: string, input: StateMirrorInput): ApplyDeferResult;
|
|
39
|
+
/** Pure (reratify): re-opens every `- [x] … — v<old>: …; deferred to v<newVersion> (…)` item under
|
|
40
|
+
* `## Open Questions` as `- [ ] <original text>`. Items deferred to a later version are untouched. */
|
|
41
|
+
export declare function reopenDeferred(raw: string, newVersion: number): {
|
|
42
|
+
content: string;
|
|
43
|
+
count: number;
|
|
44
|
+
};
|
|
45
|
+
export type RunDeferResult = {
|
|
46
|
+
ok: true;
|
|
47
|
+
path: string;
|
|
48
|
+
changed: boolean;
|
|
49
|
+
} | {
|
|
50
|
+
ok: false;
|
|
51
|
+
message: string;
|
|
52
|
+
};
|
|
53
|
+
/** Resolves `sliceKey` to its bound doc (same join as ratify/reratify), computes both edits, and
|
|
54
|
+
* writes only when every precondition holds (the state file is required and never created). */
|
|
55
|
+
export declare function runDefer(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, input: Omit<DeferInput, "currentVersion">): RunDeferResult;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// `em slice defer` (MIL-275): the missing verb behind docs/process.md's "resolved or explicitly
|
|
3
|
+
// deferred". Rewrites ONE unchecked `## Open Questions` item as a checked, dated "deferred to
|
|
4
|
+
// v<n>" item, and mirrors it into the model's `.event-modeling.md` (the `## Open questions /
|
|
5
|
+
// parking lot` bullet and a dated `## Decisions log` bullet), idempotently. `em slice reratify`
|
|
6
|
+
// reads the `deferred to v<n>` marker back and re-opens the item (`reopenDeferred`, below).
|
|
7
|
+
//
|
|
8
|
+
// Write strategy: surgical line edits (the same discipline as ratify.ts/reratify.ts) — every
|
|
9
|
+
// byte outside the edited line / appended bullet, including the file's own EOL style, is copied
|
|
10
|
+
// through verbatim. Pure `apply*` functions here; the fs orchestration (`runDefer`) is thin.
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { continuationOf } from "../model/continuation.js";
|
|
14
|
+
import { resolveSliceDocJoin } from "../catalog/docJoin.js";
|
|
15
|
+
import { STATE_FILE_NAME } from "./stateFile.js";
|
|
16
|
+
const OPEN_QUESTIONS_HEADING = /^##\s+Open Questions\s*$/i;
|
|
17
|
+
const TASK_ITEM = /^([ \t]*[-*]\s*)\[([ xX])\](.*)$/;
|
|
18
|
+
const PARKING_LOT_HEADING = /^##\s+Open questions \/ parking lot\s*$/i;
|
|
19
|
+
const DECISIONS_HEADING = /^##\s+Decisions log\s*$/;
|
|
20
|
+
const ANY_H1_H2 = /^#{1,2}\s/;
|
|
21
|
+
const ANY_H2 = /^##\s/;
|
|
22
|
+
/** Splits keeping each line's own terminator, so a rewrite never normalizes EOLs. */
|
|
23
|
+
function splitKeepEol(text) {
|
|
24
|
+
return text.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
25
|
+
}
|
|
26
|
+
function stripEol(line) {
|
|
27
|
+
const m = /\r?\n$/.exec(line);
|
|
28
|
+
return m ? { body: line.slice(0, m.index), eol: m[0] } : { body: line, eol: "" };
|
|
29
|
+
}
|
|
30
|
+
/** `v<int>` → int, else null. */
|
|
31
|
+
export function parseUntil(s) {
|
|
32
|
+
const m = /^v(\d+)$/.exec(s);
|
|
33
|
+
if (!m)
|
|
34
|
+
return null;
|
|
35
|
+
const n = Number(m[1]);
|
|
36
|
+
return Number.isInteger(n) && n >= 1 ? n : null;
|
|
37
|
+
}
|
|
38
|
+
function validateInput(i) {
|
|
39
|
+
if (i.question.trim() === "")
|
|
40
|
+
return { ok: false, message: "a question is required" };
|
|
41
|
+
if (/[\x00-\x1f\x7f]/.test(i.question))
|
|
42
|
+
return { ok: false, message: "question must not contain control characters" };
|
|
43
|
+
if (i.decision.trim() === "")
|
|
44
|
+
return { ok: false, message: 'a decision is required (--decision "<what this version does>")' };
|
|
45
|
+
if (/[\x00-\x1f\x7f]/.test(i.decision))
|
|
46
|
+
return { ok: false, message: "decision must not contain control characters" };
|
|
47
|
+
if (i.by !== undefined && (i.by.trim() === "" || /[\x00-\x1f\x7f]/.test(i.by))) {
|
|
48
|
+
return { ok: false, message: "deferrer name must not be empty or contain control characters" };
|
|
49
|
+
}
|
|
50
|
+
const until = parseUntil(i.until);
|
|
51
|
+
if (until === null)
|
|
52
|
+
return { ok: false, message: `invalid --until "${i.until}" — expected v<n> (for example v2)` };
|
|
53
|
+
if (until <= i.currentVersion) {
|
|
54
|
+
return { ok: false, message: `--until ${i.until} must be greater than the doc's current version v${i.currentVersion}` };
|
|
55
|
+
}
|
|
56
|
+
return { ok: true, until };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Pure: rewrites the single `- [ ]` item of `## Open Questions` whose text contains
|
|
60
|
+
* `question` (case-sensitive substring) as
|
|
61
|
+
* `- [x] <original> — v<current>: <decision>; deferred to v<n> (<on>[, <by>])`.
|
|
62
|
+
* Already deferred to the same version → `{ok: true, changed: false}` (idempotent no-op).
|
|
63
|
+
*/
|
|
64
|
+
export function applyDefer(raw, input) {
|
|
65
|
+
const v = validateInput(input);
|
|
66
|
+
if (!v.ok)
|
|
67
|
+
return v;
|
|
68
|
+
const lines = splitKeepEol(raw);
|
|
69
|
+
let start = -1;
|
|
70
|
+
let i = 0;
|
|
71
|
+
// Skip the frontmatter fence so a heading-looking line in it can never match.
|
|
72
|
+
if (/^---[ \t]*\r?\n/.test(raw)) {
|
|
73
|
+
for (i = 1; i < lines.length; i++)
|
|
74
|
+
if (/^---[ \t]*\r?\n?$/.test(lines[i]))
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
for (; i < lines.length; i++) {
|
|
78
|
+
if (OPEN_QUESTIONS_HEADING.test(stripEol(lines[i]).body)) {
|
|
79
|
+
start = i;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (start === -1)
|
|
84
|
+
return { ok: false, message: `no unchecked Open Question matching "${input.question}"` };
|
|
85
|
+
const unchecked = [];
|
|
86
|
+
const checked = [];
|
|
87
|
+
for (let j = start + 1; j < lines.length; j++) {
|
|
88
|
+
const body = stripEol(lines[j]).body;
|
|
89
|
+
if (ANY_H1_H2.test(body))
|
|
90
|
+
break;
|
|
91
|
+
const m = TASK_ITEM.exec(body);
|
|
92
|
+
if (!m || !m[3].includes(input.question))
|
|
93
|
+
continue;
|
|
94
|
+
(m[2] === " " ? unchecked : checked).push(j);
|
|
95
|
+
}
|
|
96
|
+
const itemText = (j) => TASK_ITEM.exec(stripEol(lines[j]).body)[3].trim();
|
|
97
|
+
if (unchecked.length === 0) {
|
|
98
|
+
const sameMarker = new RegExp(`deferred to v${v.until}\\b`);
|
|
99
|
+
if (checked.some((j) => sameMarker.test(itemText(j))))
|
|
100
|
+
return { ok: true, content: raw, changed: false };
|
|
101
|
+
if (checked.length > 0)
|
|
102
|
+
return { ok: false, message: `already checked: ${itemText(checked[0])}` };
|
|
103
|
+
return { ok: false, message: `no unchecked Open Question matching "${input.question}"` };
|
|
104
|
+
}
|
|
105
|
+
if (unchecked.length > 1) {
|
|
106
|
+
return { ok: false, message: `ambiguous — matches: ${unchecked.map(itemText).join(" | ")}` };
|
|
107
|
+
}
|
|
108
|
+
const j = unchecked[0];
|
|
109
|
+
const { body, eol } = stripEol(lines[j]);
|
|
110
|
+
const m = TASK_ITEM.exec(body);
|
|
111
|
+
const suffix = ` — v${input.currentVersion}: ${input.decision.trim()}; deferred to v${v.until} ` +
|
|
112
|
+
`(${input.on}${input.by !== undefined ? `, ${input.by.trim()}` : ""})`;
|
|
113
|
+
lines[j] = `${m[1]}[x]${m[3].trimEnd()}${suffix}${eol}`;
|
|
114
|
+
return { ok: true, content: lines.join(""), changed: true };
|
|
115
|
+
}
|
|
116
|
+
/** Appends `bullet` at the end of the section under `heading` (before the next `## ` heading or
|
|
117
|
+
* EOF, after the section's last non-blank line) unless an identical bullet line exists. */
|
|
118
|
+
function appendBullet(lines, heading, bullet, eol) {
|
|
119
|
+
const start = lines.findIndex((l) => heading.test(stripEol(l).body));
|
|
120
|
+
if (start === -1)
|
|
121
|
+
return null;
|
|
122
|
+
let end = lines.length;
|
|
123
|
+
for (let j = start + 1; j < lines.length; j++) {
|
|
124
|
+
if (ANY_H2.test(stripEol(lines[j]).body)) {
|
|
125
|
+
end = j;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for (let j = start + 1; j < end; j++)
|
|
130
|
+
if (stripEol(lines[j]).body.trimEnd() === bullet)
|
|
131
|
+
return { lines, changed: false };
|
|
132
|
+
let last = end - 1;
|
|
133
|
+
while (last > start && stripEol(lines[last]).body.trim() === "")
|
|
134
|
+
last--;
|
|
135
|
+
const out = lines.slice();
|
|
136
|
+
if (out[last] !== undefined && !/\n$/.test(out[last]))
|
|
137
|
+
out[last] = out[last] + eol;
|
|
138
|
+
out.splice(last + 1, 0, bullet + eol);
|
|
139
|
+
return { lines: out, changed: true };
|
|
140
|
+
}
|
|
141
|
+
/** Pure: mirrors the deferral into the state file's parking lot and Decisions log. */
|
|
142
|
+
export function applyDeferStateFile(raw, input) {
|
|
143
|
+
const eol = raw.includes("\r\n") ? "\r\n" : "\n";
|
|
144
|
+
const parking = `- ${input.question} (from slice ${input.sliceKey}, deferred to v${input.until})`;
|
|
145
|
+
const decision = `- ${input.on}: deferred "${input.question}" on ${input.sliceKey} to v${input.until} — ` +
|
|
146
|
+
`v${input.currentVersion}: ${input.decision.trim()}${input.by !== undefined ? ` — by ${input.by.trim()}` : ""}`;
|
|
147
|
+
let lines = splitKeepEol(raw);
|
|
148
|
+
const a = appendBullet(lines, PARKING_LOT_HEADING, parking, eol);
|
|
149
|
+
if (!a)
|
|
150
|
+
return { ok: false, message: `${STATE_FILE_NAME} has no "## Open questions / parking lot" heading` };
|
|
151
|
+
lines = a.lines;
|
|
152
|
+
const b = appendBullet(lines, DECISIONS_HEADING, decision, eol);
|
|
153
|
+
if (!b)
|
|
154
|
+
return { ok: false, message: `${STATE_FILE_NAME} has no "## Decisions log" heading` };
|
|
155
|
+
return { ok: true, content: b.lines.join(""), changed: a.changed || b.changed };
|
|
156
|
+
}
|
|
157
|
+
/** Pure (reratify): re-opens every `- [x] … — v<old>: …; deferred to v<newVersion> (…)` item under
|
|
158
|
+
* `## Open Questions` as `- [ ] <original text>`. Items deferred to a later version are untouched. */
|
|
159
|
+
export function reopenDeferred(raw, newVersion) {
|
|
160
|
+
const lines = splitKeepEol(raw);
|
|
161
|
+
const marker = new RegExp(`^(.*?) — v\\d+: .*; deferred to v${newVersion} \\(.*\\)\\s*$`);
|
|
162
|
+
let inSection = false;
|
|
163
|
+
let count = 0;
|
|
164
|
+
for (let j = 0; j < lines.length; j++) {
|
|
165
|
+
const { body, eol } = stripEol(lines[j]);
|
|
166
|
+
if (OPEN_QUESTIONS_HEADING.test(body)) {
|
|
167
|
+
inSection = true;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (inSection && ANY_H1_H2.test(body))
|
|
171
|
+
break;
|
|
172
|
+
if (!inSection)
|
|
173
|
+
continue;
|
|
174
|
+
const m = TASK_ITEM.exec(body);
|
|
175
|
+
if (!m || m[2] === " ")
|
|
176
|
+
continue;
|
|
177
|
+
const d = marker.exec(m[3]);
|
|
178
|
+
if (!d)
|
|
179
|
+
continue;
|
|
180
|
+
lines[j] = `${m[1]}[ ]${d[1]}${eol}`;
|
|
181
|
+
count++;
|
|
182
|
+
}
|
|
183
|
+
return { content: lines.join(""), count };
|
|
184
|
+
}
|
|
185
|
+
/** Resolves `sliceKey` to its bound doc (same join as ratify/reratify), computes both edits, and
|
|
186
|
+
* writes only when every precondition holds (the state file is required and never created). */
|
|
187
|
+
export function runDefer(model, refs, baseDir, sliceKey, input) {
|
|
188
|
+
const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
|
|
189
|
+
if (sliceIndex === -1)
|
|
190
|
+
return { ok: false, message: `no slice with export key "${sliceKey}" in this model` };
|
|
191
|
+
const slice = model.slices[sliceIndex];
|
|
192
|
+
const { doc, continuationOf: continuationOfKey } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
193
|
+
if (continuationOfKey) {
|
|
194
|
+
const continuation = continuationOf(model, refs, sliceIndex);
|
|
195
|
+
const viewName = model.byId.get(continuation.viewLogicalId).name;
|
|
196
|
+
return {
|
|
197
|
+
ok: false,
|
|
198
|
+
message: `"${sliceKey}" is a continuation of "${continuationOfKey}" (view "${viewName}" again) — ` +
|
|
199
|
+
`it has no doc of its own; defer on "${continuationOfKey}" instead`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (doc.reason === "no-doc-bound") {
|
|
203
|
+
return {
|
|
204
|
+
ok: false,
|
|
205
|
+
message: `slice "${sliceKey}" has no doc bound via \`note "slices/${sliceKey}.md"\` — bind a slice doc before deferring a question on it`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (doc.reason === "binding-missing-file") {
|
|
209
|
+
return { ok: false, message: `slice "${sliceKey}" notes "${doc.path}" but no such file exists` };
|
|
210
|
+
}
|
|
211
|
+
if (doc.reason === "frontmatter-invalid" || doc.version === null) {
|
|
212
|
+
return {
|
|
213
|
+
ok: false,
|
|
214
|
+
message: `slice doc "${doc.path}" has missing or invalid frontmatter — run \`em validate\` for details`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const full = { ...input, currentVersion: doc.version };
|
|
218
|
+
const absDoc = join(baseDir, doc.path);
|
|
219
|
+
const result = applyDefer(readFileSync(absDoc, "utf8"), full);
|
|
220
|
+
if (!result.ok)
|
|
221
|
+
return { ok: false, message: `${doc.path}: ${result.message}` };
|
|
222
|
+
const statePath = join(baseDir, STATE_FILE_NAME);
|
|
223
|
+
if (!existsSync(statePath)) {
|
|
224
|
+
return { ok: false, message: `no ${STATE_FILE_NAME} beside the model — defer mirrors into it and never creates it` };
|
|
225
|
+
}
|
|
226
|
+
const until = parseUntil(input.until);
|
|
227
|
+
const stateResult = applyDeferStateFile(readFileSync(statePath, "utf8"), {
|
|
228
|
+
question: input.question,
|
|
229
|
+
sliceKey,
|
|
230
|
+
until,
|
|
231
|
+
decision: input.decision,
|
|
232
|
+
by: input.by,
|
|
233
|
+
on: input.on,
|
|
234
|
+
currentVersion: doc.version,
|
|
235
|
+
});
|
|
236
|
+
if (!stateResult.ok)
|
|
237
|
+
return stateResult;
|
|
238
|
+
if (result.changed)
|
|
239
|
+
writeFileSync(absDoc, result.content, "utf8");
|
|
240
|
+
if (stateResult.changed)
|
|
241
|
+
writeFileSync(statePath, stateResult.content, "utf8");
|
|
242
|
+
return { ok: true, path: doc.path, changed: result.changed || stateResult.changed };
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=defer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defer.js","sourceRoot":"","sources":["../../src/cli/defer.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,15 @@ export type ApplyFrontmatterResult = {
|
|
|
13
13
|
* `raw`'s frontmatter block. Idempotent (re-applying the same URL is a no-op, `changed: false`,
|
|
14
14
|
* `content` returned byte-identical to `raw`); refuses (`ok: false`) rather than overwrite
|
|
15
15
|
* provenance when the doc is already `status: implemented` with a *different* `implementedIn`.
|
|
16
|
+
*
|
|
17
|
+
* MIL-277 (GH #222): refuses any doc that isn't `ready-to-implement` or `implemented`. This
|
|
18
|
+
* command is the step AFTER ratification — the implement contract (§6) and the engagement skill
|
|
19
|
+
* both run it at merge without re-checking status, so without a gate here an agent pointed at a
|
|
20
|
+
* `draft` or `reviewed` slice would record it as shipped with no human sign-off. Same posture as
|
|
21
|
+
* `review.ts`/`ratify.ts` refusing out-of-order statuses; deliberately no escape flag, because
|
|
22
|
+
* `em slice ratify` IS the escape hatch (it has its own `--skip-review`). `implemented` stays
|
|
23
|
+
* legal so the idempotent re-run and the "status already implemented, `implementedIn` missing"
|
|
24
|
+
* repair (MIL-103 AC#5) keep working — neither skips a lifecycle step.
|
|
16
25
|
* No fs access — the caller reads/writes; see `runMarkImplemented` below.
|
|
17
26
|
*/
|
|
18
27
|
export declare function applyImplementedFrontmatter(raw: string, prUrl: string): ApplyFrontmatterResult;
|
|
@@ -33,11 +33,23 @@ import { join } from "node:path";
|
|
|
33
33
|
import { continuationOf } from "../model/continuation.js";
|
|
34
34
|
import { resolveSliceDocJoin } from "../catalog/docJoin.js";
|
|
35
35
|
import { fieldLineRegex, locateFrontmatterInner, normalizeFieldValue } from "./frontmatterSurgery.js";
|
|
36
|
+
/** The status a doc must hold for `mark-implemented` to flip it: ratified, not yet shipped. */
|
|
37
|
+
const RATIFIED_STATUS = "ready-to-implement";
|
|
38
|
+
const IMPLEMENTED_STATUS = "implemented";
|
|
36
39
|
/**
|
|
37
40
|
* Pure text transform: flips `status:` to `implemented` and sets `implementedIn:` to `prUrl` in
|
|
38
41
|
* `raw`'s frontmatter block. Idempotent (re-applying the same URL is a no-op, `changed: false`,
|
|
39
42
|
* `content` returned byte-identical to `raw`); refuses (`ok: false`) rather than overwrite
|
|
40
43
|
* provenance when the doc is already `status: implemented` with a *different* `implementedIn`.
|
|
44
|
+
*
|
|
45
|
+
* MIL-277 (GH #222): refuses any doc that isn't `ready-to-implement` or `implemented`. This
|
|
46
|
+
* command is the step AFTER ratification — the implement contract (§6) and the engagement skill
|
|
47
|
+
* both run it at merge without re-checking status, so without a gate here an agent pointed at a
|
|
48
|
+
* `draft` or `reviewed` slice would record it as shipped with no human sign-off. Same posture as
|
|
49
|
+
* `review.ts`/`ratify.ts` refusing out-of-order statuses; deliberately no escape flag, because
|
|
50
|
+
* `em slice ratify` IS the escape hatch (it has its own `--skip-review`). `implemented` stays
|
|
51
|
+
* legal so the idempotent re-run and the "status already implemented, `implementedIn` missing"
|
|
52
|
+
* repair (MIL-103 AC#5) keep working — neither skips a lifecycle step.
|
|
41
53
|
* No fs access — the caller reads/writes; see `runMarkImplemented` below.
|
|
42
54
|
*/
|
|
43
55
|
export function applyImplementedFrontmatter(raw, prUrl) {
|
|
@@ -60,7 +72,7 @@ export function applyImplementedFrontmatter(raw, prUrl) {
|
|
|
60
72
|
const implMatch = fieldLineRegex("implementedIn").exec(inner);
|
|
61
73
|
const currentStatus = normalizeFieldValue(statusMatch[2])?.toLowerCase() ?? null;
|
|
62
74
|
const currentImplementedIn = implMatch ? normalizeFieldValue(implMatch[2]) : null;
|
|
63
|
-
if (currentStatus ===
|
|
75
|
+
if (currentStatus === IMPLEMENTED_STATUS && currentImplementedIn !== null) {
|
|
64
76
|
if (currentImplementedIn === trimmedUrl) {
|
|
65
77
|
return { ok: true, content: raw, changed: false }; // idempotent no-op
|
|
66
78
|
}
|
|
@@ -70,6 +82,13 @@ export function applyImplementedFrontmatter(raw, prUrl) {
|
|
|
70
82
|
`requested: ${trimmedUrl}) — refusing to overwrite`,
|
|
71
83
|
};
|
|
72
84
|
}
|
|
85
|
+
if (currentStatus !== RATIFIED_STATUS && currentStatus !== IMPLEMENTED_STATUS) {
|
|
86
|
+
return {
|
|
87
|
+
ok: false,
|
|
88
|
+
message: `doc is \`status: ${currentStatus ?? "(empty)"}\` — mark-implemented applies only to a ` +
|
|
89
|
+
`ratified (\`${RATIFIED_STATUS}\`) doc: run \`em slice ratify <file> <key> --by <name>\` first`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
73
92
|
// Apply from the highest index first so an earlier edit's index stays valid — same convention
|
|
74
93
|
// the bridge's applyImplementedStatus uses. `implMatch` (if present) always sits at a higher
|
|
75
94
|
// or lower index than `statusMatch`; either way sorting by index descending keeps both safe to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markImplemented.js","sourceRoot":"","sources":["../../src/cli/markImplemented.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,+FAA+F;AAC/F,iGAAiG;AACjG,+FAA+F;AAC/F,gGAAgG;AAChG,+EAA+E;AAC/E,8FAA8F;AAC9F,oFAAoF;AACpF,EAAE;AACF,8FAA8F;AAC9F,iGAAiG;AACjG,6FAA6F;AAC7F,8FAA8F;AAC9F,gGAAgG;AAChG,+FAA+F;AAC/F,4FAA4F;AAC5F,4FAA4F;AAC5F,iGAAiG;AACjG,6FAA6F;AAC7F,8EAA8E;AAC9E,EAAE;AACF,uFAAuF;AACvF,4FAA4F;AAC5F,+FAA+F;AAC/F,oFAAoF;AACpF,EAAE;AACF,+FAA+F;AAC/F,kGAAkG;AAClG,gGAAgG;AAChG,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAMtG
|
|
1
|
+
{"version":3,"file":"markImplemented.js","sourceRoot":"","sources":["../../src/cli/markImplemented.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/reratify.d.ts
CHANGED
package/dist/cli/reratify.js
CHANGED
|
@@ -70,6 +70,7 @@ import { fieldLineRegex, fieldLineWithEolRegex, locateFrontmatterInner, normaliz
|
|
|
70
70
|
import { listAllFindingsFiles, unruledFindingsInScope } from "./findings.js";
|
|
71
71
|
import { MEANING_CONFIRMATION_KEYS, meaningConfirmationLine, meaningConfirmationRequiredMessage, } from "./ratify.js";
|
|
72
72
|
import { isPublicTouchingSlice } from "../catalog/apiFirst.js";
|
|
73
|
+
import { reopenDeferred } from "./defer.js";
|
|
73
74
|
/** The status a doc must already be in for `reratify` to apply — mirrors `RATIFIED_STATUS` in
|
|
74
75
|
* ratify.ts (the status this command flips TO), named separately since it's the precondition
|
|
75
76
|
* here, not the target. */
|
|
@@ -229,7 +230,9 @@ export function runReratify(model, refs, baseDir, sliceKey, confirmation = null)
|
|
|
229
230
|
// certified". MIL-258: only meaningful for a SHIPPED version; an unshipped one has no
|
|
230
231
|
// certification to lack, so that path carries no advisory at all.
|
|
231
232
|
const advisory = result.kind === "shipped" ? reratifyAdvisory(baseDir, sliceKey, doc.version, doc.conformedVersion) : null;
|
|
232
|
-
|
|
233
|
-
|
|
233
|
+
// MIL-275: questions deferred to the version this bump reaches come back as `- [ ]`.
|
|
234
|
+
const reopened = reopenDeferred(result.content, result.newVersion);
|
|
235
|
+
writeFileSync(absPath, reopened.content, "utf8");
|
|
236
|
+
return { ok: true, path: doc.path, newVersion: result.newVersion, kind: result.kind, advisory, reopened: reopened.count };
|
|
234
237
|
}
|
|
235
238
|
//# sourceMappingURL=reratify.js.map
|
package/dist/cli/reratify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reratify.js","sourceRoot":"","sources":["../../src/cli/reratify.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,2FAA2F;AAC3F,+FAA+F;AAC/F,qFAAqF;AACrF,+FAA+F;AAC/F,gGAAgG;AAChG,sFAAsF;AACtF,8CAA8C;AAC9C,EAAE;AACF,2BAA2B;AAC3B,+BAA+B;AAC/B,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,gGAAgG;AAChG,8FAA8F;AAC9F,qFAAqF;AACrF,0FAA0F;AAC1F,0FAA0F;AAC1F,gGAAgG;AAChG,kCAAkC;AAClC,EAAE;AACF,0GAA0G;AAC1G,8FAA8F;AAC9F,6FAA6F;AAC7F,6FAA6F;AAC7F,kGAAkG;AAClG,8FAA8F;AAC9F,gGAAgG;AAChG,iGAAiG;AACjG,8BAA8B;AAC9B,EAAE;AACF,+FAA+F;AAC/F,4FAA4F;AAC5F,gGAAgG;AAChG,6FAA6F;AAC7F,+FAA+F;AAC/F,6FAA6F;AAC7F,EAAE;AACF,kGAAkG;AAClG,kGAAkG;AAClG,mGAAmG;AACnG,kGAAkG;AAClG,cAAc;AACd,EAAE;AACF,8FAA8F;AAC9F,4FAA4F;AAC5F,8FAA8F;AAC9F,8FAA8F;AAC9F,gGAAgG;AAChG,gGAAgG;AAChG,EAAE;AACF,wFAAwF;AACxF,yFAAyF;AACzF,8FAA8F;AAC9F,gGAAgG;AAChG,gGAAgG;AAChG,8FAA8F;AAC9F,iGAAiG;AAEjG,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,gGAAgG;AAChG,mGAAmG;AAEnG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7H,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAEL,yBAAyB,EACzB,uBAAuB,EACvB,kCAAkC,GACnC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"reratify.js","sourceRoot":"","sources":["../../src/cli/reratify.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -76,6 +76,7 @@ import { isStubStatus, runStubAll, STUB_STATUSES } from "./cli/sliceStubAll.js";
|
|
|
76
76
|
import { listModelCommits } from "./cli/changelog-git.js";
|
|
77
77
|
import { buildChangelogDoc } from "./cli/changelogBuild.js";
|
|
78
78
|
import { runReratify } from "./cli/reratify.js";
|
|
79
|
+
import { runDefer } from "./cli/defer.js";
|
|
79
80
|
import { runSliceConform } from "./cli/sliceConform.js";
|
|
80
81
|
import { checkFindingsFile, buildCheckFindingsJson, lookupFindingsBesideReport, unruledFindingsInScope, FINDING_LOCI } from "./cli/findings.js";
|
|
81
82
|
import { STATE_FILE_NAME, PHASES, isPhase, loadStateFile, parseState, setPhase, setConformance, setModelVersion, setCertified, setEmVersion, setReview, isValidDateString, modelPathMismatch, } from "./cli/stateFile.js";
|
|
@@ -670,8 +671,9 @@ slice
|
|
|
670
671
|
.description("flip a slice doc's frontmatter to `status: implemented` / `implementedIn: <pr-url>` — the " +
|
|
671
672
|
"one edit an implementing agent makes to a ratified doc at merge (MIL-103, replaces the " +
|
|
672
673
|
"em-sdd-bridge `em-sdd-mark-implemented` script; see reference/implement.md §6). " +
|
|
673
|
-
"
|
|
674
|
-
"
|
|
674
|
+
"Applies only to a `ready-to-implement` doc (MIL-277: a `draft`/`reviewed` doc refuses — " +
|
|
675
|
+
"ratify first). Idempotent on the same URL; refuses to overwrite a different one; never " +
|
|
676
|
+
"touches `version:` or the doc body")
|
|
675
677
|
.argument("<file>", "input .em file")
|
|
676
678
|
.argument("<slice-key>", "slice export key (kebab-case)")
|
|
677
679
|
.argument("<pr-url>", "merged PR (or commit) URL")
|
|
@@ -855,8 +857,52 @@ slice
|
|
|
855
857
|
else {
|
|
856
858
|
console.log(`reratified: ${result.path} (version: ${result.newVersion}, status: ready-to-implement${confirmationSuffix(flags.confirmation)})`);
|
|
857
859
|
}
|
|
860
|
+
if (result.reopened > 0)
|
|
861
|
+
console.log(`re-opened ${result.reopened} deferred question(s)`);
|
|
858
862
|
warnModelVersionDrift(dirname(file), model, refs, source, `reratifying "${sliceKey}"`);
|
|
859
863
|
});
|
|
864
|
+
slice
|
|
865
|
+
.command("defer")
|
|
866
|
+
.description("record a question this version will not answer as deferred to a later version (MIL-275): " +
|
|
867
|
+
"rewrites the single unchecked `## Open Questions` item containing <question> as `- [x] <item> — " +
|
|
868
|
+
"v<current>: <decision>; deferred to v<n> (<date>[, <by>])` so `--slice-ready` passes without a " +
|
|
869
|
+
"guess, and mirrors it into `.event-modeling.md` (the parking lot and a dated Decisions-log " +
|
|
870
|
+
"bullet; the file must exist, it is never created). Idempotent; `em slice reratify` re-opens " +
|
|
871
|
+
"the item when it bumps to v<n>")
|
|
872
|
+
.argument("<file>", "input .em file")
|
|
873
|
+
.argument("<slice-key>", "slice export key (kebab-case)")
|
|
874
|
+
.argument("<question>", "text identifying the unchecked Open Question (case-sensitive substring)")
|
|
875
|
+
.requiredOption("--until <version>", "the version that must answer it, v<n> (greater than the doc's version)")
|
|
876
|
+
.requiredOption("--decision <text>", "what this version does instead")
|
|
877
|
+
.option("--by <name>", "who deferred it")
|
|
878
|
+
.option("--on <date>", "deferral date, YYYY-MM-DD (default: today, local date)")
|
|
879
|
+
.action((file, sliceKey, question, opts) => {
|
|
880
|
+
if (opts.on !== undefined && !isValidDateString(opts.on)) {
|
|
881
|
+
console.error(`em slice defer: invalid --on date "${opts.on}" — expected YYYY-MM-DD`);
|
|
882
|
+
process.exit(1);
|
|
883
|
+
}
|
|
884
|
+
const { model, refs, diagnostics } = compileFile(file);
|
|
885
|
+
printDiagnostics(diagnostics);
|
|
886
|
+
const scopedErrors = diagnostics.filter((d) => d.severity === "error" && d.refs?.some((r) => r === sliceKey || r.startsWith(`${sliceKey}/`)));
|
|
887
|
+
if (scopedErrors.length > 0) {
|
|
888
|
+
console.error(`em slice defer: slice "${sliceKey}" has errors — fix them first`);
|
|
889
|
+
process.exit(1);
|
|
890
|
+
}
|
|
891
|
+
const result = runDefer(model, refs, dirname(file), sliceKey, {
|
|
892
|
+
question,
|
|
893
|
+
until: opts.until,
|
|
894
|
+
decision: opts.decision,
|
|
895
|
+
by: opts.by,
|
|
896
|
+
on: opts.on ?? localIsoDate(),
|
|
897
|
+
});
|
|
898
|
+
if (!result.ok) {
|
|
899
|
+
console.error(`em slice defer: ${result.message}`);
|
|
900
|
+
process.exit(1);
|
|
901
|
+
}
|
|
902
|
+
console.log(result.changed
|
|
903
|
+
? `deferred: ${result.path} (${question} → ${opts.until})`
|
|
904
|
+
: `already deferred (no-op): ${result.path}`);
|
|
905
|
+
});
|
|
860
906
|
slice
|
|
861
907
|
.command("conform")
|
|
862
908
|
.description("record per-slice-per-version conformance certification: sets `conformedVersion:`/" +
|