@planu/cli 0.24.0 → 0.26.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 (374) hide show
  1. package/dist/config/ai-model-pricing.json +81 -0
  2. package/dist/config/framework-registry/csharp-aspnet.json +67 -0
  3. package/dist/config/framework-registry/dart-flutter.json +61 -0
  4. package/dist/config/framework-registry/go-gin.json +62 -0
  5. package/dist/config/framework-registry/index.json +164 -0
  6. package/dist/config/framework-registry/java-springboot.json +67 -0
  7. package/dist/config/framework-registry/php-laravel.json +67 -0
  8. package/dist/config/framework-registry/python-django.json +72 -0
  9. package/dist/config/framework-registry/python-fastapi.json +72 -0
  10. package/dist/config/framework-registry/ruby-rails.json +67 -0
  11. package/dist/config/framework-registry/rust-actix.json +61 -0
  12. package/dist/config/framework-registry/swift-swiftui.json +67 -0
  13. package/dist/config/framework-registry/typescript-angular.json +67 -0
  14. package/dist/config/framework-registry/typescript-astro.json +61 -0
  15. package/dist/config/framework-registry/typescript-express.json +67 -0
  16. package/dist/config/framework-registry/typescript-nestjs.json +62 -0
  17. package/dist/config/framework-registry/typescript-nextjs.json +82 -0
  18. package/dist/config/framework-registry/typescript-nuxt.json +67 -0
  19. package/dist/config/framework-registry/typescript-react.json +77 -0
  20. package/dist/config/framework-registry/typescript-remix.json +61 -0
  21. package/dist/config/framework-registry/typescript-sveltekit.json +67 -0
  22. package/dist/config/framework-registry/typescript-vue.json +72 -0
  23. package/dist/config/license-plans.json +23 -3
  24. package/dist/engine/agile-config-builder.d.ts.map +1 -1
  25. package/dist/engine/agile-config-builder.js +3 -0
  26. package/dist/engine/agile-config-builder.js.map +1 -1
  27. package/dist/engine/ai-cost-estimator/core.d.ts +8 -0
  28. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -0
  29. package/dist/engine/ai-cost-estimator/core.js +257 -0
  30. package/dist/engine/ai-cost-estimator/core.js.map +1 -0
  31. package/dist/engine/ai-cost-estimator/index.d.ts +4 -0
  32. package/dist/engine/ai-cost-estimator/index.d.ts.map +1 -0
  33. package/dist/engine/ai-cost-estimator/index.js +5 -0
  34. package/dist/engine/ai-cost-estimator/index.js.map +1 -0
  35. package/dist/engine/ai-cost-estimator/model-pricing.d.ts +31 -0
  36. package/dist/engine/ai-cost-estimator/model-pricing.d.ts.map +1 -0
  37. package/dist/engine/ai-cost-estimator/model-pricing.js +96 -0
  38. package/dist/engine/ai-cost-estimator/model-pricing.js.map +1 -0
  39. package/dist/engine/ai-cost-estimator/token-estimator.d.ts +37 -0
  40. package/dist/engine/ai-cost-estimator/token-estimator.d.ts.map +1 -0
  41. package/dist/engine/ai-cost-estimator/token-estimator.js +194 -0
  42. package/dist/engine/ai-cost-estimator/token-estimator.js.map +1 -0
  43. package/dist/engine/ci-generator/context-builders.d.ts +4 -0
  44. package/dist/engine/ci-generator/context-builders.d.ts.map +1 -0
  45. package/dist/engine/ci-generator/context-builders.js +129 -0
  46. package/dist/engine/ci-generator/context-builders.js.map +1 -0
  47. package/dist/engine/ci-generator/index.d.ts +7 -0
  48. package/dist/engine/ci-generator/index.d.ts.map +1 -0
  49. package/dist/engine/ci-generator/index.js +44 -0
  50. package/dist/engine/ci-generator/index.js.map +1 -0
  51. package/dist/engine/ci-generator/stack-detector.d.ts +21 -0
  52. package/dist/engine/ci-generator/stack-detector.d.ts.map +1 -0
  53. package/dist/engine/ci-generator/stack-detector.js +203 -0
  54. package/dist/engine/ci-generator/stack-detector.js.map +1 -0
  55. package/dist/engine/ci-generator/yaml-builder.d.ts +8 -0
  56. package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -0
  57. package/dist/engine/ci-generator/yaml-builder.js +285 -0
  58. package/dist/engine/ci-generator/yaml-builder.js.map +1 -0
  59. package/dist/engine/dashboard/data-loader.d.ts +21 -0
  60. package/dist/engine/dashboard/data-loader.d.ts.map +1 -0
  61. package/dist/engine/dashboard/data-loader.js +196 -0
  62. package/dist/engine/dashboard/data-loader.js.map +1 -0
  63. package/dist/engine/dashboard/index.d.ts +5 -0
  64. package/dist/engine/dashboard/index.d.ts.map +1 -0
  65. package/dist/engine/dashboard/index.js +6 -0
  66. package/dist/engine/dashboard/index.js.map +1 -0
  67. package/dist/engine/dashboard/routes.d.ts +4 -0
  68. package/dist/engine/dashboard/routes.d.ts.map +1 -0
  69. package/dist/engine/dashboard/routes.js +120 -0
  70. package/dist/engine/dashboard/routes.js.map +1 -0
  71. package/dist/engine/dashboard/server.d.ts +14 -0
  72. package/dist/engine/dashboard/server.d.ts.map +1 -0
  73. package/dist/engine/dashboard/server.js +88 -0
  74. package/dist/engine/dashboard/server.js.map +1 -0
  75. package/dist/engine/dashboard/templates-layout.d.ts +11 -0
  76. package/dist/engine/dashboard/templates-layout.d.ts.map +1 -0
  77. package/dist/engine/dashboard/templates-layout.js +305 -0
  78. package/dist/engine/dashboard/templates-layout.js.map +1 -0
  79. package/dist/engine/dashboard/templates-project.d.ts +10 -0
  80. package/dist/engine/dashboard/templates-project.d.ts.map +1 -0
  81. package/dist/engine/dashboard/templates-project.js +163 -0
  82. package/dist/engine/dashboard/templates-project.js.map +1 -0
  83. package/dist/engine/dashboard/templates.d.ts +3 -0
  84. package/dist/engine/dashboard/templates.d.ts.map +1 -0
  85. package/dist/engine/dashboard/templates.js +4 -0
  86. package/dist/engine/dashboard/templates.js.map +1 -0
  87. package/dist/engine/focus-tracker.d.ts.map +1 -1
  88. package/dist/engine/focus-tracker.js +1 -0
  89. package/dist/engine/focus-tracker.js.map +1 -1
  90. package/dist/engine/hooks/core.d.ts +26 -0
  91. package/dist/engine/hooks/core.d.ts.map +1 -0
  92. package/dist/engine/hooks/core.js +164 -0
  93. package/dist/engine/hooks/core.js.map +1 -0
  94. package/dist/engine/hooks/git-hook-generator.d.ts +14 -0
  95. package/dist/engine/hooks/git-hook-generator.d.ts.map +1 -0
  96. package/dist/engine/hooks/git-hook-generator.js +119 -0
  97. package/dist/engine/hooks/git-hook-generator.js.map +1 -0
  98. package/dist/engine/hooks/index.d.ts +5 -0
  99. package/dist/engine/hooks/index.d.ts.map +1 -0
  100. package/dist/engine/hooks/index.js +6 -0
  101. package/dist/engine/hooks/index.js.map +1 -0
  102. package/dist/engine/hooks/templates.d.ts +14 -0
  103. package/dist/engine/hooks/templates.d.ts.map +1 -0
  104. package/dist/engine/hooks/templates.js +138 -0
  105. package/dist/engine/hooks/templates.js.map +1 -0
  106. package/dist/engine/hooks/triggers.d.ts +27 -0
  107. package/dist/engine/hooks/triggers.d.ts.map +1 -0
  108. package/dist/engine/hooks/triggers.js +104 -0
  109. package/dist/engine/hooks/triggers.js.map +1 -0
  110. package/dist/engine/registry/core.d.ts +32 -0
  111. package/dist/engine/registry/core.d.ts.map +1 -0
  112. package/dist/engine/registry/core.js +85 -0
  113. package/dist/engine/registry/core.js.map +1 -0
  114. package/dist/engine/registry/index.d.ts +6 -0
  115. package/dist/engine/registry/index.d.ts.map +1 -0
  116. package/dist/engine/registry/index.js +8 -0
  117. package/dist/engine/registry/index.js.map +1 -0
  118. package/dist/engine/registry/loader.d.ts +18 -0
  119. package/dist/engine/registry/loader.d.ts.map +1 -0
  120. package/dist/engine/registry/loader.js +81 -0
  121. package/dist/engine/registry/loader.js.map +1 -0
  122. package/dist/engine/registry/matcher.d.ts +19 -0
  123. package/dist/engine/registry/matcher.d.ts.map +1 -0
  124. package/dist/engine/registry/matcher.js +150 -0
  125. package/dist/engine/registry/matcher.js.map +1 -0
  126. package/dist/engine/registry/reporter.d.ts +10 -0
  127. package/dist/engine/registry/reporter.d.ts.map +1 -0
  128. package/dist/engine/registry/reporter.js +132 -0
  129. package/dist/engine/registry/reporter.js.map +1 -0
  130. package/dist/engine/registry/validator.d.ts +17 -0
  131. package/dist/engine/registry/validator.d.ts.map +1 -0
  132. package/dist/engine/registry/validator.js +103 -0
  133. package/dist/engine/registry/validator.js.map +1 -0
  134. package/dist/engine/spec-changelog/core.d.ts +16 -0
  135. package/dist/engine/spec-changelog/core.d.ts.map +1 -0
  136. package/dist/engine/spec-changelog/core.js +175 -0
  137. package/dist/engine/spec-changelog/core.js.map +1 -0
  138. package/dist/engine/spec-changelog/diff.d.ts +18 -0
  139. package/dist/engine/spec-changelog/diff.d.ts.map +1 -0
  140. package/dist/engine/spec-changelog/diff.js +116 -0
  141. package/dist/engine/spec-changelog/diff.js.map +1 -0
  142. package/dist/engine/spec-changelog/index.d.ts +3 -0
  143. package/dist/engine/spec-changelog/index.d.ts.map +1 -0
  144. package/dist/engine/spec-changelog/index.js +4 -0
  145. package/dist/engine/spec-changelog/index.js.map +1 -0
  146. package/dist/engine/spec-coverage/core.d.ts +14 -0
  147. package/dist/engine/spec-coverage/core.d.ts.map +1 -0
  148. package/dist/engine/spec-coverage/core.js +132 -0
  149. package/dist/engine/spec-coverage/core.js.map +1 -0
  150. package/dist/engine/spec-coverage/criteria-mapper.d.ts +18 -0
  151. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -0
  152. package/dist/engine/spec-coverage/criteria-mapper.js +306 -0
  153. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -0
  154. package/dist/engine/spec-coverage/index.d.ts +4 -0
  155. package/dist/engine/spec-coverage/index.d.ts.map +1 -0
  156. package/dist/engine/spec-coverage/index.js +5 -0
  157. package/dist/engine/spec-coverage/index.js.map +1 -0
  158. package/dist/engine/spec-coverage/test-finder.d.ts +17 -0
  159. package/dist/engine/spec-coverage/test-finder.d.ts.map +1 -0
  160. package/dist/engine/spec-coverage/test-finder.js +250 -0
  161. package/dist/engine/spec-coverage/test-finder.js.map +1 -0
  162. package/dist/engine/spec-templates/catalog-extra.d.ts +4 -0
  163. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -0
  164. package/dist/engine/spec-templates/catalog-extra.js +367 -0
  165. package/dist/engine/spec-templates/catalog-extra.js.map +1 -0
  166. package/dist/engine/spec-templates/catalog.d.ts +4 -0
  167. package/dist/engine/spec-templates/catalog.d.ts.map +1 -0
  168. package/dist/engine/spec-templates/catalog.js +386 -0
  169. package/dist/engine/spec-templates/catalog.js.map +1 -0
  170. package/dist/engine/spec-templates/index.d.ts +4 -0
  171. package/dist/engine/spec-templates/index.d.ts.map +1 -0
  172. package/dist/engine/spec-templates/index.js +5 -0
  173. package/dist/engine/spec-templates/index.js.map +1 -0
  174. package/dist/engine/spec-templates/query.d.ts +14 -0
  175. package/dist/engine/spec-templates/query.d.ts.map +1 -0
  176. package/dist/engine/spec-templates/query.js +56 -0
  177. package/dist/engine/spec-templates/query.js.map +1 -0
  178. package/dist/engine/spec-templates/renderer.d.ts +19 -0
  179. package/dist/engine/spec-templates/renderer.d.ts.map +1 -0
  180. package/dist/engine/spec-templates/renderer.js +45 -0
  181. package/dist/engine/spec-templates/renderer.js.map +1 -0
  182. package/dist/engine/usage-tracker/trial.d.ts +4 -4
  183. package/dist/engine/usage-tracker/trial.d.ts.map +1 -1
  184. package/dist/engine/usage-tracker/trial.js +4 -4
  185. package/dist/engine/usage-tracker/trial.js.map +1 -1
  186. package/dist/engine/webhook/event-handlers.d.ts +25 -0
  187. package/dist/engine/webhook/event-handlers.d.ts.map +1 -0
  188. package/dist/engine/webhook/event-handlers.js +89 -0
  189. package/dist/engine/webhook/event-handlers.js.map +1 -0
  190. package/dist/engine/webhook/index.d.ts +4 -0
  191. package/dist/engine/webhook/index.d.ts.map +1 -0
  192. package/dist/engine/webhook/index.js +5 -0
  193. package/dist/engine/webhook/index.js.map +1 -0
  194. package/dist/engine/webhook/server.d.ts +18 -0
  195. package/dist/engine/webhook/server.d.ts.map +1 -0
  196. package/dist/engine/webhook/server.js +187 -0
  197. package/dist/engine/webhook/server.js.map +1 -0
  198. package/dist/engine/webhook/signature.d.ts +16 -0
  199. package/dist/engine/webhook/signature.d.ts.map +1 -0
  200. package/dist/engine/webhook/signature.js +49 -0
  201. package/dist/engine/webhook/signature.js.map +1 -0
  202. package/dist/index.js +18 -0
  203. package/dist/index.js.map +1 -1
  204. package/dist/storage/hooks-store.d.ts +34 -0
  205. package/dist/storage/hooks-store.d.ts.map +1 -0
  206. package/dist/storage/hooks-store.js +128 -0
  207. package/dist/storage/hooks-store.js.map +1 -0
  208. package/dist/storage/index.d.ts +1 -0
  209. package/dist/storage/index.d.ts.map +1 -1
  210. package/dist/storage/index.js +1 -0
  211. package/dist/storage/index.js.map +1 -1
  212. package/dist/tools/check-spec-accuracy.d.ts +7 -0
  213. package/dist/tools/check-spec-accuracy.d.ts.map +1 -0
  214. package/dist/tools/check-spec-accuracy.js +28 -0
  215. package/dist/tools/check-spec-accuracy.js.map +1 -0
  216. package/dist/tools/ci-generator.d.ts +7 -0
  217. package/dist/tools/ci-generator.d.ts.map +1 -0
  218. package/dist/tools/ci-generator.js +49 -0
  219. package/dist/tools/ci-generator.js.map +1 -0
  220. package/dist/tools/create-spec.d.ts.map +1 -1
  221. package/dist/tools/create-spec.js +4 -0
  222. package/dist/tools/create-spec.js.map +1 -1
  223. package/dist/tools/dashboard.d.ts +6 -0
  224. package/dist/tools/dashboard.d.ts.map +1 -0
  225. package/dist/tools/dashboard.js +48 -0
  226. package/dist/tools/dashboard.js.map +1 -0
  227. package/dist/tools/detect-drift.d.ts.map +1 -1
  228. package/dist/tools/detect-drift.js +6 -0
  229. package/dist/tools/detect-drift.js.map +1 -1
  230. package/dist/tools/estimate-ai-cost.d.ts +8 -0
  231. package/dist/tools/estimate-ai-cost.d.ts.map +1 -0
  232. package/dist/tools/estimate-ai-cost.js +29 -0
  233. package/dist/tools/estimate-ai-cost.js.map +1 -0
  234. package/dist/tools/list-specs.d.ts.map +1 -1
  235. package/dist/tools/list-specs.js +15 -0
  236. package/dist/tools/list-specs.js.map +1 -1
  237. package/dist/tools/manage-hooks.d.ts +5 -0
  238. package/dist/tools/manage-hooks.d.ts.map +1 -0
  239. package/dist/tools/manage-hooks.js +247 -0
  240. package/dist/tools/manage-hooks.js.map +1 -0
  241. package/dist/tools/reconcile-spec.d.ts.map +1 -1
  242. package/dist/tools/reconcile-spec.js +24 -0
  243. package/dist/tools/reconcile-spec.js.map +1 -1
  244. package/dist/tools/register-ai-cost-tools.d.ts +3 -0
  245. package/dist/tools/register-ai-cost-tools.d.ts.map +1 -0
  246. package/dist/tools/register-ai-cost-tools.js +25 -0
  247. package/dist/tools/register-ai-cost-tools.js.map +1 -0
  248. package/dist/tools/register-changelog-tools.d.ts +3 -0
  249. package/dist/tools/register-changelog-tools.d.ts.map +1 -0
  250. package/dist/tools/register-changelog-tools.js +23 -0
  251. package/dist/tools/register-changelog-tools.js.map +1 -0
  252. package/dist/tools/register-ci-tools.d.ts +3 -0
  253. package/dist/tools/register-ci-tools.d.ts.map +1 -0
  254. package/dist/tools/register-ci-tools.js +50 -0
  255. package/dist/tools/register-ci-tools.js.map +1 -0
  256. package/dist/tools/register-coverage-tools.d.ts +7 -0
  257. package/dist/tools/register-coverage-tools.d.ts.map +1 -0
  258. package/dist/tools/register-coverage-tools.js +27 -0
  259. package/dist/tools/register-coverage-tools.js.map +1 -0
  260. package/dist/tools/register-dashboard-tools.d.ts +3 -0
  261. package/dist/tools/register-dashboard-tools.d.ts.map +1 -0
  262. package/dist/tools/register-dashboard-tools.js +29 -0
  263. package/dist/tools/register-dashboard-tools.js.map +1 -0
  264. package/dist/tools/register-hooks-tools.d.ts +3 -0
  265. package/dist/tools/register-hooks-tools.d.ts.map +1 -0
  266. package/dist/tools/register-hooks-tools.js +107 -0
  267. package/dist/tools/register-hooks-tools.js.map +1 -0
  268. package/dist/tools/register-registry-tools.d.ts +3 -0
  269. package/dist/tools/register-registry-tools.d.ts.map +1 -0
  270. package/dist/tools/register-registry-tools.js +43 -0
  271. package/dist/tools/register-registry-tools.js.map +1 -0
  272. package/dist/tools/register-template-tools.d.ts +8 -0
  273. package/dist/tools/register-template-tools.d.ts.map +1 -0
  274. package/dist/tools/register-template-tools.js +71 -0
  275. package/dist/tools/register-template-tools.js.map +1 -0
  276. package/dist/tools/register-webhook-tools.d.ts +3 -0
  277. package/dist/tools/register-webhook-tools.d.ts.map +1 -0
  278. package/dist/tools/register-webhook-tools.js +49 -0
  279. package/dist/tools/register-webhook-tools.js.map +1 -0
  280. package/dist/tools/schemas/index.d.ts +1 -0
  281. package/dist/tools/schemas/index.d.ts.map +1 -1
  282. package/dist/tools/schemas/index.js +1 -0
  283. package/dist/tools/schemas/index.js.map +1 -1
  284. package/dist/tools/schemas/registry.d.ts +41 -0
  285. package/dist/tools/schemas/registry.d.ts.map +1 -0
  286. package/dist/tools/schemas/registry.js +62 -0
  287. package/dist/tools/schemas/registry.js.map +1 -0
  288. package/dist/tools/spec-coverage.d.ts +3 -0
  289. package/dist/tools/spec-coverage.d.ts.map +1 -0
  290. package/dist/tools/spec-coverage.js +176 -0
  291. package/dist/tools/spec-coverage.js.map +1 -0
  292. package/dist/tools/spec-history.d.ts +3 -0
  293. package/dist/tools/spec-history.d.ts.map +1 -0
  294. package/dist/tools/spec-history.js +67 -0
  295. package/dist/tools/spec-history.js.map +1 -0
  296. package/dist/tools/spec-templates.d.ts +10 -0
  297. package/dist/tools/spec-templates.d.ts.map +1 -0
  298. package/dist/tools/spec-templates.js +155 -0
  299. package/dist/tools/spec-templates.js.map +1 -0
  300. package/dist/tools/update-registry.d.ts +8 -0
  301. package/dist/tools/update-registry.d.ts.map +1 -0
  302. package/dist/tools/update-registry.js +53 -0
  303. package/dist/tools/update-registry.js.map +1 -0
  304. package/dist/tools/update-status.d.ts.map +1 -1
  305. package/dist/tools/update-status.js +24 -0
  306. package/dist/tools/update-status.js.map +1 -1
  307. package/dist/tools/webhook.d.ts +6 -0
  308. package/dist/tools/webhook.d.ts.map +1 -0
  309. package/dist/tools/webhook.js +150 -0
  310. package/dist/tools/webhook.js.map +1 -0
  311. package/dist/types/ai-cost.d.ts +98 -0
  312. package/dist/types/ai-cost.d.ts.map +1 -0
  313. package/dist/types/ai-cost.js +4 -0
  314. package/dist/types/ai-cost.js.map +1 -0
  315. package/dist/types/analysis.d.ts +64 -0
  316. package/dist/types/analysis.d.ts.map +1 -1
  317. package/dist/types/changelog.d.ts +49 -0
  318. package/dist/types/changelog.d.ts.map +1 -0
  319. package/dist/types/changelog.js +3 -0
  320. package/dist/types/changelog.js.map +1 -0
  321. package/dist/types/ci.d.ts +105 -0
  322. package/dist/types/ci.d.ts.map +1 -0
  323. package/dist/types/ci.js +3 -0
  324. package/dist/types/ci.js.map +1 -0
  325. package/dist/types/coverage.d.ts +95 -0
  326. package/dist/types/coverage.d.ts.map +1 -0
  327. package/dist/types/coverage.js +4 -0
  328. package/dist/types/coverage.js.map +1 -0
  329. package/dist/types/hooks.d.ts +139 -0
  330. package/dist/types/hooks.d.ts.map +1 -0
  331. package/dist/types/hooks.js +3 -0
  332. package/dist/types/hooks.js.map +1 -0
  333. package/dist/types/index.d.ts +8 -0
  334. package/dist/types/index.d.ts.map +1 -1
  335. package/dist/types/index.js +8 -0
  336. package/dist/types/index.js.map +1 -1
  337. package/dist/types/registry.d.ts +90 -0
  338. package/dist/types/registry.d.ts.map +1 -0
  339. package/dist/types/registry.js +5 -0
  340. package/dist/types/registry.js.map +1 -0
  341. package/dist/types/spec-templates.d.ts +87 -0
  342. package/dist/types/spec-templates.d.ts.map +1 -0
  343. package/dist/types/spec-templates.js +3 -0
  344. package/dist/types/spec-templates.js.map +1 -0
  345. package/dist/types/ui.d.ts +76 -0
  346. package/dist/types/ui.d.ts.map +1 -1
  347. package/dist/types/webhook.d.ts +62 -0
  348. package/dist/types/webhook.d.ts.map +1 -0
  349. package/dist/types/webhook.js +4 -0
  350. package/dist/types/webhook.js.map +1 -0
  351. package/package.json +1 -1
  352. package/src/config/ai-model-pricing.json +81 -0
  353. package/src/config/framework-registry/csharp-aspnet.json +67 -0
  354. package/src/config/framework-registry/dart-flutter.json +61 -0
  355. package/src/config/framework-registry/go-gin.json +62 -0
  356. package/src/config/framework-registry/index.json +164 -0
  357. package/src/config/framework-registry/java-springboot.json +67 -0
  358. package/src/config/framework-registry/php-laravel.json +67 -0
  359. package/src/config/framework-registry/python-django.json +72 -0
  360. package/src/config/framework-registry/python-fastapi.json +72 -0
  361. package/src/config/framework-registry/ruby-rails.json +67 -0
  362. package/src/config/framework-registry/rust-actix.json +61 -0
  363. package/src/config/framework-registry/swift-swiftui.json +67 -0
  364. package/src/config/framework-registry/typescript-angular.json +67 -0
  365. package/src/config/framework-registry/typescript-astro.json +61 -0
  366. package/src/config/framework-registry/typescript-express.json +67 -0
  367. package/src/config/framework-registry/typescript-nestjs.json +62 -0
  368. package/src/config/framework-registry/typescript-nextjs.json +82 -0
  369. package/src/config/framework-registry/typescript-nuxt.json +67 -0
  370. package/src/config/framework-registry/typescript-react.json +77 -0
  371. package/src/config/framework-registry/typescript-remix.json +61 -0
  372. package/src/config/framework-registry/typescript-sveltekit.json +67 -0
  373. package/src/config/framework-registry/typescript-vue.json +72 -0
  374. package/src/config/license-plans.json +23 -3
@@ -0,0 +1,163 @@
1
+ // engine/dashboard/templates-project.ts — Project and spec HTML renderers.
2
+ import { renderLayout, escapeHtml, markdownToHtml } from './templates-layout.js';
3
+ /** Render a single spec card HTML fragment */
4
+ function renderSpecCard(spec) {
5
+ const hasProgress = spec.criteriaTotal > 0;
6
+ const progressBar = hasProgress
7
+ ? `<div class="progress-bar-wrap">
8
+ <div class="progress-bar-fill" style="width:${spec.progressPercent}%"></div>
9
+ </div>
10
+ <div class="progress-text">
11
+ <span class="criteria-text">${spec.criteriaImplemented}/${spec.criteriaTotal} criterios</span>
12
+ <span class="progress-pct">${spec.progressPercent}%</span>
13
+ </div>`
14
+ : `<div style="font-size:0.75rem;color:var(--text-muted)">Sin datos de progreso</div>`;
15
+ return `<a href="/spec/${encodeURIComponent(spec.id.split('-')[0] ?? spec.id)}/${encodeURIComponent(spec.id)}"
16
+ class="spec-card status-${escapeHtml(spec.status)}" data-spec-id="${escapeHtml(spec.id)}">
17
+ <div class="spec-id" style="color:var(--status-${escapeHtml(spec.status)})">${escapeHtml(spec.id)}</div>
18
+ <div class="spec-title">${escapeHtml(spec.title)}</div>
19
+ <span class="status-badge">${escapeHtml(spec.status)}</span>
20
+ ${progressBar}
21
+ </a>`;
22
+ }
23
+ /** Render the usage stats panel */
24
+ function renderUsagePanel(usage) {
25
+ if (!usage.isAvailable) {
26
+ return `<div class="usage-panel">
27
+ <h3>Uso</h3>
28
+ <div style="color:var(--text-muted);font-size:0.85rem">Sin datos de uso disponibles</div>
29
+ </div>`;
30
+ }
31
+ const tierLabel = usage.tier.charAt(0).toUpperCase() + usage.tier.slice(1);
32
+ const limitLabel = usage.dailyLimit !== null ? String(usage.dailyLimit) : '∞';
33
+ const callsLabel = `${usage.callsToday} / ${limitLabel}`;
34
+ let trialHtml = '';
35
+ if (usage.trialDaysLeft !== null) {
36
+ const isCritical = usage.trialDaysLeft <= 3;
37
+ trialHtml = `<div class="trial-warning ${isCritical ? 'trial-critical' : ''}">
38
+ Trial: ${usage.trialDaysLeft} día${usage.trialDaysLeft !== 1 ? 's' : ''} restante${usage.trialDaysLeft !== 1 ? 's' : ''}
39
+ </div>`;
40
+ }
41
+ return `<div class="usage-panel">
42
+ <h3>Uso</h3>
43
+ <div class="usage-tier">${escapeHtml(tierLabel)}</div>
44
+ <div style="font-size:0.82rem;color:var(--text-muted);margin-top:0.35rem">Llamadas hoy: ${escapeHtml(callsLabel)}</div>
45
+ ${trialHtml}
46
+ </div>`;
47
+ }
48
+ /** Render the health metrics panel */
49
+ function renderHealthPanel(metrics) {
50
+ const estimLabel = metrics.totalEstimation !== null ? `${metrics.totalEstimation}h` : 'Sin estimación';
51
+ return `<div>
52
+ <h2 style="margin-bottom:1rem;font-size:1rem;color:var(--text-muted)">Project Health</h2>
53
+ <div class="grid grid-2" style="gap:0.75rem">
54
+ <div class="metric-card">
55
+ <div class="metric-value">${metrics.totalSpecs}</div>
56
+ <div class="metric-label">Total specs</div>
57
+ </div>
58
+ <div class="metric-card">
59
+ <div class="metric-value">${metrics.donePercent}%</div>
60
+ <div class="metric-label">Completado</div>
61
+ </div>
62
+ <div class="metric-card">
63
+ <div class="metric-value">${metrics.pendingApproval}</div>
64
+ <div class="metric-label">Pendientes aprobación</div>
65
+ </div>
66
+ <div class="metric-card">
67
+ <div class="metric-value">${metrics.activeImplementation}</div>
68
+ <div class="metric-label">En implementación</div>
69
+ </div>
70
+ </div>
71
+ <div style="margin-top:0.75rem;font-size:0.82rem;color:var(--text-muted)">
72
+ Estimación total: <strong>${escapeHtml(estimLabel)}</strong>
73
+ </div>
74
+ </div>`;
75
+ }
76
+ /** Render the home page — list of all projects */
77
+ export function renderHomePage(projects, usage) {
78
+ const projectContent = projects.length === 0
79
+ ? `<div class="empty-state">
80
+ <h2>No hay proyectos registrados</h2>
81
+ <p>Usa el tool <code>init_project</code> desde tu cliente MCP para crear tu primer proyecto.</p>
82
+ </div>`
83
+ : `<h2 style="margin-bottom:1rem">Proyectos</h2>
84
+ <div class="project-list">
85
+ ${projects
86
+ .map((p) => `<a href="/project/${encodeURIComponent(p.id)}" class="project-card">
87
+ <div class="project-info">
88
+ <h2>${escapeHtml(p.name)}</h2>
89
+ <div class="meta">${escapeHtml(p.stack)} &bull; ${escapeHtml(p.path)} &bull; Última actividad: ${escapeHtml(p.lastActivity)}</div>
90
+ </div>
91
+ <div class="project-stats">
92
+ <div>${p.specCount} specs</div>
93
+ <div class="done">${p.doneCount} done</div>
94
+ </div>
95
+ </a>`)
96
+ .join('\n')}
97
+ </div>`;
98
+ const body = `${projectContent}${renderUsagePanel(usage)}`;
99
+ return renderLayout('Inicio', body);
100
+ }
101
+ /** Render the project detail page — spec cards + health panel */
102
+ export function renderProjectPage(project, metrics, usage) {
103
+ const specCards = project.specs.length === 0
104
+ ? `<div class="empty-state"><p>Este proyecto no tiene specs aún.</p></div>`
105
+ : project.specs.map(renderSpecCard).join('\n');
106
+ const body = `
107
+ <div class="breadcrumb">
108
+ <a href="/">Inicio</a> &rsaquo; ${escapeHtml(project.name)}
109
+ </div>
110
+ <div style="display:grid;grid-template-columns:1fr 280px;gap:2rem;align-items:start">
111
+ <div>
112
+ <h2 style="margin-bottom:1.25rem">${escapeHtml(project.name)}</h2>
113
+ <div id="spec-grid" class="spec-grid">${specCards}</div>
114
+ </div>
115
+ <div>
116
+ ${renderHealthPanel(metrics)}
117
+ ${renderUsagePanel(usage)}
118
+ </div>
119
+ </div>
120
+ `;
121
+ return renderLayout(project.name, body);
122
+ }
123
+ /** Render the spec detail page — HU, FICHA, PROGRESS tabs */
124
+ export function renderSpecPage(projectId, projectName, specId, hu, ficha, progress) {
125
+ const huHtml = hu !== null ? markdownToHtml(hu) : '<p style="color:var(--text-muted)">HU.md no encontrado</p>';
126
+ const fichaHtml = ficha !== null
127
+ ? markdownToHtml(ficha)
128
+ : '<p style="color:var(--text-muted)">FICHA-TECNICA.md no encontrado</p>';
129
+ const progressHtml = progress !== null
130
+ ? markdownToHtml(progress)
131
+ : '<p style="color:var(--text-muted)">PROGRESS.md no encontrado</p>';
132
+ const body = `
133
+ <div class="breadcrumb">
134
+ <a href="/">Inicio</a> &rsaquo;
135
+ <a href="/project/${encodeURIComponent(projectId)}">${escapeHtml(projectName)}</a> &rsaquo;
136
+ ${escapeHtml(specId)}
137
+ </div>
138
+ <div class="tabs">
139
+ <button class="tab-btn active" data-tab="hu">Historia de Usuario</button>
140
+ <button class="tab-btn" data-tab="ficha">Ficha Técnica</button>
141
+ <button class="tab-btn" data-tab="progress">Progreso</button>
142
+ </div>
143
+ <div id="tab-hu" class="tab-content active">
144
+ <div class="md-content card">${huHtml}</div>
145
+ </div>
146
+ <div id="tab-ficha" class="tab-content">
147
+ <div class="md-content card">${fichaHtml}</div>
148
+ </div>
149
+ <div id="tab-progress" class="tab-content">
150
+ <div class="md-content card">${progressHtml}</div>
151
+ </div>
152
+ `;
153
+ return renderLayout(specId, body);
154
+ }
155
+ /** Render a 404 not found page */
156
+ export function render404Page(path) {
157
+ return renderLayout('404', `<div class="empty-state">
158
+ <h2>404 — Página no encontrada</h2>
159
+ <p>La ruta <code>${escapeHtml(path)}</code> no existe.</p>
160
+ <p style="margin-top:1rem"><a href="/">Volver al inicio</a></p>
161
+ </div>`);
162
+ }
163
+ //# sourceMappingURL=templates-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-project.js","sourceRoot":"","sources":["../../../src/engine/dashboard/templates-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './templates-layout.js';
2
+ export * from './templates-project.js';
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/engine/dashboard/templates.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // engine/dashboard/templates.ts — Barrel re-export for all dashboard templates.
2
+ export * from './templates-layout.js';
3
+ export * from './templates-project.js';
4
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/engine/dashboard/templates.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAuDhE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,UAAU,GAAG,IAAI,CA0BnB;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAwDhE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,UAAU,GAAG,IAAI,CA0BnB;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -33,6 +33,7 @@ function jaccardSimilarity(a, b) {
33
33
  }
34
34
  }
35
35
  const union = a.size + b.size - intersection;
36
+ /* v8 ignore next 1 */
36
37
  return union === 0 ? 0 : intersection / union;
37
38
  }
38
39
  /** Similarity between two text strings (0–1). */
@@ -1 +1 @@
1
- {"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { HookDefinition, HookEventPayload, HookExecutionLog } from '../../types/index.js';
2
+ /**
3
+ * Execute a single hook for the given payload.
4
+ * Returns a complete execution log entry.
5
+ */
6
+ export declare function executeHook(hook: HookDefinition, payload: HookEventPayload, depth: number): HookExecutionLog;
7
+ /**
8
+ * Dispatch an event to all matching enabled hooks.
9
+ * Fire-and-forget — errors in hooks are captured in the log, never thrown.
10
+ * Returns execution logs for all fired hooks.
11
+ *
12
+ * @param hooks - List of all hooks for the project
13
+ * @param payload - Event payload to dispatch
14
+ * @param depth - Current recursion depth (starts at 0)
15
+ */
16
+ export declare function dispatchEvent(hooks: HookDefinition[], payload: HookEventPayload, depth?: number): HookExecutionLog[];
17
+ /**
18
+ * Simulate hook execution without side effects (dry run).
19
+ * Returns which hooks would fire and what actions they would execute.
20
+ */
21
+ export declare function dryRunDispatch(hooks: HookDefinition[], payload: HookEventPayload): {
22
+ hook: HookDefinition;
23
+ wouldFire: boolean;
24
+ reason?: string;
25
+ }[];
26
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,sBAAsB,CAAC;AA8F9B;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,GACZ,gBAAgB,CAyBlB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,gBAAgB,EACzB,KAAK,SAAI,GACR,gBAAgB,EAAE,CAyBpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,gBAAgB,GACxB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAiBjE"}
@@ -0,0 +1,164 @@
1
+ // engine/hooks/core.ts — Hook registry: load, match, execute (SPEC-071)
2
+ // Hooks are LAZY — executed when a tool fires an event, not via daemon.
3
+ // Recursion guard: max depth = 3 to prevent infinite loops.
4
+ import { matchesFilter } from './triggers.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Constants
7
+ // ---------------------------------------------------------------------------
8
+ const MAX_DEPTH = 3;
9
+ // ---------------------------------------------------------------------------
10
+ // Interpolation
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Interpolate {{key}} placeholders in a string using values from the payload
14
+ * and a flat context map.
15
+ */
16
+ function interpolate(template, context) {
17
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
18
+ const value = context[key];
19
+ if (value === undefined || value === null) {
20
+ return `{{${key}}}`;
21
+ }
22
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
23
+ return String(value);
24
+ }
25
+ return JSON.stringify(value);
26
+ });
27
+ }
28
+ /**
29
+ * Flatten the event payload into a string-keyed context map for interpolation.
30
+ */
31
+ function payloadToContext(payload) {
32
+ return payload;
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Action execution
36
+ // ---------------------------------------------------------------------------
37
+ /**
38
+ * Execute a single hook action. Returns the action result.
39
+ * This function does NOT throw — errors are captured in the result.
40
+ */
41
+ function executeAction(action, payload) {
42
+ const context = payloadToContext(payload);
43
+ try {
44
+ switch (action.type) {
45
+ case 'log_message': {
46
+ const message = interpolate(action.message, context);
47
+ console.warn(`[Planu Hook] ${message}`);
48
+ return { actionType: action.type, status: 'success', output: message };
49
+ }
50
+ case 'notify': {
51
+ const message = interpolate(action.message, context);
52
+ console.warn(`[Planu Hook Notify] ${message}`);
53
+ return { actionType: action.type, status: 'success', output: message };
54
+ }
55
+ case 'set_variable': {
56
+ const value = interpolate(action.value, context);
57
+ return {
58
+ actionType: action.type,
59
+ status: 'success',
60
+ output: `Set ${action.key}=${value}`,
61
+ };
62
+ }
63
+ case 'run_tool': {
64
+ // Tools are invoked via fire-and-forget — we log intent but do not
65
+ // actually call the MCP server recursively from within the engine.
66
+ const toolArgs = JSON.stringify(action.args);
67
+ const message = `Would invoke tool '${action.tool}' with args: ${toolArgs}`;
68
+ console.warn(`[Planu Hook run_tool] ${message}`);
69
+ return { actionType: action.type, status: 'success', output: message };
70
+ }
71
+ }
72
+ }
73
+ catch (err) {
74
+ const errorMessage = err instanceof Error ? err.message : String(err);
75
+ return {
76
+ actionType: action.type,
77
+ status: 'failed',
78
+ errorMessage,
79
+ };
80
+ }
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Hook dispatch
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Execute a single hook for the given payload.
87
+ * Returns a complete execution log entry.
88
+ */
89
+ export function executeHook(hook, payload, depth) {
90
+ const startMs = Date.now();
91
+ const logId = `log-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
92
+ const actionResults = [];
93
+ for (const action of hook.actions) {
94
+ const result = executeAction(action, payload);
95
+ actionResults.push(result);
96
+ }
97
+ const allSucceeded = actionResults.every((r) => r.status === 'success');
98
+ return {
99
+ id: logId,
100
+ hookId: hook.id,
101
+ hookName: hook.name,
102
+ trigger: payload.trigger,
103
+ payload,
104
+ status: allSucceeded ? 'success' : 'failed',
105
+ depth,
106
+ actionResults,
107
+ executedAt: new Date().toISOString(),
108
+ durationMs: Date.now() - startMs,
109
+ };
110
+ }
111
+ // ---------------------------------------------------------------------------
112
+ // Registry dispatch
113
+ // ---------------------------------------------------------------------------
114
+ /**
115
+ * Dispatch an event to all matching enabled hooks.
116
+ * Fire-and-forget — errors in hooks are captured in the log, never thrown.
117
+ * Returns execution logs for all fired hooks.
118
+ *
119
+ * @param hooks - List of all hooks for the project
120
+ * @param payload - Event payload to dispatch
121
+ * @param depth - Current recursion depth (starts at 0)
122
+ */
123
+ export function dispatchEvent(hooks, payload, depth = 0) {
124
+ if (depth >= MAX_DEPTH) {
125
+ console.warn(`[Planu Hooks] Recursion guard triggered at depth ${depth} for trigger '${payload.trigger}'. Stopping.`);
126
+ return [];
127
+ }
128
+ const matchingHooks = hooks.filter((hook) => hook.enabled && hook.trigger === payload.trigger && matchesFilter(hook, payload));
129
+ const logs = [];
130
+ for (const hook of matchingHooks) {
131
+ try {
132
+ const log = executeHook(hook, payload, depth);
133
+ logs.push(log);
134
+ }
135
+ catch (err) {
136
+ const errorMessage = err instanceof Error ? err.message : String(err);
137
+ console.error(`[Planu Hooks] Unexpected error in hook '${hook.id}': ${errorMessage}`);
138
+ }
139
+ }
140
+ return logs;
141
+ }
142
+ /**
143
+ * Simulate hook execution without side effects (dry run).
144
+ * Returns which hooks would fire and what actions they would execute.
145
+ */
146
+ export function dryRunDispatch(hooks, payload) {
147
+ return hooks.map((hook) => {
148
+ if (!hook.enabled) {
149
+ return { hook, wouldFire: false, reason: 'Hook is disabled' };
150
+ }
151
+ if (hook.trigger !== payload.trigger) {
152
+ return {
153
+ hook,
154
+ wouldFire: false,
155
+ reason: `Trigger mismatch: hook='${hook.trigger}', event='${payload.trigger}'`,
156
+ };
157
+ }
158
+ if (!matchesFilter(hook, payload)) {
159
+ return { hook, wouldFire: false, reason: 'Filter conditions not met' };
160
+ }
161
+ return { hook, wouldFire: true };
162
+ });
163
+ }
164
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/hooks/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { GitHookScript, GitHookType, GenerateGitHooksInput } from '../../types/index.js';
2
+ /**
3
+ * Generate a shell script for the given git hook type.
4
+ */
5
+ export declare function generateGitHookScript(hookType: GitHookType, projectId: string, projectPath: string): GitHookScript;
6
+ /**
7
+ * Generate git hook scripts for all requested hook types.
8
+ */
9
+ export declare function generateGitHooks(input: GenerateGitHooksInput): GitHookScript[];
10
+ /**
11
+ * Format the generated scripts as a human-readable installation guide.
12
+ */
13
+ export declare function formatGitHookInstallGuide(scripts: GitHookScript[]): string;
14
+ //# sourceMappingURL=git-hook-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hook-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/git-hook-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AA+E9F;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,aAAa,CAiBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,aAAa,EAAE,CAI9E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAkB1E"}
@@ -0,0 +1,119 @@
1
+ // engine/hooks/git-hook-generator.ts — Generates shell scripts for git hooks (SPEC-071)
2
+ // Git hooks are generated as shell scripts — Planu does NOT execute them directly.
3
+ // ---------------------------------------------------------------------------
4
+ // Script templates
5
+ // ---------------------------------------------------------------------------
6
+ function buildPreCommitScript(projectId) {
7
+ return `#!/usr/bin/env sh
8
+ # Planu pre-commit hook — auto-generated by manage_hooks
9
+ # Project: ${projectId}
10
+ # Do not edit manually — re-run manage_hooks install_template to regenerate.
11
+
12
+ set -e
13
+
14
+ echo "[Planu] Running pre-commit checks..."
15
+
16
+ # Dispatch on_commit event to Planu (fire-and-forget — does not block commit)
17
+ # Requires planu CLI to be installed: npm install -g planu (or equivalent)
18
+ if command -v planu >/dev/null 2>&1; then
19
+ COMMIT_HASH="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
20
+ BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
21
+ COMMIT_MSG="$(git log -1 --pretty=%B 2>/dev/null | head -1 || echo '')"
22
+ planu dispatch on_commit \\
23
+ --project-id "${projectId}" \\
24
+ --commit-hash "\${COMMIT_HASH}" \\
25
+ --branch "\${BRANCH}" \\
26
+ --message "\${COMMIT_MSG}" \\
27
+ 2>/dev/null || true
28
+ fi
29
+
30
+ echo "[Planu] Pre-commit checks complete."
31
+ `;
32
+ }
33
+ function buildPostCommitScript(projectId) {
34
+ return `#!/usr/bin/env sh
35
+ # Planu post-commit hook — auto-generated by manage_hooks
36
+ # Project: ${projectId}
37
+ # Do not edit manually — re-run manage_hooks install_template to regenerate.
38
+
39
+ echo "[Planu] Post-commit: recording commit event..."
40
+
41
+ if command -v planu >/dev/null 2>&1; then
42
+ COMMIT_HASH="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
43
+ BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
44
+ COMMIT_MSG="$(git log -1 --pretty=%B 2>/dev/null | head -1 || echo '')"
45
+ planu dispatch on_commit \\
46
+ --project-id "${projectId}" \\
47
+ --commit-hash "\${COMMIT_HASH}" \\
48
+ --branch "\${BRANCH}" \\
49
+ --message "\${COMMIT_MSG}" \\
50
+ 2>/dev/null || true
51
+ fi
52
+ `;
53
+ }
54
+ function buildPrePushScript(projectId) {
55
+ return `#!/usr/bin/env sh
56
+ # Planu pre-push hook — auto-generated by manage_hooks
57
+ # Project: ${projectId}
58
+ # Do not edit manually — re-run manage_hooks install_template to regenerate.
59
+
60
+ set -e
61
+
62
+ echo "[Planu] Running pre-push drift check..."
63
+
64
+ if command -v planu >/dev/null 2>&1; then
65
+ # Run drift detection for all active specs
66
+ planu detect-drift --project-id "${projectId}" --mode quick 2>/dev/null || true
67
+ fi
68
+
69
+ echo "[Planu] Pre-push checks complete."
70
+ `;
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Generator functions
74
+ // ---------------------------------------------------------------------------
75
+ /**
76
+ * Generate a shell script for the given git hook type.
77
+ */
78
+ export function generateGitHookScript(hookType, projectId, projectPath) {
79
+ const installPath = `${projectPath}/.git/hooks/${hookType}`;
80
+ let content;
81
+ switch (hookType) {
82
+ case 'pre-commit':
83
+ content = buildPreCommitScript(projectId);
84
+ break;
85
+ case 'post-commit':
86
+ content = buildPostCommitScript(projectId);
87
+ break;
88
+ case 'pre-push':
89
+ content = buildPrePushScript(projectId);
90
+ break;
91
+ }
92
+ return { hookType, content, installPath };
93
+ }
94
+ /**
95
+ * Generate git hook scripts for all requested hook types.
96
+ */
97
+ export function generateGitHooks(input) {
98
+ return input.hookTypes.map((hookType) => generateGitHookScript(hookType, input.projectId, input.projectPath));
99
+ }
100
+ /**
101
+ * Format the generated scripts as a human-readable installation guide.
102
+ */
103
+ export function formatGitHookInstallGuide(scripts) {
104
+ const lines = ['Git hook scripts generated. To install:', '', '```bash'];
105
+ for (const script of scripts) {
106
+ lines.push(`# Install ${script.hookType} hook`);
107
+ lines.push(`cat > ${script.installPath} << 'PLANU_HOOK'`);
108
+ lines.push(script.content.trim());
109
+ lines.push('PLANU_HOOK');
110
+ lines.push(`chmod +x ${script.installPath}`);
111
+ lines.push('');
112
+ }
113
+ lines.push('```');
114
+ lines.push('');
115
+ lines.push('Note: These hooks dispatch events to Planu. They are fire-and-forget');
116
+ lines.push('and will not block git operations if Planu is unavailable.');
117
+ return lines.join('\n');
118
+ }
119
+ //# sourceMappingURL=git-hook-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hook-generator.js","sourceRoot":"","sources":["../../../src/engine/hooks/git-hook-generator.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,mFAAmF;AAInF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,OAAO;;aAEI,SAAS;;;;;;;;;;;;;;oBAcF,SAAS;;;;;;;;CAQ5B,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,OAAO;;aAEI,SAAS;;;;;;;;;;oBAUF,SAAS;;;;;;CAM5B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO;;aAEI,SAAS;;;;;;;;;qCASe,SAAS;;;;CAI7C,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAqB,EACrB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,WAAW,GAAG,GAAG,WAAW,eAAe,QAAQ,EAAE,CAAC;IAC5D,IAAI,OAAe,CAAC;IAEpB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,aAAa;YAChB,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,UAAU;YACb,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM;IACV,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CACpE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAwB;IAChE,MAAM,KAAK,GAAa,CAAC,yCAAyC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAEnF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,OAAO,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,WAAW,kBAAkB,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAEzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { dispatchEvent, executeHook, dryRunDispatch } from './core.js';
2
+ export { buildSpecCreatedPayload, buildStatusChangePayload, buildDriftDetectedPayload, buildCommitPayload, matchesFilter, matchesGlob, } from './triggers.js';
3
+ export { generateGitHookScript, generateGitHooks, formatGitHookInstallGuide, } from './git-hook-generator.js';
4
+ export { listTemplateNames, getTemplate, getAllTemplates } from './templates.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // engine/hooks/index.ts — Barrel export for hooks engine (SPEC-071)
2
+ export { dispatchEvent, executeHook, dryRunDispatch } from './core.js';
3
+ export { buildSpecCreatedPayload, buildStatusChangePayload, buildDriftDetectedPayload, buildCommitPayload, matchesFilter, matchesGlob, } from './triggers.js';
4
+ export { generateGitHookScript, generateGitHooks, formatGitHookInstallGuide, } from './git-hook-generator.js';
5
+ export { listTemplateNames, getTemplate, getAllTemplates } from './templates.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/hooks/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { HookTemplate } from '../../types/index.js';
2
+ /**
3
+ * Return all available template names.
4
+ */
5
+ export declare function listTemplateNames(): string[];
6
+ /**
7
+ * Return a template by name, or undefined if not found.
8
+ */
9
+ export declare function getTemplate(name: string): HookTemplate | undefined;
10
+ /**
11
+ * Return all templates.
12
+ */
13
+ export declare function getAllTemplates(): HookTemplate[];
14
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/templates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA+HzD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAEhD"}