mewkit 1.14.0 → 1.15.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 (392) hide show
  1. package/README.md +7 -0
  2. package/dist/commands/capabilities.d.ts +13 -0
  3. package/dist/commands/capabilities.d.ts.map +1 -0
  4. package/dist/commands/capabilities.js +230 -0
  5. package/dist/commands/capabilities.js.map +1 -0
  6. package/dist/commands/context.d.ts +10 -0
  7. package/dist/commands/context.d.ts.map +1 -0
  8. package/dist/commands/context.js +125 -0
  9. package/dist/commands/context.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +27 -0
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +123 -0
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/providers.d.ts +2 -0
  15. package/dist/commands/providers.d.ts.map +1 -1
  16. package/dist/commands/providers.js +77 -0
  17. package/dist/commands/providers.js.map +1 -1
  18. package/dist/commands/task-state.d.ts +13 -0
  19. package/dist/commands/task-state.d.ts.map +1 -0
  20. package/dist/commands/task-state.js +106 -0
  21. package/dist/commands/task-state.js.map +1 -0
  22. package/dist/commands/validate.d.ts +48 -1
  23. package/dist/commands/validate.d.ts.map +1 -1
  24. package/dist/commands/validate.js +97 -24
  25. package/dist/commands/validate.js.map +1 -1
  26. package/dist/core/availability.d.ts +40 -0
  27. package/dist/core/availability.d.ts.map +1 -0
  28. package/dist/core/availability.js +47 -0
  29. package/dist/core/availability.js.map +1 -0
  30. package/dist/core/bootstrap.d.ts +19 -0
  31. package/dist/core/bootstrap.d.ts.map +1 -0
  32. package/dist/core/bootstrap.js +42 -0
  33. package/dist/core/bootstrap.js.map +1 -0
  34. package/dist/core/build-capabilities.d.ts +9 -0
  35. package/dist/core/build-capabilities.d.ts.map +1 -0
  36. package/dist/core/build-capabilities.js +123 -0
  37. package/dist/core/build-capabilities.js.map +1 -0
  38. package/dist/core/build-inventory.d.ts +2 -0
  39. package/dist/core/build-inventory.d.ts.map +1 -1
  40. package/dist/core/build-inventory.js +1 -1
  41. package/dist/core/build-inventory.js.map +1 -1
  42. package/dist/core/capability-authored.d.ts +26 -0
  43. package/dist/core/capability-authored.d.ts.map +1 -0
  44. package/dist/core/capability-authored.js +117 -0
  45. package/dist/core/capability-authored.js.map +1 -0
  46. package/dist/core/capability-snapshot.d.ts +13 -0
  47. package/dist/core/capability-snapshot.d.ts.map +1 -0
  48. package/dist/core/capability-snapshot.js +53 -0
  49. package/dist/core/capability-snapshot.js.map +1 -0
  50. package/dist/core/capability.d.ts +519 -0
  51. package/dist/core/capability.d.ts.map +1 -0
  52. package/dist/core/capability.js +114 -0
  53. package/dist/core/capability.js.map +1 -0
  54. package/dist/core/compute-checksums.d.ts.map +1 -1
  55. package/dist/core/compute-checksums.js +8 -2
  56. package/dist/core/compute-checksums.js.map +1 -1
  57. package/dist/core/consolidation-ledger.d.ts +30 -0
  58. package/dist/core/consolidation-ledger.d.ts.map +1 -0
  59. package/dist/core/consolidation-ledger.js +145 -0
  60. package/dist/core/consolidation-ledger.js.map +1 -0
  61. package/dist/core/generate-capability-view.d.ts +21 -0
  62. package/dist/core/generate-capability-view.d.ts.map +1 -0
  63. package/dist/core/generate-capability-view.js +48 -0
  64. package/dist/core/generate-capability-view.js.map +1 -0
  65. package/dist/core/install-metadata.d.ts +47 -30
  66. package/dist/core/install-metadata.d.ts.map +1 -1
  67. package/dist/core/install-metadata.js +49 -9
  68. package/dist/core/install-metadata.js.map +1 -1
  69. package/dist/core/plugin-manifest.d.ts +16 -16
  70. package/dist/core/provider-adapter.d.ts +28 -0
  71. package/dist/core/provider-adapter.d.ts.map +1 -0
  72. package/dist/core/provider-adapter.js +31 -0
  73. package/dist/core/provider-adapter.js.map +1 -0
  74. package/dist/core/provider-invocation.d.ts +14 -0
  75. package/dist/core/provider-invocation.d.ts.map +1 -0
  76. package/dist/core/provider-invocation.js +56 -0
  77. package/dist/core/provider-invocation.js.map +1 -0
  78. package/dist/core/provider-lifecycle.d.ts +35 -0
  79. package/dist/core/provider-lifecycle.d.ts.map +1 -0
  80. package/dist/core/provider-lifecycle.js +101 -0
  81. package/dist/core/provider-lifecycle.js.map +1 -0
  82. package/dist/core/provider-projection.d.ts +29 -0
  83. package/dist/core/provider-projection.d.ts.map +1 -0
  84. package/dist/core/provider-projection.js +47 -0
  85. package/dist/core/provider-projection.js.map +1 -0
  86. package/dist/core/release-metadata.d.ts +9 -2
  87. package/dist/core/release-metadata.d.ts.map +1 -1
  88. package/dist/core/release-metadata.js +13 -0
  89. package/dist/core/release-metadata.js.map +1 -1
  90. package/dist/core/repo-context-adapter.d.ts +23 -0
  91. package/dist/core/repo-context-adapter.d.ts.map +1 -0
  92. package/dist/core/repo-context-adapter.js +44 -0
  93. package/dist/core/repo-context-adapter.js.map +1 -0
  94. package/dist/core/repo-context.d.ts +147 -0
  95. package/dist/core/repo-context.d.ts.map +1 -0
  96. package/dist/core/repo-context.js +204 -0
  97. package/dist/core/repo-context.js.map +1 -0
  98. package/dist/core/resolve-capabilities.d.ts +70 -0
  99. package/dist/core/resolve-capabilities.d.ts.map +1 -0
  100. package/dist/core/resolve-capabilities.js +124 -0
  101. package/dist/core/resolve-capabilities.js.map +1 -0
  102. package/dist/core/smart-update.d.ts.map +1 -1
  103. package/dist/core/smart-update.js +13 -12
  104. package/dist/core/smart-update.js.map +1 -1
  105. package/dist/core/task-record.d.ts +252 -0
  106. package/dist/core/task-record.d.ts.map +1 -0
  107. package/dist/core/task-record.js +252 -0
  108. package/dist/core/task-record.js.map +1 -0
  109. package/dist/core/validate-capabilities.d.ts +12 -0
  110. package/dist/core/validate-capabilities.d.ts.map +1 -0
  111. package/dist/core/validate-capabilities.js +138 -0
  112. package/dist/core/validate-capabilities.js.map +1 -0
  113. package/dist/index.js +66 -4
  114. package/dist/index.js.map +1 -1
  115. package/dist/migrate/apply-env-var-rewrites.d.ts +15 -0
  116. package/dist/migrate/apply-env-var-rewrites.d.ts.map +1 -0
  117. package/dist/migrate/apply-env-var-rewrites.js +26 -0
  118. package/dist/migrate/apply-env-var-rewrites.js.map +1 -0
  119. package/dist/migrate/capability-bootstrap-projection.d.ts +11 -0
  120. package/dist/migrate/capability-bootstrap-projection.d.ts.map +1 -0
  121. package/dist/migrate/capability-bootstrap-projection.js +48 -0
  122. package/dist/migrate/capability-bootstrap-projection.js.map +1 -0
  123. package/dist/migrate/converters/command-to-codex-skill.d.ts.map +1 -1
  124. package/dist/migrate/converters/command-to-codex-skill.js +15 -5
  125. package/dist/migrate/converters/command-to-codex-skill.js.map +1 -1
  126. package/dist/migrate/converters/fm-to-codex-toml.d.ts +4 -1
  127. package/dist/migrate/converters/fm-to-codex-toml.d.ts.map +1 -1
  128. package/dist/migrate/converters/fm-to-codex-toml.js +7 -2
  129. package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -1
  130. package/dist/migrate/converters/index.js +1 -1
  131. package/dist/migrate/converters/index.js.map +1 -1
  132. package/dist/migrate/discovery/config-discovery.d.ts +29 -0
  133. package/dist/migrate/discovery/config-discovery.d.ts.map +1 -1
  134. package/dist/migrate/discovery/config-discovery.js +45 -0
  135. package/dist/migrate/discovery/config-discovery.js.map +1 -1
  136. package/dist/migrate/discovery/handlers-json-filter.d.ts.map +1 -1
  137. package/dist/migrate/discovery/handlers-json-filter.js +4 -2
  138. package/dist/migrate/discovery/handlers-json-filter.js.map +1 -1
  139. package/dist/migrate/discovery/hooks-discovery.d.ts +5 -0
  140. package/dist/migrate/discovery/hooks-discovery.d.ts.map +1 -1
  141. package/dist/migrate/discovery/hooks-discovery.js +21 -5
  142. package/dist/migrate/discovery/hooks-discovery.js.map +1 -1
  143. package/dist/migrate/hooks/codex-hook-wrapper.d.ts +15 -1
  144. package/dist/migrate/hooks/codex-hook-wrapper.d.ts.map +1 -1
  145. package/dist/migrate/hooks/codex-hook-wrapper.js +78 -7
  146. package/dist/migrate/hooks/codex-hook-wrapper.js.map +1 -1
  147. package/dist/migrate/hooks/codex-path-safety.d.ts +29 -0
  148. package/dist/migrate/hooks/codex-path-safety.d.ts.map +1 -1
  149. package/dist/migrate/hooks/codex-path-safety.js +36 -1
  150. package/dist/migrate/hooks/codex-path-safety.js.map +1 -1
  151. package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts +8 -0
  152. package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts.map +1 -0
  153. package/dist/migrate/hooks/codex-sh-wrapper-script.js +118 -0
  154. package/dist/migrate/hooks/codex-sh-wrapper-script.js.map +1 -0
  155. package/dist/migrate/hooks/codex-shell-env-installer.d.ts +14 -0
  156. package/dist/migrate/hooks/codex-shell-env-installer.d.ts.map +1 -0
  157. package/dist/migrate/hooks/codex-shell-env-installer.js +82 -0
  158. package/dist/migrate/hooks/codex-shell-env-installer.js.map +1 -0
  159. package/dist/migrate/hooks/codex-toml-installer.d.ts +2 -0
  160. package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -1
  161. package/dist/migrate/hooks/codex-toml-installer.js +3 -1
  162. package/dist/migrate/hooks/codex-toml-installer.js.map +1 -1
  163. package/dist/migrate/hooks/hooks-settings-merger.d.ts +3 -0
  164. package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -1
  165. package/dist/migrate/hooks/hooks-settings-merger.js +152 -20
  166. package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -1
  167. package/dist/migrate/migrate-orchestrator.d.ts +19 -0
  168. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  169. package/dist/migrate/migrate-orchestrator.js +176 -24
  170. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  171. package/dist/migrate/migrate-ui-summary.d.ts +23 -0
  172. package/dist/migrate/migrate-ui-summary.d.ts.map +1 -1
  173. package/dist/migrate/migrate-ui-summary.js +24 -0
  174. package/dist/migrate/migrate-ui-summary.js.map +1 -1
  175. package/dist/migrate/model-routing-config.d.ts +3 -1
  176. package/dist/migrate/model-routing-config.d.ts.map +1 -1
  177. package/dist/migrate/model-routing-config.js +28 -0
  178. package/dist/migrate/model-routing-config.js.map +1 -1
  179. package/dist/migrate/portable-installer.d.ts +14 -1
  180. package/dist/migrate/portable-installer.d.ts.map +1 -1
  181. package/dist/migrate/portable-installer.js +110 -9
  182. package/dist/migrate/portable-installer.js.map +1 -1
  183. package/dist/migrate/providers/codex/capabilities.d.ts +5 -0
  184. package/dist/migrate/providers/codex/capabilities.d.ts.map +1 -1
  185. package/dist/migrate/providers/codex/capabilities.js +31 -0
  186. package/dist/migrate/providers/codex/capabilities.js.map +1 -1
  187. package/dist/migrate/providers/codex/config.d.ts.map +1 -1
  188. package/dist/migrate/providers/codex/config.js +8 -2
  189. package/dist/migrate/providers/codex/config.js.map +1 -1
  190. package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts +27 -0
  191. package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts.map +1 -0
  192. package/dist/migrate/providers/codex/shell-env-policy-emitter.js +86 -0
  193. package/dist/migrate/providers/codex/shell-env-policy-emitter.js.map +1 -0
  194. package/dist/migrate/reconcile/index.d.ts +1 -1
  195. package/dist/migrate/reconcile/index.d.ts.map +1 -1
  196. package/dist/migrate/reconcile/index.js +1 -1
  197. package/dist/migrate/reconcile/index.js.map +1 -1
  198. package/dist/migrate/reconcile/portable-manifest.d.ts +6 -0
  199. package/dist/migrate/reconcile/portable-manifest.d.ts.map +1 -1
  200. package/dist/migrate/reconcile/portable-manifest.js +23 -0
  201. package/dist/migrate/reconcile/portable-manifest.js.map +1 -1
  202. package/dist/migrate/reconcile/reconcile-state-builders.d.ts +12 -5
  203. package/dist/migrate/reconcile/reconcile-state-builders.d.ts.map +1 -1
  204. package/dist/migrate/reconcile/reconcile-state-builders.js +2 -2
  205. package/dist/migrate/reconcile/reconcile-state-builders.js.map +1 -1
  206. package/dist/migrate/references/env-var-rewrite-table.d.ts +36 -0
  207. package/dist/migrate/references/env-var-rewrite-table.d.ts.map +1 -0
  208. package/dist/migrate/references/env-var-rewrite-table.js +97 -0
  209. package/dist/migrate/references/env-var-rewrite-table.js.map +1 -0
  210. package/dist/migrate/references/reference-classifier.d.ts +15 -0
  211. package/dist/migrate/references/reference-classifier.d.ts.map +1 -1
  212. package/dist/migrate/references/reference-classifier.js +33 -0
  213. package/dist/migrate/references/reference-classifier.js.map +1 -1
  214. package/dist/migrate/runtime-compat-audit.d.ts +1 -0
  215. package/dist/migrate/runtime-compat-audit.d.ts.map +1 -1
  216. package/dist/migrate/runtime-compat-audit.js +8 -3
  217. package/dist/migrate/runtime-compat-audit.js.map +1 -1
  218. package/dist/migrate/runtime-coupling-patterns.d.ts +30 -2
  219. package/dist/migrate/runtime-coupling-patterns.d.ts.map +1 -1
  220. package/dist/migrate/runtime-coupling-patterns.js +36 -8
  221. package/dist/migrate/runtime-coupling-patterns.js.map +1 -1
  222. package/dist/migrate/skill-directory-audit.d.ts +14 -0
  223. package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
  224. package/dist/migrate/skill-directory-audit.js +68 -10
  225. package/dist/migrate/skill-directory-audit.js.map +1 -1
  226. package/dist/migrate/skill-directory-installer.d.ts +3 -0
  227. package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
  228. package/dist/migrate/skill-directory-installer.js +98 -1
  229. package/dist/migrate/skill-directory-installer.js.map +1 -1
  230. package/dist/migrate/state-changing-script-detector.d.ts +16 -0
  231. package/dist/migrate/state-changing-script-detector.d.ts.map +1 -0
  232. package/dist/migrate/state-changing-script-detector.js +144 -0
  233. package/dist/migrate/state-changing-script-detector.js.map +1 -0
  234. package/dist/migrate/validation/migrate-conversion-report.d.ts +28 -0
  235. package/dist/migrate/validation/migrate-conversion-report.d.ts.map +1 -1
  236. package/dist/migrate/validation/migrate-conversion-report.js +48 -7
  237. package/dist/migrate/validation/migrate-conversion-report.js.map +1 -1
  238. package/dist/migrate/validation/migration-ledger-inputs.d.ts +56 -0
  239. package/dist/migrate/validation/migration-ledger-inputs.d.ts.map +1 -0
  240. package/dist/migrate/validation/migration-ledger-inputs.js +160 -0
  241. package/dist/migrate/validation/migration-ledger-inputs.js.map +1 -0
  242. package/dist/migrate/validation/migration-record-types.d.ts +38 -0
  243. package/dist/migrate/validation/migration-record-types.d.ts.map +1 -0
  244. package/dist/migrate/validation/migration-record-types.js +12 -0
  245. package/dist/migrate/validation/migration-record-types.js.map +1 -0
  246. package/dist/migrate/validation/migration-report-writer.d.ts +98 -0
  247. package/dist/migrate/validation/migration-report-writer.d.ts.map +1 -0
  248. package/dist/migrate/validation/migration-report-writer.js +0 -0
  249. package/dist/migrate/validation/migration-report-writer.js.map +1 -0
  250. package/dist/orchviz-web/index.js +3 -3
  251. package/package.json +1 -1
  252. package/portable-manifest.json +10 -2
  253. package/dist/commands/evolve.d.ts +0 -11
  254. package/dist/commands/evolve.d.ts.map +0 -1
  255. package/dist/commands/evolve.js +0 -63
  256. package/dist/commands/evolve.js.map +0 -1
  257. package/dist/commands/health.d.ts +0 -14
  258. package/dist/commands/health.d.ts.map +0 -1
  259. package/dist/commands/health.js +0 -193
  260. package/dist/commands/health.js.map +0 -1
  261. package/dist/commands/policy.d.ts +0 -8
  262. package/dist/commands/policy.d.ts.map +0 -1
  263. package/dist/commands/policy.js +0 -65
  264. package/dist/commands/policy.js.map +0 -1
  265. package/dist/commands/portability.d.ts +0 -7
  266. package/dist/commands/portability.d.ts.map +0 -1
  267. package/dist/commands/portability.js +0 -50
  268. package/dist/commands/portability.js.map +0 -1
  269. package/dist/commands/reflect.d.ts +0 -14
  270. package/dist/commands/reflect.d.ts.map +0 -1
  271. package/dist/commands/reflect.js +0 -135
  272. package/dist/commands/reflect.js.map +0 -1
  273. package/dist/commands/simulate.d.ts +0 -14
  274. package/dist/commands/simulate.d.ts.map +0 -1
  275. package/dist/commands/simulate.js +0 -86
  276. package/dist/commands/simulate.js.map +0 -1
  277. package/dist/core/event-log.d.ts +0 -44
  278. package/dist/core/event-log.d.ts.map +0 -1
  279. package/dist/core/event-log.js +0 -169
  280. package/dist/core/event-log.js.map +0 -1
  281. package/dist/core/evolution/event-clusters.d.ts +0 -4
  282. package/dist/core/evolution/event-clusters.d.ts.map +0 -1
  283. package/dist/core/evolution/event-clusters.js +0 -82
  284. package/dist/core/evolution/event-clusters.js.map +0 -1
  285. package/dist/core/evolution/recommendation-renderer.d.ts +0 -3
  286. package/dist/core/evolution/recommendation-renderer.d.ts.map +0 -1
  287. package/dist/core/evolution/recommendation-renderer.js +0 -24
  288. package/dist/core/evolution/recommendation-renderer.js.map +0 -1
  289. package/dist/core/evolution/review-failure-clusters.d.ts +0 -10
  290. package/dist/core/evolution/review-failure-clusters.d.ts.map +0 -1
  291. package/dist/core/evolution/review-failure-clusters.js +0 -30
  292. package/dist/core/evolution/review-failure-clusters.js.map +0 -1
  293. package/dist/core/evolution/suggestions.d.ts +0 -24
  294. package/dist/core/evolution/suggestions.d.ts.map +0 -1
  295. package/dist/core/evolution/suggestions.js +0 -11
  296. package/dist/core/evolution/suggestions.js.map +0 -1
  297. package/dist/core/gate-policy.d.ts +0 -20
  298. package/dist/core/gate-policy.d.ts.map +0 -1
  299. package/dist/core/gate-policy.js +0 -64
  300. package/dist/core/gate-policy.js.map +0 -1
  301. package/dist/core/portability-matrix.d.ts +0 -17
  302. package/dist/core/portability-matrix.d.ts.map +0 -1
  303. package/dist/core/portability-matrix.js +0 -31
  304. package/dist/core/portability-matrix.js.map +0 -1
  305. package/dist/core/simulation-runner.d.ts +0 -93
  306. package/dist/core/simulation-runner.d.ts.map +0 -1
  307. package/dist/core/simulation-runner.js +0 -161
  308. package/dist/core/simulation-runner.js.map +0 -1
  309. package/dist/core/usage/usage-analyzer.d.ts +0 -18
  310. package/dist/core/usage/usage-analyzer.d.ts.map +0 -1
  311. package/dist/core/usage/usage-analyzer.js +0 -41
  312. package/dist/core/usage/usage-analyzer.js.map +0 -1
  313. package/dist/memory/archive.d.ts +0 -9
  314. package/dist/memory/archive.d.ts.map +0 -1
  315. package/dist/memory/archive.js +0 -42
  316. package/dist/memory/archive.js.map +0 -1
  317. package/dist/memory/compact.d.ts +0 -9
  318. package/dist/memory/compact.d.ts.map +0 -1
  319. package/dist/memory/compact.js +0 -33
  320. package/dist/memory/compact.js.map +0 -1
  321. package/dist/memory/conflicts.d.ts +0 -8
  322. package/dist/memory/conflicts.d.ts.map +0 -1
  323. package/dist/memory/conflicts.js +0 -28
  324. package/dist/memory/conflicts.js.map +0 -1
  325. package/dist/memory/promote.d.ts +0 -8
  326. package/dist/memory/promote.d.ts.map +0 -1
  327. package/dist/memory/promote.js +0 -10
  328. package/dist/memory/promote.js.map +0 -1
  329. package/dist/memory/store-utils.d.ts +0 -14
  330. package/dist/memory/store-utils.d.ts.map +0 -1
  331. package/dist/memory/store-utils.js +0 -44
  332. package/dist/memory/store-utils.js.map +0 -1
  333. package/dist/migrate/__tests__/frontmatter-parser.test.d.ts +0 -2
  334. package/dist/migrate/__tests__/frontmatter-parser.test.d.ts.map +0 -1
  335. package/dist/migrate/__tests__/frontmatter-parser.test.js +0 -73
  336. package/dist/migrate/__tests__/frontmatter-parser.test.js.map +0 -1
  337. package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts +0 -2
  338. package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts.map +0 -1
  339. package/dist/migrate/__tests__/md-strip-mewkit.test.js +0 -55
  340. package/dist/migrate/__tests__/md-strip-mewkit.test.js.map +0 -1
  341. package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts +0 -2
  342. package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts.map +0 -1
  343. package/dist/migrate/__tests__/migrate-scope-resolver.test.js +0 -53
  344. package/dist/migrate/__tests__/migrate-scope-resolver.test.js.map +0 -1
  345. package/dist/migrate/__tests__/process-lock.test.d.ts +0 -2
  346. package/dist/migrate/__tests__/process-lock.test.d.ts.map +0 -1
  347. package/dist/migrate/__tests__/process-lock.test.js +0 -63
  348. package/dist/migrate/__tests__/process-lock.test.js.map +0 -1
  349. package/dist/migrate/__tests__/provider-registry.test.d.ts +0 -2
  350. package/dist/migrate/__tests__/provider-registry.test.d.ts.map +0 -1
  351. package/dist/migrate/__tests__/provider-registry.test.js +0 -53
  352. package/dist/migrate/__tests__/provider-registry.test.js.map +0 -1
  353. package/dist/migrate/__tests__/reconciler.test.d.ts +0 -2
  354. package/dist/migrate/__tests__/reconciler.test.d.ts.map +0 -1
  355. package/dist/migrate/__tests__/reconciler.test.js +0 -180
  356. package/dist/migrate/__tests__/reconciler.test.js.map +0 -1
  357. package/dist/migrate/__tests__/skill-id-utils.test.d.ts +0 -2
  358. package/dist/migrate/__tests__/skill-id-utils.test.d.ts.map +0 -1
  359. package/dist/migrate/__tests__/skill-id-utils.test.js +0 -78
  360. package/dist/migrate/__tests__/skill-id-utils.test.js.map +0 -1
  361. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts +0 -15
  362. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts.map +0 -1
  363. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js +0 -165
  364. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js.map +0 -1
  365. package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts +0 -11
  366. package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts.map +0 -1
  367. package/dist/orchviz/plan/__tests__/atomic-write.test.js +0 -89
  368. package/dist/orchviz/plan/__tests__/atomic-write.test.js.map +0 -1
  369. package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts +0 -10
  370. package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts.map +0 -1
  371. package/dist/orchviz/plan/__tests__/end-to-end.test.js +0 -132
  372. package/dist/orchviz/plan/__tests__/end-to-end.test.js.map +0 -1
  373. package/dist/orchviz/plan/__tests__/etag.test.d.ts +0 -11
  374. package/dist/orchviz/plan/__tests__/etag.test.d.ts.map +0 -1
  375. package/dist/orchviz/plan/__tests__/etag.test.js +0 -92
  376. package/dist/orchviz/plan/__tests__/etag.test.js.map +0 -1
  377. package/dist/orchviz/plan/__tests__/list-plans.test.d.ts +0 -14
  378. package/dist/orchviz/plan/__tests__/list-plans.test.d.ts.map +0 -1
  379. package/dist/orchviz/plan/__tests__/list-plans.test.js +0 -154
  380. package/dist/orchviz/plan/__tests__/list-plans.test.js.map +0 -1
  381. package/dist/orchviz/server/__tests__/security-smoke.test.d.ts +0 -13
  382. package/dist/orchviz/server/__tests__/security-smoke.test.d.ts.map +0 -1
  383. package/dist/orchviz/server/__tests__/security-smoke.test.js +0 -207
  384. package/dist/orchviz/server/__tests__/security-smoke.test.js.map +0 -1
  385. package/dist/orchviz/server/__tests__/write-handlers.test.d.ts +0 -24
  386. package/dist/orchviz/server/__tests__/write-handlers.test.d.ts.map +0 -1
  387. package/dist/orchviz/server/__tests__/write-handlers.test.js +0 -347
  388. package/dist/orchviz/server/__tests__/write-handlers.test.js.map +0 -1
  389. package/dist/orchviz/test-server-boot.d.ts +0 -28
  390. package/dist/orchviz/test-server-boot.d.ts.map +0 -1
  391. package/dist/orchviz/test-server-boot.js +0 -64
  392. package/dist/orchviz/test-server-boot.js.map +0 -1
@@ -0,0 +1,252 @@
1
+ // Minimal durable task state (Phase 4): the one per-task record that lets a fresh session
2
+ // resume and audit capability use. Plans stay the human source of truth — this record JOINS
3
+ // to a plan by path, it does not replace it. Compatibility is governed by the record's own
4
+ // `schemaVersion` checked against the CLI's supported range (OQ6 decision): the record is
5
+ // decoupled from the npm-CLI version line and the kit-release version line, which are recorded
6
+ // as provenance only. Integrity: validated id, realpath containment, atomic replace under a
7
+ // per-file lock (reuses the install-metadata writer pattern).
8
+ import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync } from "node:fs";
9
+ import { rename, unlink, writeFile } from "node:fs/promises";
10
+ import { join, relative, isAbsolute, sep } from "node:path";
11
+ import { z } from "zod";
12
+ import { withFileLock } from "./file-lock.js";
13
+ import { distinctRepos } from "./repo-context.js";
14
+ /** The record schema version THIS CLI writes. Bump on any breaking record shape change. */
15
+ export const TASK_RECORD_SCHEMA_VERSION = "1.0";
16
+ /** Record schema versions this CLI can safely READ. A record outside this set is rejected. */
17
+ export const SUPPORTED_TASK_RECORD_SCHEMAS = new Set(["1.0"]);
18
+ /** Valid task id: lowercase slug, filename-safe (it becomes `<id>.json`). */
19
+ const TASK_ID_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
20
+ export const CapabilityDecisionSchema = z.object({
21
+ capabilityId: z.string(),
22
+ decision: z.enum(["selected", "skipped", "unavailable", "unsupported"]),
23
+ reason: z.string(),
24
+ /** References the Phase-3 availability snapshot that justified the decision. */
25
+ adapterSnapshotId: z.string().optional(),
26
+ });
27
+ export const RepoRefSchema = z.object({
28
+ /** Stable repository identity (remote URL, path hash, or name) — never invented. */
29
+ identity: z.string(),
30
+ /** VCS revision when available; null for non-git roots (no fabricated revision). */
31
+ revision: z.string().nullable(),
32
+ });
33
+ export const TaskRecordSchema = z.object({
34
+ schemaVersion: z.literal("1.0"),
35
+ taskId: z.string().regex(TASK_ID_RE),
36
+ planPath: z.string().nullable().default(null),
37
+ status: z.enum(["active", "blocked", "done"]),
38
+ currentStep: z.string().default(""),
39
+ repos: z.array(RepoRefSchema).default([]),
40
+ blockers: z.array(z.string()).default([]),
41
+ nextAction: z.string().default(""),
42
+ verificationSummaries: z.array(z.object({ ref: z.string(), result: z.string() })).default([]),
43
+ evidenceRefs: z.array(z.string()).default([]),
44
+ capabilityDecisions: z.array(CapabilityDecisionSchema).default([]),
45
+ /** Provenance only (never the compatibility gate): who wrote this record. */
46
+ writtenByCli: z.string().default(""),
47
+ writtenByKit: z.string().default(""),
48
+ updatedAt: z.string(),
49
+ })
50
+ // Preserve unknown keys through a read→write round-trip. A future CLI may add an
51
+ // additive field WITHOUT bumping schemaVersion (per the versioning note above); an older
52
+ // CLI must not silently strip it when it updates the record.
53
+ .passthrough();
54
+ /** Thrown when a record's schemaVersion is outside this CLI's supported range (loud, non-zero). */
55
+ export class IncompatibleTaskRecordError extends Error {
56
+ detail;
57
+ constructor(detail) {
58
+ super(`Incompatible task record: ${detail}`);
59
+ this.detail = detail;
60
+ this.name = "IncompatibleTaskRecordError";
61
+ }
62
+ }
63
+ /**
64
+ * `<projectRoot>/tasks/active` — the durable task-record home. This is the SAME path for a
65
+ * flat-copy AND a plugin install: task records are the CONSUMER PROJECT's state (keyed to the
66
+ * project the agent is working in, `process.cwd()`), not plugin-owned state. `tasks/` is
67
+ * framework-internal state that keeps its path (skill-authoring Rule 2's exception), so it does
68
+ * NOT move to `${CLAUDE_PLUGIN_DATA}` — that root is for a plugin's OWN cross-session data, and
69
+ * putting consumer task records there would misplace them. Resolves P4 open decision #2.
70
+ */
71
+ function activeDir(projectRoot) {
72
+ return join(projectRoot, "tasks", "active");
73
+ }
74
+ /**
75
+ * The current active-plan pointer, mirroring the existing hook contract
76
+ * (`session-state/active-plan.json` → `path` || `slug`, else legacy plain-text
77
+ * `session-state/active-plan`). Null when absent. This is the CHECKPOINT JOIN: the task record
78
+ * whose `planPath` matches the pointer is the current task (resolves P4 open decision #3).
79
+ */
80
+ export function readActivePlanPointer(projectRoot) {
81
+ const jsonPath = join(projectRoot, "session-state", "active-plan.json");
82
+ if (existsSync(jsonPath)) {
83
+ try {
84
+ const d = JSON.parse(readFileSync(jsonPath, "utf-8"));
85
+ const p = (typeof d.path === "string" && d.path) || (typeof d.slug === "string" && d.slug) || "";
86
+ if (p.trim())
87
+ return p.trim();
88
+ }
89
+ catch {
90
+ /* fall through to legacy */
91
+ }
92
+ }
93
+ const legacy = join(projectRoot, "session-state", "active-plan");
94
+ if (existsSync(legacy)) {
95
+ const txt = readFileSync(legacy, "utf-8").trim();
96
+ if (txt)
97
+ return txt;
98
+ }
99
+ return null;
100
+ }
101
+ /** Resolve a task-record path and assert it stays contained under tasks/active (realpath). */
102
+ function recordPath(projectRoot, taskId) {
103
+ if (!TASK_ID_RE.test(taskId))
104
+ throw new Error(`invalid task id: ${JSON.stringify(taskId)}`);
105
+ const dir = activeDir(projectRoot);
106
+ const abs = join(dir, `${taskId}.json`);
107
+ // Lexical + realpath containment: the id regex already bars separators/.., this is defense in depth.
108
+ const rel = relative(dir, abs);
109
+ if (rel === ".." || rel.startsWith(".." + sep) || isAbsolute(rel))
110
+ throw new Error(`task path escapes tasks/active: ${taskId}`);
111
+ return abs;
112
+ }
113
+ /** Parse + version-check a record already read from disk. Throws on schema drift. */
114
+ function parseAndCheck(raw) {
115
+ const parsed = JSON.parse(raw);
116
+ if (typeof parsed.schemaVersion === "string" && !SUPPORTED_TASK_RECORD_SCHEMAS.has(parsed.schemaVersion)) {
117
+ throw new IncompatibleTaskRecordError(`record schemaVersion "${parsed.schemaVersion}" not in supported ${JSON.stringify([...SUPPORTED_TASK_RECORD_SCHEMAS])}`);
118
+ }
119
+ return TaskRecordSchema.parse(parsed);
120
+ }
121
+ /** Read + version-check a single task record. Throws IncompatibleTaskRecordError on schema drift. */
122
+ export function readTaskRecord(projectRoot, taskId) {
123
+ const abs = recordPath(projectRoot, taskId);
124
+ if (!existsSync(abs))
125
+ return null;
126
+ return parseAndCheck(readFileSync(abs, "utf-8"));
127
+ }
128
+ /** Atomic temp+rename write of an already-validated record (NO lock — callers hold it). */
129
+ async function atomicReplace(target, record) {
130
+ const serialized = JSON.stringify(record, null, 2) + "\n";
131
+ const tmp = `${target}.tmp-${process.pid}`;
132
+ try {
133
+ await writeFile(tmp, serialized, "utf-8");
134
+ await rename(tmp, target);
135
+ }
136
+ catch (err) {
137
+ try {
138
+ await unlink(tmp);
139
+ }
140
+ catch {
141
+ /* best-effort cleanup */
142
+ }
143
+ throw err;
144
+ }
145
+ }
146
+ /** Prepare tasks/active and assert realpath containment; returns the resolved target path. */
147
+ function prepareTarget(projectRoot, taskId) {
148
+ const dir = activeDir(projectRoot);
149
+ mkdirSync(dir, { recursive: true });
150
+ // Realpath containment — reject a symlinked tasks/active escaping the project root.
151
+ const relDir = relative(realpathSync(projectRoot), realpathSync(dir));
152
+ if (relDir.startsWith("..") || isAbsolute(relDir))
153
+ throw new Error("tasks/active escapes the project root");
154
+ return recordPath(projectRoot, taskId);
155
+ }
156
+ /**
157
+ * Atomically write a task record under a per-id lock. Refuses to overwrite an on-disk record
158
+ * whose schemaVersion this CLI cannot read (fails closed — never clobbers an incompatible
159
+ * record). Prefer `updateTaskRecord` for read-modify-write; this is the low-level put.
160
+ */
161
+ export async function writeTaskRecord(projectRoot, record) {
162
+ const validated = TaskRecordSchema.parse(record);
163
+ const target = prepareTarget(projectRoot, validated.taskId);
164
+ const lockPath = join(activeDir(projectRoot), `.${validated.taskId}.lock`);
165
+ await withFileLock(lockPath, async () => {
166
+ if (existsSync(target))
167
+ parseAndCheck(readFileSync(target, "utf-8")); // throws if on-disk is incompatible
168
+ await atomicReplace(target, validated);
169
+ });
170
+ }
171
+ /**
172
+ * Read → mutate → write a task record atomically under ONE lock, so concurrent updates to the
173
+ * same id cannot lose each other's changes (the read-modify-write cycle is serialized). The
174
+ * mutator receives the current record (or null if absent) and returns the next one. An
175
+ * incompatible on-disk record makes the read throw before any write — it is never clobbered.
176
+ */
177
+ export async function updateTaskRecord(projectRoot, taskId, mutate) {
178
+ const target = prepareTarget(projectRoot, taskId);
179
+ const lockPath = join(activeDir(projectRoot), `.${taskId}.lock`);
180
+ return withFileLock(lockPath, async () => {
181
+ const existing = existsSync(target) ? parseAndCheck(readFileSync(target, "utf-8")) : null;
182
+ const next = TaskRecordSchema.parse(mutate(existing));
183
+ await atomicReplace(target, next);
184
+ return next;
185
+ });
186
+ }
187
+ /**
188
+ * Record a repo-context envelope's evidence into an EXISTING durable task record (Phase 5
189
+ * slice 2). Merges — never replaces — so evidence accumulates across a task's steps:
190
+ * - `repos`: the DISTINCT owning repos of the envelope's evidence (via `distinctRepos`), unioned
191
+ * with the record's repos by identity; the newest envelope's revision wins for a repo already
192
+ * present. Multi-repo context is preserved: every owning repo stays its own entry.
193
+ * - `evidenceRefs`: the evidence PATHS unioned with the record's, deduped. The record stays a
194
+ * COMPACT resume summary — the full envelope (with content hashes) lives on disk and is
195
+ * re-checked on demand via `context check`, not duplicated here.
196
+ *
197
+ * Refuses to create a record: context evidence belongs to an active durable task (task-state
198
+ * emission Rule 1). `now` is passed in — the pure core never reads the clock.
199
+ */
200
+ export async function recordContextEvidence(projectRoot, taskId, envelope, now) {
201
+ return updateTaskRecord(projectRoot, taskId, (existing) => {
202
+ if (!existing)
203
+ throw new Error(`no active task record "${taskId}" — context evidence is recorded only for an existing durable task`);
204
+ // Union owning repos by identity (newest revision wins for a repo already recorded).
205
+ const revByIdentity = new Map(existing.repos.map((r) => [r.identity, r.revision]));
206
+ for (const r of distinctRepos(envelope.evidence))
207
+ revByIdentity.set(r.identity, r.revision);
208
+ const repos = [...revByIdentity]
209
+ .map(([identity, revision]) => ({ identity, revision }))
210
+ .sort((a, b) => (a.identity < b.identity ? -1 : a.identity > b.identity ? 1 : 0));
211
+ // Union evidence paths (compact resume summary — never the hashes).
212
+ const paths = new Set(existing.evidenceRefs);
213
+ for (const e of envelope.evidence)
214
+ paths.add(e.path);
215
+ return { ...existing, repos, evidenceRefs: [...paths].sort(), updatedAt: now };
216
+ });
217
+ }
218
+ /** List all active-dir task ids (record filenames), for resume reconstruction. */
219
+ export function listTaskRecordIds(projectRoot) {
220
+ const dir = activeDir(projectRoot);
221
+ if (!existsSync(dir))
222
+ return [];
223
+ return readdirSync(dir)
224
+ .filter((f) => f.endsWith(".json"))
225
+ .map((f) => f.replace(/\.json$/, ""))
226
+ .filter((id) => TASK_ID_RE.test(id))
227
+ .sort();
228
+ }
229
+ export function reconstructResumeState(projectRoot) {
230
+ const records = [];
231
+ const issues = [];
232
+ // Listing itself is guarded so a dir-removal race can't crash the whole reconstruction.
233
+ let ids = [];
234
+ try {
235
+ ids = listTaskRecordIds(projectRoot);
236
+ }
237
+ catch (err) {
238
+ issues.push({ taskId: "(listing)", problem: err.message });
239
+ }
240
+ for (const id of ids) {
241
+ try {
242
+ const r = readTaskRecord(projectRoot, id);
243
+ if (r)
244
+ records.push(r);
245
+ }
246
+ catch (err) {
247
+ issues.push({ taskId: id, problem: err.message });
248
+ }
249
+ }
250
+ return { records, issues, activePlanPointer: readActivePlanPointer(projectRoot) };
251
+ }
252
+ //# sourceMappingURL=task-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-record.js","sourceRoot":"","sources":["../../src/core/task-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type InventoryEntry } from "./build-inventory.js";
2
+ import { type CapabilityEntry } from "./capability.js";
3
+ export interface CapabilityIssue {
4
+ level: "error" | "warn";
5
+ capabilityId: string | null;
6
+ message: string;
7
+ }
8
+ /** Validate the manifest built from `claudeDir`. Returns all issues (empty ⇒ clean). */
9
+ export declare function validateCapabilities(claudeDir: string): CapabilityIssue[];
10
+ /** Pure validation over a built manifest + inventory. Injectable for testing. */
11
+ export declare function validateCapabilityEntries(entries: CapabilityEntry[], inventoryEntries: InventoryEntry[]): CapabilityIssue[];
12
+ //# sourceMappingURL=validate-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-capabilities.d.ts","sourceRoot":"","sources":["../../src/core/validate-capabilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CAChB;AAoCD,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAEzE;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,eAAe,EAAE,CA+F3H"}
@@ -0,0 +1,138 @@
1
+ // Validate a capability manifest against the design invariants (Phase 2 §1/§5). Pure over
2
+ // the built manifest + inventory, so it is testable without a live install. Severity:
3
+ // ERROR = a broken contract (cross-ref, containment, uniqueness, unknown invocation ID,
4
+ // dependency cycle); WARN = a coverage/authoring smell (uncovered artifact, duplicate
5
+ // intent across capabilities). No check ever executes a script or trusts a command string.
6
+ import { buildCapabilities } from "./build-capabilities.js";
7
+ import { buildInventory } from "./build-inventory.js";
8
+ import { AUTHORED_CONTEXT_REQUIREMENTS, AUTHORED_INTENTS } from "./capability-authored.js";
9
+ import { KNOWN_INVOCATION_IDS } from "./capability.js";
10
+ /** True when `rel` is a `.claude/`-relative path with no escape (no `..`, not absolute). */
11
+ function isContained(rel) {
12
+ if (rel.startsWith("/") || /^[A-Za-z]:[\\/]/.test(rel))
13
+ return false;
14
+ return !rel.split(/[\\/]/).includes("..");
15
+ }
16
+ /** Detect a cycle in the upstream-dependency graph (DFS with a recursion stack). */
17
+ function findCycle(entries) {
18
+ const upstream = new Map(entries.map((e) => [e.id, e.dependencies.upstream]));
19
+ const state = new Map();
20
+ const stack = [];
21
+ const visit = (id) => {
22
+ if (state.get(id) === "done")
23
+ return null;
24
+ if (state.get(id) === "visiting")
25
+ return [...stack.slice(stack.indexOf(id)), id];
26
+ state.set(id, "visiting");
27
+ stack.push(id);
28
+ for (const dep of upstream.get(id) ?? []) {
29
+ if (!upstream.has(dep))
30
+ continue; // dangling deps are reported by the coverage pass below
31
+ const cycle = visit(dep);
32
+ if (cycle)
33
+ return cycle;
34
+ }
35
+ stack.pop();
36
+ state.set(id, "done");
37
+ return null;
38
+ };
39
+ for (const e of entries) {
40
+ const cycle = visit(e.id);
41
+ if (cycle)
42
+ return cycle;
43
+ }
44
+ return null;
45
+ }
46
+ /** Validate the manifest built from `claudeDir`. Returns all issues (empty ⇒ clean). */
47
+ export function validateCapabilities(claudeDir) {
48
+ return validateCapabilityEntries(buildCapabilities(claudeDir), buildInventory(claudeDir).entries);
49
+ }
50
+ /** Pure validation over a built manifest + inventory. Injectable for testing. */
51
+ export function validateCapabilityEntries(entries, inventoryEntries) {
52
+ const issues = [];
53
+ const invById = new Map(inventoryEntries.map((e) => [e.id, e]));
54
+ const capIds = new Set();
55
+ const aliasOwners = new Map();
56
+ const intentOwners = new Map();
57
+ for (const c of entries) {
58
+ // id uniqueness
59
+ if (capIds.has(c.id))
60
+ issues.push({ level: "error", capabilityId: c.id, message: "duplicate capability id" });
61
+ capIds.add(c.id);
62
+ // path containment (disk-backed kinds only)
63
+ if (c.sourcePath !== null && !isContained(c.sourcePath)) {
64
+ issues.push({ level: "error", capabilityId: c.id, message: `sourcePath escapes .claude/: ${c.sourcePath}` });
65
+ }
66
+ // inventory cross-reference + owner agreement (disk-backed kinds only)
67
+ if (c.inventoryId !== null && c.sourcePath !== null) {
68
+ const inv = invById.get(c.inventoryId);
69
+ if (!inv) {
70
+ issues.push({ level: "error", capabilityId: c.id, message: `inventoryId has no matching inventory entry: ${c.inventoryId}` });
71
+ }
72
+ else if (inv.owner && c.owner && inv.owner !== c.owner) {
73
+ issues.push({ level: "error", capabilityId: c.id, message: `denormalized owner "${c.owner}" disagrees with inventory "${inv.owner}"` });
74
+ }
75
+ }
76
+ // invocation id must be a known logical id — hostile frontmatter cannot smuggle a command
77
+ if (!KNOWN_INVOCATION_IDS.has(c.invocation.id)) {
78
+ issues.push({ level: "error", capabilityId: c.id, message: `unknown invocation id: ${c.invocation.id}` });
79
+ }
80
+ // alias uniqueness across entries
81
+ for (const a of c.aliases) {
82
+ const prior = aliasOwners.get(a);
83
+ if (prior && prior !== c.id)
84
+ issues.push({ level: "error", capabilityId: c.id, message: `alias "${a}" also on ${prior}` });
85
+ aliasOwners.set(a, c.id);
86
+ }
87
+ // intent duplication tracking (WARN — inferred keywords can legitimately overlap)
88
+ for (const i of c.intents) {
89
+ intentOwners.set(i, [...(intentOwners.get(i) ?? []), c.id]);
90
+ }
91
+ }
92
+ for (const [intent, owners] of intentOwners) {
93
+ if (owners.length > 1) {
94
+ issues.push({ level: "warn", capabilityId: null, message: `intent "${intent}" maps to multiple capabilities: ${owners.join(", ")}` });
95
+ }
96
+ }
97
+ // Dangling upstream dependency: an upstream id with no matching capability (WARN —
98
+ // a coherence smell, not a hard break, in this pre-resolver slice).
99
+ for (const c of entries) {
100
+ for (const dep of c.dependencies.upstream) {
101
+ if (!capIds.has(dep)) {
102
+ issues.push({ level: "warn", capabilityId: c.id, message: `upstream dependency has no matching capability: ${dep}` });
103
+ }
104
+ }
105
+ }
106
+ // coverage: every enumerated invocable-kind artifact should have a capability (WARN)
107
+ const capInventoryIds = new Set(entries.map((e) => e.inventoryId).filter((x) => x !== null));
108
+ for (const inv of inventoryEntries) {
109
+ if (inv.type === "rule")
110
+ continue; // rules are inventory-only context, not capabilities
111
+ if (!capInventoryIds.has(inv.id)) {
112
+ issues.push({ level: "warn", capabilityId: null, message: `inventory artifact has no capability: ${inv.path}` });
113
+ }
114
+ }
115
+ // dependency cycle (ERROR)
116
+ const cycle = findCycle(entries);
117
+ if (cycle)
118
+ issues.push({ level: "error", capabilityId: null, message: `dependency cycle: ${cycle.join(" → ")}` });
119
+ // Authored-intent overlay key with no matching capability (WARN): expected on a partial
120
+ // consumer install that omits a flagship skill, but on a full authoring install it means
121
+ // a dead key (e.g. after a skill rename) silently dropping curated intents. The hard guard
122
+ // against a rename is the resolver test asserting every authored phrase resolves to its owner.
123
+ for (const key of Object.keys(AUTHORED_INTENTS)) {
124
+ if (!capIds.has(key)) {
125
+ issues.push({ level: "warn", capabilityId: key, message: `AUTHORED_INTENTS key has no matching capability (partial install or renamed skill): ${key}` });
126
+ }
127
+ }
128
+ // Symmetric dead-key guard for the repo-context overlay (Phase 5): an
129
+ // AUTHORED_CONTEXT_REQUIREMENTS key with no capability is a partial install or a rename that
130
+ // silently drops the context requirement from a source-grounded flow.
131
+ for (const key of Object.keys(AUTHORED_CONTEXT_REQUIREMENTS)) {
132
+ if (!capIds.has(key)) {
133
+ issues.push({ level: "warn", capabilityId: key, message: `AUTHORED_CONTEXT_REQUIREMENTS key has no matching capability (partial install or renamed skill): ${key}` });
134
+ }
135
+ }
136
+ return issues;
137
+ }
138
+ //# sourceMappingURL=validate-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-capabilities.js","sourceRoot":"","sources":["../../src/core/validate-capabilities.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ import pc from "picocolors";
7
7
  import { init } from "./commands/init.js";
8
8
  import { upgrade } from "./commands/upgrade.js";
9
9
  import { validate } from "./commands/validate.js";
10
+ import { capabilities } from "./commands/capabilities.js";
11
+ import { taskState } from "./commands/task-state.js";
12
+ import { context } from "./commands/context.js";
10
13
  import { budget, contextBudget } from "./commands/budget.js";
11
14
  import { memory } from "./commands/memory.js";
12
15
  import { verdictGate } from "./commands/verdict-gate.js";
@@ -35,15 +38,18 @@ ${pc.bold("Usage:")}
35
38
  ${pc.bold("Commands:")}
36
39
  ${pc.green("init")} Scaffold or update MeowKit in the current project
37
40
  ${pc.green("upgrade")} Upgrade MeowKit to the latest version
38
- ${pc.green("validate")} Validate .claude/ project structure
41
+ ${pc.green("validate")} Validate .claude/ project structure (--mode authoring|flat-copy; auto-detected)
42
+ ${pc.green("capabilities")} Inspect/resolve the capability manifest ('capabilities list|explain <id>|resolve --intent "…"|view|bootstrap|projections' [--json])
39
43
  ${pc.green("budget")} View token usage and cost log ('budget context' for per-profile size)
40
44
  ${pc.green("memory")} Manage agent memory (lessons & patterns)
41
45
  ${pc.green("setup")} Guided post-scaffold configuration
42
- ${pc.green("doctor")} Diagnose common environment issues
46
+ ${pc.green("doctor")} Diagnose common environment issues ('doctor provenance --explain' for a read-only provenance report)
43
47
  ${pc.green("status")} Print version and config summary
48
+ ${pc.green("task-state")} Durable task record ('task-state show [--json]' | 'task-state update <id> --status --step --next --plan')
49
+ ${pc.green("context")} Repo-context evidence ('context resolve <path> [--root]' | 'context check <envelope.json>' | 'context record --task <id> <envelope.json>')
44
50
  ${pc.green("task")} Create and list task files (new, list)
45
51
  ${pc.green("migrate")} Export MeowKit to external coding-agent tools (cursor, codex, ...)
46
- ${pc.green("providers")} Show effective provider support matrix and enforcement levels
52
+ ${pc.green("providers")} Show effective provider support matrix and enforcement levels ('providers [<p>] --lifecycle' for the capability-adapter + lifecycle matrix)
47
53
  ${pc.green("orchviz")} Live web visualizer for the active Claude Code session
48
54
  ${pc.green("inventory")} List harness artifacts with governance metadata
49
55
  ${pc.green("trace")} On-demand trace recall: score | audit | propose | --friction
@@ -60,6 +66,7 @@ ${pc.bold("Options:")}
60
66
  --providers Doctor/migrate: include provider contract diagnostics
61
67
  --state Doctor: include state taxonomy diagnostics
62
68
  --hard-gates Doctor: live-probe the hard gates (plan/privacy/injection block)
69
+ --consolidation Doctor: show the Phase-7 consolidation/deprecation ledger (status ≠ runtime availability)
63
70
  --portable Validate: include portable provider contract checks
64
71
  --strict Validate: treat WARN as failure (exit 1); off by default
65
72
  --workflow Validate: run only the workflow.yaml drift-check (CI scope)
@@ -135,6 +142,7 @@ async function main() {
135
142
  "providers",
136
143
  "state",
137
144
  "hard-gates",
145
+ "consolidation",
138
146
  "portable",
139
147
  "all",
140
148
  "dry-run",
@@ -168,10 +176,20 @@ async function main() {
168
176
  "packs",
169
177
  "rules",
170
178
  "substrate",
179
+ "capabilities",
171
180
  "emit",
172
181
  "commit",
182
+ "explain",
183
+ "write",
173
184
  ],
174
185
  string: [
186
+ "mode",
187
+ "intent",
188
+ "provider",
189
+ "step",
190
+ "next",
191
+ "plan",
192
+ "root",
175
193
  "only",
176
194
  "type",
177
195
  "priority",
@@ -222,8 +240,14 @@ async function main() {
222
240
  yes: args.yes,
223
241
  });
224
242
  break;
225
- case "validate":
243
+ case "validate": {
244
+ const modeArg = args.mode;
245
+ if (modeArg !== undefined && modeArg !== "authoring" && modeArg !== "flat-copy") {
246
+ console.error(`Invalid --mode "${modeArg}". Expected "authoring" or "flat-copy".`);
247
+ process.exit(1);
248
+ }
226
249
  await validate({
250
+ mode: modeArg,
227
251
  portable: args.portable,
228
252
  strict: args.strict,
229
253
  workflow: args.workflow,
@@ -232,13 +256,25 @@ async function main() {
232
256
  packs: args.packs,
233
257
  rules: args.rules,
234
258
  plugin: args.plugin,
259
+ capabilities: args.capabilities,
235
260
  });
236
261
  break;
262
+ }
237
263
  case "build-plugin":
238
264
  await buildPlugin({
239
265
  json: args.json,
240
266
  });
241
267
  break;
268
+ case "capabilities":
269
+ await capabilities({
270
+ subcommand: args._[1],
271
+ target: args._[2],
272
+ json: args.json,
273
+ intent: args.intent,
274
+ provider: args.provider,
275
+ write: args.write,
276
+ });
277
+ break;
242
278
  case "pack":
243
279
  await pack({
244
280
  subcommand: args._[1],
@@ -253,6 +289,7 @@ async function main() {
253
289
  await providersCommand({
254
290
  provider: args._[1],
255
291
  json: args.json,
292
+ lifecycle: args.lifecycle,
256
293
  });
257
294
  break;
258
295
  case "inventory":
@@ -344,11 +381,36 @@ async function main() {
344
381
  providers: args.providers,
345
382
  state: args.state,
346
383
  hardGates: args["hard-gates"],
384
+ // `doctor provenance [--explain]`: read-only provenance report.
385
+ provenance: args._[1] === "provenance" || undefined,
386
+ explain: args.explain,
387
+ consolidation: args.consolidation,
347
388
  });
348
389
  break;
349
390
  case "status":
350
391
  await printStatus();
351
392
  break;
393
+ case "task-state":
394
+ await taskState({
395
+ subcommand: args._[1],
396
+ taskId: args._[2],
397
+ status: args.status,
398
+ step: args.step,
399
+ next: args.next,
400
+ plan: args.plan,
401
+ json: args.json,
402
+ cliVersion: VERSION,
403
+ });
404
+ break;
405
+ case "context":
406
+ await context({
407
+ subcommand: args._[1],
408
+ target: args._[2],
409
+ root: args.root,
410
+ task: args.task,
411
+ json: args.json,
412
+ });
413
+ break;
352
414
  case "task": {
353
415
  const subcommand = args._[1];
354
416
  // positional description: everything after the subcommand that isn't a flag