@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.
- package/.claude/skills/event-modeling/SKILL.md +1 -1
- package/.claude/skills/event-modeling-conform/SKILL.md +3 -2
- package/.claude/skills/event-modeling-conform/reference/conform.md +7 -0
- package/.claude/skills/event-modeling-design/SKILL.md +46 -5
- package/.claude/skills/event-modeling-discover/SKILL.md +43 -8
- package/.claude/skills/event-modeling-discover/reference/extract.md +6 -1
- package/.claude/skills/event-modeling-discover/reference/prd-rubric.md +102 -0
- package/.claude/skills/event-modeling-discover/reference/prd-spec-path.md +171 -0
- package/.claude/skills/event-modeling-engagement/SKILL.md +28 -6
- package/.claude/skills/event-modeling-engagement/reference/engagement.md +5 -4
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +18 -8
- package/.claude/skills/event-modeling-review/SKILL.md +1 -1
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +107 -10
- package/.claude/skills/event-modeling-shared/reference/methodology.md +268 -0
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +122 -15
- package/.claude/skills/event-modeling-shared/templates/slice.md +11 -3
- package/.claude-plugin/marketplace.json +2 -2
- package/dist/catalog/docJoin.d.ts +13 -5
- package/dist/catalog/docJoin.js +6 -1
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.js +160 -0
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/invariantsValidate.d.ts +2 -0
- package/dist/catalog/invariantsValidate.js +67 -1
- package/dist/catalog/invariantsValidate.js.map +1 -1
- package/dist/catalog/scenarioQualityValidate.d.ts +4 -0
- package/dist/catalog/scenarioQualityValidate.js +148 -0
- package/dist/catalog/scenarioQualityValidate.js.map +1 -0
- package/dist/catalog/scenarios.d.ts +5 -0
- package/dist/catalog/scenarios.js +80 -0
- package/dist/catalog/scenarios.js.map +1 -1
- package/dist/catalog/signedBodyValidate.d.ts +7 -0
- package/dist/catalog/signedBodyValidate.js +29 -0
- package/dist/catalog/signedBodyValidate.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +53 -7
- package/dist/catalog/sliceDoc.js +89 -10
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +23 -2
- package/dist/catalog/sliceReadyValidate.js +54 -22
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/catalog/sliceSections.d.ts +3 -2
- package/dist/catalog/sliceSections.js +99 -9
- package/dist/catalog/sliceSections.js.map +1 -1
- package/dist/cli/ciInit.d.ts +4 -11
- package/dist/cli/ciInit.js +24 -6
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/coverage.d.ts +9 -0
- package/dist/cli/coverage.js +18 -0
- package/dist/cli/coverage.js.map +1 -1
- package/dist/cli/defer.d.ts +60 -17
- package/dist/cli/defer.js +187 -86
- package/dist/cli/defer.js.map +1 -1
- package/dist/cli/engagement.d.ts +46 -0
- package/dist/cli/engagement.js +156 -1
- package/dist/cli/engagement.js.map +1 -1
- package/dist/cli/engagementFoundation.d.ts +47 -0
- package/dist/cli/engagementFoundation.js +164 -0
- package/dist/cli/engagementFoundation.js.map +1 -0
- package/dist/cli/frontmatterSurgery.d.ts +5 -0
- package/dist/cli/frontmatterSurgery.js +15 -0
- package/dist/cli/frontmatterSurgery.js.map +1 -1
- package/dist/cli/ledgerCheck.d.ts +5 -1
- package/dist/cli/ledgerCheck.js +50 -20
- package/dist/cli/ledgerCheck.js.map +1 -1
- package/dist/cli/markImplemented.d.ts +14 -10
- package/dist/cli/markImplemented.js +49 -1
- package/dist/cli/markImplemented.js.map +1 -1
- package/dist/cli/prdTriage.d.ts +109 -0
- package/dist/cli/prdTriage.js +378 -0
- package/dist/cli/prdTriage.js.map +1 -0
- package/dist/cli/ratify.d.ts +14 -2
- package/dist/cli/ratify.js +34 -6
- package/dist/cli/ratify.js.map +1 -1
- package/dist/cli/refsCheck.d.ts +78 -0
- package/dist/cli/refsCheck.js +153 -0
- package/dist/cli/refsCheck.js.map +1 -0
- package/dist/cli/render-inputs.d.ts +2 -0
- package/dist/cli/render-inputs.js +4 -0
- package/dist/cli/render-inputs.js.map +1 -1
- package/dist/cli/revise.d.ts +12 -3
- package/dist/cli/revise.js +43 -10
- package/dist/cli/revise.js.map +1 -1
- package/dist/cli/shape.d.ts +27 -0
- package/dist/cli/shape.js +77 -0
- package/dist/cli/shape.js.map +1 -0
- package/dist/cli/sliceConform.js +9 -0
- package/dist/cli/sliceConform.js.map +1 -1
- package/dist/cli/sliceIndex.d.ts +6 -1
- package/dist/cli/sliceIndex.js +28 -13
- package/dist/cli/sliceIndex.js.map +1 -1
- package/dist/cli/sliceNew.d.ts +4 -1
- package/dist/cli/sliceNew.js +26 -9
- package/dist/cli/sliceNew.js.map +1 -1
- package/dist/cli/status.d.ts +26 -5
- package/dist/cli/status.js +28 -6
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/storylineSuggest.d.ts +26 -0
- package/dist/cli/storylineSuggest.js +252 -0
- package/dist/cli/storylineSuggest.js.map +1 -0
- package/dist/cli/upgrade.d.ts +15 -3
- package/dist/cli/upgrade.js +537 -8
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli/upgradeReshape.d.ts +60 -0
- package/dist/cli/upgradeReshape.js +425 -0
- package/dist/cli/upgradeReshape.js.map +1 -0
- package/dist/cli.js +430 -57
- package/dist/cli.js.map +1 -1
- package/dist/emit/dot.d.ts +2 -0
- package/dist/emit/dot.js +44 -8
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/engagementJson.d.ts +4 -1
- package/dist/emit/engagementJson.js +27 -1
- package/dist/emit/engagementJson.js.map +1 -1
- package/dist/emit/json.d.ts +21 -1
- package/dist/emit/json.js +29 -2
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/ledgerJson.d.ts +1 -1
- package/dist/emit/ledgerJson.js +6 -1
- package/dist/emit/ledgerJson.js.map +1 -1
- package/dist/emit/queryJson.d.ts +1 -1
- package/dist/emit/queryJson.js +3 -1
- package/dist/emit/queryJson.js.map +1 -1
- package/dist/emit/refsJson.d.ts +4 -0
- package/dist/emit/refsJson.js +19 -0
- package/dist/emit/refsJson.js.map +1 -0
- package/dist/emit/statusJson.d.ts +1 -1
- package/dist/emit/statusJson.js +6 -1
- package/dist/emit/statusJson.js.map +1 -1
- package/dist/emit/theme.d.ts +1 -0
- package/dist/emit/theme.js +13 -0
- package/dist/emit/theme.js.map +1 -1
- package/dist/emit/validateJson.d.ts +5 -2
- package/dist/emit/validateJson.js +41 -2
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/layout/grid.d.ts +5 -1
- package/dist/layout/grid.js +93 -2
- package/dist/layout/grid.js.map +1 -1
- package/dist/mcp/server.js +79 -14
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/edges.d.ts +7 -0
- package/dist/model/edges.js +33 -16
- package/dist/model/edges.js.map +1 -1
- package/dist/model/model.d.ts +33 -0
- package/dist/model/model.js +87 -3
- package/dist/model/model.js.map +1 -1
- package/dist/model/queryIndex.js +2 -2
- package/dist/model/queryIndex.js.map +1 -1
- package/dist/model/refs.js +8 -5
- package/dist/model/refs.js.map +1 -1
- package/dist/model/rules.d.ts +167 -1
- package/dist/model/rules.js +164 -3
- package/dist/model/rules.js.map +1 -1
- package/dist/model/shapeLint.d.ts +12 -0
- package/dist/model/shapeLint.js +170 -0
- package/dist/model/shapeLint.js.map +1 -0
- package/dist/model/storylines.d.ts +51 -0
- package/dist/model/storylines.js +188 -0
- package/dist/model/storylines.js.map +1 -0
- package/dist/model/validate.d.ts +6 -1
- package/dist/model/validate.js +317 -14
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/againSugar.d.ts +30 -0
- package/dist/parser/againSugar.js +105 -0
- package/dist/parser/againSugar.js.map +1 -0
- package/dist/parser/ast.d.ts +33 -0
- package/dist/parser/lexer.d.ts +9 -1
- package/dist/parser/lexer.js +17 -2
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.js +284 -4
- package/dist/parser/parser.js.map +1 -1
- package/dist/query/format.js +1 -0
- package/dist/query/format.js.map +1 -1
- package/dist/query/verbs.d.ts +4 -0
- package/dist/query/verbs.js +30 -3
- package/dist/query/verbs.js.map +1 -1
- package/dist/render/drawEdges.js +100 -4
- package/dist/render/drawEdges.js.map +1 -1
- package/dist/render/render.js +20 -2
- package/dist/render/render.js.map +1 -1
- package/dist/render/sliceDiagram.js +5 -5
- package/dist/render/sliceDiagram.js.map +1 -1
- package/dist/render/storylineBands.d.ts +11 -0
- package/dist/render/storylineBands.js +80 -0
- package/dist/render/storylineBands.js.map +1 -0
- package/dist/render/storylineDiagram.d.ts +14 -0
- package/dist/render/storylineDiagram.js +142 -0
- package/dist/render/storylineDiagram.js.map +1 -0
- package/dist/roster/check.d.ts +32 -0
- package/dist/roster/check.js +92 -0
- package/dist/roster/check.js.map +1 -0
- package/dist/roster/context.d.ts +3 -0
- package/dist/roster/context.js +23 -0
- package/dist/roster/context.js.map +1 -0
- package/dist/roster/init.d.ts +15 -0
- package/dist/roster/init.js +52 -0
- package/dist/roster/init.js.map +1 -0
- package/dist/roster/roster.d.ts +79 -0
- package/dist/roster/roster.js +298 -0
- package/dist/roster/roster.js.map +1 -0
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/shared/reference/em-dsl.md +107 -10
- package/plugin/shared/reference/methodology.md +268 -0
- package/plugin/shared/reference/slice-doc-schema.md +122 -15
- package/plugin/shared/templates/slice.md +11 -3
- package/plugin/skills/conform/SKILL.md +3 -2
- package/plugin/skills/conform/reference/conform.md +7 -0
- package/plugin/skills/design/SKILL.md +46 -5
- package/plugin/skills/discover/SKILL.md +43 -8
- package/plugin/skills/discover/reference/extract.md +6 -1
- package/plugin/skills/discover/reference/prd-rubric.md +103 -0
- package/plugin/skills/discover/reference/prd-spec-path.md +172 -0
- package/plugin/skills/engagement/SKILL.md +28 -6
- package/plugin/skills/engagement/reference/engagement.md +5 -4
- package/plugin/skills/event-modeling/SKILL.md +1 -1
- package/plugin/skills/implement/SKILL.md +1 -1
- package/plugin/skills/implement/reference/implement.md +18 -8
- package/plugin/skills/review/SKILL.md +1 -1
|
@@ -94,4 +94,84 @@ export function parseScenarios(body) {
|
|
|
94
94
|
}
|
|
95
95
|
return { scenarios, problems };
|
|
96
96
|
}
|
|
97
|
+
const ANY_SCENARIO_HEADING_RE = /^#{3,6}\s+Scenario:\s*(.*?)\s*$/;
|
|
98
|
+
const TITLE_BULLET_RE = /^[-*]\s+\*\*([^*]+?)\*\*\s*$/;
|
|
99
|
+
const ANY_LABEL_RE = /^(\s*)[-*]\s+\*\*(Given|When|Then):\*\*\s*(.*?)\s*$/;
|
|
100
|
+
const ANY_BULLET_RE = /^(\s*)[-*]\s+(.*?)\s*$/;
|
|
101
|
+
export function parseScenariosLenient(text) {
|
|
102
|
+
const lines = text.split(/\r?\n/);
|
|
103
|
+
const out = [];
|
|
104
|
+
let section = null;
|
|
105
|
+
let cur = null;
|
|
106
|
+
let beat = null;
|
|
107
|
+
let labelIndent = 0;
|
|
108
|
+
let lastItem = null;
|
|
109
|
+
const flush = () => {
|
|
110
|
+
if (cur && (cur.beats.given.length || cur.beats.when.length || cur.beats.then.length)) {
|
|
111
|
+
out.push({ title: cur.title, line: cur.line, given: cur.beats.given, when: cur.beats.when, then: cur.beats.then });
|
|
112
|
+
}
|
|
113
|
+
cur = null;
|
|
114
|
+
beat = null;
|
|
115
|
+
lastItem = null;
|
|
116
|
+
};
|
|
117
|
+
const start = (title, line) => {
|
|
118
|
+
flush();
|
|
119
|
+
cur = { title, line, beats: { given: [], when: [], then: [] } };
|
|
120
|
+
};
|
|
121
|
+
const push = (b, t) => {
|
|
122
|
+
if (!cur || t === "")
|
|
123
|
+
return;
|
|
124
|
+
cur.beats[b].push(t);
|
|
125
|
+
lastItem = { arr: cur.beats[b], idx: cur.beats[b].length - 1 };
|
|
126
|
+
};
|
|
127
|
+
lines.forEach((line, i) => {
|
|
128
|
+
if (/^#{1,2}\s/.test(line)) {
|
|
129
|
+
flush();
|
|
130
|
+
section = /^##\s+Scenarios\b/.test(line) ? "scenarios" : /^##\s+Delta\b/.test(line) ? "delta" : null;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!section)
|
|
134
|
+
return;
|
|
135
|
+
const heading = ANY_SCENARIO_HEADING_RE.exec(line);
|
|
136
|
+
if (heading) {
|
|
137
|
+
start(heading[1], i + 1);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (/^#{3,6}\s/.test(line)) {
|
|
141
|
+
flush();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const label = ANY_LABEL_RE.exec(line);
|
|
145
|
+
if (label && cur) {
|
|
146
|
+
beat = label[2].toLowerCase();
|
|
147
|
+
labelIndent = label[1].length;
|
|
148
|
+
push(beat, label[3]);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (section === "scenarios" && !/^\s/.test(line)) {
|
|
152
|
+
const t = TITLE_BULLET_RE.exec(line);
|
|
153
|
+
if (t) {
|
|
154
|
+
start(t[1], i + 1);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (!cur)
|
|
159
|
+
return;
|
|
160
|
+
const bullet = ANY_BULLET_RE.exec(line);
|
|
161
|
+
if (bullet && beat && bullet[1].length > labelIndent) {
|
|
162
|
+
push(beat, bullet[2]);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (line.trim() === "")
|
|
166
|
+
return;
|
|
167
|
+
if (/^\s/.test(line) && lastItem && !bullet) {
|
|
168
|
+
lastItem.arr[lastItem.idx] += ` ${line.trim()}`; // wrapped continuation of the previous item
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (!/^\s/.test(line))
|
|
172
|
+
beat = null; // any other column-0 line ends the current beat
|
|
173
|
+
});
|
|
174
|
+
flush();
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
97
177
|
//# sourceMappingURL=scenarios.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../src/catalog/scenarios.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../src/catalog/scenarios.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NormalizedModel } from "../model/model.js";
|
|
2
|
+
import { RefsResult } from "../model/refs.js";
|
|
3
|
+
import { Diagnostic } from "../model/validate.js";
|
|
4
|
+
/** One `slice-body-changed-since-ratification` error per doc whose body no longer matches its
|
|
5
|
+
* recorded `ratifiedHash` (in either scope). `baseDir` is the `.em` file's directory. Docs with
|
|
6
|
+
* no hash are not reported — `--slice-ready --require-ratified-hash` (GH #256) is that check. */
|
|
7
|
+
export declare function validateSignedBodies(model: NormalizedModel, refs: RefsResult, baseDir: string): Diagnostic[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { pushDiag } from "../model/rules.js";
|
|
2
|
+
import { readSliceDoc } from "./readSliceDoc.js";
|
|
3
|
+
import { hasUsableFrontmatter, ratifiedHashScope } from "./sliceDoc.js";
|
|
4
|
+
/** One `slice-body-changed-since-ratification` error per doc whose body no longer matches its
|
|
5
|
+
* recorded `ratifiedHash` (in either scope). `baseDir` is the `.em` file's directory. Docs with
|
|
6
|
+
* no hash are not reported — `--slice-ready --require-ratified-hash` (GH #256) is that check. */
|
|
7
|
+
export function validateSignedBodies(model, refs, baseDir) {
|
|
8
|
+
const diags = [];
|
|
9
|
+
const seen = new Set();
|
|
10
|
+
model.slices.forEach((slice, i) => {
|
|
11
|
+
const sliceKey = refs.sliceKeys[i];
|
|
12
|
+
const doc = readSliceDoc(baseDir, sliceKey);
|
|
13
|
+
if (!doc || !hasUsableFrontmatter(doc) || doc.ratifiedHash === null)
|
|
14
|
+
return;
|
|
15
|
+
if (seen.has(sliceKey))
|
|
16
|
+
return;
|
|
17
|
+
seen.add(sliceKey);
|
|
18
|
+
if (ratifiedHashScope(doc.raw, doc.ratifiedHash) !== "mismatch")
|
|
19
|
+
return;
|
|
20
|
+
pushDiag(diags, "slice-body-changed-since-ratification", {
|
|
21
|
+
message: `slice "${sliceKey}"'s doc slices/${sliceKey}.md (status: ${doc.status ?? "(none)"}, v${doc.version ?? "?"}) was edited after ratification — ` +
|
|
22
|
+
"body no longer matches ratifiedHash; revert the edit, or open the next version (`em slice revise`) and re-ratify",
|
|
23
|
+
line: slice.line,
|
|
24
|
+
refs: [sliceKey],
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
return diags;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=signedBodyValidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signedBodyValidate.js","sourceRoot":"","sources":["../../src/catalog/signedBodyValidate.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAExE;;kGAEkG;AAClG,MAAM,UAAU,oBAAoB,CAAC,KAAsB,EAAE,IAAgB,EAAE,OAAe;IAC5F,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO;QAC5E,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC/B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,UAAU;YAAE,OAAO;QACxE,QAAQ,CAAC,KAAK,EAAE,uCAAuC,EAAE;YACvD,OAAO,EACL,UAAU,QAAQ,kBAAkB,QAAQ,gBAAgB,GAAG,CAAC,MAAM,IAAI,QAAQ,MAAM,GAAG,CAAC,OAAO,IAAI,GAAG,oCAAoC;gBAC9I,kHAAkH;YACpH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -121,6 +121,11 @@ export interface SliceDoc {
|
|
|
121
121
|
* contract differently (`--contract-change "<why>"`), surrounding quotes stripped; null when
|
|
122
122
|
* absent. Written only by `em slice ratify`/`reratify`. */
|
|
123
123
|
contractChange: string | null;
|
|
124
|
+
/** GH #260: `reviewSkipped:` — the status `em slice ratify --skip-review` ratified from
|
|
125
|
+
* (`draft`, `reviewed`-less states…) when the bypass is what let the ratification through;
|
|
126
|
+
* null when the ratification passed the review gate, or the doc predates 1.17. Written only
|
|
127
|
+
* by `em slice ratify`, cleared by `em slice revise` with the rest of the sign-off. */
|
|
128
|
+
reviewSkipped: string | null;
|
|
124
129
|
/** True when a well-formed leading `---`/`---` frontmatter fence was found and
|
|
125
130
|
* closed — independent of which keys it contained. False for a legacy
|
|
126
131
|
* status-bullet-only doc, a doc with no frontmatter at all, or an
|
|
@@ -198,12 +203,53 @@ export interface ShippedRecord {
|
|
|
198
203
|
* state) included; `driftSignal` reads that as `unpropagated-delta`, as it always did.
|
|
199
204
|
*/
|
|
200
205
|
export declare function shippedRecordOf(doc: Pick<SliceDoc, "status" | "version" | "implementedIn" | "ratifiedRef" | "shippedVersion" | "shippedRef" | "shippedOn">): ShippedRecord | null;
|
|
201
|
-
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
206
|
+
/**
|
|
207
|
+
* GH #253: the text `ratifiedHash` is computed over — the body minus what describes a LATER
|
|
208
|
+
* version. Inside the `## Open Questions` section (heading to the next `#`/`##` heading or EOF)
|
|
209
|
+
* the heading line itself, blank lines, and every `deferred to v<n>` item are dropped; everything
|
|
210
|
+
* else — every other section, the section's answered `- [x]` history, any `- [ ]` — is kept, in
|
|
211
|
+
* order. Trailing whitespace is trimmed last, so appending a deferred item (and, on a doc with no
|
|
212
|
+
* section, the heading before it) never moves the hash. The blank lines go because `appendBullet`
|
|
213
|
+
* (cli/defer.ts) inserts one after a bare heading; keeping them would make an empty section and
|
|
214
|
+
* a one-item section hash differently.
|
|
215
|
+
*/
|
|
216
|
+
export declare function ratifiedBody(body: string): string;
|
|
217
|
+
/** GH #261: how a `conformedAt:` value (or an `em slice conform --at` argument) is read. A bare
|
|
218
|
+
* value is a TARGET-repo git revision, as it always was. A `<kind>:<id>` value — `build:1234`,
|
|
219
|
+
* `deploy:eu-1-2026-10-15`, `env:pr-57` — names the thing the sweep actually exercised when that
|
|
220
|
+
* is not a commit reachable from the target branch (a per-PR environment whose branch HEAD a
|
|
221
|
+
* squash or rebase merge will orphan, a build or image id). `kind` is lowercase
|
|
222
|
+
* `[a-z][a-z0-9-]*`; git refnames cannot contain `:` and SHAs are hex, so the form is
|
|
223
|
+
* unambiguous. Readers that resolve revisions (GH #258's reachability check) act on
|
|
224
|
+
* `kind === "git"` only. */
|
|
225
|
+
export interface ConformedAtRef {
|
|
226
|
+
/** `"git"` for a bare revision, else the declared kind. */
|
|
227
|
+
kind: string;
|
|
228
|
+
/** The revision, or the opaque identifier after the kind's `:`. */
|
|
229
|
+
id: string;
|
|
230
|
+
}
|
|
231
|
+
export declare function parseConformedAt(value: string): ConformedAtRef;
|
|
232
|
+
/** MIL-284 / GH #253: the identity `em slice ratify` records as `ratifiedHash:` and
|
|
233
|
+
* `--slice-ready` checks against: `sha256:<hex>` over `ratifiedBody()` of the doc BODY —
|
|
234
|
+
* everything after the closing frontmatter fence (or the whole doc when there is none), EOLs
|
|
235
|
+
* normalised to `\n` by `splitFrontmatter`'s split/join. Frontmatter is excluded on purpose: the
|
|
236
|
+
* ratify edit itself, `mark-implemented` and `conform` touch only frontmatter, without changing
|
|
237
|
+
* what was ratified. Since 1.17.0 the `## Open Questions` heading and its `deferred to v<n>`
|
|
238
|
+
* items are excluded too, so `em slice defer` can record a question on a ratified or shipped doc
|
|
239
|
+
* (GH #253, superseding GH #236's state-file queue). */
|
|
208
240
|
export declare function sliceDocBodyHash(markdown: string): string;
|
|
241
|
+
/** The pre-1.17.0 scope: the whole body (GH #236 kept `## Open Questions` inside it). Readers
|
|
242
|
+
* still accept a hash in this scope — `ratifiedHashScope()` — and `em upgrade`'s
|
|
243
|
+
* `ratified-hash-scope` step (or `em slice defer`, on first touch) re-stamps it. */
|
|
244
|
+
export declare function sliceDocLegacyBodyHash(markdown: string): string;
|
|
245
|
+
/** How a recorded `ratifiedHash:` relates to the doc as it stands: `current` (matches the 1.17
|
|
246
|
+
* scope), `legacy` (matches only the pre-1.17 whole-body scope — the body is intact, the stamp
|
|
247
|
+
* is old), or `mismatch` (the body moved after sign-off). Every reader that judges "was the
|
|
248
|
+
* body edited after ratification" goes through this, never through `===` on one hash. */
|
|
249
|
+
export declare function ratifiedHashScope(markdown: string, recorded: string): "current" | "legacy" | "mismatch";
|
|
250
|
+
/** GH #253: how many `## Open Questions` items are deferred to a version later than `version` —
|
|
251
|
+
* the known work waiting on a later version that `em status` / `em export` report as
|
|
252
|
+
* `queuedForNext` (the name predates #253: GH #236's state-file queue reported the same fact
|
|
253
|
+
* for the one release when a ratified doc could not carry it). 0 when `version` is null. */
|
|
254
|
+
export declare function countDeferredBeyond(body: string, version: number | null): number;
|
|
209
255
|
export declare function parseSliceDoc(markdown: string): SliceDoc;
|
package/dist/catalog/sliceDoc.js
CHANGED
|
@@ -70,7 +70,8 @@
|
|
|
70
70
|
// `ratifiedRef`/`ratifiedHash` and `shippedVersion`/`shippedRef`/`shippedOn` (MIL-284, the
|
|
71
71
|
// additive half of MIL-283 "ratification has an address") give the two lifecycle facts an exact
|
|
72
72
|
// identity. `ratifiedRef` is the commit whose tree holds the ratified body and `ratifiedHash` the
|
|
73
|
-
// `sha256:` of that body
|
|
73
|
+
// `sha256:` of that body minus what describes a later version (`sliceDocBodyHash` over
|
|
74
|
+
// `ratifiedBody`, below — GH #253) — written only by `em slice ratify`, which
|
|
74
75
|
// refuses a doc with uncommitted changes so the ref really does hold what was signed. The
|
|
75
76
|
// `shipped*` trio is written only by `em slice mark-implemented` beside `implementedIn`: the
|
|
76
77
|
// version that shipped, the ref it was ratified at, the local date. Flat keys, not a nested
|
|
@@ -224,16 +225,93 @@ export function shippedRecordOf(doc) {
|
|
|
224
225
|
}
|
|
225
226
|
return null;
|
|
226
227
|
}
|
|
227
|
-
/**
|
|
228
|
-
*
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
228
|
+
/** A checked `## Open Questions` item carrying `em slice defer`'s marker (cli/defer.ts writes
|
|
229
|
+
* exactly this shape): `- [x] <q> — v<N>: <decision>; deferred to v<n> (<date>[, <by>])`. */
|
|
230
|
+
const DEFERRED_ITEM = /^[ \t]*[-*]\s*\[[xX]\]\s.* — v\d+: .*; deferred to v(\d+) \(.*\)\s*$/;
|
|
231
|
+
/**
|
|
232
|
+
* GH #253: the text `ratifiedHash` is computed over — the body minus what describes a LATER
|
|
233
|
+
* version. Inside the `## Open Questions` section (heading to the next `#`/`##` heading or EOF)
|
|
234
|
+
* the heading line itself, blank lines, and every `deferred to v<n>` item are dropped; everything
|
|
235
|
+
* else — every other section, the section's answered `- [x]` history, any `- [ ]` — is kept, in
|
|
236
|
+
* order. Trailing whitespace is trimmed last, so appending a deferred item (and, on a doc with no
|
|
237
|
+
* section, the heading before it) never moves the hash. The blank lines go because `appendBullet`
|
|
238
|
+
* (cli/defer.ts) inserts one after a bare heading; keeping them would make an empty section and
|
|
239
|
+
* a one-item section hash differently.
|
|
240
|
+
*/
|
|
241
|
+
export function ratifiedBody(body) {
|
|
242
|
+
const lines = body.split("\n");
|
|
243
|
+
const start = lines.findIndex((l) => OPEN_QUESTIONS_HEADING.test(l));
|
|
244
|
+
if (start === -1)
|
|
245
|
+
return body.trimEnd();
|
|
246
|
+
const out = lines.slice(0, start);
|
|
247
|
+
let i = start + 1;
|
|
248
|
+
for (; i < lines.length; i++) {
|
|
249
|
+
const line = lines[i];
|
|
250
|
+
if (/^#{1,2}\s/.test(line))
|
|
251
|
+
break;
|
|
252
|
+
if (line.trim() === "" || DEFERRED_ITEM.test(line))
|
|
253
|
+
continue;
|
|
254
|
+
out.push(line);
|
|
255
|
+
}
|
|
256
|
+
out.push(...lines.slice(i));
|
|
257
|
+
return out.join("\n").trimEnd();
|
|
258
|
+
}
|
|
259
|
+
function sha256(text) {
|
|
260
|
+
return `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`;
|
|
261
|
+
}
|
|
262
|
+
const CONFORMED_AT_KIND = /^([a-z][a-z0-9-]*):(.+)$/;
|
|
263
|
+
export function parseConformedAt(value) {
|
|
264
|
+
const m = CONFORMED_AT_KIND.exec(value);
|
|
265
|
+
return m ? { kind: m[1], id: m[2] } : { kind: "git", id: value };
|
|
266
|
+
}
|
|
267
|
+
/** MIL-284 / GH #253: the identity `em slice ratify` records as `ratifiedHash:` and
|
|
268
|
+
* `--slice-ready` checks against: `sha256:<hex>` over `ratifiedBody()` of the doc BODY —
|
|
269
|
+
* everything after the closing frontmatter fence (or the whole doc when there is none), EOLs
|
|
270
|
+
* normalised to `\n` by `splitFrontmatter`'s split/join. Frontmatter is excluded on purpose: the
|
|
271
|
+
* ratify edit itself, `mark-implemented` and `conform` touch only frontmatter, without changing
|
|
272
|
+
* what was ratified. Since 1.17.0 the `## Open Questions` heading and its `deferred to v<n>`
|
|
273
|
+
* items are excluded too, so `em slice defer` can record a question on a ratified or shipped doc
|
|
274
|
+
* (GH #253, superseding GH #236's state-file queue). */
|
|
234
275
|
export function sliceDocBodyHash(markdown) {
|
|
235
|
-
|
|
236
|
-
|
|
276
|
+
return sha256(ratifiedBody(splitFrontmatter(markdown).body));
|
|
277
|
+
}
|
|
278
|
+
/** The pre-1.17.0 scope: the whole body (GH #236 kept `## Open Questions` inside it). Readers
|
|
279
|
+
* still accept a hash in this scope — `ratifiedHashScope()` — and `em upgrade`'s
|
|
280
|
+
* `ratified-hash-scope` step (or `em slice defer`, on first touch) re-stamps it. */
|
|
281
|
+
export function sliceDocLegacyBodyHash(markdown) {
|
|
282
|
+
return sha256(splitFrontmatter(markdown).body);
|
|
283
|
+
}
|
|
284
|
+
/** How a recorded `ratifiedHash:` relates to the doc as it stands: `current` (matches the 1.17
|
|
285
|
+
* scope), `legacy` (matches only the pre-1.17 whole-body scope — the body is intact, the stamp
|
|
286
|
+
* is old), or `mismatch` (the body moved after sign-off). Every reader that judges "was the
|
|
287
|
+
* body edited after ratification" goes through this, never through `===` on one hash. */
|
|
288
|
+
export function ratifiedHashScope(markdown, recorded) {
|
|
289
|
+
if (recorded === sliceDocBodyHash(markdown))
|
|
290
|
+
return "current";
|
|
291
|
+
if (recorded === sliceDocLegacyBodyHash(markdown))
|
|
292
|
+
return "legacy";
|
|
293
|
+
return "mismatch";
|
|
294
|
+
}
|
|
295
|
+
/** GH #253: how many `## Open Questions` items are deferred to a version later than `version` —
|
|
296
|
+
* the known work waiting on a later version that `em status` / `em export` report as
|
|
297
|
+
* `queuedForNext` (the name predates #253: GH #236's state-file queue reported the same fact
|
|
298
|
+
* for the one release when a ratified doc could not carry it). 0 when `version` is null. */
|
|
299
|
+
export function countDeferredBeyond(body, version) {
|
|
300
|
+
if (version === null)
|
|
301
|
+
return 0;
|
|
302
|
+
const lines = body.split("\n");
|
|
303
|
+
const start = lines.findIndex((l) => OPEN_QUESTIONS_HEADING.test(l));
|
|
304
|
+
if (start === -1)
|
|
305
|
+
return 0;
|
|
306
|
+
let count = 0;
|
|
307
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
308
|
+
if (/^#{1,2}\s/.test(lines[i]))
|
|
309
|
+
break;
|
|
310
|
+
const m = DEFERRED_ITEM.exec(lines[i]);
|
|
311
|
+
if (m && Number(m[1]) > version)
|
|
312
|
+
count++;
|
|
313
|
+
}
|
|
314
|
+
return count;
|
|
237
315
|
}
|
|
238
316
|
export function parseSliceDoc(markdown) {
|
|
239
317
|
const { fields, body, frontmatterPresent } = splitFrontmatter(markdown);
|
|
@@ -273,6 +351,7 @@ export function parseSliceDoc(markdown) {
|
|
|
273
351
|
conformedOn: fields.get("conformedon") ?? null,
|
|
274
352
|
meaningConfirmed: fields.get("meaningconfirmed")?.toLowerCase() === "true",
|
|
275
353
|
contractChange: fields.get("contractchange") ?? null,
|
|
354
|
+
reviewSkipped: fields.get("reviewskipped") ?? null,
|
|
276
355
|
frontmatterPresent,
|
|
277
356
|
missingRequiredFields: REQUIRED_FRONTMATTER_KEYS.filter((k) => !fields.has(k)),
|
|
278
357
|
html: marked.parse(body, { async: false }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliceDoc.js","sourceRoot":"","sources":["../../src/catalog/sliceDoc.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,yDAAyD;AACzD,2EAA2E;AAC3E,2EAA2E;AAC3E,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,iEAAiE;AACjE,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,yEAAyE;AACzE,EAAE;AACF,oEAAoE;AACpE,wEAAwE;AACxE,kFAAkF;AAClF,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,4FAA4F;AAC5F,qFAAqF;AACrF,8EAA8E;AAC9E,sFAAsF;AACtF,6CAA6C;AAC7C,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,8FAA8F;AAC9F,iGAAiG;AACjG,qFAAqF;AACrF,EAAE;AACF,6FAA6F;AAC7F,+FAA+F;AAC/F,kGAAkG;AAClG,wFAAwF;AACxF,6FAA6F;AAC7F,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,4FAA4F;AAC5F,wFAAwF;AACxF,8FAA8F;AAC9F,iGAAiG;AACjG,8FAA8F;AAC9F,4FAA4F;AAC5F,8FAA8F;AAC9F,yFAAyF;AACzF,+FAA+F;AAC/F,iGAAiG;AACjG,uEAAuE;AACvE,EAAE;AACF,sFAAsF;AACtF,6FAA6F;AAC7F,4FAA4F;AAC5F,gGAAgG;AAChG,6FAA6F;AAC7F,eAAe;AACf,EAAE;AACF,2FAA2F;AAC3F,gGAAgG;AAChG,kGAAkG;AAClG,
|
|
1
|
+
{"version":3,"file":"sliceDoc.js","sourceRoot":"","sources":["../../src/catalog/sliceDoc.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,20 @@ export type { ContractCheckInput } from "./apiFirst.js";
|
|
|
14
14
|
* API-first gate — a public-touching slice whose model contract is missing or stale gets a
|
|
15
15
|
* `slice-ready-contract-stale` error on every path past the unknown-key check.
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
/** GH #256: the opt-in strictness a host turns on once its legacy docs are re-ratified. */
|
|
18
|
+
export interface SliceReadyOptions {
|
|
19
|
+
/** `--require-ratified-hash`: a `ready-to-implement` doc with no `ratifiedHash:` is NOT ready
|
|
20
|
+
* (`slice-ready-missing-ratified-hash`, error). Off by default so docs ratified before em 1.15
|
|
21
|
+
* — and `em upgrade`'s grandfathered sign-offs — keep passing; a hand-edited frontmatter that
|
|
22
|
+
* fakes `ratifiedBy`/`ratifiedOn` without a hash passes readiness with no integrity check
|
|
23
|
+
* otherwise, which is the hole this closes. */
|
|
24
|
+
requireRatifiedHash?: boolean;
|
|
25
|
+
/** `--strict` (GH #293): advisory-rule diagnostics (RuleDef.advisory) are promoted to errors and gate. */
|
|
26
|
+
strict?: boolean;
|
|
27
|
+
/** GH #259: explicit roster path (`--roster`); omitted = the nearest `ratifiers.yaml` above the model. */
|
|
28
|
+
rosterPath?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function validateSliceReady(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, contract: ContractCheckInput, options?: SliceReadyOptions): Diagnostic[];
|
|
18
31
|
/** The named gate conditions `em validate --slice-ready <key> --json` reports individually
|
|
19
32
|
* (MIL-128; 4 originally, `ratified` MIL-259, `contractCurrent` MIL-238): doc bound, frontmatter usable, status ready-to-implement, no unchecked Open
|
|
20
33
|
* Questions — the exact facts `validateSliceReady` above already derives from the same doc
|
|
@@ -49,6 +62,10 @@ export interface SliceReadyGates {
|
|
|
49
62
|
export interface SliceReadyResult {
|
|
50
63
|
gates: SliceReadyGates;
|
|
51
64
|
continuationOf: string | null;
|
|
65
|
+
/** GH #260: the doc's `reviewSkipped:` — the status `em slice ratify --skip-review` ratified
|
|
66
|
+
* from when that bypass is what let it through; null otherwise (and when the doc is unusable).
|
|
67
|
+
* Informational, never a gate: a host decides whether an unreviewed ratification passes. */
|
|
68
|
+
reviewSkipped: string | null;
|
|
52
69
|
}
|
|
53
70
|
export declare function computeSliceReadyGates(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, contract: ContractCheckInput): SliceReadyResult | null;
|
|
54
71
|
/** R34 (MIL-268): the full `--slice-ready` verdict for one slice — the ONE computation `em
|
|
@@ -60,8 +77,12 @@ export declare function computeSliceReadyGates(model: NormalizedModel, refs: Ref
|
|
|
60
77
|
* "no scoped diagnostics". `result` is `computeSliceReadyGates`' named gates (null for an
|
|
61
78
|
* unknown key). */
|
|
62
79
|
export interface SliceReadiness {
|
|
80
|
+
/** Blocking diagnostics concerning this slice — what `ready` is derived from. */
|
|
63
81
|
scoped: Diagnostic[];
|
|
82
|
+
/** GH #293: advisory-rule diagnostics concerning this slice (listed, never gating). Empty under
|
|
83
|
+
* `strict`, which promotes them into `scoped` as errors. */
|
|
84
|
+
advisories: Diagnostic[];
|
|
64
85
|
ready: boolean;
|
|
65
86
|
result: SliceReadyResult | null;
|
|
66
87
|
}
|
|
67
|
-
export declare function computeSliceReadiness(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, contract: ContractCheckInput, allDiagnostics: Diagnostic[]): SliceReadiness;
|
|
88
|
+
export declare function computeSliceReadiness(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, contract: ContractCheckInput, allDiagnostics: Diagnostic[], options?: SliceReadyOptions): SliceReadiness;
|
|
@@ -25,12 +25,15 @@
|
|
|
25
25
|
// with `refs: [sliceKey]`, so the `--slice-ready` branch filters the full combined diagnostic
|
|
26
26
|
// set by that ref instead of this module re-deriving classifyImplementationDrift.
|
|
27
27
|
import { resolveSliceKey } from "../model/resolveSlice.js";
|
|
28
|
-
import { makeDiag, pushDiag } from "../model/rules.js";
|
|
28
|
+
import { makeDiag, pushDiag, RULES } from "../model/rules.js";
|
|
29
29
|
import { resolveSliceDocJoin } from "./docJoin.js";
|
|
30
30
|
import { readSliceDoc } from "./readSliceDoc.js";
|
|
31
|
-
import {
|
|
31
|
+
import { ratifiedHashScope } from "./sliceDoc.js";
|
|
32
32
|
import { findStructuredSectionProblems } from "./sliceSections.js";
|
|
33
33
|
import { contractStatus, slicePublicTouching } from "./apiFirst.js";
|
|
34
|
+
import { isGrandfatheredSignoff, loadRoster, rosterRefusal, sliceContexts } from "../roster/roster.js";
|
|
35
|
+
import { rosterContextFor } from "../roster/context.js";
|
|
36
|
+
import { computeModelKey } from "../model/qualifiedRef.js";
|
|
34
37
|
/** MIL-238 (briefing R10): the API-first gate's diagnostic for one slice, or null when the slice
|
|
35
38
|
* touches no public element or its model's contract is current. Independent of the slice doc —
|
|
36
39
|
* the contract belongs to the model — so it is appended on every path past the unknown-key check. */
|
|
@@ -53,18 +56,7 @@ function resolveSliceMessage(model, refs, sliceKey) {
|
|
|
53
56
|
const r = resolveSliceKey(model, refs, sliceKey);
|
|
54
57
|
return r.ok ? `no slice with export key "${sliceKey}" in this model` : r.message;
|
|
55
58
|
}
|
|
56
|
-
|
|
57
|
-
* Readiness gate for one slice, named by its export key (`refs.sliceKeys`). `baseDir` is the
|
|
58
|
-
* `.em` file's directory, same convention every other doc/note path in em uses. Always warning-
|
|
59
|
-
* severity (fits validate's existing warning-producer shape) except for a bad `sliceKey` itself,
|
|
60
|
-
* which is an error — a CLI-argument mistake, not a model-quality finding. The `--slice-ready`
|
|
61
|
-
* flag in src/cli.ts is what decides whether these warnings gate the exit code.
|
|
62
|
-
*
|
|
63
|
-
* MIL-238: `contract` (the `.em` path as given, its source and compile diagnostics) feeds the
|
|
64
|
-
* API-first gate — a public-touching slice whose model contract is missing or stale gets a
|
|
65
|
-
* `slice-ready-contract-stale` error on every path past the unknown-key check.
|
|
66
|
-
*/
|
|
67
|
-
export function validateSliceReady(model, refs, baseDir, sliceKey, contract) {
|
|
59
|
+
export function validateSliceReady(model, refs, baseDir, sliceKey, contract, options = {}) {
|
|
68
60
|
const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
|
|
69
61
|
if (sliceIndex === -1) {
|
|
70
62
|
return [
|
|
@@ -125,14 +117,48 @@ export function validateSliceReady(model, refs, baseDir, sliceKey, contract) {
|
|
|
125
117
|
// MIL-284: the ratified body has an identity now. A doc whose body moved after `em slice
|
|
126
118
|
// ratify` recorded `ratifiedHash:` is not the spec that was signed — the ratification stands
|
|
127
119
|
// on content that is gone. Only checked when a hash exists (a doc ratified before em 1.15 has
|
|
128
|
-
// none and is judged on `ratifiedBy` alone, as before) and only at ready-to-implement.
|
|
129
|
-
|
|
120
|
+
// none and is judged on `ratifiedBy` alone, as before) and only at ready-to-implement. A hash
|
|
121
|
+
// in the pre-1.17 whole-body scope still passes (GH #253: `legacy` is intact, not edited).
|
|
122
|
+
if (doc.status === "ready-to-implement" && doc.ratifiedHash !== null && ratifiedHashScope(parsed.raw, doc.ratifiedHash) === "mismatch") {
|
|
130
123
|
pushDiag(diags, "slice-ready-body-changed-since-ratification", {
|
|
131
124
|
message: `slice "${sliceKey}"'s doc ${doc.path} was edited after ratification (body no longer matches ratifiedHash) — revert, or re-ratify the new content`,
|
|
132
125
|
line: slice.line,
|
|
133
126
|
refs: [sliceKey],
|
|
134
127
|
});
|
|
135
128
|
}
|
|
129
|
+
// GH #259: with a ratifier roster present, a `ratifiedBy` it does not permit for this slice's
|
|
130
|
+
// context — the hand-edited-frontmatter case `em slice ratify`'s own refusal cannot see.
|
|
131
|
+
// `grandfathered ...` is em's own migration marker, not a signer, so it is exempt (it stays a
|
|
132
|
+
// finding of --require-ratified-hash and a human re-ratify item). Only `ready-to-implement`
|
|
133
|
+
// docs are checked here; `em roster check` also covers shipped docs.
|
|
134
|
+
if (doc.status === "ready-to-implement" && doc.ratifiedBy && !isGrandfatheredSignoff(doc.ratifiedBy, doc.ratifiedHash)) {
|
|
135
|
+
const roster = loadRoster(baseDir, options.rosterPath, rosterContextFor(model, contract.file));
|
|
136
|
+
if (roster.state === "invalid") {
|
|
137
|
+
for (const d of roster.diagnostics) {
|
|
138
|
+
pushDiag(diags, "roster-invalid", { message: `${roster.path}: ${d.message}`, line: slice.line, refs: [sliceKey] });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (roster.state === "present") {
|
|
142
|
+
const why = rosterRefusal(roster.roster, "ratifiers", doc.ratifiedBy, sliceContexts(model, sliceIndex), computeModelKey(model, contract.file));
|
|
143
|
+
if (why !== null) {
|
|
144
|
+
pushDiag(diags, "ratified-by-not-in-roster", {
|
|
145
|
+
message: `slice "${sliceKey}": ratifiedBy ${why} (${roster.path}) — re-ratify with a permitted name, or update the roster`,
|
|
146
|
+
line: slice.line,
|
|
147
|
+
refs: [sliceKey],
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// GH #256: strict mode — the body-changed check above can only run when a hash exists, so
|
|
153
|
+
// without this a `ready-to-implement` doc whose frontmatter was hand-edited to carry
|
|
154
|
+
// `ratifiedBy`/`ratifiedOn` and no `ratifiedHash` passes with no integrity check at all.
|
|
155
|
+
if (options.requireRatifiedHash && doc.status === "ready-to-implement" && doc.ratifiedHash === null) {
|
|
156
|
+
pushDiag(diags, "slice-ready-missing-ratified-hash", {
|
|
157
|
+
message: `slice "${sliceKey}"'s doc ${doc.path} is ready-to-implement with no ratifiedHash — --require-ratified-hash is on: re-ratify it (\`em slice revise --withdraw\`, review, \`em slice ratify --by\`) so the signed body has an identity`,
|
|
158
|
+
line: slice.line,
|
|
159
|
+
refs: [sliceKey],
|
|
160
|
+
});
|
|
161
|
+
}
|
|
136
162
|
if (parsed.openQuestionsUnchecked > 0) {
|
|
137
163
|
pushDiag(diags, "slice-ready-open-questions-unchecked", {
|
|
138
164
|
message: `slice "${sliceKey}" has ${parsed.openQuestionsUnchecked} of ${parsed.openQuestionsTotal} Open Question(s) unchecked`,
|
|
@@ -164,7 +190,7 @@ export function computeSliceReadyGates(model, refs, baseDir, sliceKey, contract)
|
|
|
164
190
|
const docBound = doc.reason !== "no-doc-bound";
|
|
165
191
|
const frontmatterUsable = doc.reason === null;
|
|
166
192
|
if (!frontmatterUsable) {
|
|
167
|
-
return { gates: { docBound, frontmatterUsable, statusReady: false, noUncheckedOpenQuestions: false, ratified: false, contractCurrent }, continuationOf };
|
|
193
|
+
return { gates: { docBound, frontmatterUsable, statusReady: false, noUncheckedOpenQuestions: false, ratified: false, contractCurrent }, continuationOf, reviewSkipped: null };
|
|
168
194
|
}
|
|
169
195
|
const statusReady = doc.status === "ready-to-implement";
|
|
170
196
|
// Same re-derivation of the bound key from doc.path as validateSliceReady above — see its
|
|
@@ -173,13 +199,19 @@ export function computeSliceReadyGates(model, refs, baseDir, sliceKey, contract)
|
|
|
173
199
|
const parsed = readSliceDoc(baseDir, boundKey);
|
|
174
200
|
const noUncheckedOpenQuestions = parsed.openQuestionsUnchecked === 0;
|
|
175
201
|
const ratified = !!doc.ratifiedBy;
|
|
176
|
-
return { gates: { docBound, frontmatterUsable, statusReady, noUncheckedOpenQuestions, ratified, contractCurrent }, continuationOf };
|
|
202
|
+
return { gates: { docBound, frontmatterUsable, statusReady, noUncheckedOpenQuestions, ratified, contractCurrent }, continuationOf, reviewSkipped: doc.reviewSkipped };
|
|
177
203
|
}
|
|
178
|
-
export function computeSliceReadiness(model, refs, baseDir, sliceKey, contract, allDiagnostics) {
|
|
179
|
-
const readyDiagnostics = validateSliceReady(model, refs, baseDir, sliceKey, contract);
|
|
204
|
+
export function computeSliceReadiness(model, refs, baseDir, sliceKey, contract, allDiagnostics, options = {}) {
|
|
205
|
+
const readyDiagnostics = validateSliceReady(model, refs, baseDir, sliceKey, contract, options);
|
|
180
206
|
const combined = [...allDiagnostics, ...readyDiagnostics];
|
|
181
|
-
const
|
|
207
|
+
const concerning = combined.filter((d) => d.refs?.some((r) => r === sliceKey || r.startsWith(`${sliceKey}/`)));
|
|
208
|
+
const isAdvisory = (d) => RULES[d.code]?.advisory === true;
|
|
209
|
+
const strict = options.strict === true;
|
|
210
|
+
const scoped = concerning
|
|
211
|
+
.filter((d) => strict || !isAdvisory(d))
|
|
212
|
+
.map((d) => (strict && isAdvisory(d) ? { ...d, severity: "error" } : d));
|
|
213
|
+
const advisories = strict ? [] : concerning.filter(isAdvisory);
|
|
182
214
|
const result = computeSliceReadyGates(model, refs, baseDir, sliceKey, contract);
|
|
183
|
-
return { scoped, ready: scoped.length === 0, result };
|
|
215
|
+
return { scoped, advisories, ready: scoped.length === 0, result };
|
|
184
216
|
}
|
|
185
217
|
//# sourceMappingURL=sliceReadyValidate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliceReadyValidate.js","sourceRoot":"","sources":["../../src/catalog/sliceReadyValidate.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,4FAA4F;AAC5F,2FAA2F;AAC3F,0FAA0F;AAC1F,6FAA6F;AAC7F,qBAAqB;AACrB,EAAE;AACF,qFAAqF;AACrF,uFAAuF;AACvF,4FAA4F;AAC5F,8FAA8F;AAC9F,+FAA+F;AAC/F,4FAA4F;AAC5F,8DAA8D;AAC9D,EAAE;AACF,gGAAgG;AAChG,uFAAuF;AACvF,6FAA6F;AAC7F,gGAAgG;AAChG,kGAAkG;AAClG,2DAA2D;AAC3D,EAAE;AACF,8FAA8F;AAC9F,6FAA6F;AAC7F,8FAA8F;AAC9F,kFAAkF;AAIlF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sliceReadyValidate.js","sourceRoot":"","sources":["../../src/catalog/sliceReadyValidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,8 +22,9 @@ export declare function regionKindOf(name: string): RegionKind | null;
|
|
|
22
22
|
* The generated regions a doc bound to `sliceIndices` (one slice, or the union a MIL-121
|
|
23
23
|
* cross-covered doc / a MIL-208 continuation resolves to) should carry, in template order:
|
|
24
24
|
* commands, events, views, invariants. Elements are taken in slice order then declaration
|
|
25
|
-
* order; a repeated view (`again`)
|
|
26
|
-
* kind with the same slug only the
|
|
25
|
+
* order; the first instance of a repeated view (`again`) owns the row (its sources are the
|
|
26
|
+
* union across instances, GH #280), and two elements of one kind with the same slug only the
|
|
27
|
+
* first.
|
|
27
28
|
*/
|
|
28
29
|
export declare function buildSliceRegions(model: NormalizedModel, sliceIndices: number[]): GeneratedRegion[];
|
|
29
30
|
/** The template's placeholder regions — what `em slice new` writes when it has no model to fill
|