@milehimikey/em 1.17.0 → 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 +1 -1
- 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 +8 -3
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +8 -0
- package/.claude/skills/event-modeling-review/SKILL.md +1 -1
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +90 -5
- package/.claude/skills/event-modeling-shared/reference/methodology.md +268 -0
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +96 -2
- package/.claude/skills/event-modeling-shared/templates/slice.md +11 -3
- package/.claude-plugin/marketplace.json +2 -2
- 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/sliceReadyValidate.d.ts +8 -0
- package/dist/catalog/sliceReadyValidate.js +35 -3
- 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 +28 -0
- package/dist/cli/defer.js +87 -4
- package/dist/cli/defer.js.map +1 -1
- package/dist/cli/engagement.d.ts +2 -2
- package/dist/cli/engagement.js +24 -1
- package/dist/cli/engagement.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/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 +2 -0
- package/dist/cli/revise.js +7 -2
- 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/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 +21 -1
- package/dist/cli/status.js +25 -3
- 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 +426 -7
- 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 +286 -29
- 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 +1 -1
- package/dist/emit/engagementJson.js +3 -1
- package/dist/emit/engagementJson.js.map +1 -1
- package/dist/emit/json.d.ts +21 -1
- package/dist/emit/json.js +26 -2
- package/dist/emit/json.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/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 +36 -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 +46 -11
- 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 +149 -0
- package/dist/model/rules.js +144 -0
- 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 +2 -0
- package/dist/parser/lexer.js +4 -0
- 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 +90 -5
- package/plugin/shared/reference/methodology.md +268 -0
- package/plugin/shared/reference/slice-doc-schema.md +96 -2
- package/plugin/shared/templates/slice.md +11 -3
- package/plugin/skills/conform/SKILL.md +1 -1
- 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 +8 -3
- package/plugin/skills/event-modeling/SKILL.md +1 -1
- package/plugin/skills/implement/SKILL.md +1 -1
- package/plugin/skills/implement/reference/implement.md +8 -0
- package/plugin/skills/review/SKILL.md +1 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// The optional ratifier roster (GH #259): `ratifiers.yaml` beside the model — a host-supplied list
|
|
3
|
+
// of who may sign slice docs. File absent = em behaves exactly as before (any non-empty name);
|
|
4
|
+
// file present = `em slice ratify --by` / `em slice review --by` refuse a name the roster does not
|
|
5
|
+
// permit for the slice's context(s), and `em validate --slice-ready` reports a hand-edited
|
|
6
|
+
// `ratifiedBy` that is not on it (`ratified-by-not-in-roster`).
|
|
7
|
+
//
|
|
8
|
+
// Placement follows `system.yaml`: the nearest `ratifiers.yaml` walking up from the model's
|
|
9
|
+
// directory to the repo root, so one roster can serve several models; an explicit path overrides.
|
|
10
|
+
// Pure parsing (`parseRoster`) is separate from filesystem discovery (`loadRoster`).
|
|
11
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
12
|
+
import { dirname, join, normalize, resolve, sep } from "node:path";
|
|
13
|
+
import { LineCounter, parseDocument, isMap, isSeq, isScalar } from "yaml";
|
|
14
|
+
import { normalizeName } from "../model/model.js";
|
|
15
|
+
import { computeModelKey } from "../model/qualifiedRef.js";
|
|
16
|
+
import { pushDiag } from "../model/rules.js";
|
|
17
|
+
export const ROSTER_FILE = "ratifiers.yaml";
|
|
18
|
+
export const ROSTER_SCHEMA_VERSION = "1.0";
|
|
19
|
+
/** em's own migration marker (`em upgrade`'s `ratified-signoff`), not a signer: exempt from roster checks. */
|
|
20
|
+
export const GRANDFATHERED_RATIFIER = "grandfathered (unsigned before em 1.14)";
|
|
21
|
+
/** Exempt only the exact marker AND only on a doc with no `ratifiedHash` (the state `em upgrade`
|
|
22
|
+
* leaves it in): a forged "grandfathered by X" or a marker on a hash-bearing doc is a signer and is checked. */
|
|
23
|
+
export function isGrandfatheredSignoff(name, ratifiedHash) {
|
|
24
|
+
return !!name && name === GRANDFATHERED_RATIFIER && !ratifiedHash;
|
|
25
|
+
}
|
|
26
|
+
const TOP_KEYS = new Set(["rosterSchemaVersion", "ratifiers", "reviewers"]);
|
|
27
|
+
const ENTRY_KEYS = new Set(["name", "contexts", "models"]);
|
|
28
|
+
function scalarString(node) {
|
|
29
|
+
return isScalar(node) && typeof node.value === "string" ? node.value : undefined;
|
|
30
|
+
}
|
|
31
|
+
export function normalizeContext(c) {
|
|
32
|
+
return c.trim().replace(/^@/, "");
|
|
33
|
+
}
|
|
34
|
+
/** Parse and shape-check roster text. Every problem is a `roster-invalid` error (never a throw);
|
|
35
|
+
* `ok: false` means the roster cannot be used, and callers refuse rather than fall back to open. */
|
|
36
|
+
export function parseRoster(text) {
|
|
37
|
+
const diagnostics = [];
|
|
38
|
+
const lc = new LineCounter();
|
|
39
|
+
const doc = parseDocument(text, { lineCounter: lc, prettyErrors: false });
|
|
40
|
+
const lineOf = (n) => {
|
|
41
|
+
const range = n && "range" in n ? n.range : n && "key" in n ? n.key?.range : undefined;
|
|
42
|
+
return range ? lc.linePos(range[0]).line : undefined;
|
|
43
|
+
};
|
|
44
|
+
const invalid = (message, line) => pushDiag(diagnostics, "roster-invalid", { message, line });
|
|
45
|
+
if (doc.errors.length > 0) {
|
|
46
|
+
for (const e of doc.errors)
|
|
47
|
+
invalid(`YAML parse error: ${e.message.trim()}`, e.linePos?.[0]?.line);
|
|
48
|
+
return { ok: false, diagnostics };
|
|
49
|
+
}
|
|
50
|
+
const root = doc.contents;
|
|
51
|
+
if (!isMap(root)) {
|
|
52
|
+
invalid("roster must be a YAML mapping with `rosterSchemaVersion` and `ratifiers` and/or `reviewers`");
|
|
53
|
+
return { ok: false, diagnostics };
|
|
54
|
+
}
|
|
55
|
+
const versionNode = root.get("rosterSchemaVersion", true);
|
|
56
|
+
const version = scalarString(versionNode);
|
|
57
|
+
if (version === undefined) {
|
|
58
|
+
invalid(`missing or non-string \`rosterSchemaVersion\` — set \`rosterSchemaVersion: "${ROSTER_SCHEMA_VERSION}"\``, lineOf(versionNode));
|
|
59
|
+
}
|
|
60
|
+
else if (version !== ROSTER_SCHEMA_VERSION) {
|
|
61
|
+
invalid(`unsupported rosterSchemaVersion "${version}" — this em accepts "${ROSTER_SCHEMA_VERSION}"`, lineOf(versionNode));
|
|
62
|
+
}
|
|
63
|
+
for (const pair of root.items) {
|
|
64
|
+
const key = scalarString(pair.key);
|
|
65
|
+
if (key === undefined || !TOP_KEYS.has(key)) {
|
|
66
|
+
invalid(`unknown top-level key ${JSON.stringify(key ?? "?")} — expected one of: ${[...TOP_KEYS].join(", ")}`, lineOf(pair));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const readList = (key) => {
|
|
70
|
+
const node = root.get(key, true);
|
|
71
|
+
if (node === undefined)
|
|
72
|
+
return null;
|
|
73
|
+
if (!isSeq(node) || node.items.length === 0) {
|
|
74
|
+
invalid(`\`${key}\` must be a non-empty list of { name, contexts? } entries (omit the key to leave it unrestricted)`, lineOf(node));
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const out = [];
|
|
78
|
+
for (const item of node.items) {
|
|
79
|
+
if (!isMap(item)) {
|
|
80
|
+
invalid(`\`${key}\` entries must be mappings with a \`name\` (and optional \`contexts\`)`, lineOf(item));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
for (const p of item.items) {
|
|
84
|
+
const k = scalarString(p.key);
|
|
85
|
+
if (k === undefined || !ENTRY_KEYS.has(k))
|
|
86
|
+
invalid(`${key}: unknown key ${JSON.stringify(k ?? "?")} — expected name, contexts, models`, lineOf(p));
|
|
87
|
+
}
|
|
88
|
+
const name = scalarString(item.get("name", true));
|
|
89
|
+
if (name === undefined || name.trim() === "") {
|
|
90
|
+
invalid(`${key}: every entry needs a non-empty string \`name\``, lineOf(item));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const ctxNode = item.get("contexts", true);
|
|
94
|
+
let contexts = null;
|
|
95
|
+
if (ctxNode !== undefined) {
|
|
96
|
+
const names = isSeq(ctxNode) ? ctxNode.items.map((i) => scalarString(i)) : [];
|
|
97
|
+
if (!isSeq(ctxNode) || names.length === 0 || names.some((n) => n === undefined || n.trim() === "")) {
|
|
98
|
+
invalid(`${key}: "${name}": \`contexts\` must be a non-empty list of context names (omit it for the whole model)`, lineOf(ctxNode));
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
contexts = names.map(normalizeContext);
|
|
102
|
+
}
|
|
103
|
+
const modelsNode = item.get("models", true);
|
|
104
|
+
let models = null;
|
|
105
|
+
if (modelsNode !== undefined) {
|
|
106
|
+
const keys = isSeq(modelsNode) ? modelsNode.items.map((i) => scalarString(i)) : [];
|
|
107
|
+
if (!isSeq(modelsNode) || keys.length === 0 || keys.some((n) => n === undefined || n.trim() === "")) {
|
|
108
|
+
invalid(`${key}: "${name}": \`models\` must be a non-empty list of model keys (omit it to apply to every model)`, lineOf(modelsNode));
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
models = keys.map((k) => k.trim());
|
|
112
|
+
}
|
|
113
|
+
out.push({ name: name.trim(), contexts, models });
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
};
|
|
117
|
+
const ratifiers = readList("ratifiers");
|
|
118
|
+
const reviewers = readList("reviewers");
|
|
119
|
+
if (root.get("ratifiers", true) === undefined && root.get("reviewers", true) === undefined) {
|
|
120
|
+
invalid("a roster needs `ratifiers:` and/or `reviewers:`");
|
|
121
|
+
}
|
|
122
|
+
if (diagnostics.length > 0)
|
|
123
|
+
return { ok: false, diagnostics };
|
|
124
|
+
return { ok: true, roster: { rosterSchemaVersion: version, ratifiers, reviewers } };
|
|
125
|
+
}
|
|
126
|
+
/** The nearest `ratifiers.yaml` walking up from `startDir`, stopping at the nearest directory that
|
|
127
|
+
* holds `.git` (a directory or a file) or at the filesystem root. When no `.git` exists anywhere
|
|
128
|
+
* above, only `startDir` itself is searched -- without a repo root there is no principled place
|
|
129
|
+
* to stop, and a roster in some unrelated parent must not govern the model. */
|
|
130
|
+
export function findRosterAbove(startDir) {
|
|
131
|
+
let hasGit = false;
|
|
132
|
+
for (let d = safeReal(resolve(startDir));;) {
|
|
133
|
+
if (existsSync(join(d, ".git"))) {
|
|
134
|
+
hasGit = true;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
const p = dirname(d);
|
|
138
|
+
if (p === d)
|
|
139
|
+
break;
|
|
140
|
+
d = p;
|
|
141
|
+
}
|
|
142
|
+
let dir = startDir;
|
|
143
|
+
let abs = safeReal(resolve(dir));
|
|
144
|
+
for (;;) {
|
|
145
|
+
const candidate = join(dir, ROSTER_FILE);
|
|
146
|
+
if (existsSync(candidate))
|
|
147
|
+
return normalize(candidate).split(sep).join("/");
|
|
148
|
+
if (!hasGit || existsSync(join(abs, ".git")))
|
|
149
|
+
return null;
|
|
150
|
+
const parent = dirname(abs);
|
|
151
|
+
if (parent === abs)
|
|
152
|
+
return null;
|
|
153
|
+
abs = parent;
|
|
154
|
+
dir = join(dir, "..");
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function safeReal(p) {
|
|
158
|
+
try {
|
|
159
|
+
return realpathSync(p);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return p;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** Discover (or take an explicit `override` path) and parse the roster for a model in `baseDir`.
|
|
166
|
+
* An explicit path that does not exist is `invalid` — asking for a roster and not finding it must
|
|
167
|
+
* not silently mean "no roster". */
|
|
168
|
+
export function loadRoster(baseDir, override, modelCtx) {
|
|
169
|
+
let path;
|
|
170
|
+
if (override !== undefined) {
|
|
171
|
+
path = override;
|
|
172
|
+
if (!existsSync(path)) {
|
|
173
|
+
const diagnostics = [];
|
|
174
|
+
pushDiag(diagnostics, "roster-invalid", { message: `roster file ${path} does not exist` });
|
|
175
|
+
return { state: "invalid", path, diagnostics };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
path = findRosterAbove(baseDir);
|
|
180
|
+
if (path === null)
|
|
181
|
+
return { state: "absent" };
|
|
182
|
+
}
|
|
183
|
+
const parsed = parseRoster(readFileSync(path, "utf8"));
|
|
184
|
+
if (!parsed.ok)
|
|
185
|
+
return { state: "invalid", path, diagnostics: parsed.diagnostics };
|
|
186
|
+
if (modelCtx) {
|
|
187
|
+
const problems = validateRosterForModel(parsed.roster, modelCtx);
|
|
188
|
+
if (problems.length > 0)
|
|
189
|
+
return { state: "invalid", path, diagnostics: problems };
|
|
190
|
+
}
|
|
191
|
+
return { state: "present", path, roster: parsed.roster };
|
|
192
|
+
}
|
|
193
|
+
export function rosterModelContext(model, file, systemModelKeys) {
|
|
194
|
+
return { model, modelKey: computeModelKey(model, file), systemModelKeys };
|
|
195
|
+
}
|
|
196
|
+
/** `roster-invalid` for a `contexts:` entry the model does not declare (case-sensitive) -- checked
|
|
197
|
+
* only for entries that apply to this model -- and for a `models:` key the enclosing system does
|
|
198
|
+
* not have. */
|
|
199
|
+
export function validateRosterForModel(roster, ctx) {
|
|
200
|
+
const diagnostics = [];
|
|
201
|
+
for (const role of ["ratifiers", "reviewers"]) {
|
|
202
|
+
for (const e of roster[role] ?? []) {
|
|
203
|
+
if (e.models && ctx.systemModelKeys) {
|
|
204
|
+
for (const k of e.models) {
|
|
205
|
+
if (!ctx.systemModelKeys.includes(k)) {
|
|
206
|
+
pushDiag(diagnostics, "roster-invalid", { message: `${role}: "${e.name}": \`models\` names "${k}", which is not a model of the system (${ctx.systemModelKeys.join(", ")})` });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (!appliesToModel(e, ctx.modelKey) || !e.contexts)
|
|
211
|
+
continue;
|
|
212
|
+
for (const c of e.contexts) {
|
|
213
|
+
if (!ctx.model.contexts.includes(c)) {
|
|
214
|
+
pushDiag(diagnostics, "roster-invalid", {
|
|
215
|
+
message: `${role}: "${e.name}": unknown context "${c}" for model "${ctx.modelKey}" (declared: ${ctx.model.contexts.join(", ")})`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return diagnostics;
|
|
222
|
+
}
|
|
223
|
+
function appliesToModel(e, modelKey) {
|
|
224
|
+
return e.models === null || modelKey === undefined || e.models.includes(modelKey);
|
|
225
|
+
}
|
|
226
|
+
/** The contexts of a slice: those of its events, plus those of the events ITS OWN views read (each
|
|
227
|
+
* view instance's own `from`, not a union across the read model's instances - so adding a later
|
|
228
|
+
* instance never changes an earlier slice's contexts). A continuation slice (only `again` views)
|
|
229
|
+
* additionally takes the originating instance's own `from`. A slice with neither has none. */
|
|
230
|
+
export function sliceContexts(model, sliceIndex) {
|
|
231
|
+
const out = [];
|
|
232
|
+
const add = (c) => {
|
|
233
|
+
if (c && !out.includes(c))
|
|
234
|
+
out.push(c);
|
|
235
|
+
};
|
|
236
|
+
const slice = model.slices[sliceIndex];
|
|
237
|
+
for (const el of slice?.elements ?? [])
|
|
238
|
+
if (el.kind === "event")
|
|
239
|
+
add(el.context);
|
|
240
|
+
const byName = new Map();
|
|
241
|
+
for (const s of model.slices) {
|
|
242
|
+
for (const el of s.elements) {
|
|
243
|
+
if (el.kind !== "event" || !el.context)
|
|
244
|
+
continue;
|
|
245
|
+
const k = normalizeName(el.name);
|
|
246
|
+
byName.set(k, [...(byName.get(k) ?? []), el.context]);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const addFrom = (from) => {
|
|
250
|
+
for (const f of from ?? [])
|
|
251
|
+
for (const c of byName.get(normalizeName(f)) ?? [])
|
|
252
|
+
add(c);
|
|
253
|
+
};
|
|
254
|
+
const elements = slice?.elements ?? [];
|
|
255
|
+
const nonUi = elements.filter((e) => e.kind !== "ui");
|
|
256
|
+
const isContinuation = nonUi.length > 0 && nonUi.every((e) => e.kind === "view" && e.again === true);
|
|
257
|
+
for (const el of elements) {
|
|
258
|
+
if (el.kind !== "view")
|
|
259
|
+
continue;
|
|
260
|
+
addFrom(el.from);
|
|
261
|
+
if (isContinuation)
|
|
262
|
+
addFrom(model.byId.get(el.logicalId)?.from);
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
/** An entry permits a slice when it applies to the model and either carries no `contexts` or lists
|
|
267
|
+
* EVERY context of the slice. A slice with no context of its own is permitted only by entries
|
|
268
|
+
* without `contexts`. */
|
|
269
|
+
function permits(entry, contexts, modelKey) {
|
|
270
|
+
if (!appliesToModel(entry, modelKey))
|
|
271
|
+
return false;
|
|
272
|
+
if (entry.contexts === null)
|
|
273
|
+
return true;
|
|
274
|
+
return contexts.length > 0 && contexts.every((c) => entry.contexts.includes(normalizeContext(c)));
|
|
275
|
+
}
|
|
276
|
+
/** `null` = allowed (including: this role is unrestricted). Otherwise the refusal text. */
|
|
277
|
+
export function rosterRefusal(roster, role, name, contexts, modelKey) {
|
|
278
|
+
const list = roster[role];
|
|
279
|
+
if (list === null)
|
|
280
|
+
return null;
|
|
281
|
+
const trimmed = name.trim();
|
|
282
|
+
if (list.some((e) => e.name === trimmed && permits(e, contexts, modelKey)))
|
|
283
|
+
return null;
|
|
284
|
+
const permitted = [...new Set(list.filter((e) => permits(e, contexts, modelKey)).map((e) => e.name))];
|
|
285
|
+
const where = contexts.length > 0 ? `context ${contexts.join(" + ")}` : "this slice";
|
|
286
|
+
const who = permitted.length > 0 ? `permitted: ${permitted.join(", ")}` : "nobody is permitted for it";
|
|
287
|
+
return `"${trimmed}" is not on the ${role} roster for ${where} (${who})`;
|
|
288
|
+
}
|
|
289
|
+
/** Resolve a roster check for a CLI/MCP write path: `null` = proceed, else the refusal message. */
|
|
290
|
+
export function checkRosterForWrite(loaded, role, name, model, sliceIndex, modelKey) {
|
|
291
|
+
if (loaded.state === "absent")
|
|
292
|
+
return null;
|
|
293
|
+
if (loaded.state === "invalid")
|
|
294
|
+
return `roster ${loaded.path} is invalid — ${loaded.diagnostics.map((d) => d.message).join("; ")}`;
|
|
295
|
+
const msg = rosterRefusal(loaded.roster, role, name, sliceContexts(model, sliceIndex), modelKey);
|
|
296
|
+
return msg === null ? null : `${msg} — roster: ${loaded.path}`;
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=roster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../../src/roster/roster.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "em",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0",
|
|
4
4
|
"description": "Event Modeling with em: discover, design, implement, conform, review and engagement skills over a slice-first text DSL, plus the em MCP server.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mike Key"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"command": "npx",
|
|
11
11
|
"args": [
|
|
12
12
|
"-y",
|
|
13
|
-
"@milehimikey/em@1.
|
|
13
|
+
"@milehimikey/em@1.18.0",
|
|
14
14
|
"mcp"
|
|
15
15
|
]
|
|
16
16
|
}
|