@milehimikey/em 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/event-modeling/SKILL.md +4 -2
- package/.claude/skills/event-modeling-conform/SKILL.md +20 -9
- package/.claude/skills/event-modeling-conform/reference/conform.md +107 -10
- package/.claude/skills/event-modeling-design/SKILL.md +22 -6
- package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/SKILL.md +12 -6
- package/.claude/skills/event-modeling-implement/reference/implement.md +165 -18
- package/.claude/skills/event-modeling-review/SKILL.md +5 -1
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +57 -8
- package/.claude/skills/event-modeling-shared/reference/operating-principles.md +13 -3
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +69 -0
- package/.claude/skills/event-modeling-shared/templates/conformance-report.md +8 -1
- package/.claude/skills/event-modeling-shared/templates/constitution.md +8 -1
- package/.claude/skills/event-modeling-shared/templates/state.md +3 -0
- package/README.md +1 -0
- package/dist/catalog/build.js +42 -1
- package/dist/catalog/build.js.map +1 -1
- package/dist/catalog/coverage.d.ts +15 -0
- package/dist/catalog/coverage.js +34 -0
- package/dist/catalog/coverage.js.map +1 -0
- package/dist/catalog/docJoin.d.ts +20 -2
- package/dist/catalog/docJoin.js +32 -4
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.js +1 -1
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/driftSignal.d.ts +11 -5
- package/dist/catalog/driftSignal.js +18 -4
- package/dist/catalog/driftSignal.js.map +1 -1
- package/dist/catalog/modelVersionValidate.d.ts +9 -0
- package/dist/catalog/modelVersionValidate.js +38 -0
- package/dist/catalog/modelVersionValidate.js.map +1 -0
- package/dist/catalog/noteBindingValidate.js +18 -0
- package/dist/catalog/noteBindingValidate.js.map +1 -1
- package/dist/catalog/orphanedSliceDocValidate.d.ts +8 -1
- package/dist/catalog/orphanedSliceDocValidate.js +33 -6
- package/dist/catalog/orphanedSliceDocValidate.js.map +1 -1
- package/dist/catalog/pages.d.ts +16 -1
- package/dist/catalog/pages.js +16 -4
- package/dist/catalog/pages.js.map +1 -1
- package/dist/catalog/sliceDoc.d.ts +12 -0
- package/dist/catalog/sliceDoc.js +15 -0
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +12 -1
- package/dist/catalog/sliceReadyValidate.js +4 -4
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/cli/agentsMd.js +9 -3
- package/dist/cli/agentsMd.js.map +1 -1
- package/dist/cli/ciInit.js +20 -0
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/conformScope.d.ts +1 -0
- package/dist/cli/conformScope.js +13 -4
- package/dist/cli/conformScope.js.map +1 -1
- package/dist/cli/conformSupersede.d.ts +24 -2
- package/dist/cli/conformSupersede.js +44 -3
- package/dist/cli/conformSupersede.js.map +1 -1
- package/dist/cli/coverage.d.ts +34 -9
- package/dist/cli/coverage.js +61 -24
- package/dist/cli/coverage.js.map +1 -1
- package/dist/cli/findings.d.ts +134 -0
- package/dist/cli/findings.js +355 -0
- package/dist/cli/findings.js.map +1 -0
- package/dist/cli/markImplemented.js +12 -1
- package/dist/cli/markImplemented.js.map +1 -1
- package/dist/cli/metrics.d.ts +93 -0
- package/dist/cli/metrics.js +331 -0
- package/dist/cli/metrics.js.map +1 -0
- package/dist/cli/modelVersion.d.ts +139 -0
- package/dist/cli/modelVersion.js +256 -0
- package/dist/cli/modelVersion.js.map +1 -0
- package/dist/cli/ratify.js +17 -1
- package/dist/cli/ratify.js.map +1 -1
- package/dist/cli/reratify.d.ts +17 -0
- package/dist/cli/reratify.js +37 -2
- package/dist/cli/reratify.js.map +1 -1
- package/dist/cli/review.js +12 -1
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/skillCheck.js +2 -2
- package/dist/cli/skillCheck.js.map +1 -1
- package/dist/cli/sliceConform.d.ts +50 -0
- package/dist/cli/sliceConform.js +206 -0
- package/dist/cli/sliceConform.js.map +1 -0
- package/dist/cli/sliceIndex.d.ts +2 -0
- package/dist/cli/sliceIndex.js +24 -7
- package/dist/cli/sliceIndex.js.map +1 -1
- package/dist/cli/sliceLink.js +16 -0
- package/dist/cli/sliceLink.js.map +1 -1
- package/dist/cli/sliceNew.d.ts +12 -0
- package/dist/cli/sliceNew.js +23 -0
- package/dist/cli/sliceNew.js.map +1 -1
- package/dist/cli/sliceStubAll.d.ts +76 -0
- package/dist/cli/sliceStubAll.js +189 -0
- package/dist/cli/sliceStubAll.js.map +1 -0
- package/dist/cli/stateFile.d.ts +63 -7
- package/dist/cli/stateFile.js +179 -18
- package/dist/cli/stateFile.js.map +1 -1
- package/dist/cli/status.d.ts +90 -1
- package/dist/cli/status.js +151 -16
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/upgrade.d.ts +122 -0
- package/dist/cli/upgrade.js +476 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/cli.js +586 -66
- package/dist/cli.js.map +1 -1
- package/dist/emit/coverageJson.d.ts +2 -2
- package/dist/emit/coverageJson.js +6 -2
- package/dist/emit/coverageJson.js.map +1 -1
- package/dist/emit/freshnessJson.d.ts +1 -1
- package/dist/emit/freshnessJson.js +3 -1
- package/dist/emit/freshnessJson.js.map +1 -1
- package/dist/emit/json.d.ts +34 -1
- package/dist/emit/json.js +84 -2
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/metricsJson.d.ts +7 -0
- package/dist/emit/metricsJson.js +27 -0
- package/dist/emit/metricsJson.js.map +1 -0
- package/dist/emit/statusJson.d.ts +1 -1
- package/dist/emit/statusJson.js +22 -1
- package/dist/emit/statusJson.js.map +1 -1
- package/dist/emit/upgradeJson.d.ts +5 -0
- package/dist/emit/upgradeJson.js +26 -0
- package/dist/emit/upgradeJson.js.map +1 -0
- package/dist/emit/validateJson.d.ts +10 -5
- package/dist/emit/validateJson.js +22 -8
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +151 -22
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/continuation.d.ts +23 -0
- package/dist/model/continuation.js +49 -0
- package/dist/model/continuation.js.map +1 -0
- package/dist/model/queryIndex.js +1 -1
- package/dist/model/queryIndex.js.map +1 -1
- package/dist/model/rules.d.ts +13 -0
- package/dist/model/rules.js +18 -0
- package/dist/model/rules.js.map +1 -1
- package/dist/model/sliceDocIndex.d.ts +12 -5
- package/dist/model/sliceDocIndex.js +18 -7
- package/dist/model/sliceDocIndex.js.map +1 -1
- package/dist/model/validate.d.ts +20 -0
- package/dist/model/validate.js +94 -45
- package/dist/model/validate.js.map +1 -1
- package/dist/render/sliceStatus.d.ts +3 -3
- package/dist/render/sliceStatus.js +27 -29
- package/dist/render/sliceStatus.js.map +1 -1
- package/dist/templates.d.ts +3 -3
- package/dist/templates.js +15 -2
- package/dist/templates.js.map +1 -1
- package/dist/util/localDate.d.ts +2 -0
- package/dist/util/localDate.js +17 -0
- package/dist/util/localDate.js.map +1 -0
- package/dist/util/semver.d.ts +19 -0
- package/dist/util/semver.js +54 -0
- package/dist/util/semver.js.map +1 -0
- package/package.json +1 -1
|
@@ -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;AAEvE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sliceDoc.js","sourceRoot":"","sources":["../../src/catalog/sliceDoc.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,4 +26,15 @@ export interface SliceReadyGates {
|
|
|
26
26
|
statusReady: boolean;
|
|
27
27
|
noUncheckedOpenQuestions: boolean;
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
/** `computeSliceReadyGates`'s full result (MIL-208): the 4 gates plus `continuationOf` — non-
|
|
30
|
+
* null when `sliceKey` names a continuation slice (an again-view-only slice with no legacy doc
|
|
31
|
+
* of its own), naming the originating slice whose doc/status the gates above actually verify.
|
|
32
|
+
* `gates` themselves already reflect the originating slice's verdict transparently (the same
|
|
33
|
+
* `resolveSliceDocJoin()` call this function makes resolves straight through) — this field
|
|
34
|
+
* only explains WHY, the same "doc reports the real status, continuationOf says why" split
|
|
35
|
+
* `em export` uses. */
|
|
36
|
+
export interface SliceReadyResult {
|
|
37
|
+
gates: SliceReadyGates;
|
|
38
|
+
continuationOf: string | null;
|
|
39
|
+
}
|
|
40
|
+
export declare function computeSliceReadyGates(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string): SliceReadyResult | null;
|
|
@@ -45,7 +45,7 @@ export function validateSliceReady(model, refs, baseDir, sliceKey) {
|
|
|
45
45
|
];
|
|
46
46
|
}
|
|
47
47
|
const slice = model.slices[sliceIndex];
|
|
48
|
-
const { doc, diagnostics: joinDiagnostics } = resolveSliceDocJoin(slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
48
|
+
const { doc, diagnostics: joinDiagnostics } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
49
49
|
if (doc.reason === "no-doc-bound") {
|
|
50
50
|
return [
|
|
51
51
|
makeDiag("slice-ready-no-doc-bound", {
|
|
@@ -92,11 +92,11 @@ export function computeSliceReadyGates(model, refs, baseDir, sliceKey) {
|
|
|
92
92
|
if (sliceIndex === -1)
|
|
93
93
|
return null;
|
|
94
94
|
const slice = model.slices[sliceIndex];
|
|
95
|
-
const { doc } = resolveSliceDocJoin(slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
95
|
+
const { doc, continuationOf } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
96
96
|
const docBound = doc.reason !== "no-doc-bound";
|
|
97
97
|
const frontmatterUsable = doc.reason === null;
|
|
98
98
|
if (!frontmatterUsable) {
|
|
99
|
-
return { docBound, frontmatterUsable, statusReady: false, noUncheckedOpenQuestions: false };
|
|
99
|
+
return { gates: { docBound, frontmatterUsable, statusReady: false, noUncheckedOpenQuestions: false }, continuationOf };
|
|
100
100
|
}
|
|
101
101
|
const statusReady = doc.status === "ready-to-implement";
|
|
102
102
|
// Same re-derivation of the bound key from doc.path as validateSliceReady above — see its
|
|
@@ -104,6 +104,6 @@ export function computeSliceReadyGates(model, refs, baseDir, sliceKey) {
|
|
|
104
104
|
const boundKey = doc.path.replace(/^slices\//, "").replace(/\.md$/, "");
|
|
105
105
|
const parsed = readSliceDoc(baseDir, boundKey);
|
|
106
106
|
const noUncheckedOpenQuestions = parsed.openQuestionsUnchecked === 0;
|
|
107
|
-
return { docBound, frontmatterUsable, statusReady, noUncheckedOpenQuestions };
|
|
107
|
+
return { gates: { docBound, frontmatterUsable, statusReady, noUncheckedOpenQuestions }, continuationOf };
|
|
108
108
|
}
|
|
109
109
|
//# sourceMappingURL=sliceReadyValidate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliceReadyValidate.js","sourceRoot":"","sources":["../../src/catalog/sliceReadyValidate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sliceReadyValidate.js","sourceRoot":"","sources":["../../src/catalog/sliceReadyValidate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/agentsMd.js
CHANGED
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
// slice-readiness gate (`em validate --slice-ready --json`, MIL-128), and the machine-readable
|
|
7
7
|
// read path (`em export --slice`, MIL-128). MIL-21 adds a fourth pointer: `em-mcp`, the MCP
|
|
8
8
|
// server exposing the same contract/gate/read-path (plus full validate/export) as tools for an
|
|
9
|
-
// MCP-native agent, instead of shell commands.
|
|
9
|
+
// MCP-native agent, instead of shell commands. MIL-152 (a later skill-free G5 run) adds two more:
|
|
10
|
+
// how to list a model's slice keys at all (nothing in this chain said so before — the agent had
|
|
11
|
+
// to fall back to a full `em export`), and the MCP handshake doc's URL, since `docs/mcp.md`
|
|
12
|
+
// itself isn't vendored into the installed skill bundle a repo-local agent actually has on disk.
|
|
10
13
|
//
|
|
11
14
|
// Same marker discipline as `em slice index`'s README Slices table (src/cli/sliceIndex.ts,
|
|
12
15
|
// MIL-98): idempotent replace-between-markers via src/util/markers.ts, user content outside the
|
|
@@ -38,8 +41,11 @@ agent — Claude Code or otherwise — should follow this contract:
|
|
|
38
41
|
- **Read path**: \`em export <model>.em --slice <slice-key>\` exports just that slice's
|
|
39
42
|
normalized JSON (pattern, fields, doc) to implement against; \`em export <model>.em\` exports
|
|
40
43
|
the whole model.
|
|
41
|
-
- **
|
|
42
|
-
|
|
44
|
+
- **Slice keys**: \`em export <model>.em | jq -r '.model.slices[].key'\` lists every slice's
|
|
45
|
+
export key (the \`<slice-key>\` the gate and read path above take) without reading the DSL.
|
|
46
|
+
- **MCP alternative**: \`em-mcp\` starts a stateless stdio MCP server exposing the contract,
|
|
47
|
+
gate, and read path above (plus full validate/export) as tools instead of shell commands —
|
|
48
|
+
every tool mirrors a CLI \`--json\` surface byte-for-byte. Handshake and full tool list:
|
|
43
49
|
[docs/mcp.md](https://github.com/milehimikey/em/blob/main/docs/mcp.md).`;
|
|
44
50
|
function markerBlock() {
|
|
45
51
|
return `<!-- GENERATED:${AGENTS_MD_MARKER}:start -->\n${SECTION_BODY}\n<!-- GENERATED:${AGENTS_MD_MARKER}:end -->`;
|
package/dist/cli/agentsMd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentsMd.js","sourceRoot":"","sources":["../../src/cli/agentsMd.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,yFAAyF;AACzF,2FAA2F;AAC3F,gGAAgG;AAChG,uFAAuF;AACvF,+FAA+F;AAC/F,4FAA4F;AAC5F,+FAA+F;AAC/F
|
|
1
|
+
{"version":3,"file":"agentsMd.js","sourceRoot":"","sources":["../../src/cli/agentsMd.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,yFAAyF;AACzF,2FAA2F;AAC3F,gGAAgG;AAChG,uFAAuF;AACvF,+FAA+F;AAC/F,4FAA4F;AAC5F,+FAA+F;AAC/F,kGAAkG;AAClG,gGAAgG;AAChG,4FAA4F;AAC5F,iGAAiG;AACjG,EAAE;AACF,2FAA2F;AAC3F,gGAAgG;AAChG,6FAA6F;AAC7F,8FAA8F;AAC9F,+FAA+F;AAC/F,4FAA4F;AAC5F,8FAA8F;AAC9F,6FAA6F;AAC7F,sDAAsD;AAEtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;+CAC+C;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;0EAoBqD,CAAC;AAE3E,SAAS,WAAW;IAClB,OAAO,kBAAkB,gBAAgB,eAAe,YAAY,oBAAoB,gBAAgB,UAAU,CAAC;AACrH,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAEtE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACxE,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,uFAAuF;IACvF,0FAA0F;IAC1F,yFAAyF;IACzF,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,aAAa,CAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC/C,CAAC"}
|
package/dist/cli/ciInit.js
CHANGED
|
@@ -107,6 +107,9 @@ export function ciManagedBody(model, testsDir, emVersion) {
|
|
|
107
107
|
with:
|
|
108
108
|
node-version: 20
|
|
109
109
|
- name: Check invariant test coverage
|
|
110
|
+
# Counts INV-* IDs in \`implemented\` slice docs only (MIL-207) — a ready-to-implement
|
|
111
|
+
# doc has nothing yet to cite it, so this job is green on a fresh scaffold and on a
|
|
112
|
+
# doc-only ratification PR. Pass --include-ready for the older, forward-looking report.
|
|
110
113
|
run: ${em} coverage "${model}" --tests "${testsDir}" --strict
|
|
111
114
|
|
|
112
115
|
ledger:
|
|
@@ -140,6 +143,23 @@ export function ciManagedBody(model, testsDir, emVersion) {
|
|
|
140
143
|
echo "no vendored skill at .claude/skills/event-modeling — skipping (run \`em skill install\` to opt in)"
|
|
141
144
|
fi
|
|
142
145
|
|
|
146
|
+
upgrade-check:
|
|
147
|
+
name: "em upgrade --check (advisory — hard incompatibilities only, MIL-219)"
|
|
148
|
+
if: github.event_name == 'pull_request'
|
|
149
|
+
runs-on: ubuntu-latest
|
|
150
|
+
steps:
|
|
151
|
+
- uses: actions/checkout@v4
|
|
152
|
+
with:
|
|
153
|
+
fetch-depth: 0
|
|
154
|
+
- uses: actions/setup-node@v4
|
|
155
|
+
with:
|
|
156
|
+
node-version: 20
|
|
157
|
+
- name: Check for hard upgrade incompatibilities
|
|
158
|
+
# Advisory: exits non-zero ONLY on a hard incompatibility (an unparseable state file, an
|
|
159
|
+
# old .em shape em migrate itself refuses) — never on the ordinary "some mechanical
|
|
160
|
+
# steps are applicable" case. See docs/upgrading.md.
|
|
161
|
+
run: ${em} upgrade "${model}" --check
|
|
162
|
+
|
|
143
163
|
glossary:
|
|
144
164
|
name: "em glossary --fail-on-conflicts (cross-model vocabulary)"
|
|
145
165
|
if: github.event_name == 'pull_request'
|
package/dist/cli/ciInit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ciInit.js","sourceRoot":"","sources":["../../src/cli/ciInit.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,wFAAwF;AACxF,2FAA2F;AAC3F,4FAA4F;AAC5F,yFAAyF;AACzF,2EAA2E;AAC3E,EAAE;AACF,0FAA0F;AAC1F,yFAAyF;AACzF,uFAAuF;AACvF,6FAA6F;AAC7F,2EAA2E;AAC3E,4FAA4F;AAC5F,6FAA6F;AAC7F,2FAA2F;AAC3F,cAAc;AACd,8FAA8F;AAC9F,6FAA6F;AAC7F,sEAAsE;AACtE,EAAE;AACF,0FAA0F;AAC1F,gGAAgG;AAChG,6FAA6F;AAC7F,6FAA6F;AAC7F,4DAA4D;AAE5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAEpD,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACtE,MAAM,wBAAwB,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAEhF,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAC7C,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,IAAI,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;AAClD,CAAC;AAED;;iEAEiE;AACjE,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,gEAAgE;AAEhE;;;;;;;;gDAQgD;AAChD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,QAAgB,EAAE,SAAiB;IAC9E,MAAM,EAAE,GAAG,uBAAuB,SAAS,EAAE,CAAC;IAC9C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;cAwBK,EAAE;cACF,EAAE;;;;;;;;;;;;;;;eAeD,EAAE,iBAAiB,KAAK
|
|
1
|
+
{"version":3,"file":"ciInit.js","sourceRoot":"","sources":["../../src/cli/ciInit.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/conformScope.js
CHANGED
|
@@ -55,7 +55,9 @@ export function matchImplementedInToPaths(implementedIn, changedPaths) {
|
|
|
55
55
|
* `implemented`-status slice is a candidate with `matchedBy: "full"` and empty `paths`.
|
|
56
56
|
*/
|
|
57
57
|
export function buildConformScope(slices, lastConformance, changedPaths, full) {
|
|
58
|
-
const lastConformanceOut = lastConformance
|
|
58
|
+
const lastConformanceOut = lastConformance
|
|
59
|
+
? { date: lastConformance.date, revision: lastConformance.revision, partial: lastConformance.partial }
|
|
60
|
+
: null;
|
|
59
61
|
if (full || lastConformance === null) {
|
|
60
62
|
const candidateSlices = slices
|
|
61
63
|
.filter((s) => s.status === "implemented")
|
|
@@ -82,11 +84,18 @@ export function buildConformScope(slices, lastConformance, changedPaths, full) {
|
|
|
82
84
|
* `em slice index` does. */
|
|
83
85
|
export function resolveSliceDocFacts(model, refs, baseDir) {
|
|
84
86
|
const diagnostics = [];
|
|
85
|
-
const facts =
|
|
87
|
+
const facts = [];
|
|
88
|
+
model.slices.forEach((slice, i) => {
|
|
86
89
|
const key = refs.sliceKeys[i];
|
|
87
|
-
const { doc, diagnostics: docDiags } = resolveSliceDocJoin(slice, key, baseDir, (id) => refs.refById.get(id));
|
|
90
|
+
const { doc, diagnostics: docDiags, continuationOf: continuationOfKey } = resolveSliceDocJoin(model, refs, slice, key, baseDir, (id) => refs.refById.get(id));
|
|
88
91
|
diagnostics.push(...docDiags);
|
|
89
|
-
|
|
92
|
+
// MIL-208: a continuation slice carries the SAME status/implementedIn as the originating
|
|
93
|
+
// slice (identical doc join) — including it here would list the same PR as a candidate
|
|
94
|
+
// under two different keys for one actual change. The originating slice's own fact already
|
|
95
|
+
// covers it.
|
|
96
|
+
if (continuationOfKey !== null)
|
|
97
|
+
return;
|
|
98
|
+
facts.push({ key, status: doc.status, implementedIn: doc.implementedIn });
|
|
90
99
|
});
|
|
91
100
|
return { facts, diagnostics };
|
|
92
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformScope.js","sourceRoot":"","sources":["../../src/cli/conformScope.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,8FAA8F;AAC9F,6FAA6F;AAC7F,0CAA0C;AAC1C,EAAE;AACF,4EAA4E;AAC5E,+FAA+F;AAC/F,6CAA6C;AAC7C,6FAA6F;AAC7F,8FAA8F;AAC9F,4FAA4F;AAC5F,kBAAkB;AAClB,8EAA8E;AAC9E,+FAA+F;AAC/F,8FAA8F;AAC9F,gGAAgG;AAChG,+FAA+F;AAC/F,gFAAgF;AAChF,EAAE;AACF,qFAAqF;AACrF,0FAA0F;AAC1F,2BAA2B;AAE3B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAItE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAa,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAgCtD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,CAAC,4CAA4C;AACzF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC,uDAAuD;AAE7F;;8FAE8F;AAC9F,SAAS,aAAa,CAAC,aAAqB;IAC1C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;uFAEuF;AACvF,MAAM,UAAU,yBAAyB,CAAC,aAA4B,EAAE,YAAsB;IAC5F,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAuB,EACvB,eAAuC,EACvC,YAAsB,EACtB,IAAa;IAEb,MAAM,kBAAkB,GAAG,eAAe,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"conformScope.js","sourceRoot":"","sources":["../../src/cli/conformScope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FindingLocus } from "./findings.js";
|
|
1
2
|
export type ApplySupersedeResult = {
|
|
2
3
|
ok: true;
|
|
3
4
|
content: string;
|
|
@@ -15,10 +16,29 @@ export type ApplySupersedeResult = {
|
|
|
15
16
|
* below.
|
|
16
17
|
*/
|
|
17
18
|
export declare function applySupersededBanner(raw: string, revision: string, findings: string, on: string): ApplySupersedeResult;
|
|
19
|
+
/** MIL-214: `--locus`/`--by` — optional, both-or-neither. */
|
|
20
|
+
export interface ConformSupersedeRuling {
|
|
21
|
+
locus: FindingLocus;
|
|
22
|
+
by: string;
|
|
23
|
+
}
|
|
24
|
+
/** What happened on the findings-JSON side of a `--locus`/`--by` call — `"not-requested"` when
|
|
25
|
+
* neither flag was passed (pre-MIL-214 behavior, banner only). */
|
|
26
|
+
export type FindingsRulingOutcome = {
|
|
27
|
+
kind: "not-requested";
|
|
28
|
+
} | {
|
|
29
|
+
kind: "no-findings-file";
|
|
30
|
+
warning: string;
|
|
31
|
+
} | {
|
|
32
|
+
kind: "applied";
|
|
33
|
+
path: string;
|
|
34
|
+
changed: boolean;
|
|
35
|
+
ids: number[];
|
|
36
|
+
};
|
|
18
37
|
export type RunConformSupersedeResult = {
|
|
19
38
|
ok: true;
|
|
20
39
|
path: string;
|
|
21
40
|
changed: boolean;
|
|
41
|
+
findingsRuling: FindingsRulingOutcome;
|
|
22
42
|
} | {
|
|
23
43
|
ok: false;
|
|
24
44
|
message: string;
|
|
@@ -27,6 +47,8 @@ export type RunConformSupersedeResult = {
|
|
|
27
47
|
* Resolves `reportPath` (relative to `baseDir` — the `.em` file's directory, same convention
|
|
28
48
|
* every doc/note/report path in `em` uses) and applies the banner. Refuses cleanly when the
|
|
29
49
|
* report doesn't exist rather than creating one — `em conform-supersede` stamps an existing
|
|
30
|
-
* report, it never authors one.
|
|
50
|
+
* report, it never authors one. When `ruling` is given, also records `locus`/`resolvedBy`/
|
|
51
|
+
* `resolvedOn` on the findings named by `findings` in the sibling `-findings.json` — see module
|
|
52
|
+
* header.
|
|
31
53
|
*/
|
|
32
|
-
export declare function runConformSupersede(baseDir: string, reportPath: string, revision: string, findings: string, on: string): RunConformSupersedeResult;
|
|
54
|
+
export declare function runConformSupersede(baseDir: string, reportPath: string, revision: string, findings: string, on: string, ruling?: ConformSupersedeRuling): RunConformSupersedeResult;
|
|
@@ -18,9 +18,20 @@
|
|
|
18
18
|
// block reads as a small history of rulings, not a single mutable fact. Calling again with the
|
|
19
19
|
// EXACT same revision/findings/date is a no-op (`changed: false`), same idempotency convention
|
|
20
20
|
// every other `em` write command holds.
|
|
21
|
+
//
|
|
22
|
+
// MIL-214: `--locus <model|doc|code|none> --by <name>` (both required together, `--on` optional)
|
|
23
|
+
// additionally record the RULING itself — not just that a ruling happened — onto the findings
|
|
24
|
+
// JSON beside the report (`conformance/<date>-findings.json`, cli/findings.ts), via
|
|
25
|
+
// `applyFindingsRuling`. This is the mechanical half of docs/process.md's "Ruling on conformance
|
|
26
|
+
// findings": the banner alone only ever said "this report is superseded," never "and here's what
|
|
27
|
+
// was decided about finding N." Without `--locus`/`--by`, behavior is byte-identical to before
|
|
28
|
+
// this ticket (banner only). With them but no findings JSON present beside the report (a report
|
|
29
|
+
// written before MIL-214, or authored by hand), the ruling can't be recorded anywhere structured
|
|
30
|
+
// — warn once and fall back to banner-only, the documented migration path.
|
|
21
31
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
22
32
|
import { join } from "node:path";
|
|
23
33
|
import { isValidDateString } from "./stateFile.js";
|
|
34
|
+
import { applyFindingsRuling, lookupFindingsBesideReport, parseFindingsSpec, serializeFindingsDoc } from "./findings.js";
|
|
24
35
|
const BANNER_PREFIX = "> **Superseded as of `";
|
|
25
36
|
/** Conservative charset for `--findings`: digits, commas, spaces, and either dash style (ASCII
|
|
26
37
|
* hyphen or an en/em dash pasted from a report) — enough to write "1-3", "1, 2, 4", or "1–3",
|
|
@@ -82,13 +93,43 @@ export function applySupersededBanner(raw, revision, findings, on) {
|
|
|
82
93
|
* Resolves `reportPath` (relative to `baseDir` — the `.em` file's directory, same convention
|
|
83
94
|
* every doc/note/report path in `em` uses) and applies the banner. Refuses cleanly when the
|
|
84
95
|
* report doesn't exist rather than creating one — `em conform-supersede` stamps an existing
|
|
85
|
-
* report, it never authors one.
|
|
96
|
+
* report, it never authors one. When `ruling` is given, also records `locus`/`resolvedBy`/
|
|
97
|
+
* `resolvedOn` on the findings named by `findings` in the sibling `-findings.json` — see module
|
|
98
|
+
* header.
|
|
86
99
|
*/
|
|
87
|
-
export function runConformSupersede(baseDir, reportPath, revision, findings, on) {
|
|
100
|
+
export function runConformSupersede(baseDir, reportPath, revision, findings, on, ruling) {
|
|
88
101
|
const absPath = join(baseDir, reportPath);
|
|
89
102
|
if (!existsSync(absPath)) {
|
|
90
103
|
return { ok: false, message: `no such report: ${reportPath}` };
|
|
91
104
|
}
|
|
105
|
+
let findingsRuling = { kind: "not-requested" };
|
|
106
|
+
if (ruling) {
|
|
107
|
+
const ids = parseFindingsSpec(findings);
|
|
108
|
+
if (ids === null) {
|
|
109
|
+
return { ok: false, message: `--findings "${findings}" doesn't parse into finding id(s) — expected e.g. "1-3" or "1, 2, 4"` };
|
|
110
|
+
}
|
|
111
|
+
const lookup = lookupFindingsBesideReport(baseDir, reportPath);
|
|
112
|
+
if (lookup.kind === "invalid") {
|
|
113
|
+
return { ok: false, message: lookup.message };
|
|
114
|
+
}
|
|
115
|
+
if (lookup.kind === "absent") {
|
|
116
|
+
findingsRuling = {
|
|
117
|
+
kind: "no-findings-file",
|
|
118
|
+
warning: `no findings JSON found beside ${reportPath} — recording the banner only; the ruling ` +
|
|
119
|
+
"(locus/resolvedBy/resolvedOn) isn't recorded anywhere structured (migration path for a report written before `em conform-findings`)",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const applied = applyFindingsRuling(lookup.doc, ids, ruling.locus, ruling.by, on);
|
|
124
|
+
if (!applied.ok) {
|
|
125
|
+
return { ok: false, message: applied.message };
|
|
126
|
+
}
|
|
127
|
+
if (applied.changed) {
|
|
128
|
+
writeFileSync(join(baseDir, lookup.path), serializeFindingsDoc(applied.doc), "utf8");
|
|
129
|
+
}
|
|
130
|
+
findingsRuling = { kind: "applied", path: lookup.path, changed: applied.changed, ids };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
92
133
|
const raw = readFileSync(absPath, "utf8");
|
|
93
134
|
const result = applySupersededBanner(raw, revision, findings, on);
|
|
94
135
|
if (!result.ok) {
|
|
@@ -97,6 +138,6 @@ export function runConformSupersede(baseDir, reportPath, revision, findings, on)
|
|
|
97
138
|
if (result.changed) {
|
|
98
139
|
writeFileSync(absPath, result.content, "utf8");
|
|
99
140
|
}
|
|
100
|
-
return { ok: true, path: reportPath, changed: result.changed };
|
|
141
|
+
return { ok: true, path: reportPath, changed: result.changed, findingsRuling };
|
|
101
142
|
}
|
|
102
143
|
//# sourceMappingURL=conformSupersede.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformSupersede.js","sourceRoot":"","sources":["../../src/cli/conformSupersede.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0FAA0F;AAC1F,sFAAsF;AACtF,4FAA4F;AAC5F,yFAAyF;AACzF,wFAAwF;AACxF,8FAA8F;AAC9F,+FAA+F;AAC/F,iCAAiC;AACjC,EAAE;AACF,6FAA6F;AAC7F,gGAAgG;AAChG,iGAAiG;AACjG,8FAA8F;AAC9F,uFAAuF;AACvF,+FAA+F;AAC/F,6FAA6F;AAC7F,+FAA+F;AAC/F,+FAA+F;AAC/F,wCAAwC;
|
|
1
|
+
{"version":3,"file":"conformSupersede.js","sourceRoot":"","sources":["../../src/cli/conformSupersede.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0FAA0F;AAC1F,sFAAsF;AACtF,4FAA4F;AAC5F,yFAAyF;AACzF,wFAAwF;AACxF,8FAA8F;AAC9F,+FAA+F;AAC/F,iCAAiC;AACjC,EAAE;AACF,6FAA6F;AAC7F,gGAAgG;AAChG,iGAAiG;AACjG,8FAA8F;AAC9F,uFAAuF;AACvF,+FAA+F;AAC/F,6FAA6F;AAC7F,+FAA+F;AAC/F,+FAA+F;AAC/F,wCAAwC;AACxC,EAAE;AACF,iGAAiG;AACjG,8FAA8F;AAC9F,oFAAoF;AACpF,iGAAiG;AACjG,iGAAiG;AACjG,+FAA+F;AAC/F,gGAAgG;AAChG,iGAAiG;AACjG,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAgB,0BAA0B,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEvI,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C;;qFAEqF;AACrF,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAI3C;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAU;IAC/F,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;IACnF,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,4DAA4D,EAAE,CAAC;IAC9F,CAAC;IACD,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;IAChG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,eAAe,QAAQ,mEAAmE;SACpG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC;IACvF,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,GAAG,aAAa,GAAG,UAAU,mBAAmB,eAAe,iBAAiB,EAAE,wIAAwI,CAAC;IAE3O,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACtE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,kDAAkD;IACvG,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,SAAS,EAAE,CAAC;IAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAmBD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,UAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,EAAU,EACV,MAA+B;IAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,UAAU,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,cAAc,GAA0B,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IACtE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,QAAQ,uEAAuE,EAAE,CAAC;QAChI,CAAC;QACD,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,cAAc,GAAG;gBACf,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EACL,iCAAiC,UAAU,2CAA2C;oBACtF,qIAAqI;aACxI,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YACjD,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YACvF,CAAC;YACD,cAAc,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,KAAK,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;AACjF,CAAC"}
|
package/dist/cli/coverage.d.ts
CHANGED
|
@@ -53,8 +53,9 @@ export interface SliceCoverage {
|
|
|
53
53
|
* has `docReason: null`). Lets an out-of-scope reader tell "nothing bound yet" apart from
|
|
54
54
|
* "bound but broken" without re-running the join themselves. */
|
|
55
55
|
docReason: string | null;
|
|
56
|
-
/** True when this slice's doc was found, its frontmatter usable, and `status` is
|
|
57
|
-
* `
|
|
56
|
+
/** True when this slice's doc was found, its frontmatter usable, and `status` is in scope —
|
|
57
|
+
* `implemented` by default, plus `ready-to-implement` with `--include-ready` (MIL-207). The
|
|
58
|
+
* only slices `invariants` is populated for. */
|
|
58
59
|
inScope: boolean;
|
|
59
60
|
invariants: InvariantCoverage[];
|
|
60
61
|
}
|
|
@@ -65,12 +66,36 @@ export interface CoverageReport {
|
|
|
65
66
|
/** Of `totalInvariants`, how many have zero citations. */
|
|
66
67
|
uncoveredCount: number;
|
|
67
68
|
}
|
|
69
|
+
/** One slice's doc-join outcome, cheap to resolve (no test-tree scan) — the bit every
|
|
70
|
+
* `--tests <dir>` consumer needs to answer "is there anything in scope at all?" before it
|
|
71
|
+
* decides whether a missing test directory is an error (MIL-207: with zero in-scope docs
|
|
72
|
+
* there's nothing to cite, so a fresh scaffold's absent `test/` isn't a defect). */
|
|
73
|
+
export interface ScopedSlice {
|
|
74
|
+
key: string;
|
|
75
|
+
status: string | null;
|
|
76
|
+
docReason: string | null;
|
|
77
|
+
inScope: boolean;
|
|
78
|
+
/** The bound doc's path (`SliceDocExport.path`) — present even when out of scope or unbound,
|
|
79
|
+
* same convention as `SliceCoverage.status`/`docReason` above. */
|
|
80
|
+
docPath: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve every slice's doc-join and in-scope status, without touching the test tree. Shared by
|
|
84
|
+
* `buildCoverageReport` (below) and every `--tests` consumer that needs to know, before checking
|
|
85
|
+
* whether `--tests <dir>` exists, whether anything is in scope — so "is there anything to check"
|
|
86
|
+
* has exactly one answer everywhere it's asked (MIL-207: don't fork the leniency logic per
|
|
87
|
+
* consumer). `includeReady` selects `IN_SCOPE_STATUSES_WITH_READY` over the MIL-207 default.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveScopedSlices(model: NormalizedModel, refs: RefsResult, baseDir: string, includeReady: boolean): ScopedSlice[];
|
|
68
90
|
/**
|
|
69
|
-
* Assemble the full coverage report: for every slice in the model, resolve its doc
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
91
|
+
* Assemble the full coverage report: for every slice in the model, resolve its doc-join/in-scope
|
|
92
|
+
* status (`resolveScopedSlices`), extract invariant IDs for in-scope slices, then scan `testsDir`
|
|
93
|
+
* once for every ID across the whole model (cheaper than one scan per slice, and citations are
|
|
94
|
+
* looked up per-slice from the single resulting map). `baseDir` is the `.em` file's directory,
|
|
95
|
+
* same convention every doc/note path in `em` uses. `includeReady` (MIL-207, default false)
|
|
96
|
+
* widens scope to also count `ready-to-implement` docs — when false (the default) and nothing in
|
|
97
|
+
* the model is `implemented` yet, `allIds` stays empty and `testsDir` is never read, so calling
|
|
98
|
+
* this with a `testsDir` that doesn't exist yet is safe in that case (see callers' leniency
|
|
99
|
+
* check via `resolveScopedSlices` before this).
|
|
75
100
|
*/
|
|
76
|
-
export declare function buildCoverageReport(model: NormalizedModel, refs: RefsResult, baseDir: string, testsDir: string): CoverageReport;
|
|
101
|
+
export declare function buildCoverageReport(model: NormalizedModel, refs: RefsResult, baseDir: string, testsDir: string, includeReady?: boolean): CoverageReport;
|
package/dist/cli/coverage.js
CHANGED
|
@@ -62,11 +62,25 @@ const OWNERSHIP_HEADING_RE = /^##\s+(?:Invariants(?:\s*\/\s*Business Rules)?|Del
|
|
|
62
62
|
* for HTML-render readability — that sub-bullet is indented, so it's already excluded here the
|
|
63
63
|
* same as any other continuation line, and never contributes (or steals) an ID. */
|
|
64
64
|
const STRUCTURAL_LINE_RE = /^(?:[-*]\s|#{3,6}\s)/;
|
|
65
|
-
/** Statuses `reference/implement.md`'s coverage gate applies to
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
|
|
65
|
+
/** Statuses `reference/implement.md`'s coverage gate applies to, by default (MIL-207). Doc
|
|
66
|
+
* ratification (`draft` -> `reviewed` -> `ready-to-implement`) is the hand-off *before*
|
|
67
|
+
* implementation, not a claim that implementing code exists yet — a `ready-to-implement` doc
|
|
68
|
+
* has, by definition, nothing to cite its invariants, so scoping the gate to it made every
|
|
69
|
+
* ratification PR fail coverage before a line of implementing code (or its test) existed
|
|
70
|
+
* (`em ci init`'s generated job, gating every PR on `main`). Scope starts at `implemented` and
|
|
71
|
+
* stays in scope forever after (tests shouldn't regress away from citing an invariant just
|
|
72
|
+
* because the slice shipped). Anything else (`draft`, `reviewed`, or no doc at all) is out of
|
|
73
|
+
* scope. */
|
|
74
|
+
const IN_SCOPE_STATUSES_DEFAULT = new Set(["implemented"]);
|
|
75
|
+
/** `--include-ready` (CLI `em coverage`; `includeReady` on the MCP `coverage` tool's input)
|
|
76
|
+
* opts back into the pre-MIL-207 scope — `ready-to-implement` docs included — for a team that
|
|
77
|
+
* wants the forward-looking report: which invariants will need a citing test once
|
|
78
|
+
* implementation starts. Never the default, since that's exactly the every-ratification-PR-
|
|
79
|
+
* is-red behavior MIL-207 fixes. */
|
|
80
|
+
const IN_SCOPE_STATUSES_WITH_READY = new Set(["ready-to-implement", "implemented"]);
|
|
81
|
+
function inScopeStatuses(includeReady) {
|
|
82
|
+
return includeReady ? IN_SCOPE_STATUSES_WITH_READY : IN_SCOPE_STATUSES_DEFAULT;
|
|
83
|
+
}
|
|
70
84
|
/**
|
|
71
85
|
* Extract every distinct `INV-*` token this slice doc *defines*, in first-occurrence order (a
|
|
72
86
|
* rule stated once in `## Invariants` and re-declared in a later `## Delta` section dedupes to
|
|
@@ -155,39 +169,62 @@ export function scanTestCitations(testsDir, ids) {
|
|
|
155
169
|
return citations;
|
|
156
170
|
}
|
|
157
171
|
/**
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* path in `em` uses.
|
|
172
|
+
* Resolve every slice's doc-join and in-scope status, without touching the test tree. Shared by
|
|
173
|
+
* `buildCoverageReport` (below) and every `--tests` consumer that needs to know, before checking
|
|
174
|
+
* whether `--tests <dir>` exists, whether anything is in scope — so "is there anything to check"
|
|
175
|
+
* has exactly one answer everywhere it's asked (MIL-207: don't fork the leniency logic per
|
|
176
|
+
* consumer). `includeReady` selects `IN_SCOPE_STATUSES_WITH_READY` over the MIL-207 default.
|
|
164
177
|
*/
|
|
165
|
-
export function
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
const slice = model.slices[i];
|
|
178
|
+
export function resolveScopedSlices(model, refs, baseDir, includeReady) {
|
|
179
|
+
const scopeStatuses = inScopeStatuses(includeReady);
|
|
180
|
+
const result = [];
|
|
181
|
+
model.slices.forEach((slice, i) => {
|
|
170
182
|
const key = refs.sliceKeys[i];
|
|
171
|
-
const { doc } = resolveSliceDocJoin(slice, key, baseDir, (id) => refs.refById.get(id));
|
|
172
|
-
|
|
183
|
+
const { doc, continuationOf: continuationOfKey } = resolveSliceDocJoin(model, refs, slice, key, baseDir, (id) => refs.refById.get(id));
|
|
184
|
+
// MIL-208: a continuation slice (an again-view-only slice with no legacy doc of its own)
|
|
185
|
+
// has nothing of its own to cite — its invariants, if any, live in the ORIGINATING slice's
|
|
186
|
+
// doc, which already gets its own entry here. Including the continuation key too would just
|
|
187
|
+
// duplicate that entry under a second key.
|
|
188
|
+
if (continuationOfKey !== null)
|
|
189
|
+
return;
|
|
190
|
+
const inScope = doc.reason === null && doc.status !== null && scopeStatuses.has(doc.status);
|
|
191
|
+
result.push({ key, status: doc.status, docReason: doc.reason, inScope, docPath: doc.path });
|
|
192
|
+
});
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Assemble the full coverage report: for every slice in the model, resolve its doc-join/in-scope
|
|
197
|
+
* status (`resolveScopedSlices`), extract invariant IDs for in-scope slices, then scan `testsDir`
|
|
198
|
+
* once for every ID across the whole model (cheaper than one scan per slice, and citations are
|
|
199
|
+
* looked up per-slice from the single resulting map). `baseDir` is the `.em` file's directory,
|
|
200
|
+
* same convention every doc/note path in `em` uses. `includeReady` (MIL-207, default false)
|
|
201
|
+
* widens scope to also count `ready-to-implement` docs — when false (the default) and nothing in
|
|
202
|
+
* the model is `implemented` yet, `allIds` stays empty and `testsDir` is never read, so calling
|
|
203
|
+
* this with a `testsDir` that doesn't exist yet is safe in that case (see callers' leniency
|
|
204
|
+
* check via `resolveScopedSlices` before this).
|
|
205
|
+
*/
|
|
206
|
+
export function buildCoverageReport(model, refs, baseDir, testsDir, includeReady = false) {
|
|
207
|
+
const scoped = resolveScopedSlices(model, refs, baseDir, includeReady);
|
|
208
|
+
const allIds = new Set();
|
|
209
|
+
const withIds = scoped.map(({ key, status, docReason, inScope, docPath }) => {
|
|
173
210
|
let ids = [];
|
|
174
211
|
if (inScope) {
|
|
175
|
-
// Re-derive the bound doc's key from
|
|
176
|
-
// — MIL-121's ratified cross-binding can resolve
|
|
212
|
+
// Re-derive the bound doc's key from docPath rather than assuming it's this slice's own
|
|
213
|
+
// — MIL-121's ratified cross-binding can resolve the doc to a DIFFERENT slice's doc, same
|
|
177
214
|
// re-derivation sliceReadyValidate.ts uses for Open Questions.
|
|
178
|
-
const boundKey =
|
|
215
|
+
const boundKey = docPath.replace(/^slices\//, "").replace(/\.md$/, "");
|
|
179
216
|
const parsed = readSliceDoc(baseDir, boundKey);
|
|
180
217
|
if (parsed)
|
|
181
218
|
ids = extractInvariantIds(parsed.body);
|
|
182
219
|
}
|
|
183
|
-
scoped.push({ key, status: doc.status, docReason: doc.reason, inScope, ids });
|
|
184
220
|
for (const id of ids)
|
|
185
221
|
allIds.add(id);
|
|
186
|
-
|
|
222
|
+
return { key, status, docReason, inScope, ids };
|
|
223
|
+
});
|
|
187
224
|
const citations = scanTestCitations(testsDir, [...allIds]);
|
|
188
225
|
let totalInvariants = 0;
|
|
189
226
|
let uncoveredCount = 0;
|
|
190
|
-
const slices =
|
|
227
|
+
const slices = withIds.map(({ key, status, docReason, inScope, ids }) => {
|
|
191
228
|
const invariants = ids.map((id) => {
|
|
192
229
|
const cs = citations.get(id) ?? [];
|
|
193
230
|
totalInvariants++;
|