@planu/cli 0.23.2 → 0.25.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 (397) 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/license-validator/core.d.ts +1 -0
  111. package/dist/engine/license-validator/core.d.ts.map +1 -1
  112. package/dist/engine/license-validator/core.js +10 -1
  113. package/dist/engine/license-validator/core.js.map +1 -1
  114. package/dist/engine/license-validator/fingerprint.d.ts +3 -0
  115. package/dist/engine/license-validator/fingerprint.d.ts.map +1 -0
  116. package/dist/engine/license-validator/fingerprint.js +17 -0
  117. package/dist/engine/license-validator/fingerprint.js.map +1 -0
  118. package/dist/engine/license-validator.d.ts +2 -1
  119. package/dist/engine/license-validator.d.ts.map +1 -1
  120. package/dist/engine/license-validator.js +2 -1
  121. package/dist/engine/license-validator.js.map +1 -1
  122. package/dist/engine/registry/core.d.ts +32 -0
  123. package/dist/engine/registry/core.d.ts.map +1 -0
  124. package/dist/engine/registry/core.js +85 -0
  125. package/dist/engine/registry/core.js.map +1 -0
  126. package/dist/engine/registry/index.d.ts +6 -0
  127. package/dist/engine/registry/index.d.ts.map +1 -0
  128. package/dist/engine/registry/index.js +8 -0
  129. package/dist/engine/registry/index.js.map +1 -0
  130. package/dist/engine/registry/loader.d.ts +18 -0
  131. package/dist/engine/registry/loader.d.ts.map +1 -0
  132. package/dist/engine/registry/loader.js +81 -0
  133. package/dist/engine/registry/loader.js.map +1 -0
  134. package/dist/engine/registry/matcher.d.ts +19 -0
  135. package/dist/engine/registry/matcher.d.ts.map +1 -0
  136. package/dist/engine/registry/matcher.js +150 -0
  137. package/dist/engine/registry/matcher.js.map +1 -0
  138. package/dist/engine/registry/reporter.d.ts +10 -0
  139. package/dist/engine/registry/reporter.d.ts.map +1 -0
  140. package/dist/engine/registry/reporter.js +132 -0
  141. package/dist/engine/registry/reporter.js.map +1 -0
  142. package/dist/engine/registry/validator.d.ts +17 -0
  143. package/dist/engine/registry/validator.d.ts.map +1 -0
  144. package/dist/engine/registry/validator.js +103 -0
  145. package/dist/engine/registry/validator.js.map +1 -0
  146. package/dist/engine/spec-changelog/core.d.ts +16 -0
  147. package/dist/engine/spec-changelog/core.d.ts.map +1 -0
  148. package/dist/engine/spec-changelog/core.js +175 -0
  149. package/dist/engine/spec-changelog/core.js.map +1 -0
  150. package/dist/engine/spec-changelog/diff.d.ts +18 -0
  151. package/dist/engine/spec-changelog/diff.d.ts.map +1 -0
  152. package/dist/engine/spec-changelog/diff.js +116 -0
  153. package/dist/engine/spec-changelog/diff.js.map +1 -0
  154. package/dist/engine/spec-changelog/index.d.ts +3 -0
  155. package/dist/engine/spec-changelog/index.d.ts.map +1 -0
  156. package/dist/engine/spec-changelog/index.js +4 -0
  157. package/dist/engine/spec-changelog/index.js.map +1 -0
  158. package/dist/engine/spec-coverage/core.d.ts +14 -0
  159. package/dist/engine/spec-coverage/core.d.ts.map +1 -0
  160. package/dist/engine/spec-coverage/core.js +132 -0
  161. package/dist/engine/spec-coverage/core.js.map +1 -0
  162. package/dist/engine/spec-coverage/criteria-mapper.d.ts +18 -0
  163. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -0
  164. package/dist/engine/spec-coverage/criteria-mapper.js +306 -0
  165. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -0
  166. package/dist/engine/spec-coverage/index.d.ts +4 -0
  167. package/dist/engine/spec-coverage/index.d.ts.map +1 -0
  168. package/dist/engine/spec-coverage/index.js +5 -0
  169. package/dist/engine/spec-coverage/index.js.map +1 -0
  170. package/dist/engine/spec-coverage/test-finder.d.ts +17 -0
  171. package/dist/engine/spec-coverage/test-finder.d.ts.map +1 -0
  172. package/dist/engine/spec-coverage/test-finder.js +250 -0
  173. package/dist/engine/spec-coverage/test-finder.js.map +1 -0
  174. package/dist/engine/spec-templates/catalog-extra.d.ts +4 -0
  175. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -0
  176. package/dist/engine/spec-templates/catalog-extra.js +367 -0
  177. package/dist/engine/spec-templates/catalog-extra.js.map +1 -0
  178. package/dist/engine/spec-templates/catalog.d.ts +4 -0
  179. package/dist/engine/spec-templates/catalog.d.ts.map +1 -0
  180. package/dist/engine/spec-templates/catalog.js +386 -0
  181. package/dist/engine/spec-templates/catalog.js.map +1 -0
  182. package/dist/engine/spec-templates/index.d.ts +4 -0
  183. package/dist/engine/spec-templates/index.d.ts.map +1 -0
  184. package/dist/engine/spec-templates/index.js +5 -0
  185. package/dist/engine/spec-templates/index.js.map +1 -0
  186. package/dist/engine/spec-templates/query.d.ts +14 -0
  187. package/dist/engine/spec-templates/query.d.ts.map +1 -0
  188. package/dist/engine/spec-templates/query.js +56 -0
  189. package/dist/engine/spec-templates/query.js.map +1 -0
  190. package/dist/engine/spec-templates/renderer.d.ts +19 -0
  191. package/dist/engine/spec-templates/renderer.d.ts.map +1 -0
  192. package/dist/engine/spec-templates/renderer.js +45 -0
  193. package/dist/engine/spec-templates/renderer.js.map +1 -0
  194. package/dist/engine/usage-tracker/trial.d.ts +4 -4
  195. package/dist/engine/usage-tracker/trial.d.ts.map +1 -1
  196. package/dist/engine/usage-tracker/trial.js +4 -4
  197. package/dist/engine/usage-tracker/trial.js.map +1 -1
  198. package/dist/engine/webhook/event-handlers.d.ts +25 -0
  199. package/dist/engine/webhook/event-handlers.d.ts.map +1 -0
  200. package/dist/engine/webhook/event-handlers.js +89 -0
  201. package/dist/engine/webhook/event-handlers.js.map +1 -0
  202. package/dist/engine/webhook/index.d.ts +4 -0
  203. package/dist/engine/webhook/index.d.ts.map +1 -0
  204. package/dist/engine/webhook/index.js +5 -0
  205. package/dist/engine/webhook/index.js.map +1 -0
  206. package/dist/engine/webhook/server.d.ts +18 -0
  207. package/dist/engine/webhook/server.d.ts.map +1 -0
  208. package/dist/engine/webhook/server.js +187 -0
  209. package/dist/engine/webhook/server.js.map +1 -0
  210. package/dist/engine/webhook/signature.d.ts +16 -0
  211. package/dist/engine/webhook/signature.d.ts.map +1 -0
  212. package/dist/engine/webhook/signature.js +49 -0
  213. package/dist/engine/webhook/signature.js.map +1 -0
  214. package/dist/index.js +18 -0
  215. package/dist/index.js.map +1 -1
  216. package/dist/storage/hooks-store.d.ts +34 -0
  217. package/dist/storage/hooks-store.d.ts.map +1 -0
  218. package/dist/storage/hooks-store.js +128 -0
  219. package/dist/storage/hooks-store.js.map +1 -0
  220. package/dist/storage/index.d.ts +1 -0
  221. package/dist/storage/index.d.ts.map +1 -1
  222. package/dist/storage/index.js +1 -0
  223. package/dist/storage/index.js.map +1 -1
  224. package/dist/tools/activate-license.d.ts.map +1 -1
  225. package/dist/tools/activate-license.js +5 -2
  226. package/dist/tools/activate-license.js.map +1 -1
  227. package/dist/tools/check-spec-accuracy.d.ts +7 -0
  228. package/dist/tools/check-spec-accuracy.d.ts.map +1 -0
  229. package/dist/tools/check-spec-accuracy.js +28 -0
  230. package/dist/tools/check-spec-accuracy.js.map +1 -0
  231. package/dist/tools/ci-generator.d.ts +7 -0
  232. package/dist/tools/ci-generator.d.ts.map +1 -0
  233. package/dist/tools/ci-generator.js +49 -0
  234. package/dist/tools/ci-generator.js.map +1 -0
  235. package/dist/tools/create-spec.d.ts.map +1 -1
  236. package/dist/tools/create-spec.js +4 -0
  237. package/dist/tools/create-spec.js.map +1 -1
  238. package/dist/tools/dashboard.d.ts +6 -0
  239. package/dist/tools/dashboard.d.ts.map +1 -0
  240. package/dist/tools/dashboard.js +48 -0
  241. package/dist/tools/dashboard.js.map +1 -0
  242. package/dist/tools/detect-drift.d.ts.map +1 -1
  243. package/dist/tools/detect-drift.js +6 -0
  244. package/dist/tools/detect-drift.js.map +1 -1
  245. package/dist/tools/estimate-ai-cost.d.ts +8 -0
  246. package/dist/tools/estimate-ai-cost.d.ts.map +1 -0
  247. package/dist/tools/estimate-ai-cost.js +29 -0
  248. package/dist/tools/estimate-ai-cost.js.map +1 -0
  249. package/dist/tools/license-gate.d.ts.map +1 -1
  250. package/dist/tools/license-gate.js +27 -20
  251. package/dist/tools/license-gate.js.map +1 -1
  252. package/dist/tools/license-status.d.ts.map +1 -1
  253. package/dist/tools/license-status.js +3 -0
  254. package/dist/tools/license-status.js.map +1 -1
  255. package/dist/tools/list-specs.d.ts.map +1 -1
  256. package/dist/tools/list-specs.js +15 -0
  257. package/dist/tools/list-specs.js.map +1 -1
  258. package/dist/tools/manage-hooks.d.ts +5 -0
  259. package/dist/tools/manage-hooks.d.ts.map +1 -0
  260. package/dist/tools/manage-hooks.js +247 -0
  261. package/dist/tools/manage-hooks.js.map +1 -0
  262. package/dist/tools/reconcile-spec.d.ts.map +1 -1
  263. package/dist/tools/reconcile-spec.js +24 -0
  264. package/dist/tools/reconcile-spec.js.map +1 -1
  265. package/dist/tools/register-ai-cost-tools.d.ts +3 -0
  266. package/dist/tools/register-ai-cost-tools.d.ts.map +1 -0
  267. package/dist/tools/register-ai-cost-tools.js +25 -0
  268. package/dist/tools/register-ai-cost-tools.js.map +1 -0
  269. package/dist/tools/register-changelog-tools.d.ts +3 -0
  270. package/dist/tools/register-changelog-tools.d.ts.map +1 -0
  271. package/dist/tools/register-changelog-tools.js +23 -0
  272. package/dist/tools/register-changelog-tools.js.map +1 -0
  273. package/dist/tools/register-ci-tools.d.ts +3 -0
  274. package/dist/tools/register-ci-tools.d.ts.map +1 -0
  275. package/dist/tools/register-ci-tools.js +50 -0
  276. package/dist/tools/register-ci-tools.js.map +1 -0
  277. package/dist/tools/register-coverage-tools.d.ts +7 -0
  278. package/dist/tools/register-coverage-tools.d.ts.map +1 -0
  279. package/dist/tools/register-coverage-tools.js +27 -0
  280. package/dist/tools/register-coverage-tools.js.map +1 -0
  281. package/dist/tools/register-dashboard-tools.d.ts +3 -0
  282. package/dist/tools/register-dashboard-tools.d.ts.map +1 -0
  283. package/dist/tools/register-dashboard-tools.js +29 -0
  284. package/dist/tools/register-dashboard-tools.js.map +1 -0
  285. package/dist/tools/register-hooks-tools.d.ts +3 -0
  286. package/dist/tools/register-hooks-tools.d.ts.map +1 -0
  287. package/dist/tools/register-hooks-tools.js +107 -0
  288. package/dist/tools/register-hooks-tools.js.map +1 -0
  289. package/dist/tools/register-registry-tools.d.ts +3 -0
  290. package/dist/tools/register-registry-tools.d.ts.map +1 -0
  291. package/dist/tools/register-registry-tools.js +43 -0
  292. package/dist/tools/register-registry-tools.js.map +1 -0
  293. package/dist/tools/register-template-tools.d.ts +8 -0
  294. package/dist/tools/register-template-tools.d.ts.map +1 -0
  295. package/dist/tools/register-template-tools.js +71 -0
  296. package/dist/tools/register-template-tools.js.map +1 -0
  297. package/dist/tools/register-webhook-tools.d.ts +3 -0
  298. package/dist/tools/register-webhook-tools.d.ts.map +1 -0
  299. package/dist/tools/register-webhook-tools.js +49 -0
  300. package/dist/tools/register-webhook-tools.js.map +1 -0
  301. package/dist/tools/schemas/index.d.ts +1 -0
  302. package/dist/tools/schemas/index.d.ts.map +1 -1
  303. package/dist/tools/schemas/index.js +1 -0
  304. package/dist/tools/schemas/index.js.map +1 -1
  305. package/dist/tools/schemas/registry.d.ts +41 -0
  306. package/dist/tools/schemas/registry.d.ts.map +1 -0
  307. package/dist/tools/schemas/registry.js +62 -0
  308. package/dist/tools/schemas/registry.js.map +1 -0
  309. package/dist/tools/spec-coverage.d.ts +3 -0
  310. package/dist/tools/spec-coverage.d.ts.map +1 -0
  311. package/dist/tools/spec-coverage.js +176 -0
  312. package/dist/tools/spec-coverage.js.map +1 -0
  313. package/dist/tools/spec-history.d.ts +3 -0
  314. package/dist/tools/spec-history.d.ts.map +1 -0
  315. package/dist/tools/spec-history.js +67 -0
  316. package/dist/tools/spec-history.js.map +1 -0
  317. package/dist/tools/spec-templates.d.ts +10 -0
  318. package/dist/tools/spec-templates.d.ts.map +1 -0
  319. package/dist/tools/spec-templates.js +155 -0
  320. package/dist/tools/spec-templates.js.map +1 -0
  321. package/dist/tools/update-registry.d.ts +8 -0
  322. package/dist/tools/update-registry.d.ts.map +1 -0
  323. package/dist/tools/update-registry.js +53 -0
  324. package/dist/tools/update-registry.js.map +1 -0
  325. package/dist/tools/update-status.d.ts.map +1 -1
  326. package/dist/tools/update-status.js +24 -0
  327. package/dist/tools/update-status.js.map +1 -1
  328. package/dist/tools/webhook.d.ts +6 -0
  329. package/dist/tools/webhook.d.ts.map +1 -0
  330. package/dist/tools/webhook.js +150 -0
  331. package/dist/tools/webhook.js.map +1 -0
  332. package/dist/types/ai-cost.d.ts +98 -0
  333. package/dist/types/ai-cost.d.ts.map +1 -0
  334. package/dist/types/ai-cost.js +4 -0
  335. package/dist/types/ai-cost.js.map +1 -0
  336. package/dist/types/analysis.d.ts +64 -0
  337. package/dist/types/analysis.d.ts.map +1 -1
  338. package/dist/types/changelog.d.ts +49 -0
  339. package/dist/types/changelog.d.ts.map +1 -0
  340. package/dist/types/changelog.js +3 -0
  341. package/dist/types/changelog.js.map +1 -0
  342. package/dist/types/ci.d.ts +105 -0
  343. package/dist/types/ci.d.ts.map +1 -0
  344. package/dist/types/ci.js +3 -0
  345. package/dist/types/ci.js.map +1 -0
  346. package/dist/types/coverage.d.ts +95 -0
  347. package/dist/types/coverage.d.ts.map +1 -0
  348. package/dist/types/coverage.js +4 -0
  349. package/dist/types/coverage.js.map +1 -0
  350. package/dist/types/hooks.d.ts +139 -0
  351. package/dist/types/hooks.d.ts.map +1 -0
  352. package/dist/types/hooks.js +3 -0
  353. package/dist/types/hooks.js.map +1 -0
  354. package/dist/types/index.d.ts +8 -0
  355. package/dist/types/index.d.ts.map +1 -1
  356. package/dist/types/index.js +8 -0
  357. package/dist/types/index.js.map +1 -1
  358. package/dist/types/licensing.d.ts +6 -0
  359. package/dist/types/licensing.d.ts.map +1 -1
  360. package/dist/types/registry.d.ts +90 -0
  361. package/dist/types/registry.d.ts.map +1 -0
  362. package/dist/types/registry.js +5 -0
  363. package/dist/types/registry.js.map +1 -0
  364. package/dist/types/spec-templates.d.ts +87 -0
  365. package/dist/types/spec-templates.d.ts.map +1 -0
  366. package/dist/types/spec-templates.js +3 -0
  367. package/dist/types/spec-templates.js.map +1 -0
  368. package/dist/types/ui.d.ts +76 -0
  369. package/dist/types/ui.d.ts.map +1 -1
  370. package/dist/types/webhook.d.ts +62 -0
  371. package/dist/types/webhook.d.ts.map +1 -0
  372. package/dist/types/webhook.js +4 -0
  373. package/dist/types/webhook.js.map +1 -0
  374. package/package.json +1 -1
  375. package/src/config/ai-model-pricing.json +81 -0
  376. package/src/config/framework-registry/csharp-aspnet.json +67 -0
  377. package/src/config/framework-registry/dart-flutter.json +61 -0
  378. package/src/config/framework-registry/go-gin.json +62 -0
  379. package/src/config/framework-registry/index.json +164 -0
  380. package/src/config/framework-registry/java-springboot.json +67 -0
  381. package/src/config/framework-registry/php-laravel.json +67 -0
  382. package/src/config/framework-registry/python-django.json +72 -0
  383. package/src/config/framework-registry/python-fastapi.json +72 -0
  384. package/src/config/framework-registry/ruby-rails.json +67 -0
  385. package/src/config/framework-registry/rust-actix.json +61 -0
  386. package/src/config/framework-registry/swift-swiftui.json +67 -0
  387. package/src/config/framework-registry/typescript-angular.json +67 -0
  388. package/src/config/framework-registry/typescript-astro.json +61 -0
  389. package/src/config/framework-registry/typescript-express.json +67 -0
  390. package/src/config/framework-registry/typescript-nestjs.json +62 -0
  391. package/src/config/framework-registry/typescript-nextjs.json +82 -0
  392. package/src/config/framework-registry/typescript-nuxt.json +67 -0
  393. package/src/config/framework-registry/typescript-react.json +77 -0
  394. package/src/config/framework-registry/typescript-remix.json +61 -0
  395. package/src/config/framework-registry/typescript-sveltekit.json +67 -0
  396. package/src/config/framework-registry/typescript-vue.json +72 -0
  397. package/src/config/license-plans.json +23 -3
@@ -0,0 +1,138 @@
1
+ // engine/hooks/templates.ts — Predefined hook templates for common workflows (SPEC-071)
2
+ // ---------------------------------------------------------------------------
3
+ // Built-in templates
4
+ // ---------------------------------------------------------------------------
5
+ /**
6
+ * sdd-full: Full SDD workflow automation.
7
+ * Validates spec on creation, logs when done.
8
+ */
9
+ const SDD_FULL_TEMPLATE = {
10
+ name: 'sdd-full',
11
+ description: 'Full SDD workflow: validate on creation, audit on done',
12
+ hooks: [
13
+ {
14
+ name: 'Auto-validate on spec creation',
15
+ description: 'Runs validate tool whenever a new spec is created',
16
+ trigger: 'on_spec_created',
17
+ actions: [
18
+ {
19
+ type: 'run_tool',
20
+ tool: 'validate',
21
+ args: {},
22
+ },
23
+ ],
24
+ enabled: true,
25
+ },
26
+ {
27
+ name: 'Log spec completion',
28
+ description: 'Logs a message when a spec reaches done status',
29
+ trigger: 'on_spec_status_change',
30
+ filter: { toStatus: 'done' },
31
+ actions: [
32
+ {
33
+ type: 'log_message',
34
+ message: 'Spec {{specId}} is now done in project {{projectId}}',
35
+ },
36
+ ],
37
+ enabled: true,
38
+ },
39
+ ],
40
+ };
41
+ /**
42
+ * ci-ready: CI/CD integration hooks.
43
+ * Runs checks on drift detection and commit events.
44
+ */
45
+ const CI_READY_TEMPLATE = {
46
+ name: 'ci-ready',
47
+ description: 'CI/CD integration: alert on drift, notify on commit',
48
+ hooks: [
49
+ {
50
+ name: 'Alert on drift',
51
+ description: 'Logs alert when drift is detected above threshold',
52
+ trigger: 'on_drift_detected',
53
+ actions: [
54
+ {
55
+ type: 'log_message',
56
+ message: 'DRIFT ALERT: spec {{specId}} drift score {{driftScore}} in project {{projectId}}',
57
+ },
58
+ ],
59
+ enabled: true,
60
+ },
61
+ {
62
+ name: 'Log commit events',
63
+ description: 'Records commit information for traceability',
64
+ trigger: 'on_commit',
65
+ actions: [
66
+ {
67
+ type: 'log_message',
68
+ message: 'Commit {{commitHash}} on branch {{branch}}: {{commitMessage}}',
69
+ },
70
+ ],
71
+ enabled: true,
72
+ },
73
+ ],
74
+ };
75
+ /**
76
+ * quality-gate: Enforces quality gates at critical transitions.
77
+ */
78
+ const QUALITY_GATE_TEMPLATE = {
79
+ name: 'quality-gate',
80
+ description: 'Quality gates: audit before implementing, validate on review',
81
+ hooks: [
82
+ {
83
+ name: 'Audit before implementing',
84
+ description: 'Runs audit tool when spec moves to implementing',
85
+ trigger: 'on_spec_status_change',
86
+ filter: { toStatus: 'implementing' },
87
+ actions: [
88
+ {
89
+ type: 'run_tool',
90
+ tool: 'audit',
91
+ args: {},
92
+ },
93
+ ],
94
+ enabled: true,
95
+ },
96
+ {
97
+ name: 'Validate on review',
98
+ description: 'Runs validate tool when spec moves to review',
99
+ trigger: 'on_spec_status_change',
100
+ filter: { toStatus: 'review' },
101
+ actions: [
102
+ {
103
+ type: 'run_tool',
104
+ tool: 'validate',
105
+ args: {},
106
+ },
107
+ ],
108
+ enabled: true,
109
+ },
110
+ ],
111
+ };
112
+ // ---------------------------------------------------------------------------
113
+ // Template registry
114
+ // ---------------------------------------------------------------------------
115
+ const TEMPLATES = {
116
+ 'sdd-full': SDD_FULL_TEMPLATE,
117
+ 'ci-ready': CI_READY_TEMPLATE,
118
+ 'quality-gate': QUALITY_GATE_TEMPLATE,
119
+ };
120
+ /**
121
+ * Return all available template names.
122
+ */
123
+ export function listTemplateNames() {
124
+ return Object.keys(TEMPLATES);
125
+ }
126
+ /**
127
+ * Return a template by name, or undefined if not found.
128
+ */
129
+ export function getTemplate(name) {
130
+ return TEMPLATES[name];
131
+ }
132
+ /**
133
+ * Return all templates.
134
+ */
135
+ export function getAllTemplates() {
136
+ return Object.values(TEMPLATES);
137
+ }
138
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/engine/hooks/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { HookDefinition, HookEventPayload, HookEventPayloadSpecCreated, HookEventPayloadStatusChange, HookEventPayloadDriftDetected, HookEventPayloadCommit } from '../../types/index.js';
2
+ /**
3
+ * Build the payload for on_spec_created events.
4
+ */
5
+ export declare function buildSpecCreatedPayload(projectId: string, specId: string, specTitle: string, specType: string): HookEventPayloadSpecCreated;
6
+ /**
7
+ * Build the payload for on_spec_status_change events.
8
+ */
9
+ export declare function buildStatusChangePayload(projectId: string, specId: string, specTitle: string, fromStatus: string, toStatus: string): HookEventPayloadStatusChange;
10
+ /**
11
+ * Build the payload for on_drift_detected events.
12
+ */
13
+ export declare function buildDriftDetectedPayload(projectId: string, specId: string, driftScore: number, driftSummary: string): HookEventPayloadDriftDetected;
14
+ /**
15
+ * Build the payload for on_commit events.
16
+ */
17
+ export declare function buildCommitPayload(projectId: string, commitHash: string, commitMessage: string, branch: string): HookEventPayloadCommit;
18
+ /**
19
+ * Check whether a hook's filter conditions are satisfied by the given payload.
20
+ * Returns true when the hook should fire (no filter = always fires).
21
+ */
22
+ export declare function matchesFilter(hook: HookDefinition, payload: HookEventPayload): boolean;
23
+ /**
24
+ * Simple glob matching: supports * wildcard (matches any character sequence).
25
+ */
26
+ export declare function matchesGlob(value: string, pattern: string): boolean;
27
+ //# sourceMappingURL=triggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/triggers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,2BAA2B,CAS7B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,4BAA4B,CAU9B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,6BAA6B,CAS/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,sBAAsB,CASxB;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAuBtF;AAiBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGnE"}
@@ -0,0 +1,104 @@
1
+ // engine/hooks/triggers.ts — Event matching logic and payload construction (SPEC-071)
2
+ // ---------------------------------------------------------------------------
3
+ // Payload constructors
4
+ // ---------------------------------------------------------------------------
5
+ /**
6
+ * Build the payload for on_spec_created events.
7
+ */
8
+ export function buildSpecCreatedPayload(projectId, specId, specTitle, specType) {
9
+ return {
10
+ trigger: 'on_spec_created',
11
+ projectId,
12
+ specId,
13
+ specTitle,
14
+ specType,
15
+ timestamp: new Date().toISOString(),
16
+ };
17
+ }
18
+ /**
19
+ * Build the payload for on_spec_status_change events.
20
+ */
21
+ export function buildStatusChangePayload(projectId, specId, specTitle, fromStatus, toStatus) {
22
+ return {
23
+ trigger: 'on_spec_status_change',
24
+ projectId,
25
+ specId,
26
+ specTitle,
27
+ fromStatus,
28
+ toStatus,
29
+ timestamp: new Date().toISOString(),
30
+ };
31
+ }
32
+ /**
33
+ * Build the payload for on_drift_detected events.
34
+ */
35
+ export function buildDriftDetectedPayload(projectId, specId, driftScore, driftSummary) {
36
+ return {
37
+ trigger: 'on_drift_detected',
38
+ projectId,
39
+ specId,
40
+ driftScore,
41
+ driftSummary,
42
+ timestamp: new Date().toISOString(),
43
+ };
44
+ }
45
+ /**
46
+ * Build the payload for on_commit events.
47
+ */
48
+ export function buildCommitPayload(projectId, commitHash, commitMessage, branch) {
49
+ return {
50
+ trigger: 'on_commit',
51
+ projectId,
52
+ commitHash,
53
+ commitMessage,
54
+ branch,
55
+ timestamp: new Date().toISOString(),
56
+ };
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Filter matching
60
+ // ---------------------------------------------------------------------------
61
+ /**
62
+ * Check whether a hook's filter conditions are satisfied by the given payload.
63
+ * Returns true when the hook should fire (no filter = always fires).
64
+ */
65
+ export function matchesFilter(hook, payload) {
66
+ const filter = hook.filter;
67
+ if (!filter) {
68
+ return true;
69
+ }
70
+ if (payload.trigger === 'on_spec_status_change') {
71
+ if (filter.fromStatus !== undefined && filter.fromStatus !== payload.fromStatus) {
72
+ return false;
73
+ }
74
+ if (filter.toStatus !== undefined && filter.toStatus !== payload.toStatus) {
75
+ return false;
76
+ }
77
+ }
78
+ if (filter.specIdPattern !== undefined) {
79
+ const specId = getSpecIdFromPayload(payload);
80
+ if (specId !== null && !matchesGlob(specId, filter.specIdPattern)) {
81
+ return false;
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Helpers
88
+ // ---------------------------------------------------------------------------
89
+ function getSpecIdFromPayload(payload) {
90
+ if (payload.trigger === 'on_spec_created' ||
91
+ payload.trigger === 'on_spec_status_change' ||
92
+ payload.trigger === 'on_drift_detected') {
93
+ return payload.specId;
94
+ }
95
+ return null;
96
+ }
97
+ /**
98
+ * Simple glob matching: supports * wildcard (matches any character sequence).
99
+ */
100
+ export function matchesGlob(value, pattern) {
101
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
102
+ return new RegExp(`^${escaped}$`).test(value);
103
+ }
104
+ //# sourceMappingURL=triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/engine/hooks/triggers.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,5 @@ export declare function checkToolAccess(toolName: string, tier: PricingTier): Li
6
6
  export declare function getTierLimits(tier: PricingTier): TierLimits;
7
7
  export declare function checkLimits(tier: PricingTier, currentCount: number, limitType: 'maxProjects' | 'maxActiveSpecs'): LicenseCheckResult;
8
8
  export declare function isValidationFresh(state: LicenseState): boolean;
9
+ export declare function isInGracePeriod(state: LicenseState): boolean;
9
10
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACX,MAAM,sBAAsB,CAAC;AAa9B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,WAAW,CAK1E;AAqBD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAG9D;AAMD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAa1E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAqBvF;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAG3D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,aAAa,GAAG,gBAAgB,GAC1C,kBAAkB,CAkBpB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAG9D"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACX,MAAM,sBAAsB,CAAC;AAe9B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,WAAW,CAQ1E;AAqBD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAG9D;AAMD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAa1E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAqBvF;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAG3D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,aAAa,GAAG,gBAAgB,GAC1C,kBAAkB,CAkBpB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAG9D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAG5D"}
@@ -1,10 +1,12 @@
1
1
  // engine/license-validator/core.ts — Offline-first license validation logic.
2
2
  // Source of truth: local license state. Remote validation only on activation + every 30 days.
3
3
  import { loadLicensePlans } from './config-loader.js';
4
+ import { verifyMachineFingerprint } from './fingerprint.js';
4
5
  // ---------------------------------------------------------------------------
5
6
  // Constants
6
7
  // ---------------------------------------------------------------------------
7
- const VALIDATION_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
8
+ const VALIDATION_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
9
+ const GRACE_PERIOD_MS = 3 * 24 * 60 * 60 * 1000; // 3 days offline grace
8
10
  // ---------------------------------------------------------------------------
9
11
  // Tier resolution
10
12
  // ---------------------------------------------------------------------------
@@ -12,6 +14,9 @@ export function resolveCurrentTier(state) {
12
14
  if (!state) {
13
15
  return 'free';
14
16
  }
17
+ if (!verifyMachineFingerprint(state.machineFingerprint)) {
18
+ return 'free';
19
+ }
15
20
  return state.tier;
16
21
  }
17
22
  // ---------------------------------------------------------------------------
@@ -107,4 +112,8 @@ export function isValidationFresh(state) {
107
112
  const lastValidated = new Date(state.lastValidatedAt).getTime();
108
113
  return Date.now() - lastValidated < VALIDATION_TTL_MS;
109
114
  }
115
+ export function isInGracePeriod(state) {
116
+ const lastValidated = new Date(state.lastValidatedAt).getTime();
117
+ return Date.now() - lastValidated < VALIDATION_TTL_MS + GRACE_PERIOD_MS;
118
+ }
110
119
  //# sourceMappingURL=core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function computeMachineFingerprint(): string;
2
+ export declare function verifyMachineFingerprint(stored: string | undefined): boolean;
3
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/engine/license-validator/fingerprint.ts"],"names":[],"mappings":"AAMA,wBAAgB,yBAAyB,IAAI,MAAM,CAGlD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAO5E"}
@@ -0,0 +1,17 @@
1
+ // engine/license-validator/fingerprint.ts — Deterministic machine identity for license binding.
2
+ // Uses only node:os and node:crypto — no external deps.
3
+ import { createHash } from 'node:crypto';
4
+ import { arch, hostname, platform, userInfo } from 'node:os';
5
+ export function computeMachineFingerprint() {
6
+ const raw = [hostname(), platform(), arch(), userInfo().username].join('|');
7
+ return createHash('sha256').update(raw).digest('hex');
8
+ }
9
+ export function verifyMachineFingerprint(stored) {
10
+ if (!stored) {
11
+ // Legacy state (pre-hardening) — no fingerprint stored yet.
12
+ // Allow access; fingerprint will be added on next revalidation.
13
+ return true;
14
+ }
15
+ return computeMachineFingerprint() === stored;
16
+ }
17
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/engine/license-validator/fingerprint.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,wDAAwD;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,UAAU,yBAAyB;IACvC,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,4DAA4D;QAC5D,gEAAgE;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,yBAAyB,EAAE,KAAK,MAAM,CAAC;AAChD,CAAC"}
@@ -1,4 +1,5 @@
1
- export { resolveCurrentTier, variantToTier, isToolAllowed, checkToolAccess, getTierLimits, checkLimits, isValidationFresh, } from './license-validator/core.js';
1
+ export { resolveCurrentTier, variantToTier, isToolAllowed, checkToolAccess, getTierLimits, checkLimits, isValidationFresh, isInGracePeriod, } from './license-validator/core.js';
2
2
  export { loadLicensePlans, resetPlanCache } from './license-validator/config-loader.js';
3
3
  export { activateLicense, validateLicense, deactivateLicense, } from './license-validator/lemon-squeezy.js';
4
+ export { computeMachineFingerprint, verifyMachineFingerprint, } from './license-validator/fingerprint.js';
4
5
  //# sourceMappingURL=license-validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"license-validator.d.ts","sourceRoot":"","sources":["../../src/engine/license-validator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAExF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"license-validator.d.ts","sourceRoot":"","sources":["../../src/engine/license-validator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAExF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,oCAAoC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  // engine/license-validator.ts — Barrel re-export for the license validator module.
2
- export { resolveCurrentTier, variantToTier, isToolAllowed, checkToolAccess, getTierLimits, checkLimits, isValidationFresh, } from './license-validator/core.js';
2
+ export { resolveCurrentTier, variantToTier, isToolAllowed, checkToolAccess, getTierLimits, checkLimits, isValidationFresh, isInGracePeriod, } from './license-validator/core.js';
3
3
  export { loadLicensePlans, resetPlanCache } from './license-validator/config-loader.js';
4
4
  export { activateLicense, validateLicense, deactivateLicense, } from './license-validator/lemon-squeezy.js';
5
+ export { computeMachineFingerprint, verifyMachineFingerprint, } from './license-validator/fingerprint.js';
5
6
  //# sourceMappingURL=license-validator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"license-validator.js","sourceRoot":"","sources":["../../src/engine/license-validator.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAExF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"license-validator.js","sourceRoot":"","sources":["../../src/engine/license-validator.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAExF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { RegistryEntry, SpecAccuracyReport, RegistryEnrichment } from '../../types/index.js';
2
+ export type { RegistryEnrichment };
3
+ import { formatReport } from './reporter.js';
4
+ /**
5
+ * Validate spec content against the framework registry.
6
+ * Returns a complete SpecAccuracyReport with issues, score, and stale warnings.
7
+ * This is the primary entry point for the check_spec_accuracy tool.
8
+ *
9
+ * @param specContent Full text of the spec (HU.md or fragment)
10
+ * @param frameworks Optional list of framework IDs to scope the validation;
11
+ * if omitted, frameworks are auto-detected from the text.
12
+ */
13
+ export declare function validateSpecContent(specContent: string, frameworks?: string[]): Promise<SpecAccuracyReport>;
14
+ /**
15
+ * Enrich a documentation response with relevant registry patterns.
16
+ * Used by consult_docs to add guardrail data when answering framework questions.
17
+ *
18
+ * @param topic The topic or question being asked
19
+ * @param framework The framework being queried (e.g. "nextjs")
20
+ */
21
+ export declare function enrichWithRegistry(topic: string, framework: string): Promise<RegistryEnrichment>;
22
+ /**
23
+ * Format a validation report as Markdown.
24
+ * Re-exported from reporter for convenience.
25
+ */
26
+ export { formatReport };
27
+ /**
28
+ * Save a custom registry entry to data/global/registry-custom.json.
29
+ * Custom entries override base entries with the same framework ID.
30
+ */
31
+ export declare function saveCustomEntry(entry: RegistryEntry): Promise<void>;
32
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGlG,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAGnC,OAAO,EAAe,YAAY,EAAE,MAAM,eAAe,CAAC;AAE1D;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAiC7B;AAED;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE"}
@@ -0,0 +1,85 @@
1
+ // engine/registry/core.ts — Orchestrator for spec accuracy validation and doc enrichment
2
+ // Composes loader → matcher → validator → reporter into two public functions.
3
+ import { loadRegistry } from './loader.js';
4
+ import { detectFrameworks, extractReferences, detectUnknownFrameworks } from './matcher.js';
5
+ import { validateReferences } from './validator.js';
6
+ import { buildReport, formatReport } from './reporter.js';
7
+ /**
8
+ * Validate spec content against the framework registry.
9
+ * Returns a complete SpecAccuracyReport with issues, score, and stale warnings.
10
+ * This is the primary entry point for the check_spec_accuracy tool.
11
+ *
12
+ * @param specContent Full text of the spec (HU.md or fragment)
13
+ * @param frameworks Optional list of framework IDs to scope the validation;
14
+ * if omitted, frameworks are auto-detected from the text.
15
+ */
16
+ export async function validateSpecContent(specContent, frameworks) {
17
+ const registry = await loadRegistry();
18
+ // Step 1: Determine which frameworks to check
19
+ const frameworksToCheck = frameworks && frameworks.length > 0
20
+ ? frameworks.filter((f) => registry.has(f))
21
+ : detectFrameworks(specContent, registry);
22
+ // Step 2: Detect frameworks mentioned in the text that are NOT in registry
23
+ const unknownFrameworks = detectUnknownFrameworks(specContent, registry).filter((uf) => !frameworksToCheck.includes(uf));
24
+ // Step 3: Extract API/pattern references
25
+ const references = extractReferences(specContent, frameworksToCheck, registry);
26
+ // Step 4: Validate each reference
27
+ const validationResults = validateReferences(references, registry);
28
+ // Step 5: Build and return report
29
+ return buildReport(validationResults, frameworksToCheck, unknownFrameworks, registry);
30
+ }
31
+ /**
32
+ * Enrich a documentation response with relevant registry patterns.
33
+ * Used by consult_docs to add guardrail data when answering framework questions.
34
+ *
35
+ * @param topic The topic or question being asked
36
+ * @param framework The framework being queried (e.g. "nextjs")
37
+ */
38
+ export async function enrichWithRegistry(topic, framework) {
39
+ const registry = await loadRegistry();
40
+ const normalizedId = framework.toLowerCase();
41
+ const entry = registry.get(normalizedId);
42
+ if (!entry) {
43
+ return { matchedFrameworks: [], correctPatterns: [], deprecatedWarnings: [] };
44
+ }
45
+ const topicLower = topic.toLowerCase();
46
+ // Filter patterns relevant to the topic
47
+ const relevantCorrect = entry.correctPatterns
48
+ .filter((p) => p.pattern.toLowerCase().includes(topicLower) ||
49
+ topicLower.includes(p.pattern.toLowerCase().split(' ')[0] ?? ''))
50
+ .map((p) => p.pattern + (p.example ? `: ${p.example}` : ''));
51
+ const relevantDeprecated = entry.deprecatedPatterns
52
+ .filter((p) => p.pattern.toLowerCase().includes(topicLower) ||
53
+ topicLower.includes(p.replacedBy?.toLowerCase().split(' ')[0] ?? ''))
54
+ .map((p) => `OBSOLETO: ${p.pattern} → Usar: ${p.replacedBy}`);
55
+ return {
56
+ matchedFrameworks: [normalizedId],
57
+ correctPatterns: relevantCorrect,
58
+ deprecatedWarnings: relevantDeprecated,
59
+ };
60
+ }
61
+ /**
62
+ * Format a validation report as Markdown.
63
+ * Re-exported from reporter for convenience.
64
+ */
65
+ export { formatReport };
66
+ /**
67
+ * Save a custom registry entry to data/global/registry-custom.json.
68
+ * Custom entries override base entries with the same framework ID.
69
+ */
70
+ export async function saveCustomEntry(entry) {
71
+ const { readJson, writeJson, globalDataDir } = await import('../../storage/base-store.js');
72
+ const { join } = await import('node:path');
73
+ const filePath = join(globalDataDir(), 'registry-custom.json');
74
+ const store = await readJson(filePath, { entries: [] });
75
+ // Replace existing entry with same framework ID, or append
76
+ const existing = store.entries.findIndex((e) => e.framework === entry.framework);
77
+ if (existing >= 0) {
78
+ store.entries[existing] = entry;
79
+ }
80
+ else {
81
+ store.entries.push(entry);
82
+ }
83
+ await writeJson(filePath, store);
84
+ }
85
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/registry/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { validateSpecContent, enrichWithRegistry, saveCustomEntry, formatReport } from './core.js';
2
+ export { loadBaseRegistry, loadCustomRegistry, loadRegistry } from './loader.js';
3
+ export { detectFrameworks, extractReferences, detectUnknownFrameworks } from './matcher.js';
4
+ export { validateReference, validateReferences, detectStaleEntries } from './validator.js';
5
+ export { buildReport } from './reporter.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ // engine/registry/index.ts — Barrel export for the spec registry engine.
2
+ // Types (RegistryEntry, FrameworkReference, ValidationResult, etc.) live in src/types/registry.ts
3
+ export { validateSpecContent, enrichWithRegistry, saveCustomEntry, formatReport } from './core.js';
4
+ export { loadBaseRegistry, loadCustomRegistry, loadRegistry } from './loader.js';
5
+ export { detectFrameworks, extractReferences, detectUnknownFrameworks } from './matcher.js';
6
+ export { validateReference, validateReferences, detectStaleEntries } from './validator.js';
7
+ export { buildReport } from './reporter.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/registry/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,kGAAkG;AAElG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { RegistryEntry } from '../../types/index.js';
2
+ /**
3
+ * Load all base framework entries from src/config/framework-registry/.
4
+ * Skips index.json and any file that fails to parse.
5
+ */
6
+ export declare function loadBaseRegistry(): Promise<RegistryEntry[]>;
7
+ /**
8
+ * Load user-defined custom registry entries from data/global/registry-custom.json.
9
+ * Returns an empty array when the file does not exist.
10
+ */
11
+ export declare function loadCustomRegistry(): Promise<RegistryEntry[]>;
12
+ /**
13
+ * Load and merge the full registry: base + custom.
14
+ * Custom entries override base entries with the same framework ID.
15
+ * The merged map preserves custom entries for duplicates.
16
+ */
17
+ export declare function loadRegistry(): Promise<Map<string, RegistryEntry>>;
18
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/engine/registry/loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAyC,MAAM,sBAAsB,CAAC;AAuCjG;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAWjE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAGnE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAYxE"}