mewkit 1.10.3 → 1.11.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.
Files changed (183) hide show
  1. package/README.md +56 -4
  2. package/dist/commands/budget.d.ts +13 -0
  3. package/dist/commands/budget.d.ts.map +1 -1
  4. package/dist/commands/budget.js +45 -0
  5. package/dist/commands/budget.js.map +1 -1
  6. package/dist/commands/doctor-checks.d.ts +1 -1
  7. package/dist/commands/doctor-checks.d.ts.map +1 -1
  8. package/dist/commands/doctor-checks.js +7 -1
  9. package/dist/commands/doctor-checks.js.map +1 -1
  10. package/dist/commands/doctor-hard-gates.d.ts +3 -0
  11. package/dist/commands/doctor-hard-gates.d.ts.map +1 -0
  12. package/dist/commands/doctor-hard-gates.js +138 -0
  13. package/dist/commands/doctor-hard-gates.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +1 -0
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +12 -3
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/evolve.d.ts +11 -0
  19. package/dist/commands/evolve.d.ts.map +1 -0
  20. package/dist/commands/evolve.js +63 -0
  21. package/dist/commands/evolve.js.map +1 -0
  22. package/dist/commands/health.d.ts +14 -0
  23. package/dist/commands/health.d.ts.map +1 -0
  24. package/dist/commands/health.js +193 -0
  25. package/dist/commands/health.js.map +1 -0
  26. package/dist/commands/init.d.ts +6 -0
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +63 -3
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/inventory.d.ts +17 -0
  31. package/dist/commands/inventory.d.ts.map +1 -0
  32. package/dist/commands/inventory.js +114 -0
  33. package/dist/commands/inventory.js.map +1 -0
  34. package/dist/commands/memory.d.ts +3 -0
  35. package/dist/commands/memory.d.ts.map +1 -1
  36. package/dist/commands/memory.js +67 -0
  37. package/dist/commands/memory.js.map +1 -1
  38. package/dist/commands/pack-helpers.d.ts +37 -0
  39. package/dist/commands/pack-helpers.d.ts.map +1 -0
  40. package/dist/commands/pack-helpers.js +105 -0
  41. package/dist/commands/pack-helpers.js.map +1 -0
  42. package/dist/commands/pack.d.ts +11 -0
  43. package/dist/commands/pack.d.ts.map +1 -0
  44. package/dist/commands/pack.js +192 -0
  45. package/dist/commands/pack.js.map +1 -0
  46. package/dist/commands/policy.d.ts +8 -0
  47. package/dist/commands/policy.d.ts.map +1 -0
  48. package/dist/commands/policy.js +65 -0
  49. package/dist/commands/policy.js.map +1 -0
  50. package/dist/commands/portability.d.ts +7 -0
  51. package/dist/commands/portability.d.ts.map +1 -0
  52. package/dist/commands/portability.js +50 -0
  53. package/dist/commands/portability.js.map +1 -0
  54. package/dist/commands/reflect.d.ts +14 -0
  55. package/dist/commands/reflect.d.ts.map +1 -0
  56. package/dist/commands/reflect.js +135 -0
  57. package/dist/commands/reflect.js.map +1 -0
  58. package/dist/commands/simulate.d.ts +14 -0
  59. package/dist/commands/simulate.d.ts.map +1 -0
  60. package/dist/commands/simulate.js +86 -0
  61. package/dist/commands/simulate.js.map +1 -0
  62. package/dist/commands/upgrade.d.ts.map +1 -1
  63. package/dist/commands/upgrade.js +22 -1
  64. package/dist/commands/upgrade.js.map +1 -1
  65. package/dist/commands/validate.d.ts +28 -0
  66. package/dist/commands/validate.d.ts.map +1 -1
  67. package/dist/commands/validate.js +170 -94
  68. package/dist/commands/validate.js.map +1 -1
  69. package/dist/core/build-inventory.d.ts +71 -0
  70. package/dist/core/build-inventory.d.ts.map +1 -0
  71. package/dist/core/build-inventory.js +222 -0
  72. package/dist/core/build-inventory.js.map +1 -0
  73. package/dist/core/check-packs.d.ts +13 -0
  74. package/dist/core/check-packs.d.ts.map +1 -0
  75. package/dist/core/check-packs.js +131 -0
  76. package/dist/core/check-packs.js.map +1 -0
  77. package/dist/core/check-stale-index.d.ts +35 -0
  78. package/dist/core/check-stale-index.d.ts.map +1 -0
  79. package/dist/core/check-stale-index.js +132 -0
  80. package/dist/core/check-stale-index.js.map +1 -0
  81. package/dist/core/check-workflow-drift.d.ts +49 -0
  82. package/dist/core/check-workflow-drift.d.ts.map +1 -0
  83. package/dist/core/check-workflow-drift.js +226 -0
  84. package/dist/core/check-workflow-drift.js.map +1 -0
  85. package/dist/core/context-budget.d.ts +9 -0
  86. package/dist/core/context-budget.d.ts.map +1 -0
  87. package/dist/core/context-budget.js +46 -0
  88. package/dist/core/context-budget.js.map +1 -0
  89. package/dist/core/event-log.d.ts +44 -0
  90. package/dist/core/event-log.d.ts.map +1 -0
  91. package/dist/core/event-log.js +169 -0
  92. package/dist/core/event-log.js.map +1 -0
  93. package/dist/core/evolution/event-clusters.d.ts +4 -0
  94. package/dist/core/evolution/event-clusters.d.ts.map +1 -0
  95. package/dist/core/evolution/event-clusters.js +82 -0
  96. package/dist/core/evolution/event-clusters.js.map +1 -0
  97. package/dist/core/evolution/recommendation-renderer.d.ts +3 -0
  98. package/dist/core/evolution/recommendation-renderer.d.ts.map +1 -0
  99. package/dist/core/evolution/recommendation-renderer.js +24 -0
  100. package/dist/core/evolution/recommendation-renderer.js.map +1 -0
  101. package/dist/core/evolution/review-failure-clusters.d.ts +10 -0
  102. package/dist/core/evolution/review-failure-clusters.d.ts.map +1 -0
  103. package/dist/core/evolution/review-failure-clusters.js +30 -0
  104. package/dist/core/evolution/review-failure-clusters.js.map +1 -0
  105. package/dist/core/evolution/suggestions.d.ts +24 -0
  106. package/dist/core/evolution/suggestions.d.ts.map +1 -0
  107. package/dist/core/evolution/suggestions.js +11 -0
  108. package/dist/core/evolution/suggestions.js.map +1 -0
  109. package/dist/core/gate-policy.d.ts +20 -0
  110. package/dist/core/gate-policy.d.ts.map +1 -0
  111. package/dist/core/gate-policy.js +64 -0
  112. package/dist/core/gate-policy.js.map +1 -0
  113. package/dist/core/harness-scaffold.d.ts +29 -0
  114. package/dist/core/harness-scaffold.d.ts.map +1 -0
  115. package/dist/core/harness-scaffold.js +53 -0
  116. package/dist/core/harness-scaffold.js.map +1 -0
  117. package/dist/core/hook-runner.d.ts +69 -0
  118. package/dist/core/hook-runner.d.ts.map +1 -0
  119. package/dist/core/hook-runner.js +95 -0
  120. package/dist/core/hook-runner.js.map +1 -0
  121. package/dist/core/index.d.ts +2 -0
  122. package/dist/core/index.d.ts.map +1 -1
  123. package/dist/core/index.js +2 -0
  124. package/dist/core/index.js.map +1 -1
  125. package/dist/core/install-metadata.d.ts +15 -0
  126. package/dist/core/install-metadata.d.ts.map +1 -1
  127. package/dist/core/install-metadata.js +11 -0
  128. package/dist/core/install-metadata.js.map +1 -1
  129. package/dist/core/is-hook-script.d.ts +2 -0
  130. package/dist/core/is-hook-script.d.ts.map +1 -0
  131. package/dist/core/is-hook-script.js +45 -0
  132. package/dist/core/is-hook-script.js.map +1 -0
  133. package/dist/core/pack-manifest.d.ts +48 -0
  134. package/dist/core/pack-manifest.d.ts.map +1 -0
  135. package/dist/core/pack-manifest.js +126 -0
  136. package/dist/core/pack-manifest.js.map +1 -0
  137. package/dist/core/pack-resolver.d.ts +18 -0
  138. package/dist/core/pack-resolver.d.ts.map +1 -0
  139. package/dist/core/pack-resolver.js +144 -0
  140. package/dist/core/pack-resolver.js.map +1 -0
  141. package/dist/core/portability-matrix.d.ts +17 -0
  142. package/dist/core/portability-matrix.d.ts.map +1 -0
  143. package/dist/core/portability-matrix.js +31 -0
  144. package/dist/core/portability-matrix.js.map +1 -0
  145. package/dist/core/simulation-runner.d.ts +93 -0
  146. package/dist/core/simulation-runner.d.ts.map +1 -0
  147. package/dist/core/simulation-runner.js +161 -0
  148. package/dist/core/simulation-runner.js.map +1 -0
  149. package/dist/core/smart-update.d.ts +24 -0
  150. package/dist/core/smart-update.d.ts.map +1 -1
  151. package/dist/core/smart-update.js +69 -0
  152. package/dist/core/smart-update.js.map +1 -1
  153. package/dist/core/usage/usage-analyzer.d.ts +18 -0
  154. package/dist/core/usage/usage-analyzer.d.ts.map +1 -0
  155. package/dist/core/usage/usage-analyzer.js +41 -0
  156. package/dist/core/usage/usage-analyzer.js.map +1 -0
  157. package/dist/core/validate-install.d.ts.map +1 -1
  158. package/dist/core/validate-install.js +3 -1
  159. package/dist/core/validate-install.js.map +1 -1
  160. package/dist/index.js +175 -4
  161. package/dist/index.js.map +1 -1
  162. package/dist/memory/archive.d.ts +9 -0
  163. package/dist/memory/archive.d.ts.map +1 -0
  164. package/dist/memory/archive.js +42 -0
  165. package/dist/memory/archive.js.map +1 -0
  166. package/dist/memory/compact.d.ts +9 -0
  167. package/dist/memory/compact.d.ts.map +1 -0
  168. package/dist/memory/compact.js +33 -0
  169. package/dist/memory/compact.js.map +1 -0
  170. package/dist/memory/conflicts.d.ts +8 -0
  171. package/dist/memory/conflicts.d.ts.map +1 -0
  172. package/dist/memory/conflicts.js +28 -0
  173. package/dist/memory/conflicts.js.map +1 -0
  174. package/dist/memory/promote.d.ts +8 -0
  175. package/dist/memory/promote.d.ts.map +1 -0
  176. package/dist/memory/promote.js +10 -0
  177. package/dist/memory/promote.js.map +1 -0
  178. package/dist/memory/store-utils.d.ts +14 -0
  179. package/dist/memory/store-utils.d.ts.map +1 -0
  180. package/dist/memory/store-utils.js +44 -0
  181. package/dist/memory/store-utils.js.map +1 -0
  182. package/dist/migrate/types.d.ts +2 -2
  183. package/package.json +1 -1
@@ -3,6 +3,11 @@ import path from "node:path";
3
3
  import pc from "picocolors";
4
4
  import { checkDocsReferences } from "../core/check-docs-references.js";
5
5
  import { collectProviderContractDiagnostics } from "../migrate/provider-contract-diagnostics.js";
6
+ import { isHookScript } from "../core/is-hook-script.js";
7
+ import { checkWorkflowDrift } from "../core/check-workflow-drift.js";
8
+ import { checkOwnership } from "../core/build-inventory.js";
9
+ import { checkPacks } from "../core/check-packs.js";
10
+ const ok = (cond) => (cond ? "pass" : "fail");
6
11
  /** Find MeowKit .claude/ in cwd only (no walk-up). */
7
12
  function findMeowkitDir(startDir) {
8
13
  const candidate = path.join(startDir, ".claude");
@@ -11,13 +16,14 @@ function findMeowkitDir(startDir) {
11
16
  }
12
17
  return null;
13
18
  }
14
- function checkFileExists(meowkitDir, relativePath) {
15
- const fullPath = path.join(meowkitDir, relativePath);
19
+ function checkFileExists(baseDir, relativePath, section) {
20
+ const fullPath = path.join(baseDir, relativePath);
16
21
  const exists = fs.existsSync(fullPath);
17
22
  return {
18
23
  name: `File exists: ${relativePath}`,
19
- passed: exists,
24
+ status: ok(exists),
20
25
  detail: exists ? fullPath : `Missing: ${fullPath}`,
26
+ section,
21
27
  };
22
28
  }
23
29
  function checkDirExists(meowkitDir, relativePath) {
@@ -25,167 +31,237 @@ function checkDirExists(meowkitDir, relativePath) {
25
31
  const exists = fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory();
26
32
  return {
27
33
  name: `Directory exists: ${relativePath}`,
28
- passed: exists,
34
+ status: ok(exists),
29
35
  detail: exists ? fullPath : `Missing: ${fullPath}`,
36
+ section: "Structure",
30
37
  };
31
38
  }
32
- function checkHooksExecutable(meowkitDir) {
39
+ export function checkHooksExecutable(meowkitDir) {
33
40
  const hooksDir = path.join(meowkitDir, "hooks");
34
41
  const results = [];
35
42
  if (!fs.existsSync(hooksDir)) {
36
- results.push({
37
- name: "Hooks directory",
38
- passed: false,
39
- detail: `Missing: ${hooksDir}`,
40
- });
43
+ results.push({ name: "Hooks directory", status: "fail", detail: `Missing: ${hooksDir}`, section: "Hooks" });
41
44
  return results;
42
45
  }
43
- const hookFiles = fs.readdirSync(hooksDir).filter((f) => !f.startsWith("."));
46
+ // Only real hook scripts. Directories (lib/, handlers/, __tests__/) and sidecars
47
+ // (HOOKS_INDEX.md, handlers.json) are NOT hooks — the old code reported them as
48
+ // "Hook executable" because accessSync(X_OK) succeeds on a traversable directory.
49
+ const entries = fs.readdirSync(hooksDir).filter((f) => !f.startsWith("."));
50
+ const hookFiles = entries.filter((f) => isHookScript(path.join(hooksDir, f)));
51
+ const skipped = entries.length - hookFiles.length;
44
52
  if (hookFiles.length === 0) {
45
- results.push({
46
- name: "Hooks present",
47
- passed: false,
48
- detail: "No hook files found in hooks/",
49
- });
53
+ results.push({ name: "Hooks present", status: "fail", detail: "No hook scripts found in hooks/", section: "Hooks" });
50
54
  return results;
51
55
  }
52
56
  for (const hook of hookFiles) {
53
57
  const hookPath = path.join(hooksDir, hook);
58
+ let executable = true;
54
59
  try {
55
60
  fs.accessSync(hookPath, fs.constants.X_OK);
56
- results.push({
57
- name: `Hook executable: ${hook}`,
58
- passed: true,
59
- detail: hookPath,
60
- });
61
61
  }
62
62
  catch {
63
- results.push({
64
- name: `Hook executable: ${hook}`,
65
- passed: false,
66
- detail: `Not executable: ${hookPath}`,
67
- });
63
+ executable = false;
68
64
  }
65
+ results.push({
66
+ name: `Hook executable: ${hook}`,
67
+ status: ok(executable),
68
+ detail: executable ? hookPath : `Not executable: ${hookPath}`,
69
+ section: "Hooks",
70
+ });
71
+ }
72
+ if (skipped > 0) {
73
+ results.push({
74
+ name: "Hooks: non-script entries skipped",
75
+ status: "pass",
76
+ detail: `${skipped} non-script entr(ies) in hooks/ (subdirs, .md, .json) correctly excluded.`,
77
+ section: "Hooks",
78
+ });
69
79
  }
70
80
  return results;
71
81
  }
72
82
  function checkConfigJson(meowkitDir) {
73
83
  const configPath = path.join(meowkitDir, "meowkit.config.json");
74
84
  if (!fs.existsSync(configPath)) {
75
- return {
76
- name: "Config JSON valid",
77
- passed: false,
78
- detail: `Missing: ${configPath}`,
79
- };
85
+ return { name: "Config JSON valid", status: "fail", detail: `Missing: ${configPath}`, section: "Structure" };
80
86
  }
81
87
  try {
82
- const content = fs.readFileSync(configPath, "utf-8");
83
- JSON.parse(content);
84
- return {
85
- name: "Config JSON valid",
86
- passed: true,
87
- detail: configPath,
88
- };
88
+ JSON.parse(fs.readFileSync(configPath, "utf-8"));
89
+ return { name: "Config JSON valid", status: "pass", detail: configPath, section: "Structure" };
89
90
  }
90
91
  catch (error) {
91
92
  const message = error instanceof Error ? error.message : String(error);
92
- return {
93
- name: "Config JSON valid",
94
- passed: false,
95
- detail: `Invalid JSON: ${message}`,
96
- };
93
+ return { name: "Config JSON valid", status: "fail", detail: `Invalid JSON: ${message}`, section: "Structure" };
97
94
  }
98
95
  }
99
96
  function checkDocsRefsContract(meowkitDir) {
100
- const results = [];
101
97
  const contractPath = path.join(meowkitDir, "rules", "docs-reference-contract.md");
102
98
  if (!fs.existsSync(contractPath)) {
103
- results.push({
104
- name: "Docs-reference contract present",
105
- passed: false,
106
- detail: `Missing: ${contractPath}`,
107
- });
108
- return results;
99
+ return [{ name: "Docs-reference contract present", status: "fail", detail: `Missing: ${contractPath}`, section: "Docs" }];
109
100
  }
110
101
  try {
111
102
  const { scannedFiles, findings, errorCount, warnCount } = checkDocsReferences(meowkitDir);
112
- const passed = errorCount === 0;
113
103
  const summary = `Scanned ${scannedFiles} files — ${errorCount} error(s), ${warnCount} warning(s)`;
114
- const detail = passed
104
+ const status = errorCount > 0 ? "fail" : warnCount > 0 ? "warn" : "pass";
105
+ const detail = errorCount === 0
115
106
  ? summary
116
107
  : `${summary}\n ${findings
117
108
  .filter((f) => f.level === "ERROR")
118
109
  .slice(0, 10)
119
110
  .map((f) => `${f.file}:${f.line}: ${f.token}`)
120
111
  .join("\n ")}`;
121
- results.push({
122
- name: "Docs references on Type-1 allowlist",
123
- passed,
124
- detail,
125
- });
112
+ return [{ name: "Docs references on Type-1 allowlist", status, detail, section: "Docs" }];
126
113
  }
127
114
  catch (error) {
128
115
  const message = error instanceof Error ? error.message : String(error);
116
+ return [{ name: "Docs references on Type-1 allowlist", status: "fail", detail: `Validator crashed: ${message}`, section: "Docs" }];
117
+ }
118
+ }
119
+ /**
120
+ * Honest portability rendering. The old code did `if (severity === "pass") continue` (hiding
121
+ * configured surfaces) and `passed: severity !== "fail"` (rendering WARN as green PASS, and
122
+ * never surfacing unsupported surfaces). Now: pass→PASS, warn→WARN, fail→FAIL, and an
123
+ * `unsupported` surface → N/A. A one-line coverage summary makes the totals explicit.
124
+ */
125
+ /**
126
+ * Map a provider diagnostic to an honest status. Crucially: a `warn`-severity diagnostic
127
+ * renders WARN (the old code mapped it to PASS), and an `unsupported` surface renders N/A
128
+ * (the old code silently dropped it).
129
+ */
130
+ export function diagnosticToStatus(surfaceStatus, severity) {
131
+ if (surfaceStatus === "unsupported")
132
+ return "na";
133
+ if (severity === "fail")
134
+ return "fail";
135
+ if (severity === "warn")
136
+ return "warn";
137
+ return "pass";
138
+ }
139
+ function checkPortability() {
140
+ const diagnostics = collectProviderContractDiagnostics();
141
+ const results = [];
142
+ let nPass = 0, nWarn = 0, nNa = 0, nFail = 0;
143
+ for (const d of diagnostics) {
144
+ const status = diagnosticToStatus(d.surfaceStatus, d.severity);
145
+ if (status === "na")
146
+ nNa++;
147
+ else if (status === "fail")
148
+ nFail++;
149
+ else if (status === "warn")
150
+ nWarn++;
151
+ else
152
+ nPass++;
129
153
  results.push({
130
- name: "Docs references on Type-1 allowlist",
131
- passed: false,
132
- detail: `Validator crashed: ${message}`,
154
+ name: `Provider contract: ${d.providerDisplayName}/${d.surface}`,
155
+ status,
156
+ detail: d.message,
157
+ section: "Portability",
133
158
  });
134
159
  }
160
+ results.push({
161
+ name: "Portability coverage",
162
+ status: "pass",
163
+ detail: `${nPass} native, ${nNa} N/A, ${nWarn} warn, ${nFail} fail across ${diagnostics.length} surface(s).`,
164
+ section: "Portability",
165
+ });
135
166
  return results;
136
167
  }
168
+ function statusIcon(status) {
169
+ switch (status) {
170
+ case "pass":
171
+ return pc.green("PASS");
172
+ case "warn":
173
+ return pc.yellow("WARN");
174
+ case "na":
175
+ return pc.dim("N/A ");
176
+ case "fail":
177
+ return pc.red("FAIL");
178
+ }
179
+ }
137
180
  function printResult(result) {
138
- const icon = result.passed ? pc.green("PASS") : pc.red("FAIL");
139
- console.log(` [${icon}] ${result.name}`);
140
- if (!result.passed) {
181
+ console.log(` [${statusIcon(result.status)}] ${result.name}`);
182
+ if (result.status !== "pass") {
141
183
  console.log(` ${pc.dim(result.detail)}`);
142
184
  }
143
185
  }
144
186
  export async function validate(args = {}) {
145
187
  console.log(pc.bold(pc.cyan("Validating .claude/ project structure...")));
188
+ console.log(pc.dim("Scope: structure & wiring only. Run `mewkit doctor --hard-gates` to verify the gates actually block."));
146
189
  console.log();
147
190
  const meowkitDir = findMeowkitDir(process.cwd());
148
191
  if (!meowkitDir) {
149
- console.error(pc.red("Could not find .claude/ directory in current or parent directories."));
192
+ console.error(pc.red("Could not find .claude/ directory in the current directory."));
150
193
  process.exit(1);
151
194
  }
152
195
  console.log(`${pc.dim("Found:")} ${meowkitDir}`);
153
196
  console.log();
154
- const results = [];
155
- // Required directories
156
- results.push(checkDirExists(meowkitDir, "agents"));
157
- results.push(checkDirExists(meowkitDir, "hooks"));
158
- // CLAUDE.md lives at project root (Claude Code reads it from there)
159
197
  const projectRoot = path.dirname(meowkitDir);
160
- results.push(checkFileExists(projectRoot, "CLAUDE.md"));
161
- // Hooks executable
162
- results.push(...checkHooksExecutable(meowkitDir));
163
- // Config JSON
164
- results.push(checkConfigJson(meowkitDir));
165
- // Docs-reference contract (Type-1 allowlist)
166
- results.push(...checkDocsRefsContract(meowkitDir));
167
- if (args.portable) {
168
- for (const diagnostic of collectProviderContractDiagnostics()) {
169
- if (diagnostic.severity === "pass")
170
- continue;
171
- results.push({
172
- name: `Provider contract: ${diagnostic.providerDisplayName}/${diagnostic.surface}`,
173
- passed: diagnostic.severity !== "fail",
174
- detail: diagnostic.message,
175
- });
176
- }
198
+ // `--workflow` / `--ownership` scope the run to a single check (cheap CI
199
+ // invocations). The default run includes both alongside the structural checks.
200
+ let results;
201
+ if (args.workflow) {
202
+ results = checkWorkflowDrift(projectRoot);
177
203
  }
178
- for (const result of results) {
179
- printResult(result);
204
+ else if (args.ownership) {
205
+ results = checkOwnership(meowkitDir);
180
206
  }
181
- console.log();
182
- const passCount = results.filter((r) => r.passed).length;
183
- const failCount = results.filter((r) => !r.passed).length;
184
- if (failCount === 0) {
185
- console.log(pc.green(pc.bold(`All ${passCount} checks passed.`)));
207
+ else if (args.packs) {
208
+ results = checkPacks(meowkitDir);
186
209
  }
187
210
  else {
188
- console.log(`${pc.green(`${passCount} passed`)}, ${pc.red(`${failCount} failed`)}`);
211
+ results = [
212
+ checkDirExists(meowkitDir, "agents"),
213
+ checkDirExists(meowkitDir, "hooks"),
214
+ checkFileExists(projectRoot, "CLAUDE.md", "Structure"),
215
+ checkConfigJson(meowkitDir),
216
+ ...checkHooksExecutable(meowkitDir),
217
+ ...checkDocsRefsContract(meowkitDir),
218
+ // Default run is advisory: a wholly-absent governance file WARNs
219
+ // (prompt `mewkit upgrade`) rather than failing an un-synced install.
220
+ // The scoped `--workflow`/`--ownership`/`--packs` paths above stay strict for CI.
221
+ ...checkWorkflowDrift(projectRoot, { missingSpecSeverity: "warn" }),
222
+ ...checkOwnership(meowkitDir, { missingInfraSeverity: "warn" }),
223
+ ...checkPacks(meowkitDir, { missingInfraSeverity: "warn" }),
224
+ ];
225
+ if (args.portable) {
226
+ results.push(...checkPortability());
227
+ }
228
+ }
229
+ // Exhaustiveness guard: the printed `sections` array MUST list every `Section`
230
+ // union member, or a check's results compute but never render. The mapped type
231
+ // fails to compile if a member is missing here, keeping union + array in sync.
232
+ // ("Inventory" is produced only by `inventory --check`, listed for completeness.)
233
+ const SECTION_ORDER = {
234
+ Structure: true,
235
+ Hooks: true,
236
+ Portability: true,
237
+ Docs: true,
238
+ Workflow: true,
239
+ Ownership: true,
240
+ Packs: true,
241
+ Inventory: true,
242
+ };
243
+ const sections = Object.keys(SECTION_ORDER);
244
+ for (const section of sections) {
245
+ const inSection = results.filter((r) => r.section === section);
246
+ if (inSection.length === 0)
247
+ continue;
248
+ console.log(pc.bold(section));
249
+ for (const r of inSection)
250
+ printResult(r);
251
+ console.log();
252
+ }
253
+ const count = (s) => results.filter((r) => r.status === s).length;
254
+ const pass = count("pass"), warn = count("warn"), na = count("na"), fail = count("fail");
255
+ const parts = [pc.green(`${pass} passed`)];
256
+ if (warn > 0)
257
+ parts.push(pc.yellow(`${warn} warnings`));
258
+ if (na > 0)
259
+ parts.push(pc.dim(`${na} n/a`));
260
+ if (fail > 0)
261
+ parts.push(pc.red(`${fail} failed`));
262
+ console.log(parts.join(", "));
263
+ // FAIL always fails the build. WARN fails only under --strict (off by default).
264
+ if (fail > 0 || (args.strict && warn > 0)) {
189
265
  process.exit(1);
190
266
  }
191
267
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { CheckResult } from "../commands/validate.js";
2
+ import type { Status } from "../commands/doctor-checks.js";
3
+ export type ArtifactType = "skill" | "agent" | "rule" | "command" | "hook";
4
+ /** Frozen contract — the stale-index check consumes this shape. */
5
+ export interface InventoryEntry {
6
+ type: ArtifactType;
7
+ path: string;
8
+ id: string;
9
+ owner: string;
10
+ criticality: string;
11
+ status: string;
12
+ runtime: string;
13
+ contextCost?: string;
14
+ dependsOn?: string[];
15
+ source: "frontmatter" | "registry";
16
+ }
17
+ /** A structural or metadata problem surfaced honestly rather than skipped. */
18
+ export interface InventoryIssue {
19
+ path: string;
20
+ type: ArtifactType | "unknown";
21
+ problem: string;
22
+ }
23
+ export interface Inventory {
24
+ entries: InventoryEntry[];
25
+ issues: InventoryIssue[];
26
+ }
27
+ interface ArtifactRef {
28
+ type: ArtifactType;
29
+ rel: string;
30
+ abs: string;
31
+ id: string;
32
+ metaSource: "frontmatter" | "registry";
33
+ }
34
+ /**
35
+ * The canonical "what counts" enumeration. Returns artifact references plus any
36
+ * structural anomalies (e.g. a skill subdir with no SKILL.md that is not a known
37
+ * runtime dir). Counting is presence-based; rules and rules-conditional are
38
+ * deliberately NOT merged — callers label them as separate buckets.
39
+ */
40
+ export declare function enumerateArtifacts(claudeDir: string): {
41
+ refs: ArtifactRef[];
42
+ issues: InventoryIssue[];
43
+ };
44
+ /** Read the central registry for rules/commands/hooks. */
45
+ export declare function readRegistry(claudeDir: string): Record<string, Record<string, unknown>>;
46
+ /**
47
+ * Build the unified inventory. Each artifact's metadata comes from frontmatter
48
+ * (skills/agents) or the registry (rules/commands/hooks). Missing records and
49
+ * missing required fields are recorded as issues — never silently defaulted to
50
+ * a passing value.
51
+ */
52
+ export declare function buildInventory(claudeDir: string): Inventory;
53
+ interface SchemaEnums {
54
+ owner: Set<string>;
55
+ criticality: Set<string>;
56
+ status: Set<string>;
57
+ runtime: Set<string>;
58
+ }
59
+ /** Load the allowed-enum sets from the governance schema (single source). */
60
+ export declare function loadSchemaEnums(claudeDir: string): SchemaEnums | null;
61
+ /**
62
+ * Ownership-completeness validation. FAILS when any artifact lacks a metadata
63
+ * record, is missing a required field, or carries an out-of-enum value, or when
64
+ * a structural anomaly exists (unknown dir, stale registry entry). PASSES only
65
+ * when every discovered artifact is 100% covered with valid values.
66
+ */
67
+ export declare function checkOwnership(claudeDir: string, opts?: {
68
+ missingInfraSeverity?: Status;
69
+ }): CheckResult[];
70
+ export {};
71
+ //# sourceMappingURL=build-inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-inventory.d.ts","sourceRoot":"","sources":["../../src/core/build-inventory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAS3D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3E,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC;CACnC;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACzB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAC;CACzB;AAOD,UAAU,WAAW;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,aAAa,GAAG,UAAU,CAAC;CACvC;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,CAuDvG;AAmBD,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASvF;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAuC3D;AAED,UAAU,WAAW;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACrB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiBrE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,EAAE,CAwD7G"}