vaspera 2.9.2 → 2.10.1

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 (327) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +58 -1
  3. package/dist/__tests__/autofix/branch-manager.test.d.ts +2 -0
  4. package/dist/__tests__/autofix/branch-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/autofix/branch-manager.test.js +60 -0
  6. package/dist/__tests__/autofix/branch-manager.test.js.map +1 -0
  7. package/dist/__tests__/autofix/commit-generator.test.d.ts +2 -0
  8. package/dist/__tests__/autofix/commit-generator.test.d.ts.map +1 -0
  9. package/dist/__tests__/autofix/commit-generator.test.js +147 -0
  10. package/dist/__tests__/autofix/commit-generator.test.js.map +1 -0
  11. package/dist/__tests__/autofix/constitution.test.d.ts +9 -0
  12. package/dist/__tests__/autofix/constitution.test.d.ts.map +1 -0
  13. package/dist/__tests__/autofix/constitution.test.js +421 -0
  14. package/dist/__tests__/autofix/constitution.test.js.map +1 -0
  15. package/dist/__tests__/autofix/pr-generator.test.d.ts +2 -0
  16. package/dist/__tests__/autofix/pr-generator.test.d.ts.map +1 -0
  17. package/dist/__tests__/autofix/pr-generator.test.js +152 -0
  18. package/dist/__tests__/autofix/pr-generator.test.js.map +1 -0
  19. package/dist/__tests__/property-test-helpers.d.ts +87 -0
  20. package/dist/__tests__/property-test-helpers.d.ts.map +1 -0
  21. package/dist/__tests__/property-test-helpers.js +136 -0
  22. package/dist/__tests__/property-test-helpers.js.map +1 -0
  23. package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts +2 -0
  24. package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
  25. package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
  26. package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
  27. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
  28. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
  29. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
  30. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
  31. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
  32. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
  33. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
  34. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
  35. package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
  36. package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
  37. package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
  38. package/dist/__tests__/scanners/ai-code/index.test.js.map +1 -0
  39. package/dist/__tests__/scanners/dast/index.test.d.ts +2 -0
  40. package/dist/__tests__/scanners/dast/index.test.d.ts.map +1 -0
  41. package/dist/__tests__/scanners/dast/index.test.js +183 -0
  42. package/dist/__tests__/scanners/dast/index.test.js.map +1 -0
  43. package/dist/__tests__/scanners/dast/nuclei.test.d.ts +2 -0
  44. package/dist/__tests__/scanners/dast/nuclei.test.d.ts.map +1 -0
  45. package/dist/__tests__/scanners/dast/nuclei.test.js +166 -0
  46. package/dist/__tests__/scanners/dast/nuclei.test.js.map +1 -0
  47. package/dist/__tests__/scanners/dast/zap.test.d.ts +2 -0
  48. package/dist/__tests__/scanners/dast/zap.test.d.ts.map +1 -0
  49. package/dist/__tests__/scanners/dast/zap.test.js +158 -0
  50. package/dist/__tests__/scanners/dast/zap.test.js.map +1 -0
  51. package/dist/__tests__/scanners/deploy/health-checker.test.d.ts +2 -0
  52. package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
  53. package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
  54. package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
  55. package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
  56. package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
  57. package/dist/__tests__/scanners/deploy/index.test.js +84 -0
  58. package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
  59. package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
  60. package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
  61. package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
  62. package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
  63. package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
  64. package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
  65. package/dist/__tests__/scanners/deploy/types.test.js +126 -0
  66. package/dist/__tests__/scanners/deploy/types.test.js.map +1 -0
  67. package/dist/__tests__/scanners/fp-feedback.test.d.ts +2 -0
  68. package/dist/__tests__/scanners/fp-feedback.test.d.ts.map +1 -0
  69. package/dist/__tests__/scanners/fp-feedback.test.js +202 -0
  70. package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -0
  71. package/dist/__tests__/scanners/fp-filter.property.test.d.ts +9 -0
  72. package/dist/__tests__/scanners/fp-filter.property.test.d.ts.map +1 -0
  73. package/dist/__tests__/scanners/fp-filter.property.test.js +253 -0
  74. package/dist/__tests__/scanners/fp-filter.property.test.js.map +1 -0
  75. package/dist/__tests__/scanners/fp-filter.test.d.ts +2 -0
  76. package/dist/__tests__/scanners/fp-filter.test.d.ts.map +1 -0
  77. package/dist/__tests__/scanners/fp-filter.test.js +234 -0
  78. package/dist/__tests__/scanners/fp-filter.test.js.map +1 -0
  79. package/dist/__tests__/scanners/fp-tracker.test.d.ts +2 -0
  80. package/dist/__tests__/scanners/fp-tracker.test.d.ts.map +1 -0
  81. package/dist/__tests__/scanners/fp-tracker.test.js +262 -0
  82. package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -0
  83. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts +10 -0
  84. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts.map +1 -0
  85. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js +238 -0
  86. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js.map +1 -0
  87. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts +2 -0
  88. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts.map +1 -0
  89. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js +55 -0
  90. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js.map +1 -0
  91. package/dist/__tests__/scanners/logic/index.test.d.ts +2 -0
  92. package/dist/__tests__/scanners/logic/index.test.d.ts.map +1 -0
  93. package/dist/__tests__/scanners/logic/index.test.js +165 -0
  94. package/dist/__tests__/scanners/logic/index.test.js.map +1 -0
  95. package/dist/__tests__/scanners/logic/types.test.d.ts +2 -0
  96. package/dist/__tests__/scanners/logic/types.test.d.ts.map +1 -0
  97. package/dist/__tests__/scanners/logic/types.test.js +85 -0
  98. package/dist/__tests__/scanners/logic/types.test.js.map +1 -0
  99. package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
  100. package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
  101. package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
  102. package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
  103. package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
  104. package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
  105. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
  106. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
  107. package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
  108. package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
  109. package/dist/__tests__/scanners/runtime/index.test.js +120 -0
  110. package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
  111. package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
  112. package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
  113. package/dist/__tests__/scanners/runtime/types.test.js +126 -0
  114. package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
  115. package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
  116. package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
  117. package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
  118. package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
  119. package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
  120. package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
  121. package/dist/__tests__/scanners/scale/index.test.js +87 -0
  122. package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
  123. package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
  124. package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
  125. package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
  126. package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
  127. package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
  128. package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
  129. package/dist/__tests__/scanners/scale/types.test.js +129 -0
  130. package/dist/__tests__/scanners/scale/types.test.js.map +1 -0
  131. package/dist/action/pr-comment.test.js +4 -0
  132. package/dist/action/pr-comment.test.js.map +1 -1
  133. package/dist/action/sarif-upload.test.js +4 -0
  134. package/dist/action/sarif-upload.test.js.map +1 -1
  135. package/dist/autofix/branch-manager.d.ts +115 -0
  136. package/dist/autofix/branch-manager.d.ts.map +1 -0
  137. package/dist/autofix/branch-manager.js +308 -0
  138. package/dist/autofix/branch-manager.js.map +1 -0
  139. package/dist/autofix/commit-generator.d.ts +55 -0
  140. package/dist/autofix/commit-generator.d.ts.map +1 -0
  141. package/dist/autofix/commit-generator.js +277 -0
  142. package/dist/autofix/commit-generator.js.map +1 -0
  143. package/dist/autofix/constitution.d.ts +77 -0
  144. package/dist/autofix/constitution.d.ts.map +1 -0
  145. package/dist/autofix/constitution.js +261 -0
  146. package/dist/autofix/constitution.js.map +1 -0
  147. package/dist/autofix/constitution.schema.d.ts +441 -0
  148. package/dist/autofix/constitution.schema.d.ts.map +1 -0
  149. package/dist/autofix/constitution.schema.js +144 -0
  150. package/dist/autofix/constitution.schema.js.map +1 -0
  151. package/dist/autofix/index.d.ts +13 -0
  152. package/dist/autofix/index.d.ts.map +1 -0
  153. package/dist/autofix/index.js +15 -0
  154. package/dist/autofix/index.js.map +1 -0
  155. package/dist/autofix/pr-generator.d.ts +57 -0
  156. package/dist/autofix/pr-generator.d.ts.map +1 -0
  157. package/dist/autofix/pr-generator.js +597 -0
  158. package/dist/autofix/pr-generator.js.map +1 -0
  159. package/dist/autofix/types.d.ts +151 -0
  160. package/dist/autofix/types.d.ts.map +1 -0
  161. package/dist/autofix/types.js +22 -0
  162. package/dist/autofix/types.js.map +1 -0
  163. package/dist/eval/fixtures.d.ts +20 -0
  164. package/dist/eval/fixtures.d.ts.map +1 -1
  165. package/dist/eval/fixtures.js +430 -0
  166. package/dist/eval/fixtures.js.map +1 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +874 -0
  169. package/dist/index.js.map +1 -1
  170. package/dist/install-skills.d.ts +11 -0
  171. package/dist/install-skills.d.ts.map +1 -0
  172. package/dist/install-skills.js +81 -0
  173. package/dist/install-skills.js.map +1 -0
  174. package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
  175. package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
  176. package/dist/scanners/ai-code/ai-detector.js +192 -0
  177. package/dist/scanners/ai-code/ai-detector.js.map +1 -0
  178. package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
  179. package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
  180. package/dist/scanners/ai-code/confidence-scorer.js +148 -0
  181. package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
  182. package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
  183. package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
  184. package/dist/scanners/ai-code/hallucination-checker.js +298 -0
  185. package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
  186. package/dist/scanners/ai-code/index.d.ts +30 -0
  187. package/dist/scanners/ai-code/index.d.ts.map +1 -0
  188. package/dist/scanners/ai-code/index.js +224 -0
  189. package/dist/scanners/ai-code/index.js.map +1 -0
  190. package/dist/scanners/ai-code/types.d.ts +192 -0
  191. package/dist/scanners/ai-code/types.d.ts.map +1 -0
  192. package/dist/scanners/ai-code/types.js +37 -0
  193. package/dist/scanners/ai-code/types.js.map +1 -0
  194. package/dist/scanners/cache.d.ts.map +1 -1
  195. package/dist/scanners/cache.js +4 -0
  196. package/dist/scanners/cache.js.map +1 -1
  197. package/dist/scanners/dast/index.d.ts +39 -0
  198. package/dist/scanners/dast/index.d.ts.map +1 -0
  199. package/dist/scanners/dast/index.js +259 -0
  200. package/dist/scanners/dast/index.js.map +1 -0
  201. package/dist/scanners/dast/nuclei.d.ts +26 -0
  202. package/dist/scanners/dast/nuclei.d.ts.map +1 -0
  203. package/dist/scanners/dast/nuclei.js +354 -0
  204. package/dist/scanners/dast/nuclei.js.map +1 -0
  205. package/dist/scanners/dast/types.d.ts +306 -0
  206. package/dist/scanners/dast/types.d.ts.map +1 -0
  207. package/dist/scanners/dast/types.js +52 -0
  208. package/dist/scanners/dast/types.js.map +1 -0
  209. package/dist/scanners/dast/zap.d.ts +26 -0
  210. package/dist/scanners/dast/zap.d.ts.map +1 -0
  211. package/dist/scanners/dast/zap.js +453 -0
  212. package/dist/scanners/dast/zap.js.map +1 -0
  213. package/dist/scanners/deploy/health-checker.d.ts +38 -0
  214. package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
  215. package/dist/scanners/deploy/health-checker.js +272 -0
  216. package/dist/scanners/deploy/health-checker.js.map +1 -0
  217. package/dist/scanners/deploy/index.d.ts +44 -0
  218. package/dist/scanners/deploy/index.d.ts.map +1 -0
  219. package/dist/scanners/deploy/index.js +208 -0
  220. package/dist/scanners/deploy/index.js.map +1 -0
  221. package/dist/scanners/deploy/provider-detector.d.ts +25 -0
  222. package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
  223. package/dist/scanners/deploy/provider-detector.js +177 -0
  224. package/dist/scanners/deploy/provider-detector.js.map +1 -0
  225. package/dist/scanners/deploy/types.d.ts +406 -0
  226. package/dist/scanners/deploy/types.d.ts.map +1 -0
  227. package/dist/scanners/deploy/types.js +58 -0
  228. package/dist/scanners/deploy/types.js.map +1 -0
  229. package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
  230. package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
  231. package/dist/scanners/deploy/vercel-integration.js +280 -0
  232. package/dist/scanners/deploy/vercel-integration.js.map +1 -0
  233. package/dist/scanners/fp-feedback.d.ts +140 -0
  234. package/dist/scanners/fp-feedback.d.ts.map +1 -0
  235. package/dist/scanners/fp-feedback.js +292 -0
  236. package/dist/scanners/fp-feedback.js.map +1 -0
  237. package/dist/scanners/fp-filter.d.ts +94 -0
  238. package/dist/scanners/fp-filter.d.ts.map +1 -0
  239. package/dist/scanners/fp-filter.js +397 -0
  240. package/dist/scanners/fp-filter.js.map +1 -0
  241. package/dist/scanners/fp-tracker.d.ts +125 -0
  242. package/dist/scanners/fp-tracker.d.ts.map +1 -0
  243. package/dist/scanners/fp-tracker.js +330 -0
  244. package/dist/scanners/fp-tracker.js.map +1 -0
  245. package/dist/scanners/index.d.ts.map +1 -1
  246. package/dist/scanners/index.js +56 -0
  247. package/dist/scanners/index.js.map +1 -1
  248. package/dist/scanners/index.test.js +6 -6
  249. package/dist/scanners/index.test.js.map +1 -1
  250. package/dist/scanners/logic/auth-flow-analyzer.d.ts +18 -0
  251. package/dist/scanners/logic/auth-flow-analyzer.d.ts.map +1 -0
  252. package/dist/scanners/logic/auth-flow-analyzer.js +384 -0
  253. package/dist/scanners/logic/auth-flow-analyzer.js.map +1 -0
  254. package/dist/scanners/logic/endpoint-analyzer.d.ts +29 -0
  255. package/dist/scanners/logic/endpoint-analyzer.d.ts.map +1 -0
  256. package/dist/scanners/logic/endpoint-analyzer.js +528 -0
  257. package/dist/scanners/logic/endpoint-analyzer.js.map +1 -0
  258. package/dist/scanners/logic/index.d.ts +41 -0
  259. package/dist/scanners/logic/index.d.ts.map +1 -0
  260. package/dist/scanners/logic/index.js +268 -0
  261. package/dist/scanners/logic/index.js.map +1 -0
  262. package/dist/scanners/logic/types.d.ts +254 -0
  263. package/dist/scanners/logic/types.d.ts.map +1 -0
  264. package/dist/scanners/logic/types.js +142 -0
  265. package/dist/scanners/logic/types.js.map +1 -0
  266. package/dist/scanners/runtime/app-launcher.d.ts +33 -0
  267. package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
  268. package/dist/scanners/runtime/app-launcher.js +419 -0
  269. package/dist/scanners/runtime/app-launcher.js.map +1 -0
  270. package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
  271. package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
  272. package/dist/scanners/runtime/golden-path-runner.js +373 -0
  273. package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
  274. package/dist/scanners/runtime/index.d.ts +41 -0
  275. package/dist/scanners/runtime/index.d.ts.map +1 -0
  276. package/dist/scanners/runtime/index.js +164 -0
  277. package/dist/scanners/runtime/index.js.map +1 -0
  278. package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
  279. package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
  280. package/dist/scanners/runtime/playwright-executor.js +387 -0
  281. package/dist/scanners/runtime/playwright-executor.js.map +1 -0
  282. package/dist/scanners/runtime/types.d.ts +215 -0
  283. package/dist/scanners/runtime/types.d.ts.map +1 -0
  284. package/dist/scanners/runtime/types.js +40 -0
  285. package/dist/scanners/runtime/types.js.map +1 -0
  286. package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
  287. package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
  288. package/dist/scanners/scale/bottleneck-detector.js +250 -0
  289. package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
  290. package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
  291. package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
  292. package/dist/scanners/scale/capacity-estimator.js +197 -0
  293. package/dist/scanners/scale/capacity-estimator.js.map +1 -0
  294. package/dist/scanners/scale/index.d.ts +37 -0
  295. package/dist/scanners/scale/index.d.ts.map +1 -0
  296. package/dist/scanners/scale/index.js +101 -0
  297. package/dist/scanners/scale/index.js.map +1 -0
  298. package/dist/scanners/scale/load-profiler.d.ts +48 -0
  299. package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
  300. package/dist/scanners/scale/load-profiler.js +377 -0
  301. package/dist/scanners/scale/load-profiler.js.map +1 -0
  302. package/dist/scanners/scale/types.d.ts +529 -0
  303. package/dist/scanners/scale/types.d.ts.map +1 -0
  304. package/dist/scanners/scale/types.js +57 -0
  305. package/dist/scanners/scale/types.js.map +1 -0
  306. package/dist/scanners/secrets.d.ts.map +1 -1
  307. package/dist/scanners/secrets.js +13 -2
  308. package/dist/scanners/secrets.js.map +1 -1
  309. package/dist/scanners/types.d.ts +1 -1
  310. package/dist/scanners/types.d.ts.map +1 -1
  311. package/dist/scanners/types.js +4 -0
  312. package/dist/scanners/types.js.map +1 -1
  313. package/package.json +8 -4
  314. package/skills/vaspera-add-tests/SKILL.md +102 -0
  315. package/skills/vaspera-ai-verify/SKILL.md +166 -0
  316. package/skills/vaspera-audit/SKILL.md +67 -0
  317. package/skills/vaspera-certify/SKILL.md +130 -0
  318. package/skills/vaspera-deploy/SKILL.md +152 -0
  319. package/skills/vaspera-fix-critical/SKILL.md +52 -0
  320. package/skills/vaspera-fix-high/SKILL.md +81 -0
  321. package/skills/vaspera-fix-medium/SKILL.md +56 -0
  322. package/skills/vaspera-fix-rls/SKILL.md +85 -0
  323. package/skills/vaspera-harden/SKILL.md +102 -0
  324. package/skills/vaspera-help/SKILL.md +61 -0
  325. package/skills/vaspera-load-test/SKILL.md +167 -0
  326. package/skills/vaspera-verify/SKILL.md +70 -0
  327. package/skills/vaspera-verify-e2e/SKILL.md +117 -0
@@ -0,0 +1,94 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { join } from "path";
3
+ import { mkdir, writeFile, rm } from "fs/promises";
4
+ import { tmpdir } from "os";
5
+ import { detectFramework, getRunningApps, stopAllApps, } from "../../../scanners/runtime/app-launcher.js";
6
+ describe("app-launcher", () => {
7
+ let testDir;
8
+ beforeEach(async () => {
9
+ testDir = join(tmpdir(), `runtime-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
10
+ await mkdir(testDir, { recursive: true });
11
+ });
12
+ afterEach(async () => {
13
+ await stopAllApps();
14
+ await rm(testDir, { recursive: true, force: true });
15
+ });
16
+ describe("detectFramework", () => {
17
+ it("detects Next.js from next.config.js", async () => {
18
+ await writeFile(join(testDir, "next.config.js"), "module.exports = {}");
19
+ await writeFile(join(testDir, "package.json"), JSON.stringify({ dependencies: { next: "14.0.0" } }));
20
+ const result = await detectFramework(testDir);
21
+ expect(result.framework).toBe("nextjs");
22
+ expect(result.confidence).toBeGreaterThan(50);
23
+ expect(result.devCommand).toBe("npm run dev");
24
+ expect(result.port).toBe(3000);
25
+ });
26
+ it("detects Vite from vite.config.ts", async () => {
27
+ await writeFile(join(testDir, "vite.config.ts"), "export default {}");
28
+ await writeFile(join(testDir, "package.json"), JSON.stringify({ devDependencies: { vite: "5.0.0" } }));
29
+ const result = await detectFramework(testDir);
30
+ expect(result.framework).toBe("vite");
31
+ expect(result.confidence).toBeGreaterThan(50);
32
+ expect(result.port).toBe(5173);
33
+ });
34
+ it("detects Express from package.json", async () => {
35
+ await writeFile(join(testDir, "server.js"), "const express = require('express')");
36
+ await writeFile(join(testDir, "package.json"), JSON.stringify({ dependencies: { express: "4.18.0" } }));
37
+ const result = await detectFramework(testDir);
38
+ expect(result.framework).toBe("express");
39
+ expect(result.healthEndpoint).toBe("/health");
40
+ });
41
+ it("detects FastAPI from requirements.txt", async () => {
42
+ await writeFile(join(testDir, "main.py"), "from fastapi import FastAPI");
43
+ await writeFile(join(testDir, "requirements.txt"), "fastapi\nuvicorn");
44
+ const result = await detectFramework(testDir);
45
+ expect(result.framework).toBe("fastapi");
46
+ expect(result.port).toBe(8000);
47
+ expect(result.devCommand).toBe("uvicorn main:app --reload");
48
+ });
49
+ it("detects Flask from requirements.txt", async () => {
50
+ await writeFile(join(testDir, "app.py"), "from flask import Flask");
51
+ await writeFile(join(testDir, "requirements.txt"), "flask\ngunicorn");
52
+ const result = await detectFramework(testDir);
53
+ expect(result.framework).toBe("flask");
54
+ expect(result.port).toBe(5000);
55
+ });
56
+ it("detects Django from manage.py", async () => {
57
+ await writeFile(join(testDir, "manage.py"), "#!/usr/bin/env python");
58
+ await writeFile(join(testDir, "requirements.txt"), "django");
59
+ const result = await detectFramework(testDir);
60
+ expect(result.framework).toBe("django");
61
+ expect(result.port).toBe(8000);
62
+ });
63
+ it("returns unknown for empty directory", async () => {
64
+ const result = await detectFramework(testDir);
65
+ expect(result.framework).toBe("unknown");
66
+ expect(result.confidence).toBe(0);
67
+ });
68
+ it("includes indicators in detection result", async () => {
69
+ await writeFile(join(testDir, "next.config.js"), "module.exports = {}");
70
+ await writeFile(join(testDir, "package.json"), JSON.stringify({ dependencies: { next: "14.0.0" } }));
71
+ const result = await detectFramework(testDir);
72
+ expect(result.indicators).toContain("Found next.config.js");
73
+ expect(result.indicators).toContain("Found next in package.json");
74
+ });
75
+ it("extracts version from package.json", async () => {
76
+ await writeFile(join(testDir, "next.config.js"), "module.exports = {}");
77
+ await writeFile(join(testDir, "package.json"), JSON.stringify({ dependencies: { next: "^14.2.3" } }));
78
+ const result = await detectFramework(testDir);
79
+ expect(result.version).toBe("14.2.3");
80
+ });
81
+ it("handles malformed package.json gracefully", async () => {
82
+ await writeFile(join(testDir, "package.json"), "not json");
83
+ const result = await detectFramework(testDir);
84
+ expect(result.framework).toBe("unknown");
85
+ });
86
+ });
87
+ describe("getRunningApps", () => {
88
+ it("returns empty array when no apps running", () => {
89
+ const apps = getRunningApps();
90
+ expect(apps).toEqual([]);
91
+ });
92
+ });
93
+ });
94
+ //# sourceMappingURL=app-launcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-launcher.test.js","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/app-launcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=golden-path-runner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"golden-path-runner.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/golden-path-runner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,195 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { join } from "path";
3
+ import { mkdir, writeFile, rm, readFile } from "fs/promises";
4
+ import { tmpdir } from "os";
5
+ import { loadFlow, discoverFlows, generateSampleFlow, runFlow, } from "../../../scanners/runtime/golden-path-runner.js";
6
+ describe("golden-path-runner", () => {
7
+ let testDir;
8
+ beforeEach(async () => {
9
+ testDir = join(tmpdir(), `golden-path-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
10
+ await mkdir(testDir, { recursive: true });
11
+ });
12
+ afterEach(async () => {
13
+ await rm(testDir, { recursive: true, force: true });
14
+ });
15
+ describe("loadFlow", () => {
16
+ it("loads a valid YAML flow", async () => {
17
+ const flowContent = `
18
+ name: "test-flow"
19
+ description: "A test flow"
20
+ priority: high
21
+ steps:
22
+ - action: navigate
23
+ url: "/"
24
+ - action: assert
25
+ url: "/"
26
+ `;
27
+ const flowPath = join(testDir, "test.yaml");
28
+ await writeFile(flowPath, flowContent);
29
+ const flow = await loadFlow(flowPath);
30
+ expect(flow.name).toBe("test-flow");
31
+ expect(flow.priority).toBe("high");
32
+ expect(flow.steps).toHaveLength(2);
33
+ });
34
+ it("throws on invalid YAML", async () => {
35
+ const flowPath = join(testDir, "invalid.yaml");
36
+ await writeFile(flowPath, "invalid: yaml: content:");
37
+ await expect(loadFlow(flowPath)).rejects.toThrow();
38
+ });
39
+ it("throws on schema validation failure", async () => {
40
+ const flowContent = `
41
+ name: "test"
42
+ priority: "invalid-priority"
43
+ steps: []
44
+ `;
45
+ const flowPath = join(testDir, "invalid-schema.yaml");
46
+ await writeFile(flowPath, flowContent);
47
+ await expect(loadFlow(flowPath)).rejects.toThrow();
48
+ });
49
+ });
50
+ describe("discoverFlows", () => {
51
+ it("discovers all flows in .vaspera/flows/", async () => {
52
+ const flowsDir = join(testDir, ".vaspera/flows");
53
+ await mkdir(flowsDir, { recursive: true });
54
+ const flow1 = `name: "flow1"\nsteps:\n - action: navigate\n url: "/"`;
55
+ const flow2 = `name: "flow2"\nsteps:\n - action: navigate\n url: "/about"`;
56
+ await writeFile(join(flowsDir, "flow1.yaml"), flow1);
57
+ await writeFile(join(flowsDir, "flow2.yml"), flow2);
58
+ const flows = await discoverFlows(testDir);
59
+ expect(flows).toHaveLength(2);
60
+ expect(flows.map((f) => f.flow.name).sort()).toEqual(["flow1", "flow2"]);
61
+ });
62
+ it("returns empty array when no flows directory", async () => {
63
+ const flows = await discoverFlows(testDir);
64
+ expect(flows).toEqual([]);
65
+ });
66
+ it("skips invalid flow files", async () => {
67
+ const flowsDir = join(testDir, ".vaspera/flows");
68
+ await mkdir(flowsDir, { recursive: true });
69
+ const validFlow = `name: "valid"\nsteps:\n - action: navigate\n url: "/"`;
70
+ const invalidFlow = `name: 123\nsteps: "not an array"`;
71
+ await writeFile(join(flowsDir, "valid.yaml"), validFlow);
72
+ await writeFile(join(flowsDir, "invalid.yaml"), invalidFlow);
73
+ const flows = await discoverFlows(testDir);
74
+ expect(flows).toHaveLength(1);
75
+ expect(flows[0].flow.name).toBe("valid");
76
+ });
77
+ it("ignores non-yaml files", async () => {
78
+ const flowsDir = join(testDir, ".vaspera/flows");
79
+ await mkdir(flowsDir, { recursive: true });
80
+ await writeFile(join(flowsDir, "flow.yaml"), `name: "flow"\nsteps:\n - action: wait\n timeout: 100`);
81
+ await writeFile(join(flowsDir, "readme.md"), "# README");
82
+ await writeFile(join(flowsDir, "config.json"), "{}");
83
+ const flows = await discoverFlows(testDir);
84
+ expect(flows).toHaveLength(1);
85
+ });
86
+ });
87
+ describe("generateSampleFlow", () => {
88
+ it("creates a sample flow file", async () => {
89
+ const flowPath = await generateSampleFlow(testDir, "checkout");
90
+ expect(flowPath).toBe(join(testDir, ".vaspera/flows/checkout.yaml"));
91
+ const content = await readFile(flowPath, "utf-8");
92
+ expect(content).toContain('name: "checkout"');
93
+ expect(content).toContain("action: navigate");
94
+ });
95
+ it("creates flows directory if not exists", async () => {
96
+ await generateSampleFlow(testDir, "test");
97
+ const flows = await discoverFlows(testDir);
98
+ expect(flows).toHaveLength(1);
99
+ });
100
+ it("uses default name when not specified", async () => {
101
+ const flowPath = await generateSampleFlow(testDir);
102
+ expect(flowPath).toContain("sample.yaml");
103
+ });
104
+ });
105
+ describe("runFlow", () => {
106
+ it("executes navigate step successfully", async () => {
107
+ const flow = {
108
+ name: "navigate-test",
109
+ priority: "medium",
110
+ steps: [
111
+ { action: "navigate", url: "/" },
112
+ ],
113
+ };
114
+ const result = await runFlow(flow, "http://example.com");
115
+ expect(result.flowName).toBe("navigate-test");
116
+ expect(result.totalSteps).toBe(1);
117
+ expect(result.steps[0].action).toBe("navigate");
118
+ });
119
+ it("executes wait step", async () => {
120
+ const flow = {
121
+ name: "wait-test",
122
+ priority: "medium",
123
+ steps: [
124
+ { action: "wait", timeout: 100 },
125
+ ],
126
+ };
127
+ const startTime = Date.now();
128
+ const result = await runFlow(flow, "http://example.com");
129
+ const elapsed = Date.now() - startTime;
130
+ expect(result.success).toBe(true);
131
+ expect(elapsed).toBeGreaterThanOrEqual(100);
132
+ });
133
+ it("marks Playwright-required actions as skipped", async () => {
134
+ const flow = {
135
+ name: "playwright-test",
136
+ priority: "medium",
137
+ steps: [
138
+ { action: "click", selector: "#button" },
139
+ { action: "fill", selector: "#input", value: "test" },
140
+ { action: "screenshot" },
141
+ ],
142
+ };
143
+ const result = await runFlow(flow, "http://example.com");
144
+ expect(result.success).toBe(true);
145
+ for (const step of result.steps) {
146
+ expect(step.error).toContain("Playwright");
147
+ expect(step.error).toContain("skipped");
148
+ }
149
+ });
150
+ it("stops on failure and marks remaining as skipped", async () => {
151
+ const flow = {
152
+ name: "failure-test",
153
+ priority: "medium",
154
+ steps: [
155
+ { action: "navigate", url: "/" },
156
+ { action: "navigate", url: "http://localhost:99999/nonexistent" },
157
+ { action: "wait", timeout: 100 },
158
+ ],
159
+ };
160
+ const result = await runFlow(flow, "http://example.com");
161
+ expect(result.success).toBe(false);
162
+ expect(result.failedSteps).toBeGreaterThan(0);
163
+ const lastStep = result.steps[result.steps.length - 1];
164
+ expect(lastStep.error).toContain("previous failure");
165
+ });
166
+ it("calculates step durations", async () => {
167
+ const flow = {
168
+ name: "duration-test",
169
+ priority: "medium",
170
+ steps: [
171
+ { action: "wait", timeout: 50 },
172
+ ],
173
+ };
174
+ const result = await runFlow(flow, "http://example.com");
175
+ expect(result.steps[0].duration).toBeGreaterThanOrEqual(45);
176
+ expect(result.duration).toBeGreaterThanOrEqual(45);
177
+ });
178
+ it("handles URL assertion", async () => {
179
+ const flow = {
180
+ name: "assert-test",
181
+ priority: "medium",
182
+ steps: [
183
+ { action: "navigate", url: "/" },
184
+ { action: "assert", url: "example.com" },
185
+ ],
186
+ };
187
+ const result = await runFlow(flow, "http://example.com");
188
+ const assertStep = result.steps[1];
189
+ expect(assertStep.action).toBe("assert");
190
+ expect(assertStep.assertion).toBeDefined();
191
+ expect(assertStep.assertion?.passed).toBe(true);
192
+ });
193
+ });
194
+ });
195
+ //# sourceMappingURL=golden-path-runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"golden-path-runner.test.js","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/golden-path-runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { join } from "path";
3
+ import { mkdir, writeFile, rm } from "fs/promises";
4
+ import { tmpdir } from "os";
5
+ import { detectFramework, launchApp, stopApp, stopAllApps, getRunningApps, discoverFlows, runFlow, runAllFlows, generateSampleFlow, loadFlow, } from "../../../scanners/runtime/index.js";
6
+ describe("runtime module exports", () => {
7
+ it("exports detectFramework", () => {
8
+ expect(typeof detectFramework).toBe("function");
9
+ });
10
+ it("exports launchApp", () => {
11
+ expect(typeof launchApp).toBe("function");
12
+ });
13
+ it("exports stopApp", () => {
14
+ expect(typeof stopApp).toBe("function");
15
+ });
16
+ it("exports stopAllApps", () => {
17
+ expect(typeof stopAllApps).toBe("function");
18
+ });
19
+ it("exports getRunningApps", () => {
20
+ expect(typeof getRunningApps).toBe("function");
21
+ });
22
+ it("exports discoverFlows", () => {
23
+ expect(typeof discoverFlows).toBe("function");
24
+ });
25
+ it("exports runFlow", () => {
26
+ expect(typeof runFlow).toBe("function");
27
+ });
28
+ it("exports runAllFlows", () => {
29
+ expect(typeof runAllFlows).toBe("function");
30
+ });
31
+ it("exports generateSampleFlow", () => {
32
+ expect(typeof generateSampleFlow).toBe("function");
33
+ });
34
+ it("exports loadFlow", () => {
35
+ expect(typeof loadFlow).toBe("function");
36
+ });
37
+ });
38
+ describe("runtime integration", () => {
39
+ let testDir;
40
+ beforeEach(async () => {
41
+ testDir = join(tmpdir(), `runtime-integration-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
42
+ await mkdir(testDir, { recursive: true });
43
+ });
44
+ afterEach(async () => {
45
+ await stopAllApps();
46
+ await rm(testDir, { recursive: true, force: true });
47
+ });
48
+ describe("flow discovery and execution", () => {
49
+ it("discovers and runs all flows in project", async () => {
50
+ const flowsDir = join(testDir, ".vaspera/flows");
51
+ await mkdir(flowsDir, { recursive: true });
52
+ const flow1 = `
53
+ name: "health"
54
+ priority: critical
55
+ steps:
56
+ - action: wait
57
+ timeout: 50
58
+ `;
59
+ const flow2 = `
60
+ name: "smoke"
61
+ priority: high
62
+ steps:
63
+ - action: wait
64
+ timeout: 50
65
+ `;
66
+ await writeFile(join(flowsDir, "health.yaml"), flow1);
67
+ await writeFile(join(flowsDir, "smoke.yaml"), flow2);
68
+ const results = await runAllFlows(testDir, "http://localhost:3000");
69
+ expect(results).toHaveLength(2);
70
+ const names = results.map((r) => r.flowName);
71
+ expect(names).toContain("health");
72
+ expect(names).toContain("smoke");
73
+ });
74
+ it("filters flows by priority", async () => {
75
+ const flowsDir = join(testDir, ".vaspera/flows");
76
+ await mkdir(flowsDir, { recursive: true });
77
+ const critical = `name: "critical"\npriority: critical\nsteps:\n - action: wait\n timeout: 10`;
78
+ const high = `name: "high"\npriority: high\nsteps:\n - action: wait\n timeout: 10`;
79
+ const medium = `name: "medium"\npriority: medium\nsteps:\n - action: wait\n timeout: 10`;
80
+ const low = `name: "low"\npriority: low\nsteps:\n - action: wait\n timeout: 10`;
81
+ await writeFile(join(flowsDir, "critical.yaml"), critical);
82
+ await writeFile(join(flowsDir, "high.yaml"), high);
83
+ await writeFile(join(flowsDir, "medium.yaml"), medium);
84
+ await writeFile(join(flowsDir, "low.yaml"), low);
85
+ const highAndAbove = await runAllFlows(testDir, "http://localhost:3000", {
86
+ priority: "high",
87
+ });
88
+ expect(highAndAbove).toHaveLength(2);
89
+ const names = highAndAbove.map((r) => r.flowName);
90
+ expect(names).toContain("critical");
91
+ expect(names).toContain("high");
92
+ expect(names).not.toContain("medium");
93
+ expect(names).not.toContain("low");
94
+ });
95
+ it("sorts flows by priority (critical first)", async () => {
96
+ const flowsDir = join(testDir, ".vaspera/flows");
97
+ await mkdir(flowsDir, { recursive: true });
98
+ const low = `name: "low"\npriority: low\nsteps:\n - action: wait\n timeout: 10`;
99
+ const critical = `name: "critical"\npriority: critical\nsteps:\n - action: wait\n timeout: 10`;
100
+ const medium = `name: "medium"\npriority: medium\nsteps:\n - action: wait\n timeout: 10`;
101
+ await writeFile(join(flowsDir, "01-low.yaml"), low);
102
+ await writeFile(join(flowsDir, "02-critical.yaml"), critical);
103
+ await writeFile(join(flowsDir, "03-medium.yaml"), medium);
104
+ const results = await runAllFlows(testDir, "http://localhost:3000");
105
+ expect(results[0].flowName).toBe("critical");
106
+ expect(results[1].flowName).toBe("medium");
107
+ expect(results[2].flowName).toBe("low");
108
+ });
109
+ });
110
+ describe("framework detection integration", () => {
111
+ it("detects framework and suggests correct port", async () => {
112
+ await writeFile(join(testDir, "vite.config.ts"), "export default {}");
113
+ await writeFile(join(testDir, "package.json"), JSON.stringify({ devDependencies: { vite: "5.0.0" } }));
114
+ const detection = await detectFramework(testDir);
115
+ expect(detection.framework).toBe("vite");
116
+ expect(detection.port).toBe(5173);
117
+ });
118
+ });
119
+ });
120
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { GoldenPathFlowSchema } from "../../../scanners/runtime/types.js";
3
+ describe("runtime types", () => {
4
+ describe("GoldenPathFlowSchema", () => {
5
+ it("parses a minimal valid flow", () => {
6
+ const flow = {
7
+ name: "test-flow",
8
+ steps: [
9
+ { action: "navigate", url: "/" },
10
+ ],
11
+ };
12
+ const result = GoldenPathFlowSchema.parse(flow);
13
+ expect(result.name).toBe("test-flow");
14
+ expect(result.priority).toBe("medium");
15
+ expect(result.steps).toHaveLength(1);
16
+ });
17
+ it("parses a full flow with all options", () => {
18
+ const flow = {
19
+ name: "checkout-flow",
20
+ description: "Test the checkout process",
21
+ priority: "critical",
22
+ tags: ["smoke", "e2e"],
23
+ baseUrl: "http://localhost:3000",
24
+ steps: [
25
+ { action: "navigate", url: "/", description: "Go home" },
26
+ { action: "click", selector: "#login", timeout: 5000 },
27
+ { action: "fill", selector: "#email", value: "test@example.com" },
28
+ { action: "api", url: "/api/health", method: "GET" },
29
+ { action: "assert", url: "/dashboard" },
30
+ { action: "wait", timeout: 1000 },
31
+ { action: "screenshot", description: "Final state" },
32
+ ],
33
+ };
34
+ const result = GoldenPathFlowSchema.parse(flow);
35
+ expect(result.name).toBe("checkout-flow");
36
+ expect(result.priority).toBe("critical");
37
+ expect(result.tags).toContain("smoke");
38
+ expect(result.steps).toHaveLength(7);
39
+ });
40
+ it("validates action types", () => {
41
+ const validActions = [
42
+ "navigate",
43
+ "click",
44
+ "fill",
45
+ "select",
46
+ "assert",
47
+ "wait",
48
+ "screenshot",
49
+ "api",
50
+ ];
51
+ for (const action of validActions) {
52
+ const flow = {
53
+ name: "test",
54
+ steps: [{ action }],
55
+ };
56
+ expect(() => GoldenPathFlowSchema.parse(flow)).not.toThrow();
57
+ }
58
+ });
59
+ it("rejects invalid action types", () => {
60
+ const flow = {
61
+ name: "test",
62
+ steps: [{ action: "invalid-action" }],
63
+ };
64
+ expect(() => GoldenPathFlowSchema.parse(flow)).toThrow();
65
+ });
66
+ it("validates priority values", () => {
67
+ const priorities = ["critical", "high", "medium", "low"];
68
+ for (const priority of priorities) {
69
+ const flow = {
70
+ name: "test",
71
+ priority,
72
+ steps: [{ action: "navigate", url: "/" }],
73
+ };
74
+ expect(() => GoldenPathFlowSchema.parse(flow)).not.toThrow();
75
+ }
76
+ });
77
+ it("rejects invalid priority", () => {
78
+ const flow = {
79
+ name: "test",
80
+ priority: "urgent",
81
+ steps: [{ action: "navigate", url: "/" }],
82
+ };
83
+ expect(() => GoldenPathFlowSchema.parse(flow)).toThrow();
84
+ });
85
+ it("validates HTTP methods for API action", () => {
86
+ const methods = ["GET", "POST", "PUT", "DELETE", "PATCH"];
87
+ for (const method of methods) {
88
+ const flow = {
89
+ name: "test",
90
+ steps: [{ action: "api", url: "/api/test", method }],
91
+ };
92
+ expect(() => GoldenPathFlowSchema.parse(flow)).not.toThrow();
93
+ }
94
+ });
95
+ it("allows body and headers for API action", () => {
96
+ const flow = {
97
+ name: "test",
98
+ steps: [
99
+ {
100
+ action: "api",
101
+ url: "/api/create",
102
+ method: "POST",
103
+ body: { name: "test", value: 123 },
104
+ headers: { "X-Custom": "header" },
105
+ },
106
+ ],
107
+ };
108
+ const result = GoldenPathFlowSchema.parse(flow);
109
+ expect(result.steps[0].body).toEqual({ name: "test", value: 123 });
110
+ expect(result.steps[0].headers).toEqual({ "X-Custom": "header" });
111
+ });
112
+ it("requires name field", () => {
113
+ const flow = {
114
+ steps: [{ action: "navigate", url: "/" }],
115
+ };
116
+ expect(() => GoldenPathFlowSchema.parse(flow)).toThrow();
117
+ });
118
+ it("requires steps array", () => {
119
+ const flow = {
120
+ name: "test",
121
+ };
122
+ expect(() => GoldenPathFlowSchema.parse(flow)).toThrow();
123
+ });
124
+ });
125
+ });
126
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../../src/__tests__/scanners/runtime/types.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bottleneck-detector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bottleneck-detector.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/scanners/scale/bottleneck-detector.test.ts"],"names":[],"mappings":""}