@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 @@
1
+ {"version":3,"file":"event-handlers.d.ts","sourceRoot":"","sources":["../../../src/engine/webhook/event-handlers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,0BAA0B,EAC1B,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,0BAA0B,GAClC,oBAAoB,CAetB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,oBAAoB,CAWtB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,0BAA0B,GAAG,oBAAoB,CAejG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAO1E;AAYD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,0BAA0B,GAAG,oBAAoB,CAS9F"}
@@ -0,0 +1,89 @@
1
+ // engine/webhook/event-handlers.ts — Handles individual Lemon Squeezy webhook events.
2
+ // Each handler receives parsed payload and applies the corresponding business logic.
3
+ // ---------------------------------------------------------------------------
4
+ // Individual event handlers
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Handles subscription_cancelled: the customer cancelled their subscription.
8
+ * The tier should be reverted to free when the subscription period ends.
9
+ */
10
+ export function handleSubscriptionCancelled(payload) {
11
+ const attrs = payload.data.attributes;
12
+ const endsAt = attrs.ends_at ?? 'unknown date';
13
+ const productName = attrs.product_name ?? 'Planu subscription';
14
+ return {
15
+ success: true,
16
+ eventType: 'subscription_cancelled',
17
+ statusCode: 200,
18
+ message: [
19
+ `Subscription cancellation recorded: ${productName}`,
20
+ `Access continues until: ${endsAt}`,
21
+ 'Tier will revert to free upon expiry.',
22
+ ].join(' | '),
23
+ };
24
+ }
25
+ /**
26
+ * Handles subscription_updated: plan tier may have changed (upgrade/downgrade).
27
+ */
28
+ export function handleSubscriptionUpdated(payload) {
29
+ const attrs = payload.data.attributes;
30
+ const variantName = attrs.variant_name ?? 'unknown variant';
31
+ const status = attrs.status ?? 'unknown';
32
+ return {
33
+ success: true,
34
+ eventType: 'subscription_updated',
35
+ statusCode: 200,
36
+ message: [`Subscription updated: variant=${variantName}`, `status=${status}`].join(' | '),
37
+ };
38
+ }
39
+ /**
40
+ * Handles license_key_created: a new license key was issued (after purchase).
41
+ * This is informational — the user will activate the key via activate_license tool.
42
+ */
43
+ export function handleLicenseKeyCreated(payload) {
44
+ const attrs = payload.data.attributes;
45
+ const productName = attrs.product_name ?? 'Planu';
46
+ const userEmail = attrs.user_email ?? 'unknown';
47
+ return {
48
+ success: true,
49
+ eventType: 'license_key_created',
50
+ statusCode: 200,
51
+ message: [
52
+ `License key created for: ${productName}`,
53
+ `customer=${userEmail}`,
54
+ 'Key can be activated using activate_license tool.',
55
+ ].join(' | '),
56
+ };
57
+ }
58
+ /**
59
+ * Returns a generic "acknowledged" result for unhandled but recognised events.
60
+ */
61
+ export function handleUnknownEvent(eventType) {
62
+ return {
63
+ success: true,
64
+ eventType,
65
+ statusCode: 200,
66
+ message: `Event acknowledged (no handler): ${eventType}`,
67
+ };
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Dispatcher
71
+ // ---------------------------------------------------------------------------
72
+ const HANDLERS = {
73
+ subscription_cancelled: handleSubscriptionCancelled,
74
+ subscription_updated: handleSubscriptionUpdated,
75
+ license_key_created: handleLicenseKeyCreated,
76
+ };
77
+ /**
78
+ * Dispatches a parsed webhook payload to the appropriate event handler.
79
+ * Unhandled but valid events are acknowledged with a 200 response.
80
+ */
81
+ export function dispatchWebhookEvent(payload) {
82
+ const eventType = payload.meta.event_name;
83
+ const handler = HANDLERS[eventType];
84
+ if (handler) {
85
+ return handler(payload);
86
+ }
87
+ return handleUnknownEvent(eventType);
88
+ }
89
+ //# sourceMappingURL=event-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-handlers.js","sourceRoot":"","sources":["../../../src/engine/webhook/event-handlers.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,qFAAqF;AASrF,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAmC;IAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,oBAAoB,CAAC;IAE/D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,wBAAwB;QACnC,UAAU,EAAE,GAAG;QACf,OAAO,EAAE;YACP,uCAAuC,WAAW,EAAE;YACpD,2BAA2B,MAAM,EAAE;YACnC,uCAAuC;SACxC,CAAC,IAAI,CAAC,KAAK,CAAC;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAmC;IAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,iBAAiB,CAAC;IAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;IAEzC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,sBAAsB;QACjC,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,CAAC,iCAAiC,WAAW,EAAE,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;KAC1F,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAmC;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC;IAClD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IAEhD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,qBAAqB;QAChC,UAAU,EAAE,GAAG;QACf,OAAO,EAAE;YACP,4BAA4B,WAAW,EAAE;YACzC,YAAY,SAAS,EAAE;YACvB,mDAAmD;SACpD,CAAC,IAAI,CAAC,KAAK,CAAC;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS;QACT,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,oCAAoC,SAAS,EAAE;KACzD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,QAAQ,GAAoD;IAChE,sBAAsB,EAAE,2BAA2B;IACnD,oBAAoB,EAAE,yBAAyB;IAC/C,mBAAmB,EAAE,uBAAuB;CAC7C,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAmC;IACtE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAA6B,CAAC,CAAC;IAExD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { startWebhookServer, stopWebhookServer, getWebhookState, setWebhookSecret, } from './server.js';
2
+ export { validateSignature, extractSignatureHeader } from './signature.js';
3
+ export { dispatchWebhookEvent, handleSubscriptionCancelled, handleSubscriptionUpdated, handleLicenseKeyCreated, handleUnknownEvent, } from './event-handlers.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/webhook/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // engine/webhook/index.ts — Barrel re-export for the webhook engine module.
2
+ export { startWebhookServer, stopWebhookServer, getWebhookState, setWebhookSecret, } from './server.js';
3
+ export { validateSignature, extractSignatureHeader } from './signature.js';
4
+ export { dispatchWebhookEvent, handleSubscriptionCancelled, handleSubscriptionUpdated, handleLicenseKeyCreated, handleUnknownEvent, } from './event-handlers.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/webhook/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { WebhookServerState } from '../../types/index.js';
2
+ /** Returns the current webhook server state (immutable snapshot). */
3
+ export declare function getWebhookState(): WebhookServerState;
4
+ /** Replaces the webhook secret used for HMAC-SHA256 validation. */
5
+ export declare function setWebhookSecret(secret: string): void;
6
+ /**
7
+ * Starts the HTTP webhook server on the given port.
8
+ * Idempotent: if already running on the same port, returns the current state.
9
+ *
10
+ * @throws if the port is in use or an OS-level error occurs
11
+ */
12
+ export declare function startWebhookServer(port?: number): Promise<WebhookServerState>;
13
+ /**
14
+ * Stops the running webhook server gracefully.
15
+ * Idempotent: if already stopped, returns idle state.
16
+ */
17
+ export declare function stopWebhookServer(): Promise<WebhookServerState>;
18
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/engine/webhook/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAwB9B,qEAAqE;AACrE,wBAAgB,eAAe,IAAI,kBAAkB,CAEpD;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwBjG;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAoBrE"}
@@ -0,0 +1,187 @@
1
+ // engine/webhook/server.ts — Lightweight HTTP webhook receiver using node:http.
2
+ // No framework dependencies — only built-in Node.js modules.
3
+ import { createServer } from 'node:http';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { validateSignature, extractSignatureHeader } from './signature.js';
6
+ import { dispatchWebhookEvent } from './event-handlers.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Constants
9
+ // ---------------------------------------------------------------------------
10
+ const DEFAULT_PORT = 2358;
11
+ const MAX_RECENT_EVENTS = 20;
12
+ const MAX_BODY_SIZE = 1024 * 1024; // 1 MB
13
+ // ---------------------------------------------------------------------------
14
+ // Module state
15
+ // ---------------------------------------------------------------------------
16
+ let activeServer = null;
17
+ let serverState = makeIdleState();
18
+ let webhookSecret = '';
19
+ // ---------------------------------------------------------------------------
20
+ // Public API
21
+ // ---------------------------------------------------------------------------
22
+ /** Returns the current webhook server state (immutable snapshot). */
23
+ export function getWebhookState() {
24
+ return serverState;
25
+ }
26
+ /** Replaces the webhook secret used for HMAC-SHA256 validation. */
27
+ export function setWebhookSecret(secret) {
28
+ webhookSecret = secret;
29
+ }
30
+ /**
31
+ * Starts the HTTP webhook server on the given port.
32
+ * Idempotent: if already running on the same port, returns the current state.
33
+ *
34
+ * @throws if the port is in use or an OS-level error occurs
35
+ */
36
+ export async function startWebhookServer(port = DEFAULT_PORT) {
37
+ if (activeServer !== null) {
38
+ return serverState;
39
+ }
40
+ return new Promise((resolve, reject) => {
41
+ const server = createServer(handleRequest);
42
+ server.on('error', (err) => {
43
+ reject(err);
44
+ });
45
+ server.listen(port, () => {
46
+ activeServer = server;
47
+ serverState = {
48
+ running: true,
49
+ port,
50
+ startedAt: new Date().toISOString(),
51
+ eventsProcessed: 0,
52
+ recentEvents: [],
53
+ };
54
+ resolve(serverState);
55
+ });
56
+ });
57
+ }
58
+ /**
59
+ * Stops the running webhook server gracefully.
60
+ * Idempotent: if already stopped, returns idle state.
61
+ */
62
+ export async function stopWebhookServer() {
63
+ if (activeServer === null) {
64
+ serverState = makeIdleState();
65
+ return serverState;
66
+ }
67
+ const server = activeServer;
68
+ return new Promise((resolve, reject) => {
69
+ server.close((err) => {
70
+ /* v8 ignore start */
71
+ if (err) {
72
+ reject(err);
73
+ return;
74
+ }
75
+ /* v8 ignore stop */
76
+ activeServer = null;
77
+ serverState = makeIdleState();
78
+ resolve(serverState);
79
+ });
80
+ });
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // HTTP request handler
84
+ // ---------------------------------------------------------------------------
85
+ function handleRequest(req, res) {
86
+ if (req.method !== 'POST') {
87
+ res.writeHead(405, { 'Content-Type': 'text/plain' });
88
+ res.end('Method Not Allowed');
89
+ return;
90
+ }
91
+ collectBody(req)
92
+ .then((rawBody) => {
93
+ processWebhookRequest(rawBody, req.headers, res);
94
+ })
95
+ .catch(() => {
96
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
97
+ res.end('Bad Request');
98
+ });
99
+ }
100
+ function collectBody(req) {
101
+ return new Promise((resolve, reject) => {
102
+ const chunks = [];
103
+ let totalSize = 0;
104
+ req.on('data', (chunk) => {
105
+ totalSize += chunk.length;
106
+ if (totalSize > MAX_BODY_SIZE) {
107
+ reject(new Error('Payload too large'));
108
+ return;
109
+ }
110
+ chunks.push(chunk);
111
+ });
112
+ req.on('end', () => {
113
+ resolve(Buffer.concat(chunks));
114
+ });
115
+ req.on('error', reject);
116
+ });
117
+ }
118
+ function processWebhookRequest(rawBody, headers, res) {
119
+ // Signature validation (only if a secret is configured)
120
+ if (webhookSecret) {
121
+ const sig = extractSignatureHeader(headers);
122
+ if (!validateSignature(rawBody, sig, webhookSecret)) {
123
+ recordEvent('signature_invalid', false, 'Signature validation failed', '');
124
+ res.writeHead(401, { 'Content-Type': 'text/plain' });
125
+ res.end('Unauthorized');
126
+ return;
127
+ }
128
+ }
129
+ // Parse JSON body
130
+ let payload;
131
+ try {
132
+ payload = JSON.parse(rawBody.toString('utf8'));
133
+ }
134
+ catch {
135
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
136
+ res.end('Invalid JSON');
137
+ return;
138
+ }
139
+ // Dispatch event
140
+ const eventType = payload.meta.event_name;
141
+ try {
142
+ const result = dispatchWebhookEvent(payload);
143
+ recordEvent(eventType, result.success, result.message, result.eventType);
144
+ res.writeHead(result.statusCode, { 'Content-Type': 'application/json' });
145
+ res.end(JSON.stringify({ ok: true, message: result.message }));
146
+ /* v8 ignore start */
147
+ }
148
+ catch (err) {
149
+ const errMsg = err instanceof Error ? err.message : 'Unknown error';
150
+ recordEvent(eventType, false, errMsg, eventType);
151
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
152
+ res.end('Internal Server Error');
153
+ }
154
+ /* v8 ignore stop */
155
+ }
156
+ // ---------------------------------------------------------------------------
157
+ // Event recording (internal state update)
158
+ // ---------------------------------------------------------------------------
159
+ function recordEvent(_eventType, processed, summary, resolvedType) {
160
+ const record = {
161
+ id: randomUUID(),
162
+ eventType: resolvedType,
163
+ receivedAt: new Date().toISOString(),
164
+ processed,
165
+ summary,
166
+ ...(processed ? {} : { error: summary }),
167
+ };
168
+ const recentEvents = [record, ...serverState.recentEvents].slice(0, MAX_RECENT_EVENTS);
169
+ serverState = {
170
+ ...serverState,
171
+ eventsProcessed: serverState.eventsProcessed + 1,
172
+ recentEvents,
173
+ };
174
+ }
175
+ // ---------------------------------------------------------------------------
176
+ // Helpers
177
+ // ---------------------------------------------------------------------------
178
+ function makeIdleState() {
179
+ return {
180
+ running: false,
181
+ port: DEFAULT_PORT,
182
+ startedAt: null,
183
+ eventsProcessed: 0,
184
+ recentEvents: [],
185
+ };
186
+ }
187
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/engine/webhook/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Validates an HMAC-SHA256 signature from a Lemon Squeezy webhook request.
3
+ * Uses timing-safe comparison to prevent timing attacks.
4
+ *
5
+ * @param rawBody - The raw request body bytes (NOT parsed JSON)
6
+ * @param signatureHeader - The value of the X-Signature header
7
+ * @param secret - The webhook secret configured in Lemon Squeezy dashboard
8
+ * @returns true if signature is valid, false otherwise
9
+ */
10
+ export declare function validateSignature(rawBody: Buffer, signatureHeader: string, secret: string): boolean;
11
+ /**
12
+ * Extracts the signature header value from a map of HTTP headers.
13
+ * Header names are case-insensitive in HTTP/1.1.
14
+ */
15
+ export declare function extractSignatureHeader(headers: Record<string, string | string[] | undefined>): string;
16
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/engine/webhook/signature.ts"],"names":[],"mappings":"AAgBA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAmBT;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GACrD,MAAM,CAMR"}
@@ -0,0 +1,49 @@
1
+ // engine/webhook/signature.ts — HMAC-SHA256 signature validation for Lemon Squeezy webhooks.
2
+ // Validates the X-Signature header against the raw request body.
3
+ import { createHmac, timingSafeEqual } from 'node:crypto';
4
+ // ---------------------------------------------------------------------------
5
+ // Constants
6
+ // ---------------------------------------------------------------------------
7
+ const SIGNATURE_HEADER = 'x-signature';
8
+ const HMAC_ALGO = 'sha256';
9
+ // ---------------------------------------------------------------------------
10
+ // Public API
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Validates an HMAC-SHA256 signature from a Lemon Squeezy webhook request.
14
+ * Uses timing-safe comparison to prevent timing attacks.
15
+ *
16
+ * @param rawBody - The raw request body bytes (NOT parsed JSON)
17
+ * @param signatureHeader - The value of the X-Signature header
18
+ * @param secret - The webhook secret configured in Lemon Squeezy dashboard
19
+ * @returns true if signature is valid, false otherwise
20
+ */
21
+ export function validateSignature(rawBody, signatureHeader, secret) {
22
+ if (!secret || !signatureHeader) {
23
+ return false;
24
+ }
25
+ const expectedHex = createHmac(HMAC_ALGO, secret).update(rawBody).digest('hex');
26
+ try {
27
+ const expectedBuf = Buffer.from(expectedHex, 'hex');
28
+ const receivedBuf = Buffer.from(signatureHeader, 'hex');
29
+ if (expectedBuf.length !== receivedBuf.length) {
30
+ return false;
31
+ }
32
+ return timingSafeEqual(expectedBuf, receivedBuf);
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ /**
39
+ * Extracts the signature header value from a map of HTTP headers.
40
+ * Header names are case-insensitive in HTTP/1.1.
41
+ */
42
+ export function extractSignatureHeader(headers) {
43
+ const raw = headers[SIGNATURE_HEADER];
44
+ if (Array.isArray(raw)) {
45
+ return raw[0] ?? '';
46
+ }
47
+ return raw ?? '';
48
+ }
49
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/engine/webhook/signature.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,aAAa,CAAC;AACvC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,eAAuB,EACvB,MAAc;IAEd,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhF,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAExD,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAsD;IAEtD,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,IAAI,EAAE,CAAC;AACnB,CAAC"}
package/dist/index.js CHANGED
@@ -22,6 +22,15 @@ import { registerAgentTools } from './tools/register-agent-tools.js';
22
22
  import { registerWorkflowTools } from './tools/register-workflow-tools.js';
23
23
  import { registerLicenseTools } from './tools/register-license-tools.js';
24
24
  import { registerUsageTools } from './tools/register-usage-tools.js';
25
+ import { registerChangelogTools } from './tools/register-changelog-tools.js';
26
+ import { registerCoverageTools } from './tools/register-coverage-tools.js';
27
+ import { registerDashboardTools } from './tools/register-dashboard-tools.js';
28
+ import { registerAiCostTools } from './tools/register-ai-cost-tools.js';
29
+ import { registerWebhookTools } from './tools/register-webhook-tools.js';
30
+ import { registerCITools } from './tools/register-ci-tools.js';
31
+ import { registerHooksTools } from './tools/register-hooks-tools.js';
32
+ import { registerTemplateTools } from './tools/register-template-tools.js';
33
+ import { registerRegistryTools } from './tools/register-registry-tools.js';
25
34
  import { PLANU_VERSION } from './config/version.js';
26
35
  import { handleActivateLicense } from './tools/activate-license.js';
27
36
  // ---------------------------------------------------------------------------
@@ -95,6 +104,15 @@ registerAgentTools(server);
95
104
  registerWorkflowTools(server);
96
105
  registerLicenseTools(server);
97
106
  registerUsageTools(server);
107
+ registerChangelogTools(server);
108
+ registerCoverageTools(server);
109
+ registerDashboardTools(server);
110
+ registerAiCostTools(server);
111
+ registerWebhookTools(server);
112
+ registerCITools(server);
113
+ registerHooksTools(server);
114
+ registerTemplateTools(server);
115
+ registerRegistryTools(server);
98
116
  // ---------------------------------------------------------------------------
99
117
  // Start server
100
118
  // ---------------------------------------------------------------------------
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { HookDefinition, HookExecutionLog } from '../types/index.js';
2
+ /**
3
+ * Return all hook definitions for a project.
4
+ */
5
+ export declare function getHooks(projectId: string): Promise<HookDefinition[]>;
6
+ /**
7
+ * Return a single hook by ID, or undefined if not found.
8
+ */
9
+ export declare function getHookById(projectId: string, hookId: string): Promise<HookDefinition | undefined>;
10
+ /**
11
+ * Persist a new hook definition.
12
+ */
13
+ export declare function saveHook(projectId: string, hook: HookDefinition): Promise<void>;
14
+ /**
15
+ * Apply partial updates to an existing hook. Throws if not found.
16
+ */
17
+ export declare function updateHook(projectId: string, hookId: string, updates: Partial<HookDefinition>): Promise<HookDefinition>;
18
+ /**
19
+ * Delete a hook by ID. Throws if not found.
20
+ */
21
+ export declare function deleteHook(projectId: string, hookId: string): Promise<void>;
22
+ /**
23
+ * Return enabled hooks matching the given trigger.
24
+ */
25
+ export declare function getHooksByTrigger(projectId: string, trigger: string): Promise<HookDefinition[]>;
26
+ /**
27
+ * Append an execution log entry. Trims entries beyond MAX_LOG_ENTRIES.
28
+ */
29
+ export declare function appendHookLog(projectId: string, entry: HookExecutionLog): Promise<void>;
30
+ /**
31
+ * Return recent execution log entries for a project.
32
+ */
33
+ export declare function getHookLogs(projectId: string, limit?: number): Promise<HookExecutionLog[]>;
34
+ //# sourceMappingURL=hooks-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-store.d.ts","sourceRoot":"","sources":["../../src/storage/hooks-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EAEd,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AA+C3B;;GAEG;AACH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAGrC;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASjF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,EAAE,CAAC,CAG3B;AAMD;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAG5F"}
@@ -0,0 +1,128 @@
1
+ // storage/hooks-store.ts — Persistence layer for agent hooks (SPEC-071)
2
+ // Files: data/projects/{projectId}/hooks.json + hooks-log.json
3
+ import { readJson, writeJson, projectDataDir } from './base-store.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Constants
6
+ // ---------------------------------------------------------------------------
7
+ const MAX_LOG_ENTRIES = 1_000;
8
+ // ---------------------------------------------------------------------------
9
+ // File paths
10
+ // ---------------------------------------------------------------------------
11
+ function hooksFile(projectId) {
12
+ return `${projectDataDir(projectId)}/hooks.json`;
13
+ }
14
+ function hooksLogFile(projectId) {
15
+ return `${projectDataDir(projectId)}/hooks-log.json`;
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // Private helpers
19
+ // ---------------------------------------------------------------------------
20
+ async function loadConfig(projectId) {
21
+ return readJson(hooksFile(projectId), {
22
+ hooks: [],
23
+ lastUpdated: new Date().toISOString(),
24
+ });
25
+ }
26
+ async function saveConfig(projectId, config) {
27
+ await writeJson(hooksFile(projectId), config);
28
+ }
29
+ async function loadLogData(projectId) {
30
+ return readJson(hooksLogFile(projectId), {
31
+ entries: [],
32
+ lastUpdated: new Date().toISOString(),
33
+ });
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Hook CRUD
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Return all hook definitions for a project.
40
+ */
41
+ export async function getHooks(projectId) {
42
+ const config = await loadConfig(projectId);
43
+ return config.hooks;
44
+ }
45
+ /**
46
+ * Return a single hook by ID, or undefined if not found.
47
+ */
48
+ export async function getHookById(projectId, hookId) {
49
+ const config = await loadConfig(projectId);
50
+ return config.hooks.find((h) => h.id === hookId);
51
+ }
52
+ /**
53
+ * Persist a new hook definition.
54
+ */
55
+ export async function saveHook(projectId, hook) {
56
+ const config = await loadConfig(projectId);
57
+ config.hooks.push(hook);
58
+ config.lastUpdated = new Date().toISOString();
59
+ await saveConfig(projectId, config);
60
+ }
61
+ /**
62
+ * Apply partial updates to an existing hook. Throws if not found.
63
+ */
64
+ export async function updateHook(projectId, hookId, updates) {
65
+ const config = await loadConfig(projectId);
66
+ const idx = config.hooks.findIndex((h) => h.id === hookId);
67
+ if (idx === -1) {
68
+ throw new Error(`Hook "${hookId}" not found in project "${projectId}".`);
69
+ }
70
+ const existing = config.hooks[idx];
71
+ /* v8 ignore next 3 */
72
+ if (!existing) {
73
+ throw new Error(`Hook "${hookId}" not found in project "${projectId}".`);
74
+ }
75
+ const updated = {
76
+ ...existing,
77
+ ...updates,
78
+ id: hookId,
79
+ updatedAt: new Date().toISOString(),
80
+ };
81
+ config.hooks[idx] = updated;
82
+ config.lastUpdated = new Date().toISOString();
83
+ await saveConfig(projectId, config);
84
+ return updated;
85
+ }
86
+ /**
87
+ * Delete a hook by ID. Throws if not found.
88
+ */
89
+ export async function deleteHook(projectId, hookId) {
90
+ const config = await loadConfig(projectId);
91
+ const idx = config.hooks.findIndex((h) => h.id === hookId);
92
+ if (idx === -1) {
93
+ throw new Error(`Hook "${hookId}" not found in project "${projectId}".`);
94
+ }
95
+ config.hooks.splice(idx, 1);
96
+ config.lastUpdated = new Date().toISOString();
97
+ await saveConfig(projectId, config);
98
+ }
99
+ /**
100
+ * Return enabled hooks matching the given trigger.
101
+ */
102
+ export async function getHooksByTrigger(projectId, trigger) {
103
+ const config = await loadConfig(projectId);
104
+ return config.hooks.filter((h) => h.trigger === trigger && h.enabled);
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Execution log
108
+ // ---------------------------------------------------------------------------
109
+ /**
110
+ * Append an execution log entry. Trims entries beyond MAX_LOG_ENTRIES.
111
+ */
112
+ export async function appendHookLog(projectId, entry) {
113
+ const data = await loadLogData(projectId);
114
+ data.entries.push(entry);
115
+ if (data.entries.length > MAX_LOG_ENTRIES) {
116
+ data.entries = data.entries.slice(data.entries.length - MAX_LOG_ENTRIES);
117
+ }
118
+ data.lastUpdated = new Date().toISOString();
119
+ await writeJson(hooksLogFile(projectId), data);
120
+ }
121
+ /**
122
+ * Return recent execution log entries for a project.
123
+ */
124
+ export async function getHookLogs(projectId, limit = 50) {
125
+ const data = await loadLogData(projectId);
126
+ return data.entries.slice(-limit);
127
+ }
128
+ //# sourceMappingURL=hooks-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-store.js","sourceRoot":"","sources":["../../src/storage/hooks-store.ts"],"names":[],"mappings":"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"}