@planu/cli 0.24.0 → 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 (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,306 @@
1
+ // engine/spec-coverage/criteria-mapper.ts — Extracts acceptance criteria from
2
+ // HU.md and maps test files to each criterion using 3 strategies.
3
+ // ---------------------------------------------------------------------------
4
+ // Stop words for heuristic keyword extraction
5
+ // ---------------------------------------------------------------------------
6
+ const STOP_WORDS = new Set([
7
+ 'the',
8
+ 'a',
9
+ 'an',
10
+ 'is',
11
+ 'are',
12
+ 'was',
13
+ 'were',
14
+ 'be',
15
+ 'been',
16
+ 'being',
17
+ 'have',
18
+ 'has',
19
+ 'had',
20
+ 'do',
21
+ 'does',
22
+ 'did',
23
+ 'will',
24
+ 'would',
25
+ 'could',
26
+ 'should',
27
+ 'may',
28
+ 'might',
29
+ 'shall',
30
+ 'must',
31
+ 'can',
32
+ 'to',
33
+ 'of',
34
+ 'in',
35
+ 'on',
36
+ 'at',
37
+ 'by',
38
+ 'for',
39
+ 'with',
40
+ 'from',
41
+ 'as',
42
+ 'and',
43
+ 'or',
44
+ 'but',
45
+ 'not',
46
+ 'no',
47
+ 'if',
48
+ 'when',
49
+ 'where',
50
+ 'that',
51
+ 'which',
52
+ 'this',
53
+ 'it',
54
+ 'its',
55
+ 'el',
56
+ 'la',
57
+ 'los',
58
+ 'las',
59
+ 'un',
60
+ 'una',
61
+ 'de',
62
+ 'del',
63
+ 'en',
64
+ 'que',
65
+ 'se',
66
+ 'por',
67
+ 'para',
68
+ 'con',
69
+ 'al',
70
+ 'lo',
71
+ 'le',
72
+ 'les',
73
+ 'y',
74
+ 'o',
75
+ ]);
76
+ // ---------------------------------------------------------------------------
77
+ // AC extraction
78
+ // ---------------------------------------------------------------------------
79
+ /**
80
+ * Parses HU.md content and returns a list of acceptance criteria with their
81
+ * identifiers and descriptions. Supports flexible AC formats:
82
+ * - `- [ ] **AC-01**: text`
83
+ * - `- **AC-01**: text`
84
+ * - `AC-01: text`
85
+ * - `- AC-01 text`
86
+ */
87
+ export function extractCriteria(huContent) {
88
+ const criteria = [];
89
+ // Primary pattern: - [ ] **AC-NN**: ... or - **AC-NN**: ...
90
+ const checkboxPattern = /[-*]\s+(?:\[[ xX]\]\s+)?\*{0,2}(AC-\d{2,3})\*{0,2}[:\s]+(.+)/gm;
91
+ // Fallback: plain AC-NN: ... (no list marker)
92
+ const plainPattern = /^(AC-\d{2,3})[:\s]+(.+)/gm;
93
+ const seen = new Set();
94
+ for (const pattern of [checkboxPattern, plainPattern]) {
95
+ let match;
96
+ pattern.lastIndex = 0;
97
+ while ((match = pattern.exec(huContent)) !== null) {
98
+ /* v8 ignore next 2 */
99
+ const acId = match[1] ?? '';
100
+ const rawText = match[2]?.trim() ?? '';
101
+ if (!acId || seen.has(acId)) {
102
+ continue;
103
+ }
104
+ seen.add(acId);
105
+ criteria.push({
106
+ acId,
107
+ description: truncate(rawText, 80),
108
+ rawText,
109
+ });
110
+ }
111
+ }
112
+ // Sort by AC number
113
+ return criteria.sort((a, b) => {
114
+ const numA = parseInt(a.acId.replace('AC-', ''), 10);
115
+ const numB = parseInt(b.acId.replace('AC-', ''), 10);
116
+ return numA - numB;
117
+ });
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // Test-to-criterion mapping
121
+ // ---------------------------------------------------------------------------
122
+ /**
123
+ * Maps a list of test files to a single criterion using the 3 strategies
124
+ * defined in SPEC-068. Returns the full CriterionCoverage for that criterion.
125
+ */
126
+ export function mapTestsToCriterion(criterion, testFiles, testContents, specId) {
127
+ const { acId, description, rawText } = criterion;
128
+ // Strategy 1 — Direct reference (high confidence)
129
+ const directMatches = findDirectReferences(acId, testFiles, testContents);
130
+ if (directMatches.length > 0) {
131
+ return buildResult(acId, description, 'covered', 'direct-reference', directMatches, testFiles);
132
+ }
133
+ // Strategy 2 — Spec reference (medium confidence)
134
+ const specMatches = findSpecReferences(specId, testFiles, testContents);
135
+ if (specMatches.length > 0) {
136
+ return buildResult(acId, description, 'covered', 'spec-reference', specMatches, testFiles);
137
+ }
138
+ // Strategy 3 — Keyword heuristic (low confidence)
139
+ const keywords = extractKeywords(rawText);
140
+ if (keywords.length >= 2) {
141
+ const heuristicMatches = findKeywordMatches(keywords, testFiles, testContents);
142
+ if (heuristicMatches.length > 0) {
143
+ return buildResult(acId, description, 'superficial', 'heuristic', heuristicMatches, testFiles);
144
+ }
145
+ }
146
+ // No match
147
+ return {
148
+ acId,
149
+ description,
150
+ status: 'uncovered',
151
+ tests: [],
152
+ };
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Strategy implementations
156
+ // ---------------------------------------------------------------------------
157
+ /** Strategy 1: look for AC-ID or AC ID (with space or no dash) in test content. */
158
+ function findDirectReferences(acId, testFiles, testContents) {
159
+ const matches = [];
160
+ // Build regex variants: AC-01, AC01, #AC-01, AC 01
161
+ const acNum = acId.replace('AC-', '');
162
+ const pattern = new RegExp(`\\b(?:AC[-\\s]?${acNum}|#AC-?${acNum})\\b`, 'i');
163
+ for (const tf of testFiles) {
164
+ const content = testContents.get(tf.file) ?? '';
165
+ if (!pattern.test(content)) {
166
+ continue;
167
+ }
168
+ // Extract the test name from the first matching line
169
+ const testName = extractTestName(content, pattern);
170
+ matches.push({ file: tf.file, testName, strategy: 'direct-reference' });
171
+ }
172
+ return matches;
173
+ }
174
+ /** Strategy 2: look for SPEC-ID in file path or content. */
175
+ function findSpecReferences(specId, testFiles, testContents) {
176
+ const matches = [];
177
+ const specPattern = new RegExp(`\\b${specId.replace('-', '[-_]?')}\\b`, 'i');
178
+ for (const tf of testFiles) {
179
+ const inPath = specPattern.test(tf.file);
180
+ const content = testContents.get(tf.file) ?? '';
181
+ const inContent = specPattern.test(content);
182
+ if (!inPath && !inContent) {
183
+ continue;
184
+ }
185
+ const testName = inContent ? extractTestName(content, specPattern) : tf.file;
186
+ matches.push({ file: tf.file, testName, strategy: 'spec-reference' });
187
+ }
188
+ return matches;
189
+ }
190
+ /** Strategy 3: match keywords from criterion text against test names in files. */
191
+ function findKeywordMatches(keywords, testFiles, testContents) {
192
+ const matches = [];
193
+ for (const tf of testFiles) {
194
+ const content = testContents.get(tf.file) ?? '';
195
+ // Extract all describe/it/test block names
196
+ const testNames = extractAllTestNames(content);
197
+ const combinedText = [...testNames, tf.file].join(' ').toLowerCase();
198
+ const matchCount = keywords.filter((kw) => combinedText.includes(kw.toLowerCase())).length;
199
+ if (matchCount >= 2) {
200
+ matches.push({
201
+ file: tf.file,
202
+ /* v8 ignore next 1 */
203
+ testName: testNames[0] ?? tf.file,
204
+ strategy: 'heuristic',
205
+ });
206
+ }
207
+ }
208
+ return matches;
209
+ }
210
+ // ---------------------------------------------------------------------------
211
+ // Keyword extraction
212
+ // ---------------------------------------------------------------------------
213
+ /** Extracts 3–5 meaningful keywords from an AC description text. */
214
+ export function extractKeywords(text) {
215
+ const words = text
216
+ .toLowerCase()
217
+ .replace(/[^a-zA-Z0-9\s_àáéíóúñüÀÁÉÍÓÚÑÜ]/g, ' ')
218
+ .split(/\s+/)
219
+ .filter((w) => w.length >= 3 && !STOP_WORDS.has(w));
220
+ // De-duplicate preserving order
221
+ const seen = new Set();
222
+ const unique = [];
223
+ for (const w of words) {
224
+ if (!seen.has(w)) {
225
+ seen.add(w);
226
+ unique.push(w);
227
+ }
228
+ }
229
+ return unique.slice(0, 5);
230
+ }
231
+ // ---------------------------------------------------------------------------
232
+ // Test name extraction helpers
233
+ // ---------------------------------------------------------------------------
234
+ /** Patterns for extracting test block names from source code. */
235
+ const TEST_NAME_PATTERNS = [
236
+ /(?:describe|it|test|context|suite|feature|scenario)\s*\(\s*['"`](.*?)['"`]/g,
237
+ /(?:func\s+Test\w+)\s*\(/g, // Go: func TestXxx(
238
+ /(?:def\s+test_\w+)\s*\(/g, // Python: def test_xxx(
239
+ /#\[test\]\s*(?:fn\s+(\w+))/g, // Rust: #[test] fn name
240
+ /(?:func|fun)\s+(test\w+)\s*\(/gi, // Swift/Kotlin
241
+ ];
242
+ /** Extracts the first matching test name from source code. */
243
+ function extractTestName(content, nearPattern) {
244
+ // Find the line with the pattern match, then look for a nearby test name
245
+ const lines = content.split('\n');
246
+ for (let i = 0; i < lines.length; i++) {
247
+ /* v8 ignore next 1 */
248
+ const line = lines[i] ?? '';
249
+ if (!nearPattern.test(line)) {
250
+ continue;
251
+ }
252
+ // Look in ±5 lines for a test name
253
+ const start = Math.max(0, i - 5);
254
+ const end = Math.min(lines.length - 1, i + 5);
255
+ for (let j = start; j <= end; j++) {
256
+ /* v8 ignore next 1 */
257
+ const nearby = lines[j] ?? '';
258
+ const nameMatch = /(?:describe|it|test|context)\s*\(\s*['"`](.*?)['"`]/.exec(nearby);
259
+ if (nameMatch?.[1]) {
260
+ return nameMatch[1];
261
+ }
262
+ }
263
+ return line.trim().slice(0, 80);
264
+ }
265
+ return '';
266
+ }
267
+ /** Extracts all test/describe block names from source code. */
268
+ function extractAllTestNames(content) {
269
+ const names = [];
270
+ for (const pattern of TEST_NAME_PATTERNS) {
271
+ pattern.lastIndex = 0;
272
+ let match;
273
+ while ((match = pattern.exec(content)) !== null) {
274
+ /* v8 ignore next 1 */
275
+ const name = match[1] ?? match[0];
276
+ /* v8 ignore next 1 */
277
+ if (name) {
278
+ names.push(name);
279
+ }
280
+ }
281
+ }
282
+ return names;
283
+ }
284
+ // ---------------------------------------------------------------------------
285
+ // Result builder
286
+ // ---------------------------------------------------------------------------
287
+ function buildResult(acId, description, status, strategy, rawMatches, testFiles) {
288
+ // Degrade to superficial if ALL matched files are superficial
289
+ const fileSuperficialMap = new Map(testFiles.map((tf) => [tf.file, tf.isSuperficial]));
290
+ const allSuperficial = rawMatches.length > 0 && rawMatches.every((m) => fileSuperficialMap.get(m.file) === true);
291
+ const effectiveStatus = allSuperficial ? 'superficial' : status;
292
+ return {
293
+ acId,
294
+ description,
295
+ status: effectiveStatus,
296
+ strategy,
297
+ tests: rawMatches,
298
+ };
299
+ }
300
+ // ---------------------------------------------------------------------------
301
+ // Helpers
302
+ // ---------------------------------------------------------------------------
303
+ function truncate(text, maxLen) {
304
+ return text.length <= maxLen ? text : text.slice(0, maxLen - 1) + '…';
305
+ }
306
+ //# sourceMappingURL=criteria-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-mapper.js","sourceRoot":"","sources":["../../../src/engine/spec-coverage/criteria-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { analyzeSpecCoverage, loadCoverageStore, calculateGrade } from './core.js';
2
+ export { findTestFiles, detectTestRunners, readTestFileContent } from './test-finder.js';
3
+ export { extractCriteria, mapTestsToCriterion, extractKeywords } from './criteria-mapper.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-coverage/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // engine/spec-coverage/index.ts — Barrel re-export for the spec-coverage engine module.
2
+ export { analyzeSpecCoverage, loadCoverageStore, calculateGrade } from './core.js';
3
+ export { findTestFiles, detectTestRunners, readTestFileContent } from './test-finder.js';
4
+ export { extractCriteria, mapTestsToCriterion, extractKeywords } from './criteria-mapper.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/spec-coverage/index.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { CoverageTestFile, TestRunnerInfo } from '../../types/index.js';
2
+ /**
3
+ * Finds all test files in the given project root using multi-ecosystem
4
+ * naming conventions. Returns an array of TestFile descriptors.
5
+ */
6
+ export declare function findTestFiles(projectPath: string): Promise<readonly CoverageTestFile[]>;
7
+ /**
8
+ * Detects test runners present in the project by checking for config files.
9
+ * Returns only runners whose config files actually exist.
10
+ */
11
+ export declare function detectTestRunners(projectPath: string): Promise<readonly TestRunnerInfo[]>;
12
+ /**
13
+ * Reads a test file and returns its full content as a string.
14
+ * Returns empty string if the file cannot be read.
15
+ */
16
+ export declare function readTestFileContent(projectPath: string, relFile: string): Promise<string>;
17
+ //# sourceMappingURL=test-finder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-finder.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-coverage/test-finder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAyG7E;;;GAGG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAyC7F;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAiC/F;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/F"}
@@ -0,0 +1,250 @@
1
+ // engine/spec-coverage/test-finder.ts — Finds test files in a project using
2
+ // multi-ecosystem naming conventions. Pure I/O, no analysis logic.
3
+ import { readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { glob } from 'glob';
6
+ // ---------------------------------------------------------------------------
7
+ // Ecosystem glob patterns
8
+ // ---------------------------------------------------------------------------
9
+ const ECOSYSTEM_PATTERNS = [
10
+ {
11
+ ecosystem: 'typescript',
12
+ patterns: ['**/*.test.ts', '**/*.spec.ts', '**/*.test.js', '**/*.spec.js'],
13
+ },
14
+ { ecosystem: 'python', patterns: ['**/*_test.py', '**/test_*.py'] },
15
+ { ecosystem: 'go', patterns: ['**/*_test.go'] },
16
+ {
17
+ ecosystem: 'java',
18
+ patterns: ['**/*Test.java', '**/*Tests.java'],
19
+ },
20
+ {
21
+ ecosystem: 'kotlin',
22
+ patterns: ['**/*Test.kt', '**/*Tests.kt', '**/*Spec.kt'],
23
+ },
24
+ { ecosystem: 'swift', patterns: ['**/*Tests.swift', '**/*Spec.swift'] },
25
+ { ecosystem: 'csharp', patterns: ['**/*Tests.cs', '**/*Test.cs', '**/*Spec.cs'] },
26
+ { ecosystem: 'php', patterns: ['**/*Test.php'] },
27
+ { ecosystem: 'ruby', patterns: ['**/*_spec.rb', '**/*_test.rb'] },
28
+ ];
29
+ /** Directories to ignore when scanning (node_modules, build artifacts, etc.) */
30
+ const IGNORE_DIRS = [
31
+ '**/node_modules/**',
32
+ '**/dist/**',
33
+ '**/build/**',
34
+ '**/.git/**',
35
+ '**/vendor/**',
36
+ '**/.cache/**',
37
+ '**/__pycache__/**',
38
+ '**/target/**',
39
+ ];
40
+ // ---------------------------------------------------------------------------
41
+ // Superficial test detection patterns
42
+ // ---------------------------------------------------------------------------
43
+ /** Regex patterns that indicate a test body has no real assertions. */
44
+ const SUPERFICIAL_PATTERNS = [
45
+ /\btodo!\s*\(/, // Rust: todo!()
46
+ /^\s*pass\s*$/m, // Python: pass as only statement
47
+ /\bpending\s*\(/, // JS/TS: pending()
48
+ /\bxit\s*\(/, // JS/TS: xit(
49
+ /\bxdescribe\s*\(/, // JS/TS: xdescribe(
50
+ /test\.skip\s*\(/, // JS/TS: test.skip(
51
+ /it\.skip\s*\(/, // JS/TS: it.skip(
52
+ /describe\.skip\s*\(/, // JS/TS: describe.skip(
53
+ /@Ignore\b/, // Java: @Ignore
54
+ /\bt\.Skip\s*\(/, // Go: t.Skip(
55
+ /\bskip\s+"[^"]*"/, // Ruby: skip "reason"
56
+ /\bXCTSkip\b/, // Swift: XCTSkip
57
+ /\[Ignore\]/, // C#: [Ignore]
58
+ ];
59
+ // ---------------------------------------------------------------------------
60
+ // Runner detection config
61
+ // ---------------------------------------------------------------------------
62
+ const RUNNER_DETECTORS = [
63
+ {
64
+ name: 'vitest',
65
+ ecosystem: 'typescript',
66
+ configFiles: ['vitest.config.ts', 'vitest.config.js', 'vitest.config.mts'],
67
+ },
68
+ {
69
+ name: 'jest',
70
+ ecosystem: 'typescript',
71
+ configFiles: ['jest.config.ts', 'jest.config.js', 'jest.config.cjs'],
72
+ },
73
+ {
74
+ name: 'pytest',
75
+ ecosystem: 'python',
76
+ configFiles: ['pytest.ini', 'pyproject.toml', 'setup.cfg'],
77
+ },
78
+ { name: 'go test', ecosystem: 'go', configFiles: ['go.mod'] },
79
+ { name: 'cargo test', ecosystem: 'rust', configFiles: ['Cargo.toml'] },
80
+ {
81
+ name: 'junit',
82
+ ecosystem: 'java',
83
+ configFiles: ['pom.xml', 'build.gradle', 'build.gradle.kts'],
84
+ },
85
+ { name: 'xctest', ecosystem: 'swift', configFiles: ['Package.swift'] },
86
+ {
87
+ name: 'phpunit',
88
+ ecosystem: 'php',
89
+ configFiles: ['phpunit.xml', 'phpunit.xml.dist', 'composer.json'],
90
+ },
91
+ { name: 'rspec', ecosystem: 'ruby', configFiles: ['.rspec', 'Gemfile'] },
92
+ { name: 'xunit', ecosystem: 'csharp', configFiles: ['*.csproj', '*.sln'] },
93
+ ];
94
+ // ---------------------------------------------------------------------------
95
+ // Public API
96
+ // ---------------------------------------------------------------------------
97
+ /**
98
+ * Finds all test files in the given project root using multi-ecosystem
99
+ * naming conventions. Returns an array of TestFile descriptors.
100
+ */
101
+ export async function findTestFiles(projectPath) {
102
+ const results = [];
103
+ const seen = new Set();
104
+ for (const { ecosystem, patterns } of ECOSYSTEM_PATTERNS) {
105
+ for (const pattern of patterns) {
106
+ let matches;
107
+ try {
108
+ matches = await glob(pattern, {
109
+ cwd: projectPath,
110
+ ignore: IGNORE_DIRS,
111
+ absolute: false,
112
+ maxDepth: 12,
113
+ nodir: true,
114
+ });
115
+ /* v8 ignore start */
116
+ }
117
+ catch {
118
+ continue;
119
+ }
120
+ /* v8 ignore stop */
121
+ for (const relFile of matches) {
122
+ if (seen.has(relFile)) {
123
+ /* v8 ignore next 1 */
124
+ continue;
125
+ }
126
+ seen.add(relFile);
127
+ const absFile = join(projectPath, relFile);
128
+ const isSuperficial = await detectSuperficialTest(absFile, ecosystem);
129
+ results.push({ file: relFile, ecosystem, isSuperficial });
130
+ }
131
+ }
132
+ }
133
+ // Special-case: Rust files with #[cfg(test)] block
134
+ const rustFiles = await findRustTestFiles(projectPath, seen);
135
+ results.push(...rustFiles);
136
+ return results;
137
+ }
138
+ /**
139
+ * Detects test runners present in the project by checking for config files.
140
+ * Returns only runners whose config files actually exist.
141
+ */
142
+ export async function detectTestRunners(projectPath) {
143
+ const runners = [];
144
+ for (const { name, ecosystem, configFiles } of RUNNER_DETECTORS) {
145
+ for (const configFile of configFiles) {
146
+ // Support glob patterns in configFiles (e.g., "*.csproj")
147
+ if (configFile.includes('*')) {
148
+ const matches = await glob(configFile, {
149
+ cwd: projectPath,
150
+ nodir: true,
151
+ maxDepth: 2,
152
+ }).catch(/* v8 ignore next 1 */ () => []);
153
+ if (matches.length > 0) {
154
+ runners.push({ name, ecosystem, configFile: matches[0] ?? configFile });
155
+ break;
156
+ }
157
+ }
158
+ else {
159
+ let exists = false;
160
+ try {
161
+ await readFile(join(projectPath, configFile), 'utf-8');
162
+ exists = true;
163
+ }
164
+ catch {
165
+ // File not found — try next config file
166
+ }
167
+ if (exists) {
168
+ runners.push({ name, ecosystem, configFile });
169
+ break;
170
+ }
171
+ }
172
+ }
173
+ }
174
+ return runners;
175
+ }
176
+ /**
177
+ * Reads a test file and returns its full content as a string.
178
+ * Returns empty string if the file cannot be read.
179
+ */
180
+ export async function readTestFileContent(projectPath, relFile) {
181
+ try {
182
+ return await readFile(join(projectPath, relFile), 'utf-8');
183
+ }
184
+ catch {
185
+ return '';
186
+ }
187
+ }
188
+ // ---------------------------------------------------------------------------
189
+ // Internal helpers
190
+ // ---------------------------------------------------------------------------
191
+ /** Returns true if the test file appears to contain only superficial tests. */
192
+ async function detectSuperficialTest(absFile, _ecosystem) {
193
+ let content;
194
+ try {
195
+ content = await readFile(absFile, 'utf-8');
196
+ /* v8 ignore start */
197
+ }
198
+ catch {
199
+ return false;
200
+ }
201
+ /* v8 ignore stop */
202
+ for (const pattern of SUPERFICIAL_PATTERNS) {
203
+ if (pattern.test(content)) {
204
+ return true;
205
+ }
206
+ }
207
+ return false;
208
+ }
209
+ /** Finds Rust source files that contain a #[cfg(test)] block. */
210
+ async function findRustTestFiles(projectPath, seen) {
211
+ const results = [];
212
+ let rustFiles;
213
+ try {
214
+ rustFiles = await glob('**/*.rs', {
215
+ cwd: projectPath,
216
+ ignore: IGNORE_DIRS,
217
+ maxDepth: 12,
218
+ nodir: true,
219
+ });
220
+ /* v8 ignore start */
221
+ }
222
+ catch {
223
+ return results;
224
+ }
225
+ /* v8 ignore stop */
226
+ for (const relFile of rustFiles) {
227
+ /* v8 ignore start */
228
+ if (seen.has(relFile)) {
229
+ continue;
230
+ }
231
+ /* v8 ignore stop */
232
+ const absFile = join(projectPath, relFile);
233
+ let content;
234
+ try {
235
+ content = await readFile(absFile, 'utf-8');
236
+ /* v8 ignore start */
237
+ }
238
+ catch {
239
+ continue;
240
+ }
241
+ /* v8 ignore stop */
242
+ if (content.includes('#[cfg(test)]')) {
243
+ seen.add(relFile);
244
+ const isSuperficial = SUPERFICIAL_PATTERNS.some((p) => p.test(content));
245
+ results.push({ file: relFile, ecosystem: 'rust', isSuperficial });
246
+ }
247
+ }
248
+ return results;
249
+ }
250
+ //# sourceMappingURL=test-finder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-finder.js","sourceRoot":"","sources":["../../../src/engine/spec-coverage/test-finder.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,kBAAkB,GAAkE;IACxF;QACE,SAAS,EAAE,YAAY;QACvB,QAAQ,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC;KAC3E;IACD,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE;IACnE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE;IAC/C;QACE,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;KAC9C;IACD;QACE,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC;KACzD;IACD,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,EAAE;IACvE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE;IACjF,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE;IAChD,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE;CAClE,CAAC;AAEF,gFAAgF;AAChF,MAAM,WAAW,GAAG;IAClB,oBAAoB;IACpB,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,cAAc;IACd,cAAc;IACd,mBAAmB;IACnB,cAAc;CACf,CAAC;AAEF,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,uEAAuE;AACvE,MAAM,oBAAoB,GAAG;IAC3B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iCAAiC;IAClD,gBAAgB,EAAE,mBAAmB;IACrC,YAAY,EAAE,cAAc;IAC5B,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,oBAAoB;IACvC,eAAe,EAAE,kBAAkB;IACnC,qBAAqB,EAAE,wBAAwB;IAC/C,WAAW,EAAE,gBAAgB;IAC7B,gBAAgB,EAAE,cAAc;IAChC,kBAAkB,EAAE,sBAAsB;IAC1C,aAAa,EAAE,iBAAiB;IAChC,YAAY,EAAE,eAAe;CAC9B,CAAC;AAEF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,gBAAgB,GAIhB;IACJ;QACE,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;KAC3E;IACD;QACE,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;KACrE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,WAAW,CAAC;KAC3D;IACD,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC7D,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,YAAY,CAAC,EAAE;IACtE;QACE,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,kBAAkB,CAAC;KAC7D;IACD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE;IACtE;QACE,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,CAAC,aAAa,EAAE,kBAAkB,EAAE,eAAe,CAAC;KAClE;IACD,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;IACxE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;CAC3E,CAAC;AAEF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;oBAC5B,GAAG,EAAE,WAAW;oBAChB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,KAAK;oBACf,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBACH,qBAAqB;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,oBAAoB;YAEpB,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtB,sBAAsB;oBACtB,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAElB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC3C,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAEtE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAChE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,0DAA0D;YAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;oBACrC,GAAG,EAAE,WAAW;oBAChB,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,CAAC;iBACZ,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;oBACxE,MAAM;gBACR,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;oBACvD,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;gBAC1C,CAAC;gBACD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC9C,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAe;IAC5E,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,+EAA+E;AAC/E,KAAK,UAAU,qBAAqB,CAAC,OAAe,EAAE,UAAkB;IACtE,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,qBAAqB;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,oBAAoB;IAEpB,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iEAAiE;AACjE,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,IAAiB;IAEjB,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,IAAI,SAAmB,CAAC;IAExB,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;YAChC,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,qBAAqB;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,oBAAoB;IAEpB,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,qBAAqB;QACrB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,oBAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,qBAAqB;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,oBAAoB;QAEpB,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SpecTemplateEntry } from '../../types/spec-templates.js';
2
+ /** Extra built-in spec templates (data, security, performance). */
3
+ export declare const EXTRA_TEMPLATES: SpecTemplateEntry[];
4
+ //# sourceMappingURL=catalog-extra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-extra.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-templates/catalog-extra.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,iBAAiB,EA0W9C,CAAC"}