@planu/cli 0.43.1 → 0.45.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 (433) hide show
  1. package/dist/cli/colors.d.ts +14 -0
  2. package/dist/cli/colors.d.ts.map +1 -0
  3. package/dist/cli/colors.js +26 -0
  4. package/dist/cli/colors.js.map +1 -0
  5. package/dist/cli/commands/audit.d.ts +3 -0
  6. package/dist/cli/commands/audit.d.ts.map +1 -0
  7. package/dist/cli/commands/audit.js +38 -0
  8. package/dist/cli/commands/audit.js.map +1 -0
  9. package/dist/cli/commands/create.d.ts +3 -0
  10. package/dist/cli/commands/create.d.ts.map +1 -0
  11. package/dist/cli/commands/create.js +50 -0
  12. package/dist/cli/commands/create.js.map +1 -0
  13. package/dist/cli/commands/dashboard.d.ts +3 -0
  14. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  15. package/dist/cli/commands/dashboard.js +29 -0
  16. package/dist/cli/commands/dashboard.js.map +1 -0
  17. package/dist/cli/commands/estimate.d.ts +3 -0
  18. package/dist/cli/commands/estimate.d.ts.map +1 -0
  19. package/dist/cli/commands/estimate.js +36 -0
  20. package/dist/cli/commands/estimate.js.map +1 -0
  21. package/dist/cli/commands/handoff.d.ts +3 -0
  22. package/dist/cli/commands/handoff.d.ts.map +1 -0
  23. package/dist/cli/commands/handoff.js +49 -0
  24. package/dist/cli/commands/handoff.js.map +1 -0
  25. package/dist/cli/commands/init.d.ts +3 -0
  26. package/dist/cli/commands/init.d.ts.map +1 -0
  27. package/dist/cli/commands/init.js +43 -0
  28. package/dist/cli/commands/init.js.map +1 -0
  29. package/dist/cli/commands/list.d.ts +3 -0
  30. package/dist/cli/commands/list.d.ts.map +1 -0
  31. package/dist/cli/commands/list.js +36 -0
  32. package/dist/cli/commands/list.js.map +1 -0
  33. package/dist/cli/commands/serve.d.ts +3 -0
  34. package/dist/cli/commands/serve.d.ts.map +1 -0
  35. package/dist/cli/commands/serve.js +34 -0
  36. package/dist/cli/commands/serve.js.map +1 -0
  37. package/dist/cli/commands/status.d.ts +3 -0
  38. package/dist/cli/commands/status.d.ts.map +1 -0
  39. package/dist/cli/commands/status.js +49 -0
  40. package/dist/cli/commands/status.js.map +1 -0
  41. package/dist/cli/commands/validate.d.ts +3 -0
  42. package/dist/cli/commands/validate.d.ts.map +1 -0
  43. package/dist/cli/commands/validate.js +36 -0
  44. package/dist/cli/commands/validate.js.map +1 -0
  45. package/dist/cli/commands/watch.d.ts +3 -0
  46. package/dist/cli/commands/watch.d.ts.map +1 -0
  47. package/dist/cli/commands/watch.js +156 -0
  48. package/dist/cli/commands/watch.js.map +1 -0
  49. package/dist/cli/formatter.d.ts +18 -0
  50. package/dist/cli/formatter.d.ts.map +1 -0
  51. package/dist/cli/formatter.js +78 -0
  52. package/dist/cli/formatter.js.map +1 -0
  53. package/dist/cli/index.d.ts +6 -0
  54. package/dist/cli/index.d.ts.map +1 -0
  55. package/dist/cli/index.js +7 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/interactive.d.ts +13 -0
  58. package/dist/cli/interactive.d.ts.map +1 -0
  59. package/dist/cli/interactive.js +42 -0
  60. package/dist/cli/interactive.js.map +1 -0
  61. package/dist/cli/project-detector.d.ts +6 -0
  62. package/dist/cli/project-detector.d.ts.map +1 -0
  63. package/dist/cli/project-detector.js +12 -0
  64. package/dist/cli/project-detector.js.map +1 -0
  65. package/dist/cli/router.d.ts +5 -0
  66. package/dist/cli/router.d.ts.map +1 -0
  67. package/dist/cli/router.js +104 -0
  68. package/dist/cli/router.js.map +1 -0
  69. package/dist/config/hook-defaults.json +19 -0
  70. package/dist/config/license-plans.json +23 -2
  71. package/dist/config/registry-categories.json +20 -0
  72. package/dist/config/registry-stacks.json +16 -0
  73. package/dist/config/tool-groups.json +12 -1
  74. package/dist/engine/analyzer/analyze-project.d.ts +15 -0
  75. package/dist/engine/analyzer/analyze-project.d.ts.map +1 -0
  76. package/dist/engine/analyzer/analyze-project.js +101 -0
  77. package/dist/engine/analyzer/analyze-project.js.map +1 -0
  78. package/dist/engine/analyzer/completeness-checker.d.ts +6 -0
  79. package/dist/engine/analyzer/completeness-checker.d.ts.map +1 -0
  80. package/dist/engine/analyzer/completeness-checker.js +79 -0
  81. package/dist/engine/analyzer/completeness-checker.js.map +1 -0
  82. package/dist/engine/analyzer/db-engine.d.ts +9 -0
  83. package/dist/engine/analyzer/db-engine.d.ts.map +1 -0
  84. package/dist/engine/analyzer/db-engine.js +137 -0
  85. package/dist/engine/analyzer/db-engine.js.map +1 -0
  86. package/dist/engine/analyzer/detectors.d.ts +7 -0
  87. package/dist/engine/analyzer/detectors.d.ts.map +1 -0
  88. package/dist/engine/analyzer/detectors.js +234 -0
  89. package/dist/engine/analyzer/detectors.js.map +1 -0
  90. package/dist/engine/analyzer/env-setup.d.ts +6 -0
  91. package/dist/engine/analyzer/env-setup.d.ts.map +1 -0
  92. package/dist/engine/analyzer/env-setup.js +174 -0
  93. package/dist/engine/analyzer/env-setup.js.map +1 -0
  94. package/dist/engine/analyzer/index.d.ts +6 -0
  95. package/dist/engine/analyzer/index.d.ts.map +1 -0
  96. package/dist/engine/analyzer/index.js +8 -0
  97. package/dist/engine/analyzer/index.js.map +1 -0
  98. package/dist/engine/analyzer-db.d.ts +1 -8
  99. package/dist/engine/analyzer-db.d.ts.map +1 -1
  100. package/dist/engine/analyzer-db.js +3 -136
  101. package/dist/engine/analyzer-db.js.map +1 -1
  102. package/dist/engine/analyzer-detectors.d.ts +1 -6
  103. package/dist/engine/analyzer-detectors.d.ts.map +1 -1
  104. package/dist/engine/analyzer-detectors.js +3 -231
  105. package/dist/engine/analyzer-detectors.js.map +1 -1
  106. package/dist/engine/analyzer-env.d.ts +1 -5
  107. package/dist/engine/analyzer-env.d.ts.map +1 -1
  108. package/dist/engine/analyzer-env.js +3 -173
  109. package/dist/engine/analyzer-env.js.map +1 -1
  110. package/dist/engine/analyzer.d.ts +2 -18
  111. package/dist/engine/analyzer.d.ts.map +1 -1
  112. package/dist/engine/analyzer.js +4 -172
  113. package/dist/engine/analyzer.js.map +1 -1
  114. package/dist/engine/dashboard/data-loader.d.ts +16 -1
  115. package/dist/engine/dashboard/data-loader.d.ts.map +1 -1
  116. package/dist/engine/dashboard/data-loader.js +140 -2
  117. package/dist/engine/dashboard/data-loader.js.map +1 -1
  118. package/dist/engine/dashboard/index.d.ts +2 -0
  119. package/dist/engine/dashboard/index.d.ts.map +1 -1
  120. package/dist/engine/dashboard/index.js +2 -0
  121. package/dist/engine/dashboard/index.js.map +1 -1
  122. package/dist/engine/dashboard/kanban-logic.d.ts +31 -0
  123. package/dist/engine/dashboard/kanban-logic.d.ts.map +1 -0
  124. package/dist/engine/dashboard/kanban-logic.js +122 -0
  125. package/dist/engine/dashboard/kanban-logic.js.map +1 -0
  126. package/dist/engine/dashboard/routes.d.ts +2 -0
  127. package/dist/engine/dashboard/routes.d.ts.map +1 -1
  128. package/dist/engine/dashboard/routes.js +112 -23
  129. package/dist/engine/dashboard/routes.js.map +1 -1
  130. package/dist/engine/dashboard/server.d.ts +5 -0
  131. package/dist/engine/dashboard/server.d.ts.map +1 -1
  132. package/dist/engine/dashboard/server.js +48 -0
  133. package/dist/engine/dashboard/server.js.map +1 -1
  134. package/dist/engine/dashboard/spec-updater.d.ts +8 -0
  135. package/dist/engine/dashboard/spec-updater.d.ts.map +1 -0
  136. package/dist/engine/dashboard/spec-updater.js +37 -0
  137. package/dist/engine/dashboard/spec-updater.js.map +1 -0
  138. package/dist/engine/dashboard/templates-kanban.d.ts +6 -0
  139. package/dist/engine/dashboard/templates-kanban.d.ts.map +1 -0
  140. package/dist/engine/dashboard/templates-kanban.js +100 -0
  141. package/dist/engine/dashboard/templates-kanban.js.map +1 -0
  142. package/dist/engine/dashboard/templates-layout.d.ts +3 -3
  143. package/dist/engine/dashboard/templates-layout.d.ts.map +1 -1
  144. package/dist/engine/dashboard/templates-layout.js +167 -44
  145. package/dist/engine/dashboard/templates-layout.js.map +1 -1
  146. package/dist/engine/dashboard/templates-project.d.ts +1 -1
  147. package/dist/engine/dashboard/templates-project.d.ts.map +1 -1
  148. package/dist/engine/dashboard/templates-project.js +109 -3
  149. package/dist/engine/dashboard/templates-project.js.map +1 -1
  150. package/dist/engine/dashboard/templates.d.ts +1 -0
  151. package/dist/engine/dashboard/templates.d.ts.map +1 -1
  152. package/dist/engine/dashboard/templates.js +1 -0
  153. package/dist/engine/dashboard/templates.js.map +1 -1
  154. package/dist/engine/hooks/config-loader.d.ts +36 -0
  155. package/dist/engine/hooks/config-loader.d.ts.map +1 -0
  156. package/dist/engine/hooks/config-loader.js +142 -0
  157. package/dist/engine/hooks/config-loader.js.map +1 -0
  158. package/dist/engine/hooks/debouncer.d.ts +30 -0
  159. package/dist/engine/hooks/debouncer.d.ts.map +1 -0
  160. package/dist/engine/hooks/debouncer.js +124 -0
  161. package/dist/engine/hooks/debouncer.js.map +1 -0
  162. package/dist/engine/hooks/event-bus.d.ts +40 -0
  163. package/dist/engine/hooks/event-bus.d.ts.map +1 -0
  164. package/dist/engine/hooks/event-bus.js +83 -0
  165. package/dist/engine/hooks/event-bus.js.map +1 -0
  166. package/dist/engine/hooks/file-watcher.d.ts +48 -0
  167. package/dist/engine/hooks/file-watcher.d.ts.map +1 -0
  168. package/dist/engine/hooks/file-watcher.js +193 -0
  169. package/dist/engine/hooks/file-watcher.js.map +1 -0
  170. package/dist/engine/hooks/handlers/on-commit.d.ts +26 -0
  171. package/dist/engine/hooks/handlers/on-commit.d.ts.map +1 -0
  172. package/dist/engine/hooks/handlers/on-commit.js +198 -0
  173. package/dist/engine/hooks/handlers/on-commit.js.map +1 -0
  174. package/dist/engine/hooks/handlers/on-create.d.ts +8 -0
  175. package/dist/engine/hooks/handlers/on-create.d.ts.map +1 -0
  176. package/dist/engine/hooks/handlers/on-create.js +30 -0
  177. package/dist/engine/hooks/handlers/on-create.js.map +1 -0
  178. package/dist/engine/hooks/handlers/on-delete.d.ts +9 -0
  179. package/dist/engine/hooks/handlers/on-delete.d.ts.map +1 -0
  180. package/dist/engine/hooks/handlers/on-delete.js +33 -0
  181. package/dist/engine/hooks/handlers/on-delete.js.map +1 -0
  182. package/dist/engine/hooks/handlers/on-save.d.ts +29 -0
  183. package/dist/engine/hooks/handlers/on-save.d.ts.map +1 -0
  184. package/dist/engine/hooks/handlers/on-save.js +118 -0
  185. package/dist/engine/hooks/handlers/on-save.js.map +1 -0
  186. package/dist/engine/hooks/handlers/on-test-pass.d.ts +33 -0
  187. package/dist/engine/hooks/handlers/on-test-pass.d.ts.map +1 -0
  188. package/dist/engine/hooks/handlers/on-test-pass.js +103 -0
  189. package/dist/engine/hooks/handlers/on-test-pass.js.map +1 -0
  190. package/dist/engine/hooks/hook-engine.d.ts +50 -0
  191. package/dist/engine/hooks/hook-engine.d.ts.map +1 -0
  192. package/dist/engine/hooks/hook-engine.js +159 -0
  193. package/dist/engine/hooks/hook-engine.js.map +1 -0
  194. package/dist/engine/hooks/index.d.ts +10 -0
  195. package/dist/engine/hooks/index.d.ts.map +1 -1
  196. package/dist/engine/hooks/index.js +12 -0
  197. package/dist/engine/hooks/index.js.map +1 -1
  198. package/dist/engine/living-spec/annotation-parser.d.ts +18 -0
  199. package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -0
  200. package/dist/engine/living-spec/annotation-parser.js +105 -0
  201. package/dist/engine/living-spec/annotation-parser.js.map +1 -0
  202. package/dist/engine/living-spec/auto-reconciler.d.ts +28 -0
  203. package/dist/engine/living-spec/auto-reconciler.d.ts.map +1 -0
  204. package/dist/engine/living-spec/auto-reconciler.js +103 -0
  205. package/dist/engine/living-spec/auto-reconciler.js.map +1 -0
  206. package/dist/engine/living-spec/bidirectional-sync.d.ts +26 -0
  207. package/dist/engine/living-spec/bidirectional-sync.d.ts.map +1 -0
  208. package/dist/engine/living-spec/bidirectional-sync.js +160 -0
  209. package/dist/engine/living-spec/bidirectional-sync.js.map +1 -0
  210. package/dist/engine/living-spec/dashboard-collector.d.ts +22 -0
  211. package/dist/engine/living-spec/dashboard-collector.d.ts.map +1 -0
  212. package/dist/engine/living-spec/dashboard-collector.js +97 -0
  213. package/dist/engine/living-spec/dashboard-collector.js.map +1 -0
  214. package/dist/engine/living-spec/drift-watcher.d.ts +15 -0
  215. package/dist/engine/living-spec/drift-watcher.d.ts.map +1 -0
  216. package/dist/engine/living-spec/drift-watcher.js +126 -0
  217. package/dist/engine/living-spec/drift-watcher.js.map +1 -0
  218. package/dist/engine/living-spec/hash-tracker.d.ts +24 -0
  219. package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -0
  220. package/dist/engine/living-spec/hash-tracker.js +123 -0
  221. package/dist/engine/living-spec/hash-tracker.js.map +1 -0
  222. package/dist/engine/living-spec/index.d.ts +9 -0
  223. package/dist/engine/living-spec/index.d.ts.map +1 -0
  224. package/dist/engine/living-spec/index.js +10 -0
  225. package/dist/engine/living-spec/index.js.map +1 -0
  226. package/dist/engine/living-spec/signature-tracker.d.ts +18 -0
  227. package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -0
  228. package/dist/engine/living-spec/signature-tracker.js +136 -0
  229. package/dist/engine/living-spec/signature-tracker.js.map +1 -0
  230. package/dist/engine/living-spec/test-coverage-correlator.d.ts +22 -0
  231. package/dist/engine/living-spec/test-coverage-correlator.d.ts.map +1 -0
  232. package/dist/engine/living-spec/test-coverage-correlator.js +130 -0
  233. package/dist/engine/living-spec/test-coverage-correlator.js.map +1 -0
  234. package/dist/engine/plugins/extensions/worker-extension.d.ts.map +1 -1
  235. package/dist/engine/plugins/extensions/worker-extension.js +3 -1
  236. package/dist/engine/plugins/extensions/worker-extension.js.map +1 -1
  237. package/dist/engine/safety/file-mutex.d.ts.map +1 -1
  238. package/dist/engine/safety/file-mutex.js +3 -0
  239. package/dist/engine/safety/file-mutex.js.map +1 -1
  240. package/dist/engine/spec-registry/adapter.d.ts +9 -0
  241. package/dist/engine/spec-registry/adapter.d.ts.map +1 -0
  242. package/dist/engine/spec-registry/adapter.js +303 -0
  243. package/dist/engine/spec-registry/adapter.js.map +1 -0
  244. package/dist/engine/spec-registry/client.d.ts +8 -0
  245. package/dist/engine/spec-registry/client.d.ts.map +1 -0
  246. package/dist/engine/spec-registry/client.js +194 -0
  247. package/dist/engine/spec-registry/client.js.map +1 -0
  248. package/dist/engine/spec-registry/index.d.ts +7 -0
  249. package/dist/engine/spec-registry/index.d.ts.map +1 -0
  250. package/dist/engine/spec-registry/index.js +7 -0
  251. package/dist/engine/spec-registry/index.js.map +1 -0
  252. package/dist/engine/spec-registry/packager.d.ts +24 -0
  253. package/dist/engine/spec-registry/packager.d.ts.map +1 -0
  254. package/dist/engine/spec-registry/packager.js +122 -0
  255. package/dist/engine/spec-registry/packager.js.map +1 -0
  256. package/dist/engine/spec-registry/scorer.d.ts +10 -0
  257. package/dist/engine/spec-registry/scorer.d.ts.map +1 -0
  258. package/dist/engine/spec-registry/scorer.js +151 -0
  259. package/dist/engine/spec-registry/scorer.js.map +1 -0
  260. package/dist/engine/spec-registry/validator.d.ts +11 -0
  261. package/dist/engine/spec-registry/validator.d.ts.map +1 -0
  262. package/dist/engine/spec-registry/validator.js +144 -0
  263. package/dist/engine/spec-registry/validator.js.map +1 -0
  264. package/dist/index.js +31 -0
  265. package/dist/index.js.map +1 -1
  266. package/dist/storage/hash-snapshot-store.d.ts +18 -0
  267. package/dist/storage/hash-snapshot-store.d.ts.map +1 -0
  268. package/dist/storage/hash-snapshot-store.js +43 -0
  269. package/dist/storage/hash-snapshot-store.js.map +1 -0
  270. package/dist/storage/index.d.ts +3 -0
  271. package/dist/storage/index.d.ts.map +1 -1
  272. package/dist/storage/index.js +3 -0
  273. package/dist/storage/index.js.map +1 -1
  274. package/dist/storage/living-dashboard-store.d.ts +10 -0
  275. package/dist/storage/living-dashboard-store.d.ts.map +1 -0
  276. package/dist/storage/living-dashboard-store.js +31 -0
  277. package/dist/storage/living-dashboard-store.js.map +1 -0
  278. package/dist/storage/sync-log-store.d.ts +26 -0
  279. package/dist/storage/sync-log-store.d.ts.map +1 -0
  280. package/dist/storage/sync-log-store.js +60 -0
  281. package/dist/storage/sync-log-store.js.map +1 -0
  282. package/dist/tools/auto-reconcile.d.ts +3 -0
  283. package/dist/tools/auto-reconcile.d.ts.map +1 -0
  284. package/dist/tools/auto-reconcile.js +81 -0
  285. package/dist/tools/auto-reconcile.js.map +1 -0
  286. package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.d.ts.map +1 -1
  287. package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js +6 -0
  288. package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js.map +1 -1
  289. package/dist/tools/create-spec/spec-builder.js +2 -0
  290. package/dist/tools/create-spec/spec-builder.js.map +1 -1
  291. package/dist/tools/dashboard.d.ts.map +1 -1
  292. package/dist/tools/dashboard.js +20 -13
  293. package/dist/tools/dashboard.js.map +1 -1
  294. package/dist/tools/generate-annotations.d.ts +3 -0
  295. package/dist/tools/generate-annotations.d.ts.map +1 -0
  296. package/dist/tools/generate-annotations.js +70 -0
  297. package/dist/tools/generate-annotations.js.map +1 -0
  298. package/dist/tools/generate-execution-plan.d.ts.map +1 -1
  299. package/dist/tools/generate-execution-plan.js +1 -0
  300. package/dist/tools/generate-execution-plan.js.map +1 -1
  301. package/dist/tools/github-pr-handler.d.ts.map +1 -1
  302. package/dist/tools/github-pr-handler.js +1 -0
  303. package/dist/tools/github-pr-handler.js.map +1 -1
  304. package/dist/tools/github-review-handler.d.ts.map +1 -1
  305. package/dist/tools/github-review-handler.js +1 -0
  306. package/dist/tools/github-review-handler.js.map +1 -1
  307. package/dist/tools/ide-config-handler.d.ts.map +1 -1
  308. package/dist/tools/ide-config-handler.js +3 -0
  309. package/dist/tools/ide-config-handler.js.map +1 -1
  310. package/dist/tools/init-project/handler.d.ts.map +1 -1
  311. package/dist/tools/init-project/handler.js +0 -3
  312. package/dist/tools/init-project/handler.js.map +1 -1
  313. package/dist/tools/living-spec-coverage.d.ts +3 -0
  314. package/dist/tools/living-spec-coverage.d.ts.map +1 -0
  315. package/dist/tools/living-spec-coverage.js +100 -0
  316. package/dist/tools/living-spec-coverage.js.map +1 -0
  317. package/dist/tools/living-spec-watch.d.ts +4 -0
  318. package/dist/tools/living-spec-watch.d.ts.map +1 -0
  319. package/dist/tools/living-spec-watch.js +94 -0
  320. package/dist/tools/living-spec-watch.js.map +1 -0
  321. package/dist/tools/manage-plugins-handler.d.ts.map +1 -1
  322. package/dist/tools/manage-plugins-handler.js +2 -1
  323. package/dist/tools/manage-plugins-handler.js.map +1 -1
  324. package/dist/tools/orchestrate-distribution.d.ts.map +1 -1
  325. package/dist/tools/orchestrate-distribution.js +1 -0
  326. package/dist/tools/orchestrate-distribution.js.map +1 -1
  327. package/dist/tools/orchestrate-runtime.js +2 -0
  328. package/dist/tools/orchestrate-runtime.js.map +1 -1
  329. package/dist/tools/plan-team-distribution.d.ts.map +1 -1
  330. package/dist/tools/plan-team-distribution.js +2 -0
  331. package/dist/tools/plan-team-distribution.js.map +1 -1
  332. package/dist/tools/register-dashboard-tools.d.ts.map +1 -1
  333. package/dist/tools/register-dashboard-tools.js +5 -1
  334. package/dist/tools/register-dashboard-tools.js.map +1 -1
  335. package/dist/tools/register-hooks-tools.d.ts.map +1 -1
  336. package/dist/tools/register-hooks-tools.js +82 -1
  337. package/dist/tools/register-hooks-tools.js.map +1 -1
  338. package/dist/tools/register-living-spec-advanced-tools.d.ts +6 -0
  339. package/dist/tools/register-living-spec-advanced-tools.d.ts.map +1 -0
  340. package/dist/tools/register-living-spec-advanced-tools.js +113 -0
  341. package/dist/tools/register-living-spec-advanced-tools.js.map +1 -0
  342. package/dist/tools/register-living-spec-tools.d.ts +6 -0
  343. package/dist/tools/register-living-spec-tools.d.ts.map +1 -0
  344. package/dist/tools/register-living-spec-tools.js +67 -0
  345. package/dist/tools/register-living-spec-tools.js.map +1 -0
  346. package/dist/tools/register-spec-registry-tools.d.ts +3 -0
  347. package/dist/tools/register-spec-registry-tools.d.ts.map +1 -0
  348. package/dist/tools/register-spec-registry-tools.js +91 -0
  349. package/dist/tools/register-spec-registry-tools.js.map +1 -0
  350. package/dist/tools/registry/auth.d.ts +17 -0
  351. package/dist/tools/registry/auth.d.ts.map +1 -0
  352. package/dist/tools/registry/auth.js +132 -0
  353. package/dist/tools/registry/auth.js.map +1 -0
  354. package/dist/tools/registry/index.d.ts +5 -0
  355. package/dist/tools/registry/index.d.ts.map +1 -0
  356. package/dist/tools/registry/index.js +6 -0
  357. package/dist/tools/registry/index.js.map +1 -0
  358. package/dist/tools/registry/install.d.ts +7 -0
  359. package/dist/tools/registry/install.d.ts.map +1 -0
  360. package/dist/tools/registry/install.js +125 -0
  361. package/dist/tools/registry/install.js.map +1 -0
  362. package/dist/tools/registry/publish.d.ts +7 -0
  363. package/dist/tools/registry/publish.d.ts.map +1 -0
  364. package/dist/tools/registry/publish.js +96 -0
  365. package/dist/tools/registry/publish.js.map +1 -0
  366. package/dist/tools/registry/search.d.ts +7 -0
  367. package/dist/tools/registry/search.d.ts.map +1 -0
  368. package/dist/tools/registry/search.js +79 -0
  369. package/dist/tools/registry/search.js.map +1 -0
  370. package/dist/tools/resolve-sync-conflict.d.ts +3 -0
  371. package/dist/tools/resolve-sync-conflict.d.ts.map +1 -0
  372. package/dist/tools/resolve-sync-conflict.js +38 -0
  373. package/dist/tools/resolve-sync-conflict.js.map +1 -0
  374. package/dist/tools/schemas/index.d.ts +1 -0
  375. package/dist/tools/schemas/index.d.ts.map +1 -1
  376. package/dist/tools/schemas/index.js +1 -0
  377. package/dist/tools/schemas/index.js.map +1 -1
  378. package/dist/tools/schemas/spec-registry-schemas.d.ts +39 -0
  379. package/dist/tools/schemas/spec-registry-schemas.d.ts.map +1 -0
  380. package/dist/tools/schemas/spec-registry-schemas.js +72 -0
  381. package/dist/tools/schemas/spec-registry-schemas.js.map +1 -0
  382. package/dist/tools/snapshot-spec-hashes.d.ts +3 -0
  383. package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -0
  384. package/dist/tools/snapshot-spec-hashes.js +100 -0
  385. package/dist/tools/snapshot-spec-hashes.js.map +1 -0
  386. package/dist/tools/spec-diff.d.ts +3 -0
  387. package/dist/tools/spec-diff.d.ts.map +1 -0
  388. package/dist/tools/spec-diff.js +58 -0
  389. package/dist/tools/spec-diff.js.map +1 -0
  390. package/dist/tools/start-hooks.d.ts +17 -0
  391. package/dist/tools/start-hooks.d.ts.map +1 -0
  392. package/dist/tools/start-hooks.js +209 -0
  393. package/dist/tools/start-hooks.js.map +1 -0
  394. package/dist/tools/sync-code-to-spec.d.ts +3 -0
  395. package/dist/tools/sync-code-to-spec.d.ts.map +1 -0
  396. package/dist/tools/sync-code-to-spec.js +51 -0
  397. package/dist/tools/sync-code-to-spec.js.map +1 -0
  398. package/dist/tools/sync-spec-to-code.d.ts +3 -0
  399. package/dist/tools/sync-spec-to-code.d.ts.map +1 -0
  400. package/dist/tools/sync-spec-to-code.js +58 -0
  401. package/dist/tools/sync-spec-to-code.js.map +1 -0
  402. package/dist/tools/validate-annotations.d.ts +3 -0
  403. package/dist/tools/validate-annotations.d.ts.map +1 -0
  404. package/dist/tools/validate-annotations.js +90 -0
  405. package/dist/tools/validate-annotations.js.map +1 -0
  406. package/dist/types/cli.d.ts +14 -0
  407. package/dist/types/cli.d.ts.map +1 -0
  408. package/dist/types/cli.js +3 -0
  409. package/dist/types/cli.js.map +1 -0
  410. package/dist/types/dashboard.d.ts +86 -1
  411. package/dist/types/dashboard.d.ts.map +1 -1
  412. package/dist/types/file-hooks.d.ts +230 -0
  413. package/dist/types/file-hooks.d.ts.map +1 -0
  414. package/dist/types/file-hooks.js +3 -0
  415. package/dist/types/file-hooks.js.map +1 -0
  416. package/dist/types/index.d.ts +4 -0
  417. package/dist/types/index.d.ts.map +1 -1
  418. package/dist/types/index.js +4 -0
  419. package/dist/types/index.js.map +1 -1
  420. package/dist/types/living-spec.d.ts +382 -0
  421. package/dist/types/living-spec.d.ts.map +1 -0
  422. package/dist/types/living-spec.js +3 -0
  423. package/dist/types/living-spec.js.map +1 -0
  424. package/dist/types/spec-registry.d.ts +194 -0
  425. package/dist/types/spec-registry.d.ts.map +1 -0
  426. package/dist/types/spec-registry.js +3 -0
  427. package/dist/types/spec-registry.js.map +1 -0
  428. package/package.json +1 -1
  429. package/src/config/hook-defaults.json +19 -0
  430. package/src/config/license-plans.json +23 -2
  431. package/src/config/registry-categories.json +20 -0
  432. package/src/config/registry-stacks.json +16 -0
  433. package/src/config/tool-groups.json +12 -1
@@ -0,0 +1,193 @@
1
+ // engine/hooks/file-watcher.ts — File system watcher with normalized events (SPEC-129)
2
+ import { EventEmitter } from 'node:events';
3
+ import { watch } from 'node:fs';
4
+ import { stat } from 'node:fs/promises';
5
+ import { normalize, sep } from 'node:path';
6
+ // ---------------------------------------------------------------------------
7
+ // Glob matching (simple, no external deps)
8
+ // ---------------------------------------------------------------------------
9
+ /**
10
+ * Convert a glob pattern to a RegExp. Supports:
11
+ * - `**` matches any path segment (including nested)
12
+ * - `*` matches any characters except path separator
13
+ * - `?` matches a single character
14
+ */
15
+ export function globToRegex(pattern) {
16
+ let regex = '';
17
+ let i = 0;
18
+ while (i < pattern.length) {
19
+ const ch = pattern.charAt(i);
20
+ if (ch === '*' && pattern.charAt(i + 1) === '*') {
21
+ // ** matches everything including /
22
+ regex += '.*';
23
+ i += 2;
24
+ // skip trailing /
25
+ if (pattern.charAt(i) === '/') {
26
+ i++;
27
+ }
28
+ }
29
+ else if (ch === '*') {
30
+ // * matches everything except /
31
+ regex += '[^/]*';
32
+ i++;
33
+ }
34
+ else if (ch === '?') {
35
+ regex += '[^/]';
36
+ i++;
37
+ }
38
+ else if (ch === '.') {
39
+ regex += '\\.';
40
+ i++;
41
+ }
42
+ else {
43
+ regex += ch;
44
+ i++;
45
+ }
46
+ }
47
+ return new RegExp(`^${regex}$`);
48
+ }
49
+ /**
50
+ * Test whether `filePath` matches a glob pattern.
51
+ */
52
+ export function matchesGlobPattern(filePath, pattern) {
53
+ const normalized = filePath.replace(/\\/g, '/');
54
+ return globToRegex(pattern).test(normalized);
55
+ }
56
+ /**
57
+ * Returns true if filePath matches any include pattern
58
+ * and does not match any exclude pattern.
59
+ */
60
+ export function matchesPatterns(filePath, include, exclude) {
61
+ // If no include patterns, match everything
62
+ const included = !include || include.length === 0 || include.some((p) => matchesGlobPattern(filePath, p));
63
+ if (!included) {
64
+ return false;
65
+ }
66
+ // If any exclude matches, reject
67
+ if (exclude?.some((p) => matchesGlobPattern(filePath, p))) {
68
+ return false;
69
+ }
70
+ return true;
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Default excludes
74
+ // ---------------------------------------------------------------------------
75
+ const DEFAULT_EXCLUDES = ['data/**', 'node_modules/**', '.git/**'];
76
+ // ---------------------------------------------------------------------------
77
+ // FileWatcher
78
+ // ---------------------------------------------------------------------------
79
+ export class FileWatcher extends EventEmitter {
80
+ watcher = null;
81
+ rootDir;
82
+ include;
83
+ exclude;
84
+ /** Track known files to distinguish create vs modify */
85
+ knownFiles = new Set();
86
+ closed = false;
87
+ constructor(options) {
88
+ super();
89
+ this.rootDir = normalize(options.rootDir);
90
+ this.include = options.include ?? [];
91
+ this.exclude = [...DEFAULT_EXCLUDES, ...(options.exclude ?? [])];
92
+ }
93
+ /**
94
+ * Start watching. Emits 'change' events with WatcherEvent payloads.
95
+ * Emits 'error' on watch failure — never throws.
96
+ */
97
+ start() {
98
+ if (this.closed) {
99
+ return;
100
+ }
101
+ try {
102
+ this.watcher = watch(this.rootDir, { recursive: true }, (_eventType, filename) => {
103
+ if (!filename || this.closed) {
104
+ return;
105
+ }
106
+ // Normalize path separator
107
+ const relPath = filename.replace(/\\/g, '/');
108
+ void this.handleFsEvent(relPath);
109
+ });
110
+ this.watcher.on('error', (err) => {
111
+ this.emit('error', err);
112
+ });
113
+ }
114
+ catch (err) {
115
+ this.emit('error', err);
116
+ }
117
+ }
118
+ /**
119
+ * Mark a file as known (pre-existing). Call this for initial file scan.
120
+ */
121
+ addKnownFile(relPath) {
122
+ this.knownFiles.add(relPath.replace(/\\/g, '/'));
123
+ }
124
+ /**
125
+ * Mark multiple files as known.
126
+ */
127
+ addKnownFiles(paths) {
128
+ for (const p of paths) {
129
+ this.knownFiles.add(p.replace(/\\/g, '/'));
130
+ }
131
+ }
132
+ /**
133
+ * Graceful shutdown: release all handles.
134
+ */
135
+ close() {
136
+ this.closed = true;
137
+ if (this.watcher) {
138
+ this.watcher.close();
139
+ this.watcher = null;
140
+ }
141
+ this.removeAllListeners();
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Private
145
+ // ---------------------------------------------------------------------------
146
+ async handleFsEvent(relPath) {
147
+ try {
148
+ // Check exclude patterns first
149
+ if (this.exclude.some((p) => matchesGlobPattern(relPath, p))) {
150
+ return;
151
+ }
152
+ // Check include patterns
153
+ if (this.include.length > 0 && !this.include.some((p) => matchesGlobPattern(relPath, p))) {
154
+ return;
155
+ }
156
+ const evType = await this.determineEventType(relPath);
157
+ if (!evType) {
158
+ return;
159
+ }
160
+ const event = {
161
+ type: evType,
162
+ path: relPath,
163
+ timestamp: Date.now(),
164
+ };
165
+ this.emit('change', event);
166
+ }
167
+ catch (err) {
168
+ this.emit('error', err);
169
+ }
170
+ }
171
+ async determineEventType(relPath) {
172
+ const fullPath = [this.rootDir, relPath].join(sep).replace(/\//g, sep);
173
+ try {
174
+ await stat(fullPath);
175
+ // File exists
176
+ if (this.knownFiles.has(relPath)) {
177
+ return 'modify';
178
+ }
179
+ this.knownFiles.add(relPath);
180
+ return 'create';
181
+ }
182
+ catch {
183
+ // File doesn't exist — it was deleted
184
+ if (this.knownFiles.has(relPath)) {
185
+ this.knownFiles.delete(relPath);
186
+ return 'delete';
187
+ }
188
+ // Unknown file deleted — still report
189
+ return 'delete';
190
+ }
191
+ }
192
+ }
193
+ //# sourceMappingURL=file-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../../src/engine/hooks/file-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { OnCommitHookResult, OnCommitContext } from '../../../types/file-hooks.js';
2
+ /**
3
+ * Install a Planu post-commit git hook.
4
+ * If a hook already exists, appends the Planu section.
5
+ */
6
+ export declare function installGitHook(projectPath: string): Promise<{
7
+ installed: boolean;
8
+ path: string;
9
+ }>;
10
+ /**
11
+ * Uninstall the Planu post-commit hook section.
12
+ * Removes only the Planu-marked section, preserving other hooks.
13
+ */
14
+ export declare function uninstallGitHook(projectPath: string): Promise<{
15
+ uninstalled: boolean;
16
+ path: string;
17
+ }>;
18
+ /**
19
+ * Handle on-commit event.
20
+ * - Gets committed files
21
+ * - Runs spec integrity check
22
+ * - Identifies specs that may need reconciliation
23
+ * - Non-blocking, async
24
+ */
25
+ export declare function handleOnCommit(ctx: OnCommitContext): Promise<OnCommitHookResult>;
26
+ //# sourceMappingURL=on-commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-commit.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-commit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAgBxF;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCjD;AAuGD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCtF"}
@@ -0,0 +1,198 @@
1
+ // engine/hooks/handlers/on-commit.ts — on-commit hook handler (SPEC-130)
2
+ // Git post-commit integration: integrity check + auto-reconcile.
3
+ import { execFile } from 'node:child_process';
4
+ import { readFile, writeFile, chmod, unlink } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ import { promisify } from 'node:util';
7
+ import { extractSpecAnnotations } from './on-save.js';
8
+ const execFileAsync = promisify(execFile);
9
+ // ---------------------------------------------------------------------------
10
+ // Constants
11
+ // ---------------------------------------------------------------------------
12
+ const POST_COMMIT_HOOK_PATH = '.git/hooks/post-commit';
13
+ const PLANU_HOOK_MARKER = '# PLANU-HOOK-MARKER';
14
+ // ---------------------------------------------------------------------------
15
+ // Git hook install/uninstall
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Install a Planu post-commit git hook.
19
+ * If a hook already exists, appends the Planu section.
20
+ */
21
+ export async function installGitHook(projectPath) {
22
+ const hookPath = join(projectPath, POST_COMMIT_HOOK_PATH);
23
+ const hookScript = buildPostCommitScript();
24
+ let existingContent = '';
25
+ try {
26
+ existingContent = await readFile(hookPath, 'utf-8');
27
+ }
28
+ catch {
29
+ // No existing hook
30
+ }
31
+ // Check if already installed
32
+ if (existingContent.includes(PLANU_HOOK_MARKER)) {
33
+ return { installed: false, path: hookPath };
34
+ }
35
+ const newContent = existingContent
36
+ ? `${existingContent}\n${hookScript}`
37
+ : `#!/usr/bin/env sh\n${hookScript}`;
38
+ await writeFile(hookPath, newContent, 'utf-8');
39
+ await chmod(hookPath, 0o755);
40
+ return { installed: true, path: hookPath };
41
+ }
42
+ /**
43
+ * Uninstall the Planu post-commit hook section.
44
+ * Removes only the Planu-marked section, preserving other hooks.
45
+ */
46
+ export async function uninstallGitHook(projectPath) {
47
+ const hookPath = join(projectPath, POST_COMMIT_HOOK_PATH);
48
+ let content;
49
+ try {
50
+ content = await readFile(hookPath, 'utf-8');
51
+ }
52
+ catch {
53
+ return { uninstalled: false, path: hookPath };
54
+ }
55
+ if (!content.includes(PLANU_HOOK_MARKER)) {
56
+ return { uninstalled: false, path: hookPath };
57
+ }
58
+ // Remove the Planu section
59
+ const startMarker = `${PLANU_HOOK_MARKER}-START`;
60
+ const endMarker = `${PLANU_HOOK_MARKER}-END`;
61
+ const startIdx = content.indexOf(startMarker);
62
+ const endIdx = content.indexOf(endMarker);
63
+ /* v8 ignore next 3 -- defensive: markers present but START/END corrupted */
64
+ if (startIdx === -1 || endIdx === -1) {
65
+ return { uninstalled: false, path: hookPath };
66
+ }
67
+ const cleaned = content.slice(0, startIdx) + content.slice(endIdx + endMarker.length + 1);
68
+ const trimmed = cleaned.trim();
69
+ if (trimmed === '' || trimmed === '#!/usr/bin/env sh') {
70
+ // Remove the hook file entirely if nothing remains
71
+ await unlink(hookPath);
72
+ }
73
+ else {
74
+ await writeFile(hookPath, trimmed + '\n', 'utf-8');
75
+ }
76
+ return { uninstalled: true, path: hookPath };
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Build hook script
80
+ // ---------------------------------------------------------------------------
81
+ function buildPostCommitScript() {
82
+ return `
83
+ ${PLANU_HOOK_MARKER}-START
84
+ # Planu on-commit hook — auto-generated by SPEC-130
85
+ if command -v node >/dev/null 2>&1; then
86
+ COMMIT_HASH="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
87
+ BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
88
+ echo "[Planu] Post-commit: $COMMIT_HASH on $BRANCH"
89
+ fi
90
+ ${PLANU_HOOK_MARKER}-END
91
+ `;
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Git helpers
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Get the latest commit hash.
98
+ */
99
+ async function getLatestCommitHash(projectRoot) {
100
+ try {
101
+ const { stdout } = await execFileAsync('git', ['rev-parse', '--short', 'HEAD'], {
102
+ cwd: projectRoot,
103
+ });
104
+ return stdout.trim();
105
+ }
106
+ catch {
107
+ return 'unknown';
108
+ }
109
+ }
110
+ /**
111
+ * Get list of files changed in the latest commit.
112
+ */
113
+ async function getCommittedFiles(projectRoot) {
114
+ try {
115
+ const { stdout } = await execFileAsync('git', ['diff-tree', '--no-commit-id', '--name-only', '-r', 'HEAD'], { cwd: projectRoot });
116
+ return stdout
117
+ .trim()
118
+ .split('\n')
119
+ .filter((f) => f.length > 0);
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // Integrity check
127
+ // ---------------------------------------------------------------------------
128
+ /**
129
+ * Run a basic spec integrity check on committed files.
130
+ * Validates that @spec annotations reference known specs.
131
+ */
132
+ async function checkIntegrity(files, projectRoot, knownSpecs) {
133
+ const errors = [];
134
+ for (const file of files) {
135
+ // Only check source files
136
+ if (!file.endsWith('.ts') &&
137
+ !file.endsWith('.js') &&
138
+ !file.endsWith('.tsx') &&
139
+ !file.endsWith('.jsx')) {
140
+ continue;
141
+ }
142
+ try {
143
+ const content = await readFile(join(projectRoot, file), 'utf-8');
144
+ const annotations = extractSpecAnnotations(content);
145
+ for (const specId of annotations) {
146
+ if (!knownSpecs.has(specId)) {
147
+ errors.push(`${file}: @spec ${specId} references unknown spec`);
148
+ }
149
+ }
150
+ }
151
+ catch {
152
+ // File might have been deleted in this commit — skip
153
+ }
154
+ }
155
+ return { valid: errors.length === 0, errors };
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Handler
159
+ // ---------------------------------------------------------------------------
160
+ /**
161
+ * Handle on-commit event.
162
+ * - Gets committed files
163
+ * - Runs spec integrity check
164
+ * - Identifies specs that may need reconciliation
165
+ * - Non-blocking, async
166
+ */
167
+ export async function handleOnCommit(ctx) {
168
+ const commitHash = await getLatestCommitHash(ctx.projectRoot);
169
+ const committedFiles = await getCommittedFiles(ctx.projectRoot);
170
+ // Run integrity check
171
+ const integrityResult = await checkIntegrity(committedFiles, ctx.projectRoot, ctx.knownSpecs);
172
+ // Collect specs referenced in committed files for auto-reconcile
173
+ const reconciledSpecs = new Set();
174
+ for (const file of committedFiles) {
175
+ if (!file.endsWith('.ts') && !file.endsWith('.js')) {
176
+ continue;
177
+ }
178
+ try {
179
+ const content = await readFile(join(ctx.projectRoot, file), 'utf-8');
180
+ const annotations = extractSpecAnnotations(content);
181
+ for (const specId of annotations) {
182
+ if (ctx.knownSpecs.has(specId)) {
183
+ reconciledSpecs.add(specId);
184
+ }
185
+ }
186
+ }
187
+ catch {
188
+ // Skip unreadable files
189
+ }
190
+ }
191
+ return {
192
+ hook: 'on-commit',
193
+ commitHash,
194
+ reconciledSpecs: [...reconciledSpecs],
195
+ integrityResult,
196
+ };
197
+ }
198
+ //# sourceMappingURL=on-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-commit.js","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-commit.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iEAAiE;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AACvD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAEhD,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAE3C,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IAED,6BAA6B;IAC7B,IAAI,eAAe,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,UAAU,GAAG,eAAe;QAChC,CAAC,CAAC,GAAG,eAAe,KAAK,UAAU,EAAE;QACrC,CAAC,CAAC,sBAAsB,UAAU,EAAE,CAAC;IAEvC,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAE1D,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,2BAA2B;IAC3B,MAAM,WAAW,GAAG,GAAG,iBAAiB,QAAQ,CAAC;IACjD,MAAM,SAAS,GAAG,GAAG,iBAAiB,MAAM,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1C,4EAA4E;IAC5E,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QACtD,mDAAmD;QACnD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,qBAAqB;IAC5B,OAAO;EACP,iBAAiB;;;;;;;EAOjB,iBAAiB;CAClB,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;YAC9E,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,EAC5D,EAAE,GAAG,EAAE,WAAW,EAAE,CACrB,CAAC;QACF,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,KAAe,EACf,WAAmB,EACnB,UAAuB;IAEvB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,0BAA0B;QAC1B,IACE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EACtB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAEpD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,MAAM,0BAA0B,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAoB;IACvD,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEhE,sBAAsB;IACtB,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAE9F,iEAAiE;IACjE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACpD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,UAAU;QACV,eAAe,EAAE,CAAC,GAAG,eAAe,CAAC;QACrC,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { OnCreateHookResult, OnCreateContext } from '../../../types/file-hooks.js';
2
+ /**
3
+ * Handle on-create event for a new file.
4
+ * - Checks if file falls in any active spec's file plan
5
+ * - Suggests @spec annotations if the file matches a spec but has no annotation
6
+ */
7
+ export declare function handleOnCreate(relPath: string, ctx: OnCreateContext): OnCreateHookResult;
8
+ //# sourceMappingURL=on-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-create.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-create.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOxF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,kBAAkB,CAqBxF"}
@@ -0,0 +1,30 @@
1
+ // engine/hooks/handlers/on-create.ts — on-create hook handler (SPEC-129)
2
+ // Checks if new file falls in any active spec's file plan, suggests annotations.
3
+ import { matchesGlobPattern } from '../file-watcher.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Handler
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * Handle on-create event for a new file.
9
+ * - Checks if file falls in any active spec's file plan
10
+ * - Suggests @spec annotations if the file matches a spec but has no annotation
11
+ */
12
+ export function handleOnCreate(relPath, ctx) {
13
+ const normalizedPath = relPath.replace(/\\/g, '/');
14
+ const matchedSpecs = [];
15
+ const suggestedAnnotations = [];
16
+ for (const plan of ctx.specFilePlans) {
17
+ const matches = plan.plannedFiles.some((pattern) => matchesGlobPattern(normalizedPath, pattern));
18
+ if (matches) {
19
+ matchedSpecs.push(plan.specId);
20
+ suggestedAnnotations.push(`// @spec ${plan.specId}`);
21
+ }
22
+ }
23
+ return {
24
+ hook: 'on-create',
25
+ path: normalizedPath,
26
+ matchedSpecs,
27
+ suggestedAnnotations,
28
+ };
29
+ }
30
+ //# sourceMappingURL=on-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-create.js","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-create.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iFAAiF;AAGjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAoB;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACjD,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAC5C,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,oBAAoB,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,YAAY;QACZ,oBAAoB;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { OnDeleteHookResult, OnDeleteContext } from '../../../types/file-hooks.js';
2
+ /**
3
+ * Handle on-delete event for a removed file.
4
+ * - Flags broken @spec annotations in other files referencing this file
5
+ * - Warns about affected spec scope
6
+ * - Removes file from hash snapshots
7
+ */
8
+ export declare function handleOnDelete(relPath: string, ctx: OnDeleteContext): OnDeleteHookResult;
9
+ //# sourceMappingURL=on-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-delete.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-delete.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOxF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,kBAAkB,CAuBxF"}
@@ -0,0 +1,33 @@
1
+ // engine/hooks/handlers/on-delete.ts — on-delete hook handler (SPEC-129)
2
+ // Flags broken annotations, warns about changed spec scope, removes hash snapshots.
3
+ import { removeStoredHash } from './on-save.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Handler
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * Handle on-delete event for a removed file.
9
+ * - Flags broken @spec annotations in other files referencing this file
10
+ * - Warns about affected spec scope
11
+ * - Removes file from hash snapshots
12
+ */
13
+ export function handleOnDelete(relPath, ctx) {
14
+ const normalizedPath = relPath.replace(/\\/g, '/');
15
+ const affectedSpecs = [];
16
+ const brokenAnnotations = [];
17
+ // Check which specs reference this file
18
+ for (const entry of ctx.specAnnotations) {
19
+ if (entry.annotatedFiles.includes(normalizedPath)) {
20
+ affectedSpecs.push(entry.specId);
21
+ brokenAnnotations.push(`${entry.specId}: ${normalizedPath}`);
22
+ }
23
+ }
24
+ // Remove from hash snapshots
25
+ removeStoredHash(normalizedPath);
26
+ return {
27
+ hook: 'on-delete',
28
+ path: normalizedPath,
29
+ affectedSpecs,
30
+ brokenAnnotations,
31
+ };
32
+ }
33
+ //# sourceMappingURL=on-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-delete.js","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-delete.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,oFAAoF;AAGpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAoB;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEnD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,wCAAwC;IACxC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,iBAAiB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAEjC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,aAAa;QACb,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { OnSaveHookResult, OnSaveContext } from '../../../types/file-hooks.js';
2
+ /**
3
+ * Extract @spec annotations from file content.
4
+ */
5
+ export declare function extractSpecAnnotations(content: string): string[];
6
+ /**
7
+ * Handle on-save event for a file.
8
+ * - Validates @spec annotations
9
+ * - Computes SHA-256 hash and compares with stored snapshot
10
+ * - Reports drift delta
11
+ */
12
+ export declare function handleOnSave(relPath: string, ctx: OnSaveContext): Promise<OnSaveHookResult>;
13
+ /**
14
+ * Get the stored hash for a file path.
15
+ */
16
+ export declare function getStoredHash(relPath: string): string | undefined;
17
+ /**
18
+ * Set a hash snapshot (useful for initialization / testing).
19
+ */
20
+ export declare function setStoredHash(relPath: string, hash: string): void;
21
+ /**
22
+ * Remove a hash snapshot.
23
+ */
24
+ export declare function removeStoredHash(relPath: string): boolean;
25
+ /**
26
+ * Clear all stored hashes.
27
+ */
28
+ export declare function clearStoredHashes(): void;
29
+ //# sourceMappingURL=on-save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-save.d.ts","sourceRoot":"","sources":["../../../../src/engine/hooks/handlers/on-save.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAsBpF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhE;AAgBD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+CjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}