@avi770/testteam 1.2.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 (325) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +167 -0
  4. package/agents/01-analyst.ts +100 -0
  5. package/agents/02-seed-architect.ts +59 -0
  6. package/agents/03-test-generator.ts +191 -0
  7. package/agents/04-unit-runner.ts +160 -0
  8. package/agents/05-browser-crawler.ts +790 -0
  9. package/agents/06-api-exerciser.ts +311 -0
  10. package/agents/07-security-scout.ts +188 -0
  11. package/agents/08-a11y-guardian.ts +212 -0
  12. package/agents/09-healer.ts +228 -0
  13. package/agents/10-reporter.ts +266 -0
  14. package/agents/11-fixer.ts +253 -0
  15. package/agents/12-ux-inspector.ts +444 -0
  16. package/agents/13-performance-profiler.ts +271 -0
  17. package/agents/14-data-integrity-auditor.ts +417 -0
  18. package/agents/15-regression-sentinel.ts +307 -0
  19. package/agents/16-chaos-agent.ts +228 -0
  20. package/agents/17-documentation-validator.ts +266 -0
  21. package/agents/18-integration-watchdog.ts +178 -0
  22. package/agents/19-tenant-isolation-auditor.ts +199 -0
  23. package/agents/20-workflow-completion-tester.ts +203 -0
  24. package/agents/21-state-session-tester.ts +262 -0
  25. package/agents/22-email-notification-verifier.ts +244 -0
  26. package/agents/23-migration-tester.ts +80 -0
  27. package/agents/__tests__/01-analyst.test.ts +188 -0
  28. package/agents/__tests__/02-seed-architect.test.ts +152 -0
  29. package/agents/__tests__/03-test-generator-full.test.ts +321 -0
  30. package/agents/__tests__/03-test-generator.test.ts +318 -0
  31. package/agents/__tests__/04-unit-runner.test.ts +320 -0
  32. package/agents/__tests__/05-browser-crawler-beta.test.ts +492 -0
  33. package/agents/__tests__/05-browser-crawler-release.test.ts +412 -0
  34. package/agents/__tests__/05-browser-crawler-uat.test.ts +578 -0
  35. package/agents/__tests__/05-browser-crawler.test.ts +518 -0
  36. package/agents/__tests__/06-api-exerciser.test.ts +619 -0
  37. package/agents/__tests__/07-security-scout.test.ts +382 -0
  38. package/agents/__tests__/08-a11y-guardian.test.ts +530 -0
  39. package/agents/__tests__/09-healer.test.ts +384 -0
  40. package/agents/__tests__/10-reporter.test.ts +366 -0
  41. package/agents/__tests__/11-fixer.test.ts +406 -0
  42. package/agents/__tests__/12-ux-inspector-extended.test.ts +465 -0
  43. package/agents/__tests__/12-ux-inspector.test.ts +443 -0
  44. package/agents/__tests__/13-performance-profiler.test.ts +411 -0
  45. package/agents/__tests__/14-data-integrity-auditor-extended.test.ts +573 -0
  46. package/agents/__tests__/14-data-integrity-auditor.test.ts +407 -0
  47. package/agents/__tests__/15-regression-sentinel.test.ts +657 -0
  48. package/agents/__tests__/16-chaos-agent.test.ts +427 -0
  49. package/agents/__tests__/17-documentation-validator.test.ts +402 -0
  50. package/agents/__tests__/18-integration-watchdog.test.ts +263 -0
  51. package/agents/__tests__/19-tenant-isolation-auditor.test.ts +400 -0
  52. package/agents/__tests__/20-workflow-completion-tester.test.ts +586 -0
  53. package/agents/__tests__/21-state-session-tester.test.ts +374 -0
  54. package/agents/__tests__/22-email-notification-verifier.test.ts +441 -0
  55. package/agents/__tests__/23-migration-tester.test.ts +145 -0
  56. package/agents/__tests__/base-agent.test.ts +188 -0
  57. package/agents/__tests__/registry.test.ts +218 -0
  58. package/agents/base-agent.ts +77 -0
  59. package/agents/registry.ts +136 -0
  60. package/baselines/api-schemas/.gitkeep +0 -0
  61. package/baselines/performance/.gitkeep +0 -0
  62. package/baselines/screenshots/.gitkeep +0 -0
  63. package/bin/testteam.js +10 -0
  64. package/core/__tests__/ci-output.test.ts +430 -0
  65. package/core/__tests__/cli.test.ts +387 -0
  66. package/core/__tests__/config.test.ts +78 -0
  67. package/core/__tests__/cost-tracker.test.ts +158 -0
  68. package/core/__tests__/evidence.test.ts +265 -0
  69. package/core/__tests__/fix-loop.test.ts +210 -0
  70. package/core/__tests__/health-check.test.ts +44 -0
  71. package/core/__tests__/init.test.ts +609 -0
  72. package/core/__tests__/integration.test.ts +204 -0
  73. package/core/__tests__/license-gen.test.ts +227 -0
  74. package/core/__tests__/license.test.ts +326 -0
  75. package/core/__tests__/multi-browser.test.ts +278 -0
  76. package/core/__tests__/orchestrator.test.ts +519 -0
  77. package/core/__tests__/phase-gate.test.ts +43 -0
  78. package/core/__tests__/report-html.test.ts +398 -0
  79. package/core/__tests__/report-upload.test.ts +325 -0
  80. package/core/__tests__/run-counter.test.ts +234 -0
  81. package/core/ci-output.ts +240 -0
  82. package/core/cli.ts +232 -0
  83. package/core/config.ts +178 -0
  84. package/core/cost-tracker.ts +59 -0
  85. package/core/evidence.ts +132 -0
  86. package/core/fix-loop.ts +85 -0
  87. package/core/health-check.ts +54 -0
  88. package/core/init.ts +546 -0
  89. package/core/license-gen.ts +212 -0
  90. package/core/license.ts +211 -0
  91. package/core/messages.ts +67 -0
  92. package/core/multi-browser.ts +136 -0
  93. package/core/orchestrator.ts +354 -0
  94. package/core/phase-gate.ts +55 -0
  95. package/core/report-html.ts +657 -0
  96. package/core/report-upload.ts +188 -0
  97. package/core/run-counter.ts +175 -0
  98. package/core/types.ts +57 -0
  99. package/dist/agents/01-analyst.d.ts +11 -0
  100. package/dist/agents/01-analyst.d.ts.map +1 -0
  101. package/dist/agents/01-analyst.js +75 -0
  102. package/dist/agents/01-analyst.js.map +1 -0
  103. package/dist/agents/02-seed-architect.d.ts +11 -0
  104. package/dist/agents/02-seed-architect.d.ts.map +1 -0
  105. package/dist/agents/02-seed-architect.js +51 -0
  106. package/dist/agents/02-seed-architect.js.map +1 -0
  107. package/dist/agents/03-test-generator.d.ts +9 -0
  108. package/dist/agents/03-test-generator.d.ts.map +1 -0
  109. package/dist/agents/03-test-generator.js +167 -0
  110. package/dist/agents/03-test-generator.js.map +1 -0
  111. package/dist/agents/04-unit-runner.d.ts +9 -0
  112. package/dist/agents/04-unit-runner.d.ts.map +1 -0
  113. package/dist/agents/04-unit-runner.js +113 -0
  114. package/dist/agents/04-unit-runner.js.map +1 -0
  115. package/dist/agents/05-browser-crawler.d.ts +30 -0
  116. package/dist/agents/05-browser-crawler.d.ts.map +1 -0
  117. package/dist/agents/05-browser-crawler.js +685 -0
  118. package/dist/agents/05-browser-crawler.js.map +1 -0
  119. package/dist/agents/06-api-exerciser.d.ts +23 -0
  120. package/dist/agents/06-api-exerciser.d.ts.map +1 -0
  121. package/dist/agents/06-api-exerciser.js +253 -0
  122. package/dist/agents/06-api-exerciser.js.map +1 -0
  123. package/dist/agents/07-security-scout.d.ts +11 -0
  124. package/dist/agents/07-security-scout.d.ts.map +1 -0
  125. package/dist/agents/07-security-scout.js +142 -0
  126. package/dist/agents/07-security-scout.js.map +1 -0
  127. package/dist/agents/08-a11y-guardian.d.ts +13 -0
  128. package/dist/agents/08-a11y-guardian.d.ts.map +1 -0
  129. package/dist/agents/08-a11y-guardian.js +176 -0
  130. package/dist/agents/08-a11y-guardian.js.map +1 -0
  131. package/dist/agents/09-healer.d.ts +33 -0
  132. package/dist/agents/09-healer.d.ts.map +1 -0
  133. package/dist/agents/09-healer.js +167 -0
  134. package/dist/agents/09-healer.js.map +1 -0
  135. package/dist/agents/10-reporter.d.ts +26 -0
  136. package/dist/agents/10-reporter.d.ts.map +1 -0
  137. package/dist/agents/10-reporter.js +215 -0
  138. package/dist/agents/10-reporter.js.map +1 -0
  139. package/dist/agents/11-fixer.d.ts +26 -0
  140. package/dist/agents/11-fixer.d.ts.map +1 -0
  141. package/dist/agents/11-fixer.js +195 -0
  142. package/dist/agents/11-fixer.js.map +1 -0
  143. package/dist/agents/12-ux-inspector.d.ts +15 -0
  144. package/dist/agents/12-ux-inspector.d.ts.map +1 -0
  145. package/dist/agents/12-ux-inspector.js +364 -0
  146. package/dist/agents/12-ux-inspector.js.map +1 -0
  147. package/dist/agents/13-performance-profiler.d.ts +13 -0
  148. package/dist/agents/13-performance-profiler.d.ts.map +1 -0
  149. package/dist/agents/13-performance-profiler.js +216 -0
  150. package/dist/agents/13-performance-profiler.js.map +1 -0
  151. package/dist/agents/14-data-integrity-auditor.d.ts +12 -0
  152. package/dist/agents/14-data-integrity-auditor.d.ts.map +1 -0
  153. package/dist/agents/14-data-integrity-auditor.js +356 -0
  154. package/dist/agents/14-data-integrity-auditor.js.map +1 -0
  155. package/dist/agents/15-regression-sentinel.d.ts +25 -0
  156. package/dist/agents/15-regression-sentinel.d.ts.map +1 -0
  157. package/dist/agents/15-regression-sentinel.js +251 -0
  158. package/dist/agents/15-regression-sentinel.js.map +1 -0
  159. package/dist/agents/16-chaos-agent.d.ts +9 -0
  160. package/dist/agents/16-chaos-agent.d.ts.map +1 -0
  161. package/dist/agents/16-chaos-agent.js +207 -0
  162. package/dist/agents/16-chaos-agent.js.map +1 -0
  163. package/dist/agents/17-documentation-validator.d.ts +31 -0
  164. package/dist/agents/17-documentation-validator.d.ts.map +1 -0
  165. package/dist/agents/17-documentation-validator.js +246 -0
  166. package/dist/agents/17-documentation-validator.js.map +1 -0
  167. package/dist/agents/18-integration-watchdog.d.ts +10 -0
  168. package/dist/agents/18-integration-watchdog.d.ts.map +1 -0
  169. package/dist/agents/18-integration-watchdog.js +138 -0
  170. package/dist/agents/18-integration-watchdog.js.map +1 -0
  171. package/dist/agents/19-tenant-isolation-auditor.d.ts +9 -0
  172. package/dist/agents/19-tenant-isolation-auditor.d.ts.map +1 -0
  173. package/dist/agents/19-tenant-isolation-auditor.js +166 -0
  174. package/dist/agents/19-tenant-isolation-auditor.js.map +1 -0
  175. package/dist/agents/20-workflow-completion-tester.d.ts +12 -0
  176. package/dist/agents/20-workflow-completion-tester.d.ts.map +1 -0
  177. package/dist/agents/20-workflow-completion-tester.js +159 -0
  178. package/dist/agents/20-workflow-completion-tester.js.map +1 -0
  179. package/dist/agents/21-state-session-tester.d.ts +10 -0
  180. package/dist/agents/21-state-session-tester.d.ts.map +1 -0
  181. package/dist/agents/21-state-session-tester.js +233 -0
  182. package/dist/agents/21-state-session-tester.js.map +1 -0
  183. package/dist/agents/22-email-notification-verifier.d.ts +11 -0
  184. package/dist/agents/22-email-notification-verifier.d.ts.map +1 -0
  185. package/dist/agents/22-email-notification-verifier.js +199 -0
  186. package/dist/agents/22-email-notification-verifier.js.map +1 -0
  187. package/dist/agents/23-migration-tester.d.ts +10 -0
  188. package/dist/agents/23-migration-tester.d.ts.map +1 -0
  189. package/dist/agents/23-migration-tester.js +74 -0
  190. package/dist/agents/23-migration-tester.js.map +1 -0
  191. package/dist/agents/base-agent.d.ts +19 -0
  192. package/dist/agents/base-agent.d.ts.map +1 -0
  193. package/dist/agents/base-agent.js +67 -0
  194. package/dist/agents/base-agent.js.map +1 -0
  195. package/dist/agents/registry.d.ts +29 -0
  196. package/dist/agents/registry.d.ts.map +1 -0
  197. package/dist/agents/registry.js +117 -0
  198. package/dist/agents/registry.js.map +1 -0
  199. package/dist/core/ci-output.d.ts +35 -0
  200. package/dist/core/ci-output.d.ts.map +1 -0
  201. package/dist/core/ci-output.js +193 -0
  202. package/dist/core/ci-output.js.map +1 -0
  203. package/dist/core/cli.d.ts +11 -0
  204. package/dist/core/cli.d.ts.map +1 -0
  205. package/dist/core/cli.js +197 -0
  206. package/dist/core/cli.js.map +1 -0
  207. package/dist/core/config.d.ts +111 -0
  208. package/dist/core/config.d.ts.map +1 -0
  209. package/dist/core/config.js +42 -0
  210. package/dist/core/config.js.map +1 -0
  211. package/dist/core/cost-tracker.d.ts +22 -0
  212. package/dist/core/cost-tracker.d.ts.map +1 -0
  213. package/dist/core/cost-tracker.js +41 -0
  214. package/dist/core/cost-tracker.js.map +1 -0
  215. package/dist/core/evidence.d.ts +28 -0
  216. package/dist/core/evidence.d.ts.map +1 -0
  217. package/dist/core/evidence.js +95 -0
  218. package/dist/core/evidence.js.map +1 -0
  219. package/dist/core/fix-loop.d.ts +29 -0
  220. package/dist/core/fix-loop.d.ts.map +1 -0
  221. package/dist/core/fix-loop.js +70 -0
  222. package/dist/core/fix-loop.js.map +1 -0
  223. package/dist/core/health-check.d.ts +21 -0
  224. package/dist/core/health-check.d.ts.map +1 -0
  225. package/dist/core/health-check.js +26 -0
  226. package/dist/core/health-check.js.map +1 -0
  227. package/dist/core/init.d.ts +2 -0
  228. package/dist/core/init.d.ts.map +1 -0
  229. package/dist/core/init.js +435 -0
  230. package/dist/core/init.js.map +1 -0
  231. package/dist/core/license-gen.d.ts +12 -0
  232. package/dist/core/license-gen.d.ts.map +1 -0
  233. package/dist/core/license-gen.js +169 -0
  234. package/dist/core/license-gen.js.map +1 -0
  235. package/dist/core/license.d.ts +33 -0
  236. package/dist/core/license.d.ts.map +1 -0
  237. package/dist/core/license.js +170 -0
  238. package/dist/core/license.js.map +1 -0
  239. package/dist/core/messages.d.ts +10 -0
  240. package/dist/core/messages.d.ts.map +1 -0
  241. package/dist/core/messages.js +47 -0
  242. package/dist/core/messages.js.map +1 -0
  243. package/dist/core/multi-browser.d.ts +36 -0
  244. package/dist/core/multi-browser.d.ts.map +1 -0
  245. package/dist/core/multi-browser.js +88 -0
  246. package/dist/core/multi-browser.js.map +1 -0
  247. package/dist/core/orchestrator.d.ts +48 -0
  248. package/dist/core/orchestrator.d.ts.map +1 -0
  249. package/dist/core/orchestrator.js +291 -0
  250. package/dist/core/orchestrator.js.map +1 -0
  251. package/dist/core/phase-gate.d.ts +4 -0
  252. package/dist/core/phase-gate.d.ts.map +1 -0
  253. package/dist/core/phase-gate.js +39 -0
  254. package/dist/core/phase-gate.js.map +1 -0
  255. package/dist/core/report-html.d.ts +9 -0
  256. package/dist/core/report-html.d.ts.map +1 -0
  257. package/dist/core/report-html.js +617 -0
  258. package/dist/core/report-html.js.map +1 -0
  259. package/dist/core/report-upload.d.ts +16 -0
  260. package/dist/core/report-upload.d.ts.map +1 -0
  261. package/dist/core/report-upload.js +124 -0
  262. package/dist/core/report-upload.js.map +1 -0
  263. package/dist/core/run-counter.d.ts +40 -0
  264. package/dist/core/run-counter.d.ts.map +1 -0
  265. package/dist/core/run-counter.js +120 -0
  266. package/dist/core/run-counter.js.map +1 -0
  267. package/dist/core/types.d.ts +53 -0
  268. package/dist/core/types.d.ts.map +1 -0
  269. package/dist/core/types.js +2 -0
  270. package/dist/core/types.js.map +1 -0
  271. package/dist/helpers/api-client.d.ts +30 -0
  272. package/dist/helpers/api-client.d.ts.map +1 -0
  273. package/dist/helpers/api-client.js +77 -0
  274. package/dist/helpers/api-client.js.map +1 -0
  275. package/dist/helpers/element-discovery.d.ts +18 -0
  276. package/dist/helpers/element-discovery.d.ts.map +1 -0
  277. package/dist/helpers/element-discovery.js +82 -0
  278. package/dist/helpers/element-discovery.js.map +1 -0
  279. package/dist/helpers/env-resolver.d.ts +29 -0
  280. package/dist/helpers/env-resolver.d.ts.map +1 -0
  281. package/dist/helpers/env-resolver.js +51 -0
  282. package/dist/helpers/env-resolver.js.map +1 -0
  283. package/dist/helpers/form-filler.d.ts +13 -0
  284. package/dist/helpers/form-filler.d.ts.map +1 -0
  285. package/dist/helpers/form-filler.js +98 -0
  286. package/dist/helpers/form-filler.js.map +1 -0
  287. package/dist/helpers/modal-handler.d.ts +16 -0
  288. package/dist/helpers/modal-handler.d.ts.map +1 -0
  289. package/dist/helpers/modal-handler.js +95 -0
  290. package/dist/helpers/modal-handler.js.map +1 -0
  291. package/dist/helpers/navigation.d.ts +37 -0
  292. package/dist/helpers/navigation.d.ts.map +1 -0
  293. package/dist/helpers/navigation.js +83 -0
  294. package/dist/helpers/navigation.js.map +1 -0
  295. package/dist/helpers/quality-gate.d.ts +17 -0
  296. package/dist/helpers/quality-gate.d.ts.map +1 -0
  297. package/dist/helpers/quality-gate.js +144 -0
  298. package/dist/helpers/quality-gate.js.map +1 -0
  299. package/dist/helpers/screenshot.d.ts +24 -0
  300. package/dist/helpers/screenshot.d.ts.map +1 -0
  301. package/dist/helpers/screenshot.js +76 -0
  302. package/dist/helpers/screenshot.js.map +1 -0
  303. package/dist/helpers/seed-validator.d.ts +15 -0
  304. package/dist/helpers/seed-validator.d.ts.map +1 -0
  305. package/dist/helpers/seed-validator.js +53 -0
  306. package/dist/helpers/seed-validator.js.map +1 -0
  307. package/helpers/__tests__/api-client.test.ts +199 -0
  308. package/helpers/__tests__/element-discovery.test.ts +202 -0
  309. package/helpers/__tests__/form-filler-extended.test.ts +212 -0
  310. package/helpers/__tests__/form-filler.test.ts +99 -0
  311. package/helpers/__tests__/modal-handler.test.ts +152 -0
  312. package/helpers/__tests__/navigation.test.ts +214 -0
  313. package/helpers/__tests__/quality-gate.test.ts +117 -0
  314. package/helpers/__tests__/screenshot.test.ts +139 -0
  315. package/helpers/__tests__/seed-validator.test.ts +114 -0
  316. package/helpers/api-client.ts +111 -0
  317. package/helpers/element-discovery.ts +105 -0
  318. package/helpers/env-resolver.ts +69 -0
  319. package/helpers/form-filler.ts +126 -0
  320. package/helpers/modal-handler.ts +108 -0
  321. package/helpers/navigation.ts +100 -0
  322. package/helpers/quality-gate.ts +180 -0
  323. package/helpers/screenshot.ts +111 -0
  324. package/helpers/seed-validator.ts +70 -0
  325. package/package.json +88 -0
@@ -0,0 +1,70 @@
1
+ const SECURITY_KEYWORDS = ['xss', 'injection', 'csrf', 'auth-bypass', 'exposure'];
2
+ const COSMETIC_KEYWORDS = ['css', 'aria', 'i18n', 'link', 'alt-text'];
3
+ function isInTestFile(filePath) {
4
+ return filePath.includes('/tests/');
5
+ }
6
+ function hasKeyword(description, keywords) {
7
+ const lower = description.toLowerCase();
8
+ return keywords.some((keyword) => lower.includes(keyword));
9
+ }
10
+ /**
11
+ * Classifies a finding based on its file location and description keywords.
12
+ *
13
+ * Priority order:
14
+ * 1. Test file with unchanged source → test-bug
15
+ * 2. Security keyword in description → code-bug-security
16
+ * 3. Cosmetic keyword in description → code-bug-cosmetic
17
+ * 4. Fallback → code-bug-logic
18
+ */
19
+ export function classifyFinding(finding, changedFiles) {
20
+ const filePath = finding.file ?? '';
21
+ if (filePath !== '' && isInTestFile(filePath) && !changedFiles.includes(filePath)) {
22
+ return 'test-bug';
23
+ }
24
+ if (hasKeyword(finding.description, SECURITY_KEYWORDS)) {
25
+ return 'code-bug-security';
26
+ }
27
+ if (hasKeyword(finding.description, COSMETIC_KEYWORDS)) {
28
+ return 'code-bug-cosmetic';
29
+ }
30
+ return 'code-bug-logic';
31
+ }
32
+ /**
33
+ * Determines whether a finding should be automatically committed without human intervention.
34
+ *
35
+ * UAT phase never auto-commits regardless of finding type.
36
+ * Test bugs always auto-commit (routed to the Healer agent).
37
+ * Cosmetic bugs auto-commit in alpha and beta only.
38
+ * Logic and security bugs never auto-commit (require human gates).
39
+ */
40
+ export function shouldAutoCommit(findingType, phase) {
41
+ // Test bugs always auto-commit — routed to the Healer agent regardless of phase
42
+ if (findingType === 'test-bug') {
43
+ return true;
44
+ }
45
+ // UAT requires human review for all non-test-bug finding types
46
+ if (phase === 'uat') {
47
+ return false;
48
+ }
49
+ if (findingType === 'code-bug-cosmetic') {
50
+ return phase === 'alpha' || phase === 'beta';
51
+ }
52
+ return false;
53
+ }
54
+ /**
55
+ * Determines whether a finding requires human review before any action is taken.
56
+ *
57
+ * Security and logic bugs always require human review.
58
+ * UAT phase requires human review for all finding types.
59
+ * Cosmetic bugs and test bugs in alpha/beta do not require human review.
60
+ */
61
+ export function shouldRequireHumanReview(findingType, phase) {
62
+ if (findingType === 'code-bug-security' || findingType === 'code-bug-logic') {
63
+ return true;
64
+ }
65
+ if (phase === 'uat') {
66
+ return true;
67
+ }
68
+ return false;
69
+ }
70
+ //# sourceMappingURL=fix-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-loop.js","sourceRoot":"","sources":["../../core/fix-loop.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAU,CAAC;AAC3F,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAE/E,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,WAAmB,EAAE,QAA2B;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,YAAsB;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAEpC,IAAI,QAAQ,KAAK,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACvD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACvD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAwB,EAAE,KAAY;IACrE,gFAAgF;IAChF,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+DAA+D;IAC/D,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;QACxC,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAwB,EAAE,KAAY;IAC7E,IAAI,WAAW,KAAK,mBAAmB,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface HealthCheck {
2
+ name: string;
3
+ check: () => Promise<boolean>;
4
+ required: boolean;
5
+ }
6
+ export interface HealthCheckResult {
7
+ name: string;
8
+ passed: boolean;
9
+ required: boolean;
10
+ error?: string;
11
+ durationMs: number;
12
+ }
13
+ export interface HealthCheckSummary {
14
+ canProceed: boolean;
15
+ results: HealthCheckResult[];
16
+ warnings: string[];
17
+ }
18
+ export declare function runHealthChecks({ checks, }: {
19
+ checks: HealthCheck[];
20
+ }): Promise<HealthCheckSummary>;
21
+ //# sourceMappingURL=health-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../core/health-check.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,eAAe,CAAC,EACpC,MAAM,GACP,EAAE;IACD,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6B9B"}
@@ -0,0 +1,26 @@
1
+ export async function runHealthChecks({ checks, }) {
2
+ const results = [];
3
+ const warnings = [];
4
+ for (const { name, check, required } of checks) {
5
+ const start = Date.now();
6
+ let passed = false;
7
+ let error;
8
+ try {
9
+ passed = await check();
10
+ }
11
+ catch (err) {
12
+ passed = false;
13
+ error = err instanceof Error ? err.message : String(err);
14
+ }
15
+ const durationMs = Date.now() - start;
16
+ results.push({ name, passed, required, error, durationMs });
17
+ if (!passed && !required) {
18
+ warnings.push(`Optional check '${name}' failed`);
19
+ }
20
+ }
21
+ const canProceed = results
22
+ .filter((r) => r.required)
23
+ .every((r) => r.passed);
24
+ return { canProceed, results, warnings };
25
+ }
26
+ //# sourceMappingURL=health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../core/health-check.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,MAAM,GAGP;IACC,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,KAAyB,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,KAAK,CAAC;YACf,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,IAAI,UAAU,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACzB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runInitWizard(): Promise<number>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../core/init.ts"],"names":[],"mappings":"AA4VA,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAwKrD"}
@@ -0,0 +1,435 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { readFileSync, mkdirSync, writeFileSync, existsSync } from 'node:fs';
3
+ import { basename, resolve, join } from 'node:path';
4
+ // ── Cancellation sentinel ────────────────────────────────────────────────
5
+ class CancelledError extends Error {
6
+ constructor() {
7
+ super('Setup cancelled.');
8
+ this.name = 'CancelledError';
9
+ }
10
+ }
11
+ // ── Prompt helper ──────────────────────────────────────────────────────────
12
+ function prompt(rl, question, defaultValue) {
13
+ const suffix = defaultValue ? ` (${defaultValue})` : '';
14
+ return new Promise((resolve, reject) => {
15
+ rl.question(`${question}${suffix}: `, (answer) => {
16
+ resolve(answer.trim() || defaultValue);
17
+ });
18
+ rl.once('close', () => reject(new CancelledError()));
19
+ });
20
+ }
21
+ function promptChoice(rl, question, choices, defaultValue) {
22
+ const choiceStr = choices
23
+ .map((c) => (c === defaultValue ? `[${c}]` : c))
24
+ .join(' / ');
25
+ return new Promise((resolve, reject) => {
26
+ rl.question(`${question} ${choiceStr}: `, (answer) => {
27
+ const trimmed = answer.trim().toLowerCase();
28
+ if (trimmed === '') {
29
+ resolve(defaultValue);
30
+ return;
31
+ }
32
+ const match = choices.find((c) => c === trimmed);
33
+ if (match) {
34
+ resolve(match);
35
+ return;
36
+ }
37
+ // Partial match — first choice that starts with the input
38
+ const partial = choices.find((c) => c.startsWith(trimmed));
39
+ resolve(partial ?? defaultValue);
40
+ });
41
+ rl.once('close', () => reject(new CancelledError()));
42
+ });
43
+ }
44
+ function promptYesNo(rl, question, defaultValue) {
45
+ const hint = defaultValue ? '(Y/n)' : '(y/N)';
46
+ return new Promise((resolve, reject) => {
47
+ rl.question(`${question} ${hint}: `, (answer) => {
48
+ const trimmed = answer.trim().toLowerCase();
49
+ if (trimmed === '') {
50
+ resolve(defaultValue);
51
+ return;
52
+ }
53
+ resolve(trimmed === 'y' || trimmed === 'yes');
54
+ });
55
+ rl.once('close', () => reject(new CancelledError()));
56
+ });
57
+ }
58
+ // ── Validation helpers ───────────────────────────────────────────────────
59
+ function isValidUrl(value) {
60
+ return /^https?:\/\/.+/.test(value);
61
+ }
62
+ function readTargetPackageJson(cwd) {
63
+ const pkgPath = join(cwd, 'package.json');
64
+ if (!existsSync(pkgPath)) {
65
+ return null;
66
+ }
67
+ try {
68
+ const raw = readFileSync(pkgPath, 'utf-8');
69
+ return JSON.parse(raw);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ function detectFramework(pkg) {
76
+ if (!pkg)
77
+ return 'generic';
78
+ const all = {
79
+ ...pkg.dependencies,
80
+ ...pkg.devDependencies,
81
+ };
82
+ if ('next' in all)
83
+ return 'next';
84
+ if ('@nestjs/core' in all)
85
+ return 'nestjs';
86
+ if ('@angular/core' in all)
87
+ return 'angular';
88
+ if ('vue' in all)
89
+ return 'vue';
90
+ if ('express' in all)
91
+ return 'express';
92
+ if ('react' in all)
93
+ return 'react';
94
+ return 'generic';
95
+ }
96
+ function detectTestRunner(pkg) {
97
+ if (!pkg)
98
+ return 'none';
99
+ const all = {
100
+ ...pkg.dependencies,
101
+ ...pkg.devDependencies,
102
+ };
103
+ if ('vitest' in all)
104
+ return 'vitest';
105
+ if ('jest' in all)
106
+ return 'jest';
107
+ return 'none';
108
+ }
109
+ // ── Config generation ──────────────────────────────────────────────────────
110
+ function buildConfigSource(answers) {
111
+ const envBlock = buildEnvironmentsBlock(answers);
112
+ const authBlock = buildAuthBlock(answers);
113
+ const tenancyBlock = buildTenancyBlock(answers);
114
+ return `import type { TestTeamConfig } from './core/config';
115
+
116
+ const config: TestTeamConfig = {
117
+ schemaVersion: 1,
118
+ name: '${escapeString(answers.projectName)}',
119
+
120
+ ${authBlock},
121
+
122
+ modules: [
123
+ { id: 'home', route: '/', sidebarIcon: true },
124
+ // Add your app's modules here
125
+ ],
126
+
127
+ ${envBlock},
128
+
129
+ portals: [
130
+ { name: 'main', queryParam: null },
131
+ ],
132
+
133
+ breakpoints: [1920, 1366, 768, 375],
134
+ integrations: [],
135
+ workers: [],
136
+ workflows: [],
137
+
138
+ accuracy: {
139
+ enabled: false,
140
+ decimalPrecision: 2,
141
+ currencySymbol: 'USD',
142
+ timezone: 'UTC',
143
+ },
144
+
145
+ ${tenancyBlock},
146
+
147
+ costBudget: {
148
+ maxPerRun: 50,
149
+ maxPerAgent: 10,
150
+ alertThreshold: 0.8,
151
+ onExceeded: 'abort',
152
+ },
153
+
154
+ agentClassification: {
155
+ blocking: [1, 2, 3, 4, 5, 6, 7, 8, 11, 14, 19, 23],
156
+ advisory: [12, 13, 15, 16, 17, 20, 21, 22],
157
+ },
158
+
159
+ thresholds: {
160
+ unitCoverage: { lines: 80, functions: 80, branches: 70, statements: 80 },
161
+ lighthouse: { accessibility: 90, performance: 85, bestPractices: 85, seo: 80 },
162
+ apiResponseTime: 500,
163
+ bundleSizeLimit: 500,
164
+ maxConsoleErrors: 0,
165
+ },
166
+
167
+ disabledAgents: [],
168
+ };
169
+
170
+ export default config;
171
+ `;
172
+ }
173
+ function escapeString(value) {
174
+ return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
175
+ }
176
+ function buildEnvironmentsBlock(answers) {
177
+ const lines = [' environments: {'];
178
+ lines.push(` alpha: { baseUrl: '${escapeString(answers.alphaUrl)}', seed: true },`);
179
+ if (answers.betaUrl) {
180
+ lines.push(` beta: { baseUrl: '${escapeString(answers.betaUrl)}', seed: false },`);
181
+ }
182
+ if (answers.uatUrl) {
183
+ lines.push(` uat: { baseUrl: '${escapeString(answers.uatUrl)}', seed: false },`);
184
+ }
185
+ lines.push(' }');
186
+ return lines.join('\n');
187
+ }
188
+ function buildAuthBlock(answers) {
189
+ switch (answers.authMethod) {
190
+ case 'form-login':
191
+ return ` auth: {
192
+ loginUrl: '/login',
193
+ credentials: {
194
+ admin: {
195
+ email: process.env.TF_ADMIN_EMAIL ?? '',
196
+ password: process.env.TF_ADMIN_PASSWORD ?? '',
197
+ },
198
+ },
199
+ roles: [
200
+ { name: 'admin', email: process.env.TF_ROLE_ADMIN_EMAIL ?? '' },
201
+ ],
202
+ }`;
203
+ case 'api-token':
204
+ return ` auth: {
205
+ credentials: {
206
+ api: {
207
+ email: process.env.TF_API_EMAIL ?? '',
208
+ password: process.env.TF_API_TOKEN ?? '',
209
+ },
210
+ },
211
+ roles: [],
212
+ }`;
213
+ case 'none':
214
+ return ` auth: {
215
+ credentials: {},
216
+ roles: [],
217
+ }`;
218
+ }
219
+ }
220
+ function buildTenancyBlock(answers) {
221
+ if (answers.multiTenant) {
222
+ return ` tenancy: {
223
+ enabled: true,
224
+ isolationField: 'tenantId',
225
+ testFirms: ['firm-a', 'firm-b'],
226
+ }`;
227
+ }
228
+ return ` tenancy: {
229
+ enabled: false,
230
+ isolationField: 'tenantId',
231
+ testFirms: [],
232
+ }`;
233
+ }
234
+ // ── Baseline scaffolding ───────────────────────────────────────────────────
235
+ function scaffoldBaselines(cwd) {
236
+ const baseDir = join(cwd, 'testteam');
237
+ const dirs = [
238
+ baseDir,
239
+ join(baseDir, 'baselines'),
240
+ join(baseDir, 'baselines', 'screenshots'),
241
+ join(baseDir, 'baselines', 'api-snapshots'),
242
+ join(baseDir, 'baselines', 'dom-snapshots'),
243
+ join(baseDir, 'reports'),
244
+ ];
245
+ for (const dir of dirs) {
246
+ mkdirSync(dir, { recursive: true });
247
+ }
248
+ // Create .gitkeep files so empty dirs are tracked
249
+ const gitkeeps = [
250
+ join(baseDir, 'baselines', 'screenshots', '.gitkeep'),
251
+ join(baseDir, 'baselines', 'api-snapshots', '.gitkeep'),
252
+ join(baseDir, 'baselines', 'dom-snapshots', '.gitkeep'),
253
+ join(baseDir, 'reports', '.gitkeep'),
254
+ ];
255
+ for (const filepath of gitkeeps) {
256
+ if (!existsSync(filepath)) {
257
+ writeFileSync(filepath, '', 'utf-8');
258
+ }
259
+ }
260
+ // Create a starter .gitignore for the testteam directory
261
+ const gitignorePath = join(baseDir, '.gitignore');
262
+ if (!existsSync(gitignorePath)) {
263
+ writeFileSync(gitignorePath, `# TestTeam runtime artifacts
264
+ reports/*.html
265
+ reports/*.json
266
+ !reports/.gitkeep
267
+ `, 'utf-8');
268
+ }
269
+ }
270
+ // ── Summary display ─────────────────────────────────────────────────────
271
+ function printSummary(answers) {
272
+ console.log('\n ── Configuration Summary ──────────────────────');
273
+ console.log(` Project: ${answers.projectName}`);
274
+ console.log(` Framework: ${answers.framework}`);
275
+ console.log(` Test runner: ${answers.testRunner}`);
276
+ console.log(` Alpha URL: ${answers.alphaUrl}`);
277
+ if (answers.betaUrl) {
278
+ console.log(` Beta URL: ${answers.betaUrl}`);
279
+ }
280
+ if (answers.uatUrl) {
281
+ console.log(` UAT URL: ${answers.uatUrl}`);
282
+ }
283
+ console.log(` Auth method: ${answers.authMethod}`);
284
+ console.log(` Multi-tenant: ${answers.multiTenant ? 'yes' : 'no'}`);
285
+ console.log(' ────────────────────────────────────────────────\n');
286
+ }
287
+ // ── Main init wizard ───────────────────────────────────────────────────────
288
+ export async function runInitWizard() {
289
+ const cwd = process.cwd();
290
+ const configTarget = join(cwd, 'testteam.config.ts');
291
+ console.log('\n TestTeam -- Init Wizard\n');
292
+ const rl = createInterface({
293
+ input: process.stdin,
294
+ output: process.stdout,
295
+ });
296
+ // ── SIGINT handling: gracefully exit on Ctrl+C ─────────────────────────
297
+ let cancelled = false;
298
+ const sigintHandler = () => {
299
+ cancelled = true;
300
+ console.log('\n\n Setup cancelled.');
301
+ rl.close();
302
+ process.exit(130);
303
+ };
304
+ process.on('SIGINT', sigintHandler);
305
+ const cleanup = () => {
306
+ process.removeListener('SIGINT', sigintHandler);
307
+ rl.close();
308
+ };
309
+ try {
310
+ // ── Existing config guard ──────────────────────────────────────────
311
+ if (existsSync(configTarget)) {
312
+ const overwrite = await promptYesNo(rl, 'Config already exists. Overwrite?', false);
313
+ if (!overwrite) {
314
+ console.log(' Setup cancelled.');
315
+ cleanup();
316
+ return 1;
317
+ }
318
+ }
319
+ // ── Missing package.json warning ─────────────────────────────────
320
+ const pkg = readTargetPackageJson(cwd);
321
+ if (pkg === null) {
322
+ console.log(' Warning: No package.json found in current directory.\n' +
323
+ ' Framework and test runner detection will use defaults.\n');
324
+ }
325
+ const detectedFramework = detectFramework(pkg);
326
+ const detectedTestRunner = detectTestRunner(pkg);
327
+ const dirName = basename(resolve(cwd));
328
+ // ── Gather answers ───────────────────────────────────────────────
329
+ const projectName = await prompt(rl, 'Project name', pkg?.name ?? dirName);
330
+ const framework = await promptChoice(rl, 'Framework?', ['react', 'next', 'vue', 'angular', 'nestjs', 'express', 'generic'], detectedFramework);
331
+ const testRunner = await promptChoice(rl, 'Test runner?', ['vitest', 'jest', 'none'], detectedTestRunner);
332
+ // Alpha URL — required, with validation
333
+ let alphaUrl = '';
334
+ const defaultAlpha = 'http://localhost:3000';
335
+ while (!alphaUrl) {
336
+ const raw = await prompt(rl, 'Alpha environment URL', defaultAlpha);
337
+ if (isValidUrl(raw)) {
338
+ alphaUrl = raw;
339
+ }
340
+ else {
341
+ console.log(' Invalid URL. Must start with http:// or https://');
342
+ }
343
+ }
344
+ // Beta URL — optional, validated when provided
345
+ let betaUrl = '';
346
+ const rawBeta = await prompt(rl, 'Beta/staging URL (leave blank to skip)', '');
347
+ if (rawBeta !== '') {
348
+ if (isValidUrl(rawBeta)) {
349
+ betaUrl = rawBeta;
350
+ }
351
+ else {
352
+ console.log(' Invalid URL — skipping beta environment.');
353
+ }
354
+ }
355
+ // UAT URL — optional, validated when provided
356
+ let uatUrl = '';
357
+ const rawUat = await prompt(rl, 'UAT/production URL (leave blank to skip)', '');
358
+ if (rawUat !== '') {
359
+ if (isValidUrl(rawUat)) {
360
+ uatUrl = rawUat;
361
+ }
362
+ else {
363
+ console.log(' Invalid URL — skipping UAT environment.');
364
+ }
365
+ }
366
+ const authMethod = await promptChoice(rl, 'Auth method?', ['form-login', 'api-token', 'none'], 'form-login');
367
+ const multiTenant = await promptYesNo(rl, 'Multi-tenant?', false);
368
+ const answers = {
369
+ projectName,
370
+ framework,
371
+ testRunner,
372
+ alphaUrl,
373
+ betaUrl,
374
+ uatUrl,
375
+ authMethod,
376
+ multiTenant,
377
+ };
378
+ // ── Confirmation prompt ──────────────────────────────────────────
379
+ printSummary(answers);
380
+ const confirmed = await promptYesNo(rl, 'Create config with these settings?', true);
381
+ if (!confirmed) {
382
+ console.log(' Setup cancelled.');
383
+ cleanup();
384
+ return 1;
385
+ }
386
+ cleanup();
387
+ // ── Write config file ────────────────────────────────────────────
388
+ const configSource = buildConfigSource(answers);
389
+ writeFileSync(configTarget, configSource, 'utf-8');
390
+ console.log(`\n Created testteam.config.ts`);
391
+ // ── Scaffold baselines directory ─────────────────────────────────
392
+ scaffoldBaselines(cwd);
393
+ console.log(' Created testteam/ directory with starter baselines');
394
+ // ── Print next steps ─────────────────────────────────────────────
395
+ printNextSteps(answers);
396
+ return 0;
397
+ }
398
+ catch (error) {
399
+ cleanup();
400
+ if (cancelled || error instanceof CancelledError) {
401
+ console.log('\n Setup cancelled.');
402
+ return 130;
403
+ }
404
+ console.error(`Init failed: ${error instanceof Error ? error.message : String(error)}`);
405
+ return 1;
406
+ }
407
+ }
408
+ function printNextSteps(answers) {
409
+ console.log(`
410
+ Next steps
411
+ ----------
412
+
413
+ 1. Edit testteam.config.ts to add your app's modules and routes.
414
+
415
+ 2. Set environment variables for credentials:`);
416
+ if (answers.authMethod === 'form-login') {
417
+ console.log(` export TF_ADMIN_EMAIL="admin@example.com"
418
+ export TF_ADMIN_PASSWORD="your-password"`);
419
+ }
420
+ else if (answers.authMethod === 'api-token') {
421
+ console.log(` export TF_API_EMAIL="api@example.com"
422
+ export TF_API_TOKEN="your-token"`);
423
+ }
424
+ console.log(`
425
+ 3. Run a dry-run to see the dispatch plan:
426
+ npx testteam --dry-run
427
+
428
+ 4. Run the alpha phase:
429
+ npx testteam --phase alpha
430
+
431
+ 5. Run all phases:
432
+ npx testteam --phase all
433
+ `);
434
+ }
435
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../core/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { LicensePayload } from './license';
2
+ /** Generate an ES256 (ECDSA P-256) keypair in PEM format. */
3
+ export declare function generateKeyPair(): {
4
+ publicKey: string;
5
+ privateKey: string;
6
+ };
7
+ /**
8
+ * Generate a signed JWT license key using ES256.
9
+ * Uses only Node.js built-in `crypto` — no external JWT libraries.
10
+ */
11
+ export declare function generateLicenseKey(payload: Omit<LicensePayload, 'iat'>, privateKey: string): string;
12
+ //# sourceMappingURL=license-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-gen.d.ts","sourceRoot":"","sources":["../../core/license-gen.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,WAAW,CAAC;AAU7D,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAO3E;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EACpC,UAAU,EAAE,MAAM,GACjB,MAAM,CAqBR"}