@milehimikey/em 1.13.0 → 1.14.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/agents/em-critic.md +26 -0
- package/.claude/agents/em-implementer.md +34 -0
- package/.claude/agents/em-reviewer.md +31 -0
- package/.claude/agents/em-validator.md +27 -0
- package/.claude/skills/event-modeling/SKILL.md +52 -12
- package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
- package/.claude/skills/event-modeling-conform/reference/conform.md +1 -1
- package/.claude/skills/event-modeling-design/SKILL.md +140 -18
- package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
- package/.claude/skills/event-modeling-engagement/SKILL.md +192 -0
- package/.claude/skills/event-modeling-engagement/reference/engagement.md +143 -0
- package/.claude/skills/event-modeling-implement/SKILL.md +7 -4
- package/.claude/skills/event-modeling-implement/reference/implement.md +51 -12
- package/.claude/skills/event-modeling-review/SKILL.md +1 -1
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +274 -188
- package/.claude/skills/event-modeling-shared/reference/operating-principles.md +61 -0
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +116 -4
- package/.claude/skills/event-modeling-shared/templates/constitution.md +18 -1
- package/.claude/skills/event-modeling-shared/templates/slice.md +64 -39
- package/.claude/skills/event-modeling-shared/templates/state.md +5 -1
- package/.claude-plugin/marketplace.json +14 -0
- package/README.md +25 -11
- package/dist/catalog/apiFirst.d.ts +28 -0
- package/dist/catalog/apiFirst.js +49 -0
- package/dist/catalog/apiFirst.js.map +1 -0
- package/dist/catalog/docJoin.d.ts +13 -0
- package/dist/catalog/docJoin.js +11 -0
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.js +44 -4
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/invariantsValidate.d.ts +4 -0
- package/dist/catalog/invariantsValidate.js +102 -0
- package/dist/catalog/invariantsValidate.js.map +1 -0
- package/dist/catalog/scenarios.d.ts +15 -0
- package/dist/catalog/scenarios.js +97 -0
- package/dist/catalog/scenarios.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +8 -0
- package/dist/catalog/sliceDoc.js +9 -0
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +31 -4
- package/dist/catalog/sliceReadyValidate.js +66 -8
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/catalog/sliceSections.d.ts +55 -0
- package/dist/catalog/sliceSections.js +317 -0
- package/dist/catalog/sliceSections.js.map +1 -0
- package/dist/cli/agentsMd.js +7 -1
- package/dist/cli/agentsMd.js.map +1 -1
- package/dist/cli/api.d.ts +90 -0
- package/dist/cli/api.js +318 -0
- package/dist/cli/api.js.map +1 -0
- package/dist/cli/ciInit.d.ts +88 -3
- package/dist/cli/ciInit.js +507 -50
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/conformScope.d.ts +28 -0
- package/dist/cli/conformScope.js +67 -0
- package/dist/cli/conformScope.js.map +1 -1
- package/dist/cli/coverage.d.ts +25 -2
- package/dist/cli/coverage.js +86 -12
- package/dist/cli/coverage.js.map +1 -1
- package/dist/cli/engagement.d.ts +210 -0
- package/dist/cli/engagement.js +444 -0
- package/dist/cli/engagement.js.map +1 -0
- package/dist/cli/engagementFile.d.ts +86 -0
- package/dist/cli/engagementFile.js +255 -0
- package/dist/cli/engagementFile.js.map +1 -0
- package/dist/cli/metrics.d.ts +10 -0
- package/dist/cli/metrics.js +49 -1
- package/dist/cli/metrics.js.map +1 -1
- package/dist/cli/pluginPin.d.ts +55 -0
- package/dist/cli/pluginPin.js +188 -0
- package/dist/cli/pluginPin.js.map +1 -0
- package/dist/cli/ratify.d.ts +27 -2
- package/dist/cli/ratify.js +112 -13
- package/dist/cli/ratify.js.map +1 -1
- package/dist/cli/reratify.d.ts +11 -4
- package/dist/cli/reratify.js +89 -35
- package/dist/cli/reratify.js.map +1 -1
- package/dist/cli/scopeInputs.d.ts +48 -0
- package/dist/cli/scopeInputs.js +176 -0
- package/dist/cli/scopeInputs.js.map +1 -0
- package/dist/cli/skillCheck.d.ts +15 -1
- package/dist/cli/skillCheck.js +22 -1
- package/dist/cli/skillCheck.js.map +1 -1
- package/dist/cli/skillDirs.d.ts +5 -0
- package/dist/cli/skillDirs.js +13 -1
- package/dist/cli/skillDirs.js.map +1 -1
- package/dist/cli/skillSync.d.ts +4 -0
- package/dist/cli/skillSync.js +23 -0
- package/dist/cli/skillSync.js.map +1 -1
- package/dist/cli/sliceNew.d.ts +11 -7
- package/dist/cli/sliceNew.js +91 -18
- package/dist/cli/sliceNew.js.map +1 -1
- package/dist/cli/sliceSync.d.ts +50 -0
- package/dist/cli/sliceSync.js +170 -0
- package/dist/cli/sliceSync.js.map +1 -0
- package/dist/cli/status.d.ts +24 -1
- package/dist/cli/status.js +20 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/systemInputs.d.ts +53 -10
- package/dist/cli/systemInputs.js +186 -11
- package/dist/cli/systemInputs.js.map +1 -1
- package/dist/cli/upgrade.d.ts +30 -7
- package/dist/cli/upgrade.js +434 -50
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli/usageLog.d.ts +4 -2
- package/dist/cli/usageLog.js +4 -2
- package/dist/cli/usageLog.js.map +1 -1
- package/dist/cli.js +631 -100
- package/dist/cli.js.map +1 -1
- package/dist/emit/api.d.ts +29 -0
- package/dist/emit/api.js +220 -0
- package/dist/emit/api.js.map +1 -0
- package/dist/emit/apiCheckJson.d.ts +3 -0
- package/dist/emit/apiCheckJson.js +21 -0
- package/dist/emit/apiCheckJson.js.map +1 -0
- package/dist/emit/codeownersJson.d.ts +3 -0
- package/dist/emit/codeownersJson.js +19 -0
- package/dist/emit/codeownersJson.js.map +1 -0
- package/dist/emit/coverageJson.d.ts +5 -2
- package/dist/emit/coverageJson.js +6 -2
- package/dist/emit/coverageJson.js.map +1 -1
- package/dist/emit/diffJson.d.ts +1 -1
- package/dist/emit/diffJson.js +8 -1
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/engagementJson.d.ts +8 -0
- package/dist/emit/engagementJson.js +46 -0
- package/dist/emit/engagementJson.js.map +1 -0
- package/dist/emit/glossaryJson.d.ts +1 -1
- package/dist/emit/glossaryJson.js +4 -1
- package/dist/emit/glossaryJson.js.map +1 -1
- package/dist/emit/json.d.ts +17 -1
- package/dist/emit/json.js +30 -1
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/metricsJson.d.ts +1 -1
- package/dist/emit/metricsJson.js +4 -1
- package/dist/emit/metricsJson.js.map +1 -1
- package/dist/emit/queryJson.d.ts +1 -1
- package/dist/emit/queryJson.js +7 -1
- package/dist/emit/queryJson.js.map +1 -1
- package/dist/emit/scopeJson.d.ts +12 -0
- package/dist/emit/scopeJson.js +26 -0
- package/dist/emit/scopeJson.js.map +1 -0
- package/dist/emit/skillCheckJson.d.ts +3 -2
- package/dist/emit/skillCheckJson.js +10 -2
- package/dist/emit/skillCheckJson.js.map +1 -1
- package/dist/emit/statusJson.d.ts +1 -1
- package/dist/emit/statusJson.js +15 -1
- package/dist/emit/statusJson.js.map +1 -1
- package/dist/emit/systemJson.d.ts +15 -8
- package/dist/emit/systemJson.js +28 -13
- package/dist/emit/systemJson.js.map +1 -1
- package/dist/emit/upgradeJson.d.ts +1 -1
- package/dist/emit/upgradeJson.js +4 -1
- package/dist/emit/upgradeJson.js.map +1 -1
- package/dist/emit/validateJson.d.ts +3 -3
- package/dist/emit/validateJson.js +10 -4
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +186 -37
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/diff.d.ts +4 -1
- package/dist/model/diff.js +44 -8
- package/dist/model/diff.js.map +1 -1
- package/dist/model/glossary.d.ts +2 -0
- package/dist/model/glossary.js +1 -0
- package/dist/model/glossary.js.map +1 -1
- package/dist/model/model.d.ts +55 -2
- package/dist/model/model.js +57 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/qualifiedRef.d.ts +18 -0
- package/dist/model/qualifiedRef.js +26 -0
- package/dist/model/qualifiedRef.js.map +1 -1
- package/dist/model/queryIndex.d.ts +9 -1
- package/dist/model/queryIndex.js +18 -2
- package/dist/model/queryIndex.js.map +1 -1
- package/dist/model/rules.d.ts +143 -2
- package/dist/model/rules.js +162 -3
- package/dist/model/rules.js.map +1 -1
- package/dist/model/validate.d.ts +40 -0
- package/dist/model/validate.js +147 -1
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +31 -3
- package/dist/parser/parser.js +148 -14
- package/dist/parser/parser.js.map +1 -1
- package/dist/query/format.js +1 -1
- package/dist/query/format.js.map +1 -1
- package/dist/query/verbs.d.ts +6 -0
- package/dist/query/verbs.js +6 -2
- package/dist/query/verbs.js.map +1 -1
- package/dist/system/adaptation.d.ts +14 -0
- package/dist/system/adaptation.js +49 -0
- package/dist/system/adaptation.js.map +1 -0
- package/dist/system/codeowners.d.ts +77 -0
- package/dist/system/codeowners.js +242 -0
- package/dist/system/codeowners.js.map +1 -0
- package/dist/system/manifest.d.ts +10 -5
- package/dist/system/manifest.js +54 -26
- package/dist/system/manifest.js.map +1 -1
- package/dist/system/migrateManifest.d.ts +28 -0
- package/dist/system/migrateManifest.js +155 -0
- package/dist/system/migrateManifest.js.map +1 -0
- package/dist/system/scope.d.ts +46 -0
- package/dist/system/scope.js +132 -0
- package/dist/system/scope.js.map +1 -0
- package/dist/system/verify.d.ts +50 -13
- package/dist/system/verify.js +179 -58
- package/dist/system/verify.js.map +1 -1
- package/dist/templates.d.ts +2 -2
- package/dist/templates.js +23 -2
- package/dist/templates.js.map +1 -1
- package/package.json +6 -3
- package/plugin/.claude-plugin/plugin.json +18 -0
- package/plugin/agents/em-critic.md +27 -0
- package/plugin/agents/em-implementer.md +35 -0
- package/plugin/agents/em-reviewer.md +32 -0
- package/plugin/agents/em-validator.md +28 -0
- package/plugin/shared/reference/em-dsl.md +866 -0
- package/plugin/shared/reference/methodology.md +329 -0
- package/plugin/shared/reference/operating-principles.md +222 -0
- package/plugin/shared/reference/slice-doc-schema.md +566 -0
- package/plugin/shared/templates/conformance-report.md +85 -0
- package/plugin/shared/templates/constitution.md +136 -0
- package/plugin/shared/templates/model-readme.md +46 -0
- package/plugin/shared/templates/slice.md +251 -0
- package/plugin/shared/templates/state.md +77 -0
- package/plugin/skills/conform/SKILL.md +93 -0
- package/plugin/skills/conform/reference/conform.md +428 -0
- package/plugin/skills/design/SKILL.md +297 -0
- package/plugin/skills/discover/SKILL.md +90 -0
- package/plugin/skills/discover/reference/extract.md +147 -0
- package/plugin/skills/engagement/SKILL.md +193 -0
- package/plugin/skills/engagement/reference/engagement.md +144 -0
- package/plugin/skills/event-modeling/SKILL.md +132 -0
- package/plugin/skills/implement/SKILL.md +61 -0
- package/plugin/skills/implement/reference/implement.md +439 -0
- package/plugin/skills/review/SKILL.md +74 -0
- package/dist/emit/typespec.d.ts +0 -26
- package/dist/emit/typespec.js +0 -356
- package/dist/emit/typespec.js.map +0 -1
|
@@ -27,14 +27,37 @@
|
|
|
27
27
|
import { makeDiag, pushDiag } from "../model/rules.js";
|
|
28
28
|
import { resolveSliceDocJoin } from "./docJoin.js";
|
|
29
29
|
import { readSliceDoc } from "./readSliceDoc.js";
|
|
30
|
+
import { findStructuredSectionProblems } from "./sliceSections.js";
|
|
31
|
+
import { contractStatus, slicePublicTouching } from "./apiFirst.js";
|
|
32
|
+
/** MIL-238 (briefing R10): the API-first gate's diagnostic for one slice, or null when the slice
|
|
33
|
+
* touches no public element or its model's contract is current. Independent of the slice doc —
|
|
34
|
+
* the contract belongs to the model — so it is appended on every path past the unknown-key check. */
|
|
35
|
+
function contractStaleDiagnostic(model, refs, sliceIndex, sliceKey, contract) {
|
|
36
|
+
const slice = model.slices[sliceIndex];
|
|
37
|
+
if (!slicePublicTouching(slice))
|
|
38
|
+
return null;
|
|
39
|
+
const { state, contractPath } = contractStatus(model, refs, contract);
|
|
40
|
+
if (state === "current")
|
|
41
|
+
return null;
|
|
42
|
+
return makeDiag("slice-ready-contract-stale", {
|
|
43
|
+
message: `slice "${sliceKey}" touches the public surface but the contract ${contractPath} is ${state} — ` +
|
|
44
|
+
`run: em api generate ${contract.file}`,
|
|
45
|
+
line: slice.line,
|
|
46
|
+
refs: [sliceKey],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
30
49
|
/**
|
|
31
50
|
* Readiness gate for one slice, named by its export key (`refs.sliceKeys`). `baseDir` is the
|
|
32
51
|
* `.em` file's directory, same convention every other doc/note path in em uses. Always warning-
|
|
33
52
|
* severity (fits validate's existing warning-producer shape) except for a bad `sliceKey` itself,
|
|
34
53
|
* which is an error — a CLI-argument mistake, not a model-quality finding. The `--slice-ready`
|
|
35
54
|
* flag in src/cli.ts is what decides whether these warnings gate the exit code.
|
|
55
|
+
*
|
|
56
|
+
* MIL-238: `contract` (the `.em` path as given, its source and compile diagnostics) feeds the
|
|
57
|
+
* API-first gate — a public-touching slice whose model contract is missing or stale gets a
|
|
58
|
+
* `slice-ready-contract-stale` error on every path past the unknown-key check.
|
|
36
59
|
*/
|
|
37
|
-
export function validateSliceReady(model, refs, baseDir, sliceKey) {
|
|
60
|
+
export function validateSliceReady(model, refs, baseDir, sliceKey, contract) {
|
|
38
61
|
const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
|
|
39
62
|
if (sliceIndex === -1) {
|
|
40
63
|
return [
|
|
@@ -45,20 +68,22 @@ export function validateSliceReady(model, refs, baseDir, sliceKey) {
|
|
|
45
68
|
];
|
|
46
69
|
}
|
|
47
70
|
const slice = model.slices[sliceIndex];
|
|
71
|
+
const contractDiag = contractStaleDiagnostic(model, refs, sliceIndex, sliceKey, contract);
|
|
72
|
+
const withContract = (diags) => (contractDiag ? [...diags, contractDiag] : diags);
|
|
48
73
|
const { doc, diagnostics: joinDiagnostics } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
49
74
|
if (doc.reason === "no-doc-bound") {
|
|
50
|
-
return [
|
|
75
|
+
return withContract([
|
|
51
76
|
makeDiag("slice-ready-no-doc-bound", {
|
|
52
77
|
message: `slice "${sliceKey}" has no doc bound via \`note "slices/${sliceKey}.md"\` — bind a slice doc before it can be ready-to-implement`,
|
|
53
78
|
line: slice.line,
|
|
54
79
|
refs: [sliceKey],
|
|
55
80
|
}),
|
|
56
|
-
];
|
|
81
|
+
]);
|
|
57
82
|
}
|
|
58
83
|
if (doc.reason === "binding-missing-file" || doc.reason === "frontmatter-invalid") {
|
|
59
84
|
// Reuse docJoin's own diagnostics verbatim — don't re-code binding-missing-file/
|
|
60
85
|
// frontmatter-invalid a second time under a slice-ready-specific code.
|
|
61
|
-
return joinDiagnostics;
|
|
86
|
+
return withContract(joinDiagnostics);
|
|
62
87
|
}
|
|
63
88
|
// doc.reason === null: found, usable frontmatter.
|
|
64
89
|
const diags = [];
|
|
@@ -69,6 +94,18 @@ export function validateSliceReady(model, refs, baseDir, sliceKey) {
|
|
|
69
94
|
refs: [sliceKey],
|
|
70
95
|
});
|
|
71
96
|
}
|
|
97
|
+
// MIL-259: a ready-to-implement doc must carry a recorded sign-off. `em slice reratify`
|
|
98
|
+
// clears `ratifiedBy` and bumps `version`, leaving `status: ready-to-implement` in place until
|
|
99
|
+
// someone re-signs — without this check that unsigned state read as ready. Only checked when
|
|
100
|
+
// the status IS ready-to-implement: any other status already blocks via the diagnostic above,
|
|
101
|
+
// and a second "not ratified" finding there would just be noise.
|
|
102
|
+
if (doc.status === "ready-to-implement" && !doc.ratifiedBy) {
|
|
103
|
+
pushDiag(diags, "slice-ready-not-ratified", {
|
|
104
|
+
message: `slice "${sliceKey}" is ready-to-implement but carries no ratifiedBy — record the sign-off with \`em slice ratify --by <name>\``,
|
|
105
|
+
line: slice.line,
|
|
106
|
+
refs: [sliceKey],
|
|
107
|
+
});
|
|
108
|
+
}
|
|
72
109
|
// resolveSliceDocJoin's SliceDocExport deliberately never carries Open Questions counts (same
|
|
73
110
|
// hard boundary that keeps doc.html/doc.raw out of it) — re-read via readSliceDoc for the
|
|
74
111
|
// full SliceDoc. Non-null: doc.reason === null already implies the file exists and parses.
|
|
@@ -85,18 +122,31 @@ export function validateSliceReady(model, refs, baseDir, sliceKey) {
|
|
|
85
122
|
refs: [sliceKey],
|
|
86
123
|
});
|
|
87
124
|
}
|
|
88
|
-
|
|
125
|
+
// MIL-266: the `--slice-ready` twin of `slice-doc/structured-section-malformed` — a generated
|
|
126
|
+
// region whose markers don't balance or whose table header drifted from the template, or a
|
|
127
|
+
// `### Scenario:` block missing Given/When/Then, is not a spec an implementer can read
|
|
128
|
+
// mechanically. Diagnostic-only blocker: `gates` gains no boolean (the scoped diagnostics are
|
|
129
|
+
// what drive `ready`). Silent on a doc with no markers and no `### Scenario:` heading.
|
|
130
|
+
for (const problem of findStructuredSectionProblems(parsed.body)) {
|
|
131
|
+
pushDiag(diags, "slice-ready-structured-section-malformed", {
|
|
132
|
+
message: `slice "${sliceKey}"'s doc ${doc.path}: ${problem}`,
|
|
133
|
+
line: slice.line,
|
|
134
|
+
refs: [sliceKey],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return withContract(diags);
|
|
89
138
|
}
|
|
90
|
-
export function computeSliceReadyGates(model, refs, baseDir, sliceKey) {
|
|
139
|
+
export function computeSliceReadyGates(model, refs, baseDir, sliceKey, contract) {
|
|
91
140
|
const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
|
|
92
141
|
if (sliceIndex === -1)
|
|
93
142
|
return null;
|
|
94
143
|
const slice = model.slices[sliceIndex];
|
|
144
|
+
const contractCurrent = !slicePublicTouching(slice) || contractStatus(model, refs, contract).state === "current";
|
|
95
145
|
const { doc, continuationOf } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
96
146
|
const docBound = doc.reason !== "no-doc-bound";
|
|
97
147
|
const frontmatterUsable = doc.reason === null;
|
|
98
148
|
if (!frontmatterUsable) {
|
|
99
|
-
return { gates: { docBound, frontmatterUsable, statusReady: false, noUncheckedOpenQuestions: false }, continuationOf };
|
|
149
|
+
return { gates: { docBound, frontmatterUsable, statusReady: false, noUncheckedOpenQuestions: false, ratified: false, contractCurrent }, continuationOf };
|
|
100
150
|
}
|
|
101
151
|
const statusReady = doc.status === "ready-to-implement";
|
|
102
152
|
// Same re-derivation of the bound key from doc.path as validateSliceReady above — see its
|
|
@@ -104,6 +154,14 @@ export function computeSliceReadyGates(model, refs, baseDir, sliceKey) {
|
|
|
104
154
|
const boundKey = doc.path.replace(/^slices\//, "").replace(/\.md$/, "");
|
|
105
155
|
const parsed = readSliceDoc(baseDir, boundKey);
|
|
106
156
|
const noUncheckedOpenQuestions = parsed.openQuestionsUnchecked === 0;
|
|
107
|
-
|
|
157
|
+
const ratified = !!doc.ratifiedBy;
|
|
158
|
+
return { gates: { docBound, frontmatterUsable, statusReady, noUncheckedOpenQuestions, ratified, contractCurrent }, continuationOf };
|
|
159
|
+
}
|
|
160
|
+
export function computeSliceReadiness(model, refs, baseDir, sliceKey, contract, allDiagnostics) {
|
|
161
|
+
const readyDiagnostics = validateSliceReady(model, refs, baseDir, sliceKey, contract);
|
|
162
|
+
const combined = [...allDiagnostics, ...readyDiagnostics];
|
|
163
|
+
const scoped = combined.filter((d) => d.refs?.some((r) => r === sliceKey || r.startsWith(`${sliceKey}/`)));
|
|
164
|
+
const result = computeSliceReadyGates(model, refs, baseDir, sliceKey, contract);
|
|
165
|
+
return { scoped, ready: scoped.length === 0, result };
|
|
108
166
|
}
|
|
109
167
|
//# 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;AAKlF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sliceReadyValidate.js","sourceRoot":"","sources":["../../src/catalog/sliceReadyValidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { NormalizedModel } from "../model/model.js";
|
|
2
|
+
export declare const SLICE_REGION_PREFIX = "em-slice-";
|
|
3
|
+
export type RegionKind = "command" | "event" | "view" | "invariants";
|
|
4
|
+
/** The template's table header for each element kind's generated field table — the exact
|
|
5
|
+
* header `slice-doc/structured-section-malformed` compares a region's table against. */
|
|
6
|
+
export declare const REGION_TABLE_HEADERS: Record<"command" | "event" | "view", readonly string[]>;
|
|
7
|
+
/** Trailing prose on every region's start marker line — preserved verbatim by `em slice sync`. */
|
|
8
|
+
export declare const REGION_START_NOTE = "generated from the model by `em slice sync`; do not hand-edit";
|
|
9
|
+
/** The comment `em slice new` and the template put right after the Invariants region. */
|
|
10
|
+
export declare const INVARIANTS_ELABORATE_COMMENT = "<!-- elaborate below this list; IDs are declared in the model -->";
|
|
11
|
+
export interface GeneratedRegion {
|
|
12
|
+
name: string;
|
|
13
|
+
kind: RegionKind;
|
|
14
|
+
/** Body lines, without the marker lines and without EOLs. */
|
|
15
|
+
body: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function regionStartLine(name: string): string;
|
|
18
|
+
export declare function regionEndLine(name: string): string;
|
|
19
|
+
/** The region kind a region name belongs to, or null for a name outside the vocabulary. */
|
|
20
|
+
export declare function regionKindOf(name: string): RegionKind | null;
|
|
21
|
+
/**
|
|
22
|
+
* The generated regions a doc bound to `sliceIndices` (one slice, or the union a MIL-121
|
|
23
|
+
* cross-covered doc / a MIL-208 continuation resolves to) should carry, in template order:
|
|
24
|
+
* commands, events, views, invariants. Elements are taken in slice order then declaration
|
|
25
|
+
* order; a repeated view (`again`) contributes only its first instance, and two elements of one
|
|
26
|
+
* kind with the same slug only the first.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildSliceRegions(model: NormalizedModel, sliceIndices: number[]): GeneratedRegion[];
|
|
29
|
+
/** The template's placeholder regions — what `em slice new` writes when it has no model to fill
|
|
30
|
+
* them from (no `--wire`). `em slice sync` fills them once the doc is bound. */
|
|
31
|
+
export declare function placeholderRegions(): GeneratedRegion[];
|
|
32
|
+
export interface RegionSpan {
|
|
33
|
+
name: string;
|
|
34
|
+
/** Offset of the first byte AFTER the start marker line's text (its EOL starts here). */
|
|
35
|
+
innerStart: number;
|
|
36
|
+
/** Offset of the first byte of the end marker line. */
|
|
37
|
+
innerEnd: number;
|
|
38
|
+
/** The text between the two marker lines, without the EOL that ends the start line and the
|
|
39
|
+
* EOL before the end line — the region's body. */
|
|
40
|
+
body: string;
|
|
41
|
+
}
|
|
42
|
+
export interface RegionScan {
|
|
43
|
+
regions: RegionSpan[];
|
|
44
|
+
/** Balance problems; when non-empty, `regions` must not be rewritten. */
|
|
45
|
+
problems: string[];
|
|
46
|
+
}
|
|
47
|
+
/** Find every `em-slice-*` region in `text` (a whole doc or its body), checking that markers are
|
|
48
|
+
* balanced: every start has its end, no region opens inside another, and no name repeats. */
|
|
49
|
+
export declare function scanSliceRegions(text: string): RegionScan;
|
|
50
|
+
/**
|
|
51
|
+
* Every structural problem in a slice doc's generated regions and authored scenarios — the facts
|
|
52
|
+
* behind `slice-doc/structured-section-malformed` and its `--slice-ready` twin. Empty for a doc
|
|
53
|
+
* with no `em-slice-*` markers and no `### Scenario:` blocks (every 1.13-style doc).
|
|
54
|
+
*/
|
|
55
|
+
export declare function findStructuredSectionProblems(body: string): string[];
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Generated regions of a slice doc (MIL-266): the parts of `slices/<key>.md` that restate the
|
|
3
|
+
// model — each command's field table, each event's payload table, each read model's field table,
|
|
4
|
+
// and the slice's model-declared invariants — become marker-delimited regions whose bodies `em`
|
|
5
|
+
// writes from the `.em` and keeps in step (`em slice new` fills them, `em slice sync` refreshes
|
|
6
|
+
// them in place). Every other section stays authored and is never touched.
|
|
7
|
+
//
|
|
8
|
+
// <!-- GENERATED:em-slice-command:start — … -->
|
|
9
|
+
// **Command:** `Submit Order`
|
|
10
|
+
//
|
|
11
|
+
// | Field | Type | Required | Rules / Validation |
|
|
12
|
+
// …
|
|
13
|
+
// <!-- GENERATED:em-slice-command:end -->
|
|
14
|
+
//
|
|
15
|
+
// Region names: `em-slice-command`, `em-slice-event`, `em-slice-view`, `em-slice-invariants`.
|
|
16
|
+
// When a slice (or the union of slices a doc is bound to) has several elements of one kind, each
|
|
17
|
+
// gets its own region, suffixed with the element's kebab slug (`em-slice-event-order-placed`).
|
|
18
|
+
// A kind with no element still gets its one un-suffixed region, holding a one-line "none" note,
|
|
19
|
+
// so adding the first element to the model later is a plain `em slice sync`.
|
|
20
|
+
//
|
|
21
|
+
// The `**Command:**` / `**Event:**` / `- **View:**` marker lines sit INSIDE the regions, so
|
|
22
|
+
// catalog/docModelConsistencyValidate.ts keeps reading them exactly as before.
|
|
23
|
+
//
|
|
24
|
+
// Pure: model in, region bodies (as line arrays, EOL-free) out; doc text in, regions/problems
|
|
25
|
+
// out. The CLI (`em slice new`, cli/sliceSync.ts) owns every read and write.
|
|
26
|
+
import { normalizeName } from "../model/model.js";
|
|
27
|
+
import { kebabSlug } from "../util/slug.js";
|
|
28
|
+
import { parseScenarios } from "./scenarios.js";
|
|
29
|
+
export const SLICE_REGION_PREFIX = "em-slice-";
|
|
30
|
+
/** The template's table header for each element kind's generated field table — the exact
|
|
31
|
+
* header `slice-doc/structured-section-malformed` compares a region's table against. */
|
|
32
|
+
export const REGION_TABLE_HEADERS = {
|
|
33
|
+
command: ["Field", "Type", "Required", "Rules / Validation"],
|
|
34
|
+
event: ["Field", "Type", "Immutable Fact?", "Source / Notes"],
|
|
35
|
+
view: ["Field", "Type", "Source / Notes"],
|
|
36
|
+
};
|
|
37
|
+
/** Trailing prose on every region's start marker line — preserved verbatim by `em slice sync`. */
|
|
38
|
+
export const REGION_START_NOTE = "generated from the model by `em slice sync`; do not hand-edit";
|
|
39
|
+
/** The comment `em slice new` and the template put right after the Invariants region. */
|
|
40
|
+
export const INVARIANTS_ELABORATE_COMMENT = "<!-- elaborate below this list; IDs are declared in the model -->";
|
|
41
|
+
export function regionStartLine(name) {
|
|
42
|
+
return `<!-- GENERATED:${name}:start — ${REGION_START_NOTE} -->`;
|
|
43
|
+
}
|
|
44
|
+
export function regionEndLine(name) {
|
|
45
|
+
return `<!-- GENERATED:${name}:end -->`;
|
|
46
|
+
}
|
|
47
|
+
/** The region kind a region name belongs to, or null for a name outside the vocabulary. */
|
|
48
|
+
export function regionKindOf(name) {
|
|
49
|
+
const m = /^em-slice-(command|event|view|invariants)(?:-[a-z0-9]+(?:-[a-z0-9]+)*)?$/.exec(name);
|
|
50
|
+
if (!m)
|
|
51
|
+
return null;
|
|
52
|
+
if (m[1] === "invariants" && name !== "em-slice-invariants")
|
|
53
|
+
return null;
|
|
54
|
+
return m[1];
|
|
55
|
+
}
|
|
56
|
+
function cell(text) {
|
|
57
|
+
return text.replace(/\|/g, "\\|");
|
|
58
|
+
}
|
|
59
|
+
function tableHeader(kind) {
|
|
60
|
+
const cols = REGION_TABLE_HEADERS[kind];
|
|
61
|
+
return [`| ${cols.join(" | ")} |`, `|${cols.map((c) => "-".repeat(c.length + 2)).join("|")}|`];
|
|
62
|
+
}
|
|
63
|
+
const NO_FIELDS = "_No fields declared in the model._";
|
|
64
|
+
function commandBody(_model, el) {
|
|
65
|
+
const out = [`**Command:** \`${el.name}\``, ""];
|
|
66
|
+
if (!el.fields || el.fields.length === 0)
|
|
67
|
+
return [...out, NO_FIELDS];
|
|
68
|
+
out.push(...tableHeader("command"));
|
|
69
|
+
for (const f of el.fields) {
|
|
70
|
+
const notes = [];
|
|
71
|
+
if (f.renamedFrom && f.renamedFrom.length > 0)
|
|
72
|
+
notes.push(`renamed from ${f.renamedFrom.map((n) => `"${n}"`).join(", ")}`);
|
|
73
|
+
out.push(`| ${cell(f.name)} | ${cell(f.type ?? "—")} | ${f.optional === true ? "no" : "yes"} | ${cell(notes.join("; ") || "—")} |`);
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
function eventBody(model, el) {
|
|
78
|
+
const head = el.context ? `**Event:** \`${el.name}\` → context \`${el.context}\`` : `**Event:** \`${el.name}\``;
|
|
79
|
+
const out = [head, ""];
|
|
80
|
+
if (!el.fields || el.fields.length === 0)
|
|
81
|
+
return [...out, NO_FIELDS];
|
|
82
|
+
out.push(...tableHeader("event"));
|
|
83
|
+
const commands = model.slices[el.sliceIndex].elements.filter((e) => e.kind === "command");
|
|
84
|
+
for (const f of el.fields) {
|
|
85
|
+
const notes = [];
|
|
86
|
+
if (f.assigned === true) {
|
|
87
|
+
notes.push("assigned (set by the handler)");
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const src = commands.find((c) => (c.fields ?? []).some((cf) => normalizeName(cf.name) === normalizeName(f.name)));
|
|
91
|
+
notes.push(src ? `from command \`${src.name}\`` : "{{ }}");
|
|
92
|
+
}
|
|
93
|
+
if (f.tag === true)
|
|
94
|
+
notes.push("identity tag");
|
|
95
|
+
if (f.optional === true)
|
|
96
|
+
notes.push("optional");
|
|
97
|
+
if (f.renamedFrom && f.renamedFrom.length > 0)
|
|
98
|
+
notes.push(`renamed from ${f.renamedFrom.map((n) => `"${n}"`).join(", ")}`);
|
|
99
|
+
out.push(`| ${cell(f.name)} | ${cell(f.type ?? "—")} | yes | ${cell(notes.join("; "))} |`);
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
function viewBody(model, el) {
|
|
104
|
+
const sources = el.from ?? [];
|
|
105
|
+
const built = sources.length > 0 ? sources.map((s) => `"${s}"`).join(", ") : "—";
|
|
106
|
+
const out = [`- **View:** \`${el.name}\` built from events: ${built}`, ""];
|
|
107
|
+
if (!el.fields || el.fields.length === 0)
|
|
108
|
+
return [...out, NO_FIELDS];
|
|
109
|
+
out.push(...tableHeader("view"));
|
|
110
|
+
const sourceEvents = [];
|
|
111
|
+
for (const s of sources) {
|
|
112
|
+
const ev = (model.byName.get(normalizeName(s)) ?? []).find((e) => e.kind === "event");
|
|
113
|
+
if (ev)
|
|
114
|
+
sourceEvents.push(ev);
|
|
115
|
+
}
|
|
116
|
+
for (const f of el.fields) {
|
|
117
|
+
let note;
|
|
118
|
+
if (f.derived === true) {
|
|
119
|
+
note = f.derivedFrom && f.derivedFrom.length > 0 ? `Derived from ${f.derivedFrom.map((n) => `"${n}"`).join(", ")}` : "Derived";
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const src = sourceEvents.find((ev) => (ev.fields ?? []).some((ef) => normalizeName(ef.name) === normalizeName(f.name)));
|
|
123
|
+
note = src ? `from event \`${src.name}\`` : "{{ }}";
|
|
124
|
+
}
|
|
125
|
+
out.push(`| ${cell(f.name)} | ${cell(f.type ?? "—")} | ${cell(note)} |`);
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
function noneBody(kind) {
|
|
130
|
+
const word = kind === "view" ? "read model" : kind;
|
|
131
|
+
return [`_This slice has no ${word} in the model._`];
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The generated regions a doc bound to `sliceIndices` (one slice, or the union a MIL-121
|
|
135
|
+
* cross-covered doc / a MIL-208 continuation resolves to) should carry, in template order:
|
|
136
|
+
* commands, events, views, invariants. Elements are taken in slice order then declaration
|
|
137
|
+
* order; a repeated view (`again`) contributes only its first instance, and two elements of one
|
|
138
|
+
* kind with the same slug only the first.
|
|
139
|
+
*/
|
|
140
|
+
export function buildSliceRegions(model, sliceIndices) {
|
|
141
|
+
const ordered = [...sliceIndices].sort((a, b) => a - b);
|
|
142
|
+
const elements = [];
|
|
143
|
+
for (const i of ordered)
|
|
144
|
+
elements.push(...model.slices[i].elements);
|
|
145
|
+
const regions = [];
|
|
146
|
+
for (const kind of ["command", "event", "view"]) {
|
|
147
|
+
const seenLogical = new Set();
|
|
148
|
+
const seenSlug = new Set();
|
|
149
|
+
const els = [];
|
|
150
|
+
for (const el of elements) {
|
|
151
|
+
if (el.kind !== kind)
|
|
152
|
+
continue;
|
|
153
|
+
if (seenLogical.has(el.logicalId))
|
|
154
|
+
continue;
|
|
155
|
+
seenLogical.add(el.logicalId);
|
|
156
|
+
const s = kebabSlug(el.name);
|
|
157
|
+
if (seenSlug.has(s))
|
|
158
|
+
continue;
|
|
159
|
+
seenSlug.add(s);
|
|
160
|
+
els.push(el);
|
|
161
|
+
}
|
|
162
|
+
const build = kind === "command" ? commandBody : kind === "event" ? eventBody : viewBody;
|
|
163
|
+
if (els.length === 0) {
|
|
164
|
+
regions.push({ name: `${SLICE_REGION_PREFIX}${kind}`, kind, body: noneBody(kind) });
|
|
165
|
+
}
|
|
166
|
+
else if (els.length === 1) {
|
|
167
|
+
regions.push({ name: `${SLICE_REGION_PREFIX}${kind}`, kind, body: build(model, els[0]) });
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
for (const el of els)
|
|
171
|
+
regions.push({ name: `${SLICE_REGION_PREFIX}${kind}-${kebabSlug(el.name)}`, kind, body: build(model, el) });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const invLines = [];
|
|
175
|
+
for (const el of elements) {
|
|
176
|
+
if (el.kind !== "command" && el.kind !== "event")
|
|
177
|
+
continue;
|
|
178
|
+
for (const inv of el.invariants ?? []) {
|
|
179
|
+
// `**INV-X**` + an em-dash — deliberately NOT the `**INV-X:**` declaring label
|
|
180
|
+
// (invariants/declared-in-both): the model declares the ID, this list only restates it.
|
|
181
|
+
invLines.push(inv.rule ? `- **${inv.id}** — ${inv.rule}` : `- **${inv.id}**`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
regions.push({
|
|
185
|
+
name: `${SLICE_REGION_PREFIX}invariants`,
|
|
186
|
+
kind: "invariants",
|
|
187
|
+
body: invLines.length > 0 ? invLines : ["_No invariants declared in the model._"],
|
|
188
|
+
});
|
|
189
|
+
return regions;
|
|
190
|
+
}
|
|
191
|
+
/** The template's placeholder regions — what `em slice new` writes when it has no model to fill
|
|
192
|
+
* them from (no `--wire`). `em slice sync` fills them once the doc is bound. */
|
|
193
|
+
export function placeholderRegions() {
|
|
194
|
+
return [
|
|
195
|
+
{
|
|
196
|
+
name: "em-slice-command",
|
|
197
|
+
kind: "command",
|
|
198
|
+
body: [
|
|
199
|
+
"**Command:** `{{Command Name}}`",
|
|
200
|
+
"",
|
|
201
|
+
...tableHeader("command"),
|
|
202
|
+
"| {{field}} | {{Type}} | {{yes/no}} | {{constraints, formats, ranges}} |",
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "em-slice-event",
|
|
207
|
+
kind: "event",
|
|
208
|
+
body: [
|
|
209
|
+
"**Event:** `{{Event Name}}` → context `{{Context}}`",
|
|
210
|
+
"",
|
|
211
|
+
...tableHeader("event"),
|
|
212
|
+
"| {{field}} | {{Type}} | {{yes/no}} | {{where the value comes from}} |",
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "em-slice-view",
|
|
217
|
+
kind: "view",
|
|
218
|
+
body: [
|
|
219
|
+
'- **View:** `{{View Name}}` built from events: {{"Event A", "Event B"}}',
|
|
220
|
+
"",
|
|
221
|
+
...tableHeader("view"),
|
|
222
|
+
"| {{field}} | {{Type}} | {{which event field it's copied from, or `Derived: <rule>`}} |",
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: "em-slice-invariants",
|
|
227
|
+
kind: "invariants",
|
|
228
|
+
body: ['- **INV-{{MNEMONIC}}-1** — {{rule, as declared by `invariant INV-{{MNEMONIC}}-1 "rule"` in the model}}'],
|
|
229
|
+
},
|
|
230
|
+
];
|
|
231
|
+
}
|
|
232
|
+
const MARKER_LINE_RE = /^<!-- GENERATED:(em-slice-[A-Za-z0-9-]+):(start|end)\b[^\r\n]*$/gm;
|
|
233
|
+
/** Find every `em-slice-*` region in `text` (a whole doc or its body), checking that markers are
|
|
234
|
+
* balanced: every start has its end, no region opens inside another, and no name repeats. */
|
|
235
|
+
export function scanSliceRegions(text) {
|
|
236
|
+
const regions = [];
|
|
237
|
+
const problems = [];
|
|
238
|
+
const seen = new Set();
|
|
239
|
+
let open = null;
|
|
240
|
+
for (const m of text.matchAll(MARKER_LINE_RE)) {
|
|
241
|
+
const name = m[1];
|
|
242
|
+
const which = m[2];
|
|
243
|
+
const lineStart = m.index;
|
|
244
|
+
if (which === "start") {
|
|
245
|
+
if (open) {
|
|
246
|
+
problems.push(`region "${name}" starts inside region "${open.name}" (no end marker for "${open.name}" before it)`);
|
|
247
|
+
open = null;
|
|
248
|
+
}
|
|
249
|
+
if (seen.has(name))
|
|
250
|
+
problems.push(`region "${name}" appears more than once`);
|
|
251
|
+
seen.add(name);
|
|
252
|
+
if (regionKindOf(name) === null)
|
|
253
|
+
problems.push(`region "${name}" is not a known generated region (em-slice-command|event|view[-<slug>], em-slice-invariants)`);
|
|
254
|
+
open = { name, innerStart: lineStart + m[0].length };
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
if (!open) {
|
|
258
|
+
problems.push(`end marker for region "${name}" has no start marker`);
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (open.name !== name) {
|
|
262
|
+
problems.push(`region "${open.name}" is closed by the end marker of "${name}"`);
|
|
263
|
+
open = null;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
const raw = text.slice(open.innerStart, lineStart);
|
|
267
|
+
const body = raw.replace(/^\r?\n/, "").replace(/\r?\n$/, "");
|
|
268
|
+
regions.push({ name, innerStart: open.innerStart, innerEnd: lineStart, body });
|
|
269
|
+
open = null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (open)
|
|
273
|
+
problems.push(`region "${open.name}" has no end marker`);
|
|
274
|
+
return { regions, problems };
|
|
275
|
+
}
|
|
276
|
+
function splitCells(line) {
|
|
277
|
+
return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((c) => c.trim());
|
|
278
|
+
}
|
|
279
|
+
/** A field-table region's header problem, or null when its first table's header matches the
|
|
280
|
+
* template's (or the region holds no table at all — an element with no fields). */
|
|
281
|
+
function tableHeaderProblem(region) {
|
|
282
|
+
const kind = regionKindOf(region.name);
|
|
283
|
+
if (kind === null || kind === "invariants")
|
|
284
|
+
return null;
|
|
285
|
+
const lines = region.body.split(/\r?\n/);
|
|
286
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
287
|
+
if (!/^\s*\|/.test(lines[i]) || !/^\s*\|/.test(lines[i + 1]))
|
|
288
|
+
continue;
|
|
289
|
+
if (!splitCells(lines[i + 1]).every((c) => /^:?-+:?$/.test(c)))
|
|
290
|
+
continue;
|
|
291
|
+
const got = splitCells(lines[i]);
|
|
292
|
+
const want = REGION_TABLE_HEADERS[kind];
|
|
293
|
+
if (got.length === want.length && got.every((c, j) => c === want[j]))
|
|
294
|
+
return null;
|
|
295
|
+
return `region "${region.name}"'s table header is "| ${got.join(" | ")} |" — expected "| ${want.join(" | ")} |"`;
|
|
296
|
+
}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Every structural problem in a slice doc's generated regions and authored scenarios — the facts
|
|
301
|
+
* behind `slice-doc/structured-section-malformed` and its `--slice-ready` twin. Empty for a doc
|
|
302
|
+
* with no `em-slice-*` markers and no `### Scenario:` blocks (every 1.13-style doc).
|
|
303
|
+
*/
|
|
304
|
+
export function findStructuredSectionProblems(body) {
|
|
305
|
+
const scan = scanSliceRegions(body);
|
|
306
|
+
const problems = [...scan.problems];
|
|
307
|
+
if (scan.problems.length === 0) {
|
|
308
|
+
for (const region of scan.regions) {
|
|
309
|
+
const p = tableHeaderProblem(region);
|
|
310
|
+
if (p)
|
|
311
|
+
problems.push(p);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
problems.push(...parseScenarios(body).problems);
|
|
315
|
+
return problems;
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=sliceSections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sliceSections.js","sourceRoot":"","sources":["../../src/catalog/sliceSections.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/agentsMd.js
CHANGED
|
@@ -46,7 +46,13 @@ agent — Claude Code or otherwise — should follow this contract:
|
|
|
46
46
|
- **MCP alternative**: \`em-mcp\` starts a stateless stdio MCP server exposing the contract,
|
|
47
47
|
gate, and read path above (plus full validate/export) as tools instead of shell commands —
|
|
48
48
|
every tool mirrors a CLI \`--json\` surface byte-for-byte. Handshake and full tool list:
|
|
49
|
-
[docs/mcp.md](https://github.com/milehimikey/em/blob/main/docs/mcp.md)
|
|
49
|
+
[docs/mcp.md](https://github.com/milehimikey/em/blob/main/docs/mcp.md).
|
|
50
|
+
- **Skills (Claude Code)**: the em plugin provides \`/em:event-modeling\` (router),
|
|
51
|
+
\`/em:discover\`, \`/em:design\`, \`/em:implement\`, \`/em:conform\`, and \`/em:review\`. It is pinned
|
|
52
|
+
in \`.claude/settings.json\`; register it once per machine with
|
|
53
|
+
\`claude plugin marketplace add milehimikey/em@v<version> --scope project\` then
|
|
54
|
+
\`claude plugin install em@em-<version-with-dashes> --scope project\` (\`<version>\` is the em
|
|
55
|
+
release pinned in \`.claude/settings.json\`, e.g. \`1.14.0\` and \`em-1-14-0\`).`;
|
|
50
56
|
function markerBlock() {
|
|
51
57
|
return `<!-- GENERATED:${AGENTS_MD_MARKER}:start -->\n${SECTION_BODY}\n<!-- GENERATED:${AGENTS_MD_MARKER}:end -->`;
|
|
52
58
|
}
|
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,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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;mFA0B8D,CAAC;AAEpF,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"}
|