@milehimikey/em 1.13.1 → 1.14.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 (235) hide show
  1. package/.claude/agents/em-critic.md +26 -0
  2. package/.claude/agents/em-implementer.md +34 -0
  3. package/.claude/agents/em-reviewer.md +31 -0
  4. package/.claude/agents/em-validator.md +27 -0
  5. package/.claude/skills/event-modeling/SKILL.md +50 -11
  6. package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
  7. package/.claude/skills/event-modeling-design/SKILL.md +127 -18
  8. package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
  9. package/.claude/skills/event-modeling-engagement/SKILL.md +192 -0
  10. package/.claude/skills/event-modeling-engagement/reference/engagement.md +143 -0
  11. package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
  12. package/.claude/skills/event-modeling-implement/reference/implement.md +38 -11
  13. package/.claude/skills/event-modeling-review/SKILL.md +2 -2
  14. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +279 -189
  15. package/.claude/skills/event-modeling-shared/reference/operating-principles.md +61 -0
  16. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +116 -5
  17. package/.claude/skills/event-modeling-shared/templates/constitution.md +18 -1
  18. package/.claude/skills/event-modeling-shared/templates/slice.md +64 -39
  19. package/.claude/skills/event-modeling-shared/templates/state.md +5 -1
  20. package/.claude-plugin/marketplace.json +14 -0
  21. package/README.md +25 -11
  22. package/dist/catalog/apiFirst.d.ts +28 -0
  23. package/dist/catalog/apiFirst.js +49 -0
  24. package/dist/catalog/apiFirst.js.map +1 -0
  25. package/dist/catalog/docJoin.d.ts +13 -0
  26. package/dist/catalog/docJoin.js +11 -0
  27. package/dist/catalog/docJoin.js.map +1 -1
  28. package/dist/catalog/docModelConsistencyValidate.js +44 -4
  29. package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
  30. package/dist/catalog/invariantsValidate.d.ts +4 -0
  31. package/dist/catalog/invariantsValidate.js +102 -0
  32. package/dist/catalog/invariantsValidate.js.map +1 -0
  33. package/dist/catalog/scenarios.d.ts +15 -0
  34. package/dist/catalog/scenarios.js +97 -0
  35. package/dist/catalog/scenarios.js.map +1 -0
  36. package/dist/catalog/sliceDoc.d.ts +8 -0
  37. package/dist/catalog/sliceDoc.js +9 -0
  38. package/dist/catalog/sliceDoc.js.map +1 -1
  39. package/dist/catalog/sliceReadyValidate.d.ts +31 -4
  40. package/dist/catalog/sliceReadyValidate.js +66 -8
  41. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  42. package/dist/catalog/sliceSections.d.ts +55 -0
  43. package/dist/catalog/sliceSections.js +317 -0
  44. package/dist/catalog/sliceSections.js.map +1 -0
  45. package/dist/cli/agentsMd.js +7 -1
  46. package/dist/cli/agentsMd.js.map +1 -1
  47. package/dist/cli/api.d.ts +90 -0
  48. package/dist/cli/api.js +318 -0
  49. package/dist/cli/api.js.map +1 -0
  50. package/dist/cli/ciInit.d.ts +82 -21
  51. package/dist/cli/ciInit.js +468 -64
  52. package/dist/cli/ciInit.js.map +1 -1
  53. package/dist/cli/conformScope.d.ts +28 -0
  54. package/dist/cli/conformScope.js +67 -0
  55. package/dist/cli/conformScope.js.map +1 -1
  56. package/dist/cli/coverage.d.ts +9 -0
  57. package/dist/cli/coverage.js +60 -8
  58. package/dist/cli/coverage.js.map +1 -1
  59. package/dist/cli/defer.d.ts +55 -0
  60. package/dist/cli/defer.js +244 -0
  61. package/dist/cli/defer.js.map +1 -0
  62. package/dist/cli/engagement.d.ts +210 -0
  63. package/dist/cli/engagement.js +444 -0
  64. package/dist/cli/engagement.js.map +1 -0
  65. package/dist/cli/engagementFile.d.ts +86 -0
  66. package/dist/cli/engagementFile.js +255 -0
  67. package/dist/cli/engagementFile.js.map +1 -0
  68. package/dist/cli/metrics.d.ts +10 -0
  69. package/dist/cli/metrics.js +49 -1
  70. package/dist/cli/metrics.js.map +1 -1
  71. package/dist/cli/pluginPin.d.ts +55 -0
  72. package/dist/cli/pluginPin.js +188 -0
  73. package/dist/cli/pluginPin.js.map +1 -0
  74. package/dist/cli/ratify.d.ts +27 -2
  75. package/dist/cli/ratify.js +112 -13
  76. package/dist/cli/ratify.js.map +1 -1
  77. package/dist/cli/reratify.d.ts +4 -2
  78. package/dist/cli/reratify.js +41 -16
  79. package/dist/cli/reratify.js.map +1 -1
  80. package/dist/cli/scopeInputs.d.ts +48 -0
  81. package/dist/cli/scopeInputs.js +176 -0
  82. package/dist/cli/scopeInputs.js.map +1 -0
  83. package/dist/cli/skillCheck.d.ts +15 -1
  84. package/dist/cli/skillCheck.js +22 -1
  85. package/dist/cli/skillCheck.js.map +1 -1
  86. package/dist/cli/skillDirs.d.ts +5 -0
  87. package/dist/cli/skillDirs.js +13 -1
  88. package/dist/cli/skillDirs.js.map +1 -1
  89. package/dist/cli/skillSync.d.ts +4 -0
  90. package/dist/cli/skillSync.js +23 -0
  91. package/dist/cli/skillSync.js.map +1 -1
  92. package/dist/cli/sliceNew.d.ts +11 -7
  93. package/dist/cli/sliceNew.js +91 -18
  94. package/dist/cli/sliceNew.js.map +1 -1
  95. package/dist/cli/sliceSync.d.ts +50 -0
  96. package/dist/cli/sliceSync.js +170 -0
  97. package/dist/cli/sliceSync.js.map +1 -0
  98. package/dist/cli/status.d.ts +24 -1
  99. package/dist/cli/status.js +20 -1
  100. package/dist/cli/status.js.map +1 -1
  101. package/dist/cli/systemInputs.d.ts +53 -10
  102. package/dist/cli/systemInputs.js +186 -11
  103. package/dist/cli/systemInputs.js.map +1 -1
  104. package/dist/cli/upgrade.d.ts +16 -3
  105. package/dist/cli/upgrade.js +366 -30
  106. package/dist/cli/upgrade.js.map +1 -1
  107. package/dist/cli/usageLog.d.ts +4 -2
  108. package/dist/cli/usageLog.js +4 -2
  109. package/dist/cli/usageLog.js.map +1 -1
  110. package/dist/cli.js +599 -94
  111. package/dist/cli.js.map +1 -1
  112. package/dist/emit/api.d.ts +29 -0
  113. package/dist/emit/api.js +220 -0
  114. package/dist/emit/api.js.map +1 -0
  115. package/dist/emit/apiCheckJson.d.ts +3 -0
  116. package/dist/emit/apiCheckJson.js +21 -0
  117. package/dist/emit/apiCheckJson.js.map +1 -0
  118. package/dist/emit/codeownersJson.d.ts +3 -0
  119. package/dist/emit/codeownersJson.js +19 -0
  120. package/dist/emit/codeownersJson.js.map +1 -0
  121. package/dist/emit/diffJson.d.ts +1 -1
  122. package/dist/emit/diffJson.js +8 -1
  123. package/dist/emit/diffJson.js.map +1 -1
  124. package/dist/emit/engagementJson.d.ts +8 -0
  125. package/dist/emit/engagementJson.js +46 -0
  126. package/dist/emit/engagementJson.js.map +1 -0
  127. package/dist/emit/glossaryJson.d.ts +1 -1
  128. package/dist/emit/glossaryJson.js +4 -1
  129. package/dist/emit/glossaryJson.js.map +1 -1
  130. package/dist/emit/json.d.ts +17 -1
  131. package/dist/emit/json.js +30 -1
  132. package/dist/emit/json.js.map +1 -1
  133. package/dist/emit/metricsJson.d.ts +1 -1
  134. package/dist/emit/metricsJson.js +4 -1
  135. package/dist/emit/metricsJson.js.map +1 -1
  136. package/dist/emit/queryJson.d.ts +1 -1
  137. package/dist/emit/queryJson.js +7 -1
  138. package/dist/emit/queryJson.js.map +1 -1
  139. package/dist/emit/scopeJson.d.ts +12 -0
  140. package/dist/emit/scopeJson.js +26 -0
  141. package/dist/emit/scopeJson.js.map +1 -0
  142. package/dist/emit/skillCheckJson.d.ts +3 -2
  143. package/dist/emit/skillCheckJson.js +10 -2
  144. package/dist/emit/skillCheckJson.js.map +1 -1
  145. package/dist/emit/statusJson.d.ts +1 -1
  146. package/dist/emit/statusJson.js +15 -1
  147. package/dist/emit/statusJson.js.map +1 -1
  148. package/dist/emit/systemJson.d.ts +15 -8
  149. package/dist/emit/systemJson.js +28 -13
  150. package/dist/emit/systemJson.js.map +1 -1
  151. package/dist/emit/validateJson.d.ts +3 -3
  152. package/dist/emit/validateJson.js +10 -4
  153. package/dist/emit/validateJson.js.map +1 -1
  154. package/dist/mcp/server.d.ts +1 -1
  155. package/dist/mcp/server.js +163 -31
  156. package/dist/mcp/server.js.map +1 -1
  157. package/dist/model/diff.d.ts +4 -1
  158. package/dist/model/diff.js +44 -8
  159. package/dist/model/diff.js.map +1 -1
  160. package/dist/model/glossary.d.ts +2 -0
  161. package/dist/model/glossary.js +1 -0
  162. package/dist/model/glossary.js.map +1 -1
  163. package/dist/model/model.d.ts +55 -2
  164. package/dist/model/model.js +57 -0
  165. package/dist/model/model.js.map +1 -1
  166. package/dist/model/qualifiedRef.d.ts +18 -0
  167. package/dist/model/qualifiedRef.js +26 -0
  168. package/dist/model/qualifiedRef.js.map +1 -1
  169. package/dist/model/queryIndex.d.ts +9 -1
  170. package/dist/model/queryIndex.js +18 -2
  171. package/dist/model/queryIndex.js.map +1 -1
  172. package/dist/model/rules.d.ts +143 -2
  173. package/dist/model/rules.js +162 -3
  174. package/dist/model/rules.js.map +1 -1
  175. package/dist/model/validate.d.ts +40 -0
  176. package/dist/model/validate.js +147 -1
  177. package/dist/model/validate.js.map +1 -1
  178. package/dist/parser/ast.d.ts +31 -3
  179. package/dist/parser/parser.js +148 -14
  180. package/dist/parser/parser.js.map +1 -1
  181. package/dist/query/format.js +1 -1
  182. package/dist/query/format.js.map +1 -1
  183. package/dist/query/verbs.d.ts +6 -0
  184. package/dist/query/verbs.js +6 -2
  185. package/dist/query/verbs.js.map +1 -1
  186. package/dist/system/adaptation.d.ts +14 -0
  187. package/dist/system/adaptation.js +49 -0
  188. package/dist/system/adaptation.js.map +1 -0
  189. package/dist/system/codeowners.d.ts +77 -0
  190. package/dist/system/codeowners.js +242 -0
  191. package/dist/system/codeowners.js.map +1 -0
  192. package/dist/system/manifest.d.ts +10 -5
  193. package/dist/system/manifest.js +54 -26
  194. package/dist/system/manifest.js.map +1 -1
  195. package/dist/system/migrateManifest.d.ts +28 -0
  196. package/dist/system/migrateManifest.js +155 -0
  197. package/dist/system/migrateManifest.js.map +1 -0
  198. package/dist/system/scope.d.ts +46 -0
  199. package/dist/system/scope.js +132 -0
  200. package/dist/system/scope.js.map +1 -0
  201. package/dist/system/verify.d.ts +50 -13
  202. package/dist/system/verify.js +179 -58
  203. package/dist/system/verify.js.map +1 -1
  204. package/dist/templates.d.ts +2 -2
  205. package/dist/templates.js +23 -2
  206. package/dist/templates.js.map +1 -1
  207. package/package.json +5 -2
  208. package/plugin/.claude-plugin/plugin.json +18 -0
  209. package/plugin/agents/em-critic.md +27 -0
  210. package/plugin/agents/em-implementer.md +35 -0
  211. package/plugin/agents/em-reviewer.md +32 -0
  212. package/plugin/agents/em-validator.md +28 -0
  213. package/plugin/shared/reference/em-dsl.md +871 -0
  214. package/plugin/shared/reference/methodology.md +329 -0
  215. package/plugin/shared/reference/operating-principles.md +222 -0
  216. package/plugin/shared/reference/slice-doc-schema.md +574 -0
  217. package/plugin/shared/templates/conformance-report.md +85 -0
  218. package/plugin/shared/templates/constitution.md +136 -0
  219. package/plugin/shared/templates/model-readme.md +46 -0
  220. package/plugin/shared/templates/slice.md +251 -0
  221. package/plugin/shared/templates/state.md +77 -0
  222. package/plugin/skills/conform/SKILL.md +93 -0
  223. package/plugin/skills/conform/reference/conform.md +428 -0
  224. package/plugin/skills/design/SKILL.md +298 -0
  225. package/plugin/skills/discover/SKILL.md +90 -0
  226. package/plugin/skills/discover/reference/extract.md +147 -0
  227. package/plugin/skills/engagement/SKILL.md +193 -0
  228. package/plugin/skills/engagement/reference/engagement.md +144 -0
  229. package/plugin/skills/event-modeling/SKILL.md +132 -0
  230. package/plugin/skills/implement/SKILL.md +61 -0
  231. package/plugin/skills/implement/reference/implement.md +439 -0
  232. package/plugin/skills/review/SKILL.md +74 -0
  233. package/dist/emit/typespec.d.ts +0 -26
  234. package/dist/emit/typespec.js +0 -356
  235. package/dist/emit/typespec.js.map +0 -1
@@ -0,0 +1,55 @@
1
+ import type { SkillCheckFinding } from "./skillCheck.js";
2
+ export declare const PLUGIN_NAME = "em";
3
+ export declare const PLUGIN_REPO = "milehimikey/em";
4
+ /** A marketplace key that makes a repo "declare the plugin": `em-<major>-<minor>-<patch>`. */
5
+ export declare const PLUGIN_MARKETPLACE_RE: RegExp;
6
+ /** `1.14.0` -> `em-1-14-0` (the marketplace name the release stamps into .claude-plugin/marketplace.json). */
7
+ export declare function pluginMarketplaceName(version: string): string;
8
+ /** The two commands that register and enable the plugin pinned to `version` (both are required, in
9
+ * this order: `plugin install` alone fails with "Plugin not found in marketplace"). */
10
+ export declare function pluginInstallCommands(version: string): string[];
11
+ /** The `.claude/settings.json` entries that pin the plugin to `version` (MIL-232, R14). Pure. */
12
+ export declare function pluginSettingsEntries(version: string): {
13
+ name: string;
14
+ marketplace: {
15
+ source: {
16
+ source: "github";
17
+ repo: string;
18
+ ref: string;
19
+ };
20
+ };
21
+ enabledKey: string;
22
+ };
23
+ /**
24
+ * Merge the plugin pin for `version` into the text of a `.claude/settings.json` (`null` = file
25
+ * absent). Unknown keys and key order are preserved; output is 2-space JSON with a trailing newline.
26
+ * Returns `null` when the existing text is not a JSON object (the caller must not clobber it).
27
+ */
28
+ export declare function mergePluginSettings(existing: string | null, version: string): string | null;
29
+ export interface PluginDeclaration {
30
+ declared: true;
31
+ /** The marketplace key, e.g. `em-1-14-0`. */
32
+ name: string;
33
+ /** The declared `source.ref` (e.g. `v1.14.0`), or null when absent. */
34
+ ref: string | null;
35
+ /** `enabledPlugins["em@<name>"] === true` (settings.local.json overrides settings.json). */
36
+ enabled: boolean;
37
+ }
38
+ /**
39
+ * A repo "declares the plugin" iff `.claude/settings.json` (then `.claude/settings.local.json`) has
40
+ * an `extraKnownMarketplaces` key matching `^em-\d+-\d+-\d+$` whose `source` is the github repo
41
+ * `milehimikey/em`. When several keys match (a stale pin left beside the current one), the one named
42
+ * `preferName` wins, else the first in key order.
43
+ */
44
+ export declare function detectPlugin(repoRoot: string, preferName?: string): PluginDeclaration | null;
45
+ /** The machine-level plugins directory: EM_CLAUDE_PLUGINS_DIR, else ~/.claude/plugins. */
46
+ export declare function claudePluginsDir(env?: NodeJS.ProcessEnv): string;
47
+ export interface PluginCheck {
48
+ plugin: PluginDeclaration;
49
+ findings: SkillCheckFinding[];
50
+ }
51
+ /**
52
+ * Check the plugin declaration in `repoRoot` against `installedVersion` (em --version) and the
53
+ * machine registry in `pluginsDir`. `null` when the repo does not declare the plugin.
54
+ */
55
+ export declare function checkPlugin(repoRoot: string, installedVersion: string, pluginsDir: string): PluginCheck | null;
@@ -0,0 +1,188 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // The em Claude Code plugin's pin check (MIL-231, R14). Pure: reads a repo's `.claude/settings.json`
3
+ // (then `.claude/settings.local.json`) and the machine-level marketplace registry, and reports
4
+ // findings. No process.exit, no console, and nothing reads the real `~/.claude/plugins` unless the
5
+ // caller passes it - the CLI resolves the directory (EM_CLAUDE_PLUGINS_DIR, default
6
+ // ~/.claude/plugins), tests pass a fixture.
7
+ //
8
+ // Why two parts. A marketplace registration is per user and keyed by marketplace NAME: two repos
9
+ // pinning different refs under one name silently collide (MIL-229 spike). The marketplace name
10
+ // therefore carries the exact version (`em-1-14-0`), and the check compares the repo's declaration
11
+ // (settings) AND the machine's registration (known_marketplaces.json) against the installed em.
12
+ import { existsSync, readFileSync } from "node:fs";
13
+ import { homedir } from "node:os";
14
+ import { join } from "node:path";
15
+ export const PLUGIN_NAME = "em";
16
+ export const PLUGIN_REPO = "milehimikey/em";
17
+ /** A marketplace key that makes a repo "declare the plugin": `em-<major>-<minor>-<patch>`. */
18
+ export const PLUGIN_MARKETPLACE_RE = /^em-\d+-\d+-\d+$/;
19
+ /** `1.14.0` -> `em-1-14-0` (the marketplace name the release stamps into .claude-plugin/marketplace.json). */
20
+ export function pluginMarketplaceName(version) {
21
+ return `em-${version.replace(/\./g, "-")}`;
22
+ }
23
+ /** The two commands that register and enable the plugin pinned to `version` (both are required, in
24
+ * this order: `plugin install` alone fails with "Plugin not found in marketplace"). */
25
+ export function pluginInstallCommands(version) {
26
+ return [
27
+ `claude plugin marketplace add ${PLUGIN_REPO}@v${version} --scope project`,
28
+ `claude plugin install ${PLUGIN_NAME}@${pluginMarketplaceName(version)} --scope project`,
29
+ ];
30
+ }
31
+ /** The `.claude/settings.json` entries that pin the plugin to `version` (MIL-232, R14). Pure. */
32
+ export function pluginSettingsEntries(version) {
33
+ const name = pluginMarketplaceName(version);
34
+ return {
35
+ name,
36
+ marketplace: { source: { source: "github", repo: PLUGIN_REPO, ref: `v${version}` } },
37
+ enabledKey: `${PLUGIN_NAME}@${name}`,
38
+ };
39
+ }
40
+ /**
41
+ * Merge the plugin pin for `version` into the text of a `.claude/settings.json` (`null` = file
42
+ * absent). Unknown keys and key order are preserved; output is 2-space JSON with a trailing newline.
43
+ * Returns `null` when the existing text is not a JSON object (the caller must not clobber it).
44
+ */
45
+ export function mergePluginSettings(existing, version) {
46
+ let settings = {};
47
+ if (existing !== null) {
48
+ try {
49
+ const v = JSON.parse(existing);
50
+ if (v === null || typeof v !== "object" || Array.isArray(v))
51
+ return null;
52
+ settings = v;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ const e = pluginSettingsEntries(version);
59
+ const markets = { ...(obj(settings.extraKnownMarketplaces) ?? {}), [e.name]: e.marketplace };
60
+ const enabled = { ...(obj(settings.enabledPlugins) ?? {}), [e.enabledKey]: true };
61
+ const out = { ...settings, extraKnownMarketplaces: markets, enabledPlugins: enabled };
62
+ return JSON.stringify(out, null, 2) + "\n";
63
+ }
64
+ function readJson(path) {
65
+ try {
66
+ const v = JSON.parse(readFileSync(path, "utf8"));
67
+ return v !== null && typeof v === "object" && !Array.isArray(v) ? v : null;
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ function obj(v) {
74
+ return v !== null && typeof v === "object" && !Array.isArray(v) ? v : null;
75
+ }
76
+ /**
77
+ * A repo "declares the plugin" iff `.claude/settings.json` (then `.claude/settings.local.json`) has
78
+ * an `extraKnownMarketplaces` key matching `^em-\d+-\d+-\d+$` whose `source` is the github repo
79
+ * `milehimikey/em`. When several keys match (a stale pin left beside the current one), the one named
80
+ * `preferName` wins, else the first in key order.
81
+ */
82
+ export function detectPlugin(repoRoot, preferName) {
83
+ const files = [join(repoRoot, ".claude", "settings.json"), join(repoRoot, ".claude", "settings.local.json")]
84
+ .map(readJson)
85
+ .filter((j) => j !== null);
86
+ for (const settings of files) {
87
+ const markets = obj(settings.extraKnownMarketplaces);
88
+ if (!markets)
89
+ continue;
90
+ const names = Object.keys(markets)
91
+ .filter((k) => {
92
+ const src = obj(obj(markets[k])?.source);
93
+ return PLUGIN_MARKETPLACE_RE.test(k) && src?.source === "github" && src.repo === PLUGIN_REPO;
94
+ })
95
+ .sort();
96
+ if (names.length === 0)
97
+ continue;
98
+ const name = preferName && names.includes(preferName) ? preferName : names[0];
99
+ const ref = obj(obj(markets[name])?.source)?.ref;
100
+ let enabled = false;
101
+ for (const f of files) {
102
+ const v = obj(f.enabledPlugins)?.[`${PLUGIN_NAME}@${name}`];
103
+ if (v !== undefined)
104
+ enabled = v === true;
105
+ }
106
+ return { declared: true, name, ref: typeof ref === "string" ? ref : null, enabled };
107
+ }
108
+ return null;
109
+ }
110
+ /** The machine-level plugins directory: EM_CLAUDE_PLUGINS_DIR, else ~/.claude/plugins. */
111
+ export function claudePluginsDir(env = process.env) {
112
+ return env.EM_CLAUDE_PLUGINS_DIR ? env.EM_CLAUDE_PLUGINS_DIR : join(homedir(), ".claude", "plugins");
113
+ }
114
+ /** The `source.ref` the machine registry holds for `name`, `undefined` when there is no entry (or no
115
+ * readable registry), `null` when the entry carries no ref. */
116
+ function registeredRef(pluginsDir, name) {
117
+ const file = join(pluginsDir, "known_marketplaces.json");
118
+ if (!existsSync(file))
119
+ return undefined;
120
+ const entry = obj(readJson(file)?.[name]);
121
+ if (!entry)
122
+ return undefined;
123
+ const ref = obj(entry.source)?.ref;
124
+ return typeof ref === "string" ? ref : null;
125
+ }
126
+ /**
127
+ * Check the plugin declaration in `repoRoot` against `installedVersion` (em --version) and the
128
+ * machine registry in `pluginsDir`. `null` when the repo does not declare the plugin.
129
+ */
130
+ export function checkPlugin(repoRoot, installedVersion, pluginsDir) {
131
+ const expectedName = pluginMarketplaceName(installedVersion);
132
+ const expectedRef = `v${installedVersion}`;
133
+ const plugin = detectPlugin(repoRoot, expectedName);
134
+ if (!plugin)
135
+ return null;
136
+ const commands = pluginInstallCommands(installedVersion);
137
+ const findings = [];
138
+ const pinOk = plugin.name === expectedName && plugin.ref === expectedRef;
139
+ if (!pinOk) {
140
+ findings.push({
141
+ code: "plugin-pin-mismatch",
142
+ message: `em plugin pin mismatch: .claude/settings.json pins ${plugin.name} at ref ${plugin.ref ?? "(none)"}, ` +
143
+ `but installed em is ${installedVersion} (expected marketplace ${expectedName} at ref ${expectedRef}) - ` +
144
+ `update extraKnownMarketplaces and enabledPlugins to the installed version, then run the install commands`,
145
+ pluginName: plugin.name,
146
+ pluginRef: plugin.ref,
147
+ installedVersion,
148
+ installCommands: commands,
149
+ });
150
+ }
151
+ if (!plugin.enabled) {
152
+ findings.push({
153
+ code: "plugin-not-enabled",
154
+ message: `em plugin is not enabled: enabledPlugins["${PLUGIN_NAME}@${plugin.name}"] is not true in .claude/settings.json`,
155
+ pluginName: plugin.name,
156
+ pluginRef: plugin.ref,
157
+ installedVersion,
158
+ });
159
+ }
160
+ // The machine registration is only meaningful against a correct pin; a wrong pin is the one root
161
+ // cause, reported once.
162
+ if (pinOk) {
163
+ const reg = registeredRef(pluginsDir, plugin.name);
164
+ if (reg === undefined) {
165
+ findings.push({
166
+ code: "plugin-not-installed-locally",
167
+ message: `em plugin ${plugin.name} is not registered on this machine (no entry in ${join(pluginsDir, "known_marketplaces.json")}) - run:\n ${commands.join("\n ")}`,
168
+ pluginName: plugin.name,
169
+ pluginRef: null,
170
+ installedVersion,
171
+ installCommands: commands,
172
+ });
173
+ }
174
+ else if (reg !== expectedRef) {
175
+ findings.push({
176
+ code: "plugin-registered-at-different-ref",
177
+ message: `em plugin ${plugin.name} is registered on this machine at ${reg ?? "(no ref)"}, not ${expectedRef} - ` +
178
+ `the agent would run the wrong skills; run: claude plugin marketplace remove ${plugin.name}, then:\n ${commands.join("\n ")}`,
179
+ pluginName: plugin.name,
180
+ pluginRef: reg,
181
+ installedVersion,
182
+ installCommands: commands,
183
+ });
184
+ }
185
+ }
186
+ return { plugin, findings };
187
+ }
188
+ //# sourceMappingURL=pluginPin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginPin.js","sourceRoot":"","sources":["../../src/cli/pluginPin.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qGAAqG;AACrG,+FAA+F;AAC/F,mGAAmG;AACnG,oFAAoF;AACpF,4CAA4C;AAC5C,EAAE;AACF,iGAAiG;AACjG,+FAA+F;AAC/F,mGAAmG;AACnG,gGAAgG;AAEhG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,8FAA8F;AAC9F,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAExD,8GAA8G;AAC9G,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED;wFACwF;AACxF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO;QACL,iCAAiC,WAAW,KAAK,OAAO,kBAAkB;QAC1E,yBAAyB,WAAW,IAAI,qBAAqB,CAAC,OAAO,CAAC,kBAAkB;KACzF,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,qBAAqB,CAAC,OAAe;IAKnD,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,EAAE,EAAE;QACpF,UAAU,EAAE,GAAG,WAAW,IAAI,IAAI,EAAE;KACrC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAuB,EAAE,OAAe;IAC1E,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzE,QAAQ,GAAG,CAA4B,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7F,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;IAClF,MAAM,GAAG,GAA4B,EAAE,GAAG,QAAQ,EAAE,sBAAsB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC/G,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAC7C,CAAC;AAYD,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1G,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,UAAmB;IAChE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;SACzG,GAAG,CAAC,QAAQ,CAAC;SACb,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3D,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC;QAC/F,CAAC,CAAC;aACD,IAAI,EAAE,CAAC;QACV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;QACjD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvG,CAAC;AAED;gEACgE;AAChE,SAAS,aAAa,CAAC,UAAkB,EAAE,IAAY;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IACnC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,gBAAwB,EAAE,UAAkB;IACxF,MAAM,YAAY,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,GAAG,KAAK,WAAW,CAAC;IACzE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EACL,sDAAsD,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,GAAG,IAAI,QAAQ,IAAI;gBACtG,uBAAuB,gBAAgB,0BAA0B,YAAY,WAAW,WAAW,MAAM;gBACzG,0GAA0G;YAC5G,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,SAAS,EAAE,MAAM,CAAC,GAAG;YACrB,gBAAgB;YAChB,eAAe,EAAE,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,6CAA6C,WAAW,IAAI,MAAM,CAAC,IAAI,yCAAyC;YACzH,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,SAAS,EAAE,MAAM,CAAC,GAAG;YACrB,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IAED,iGAAiG;IACjG,wBAAwB;IACxB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,8BAA8B;gBACpC,OAAO,EAAE,aAAa,MAAM,CAAC,IAAI,mDAAmD,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,eAAe,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACrK,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,SAAS,EAAE,IAAI;gBACf,gBAAgB;gBAChB,eAAe,EAAE,QAAQ;aAC1B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,oCAAoC;gBAC1C,OAAO,EACL,aAAa,MAAM,CAAC,IAAI,qCAAqC,GAAG,IAAI,UAAU,SAAS,WAAW,KAAK;oBACvG,+EAA+E,MAAM,CAAC,IAAI,cAAc,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACjI,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,SAAS,EAAE,GAAG;gBACd,gBAAgB;gBAChB,eAAe,EAAE,QAAQ;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
@@ -1,5 +1,30 @@
1
1
  import { NormalizedModel } from "../model/model.js";
2
2
  import { RefsResult } from "../model/refs.js";
3
+ /** MIL-238: the ratifier's API-first statement about this version of a public-touching slice. */
4
+ export type MeaningConfirmation = {
5
+ kind: "meaning-unchanged";
6
+ } | {
7
+ kind: "contract-change";
8
+ why: string;
9
+ };
10
+ /** The two frontmatter keys a `MeaningConfirmation` is written to — cleared together on rewrite. */
11
+ export declare const MEANING_CONFIRMATION_KEYS: readonly ["meaningConfirmed", "contractChange"];
12
+ /** Turn the `--meaning-unchanged` / `--contract-change "<why>"` flags into a confirmation (or
13
+ * null when neither was passed). Refuses both at once, an empty reason, and a reason that can't
14
+ * be written as one quoted frontmatter value (control characters, double quotes). */
15
+ export declare function parseMeaningFlags(meaningUnchanged: boolean | undefined, contractChange: string | undefined): {
16
+ ok: true;
17
+ confirmation: MeaningConfirmation | null;
18
+ } | {
19
+ ok: false;
20
+ message: string;
21
+ };
22
+ /** The frontmatter line a confirmation is recorded as. */
23
+ export declare function meaningConfirmationLine(c: MeaningConfirmation): string;
24
+ /** The refusal for a public-touching slice ratified/reratified without a confirmation. */
25
+ export declare function meaningConfirmationRequiredMessage(sliceKey: string): string;
26
+ /** Remove every `meaningConfirmed:`/`contractChange:` line (whole line, EOL included). */
27
+ export declare function stripMeaningConfirmation(inner: string): string;
3
28
  /** The status this command flips a slice doc to — the handoff gate
4
29
  * (docs/process.md#the-slice-lifecycle-gates): contracts/invariants agreed, open questions
5
30
  * resolved or deferred, ready for an implementing agent or engineer to pick up. */
@@ -51,7 +76,7 @@ export type ApplyRatifyResult = {
51
76
  * that refusal message (and in the caller's skip notice); every other refusal here is about the
52
77
  * doc's own text. No fs access — the caller reads/writes; see `runRatify` below.
53
78
  */
54
- export declare function applyRatifyFrontmatter(raw: string, sliceKey: string, ratifiedBy: string, ratifiedOn: string, skipReview?: boolean): ApplyRatifyResult;
79
+ export declare function applyRatifyFrontmatter(raw: string, sliceKey: string, ratifiedBy: string, ratifiedOn: string, skipReview?: boolean, confirmation?: MeaningConfirmation | null): ApplyRatifyResult;
55
80
  export type RunRatifyResult = {
56
81
  ok: true;
57
82
  path: string;
@@ -70,4 +95,4 @@ export type RunRatifyResult = {
70
95
  * `--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/writes
71
96
  * it. `baseDir` is the `.em` file's directory, same convention every doc/note path in `em` uses.
72
97
  */
73
- export declare function runRatify(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, ratifiedBy: string, ratifiedOn: string, skipReview?: boolean): RunRatifyResult;
98
+ export declare function runRatify(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, ratifiedBy: string, ratifiedOn: string, skipReview?: boolean, confirmation?: MeaningConfirmation | null): RunRatifyResult;
@@ -40,14 +40,79 @@
40
40
  // reports any whose doc isn't `ready-to-implement`/`implemented` yet. Repeated-view instance
41
41
  // hops (`view X again`) are never edges in `ModelIndex.out`/`.in` (queryIndex.ts's own design
42
42
  // note), so they never surface here either — nothing extra to filter.
43
+ // MIL-238 — the API-first meaning confirmation: on a public-touching slice (one owning a `public`
44
+ // command/event/view, catalog/apiFirst.ts) ratification also asserts the contract is current and
45
+ // says whether this version changes what it MEANS to a consumer. `--meaning-unchanged` records
46
+ // `meaningConfirmed: true`; `--contract-change "<why>"` records `contractChange: "<why>"`; exactly
47
+ // one is required there, and either is accepted (and recorded, harmlessly) on any other slice.
48
+ // The line goes directly after `ratifiedOn:`, replacing any earlier confirmation line.
43
49
  import { readFileSync, writeFileSync } from "node:fs";
44
50
  import { join } from "node:path";
45
51
  import { continuationOf } from "../model/continuation.js";
46
52
  import { resolveSliceDocJoin } from "../catalog/docJoin.js";
47
53
  import { buildModelIndex } from "../model/queryIndex.js";
48
- import { fieldLineRegex, locateFrontmatterInner, normalizeFieldValue } from "./frontmatterSurgery.js";
54
+ import { fieldLineRegex, fieldLineWithEolRegex, locateFrontmatterInner, normalizeFieldValue } from "./frontmatterSurgery.js";
49
55
  import { REVIEWED_STATUS } from "./review.js";
50
56
  import { isValidDateString } from "./stateFile.js";
57
+ import { isPublicTouchingSlice } from "../catalog/apiFirst.js";
58
+ /** The two frontmatter keys a `MeaningConfirmation` is written to — cleared together on rewrite. */
59
+ export const MEANING_CONFIRMATION_KEYS = ["meaningConfirmed", "contractChange"];
60
+ /** Turn the `--meaning-unchanged` / `--contract-change "<why>"` flags into a confirmation (or
61
+ * null when neither was passed). Refuses both at once, an empty reason, and a reason that can't
62
+ * be written as one quoted frontmatter value (control characters, double quotes). */
63
+ export function parseMeaningFlags(meaningUnchanged, contractChange) {
64
+ if (meaningUnchanged && contractChange !== undefined) {
65
+ return { ok: false, message: 'pass one of --meaning-unchanged or --contract-change "<why>", not both' };
66
+ }
67
+ if (meaningUnchanged)
68
+ return { ok: true, confirmation: { kind: "meaning-unchanged" } };
69
+ if (contractChange === undefined)
70
+ return { ok: true, confirmation: null };
71
+ const why = contractChange.trim();
72
+ if (!why)
73
+ return { ok: false, message: 'a contract-change reason is required (--contract-change "<why>")' };
74
+ if (/[\x00-\x1f\x7f]/.test(why)) {
75
+ return { ok: false, message: "contract-change reason must not contain control characters" };
76
+ }
77
+ if (why.includes('"')) {
78
+ return {
79
+ ok: false,
80
+ message: "contract-change reason must not contain double quotes — it is written as one quoted frontmatter value",
81
+ };
82
+ }
83
+ return { ok: true, confirmation: { kind: "contract-change", why } };
84
+ }
85
+ /** The frontmatter line a confirmation is recorded as. */
86
+ export function meaningConfirmationLine(c) {
87
+ return c.kind === "meaning-unchanged" ? "meaningConfirmed: true" : `contractChange: "${c.why}"`;
88
+ }
89
+ /** The refusal for a public-touching slice ratified/reratified without a confirmation. */
90
+ export function meaningConfirmationRequiredMessage(sliceKey) {
91
+ return (`slice "${sliceKey}" touches the public surface — pass --meaning-unchanged, or ` +
92
+ `--contract-change "<why>" if a consumer must read this change differently`);
93
+ }
94
+ /** Remove every `meaningConfirmed:`/`contractChange:` line (whole line, EOL included). */
95
+ export function stripMeaningConfirmation(inner) {
96
+ let out = inner;
97
+ for (const key of MEANING_CONFIRMATION_KEYS) {
98
+ const re = fieldLineWithEolRegex(key);
99
+ while (re.test(out))
100
+ out = out.replace(re, "");
101
+ }
102
+ return out;
103
+ }
104
+ /** The confirmation currently recorded in a frontmatter `inner` block, or null. */
105
+ function recordedConfirmation(inner) {
106
+ const mc = fieldLineRegex("meaningConfirmed").exec(inner);
107
+ if (mc && normalizeFieldValue(mc[2])?.toLowerCase() === "true")
108
+ return { kind: "meaning-unchanged" };
109
+ const cc = fieldLineRegex("contractChange").exec(inner);
110
+ const why = cc ? normalizeFieldValue(cc[2]) : null;
111
+ return why !== null ? { kind: "contract-change", why } : null;
112
+ }
113
+ function sameConfirmation(a, b) {
114
+ return a.kind === b.kind && (a.kind === "meaning-unchanged" || a.why === b.why);
115
+ }
51
116
  /** The status this command flips a slice doc to — the handoff gate
52
117
  * (docs/process.md#the-slice-lifecycle-gates): contracts/invariants agreed, open questions
53
118
  * resolved or deferred, ready for an implementing agent or engineer to pick up. */
@@ -113,7 +178,7 @@ export function upstreamUnratifiedSlices(model, refs, baseDir, sliceKey) {
113
178
  * that refusal message (and in the caller's skip notice); every other refusal here is about the
114
179
  * doc's own text. No fs access — the caller reads/writes; see `runRatify` below.
115
180
  */
116
- export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, skipReview = false) {
181
+ export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, skipReview = false, confirmation = null) {
117
182
  const trimmedBy = ratifiedBy.trim();
118
183
  if (!trimmedBy)
119
184
  return { ok: false, message: "a ratifier name is required (--by)" };
@@ -129,7 +194,11 @@ export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, sk
129
194
  const range = locateFrontmatterInner(raw);
130
195
  if (!range)
131
196
  return { ok: false, message: "no frontmatter block found" };
132
- const inner = raw.slice(range.innerStart, range.innerEnd);
197
+ const originalInner = raw.slice(range.innerStart, range.innerEnd);
198
+ const recorded = recordedConfirmation(originalInner);
199
+ // MIL-238: a new confirmation replaces any earlier one — strip it before locating the lines
200
+ // below, so the fresh line can be spliced in right after `ratifiedOn:`.
201
+ const inner = confirmation ? stripMeaningConfirmation(originalInner) : originalInner;
133
202
  const statusMatch = fieldLineRegex("status").exec(inner);
134
203
  if (!statusMatch)
135
204
  return { ok: false, message: "no `status:` field found in frontmatter" };
@@ -140,13 +209,27 @@ export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, sk
140
209
  const currentOn = onMatch ? normalizeFieldValue(onMatch[2]) : null;
141
210
  if (currentStatus === RATIFIED_STATUS && currentBy !== null && currentOn !== null) {
142
211
  if (currentBy === trimmedBy && currentOn === ratifiedOn) {
143
- return { ok: true, content: raw, changed: false, skippedReviewFrom: null }; // idempotent no-op
212
+ // MIL-238: same identity — a no-op unless this run adds a confirmation the doc lacks. A
213
+ // DIFFERENT recorded confirmation is provenance, refused like a different ratifier.
214
+ if (confirmation === null || (recorded !== null && sameConfirmation(recorded, confirmation))) {
215
+ return { ok: true, content: raw, changed: false, skippedReviewFrom: null }; // idempotent no-op
216
+ }
217
+ if (recorded !== null) {
218
+ return {
219
+ ok: false,
220
+ message: `already ratified by ${currentBy} on ${currentOn} with ${meaningConfirmationLine(recorded)} — ` +
221
+ `refusing to overwrite with ${meaningConfirmationLine(confirmation)}`,
222
+ };
223
+ }
224
+ // else: fall through and record the confirmation alongside the unchanged sign-off.
225
+ }
226
+ else {
227
+ return {
228
+ ok: false,
229
+ message: `already ratified by ${currentBy} on ${currentOn} — refusing to overwrite with ` +
230
+ `${trimmedBy} on ${ratifiedOn}`,
231
+ };
144
232
  }
145
- return {
146
- ok: false,
147
- message: `already ratified by ${currentBy} on ${currentOn} — refusing to overwrite with ` +
148
- `${trimmedBy} on ${ratifiedOn}`,
149
- };
150
233
  }
151
234
  // The review gate (MIL-201, D1). A doc that never passed through `status: reviewed` has not
152
235
  // been through the first human gate, so ratifying it collapses two decisions into one — the
@@ -178,6 +261,11 @@ export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, sk
178
261
  missingLines.push(`ratifiedBy: ${trimmedBy}`);
179
262
  if (!onMatch)
180
263
  missingLines.push(`ratifiedOn: ${ratifiedOn}`);
264
+ // MIL-238: the confirmation line goes directly after `ratifiedOn:` — at the end of the
265
+ // inserted block when `ratifiedOn:` is new, else appended to the existing line's edit below.
266
+ const confirmationText = confirmation ? meaningConfirmationLine(confirmation) : null;
267
+ if (confirmationText && !onMatch)
268
+ missingLines.push(confirmationText);
181
269
  const newStatusText = `${statusMatch[1]}${RATIFIED_STATUS}`;
182
270
  const statusNext = missingLines.length > 0 ? `${newStatusText}${eol}${missingLines.join(eol)}` : newStatusText;
183
271
  // Apply from the highest index first so an earlier edit's index stays valid — same convention
@@ -189,8 +277,14 @@ export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, sk
189
277
  ];
190
278
  if (byMatch)
191
279
  edits.push({ index: byMatch.index, oldLen: byMatch[0].length, next: `${byMatch[1]}${trimmedBy}` });
192
- if (onMatch)
193
- edits.push({ index: onMatch.index, oldLen: onMatch[0].length, next: `${onMatch[1]}${ratifiedOn}` });
280
+ if (onMatch) {
281
+ const onNext = `${onMatch[1]}${ratifiedOn}`;
282
+ edits.push({
283
+ index: onMatch.index,
284
+ oldLen: onMatch[0].length,
285
+ next: confirmationText ? `${onNext}${eol}${confirmationText}` : onNext,
286
+ });
287
+ }
194
288
  edits.sort((a, b) => b.index - a.index);
195
289
  let updatedInner = inner;
196
290
  for (const edit of edits) {
@@ -204,7 +298,7 @@ export function applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, sk
204
298
  * `--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/writes
205
299
  * it. `baseDir` is the `.em` file's directory, same convention every doc/note path in `em` uses.
206
300
  */
207
- export function runRatify(model, refs, baseDir, sliceKey, ratifiedBy, ratifiedOn, skipReview = false) {
301
+ export function runRatify(model, refs, baseDir, sliceKey, ratifiedBy, ratifiedOn, skipReview = false, confirmation = null) {
208
302
  const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
209
303
  if (sliceIndex === -1) {
210
304
  return { ok: false, message: `no slice with export key "${sliceKey}" in this model` };
@@ -243,10 +337,15 @@ export function runRatify(model, refs, baseDir, sliceKey, ratifiedBy, ratifiedOn
243
337
  }
244
338
  const absPath = join(baseDir, doc.path);
245
339
  const raw = readFileSync(absPath, "utf8");
246
- const result = applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, skipReview);
340
+ const result = applyRatifyFrontmatter(raw, sliceKey, ratifiedBy, ratifiedOn, skipReview, confirmation);
247
341
  if (!result.ok) {
248
342
  return { ok: false, message: `${doc.path}: ${result.message}` };
249
343
  }
344
+ // MIL-238: the API-first gate — after the doc's own preconditions, before any write: a
345
+ // public-touching slice needs a meaning confirmation.
346
+ if (confirmation === null && isPublicTouchingSlice(model, refs, sliceKey)) {
347
+ return { ok: false, message: meaningConfirmationRequiredMessage(sliceKey) };
348
+ }
250
349
  // MIL-198: computed once the gate above has passed, before the write — advisory only, so it
251
350
  // runs the same whether the gate passed on its own merits or via --skip-review.
252
351
  const upstreamWarnings = upstreamUnratifiedSlices(model, refs, baseDir, sliceKey);
@@ -1 +1 @@
1
- {"version":3,"file":"ratify.js","sourceRoot":"","sources":["../../src/cli/ratify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ratify.js","sourceRoot":"","sources":["../../src/cli/ratify.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { NormalizedModel } from "../model/model.js";
2
2
  import { RefsResult } from "../model/refs.js";
3
+ import { MeaningConfirmation } from "./ratify.js";
3
4
  export type ApplyReratifyResult = {
4
5
  ok: true;
5
6
  content: string;
@@ -20,7 +21,7 @@ export type ReratifyKind = "shipped" | "unshipped";
20
21
  * see module header for why this precondition (not idempotent-no-op) is the right refusal
21
22
  * shape here. No fs access — the caller reads/writes; see `runReratify` below.
22
23
  */
23
- export declare function applyReratifyFrontmatter(raw: string): ApplyReratifyResult;
24
+ export declare function applyReratifyFrontmatter(raw: string, confirmation?: MeaningConfirmation | null): ApplyReratifyResult;
24
25
  /** MIL-214: the certification-aware advisory `runReratify` computes about the version being
25
26
  * superseded — never gates the bump, see module header. */
26
27
  export interface ReratifyAdvisory {
@@ -43,6 +44,7 @@ export type RunReratifyResult = {
43
44
  newVersion: number;
44
45
  kind: ReratifyKind;
45
46
  advisory: ReratifyAdvisory | null;
47
+ reopened: number;
46
48
  } | {
47
49
  ok: false;
48
50
  message: string;
@@ -53,4 +55,4 @@ export type RunReratifyResult = {
53
55
  * writes it. `baseDir` is the `.em` file's directory, same convention every doc/note path in
54
56
  * `em` uses.
55
57
  */
56
- export declare function runReratify(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string): RunReratifyResult;
58
+ export declare function runReratify(model: NormalizedModel, refs: RefsResult, baseDir: string, sliceKey: string, confirmation?: MeaningConfirmation | null): RunReratifyResult;