mewkit 1.10.2 → 1.10.4

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 (231) hide show
  1. package/README.md +49 -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 +170 -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 +77 -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 +64 -3
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/inventory.d.ts +13 -0
  31. package/dist/commands/inventory.d.ts.map +1 -0
  32. package/dist/commands/inventory.js +85 -0
  33. package/dist/commands/inventory.js.map +1 -0
  34. package/dist/commands/pack-helpers.d.ts +37 -0
  35. package/dist/commands/pack-helpers.d.ts.map +1 -0
  36. package/dist/commands/pack-helpers.js +105 -0
  37. package/dist/commands/pack-helpers.js.map +1 -0
  38. package/dist/commands/pack.d.ts +9 -0
  39. package/dist/commands/pack.d.ts.map +1 -0
  40. package/dist/commands/pack.js +160 -0
  41. package/dist/commands/pack.js.map +1 -0
  42. package/dist/commands/policy.d.ts +8 -0
  43. package/dist/commands/policy.d.ts.map +1 -0
  44. package/dist/commands/policy.js +65 -0
  45. package/dist/commands/policy.js.map +1 -0
  46. package/dist/commands/portability.d.ts +7 -0
  47. package/dist/commands/portability.d.ts.map +1 -0
  48. package/dist/commands/portability.js +50 -0
  49. package/dist/commands/portability.js.map +1 -0
  50. package/dist/commands/providers.d.ts +6 -0
  51. package/dist/commands/providers.d.ts.map +1 -0
  52. package/dist/commands/providers.js +94 -0
  53. package/dist/commands/providers.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 +32 -6
  64. package/dist/commands/upgrade.js.map +1 -1
  65. package/dist/commands/validate.d.ts +29 -0
  66. package/dist/commands/validate.d.ts.map +1 -1
  67. package/dist/commands/validate.js +242 -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/compute-checksums.d.ts +7 -0
  86. package/dist/core/compute-checksums.d.ts.map +1 -1
  87. package/dist/core/compute-checksums.js +12 -3
  88. package/dist/core/compute-checksums.js.map +1 -1
  89. package/dist/core/context-budget.d.ts +9 -0
  90. package/dist/core/context-budget.d.ts.map +1 -0
  91. package/dist/core/context-budget.js +46 -0
  92. package/dist/core/context-budget.js.map +1 -0
  93. package/dist/core/event-log.d.ts +44 -0
  94. package/dist/core/event-log.d.ts.map +1 -0
  95. package/dist/core/event-log.js +169 -0
  96. package/dist/core/event-log.js.map +1 -0
  97. package/dist/core/evolution/event-clusters.d.ts +4 -0
  98. package/dist/core/evolution/event-clusters.d.ts.map +1 -0
  99. package/dist/core/evolution/event-clusters.js +82 -0
  100. package/dist/core/evolution/event-clusters.js.map +1 -0
  101. package/dist/core/evolution/recommendation-renderer.d.ts +3 -0
  102. package/dist/core/evolution/recommendation-renderer.d.ts.map +1 -0
  103. package/dist/core/evolution/recommendation-renderer.js +24 -0
  104. package/dist/core/evolution/recommendation-renderer.js.map +1 -0
  105. package/dist/core/evolution/review-failure-clusters.d.ts +10 -0
  106. package/dist/core/evolution/review-failure-clusters.d.ts.map +1 -0
  107. package/dist/core/evolution/review-failure-clusters.js +30 -0
  108. package/dist/core/evolution/review-failure-clusters.js.map +1 -0
  109. package/dist/core/evolution/suggestions.d.ts +24 -0
  110. package/dist/core/evolution/suggestions.d.ts.map +1 -0
  111. package/dist/core/evolution/suggestions.js +11 -0
  112. package/dist/core/evolution/suggestions.js.map +1 -0
  113. package/dist/core/file-lock.d.ts +3 -0
  114. package/dist/core/file-lock.d.ts.map +1 -0
  115. package/dist/core/file-lock.js +84 -0
  116. package/dist/core/file-lock.js.map +1 -0
  117. package/dist/core/gate-policy.d.ts +20 -0
  118. package/dist/core/gate-policy.d.ts.map +1 -0
  119. package/dist/core/gate-policy.js +64 -0
  120. package/dist/core/gate-policy.js.map +1 -0
  121. package/dist/core/harness-scaffold.d.ts +29 -0
  122. package/dist/core/harness-scaffold.d.ts.map +1 -0
  123. package/dist/core/harness-scaffold.js +53 -0
  124. package/dist/core/harness-scaffold.js.map +1 -0
  125. package/dist/core/hook-runner.d.ts +69 -0
  126. package/dist/core/hook-runner.d.ts.map +1 -0
  127. package/dist/core/hook-runner.js +95 -0
  128. package/dist/core/hook-runner.js.map +1 -0
  129. package/dist/core/index.d.ts +6 -0
  130. package/dist/core/index.d.ts.map +1 -1
  131. package/dist/core/index.js +6 -0
  132. package/dist/core/index.js.map +1 -1
  133. package/dist/core/install-metadata-backref.d.ts +14 -0
  134. package/dist/core/install-metadata-backref.d.ts.map +1 -0
  135. package/dist/core/install-metadata-backref.js +39 -0
  136. package/dist/core/install-metadata-backref.js.map +1 -0
  137. package/dist/core/install-metadata-writer.d.ts +4 -0
  138. package/dist/core/install-metadata-writer.d.ts.map +1 -0
  139. package/dist/core/install-metadata-writer.js +31 -0
  140. package/dist/core/install-metadata-writer.js.map +1 -0
  141. package/dist/core/install-metadata.d.ts +173 -0
  142. package/dist/core/install-metadata.d.ts.map +1 -0
  143. package/dist/core/install-metadata.js +191 -0
  144. package/dist/core/install-metadata.js.map +1 -0
  145. package/dist/core/is-hook-script.d.ts +2 -0
  146. package/dist/core/is-hook-script.d.ts.map +1 -0
  147. package/dist/core/is-hook-script.js +45 -0
  148. package/dist/core/is-hook-script.js.map +1 -0
  149. package/dist/core/pack-manifest.d.ts +48 -0
  150. package/dist/core/pack-manifest.d.ts.map +1 -0
  151. package/dist/core/pack-manifest.js +126 -0
  152. package/dist/core/pack-manifest.js.map +1 -0
  153. package/dist/core/pack-resolver.d.ts +18 -0
  154. package/dist/core/pack-resolver.d.ts.map +1 -0
  155. package/dist/core/pack-resolver.js +144 -0
  156. package/dist/core/pack-resolver.js.map +1 -0
  157. package/dist/core/portability-matrix.d.ts +17 -0
  158. package/dist/core/portability-matrix.d.ts.map +1 -0
  159. package/dist/core/portability-matrix.js +31 -0
  160. package/dist/core/portability-matrix.js.map +1 -0
  161. package/dist/core/release-metadata.d.ts +80 -0
  162. package/dist/core/release-metadata.d.ts.map +1 -0
  163. package/dist/core/release-metadata.js +70 -0
  164. package/dist/core/release-metadata.js.map +1 -0
  165. package/dist/core/simulation-runner.d.ts +93 -0
  166. package/dist/core/simulation-runner.d.ts.map +1 -0
  167. package/dist/core/simulation-runner.js +161 -0
  168. package/dist/core/simulation-runner.js.map +1 -0
  169. package/dist/core/smart-update.d.ts +32 -0
  170. package/dist/core/smart-update.d.ts.map +1 -1
  171. package/dist/core/smart-update.js +239 -47
  172. package/dist/core/smart-update.js.map +1 -1
  173. package/dist/core/usage/usage-analyzer.d.ts +18 -0
  174. package/dist/core/usage/usage-analyzer.d.ts.map +1 -0
  175. package/dist/core/usage/usage-analyzer.js +41 -0
  176. package/dist/core/usage/usage-analyzer.js.map +1 -0
  177. package/dist/core/validate-install.d.ts.map +1 -1
  178. package/dist/core/validate-install.js +3 -1
  179. package/dist/core/validate-install.js.map +1 -1
  180. package/dist/index.js +91 -4
  181. package/dist/index.js.map +1 -1
  182. package/dist/memory/archive.d.ts +9 -0
  183. package/dist/memory/archive.d.ts.map +1 -0
  184. package/dist/memory/archive.js +42 -0
  185. package/dist/memory/archive.js.map +1 -0
  186. package/dist/memory/compact.d.ts +9 -0
  187. package/dist/memory/compact.d.ts.map +1 -0
  188. package/dist/memory/compact.js +33 -0
  189. package/dist/memory/compact.js.map +1 -0
  190. package/dist/memory/conflicts.d.ts +8 -0
  191. package/dist/memory/conflicts.d.ts.map +1 -0
  192. package/dist/memory/conflicts.js +28 -0
  193. package/dist/memory/conflicts.js.map +1 -0
  194. package/dist/memory/promote.d.ts +8 -0
  195. package/dist/memory/promote.d.ts.map +1 -0
  196. package/dist/memory/promote.js +10 -0
  197. package/dist/memory/promote.js.map +1 -0
  198. package/dist/memory/store-utils.d.ts +14 -0
  199. package/dist/memory/store-utils.d.ts.map +1 -0
  200. package/dist/memory/store-utils.js +44 -0
  201. package/dist/memory/store-utils.js.map +1 -0
  202. package/dist/migrate/converters/md-to-codex-rules.d.ts.map +1 -1
  203. package/dist/migrate/converters/md-to-codex-rules.js +30 -0
  204. package/dist/migrate/converters/md-to-codex-rules.js.map +1 -1
  205. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  206. package/dist/migrate/migrate-orchestrator.js +6 -2
  207. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  208. package/dist/migrate/portability-policy.d.ts.map +1 -1
  209. package/dist/migrate/portability-policy.js +44 -23
  210. package/dist/migrate/portability-policy.js.map +1 -1
  211. package/dist/migrate/portable-installer.d.ts +3 -0
  212. package/dist/migrate/portable-installer.d.ts.map +1 -1
  213. package/dist/migrate/portable-installer.js +3 -0
  214. package/dist/migrate/portable-installer.js.map +1 -1
  215. package/dist/migrate/provider-support-summary.d.ts +49 -0
  216. package/dist/migrate/provider-support-summary.d.ts.map +1 -0
  217. package/dist/migrate/provider-support-summary.js +98 -0
  218. package/dist/migrate/provider-support-summary.js.map +1 -0
  219. package/dist/migrate/reconcile/portable-registry-lock.d.ts.map +1 -1
  220. package/dist/migrate/reconcile/portable-registry-lock.js +6 -78
  221. package/dist/migrate/reconcile/portable-registry-lock.js.map +1 -1
  222. package/dist/migrate/reconcile/portable-registry.d.ts +24 -6
  223. package/dist/migrate/reconcile/portable-registry.d.ts.map +1 -1
  224. package/dist/migrate/reconcile/portable-registry.js +7 -1
  225. package/dist/migrate/reconcile/portable-registry.js.map +1 -1
  226. package/dist/migrate/skill-directory-installer.d.ts +2 -0
  227. package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
  228. package/dist/migrate/skill-directory-installer.js +3 -0
  229. package/dist/migrate/skill-directory-installer.js.map +1 -1
  230. package/dist/migrate/types.d.ts +4 -4
  231. package/package.json +1 -1
@@ -3,6 +3,14 @@ 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
+ import { analyzeCodexRuleSource } from "../migrate/converters/index.js";
11
+ import { discoverRules, discoverSkills } from "../migrate/discovery/index.js";
12
+ import { buildPortableSkillsByProvider } from "../migrate/portability-policy.js";
13
+ const ok = (cond) => (cond ? "pass" : "fail");
6
14
  /** Find MeowKit .claude/ in cwd only (no walk-up). */
7
15
  function findMeowkitDir(startDir) {
8
16
  const candidate = path.join(startDir, ".claude");
@@ -11,13 +19,14 @@ function findMeowkitDir(startDir) {
11
19
  }
12
20
  return null;
13
21
  }
14
- function checkFileExists(meowkitDir, relativePath) {
15
- const fullPath = path.join(meowkitDir, relativePath);
22
+ function checkFileExists(baseDir, relativePath, section) {
23
+ const fullPath = path.join(baseDir, relativePath);
16
24
  const exists = fs.existsSync(fullPath);
17
25
  return {
18
26
  name: `File exists: ${relativePath}`,
19
- passed: exists,
27
+ status: ok(exists),
20
28
  detail: exists ? fullPath : `Missing: ${fullPath}`,
29
+ section,
21
30
  };
22
31
  }
23
32
  function checkDirExists(meowkitDir, relativePath) {
@@ -25,167 +34,306 @@ function checkDirExists(meowkitDir, relativePath) {
25
34
  const exists = fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory();
26
35
  return {
27
36
  name: `Directory exists: ${relativePath}`,
28
- passed: exists,
37
+ status: ok(exists),
29
38
  detail: exists ? fullPath : `Missing: ${fullPath}`,
39
+ section: "Structure",
30
40
  };
31
41
  }
32
- function checkHooksExecutable(meowkitDir) {
42
+ export function checkHooksExecutable(meowkitDir) {
33
43
  const hooksDir = path.join(meowkitDir, "hooks");
34
44
  const results = [];
35
45
  if (!fs.existsSync(hooksDir)) {
36
- results.push({
37
- name: "Hooks directory",
38
- passed: false,
39
- detail: `Missing: ${hooksDir}`,
40
- });
46
+ results.push({ name: "Hooks directory", status: "fail", detail: `Missing: ${hooksDir}`, section: "Hooks" });
41
47
  return results;
42
48
  }
43
- const hookFiles = fs.readdirSync(hooksDir).filter((f) => !f.startsWith("."));
49
+ // Only real hook scripts. Directories (lib/, handlers/, __tests__/) and sidecars
50
+ // (HOOKS_INDEX.md, handlers.json) are NOT hooks — the old code reported them as
51
+ // "Hook executable" because accessSync(X_OK) succeeds on a traversable directory.
52
+ const entries = fs.readdirSync(hooksDir).filter((f) => !f.startsWith("."));
53
+ const hookFiles = entries.filter((f) => isHookScript(path.join(hooksDir, f)));
54
+ const skipped = entries.length - hookFiles.length;
44
55
  if (hookFiles.length === 0) {
45
- results.push({
46
- name: "Hooks present",
47
- passed: false,
48
- detail: "No hook files found in hooks/",
49
- });
56
+ results.push({ name: "Hooks present", status: "fail", detail: "No hook scripts found in hooks/", section: "Hooks" });
50
57
  return results;
51
58
  }
52
59
  for (const hook of hookFiles) {
53
60
  const hookPath = path.join(hooksDir, hook);
61
+ let executable = true;
54
62
  try {
55
63
  fs.accessSync(hookPath, fs.constants.X_OK);
56
- results.push({
57
- name: `Hook executable: ${hook}`,
58
- passed: true,
59
- detail: hookPath,
60
- });
61
64
  }
62
65
  catch {
63
- results.push({
64
- name: `Hook executable: ${hook}`,
65
- passed: false,
66
- detail: `Not executable: ${hookPath}`,
67
- });
66
+ executable = false;
68
67
  }
68
+ results.push({
69
+ name: `Hook executable: ${hook}`,
70
+ status: ok(executable),
71
+ detail: executable ? hookPath : `Not executable: ${hookPath}`,
72
+ section: "Hooks",
73
+ });
74
+ }
75
+ if (skipped > 0) {
76
+ results.push({
77
+ name: "Hooks: non-script entries skipped",
78
+ status: "pass",
79
+ detail: `${skipped} non-script entr(ies) in hooks/ (subdirs, .md, .json) correctly excluded.`,
80
+ section: "Hooks",
81
+ });
69
82
  }
70
83
  return results;
71
84
  }
72
85
  function checkConfigJson(meowkitDir) {
73
86
  const configPath = path.join(meowkitDir, "meowkit.config.json");
74
87
  if (!fs.existsSync(configPath)) {
75
- return {
76
- name: "Config JSON valid",
77
- passed: false,
78
- detail: `Missing: ${configPath}`,
79
- };
88
+ return { name: "Config JSON valid", status: "fail", detail: `Missing: ${configPath}`, section: "Structure" };
80
89
  }
81
90
  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
- };
91
+ JSON.parse(fs.readFileSync(configPath, "utf-8"));
92
+ return { name: "Config JSON valid", status: "pass", detail: configPath, section: "Structure" };
89
93
  }
90
94
  catch (error) {
91
95
  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
- };
96
+ return { name: "Config JSON valid", status: "fail", detail: `Invalid JSON: ${message}`, section: "Structure" };
97
97
  }
98
98
  }
99
99
  function checkDocsRefsContract(meowkitDir) {
100
- const results = [];
101
100
  const contractPath = path.join(meowkitDir, "rules", "docs-reference-contract.md");
102
101
  if (!fs.existsSync(contractPath)) {
103
- results.push({
104
- name: "Docs-reference contract present",
105
- passed: false,
106
- detail: `Missing: ${contractPath}`,
107
- });
108
- return results;
102
+ return [{ name: "Docs-reference contract present", status: "fail", detail: `Missing: ${contractPath}`, section: "Docs" }];
109
103
  }
110
104
  try {
111
105
  const { scannedFiles, findings, errorCount, warnCount } = checkDocsReferences(meowkitDir);
112
- const passed = errorCount === 0;
113
106
  const summary = `Scanned ${scannedFiles} files — ${errorCount} error(s), ${warnCount} warning(s)`;
114
- const detail = passed
107
+ const status = errorCount > 0 ? "fail" : warnCount > 0 ? "warn" : "pass";
108
+ const detail = errorCount === 0
115
109
  ? summary
116
110
  : `${summary}\n ${findings
117
111
  .filter((f) => f.level === "ERROR")
118
112
  .slice(0, 10)
119
113
  .map((f) => `${f.file}:${f.line}: ${f.token}`)
120
114
  .join("\n ")}`;
121
- results.push({
122
- name: "Docs references on Type-1 allowlist",
123
- passed,
124
- detail,
125
- });
115
+ return [{ name: "Docs references on Type-1 allowlist", status, detail, section: "Docs" }];
126
116
  }
127
117
  catch (error) {
128
118
  const message = error instanceof Error ? error.message : String(error);
119
+ return [{ name: "Docs references on Type-1 allowlist", status: "fail", detail: `Validator crashed: ${message}`, section: "Docs" }];
120
+ }
121
+ }
122
+ /**
123
+ * Honest portability rendering. The old code did `if (severity === "pass") continue` (hiding
124
+ * configured surfaces) and `passed: severity !== "fail"` (rendering WARN as green PASS, and
125
+ * never surfacing unsupported surfaces). Now: pass→PASS, warn→WARN, fail→FAIL, and an
126
+ * `unsupported` surface → N/A. A one-line coverage summary makes the totals explicit.
127
+ */
128
+ /**
129
+ * Map a provider diagnostic to an honest status. Crucially: a `warn`-severity diagnostic
130
+ * renders WARN (the old code mapped it to PASS), and an `unsupported` surface renders N/A
131
+ * (the old code silently dropped it).
132
+ */
133
+ export function diagnosticToStatus(surfaceStatus, severity) {
134
+ if (surfaceStatus === "unsupported")
135
+ return "na";
136
+ if (severity === "fail")
137
+ return "fail";
138
+ if (severity === "warn")
139
+ return "warn";
140
+ return "pass";
141
+ }
142
+ function checkPortability() {
143
+ const diagnostics = collectProviderContractDiagnostics();
144
+ const results = [];
145
+ let nPass = 0, nWarn = 0, nNa = 0, nFail = 0;
146
+ for (const d of diagnostics) {
147
+ const status = diagnosticToStatus(d.surfaceStatus, d.severity);
148
+ if (status === "na")
149
+ nNa++;
150
+ else if (status === "fail")
151
+ nFail++;
152
+ else if (status === "warn")
153
+ nWarn++;
154
+ else
155
+ nPass++;
129
156
  results.push({
130
- name: "Docs references on Type-1 allowlist",
131
- passed: false,
132
- detail: `Validator crashed: ${message}`,
157
+ name: `Provider contract: ${d.providerDisplayName}/${d.surface}`,
158
+ status,
159
+ detail: d.message,
160
+ section: "Portability",
133
161
  });
134
162
  }
163
+ results.push({
164
+ name: "Portability coverage",
165
+ status: "pass",
166
+ detail: `${nPass} native, ${nNa} N/A, ${nWarn} warn, ${nFail} fail across ${diagnostics.length} surface(s).`,
167
+ section: "Portability",
168
+ });
135
169
  return results;
136
170
  }
171
+ function countFiles(dir, predicate) {
172
+ if (!fs.existsSync(dir))
173
+ return 0;
174
+ let count = 0;
175
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
176
+ if (entry.name.startsWith("."))
177
+ continue;
178
+ const fullPath = path.join(dir, entry.name);
179
+ if (entry.isDirectory()) {
180
+ count += countFiles(fullPath, predicate);
181
+ }
182
+ else if (entry.isFile() && predicate(entry.name, fullPath)) {
183
+ count += 1;
184
+ }
185
+ }
186
+ return count;
187
+ }
188
+ function countSkillDirs(dir) {
189
+ if (!fs.existsSync(dir))
190
+ return 0;
191
+ return fs
192
+ .readdirSync(dir, { withFileTypes: true })
193
+ .filter((entry) => entry.isDirectory() && fs.existsSync(path.join(dir, entry.name, "SKILL.md"))).length;
194
+ }
195
+ function projectionCountResult(name, expected, actual, detail) {
196
+ return {
197
+ name,
198
+ status: expected === 0 || actual >= expected ? "pass" : "fail",
199
+ detail: expected === 0 ? `${detail} — no portable source items expected.` : `${detail}: expected ${expected}, found ${actual}.`,
200
+ section: "Portability",
201
+ };
202
+ }
203
+ export async function checkCodexProjection(projectRoot) {
204
+ const codexDir = path.join(projectRoot, ".codex");
205
+ const skillsDir = path.join(projectRoot, ".agents", "skills");
206
+ if (!fs.existsSync(codexDir) && !fs.existsSync(skillsDir))
207
+ return [];
208
+ const results = [
209
+ {
210
+ name: "Codex projection: AGENTS.md",
211
+ status: ok(fs.existsSync(path.join(projectRoot, "AGENTS.md"))),
212
+ detail: "Codex project instructions file",
213
+ section: "Portability",
214
+ },
215
+ {
216
+ name: "Codex projection: unsupported command dirs absent",
217
+ status: ok(!fs.existsSync(path.join(codexDir, "commands")) && !fs.existsSync(path.join(codexDir, "prompts"))),
218
+ detail: "Codex custom command directories are not documented; migration must not emit them.",
219
+ section: "Portability",
220
+ },
221
+ ];
222
+ const sourceRulesDir = path.join(projectRoot, ".claude", "rules");
223
+ if (fs.existsSync(sourceRulesDir)) {
224
+ const sourceRules = await discoverRules(sourceRulesDir);
225
+ const expectedRules = sourceRules.filter((rule) => analyzeCodexRuleSource(rule).kind !== "unsupported").length;
226
+ const actualRules = countFiles(path.join(codexDir, "rules"), (name) => name.endsWith(".rules"));
227
+ results.push(projectionCountResult("Codex projection: command-policy rules", expectedRules, actualRules, "Translated source rules with Codex-compatible command policies"));
228
+ }
229
+ const sourceSkillsDir = path.join(projectRoot, ".claude", "skills");
230
+ if (fs.existsSync(sourceSkillsDir)) {
231
+ const sourceSkills = await discoverSkills(sourceSkillsDir);
232
+ const portableSkills = await buildPortableSkillsByProvider(sourceSkills, ["codex"]);
233
+ const expectedSkills = portableSkills.skillsByProvider.get("codex")?.length ?? 0;
234
+ const actualSkills = countSkillDirs(skillsDir);
235
+ results.push(projectionCountResult("Codex projection: portable skills", expectedSkills, actualSkills, "Runtime-compatible source skill folders"));
236
+ }
237
+ return results;
238
+ }
239
+ function statusIcon(status) {
240
+ switch (status) {
241
+ case "pass":
242
+ return pc.green("PASS");
243
+ case "warn":
244
+ return pc.yellow("WARN");
245
+ case "na":
246
+ return pc.dim("N/A ");
247
+ case "fail":
248
+ return pc.red("FAIL");
249
+ }
250
+ }
137
251
  function printResult(result) {
138
- const icon = result.passed ? pc.green("PASS") : pc.red("FAIL");
139
- console.log(` [${icon}] ${result.name}`);
140
- if (!result.passed) {
252
+ console.log(` [${statusIcon(result.status)}] ${result.name}`);
253
+ if (result.status !== "pass") {
141
254
  console.log(` ${pc.dim(result.detail)}`);
142
255
  }
143
256
  }
144
257
  export async function validate(args = {}) {
145
258
  console.log(pc.bold(pc.cyan("Validating .claude/ project structure...")));
259
+ console.log(pc.dim("Scope: structure & wiring only. Run `mewkit doctor --hard-gates` to verify the gates actually block."));
146
260
  console.log();
147
261
  const meowkitDir = findMeowkitDir(process.cwd());
148
262
  if (!meowkitDir) {
149
- console.error(pc.red("Could not find .claude/ directory in current or parent directories."));
263
+ console.error(pc.red("Could not find .claude/ directory in the current directory."));
150
264
  process.exit(1);
151
265
  }
152
266
  console.log(`${pc.dim("Found:")} ${meowkitDir}`);
153
267
  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
268
  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
- }
269
+ // `--workflow` / `--ownership` scope the run to a single check (cheap CI
270
+ // invocations). The default run includes both alongside the structural checks.
271
+ let results;
272
+ if (args.workflow) {
273
+ results = checkWorkflowDrift(projectRoot);
177
274
  }
178
- for (const result of results) {
179
- printResult(result);
275
+ else if (args.ownership) {
276
+ results = checkOwnership(meowkitDir);
180
277
  }
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.`)));
278
+ else if (args.packs) {
279
+ results = checkPacks(meowkitDir);
186
280
  }
187
281
  else {
188
- console.log(`${pc.green(`${passCount} passed`)}, ${pc.red(`${failCount} failed`)}`);
282
+ results = [
283
+ checkDirExists(meowkitDir, "agents"),
284
+ checkDirExists(meowkitDir, "hooks"),
285
+ checkFileExists(projectRoot, "CLAUDE.md", "Structure"),
286
+ checkConfigJson(meowkitDir),
287
+ ...checkHooksExecutable(meowkitDir),
288
+ ...checkDocsRefsContract(meowkitDir),
289
+ // Default run is advisory: a wholly-absent governance file WARNs
290
+ // (prompt `mewkit upgrade`) rather than failing an un-synced install.
291
+ // The scoped `--workflow`/`--ownership`/`--packs` paths above stay strict for CI.
292
+ ...checkWorkflowDrift(projectRoot, { missingSpecSeverity: "warn" }),
293
+ ...checkOwnership(meowkitDir, { missingInfraSeverity: "warn" }),
294
+ ...checkPacks(meowkitDir, { missingInfraSeverity: "warn" }),
295
+ ];
296
+ if (args.portable) {
297
+ results.push(...checkPortability());
298
+ results.push(...(await checkCodexProjection(projectRoot)));
299
+ }
300
+ }
301
+ // Exhaustiveness guard: the printed `sections` array MUST list every `Section`
302
+ // union member, or a check's results compute but never render. The mapped type
303
+ // fails to compile if a member is missing here, keeping union + array in sync.
304
+ // ("Inventory" is produced only by `inventory --check`, listed for completeness.)
305
+ const SECTION_ORDER = {
306
+ Structure: true,
307
+ Hooks: true,
308
+ Portability: true,
309
+ Docs: true,
310
+ Workflow: true,
311
+ Ownership: true,
312
+ Packs: true,
313
+ Inventory: true,
314
+ };
315
+ const sections = Object.keys(SECTION_ORDER);
316
+ for (const section of sections) {
317
+ const inSection = results.filter((r) => r.section === section);
318
+ if (inSection.length === 0)
319
+ continue;
320
+ console.log(pc.bold(section));
321
+ for (const r of inSection)
322
+ printResult(r);
323
+ console.log();
324
+ }
325
+ const count = (s) => results.filter((r) => r.status === s).length;
326
+ const pass = count("pass"), warn = count("warn"), na = count("na"), fail = count("fail");
327
+ const parts = [pc.green(`${pass} passed`)];
328
+ if (warn > 0)
329
+ parts.push(pc.yellow(`${warn} warnings`));
330
+ if (na > 0)
331
+ parts.push(pc.dim(`${na} n/a`));
332
+ if (fail > 0)
333
+ parts.push(pc.red(`${fail} failed`));
334
+ console.log(parts.join(", "));
335
+ // FAIL always fails the build. WARN fails only under --strict (off by default).
336
+ if (fail > 0 || (args.strict && warn > 0)) {
189
337
  process.exit(1);
190
338
  }
191
339
  }
@@ -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"}