@milehimikey/em 1.8.1 → 1.9.1

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.
Files changed (105) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +58 -404
  2. package/.claude/skills/event-modeling-conform/SKILL.md +77 -0
  3. package/.claude/skills/{event-modeling → event-modeling-conform}/reference/conform.md +40 -14
  4. package/.claude/skills/event-modeling-design/SKILL.md +139 -0
  5. package/.claude/skills/event-modeling-discover/SKILL.md +89 -0
  6. package/.claude/skills/{event-modeling → event-modeling-discover}/reference/extract.md +3 -2
  7. package/.claude/skills/event-modeling-implement/SKILL.md +40 -0
  8. package/.claude/skills/{event-modeling → event-modeling-implement}/reference/implement.md +3 -2
  9. package/.claude/skills/event-modeling-review/SKILL.md +58 -0
  10. package/.claude/skills/{event-modeling → event-modeling-shared}/reference/em-dsl.md +115 -83
  11. package/.claude/skills/{event-modeling → event-modeling-shared}/reference/methodology.md +6 -5
  12. package/.claude/skills/event-modeling-shared/reference/operating-principles.md +150 -0
  13. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +381 -0
  14. package/.claude/skills/{event-modeling → event-modeling-shared}/templates/model-readme.md +2 -2
  15. package/.claude/skills/{event-modeling → event-modeling-shared}/templates/slice.md +57 -14
  16. package/README.md +24 -4
  17. package/dist/catalog/build.js +9 -0
  18. package/dist/catalog/build.js.map +1 -1
  19. package/dist/catalog/docJoin.d.ts +15 -0
  20. package/dist/catalog/docJoin.js +8 -0
  21. package/dist/catalog/docJoin.js.map +1 -1
  22. package/dist/catalog/modelCollisionValidate.d.ts +22 -0
  23. package/dist/catalog/modelCollisionValidate.js +67 -0
  24. package/dist/catalog/modelCollisionValidate.js.map +1 -0
  25. package/dist/catalog/orphanedSliceDocValidate.d.ts +11 -0
  26. package/dist/catalog/orphanedSliceDocValidate.js +98 -0
  27. package/dist/catalog/orphanedSliceDocValidate.js.map +1 -0
  28. package/dist/catalog/sliceDoc.d.ts +15 -0
  29. package/dist/catalog/sliceDoc.js +18 -0
  30. package/dist/catalog/sliceDoc.js.map +1 -1
  31. package/dist/cli/changelogBuild.d.ts +12 -0
  32. package/dist/cli/changelogBuild.js +89 -0
  33. package/dist/cli/changelogBuild.js.map +1 -0
  34. package/dist/cli/ciInit.d.ts +42 -0
  35. package/dist/cli/ciInit.js +298 -0
  36. package/dist/cli/ciInit.js.map +1 -0
  37. package/dist/cli/conformSupersede.d.ts +32 -0
  38. package/dist/cli/conformSupersede.js +102 -0
  39. package/dist/cli/conformSupersede.js.map +1 -0
  40. package/dist/cli/coverage.d.ts +6 -1
  41. package/dist/cli/coverage.js +28 -3
  42. package/dist/cli/coverage.js.map +1 -1
  43. package/dist/cli/frontmatterSurgery.d.ts +28 -0
  44. package/dist/cli/frontmatterSurgery.js +66 -0
  45. package/dist/cli/frontmatterSurgery.js.map +1 -0
  46. package/dist/cli/markImplemented.js +6 -45
  47. package/dist/cli/markImplemented.js.map +1 -1
  48. package/dist/cli/ratify.d.ts +41 -0
  49. package/dist/cli/ratify.js +151 -0
  50. package/dist/cli/ratify.js.map +1 -0
  51. package/dist/cli/reratify.d.ts +33 -0
  52. package/dist/cli/reratify.js +137 -0
  53. package/dist/cli/reratify.js.map +1 -0
  54. package/dist/cli/skillCheck.d.ts +6 -0
  55. package/dist/cli/skillCheck.js +46 -0
  56. package/dist/cli/skillCheck.js.map +1 -1
  57. package/dist/cli/skillDirs.d.ts +15 -0
  58. package/dist/cli/skillDirs.js +34 -0
  59. package/dist/cli/skillDirs.js.map +1 -0
  60. package/dist/cli/skillSync.d.ts +10 -0
  61. package/dist/cli/skillSync.js +15 -0
  62. package/dist/cli/skillSync.js.map +1 -1
  63. package/dist/cli/sliceIndex.d.ts +3 -0
  64. package/dist/cli/sliceIndex.js +6 -2
  65. package/dist/cli/sliceIndex.js.map +1 -1
  66. package/dist/cli/sliceLink.d.ts +52 -0
  67. package/dist/cli/sliceLink.js +152 -0
  68. package/dist/cli/sliceLink.js.map +1 -0
  69. package/dist/cli/status.d.ts +261 -0
  70. package/dist/cli/status.js +536 -0
  71. package/dist/cli/status.js.map +1 -0
  72. package/dist/cli/usageLog.d.ts +75 -0
  73. package/dist/cli/usageLog.js +193 -0
  74. package/dist/cli/usageLog.js.map +1 -0
  75. package/dist/cli.js +503 -132
  76. package/dist/cli.js.map +1 -1
  77. package/dist/emit/freshnessJson.d.ts +6 -0
  78. package/dist/emit/freshnessJson.js +24 -0
  79. package/dist/emit/freshnessJson.js.map +1 -0
  80. package/dist/emit/json.d.ts +62 -8
  81. package/dist/emit/json.js +14 -3
  82. package/dist/emit/json.js.map +1 -1
  83. package/dist/emit/statusJson.d.ts +7 -0
  84. package/dist/emit/statusJson.js +39 -0
  85. package/dist/emit/statusJson.js.map +1 -0
  86. package/dist/emit/typespec.d.ts +26 -0
  87. package/dist/emit/typespec.js +356 -0
  88. package/dist/emit/typespec.js.map +1 -0
  89. package/dist/emit/usageReportJson.d.ts +3 -0
  90. package/dist/emit/usageReportJson.js +23 -0
  91. package/dist/emit/usageReportJson.js.map +1 -0
  92. package/dist/mcp/server.d.ts +1 -1
  93. package/dist/mcp/server.js +301 -11
  94. package/dist/mcp/server.js.map +1 -1
  95. package/dist/model/rules.d.ts +13 -0
  96. package/dist/model/rules.js +20 -0
  97. package/dist/model/rules.js.map +1 -1
  98. package/dist/templates.d.ts +1 -1
  99. package/dist/templates.js +2 -2
  100. package/dist/util/markers.d.ts +16 -4
  101. package/dist/util/markers.js +23 -10
  102. package/dist/util/markers.js.map +1 -1
  103. package/package.json +2 -1
  104. /package/.claude/skills/{event-modeling → event-modeling-shared}/templates/conformance-report.md +0 -0
  105. /package/.claude/skills/{event-modeling → event-modeling-shared}/templates/state.md +0 -0
@@ -0,0 +1,193 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // `em state log-usage` / `em usage-report` (MIL-161 finding #2): mechanizes the two
3
+ // hand-maintained halves of docs/usage-data.md's Usage log convention.
4
+ //
5
+ // - WRITE (`em state log-usage`, `appendUsageLogEntry` below): every session currently ends
6
+ // with the agent running `em validate --json`, pulling each diagnostic's `usageCategory`,
7
+ // deduping by hand, and hand-formatting one line into the exact
8
+ // `- YYYY-MM-DD: phases: X, Y — validate: A, B` shape docs/usage-data.md#categories requires
9
+ // verbatim. docs/usage-data.md:48-50 names the failure mode this replaces: two sessions
10
+ // writing "read model with no source" vs. "read model has no source" for the same rule
11
+ // silently split one count into two in aggregation. Deriving `phases`/categories from actual
12
+ // tool output instead of free recall, and writing the line with one canonical formatter,
13
+ // removes the chance of that drift entirely.
14
+ //
15
+ // - READ (`em usage-report`, `aggregateUsageReport`/`parseUsageLogSection` below): replaces
16
+ // docs/usage-data.md#aggregating-across-models-for-a-retro's hand-rolled `grep`/`awk`/`sort`
17
+ // pipeline (with its documented `LC_ALL=C` + UTF-8 em-dash caveat) with a plain, locale-
18
+ // independent parse over every `.event-modeling.md` under a root directory. A logged line
19
+ // that doesn't match the canonical format (hand-authored before this command existed, or
20
+ // edited by hand since) is surfaced in `unparseableLines` rather than silently mistallied or
21
+ // silently dropped — the same "never guess, report the uncertainty" posture the rest of `em`
22
+ // holds for anything it can't parse cleanly.
23
+ //
24
+ // Deliberately its own module, not folded into stateFile.ts: that module's header explicitly
25
+ // scopes itself to the six MECHANICAL top bullets, calling the Usage log (like the Decisions
26
+ // log, Open questions, ...) "agent-authored prose and out of scope here." This module's write
27
+ // side stays true to that spirit — it only ever APPENDS one new, fully-formed line; it never
28
+ // edits, re-reads, or reformats an existing one, so a hand-authored history predating this
29
+ // command is left exactly as it was written.
30
+ import { basename } from "node:path";
31
+ import { PHASES, STATE_FILE_NAME } from "./stateFile.js";
32
+ import { walkDir } from "../util/walkDir.js";
33
+ /** The Usage log's phase vocabulary (docs/usage-data.md#what-s-captured-and-where): the state
34
+ * file's own `Current phase:` enum (`stateFile.ts`'s `PHASES`) plus `watch` — a live-viewing
35
+ * activity a session can touch without ever being a `Current phase:` value itself (see
36
+ * `stateFile.ts`'s own comment on why `watch` is deliberately excluded there). Order here is
37
+ * the canonical sort order `log-usage` writes phases in, matching docs/usage-data.md's own
38
+ * listing order. */
39
+ export const USAGE_PHASES = [...PHASES, "watch"];
40
+ export function isUsagePhase(value) {
41
+ return USAGE_PHASES.includes(value);
42
+ }
43
+ /** Dedupe and sort a `--phases` list into `USAGE_PHASES`' own canonical order (matching
44
+ * docs/usage-data.md's own listing order) rather than input order or alphabetical — so two
45
+ * sessions naming the same phases in a different order always log an identical line. */
46
+ export function sortUsagePhases(phases) {
47
+ const order = USAGE_PHASES;
48
+ return [...new Set(phases)].sort((a, b) => order.indexOf(a) - order.indexOf(b));
49
+ }
50
+ const USAGE_LOG_HEADING_RE = /^## Usage log[ \t]*\r?\n/m;
51
+ /** Locate the "## Usage log" section's body span within a state file's text: `[bodyStart,
52
+ * bodyEnd)` covers everything between the heading line and the next `## ` heading (or
53
+ * end-of-file). `null` if the file has no such heading at all. Plain substring search for the
54
+ * next heading (not a second regex) — every heading in `templates/state.md` is `## <Title>`,
55
+ * so `"\n## "` is an exact, unambiguous anchor. */
56
+ function findUsageLogSection(text) {
57
+ const headingMatch = USAGE_LOG_HEADING_RE.exec(text);
58
+ if (!headingMatch)
59
+ return null;
60
+ const bodyStart = headingMatch.index + headingMatch[0].length;
61
+ const nextIdx = text.indexOf("\n## ", bodyStart);
62
+ const bodyEnd = nextIdx === -1 ? text.length : nextIdx + 1; // +1: keep pointing at the '#'
63
+ return { bodyStart, bodyEnd };
64
+ }
65
+ /** Format one Usage log bullet line — the ONE place this exact shape is generated, so
66
+ * `log-usage`'s writer and any future caller never drift from `usage-report`'s parser. */
67
+ export function formatUsageLogLine(date, phases, categories) {
68
+ return `- ${date}: phases: ${phases.join(", ")} — validate: ${categories.join(", ")}`;
69
+ }
70
+ /**
71
+ * Append one Usage log bullet to `text`'s "## Usage log" section — after whatever's already
72
+ * there (the guidance comment, and/or prior bullets), never editing or reordering existing
73
+ * content. `phases`/`categories` are trusted already-deduped, already-sorted, non-empty arrays
74
+ * (the CLI layer owns that — see `sortByCanonicalOrder`/dedup below); `categories` is `["none"]`
75
+ * when nothing fired. Fails (without writing anything) if the file has no "## Usage log"
76
+ * heading at all — same "refuse rather than guess where it goes" discipline
77
+ * `stateFile.ts`'s `applyBulletUpdates` uses for a missing mechanical bullet.
78
+ */
79
+ export function appendUsageLogEntry(text, date, phases, categories) {
80
+ const section = findUsageLogSection(text);
81
+ if (!section)
82
+ return { ok: false, message: 'missing "## Usage log" section' };
83
+ const { bodyStart, bodyEnd } = section;
84
+ const body = text.slice(bodyStart, bodyEnd);
85
+ const trimmed = body.replace(/[ \t\r\n]+$/, "");
86
+ const trailing = body.slice(trimmed.length) || "\n\n";
87
+ const prefix = trimmed.length > 0 ? `${trimmed}\n` : "";
88
+ const newBody = prefix + formatUsageLogLine(date, phases, categories) + trailing;
89
+ return { ok: true, text: text.slice(0, bodyStart) + newBody + text.slice(bodyEnd) };
90
+ }
91
+ const USAGE_LOG_LINE_RE = /^-\s+(\d{4}-\d{2}-\d{2}):\s*phases:\s*(.+?)\s*—\s*validate:\s*(.+?)\s*$/;
92
+ /**
93
+ * Parse every `- YYYY-MM-DD: phases: ... — validate: ...` bullet out of `text`'s "## Usage log"
94
+ * section. A line that starts with `- ` inside the section but doesn't match the canonical shape
95
+ * (hand-edited, or written before `log-usage` existed) is returned in `malformed` verbatim
96
+ * rather than silently skipped or force-fit — `usage-report` surfaces these so a stale/foreign
97
+ * format is visible, not invisibly under-counted. Lines that are just the guidance comment (or
98
+ * blank) are ignored entirely — only an actual `- ` bullet attempt counts as malformed.
99
+ */
100
+ export function parseUsageLogSection(text) {
101
+ const section = findUsageLogSection(text);
102
+ if (!section)
103
+ return { entries: [], malformed: [] };
104
+ const body = text.slice(section.bodyStart, section.bodyEnd);
105
+ const entries = [];
106
+ const malformed = [];
107
+ for (const rawLine of body.split(/\r?\n/)) {
108
+ const line = rawLine.trim();
109
+ if (!line.startsWith("- "))
110
+ continue;
111
+ const m = USAGE_LOG_LINE_RE.exec(line);
112
+ if (!m) {
113
+ malformed.push(line);
114
+ continue;
115
+ }
116
+ entries.push({
117
+ date: m[1],
118
+ phases: m[2].split(",").map((s) => s.trim()).filter((s) => s.length > 0),
119
+ categories: m[3].split(",").map((s) => s.trim()).filter((s) => s.length > 0),
120
+ });
121
+ }
122
+ return { entries, malformed };
123
+ }
124
+ /** Every `.event-modeling.md` under `root`, recursively, as paths relative to `root` — sorted,
125
+ * POSIX forward slashes (see `walkDir`). Prunes VCS/dependency directories a repo-wide sweep
126
+ * should never descend into. */
127
+ export function findStateFiles(root) {
128
+ return walkDir(root, { skipDir: (name) => name === "node_modules" || name === ".git" }).filter((relPath) => basename(relPath) === STATE_FILE_NAME);
129
+ }
130
+ /** Sort by count descending, ties broken alphabetically — deterministic regardless of Map
131
+ * insertion order (which itself depends on file-walk/parse order). */
132
+ function sortCounts(counts) {
133
+ return [...counts.entries()]
134
+ .map(([key, count]) => ({ key, count }))
135
+ .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));
136
+ }
137
+ /** Aggregate every input file's Usage log into one report — pure, no I/O; the CLI layer resolves
138
+ * `entries` first (`findStateFiles` + a plain read per file). `root` is carried through only
139
+ * for the report's own labeling, never used to re-derive `files`. */
140
+ export function aggregateUsageReport(root, entries) {
141
+ const phaseCounts = new Map();
142
+ const categoryCounts = new Map();
143
+ const unparseableLines = [];
144
+ let sessions = 0;
145
+ for (const { file, text } of entries) {
146
+ const { entries: logEntries, malformed } = parseUsageLogSection(text);
147
+ for (const line of malformed)
148
+ unparseableLines.push({ file, line });
149
+ for (const entry of logEntries) {
150
+ sessions++;
151
+ for (const p of entry.phases)
152
+ phaseCounts.set(p, (phaseCounts.get(p) ?? 0) + 1);
153
+ for (const c of entry.categories) {
154
+ if (c === "none")
155
+ continue;
156
+ categoryCounts.set(c, (categoryCounts.get(c) ?? 0) + 1);
157
+ }
158
+ }
159
+ }
160
+ return {
161
+ root,
162
+ files: entries.map((e) => e.file).sort(),
163
+ sessions,
164
+ phaseCounts: sortCounts(phaseCounts),
165
+ categoryCounts: sortCounts(categoryCounts),
166
+ unparseableLines,
167
+ };
168
+ }
169
+ /** Text report: a one-line summary, then a phase tally and a category tally, each empty-aware. */
170
+ export function formatUsageReportText(report) {
171
+ const lines = [];
172
+ lines.push(`${report.files.length} state file(s) under ${report.root}, ${report.sessions} logged session(s)`);
173
+ lines.push("");
174
+ lines.push("Phases touched:");
175
+ if (report.phaseCounts.length === 0)
176
+ lines.push(" (none logged)");
177
+ for (const { key, count } of report.phaseCounts)
178
+ lines.push(` ${count}\t${key}`);
179
+ lines.push("");
180
+ lines.push("Validate diagnostic categories hit:");
181
+ if (report.categoryCounts.length === 0)
182
+ lines.push(" (none logged)");
183
+ for (const { key, count } of report.categoryCounts)
184
+ lines.push(` ${count}\t${key}`);
185
+ if (report.unparseableLines.length > 0) {
186
+ lines.push("");
187
+ lines.push(`${report.unparseableLines.length} line(s) didn't match the canonical format (not counted above):`);
188
+ for (const { file, line } of report.unparseableLines)
189
+ lines.push(` ${file}: ${line}`);
190
+ }
191
+ return lines.join("\n");
192
+ }
193
+ //# sourceMappingURL=usageLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageLog.js","sourceRoot":"","sources":["../../src/cli/usageLog.ts"],"names":[],"mappings":"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"}