@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.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/agents/01-analyst.ts +100 -0
- package/agents/02-seed-architect.ts +59 -0
- package/agents/03-test-generator.ts +191 -0
- package/agents/04-unit-runner.ts +160 -0
- package/agents/05-browser-crawler.ts +790 -0
- package/agents/06-api-exerciser.ts +311 -0
- package/agents/07-security-scout.ts +188 -0
- package/agents/08-a11y-guardian.ts +212 -0
- package/agents/09-healer.ts +228 -0
- package/agents/10-reporter.ts +266 -0
- package/agents/11-fixer.ts +253 -0
- package/agents/12-ux-inspector.ts +444 -0
- package/agents/13-performance-profiler.ts +271 -0
- package/agents/14-data-integrity-auditor.ts +417 -0
- package/agents/15-regression-sentinel.ts +307 -0
- package/agents/16-chaos-agent.ts +228 -0
- package/agents/17-documentation-validator.ts +266 -0
- package/agents/18-integration-watchdog.ts +178 -0
- package/agents/19-tenant-isolation-auditor.ts +199 -0
- package/agents/20-workflow-completion-tester.ts +203 -0
- package/agents/21-state-session-tester.ts +262 -0
- package/agents/22-email-notification-verifier.ts +244 -0
- package/agents/23-migration-tester.ts +80 -0
- package/agents/__tests__/01-analyst.test.ts +188 -0
- package/agents/__tests__/02-seed-architect.test.ts +152 -0
- package/agents/__tests__/03-test-generator-full.test.ts +321 -0
- package/agents/__tests__/03-test-generator.test.ts +318 -0
- package/agents/__tests__/04-unit-runner.test.ts +320 -0
- package/agents/__tests__/05-browser-crawler-beta.test.ts +492 -0
- package/agents/__tests__/05-browser-crawler-release.test.ts +412 -0
- package/agents/__tests__/05-browser-crawler-uat.test.ts +578 -0
- package/agents/__tests__/05-browser-crawler.test.ts +518 -0
- package/agents/__tests__/06-api-exerciser.test.ts +619 -0
- package/agents/__tests__/07-security-scout.test.ts +382 -0
- package/agents/__tests__/08-a11y-guardian.test.ts +530 -0
- package/agents/__tests__/09-healer.test.ts +384 -0
- package/agents/__tests__/10-reporter.test.ts +366 -0
- package/agents/__tests__/11-fixer.test.ts +406 -0
- package/agents/__tests__/12-ux-inspector-extended.test.ts +465 -0
- package/agents/__tests__/12-ux-inspector.test.ts +443 -0
- package/agents/__tests__/13-performance-profiler.test.ts +411 -0
- package/agents/__tests__/14-data-integrity-auditor-extended.test.ts +573 -0
- package/agents/__tests__/14-data-integrity-auditor.test.ts +407 -0
- package/agents/__tests__/15-regression-sentinel.test.ts +657 -0
- package/agents/__tests__/16-chaos-agent.test.ts +427 -0
- package/agents/__tests__/17-documentation-validator.test.ts +402 -0
- package/agents/__tests__/18-integration-watchdog.test.ts +263 -0
- package/agents/__tests__/19-tenant-isolation-auditor.test.ts +400 -0
- package/agents/__tests__/20-workflow-completion-tester.test.ts +586 -0
- package/agents/__tests__/21-state-session-tester.test.ts +374 -0
- package/agents/__tests__/22-email-notification-verifier.test.ts +441 -0
- package/agents/__tests__/23-migration-tester.test.ts +145 -0
- package/agents/__tests__/base-agent.test.ts +188 -0
- package/agents/__tests__/registry.test.ts +218 -0
- package/agents/base-agent.ts +77 -0
- package/agents/registry.ts +136 -0
- package/baselines/api-schemas/.gitkeep +0 -0
- package/baselines/performance/.gitkeep +0 -0
- package/baselines/screenshots/.gitkeep +0 -0
- package/bin/testteam.js +10 -0
- package/core/__tests__/ci-output.test.ts +430 -0
- package/core/__tests__/cli.test.ts +387 -0
- package/core/__tests__/config.test.ts +78 -0
- package/core/__tests__/cost-tracker.test.ts +158 -0
- package/core/__tests__/evidence.test.ts +265 -0
- package/core/__tests__/fix-loop.test.ts +210 -0
- package/core/__tests__/health-check.test.ts +44 -0
- package/core/__tests__/init.test.ts +609 -0
- package/core/__tests__/integration.test.ts +204 -0
- package/core/__tests__/license-gen.test.ts +227 -0
- package/core/__tests__/license.test.ts +326 -0
- package/core/__tests__/multi-browser.test.ts +278 -0
- package/core/__tests__/orchestrator.test.ts +519 -0
- package/core/__tests__/phase-gate.test.ts +43 -0
- package/core/__tests__/report-html.test.ts +398 -0
- package/core/__tests__/report-upload.test.ts +325 -0
- package/core/__tests__/run-counter.test.ts +234 -0
- package/core/ci-output.ts +240 -0
- package/core/cli.ts +232 -0
- package/core/config.ts +178 -0
- package/core/cost-tracker.ts +59 -0
- package/core/evidence.ts +132 -0
- package/core/fix-loop.ts +85 -0
- package/core/health-check.ts +54 -0
- package/core/init.ts +546 -0
- package/core/license-gen.ts +212 -0
- package/core/license.ts +211 -0
- package/core/messages.ts +67 -0
- package/core/multi-browser.ts +136 -0
- package/core/orchestrator.ts +354 -0
- package/core/phase-gate.ts +55 -0
- package/core/report-html.ts +657 -0
- package/core/report-upload.ts +188 -0
- package/core/run-counter.ts +175 -0
- package/core/types.ts +57 -0
- package/dist/agents/01-analyst.d.ts +11 -0
- package/dist/agents/01-analyst.d.ts.map +1 -0
- package/dist/agents/01-analyst.js +75 -0
- package/dist/agents/01-analyst.js.map +1 -0
- package/dist/agents/02-seed-architect.d.ts +11 -0
- package/dist/agents/02-seed-architect.d.ts.map +1 -0
- package/dist/agents/02-seed-architect.js +51 -0
- package/dist/agents/02-seed-architect.js.map +1 -0
- package/dist/agents/03-test-generator.d.ts +9 -0
- package/dist/agents/03-test-generator.d.ts.map +1 -0
- package/dist/agents/03-test-generator.js +167 -0
- package/dist/agents/03-test-generator.js.map +1 -0
- package/dist/agents/04-unit-runner.d.ts +9 -0
- package/dist/agents/04-unit-runner.d.ts.map +1 -0
- package/dist/agents/04-unit-runner.js +113 -0
- package/dist/agents/04-unit-runner.js.map +1 -0
- package/dist/agents/05-browser-crawler.d.ts +30 -0
- package/dist/agents/05-browser-crawler.d.ts.map +1 -0
- package/dist/agents/05-browser-crawler.js +685 -0
- package/dist/agents/05-browser-crawler.js.map +1 -0
- package/dist/agents/06-api-exerciser.d.ts +23 -0
- package/dist/agents/06-api-exerciser.d.ts.map +1 -0
- package/dist/agents/06-api-exerciser.js +253 -0
- package/dist/agents/06-api-exerciser.js.map +1 -0
- package/dist/agents/07-security-scout.d.ts +11 -0
- package/dist/agents/07-security-scout.d.ts.map +1 -0
- package/dist/agents/07-security-scout.js +142 -0
- package/dist/agents/07-security-scout.js.map +1 -0
- package/dist/agents/08-a11y-guardian.d.ts +13 -0
- package/dist/agents/08-a11y-guardian.d.ts.map +1 -0
- package/dist/agents/08-a11y-guardian.js +176 -0
- package/dist/agents/08-a11y-guardian.js.map +1 -0
- package/dist/agents/09-healer.d.ts +33 -0
- package/dist/agents/09-healer.d.ts.map +1 -0
- package/dist/agents/09-healer.js +167 -0
- package/dist/agents/09-healer.js.map +1 -0
- package/dist/agents/10-reporter.d.ts +26 -0
- package/dist/agents/10-reporter.d.ts.map +1 -0
- package/dist/agents/10-reporter.js +215 -0
- package/dist/agents/10-reporter.js.map +1 -0
- package/dist/agents/11-fixer.d.ts +26 -0
- package/dist/agents/11-fixer.d.ts.map +1 -0
- package/dist/agents/11-fixer.js +195 -0
- package/dist/agents/11-fixer.js.map +1 -0
- package/dist/agents/12-ux-inspector.d.ts +15 -0
- package/dist/agents/12-ux-inspector.d.ts.map +1 -0
- package/dist/agents/12-ux-inspector.js +364 -0
- package/dist/agents/12-ux-inspector.js.map +1 -0
- package/dist/agents/13-performance-profiler.d.ts +13 -0
- package/dist/agents/13-performance-profiler.d.ts.map +1 -0
- package/dist/agents/13-performance-profiler.js +216 -0
- package/dist/agents/13-performance-profiler.js.map +1 -0
- package/dist/agents/14-data-integrity-auditor.d.ts +12 -0
- package/dist/agents/14-data-integrity-auditor.d.ts.map +1 -0
- package/dist/agents/14-data-integrity-auditor.js +356 -0
- package/dist/agents/14-data-integrity-auditor.js.map +1 -0
- package/dist/agents/15-regression-sentinel.d.ts +25 -0
- package/dist/agents/15-regression-sentinel.d.ts.map +1 -0
- package/dist/agents/15-regression-sentinel.js +251 -0
- package/dist/agents/15-regression-sentinel.js.map +1 -0
- package/dist/agents/16-chaos-agent.d.ts +9 -0
- package/dist/agents/16-chaos-agent.d.ts.map +1 -0
- package/dist/agents/16-chaos-agent.js +207 -0
- package/dist/agents/16-chaos-agent.js.map +1 -0
- package/dist/agents/17-documentation-validator.d.ts +31 -0
- package/dist/agents/17-documentation-validator.d.ts.map +1 -0
- package/dist/agents/17-documentation-validator.js +246 -0
- package/dist/agents/17-documentation-validator.js.map +1 -0
- package/dist/agents/18-integration-watchdog.d.ts +10 -0
- package/dist/agents/18-integration-watchdog.d.ts.map +1 -0
- package/dist/agents/18-integration-watchdog.js +138 -0
- package/dist/agents/18-integration-watchdog.js.map +1 -0
- package/dist/agents/19-tenant-isolation-auditor.d.ts +9 -0
- package/dist/agents/19-tenant-isolation-auditor.d.ts.map +1 -0
- package/dist/agents/19-tenant-isolation-auditor.js +166 -0
- package/dist/agents/19-tenant-isolation-auditor.js.map +1 -0
- package/dist/agents/20-workflow-completion-tester.d.ts +12 -0
- package/dist/agents/20-workflow-completion-tester.d.ts.map +1 -0
- package/dist/agents/20-workflow-completion-tester.js +159 -0
- package/dist/agents/20-workflow-completion-tester.js.map +1 -0
- package/dist/agents/21-state-session-tester.d.ts +10 -0
- package/dist/agents/21-state-session-tester.d.ts.map +1 -0
- package/dist/agents/21-state-session-tester.js +233 -0
- package/dist/agents/21-state-session-tester.js.map +1 -0
- package/dist/agents/22-email-notification-verifier.d.ts +11 -0
- package/dist/agents/22-email-notification-verifier.d.ts.map +1 -0
- package/dist/agents/22-email-notification-verifier.js +199 -0
- package/dist/agents/22-email-notification-verifier.js.map +1 -0
- package/dist/agents/23-migration-tester.d.ts +10 -0
- package/dist/agents/23-migration-tester.d.ts.map +1 -0
- package/dist/agents/23-migration-tester.js +74 -0
- package/dist/agents/23-migration-tester.js.map +1 -0
- package/dist/agents/base-agent.d.ts +19 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +67 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/registry.d.ts +29 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +117 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/core/ci-output.d.ts +35 -0
- package/dist/core/ci-output.d.ts.map +1 -0
- package/dist/core/ci-output.js +193 -0
- package/dist/core/ci-output.js.map +1 -0
- package/dist/core/cli.d.ts +11 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +197 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/config.d.ts +111 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +42 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +22 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +41 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/evidence.d.ts +28 -0
- package/dist/core/evidence.d.ts.map +1 -0
- package/dist/core/evidence.js +95 -0
- package/dist/core/evidence.js.map +1 -0
- package/dist/core/fix-loop.d.ts +29 -0
- package/dist/core/fix-loop.d.ts.map +1 -0
- package/dist/core/fix-loop.js +70 -0
- package/dist/core/fix-loop.js.map +1 -0
- package/dist/core/health-check.d.ts +21 -0
- package/dist/core/health-check.d.ts.map +1 -0
- package/dist/core/health-check.js +26 -0
- package/dist/core/health-check.js.map +1 -0
- package/dist/core/init.d.ts +2 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +435 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/license-gen.d.ts +12 -0
- package/dist/core/license-gen.d.ts.map +1 -0
- package/dist/core/license-gen.js +169 -0
- package/dist/core/license-gen.js.map +1 -0
- package/dist/core/license.d.ts +33 -0
- package/dist/core/license.d.ts.map +1 -0
- package/dist/core/license.js +170 -0
- package/dist/core/license.js.map +1 -0
- package/dist/core/messages.d.ts +10 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +47 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/multi-browser.d.ts +36 -0
- package/dist/core/multi-browser.d.ts.map +1 -0
- package/dist/core/multi-browser.js +88 -0
- package/dist/core/multi-browser.js.map +1 -0
- package/dist/core/orchestrator.d.ts +48 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +291 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/phase-gate.d.ts +4 -0
- package/dist/core/phase-gate.d.ts.map +1 -0
- package/dist/core/phase-gate.js +39 -0
- package/dist/core/phase-gate.js.map +1 -0
- package/dist/core/report-html.d.ts +9 -0
- package/dist/core/report-html.d.ts.map +1 -0
- package/dist/core/report-html.js +617 -0
- package/dist/core/report-html.js.map +1 -0
- package/dist/core/report-upload.d.ts +16 -0
- package/dist/core/report-upload.d.ts.map +1 -0
- package/dist/core/report-upload.js +124 -0
- package/dist/core/report-upload.js.map +1 -0
- package/dist/core/run-counter.d.ts +40 -0
- package/dist/core/run-counter.d.ts.map +1 -0
- package/dist/core/run-counter.js +120 -0
- package/dist/core/run-counter.js.map +1 -0
- package/dist/core/types.d.ts +53 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/helpers/api-client.d.ts +30 -0
- package/dist/helpers/api-client.d.ts.map +1 -0
- package/dist/helpers/api-client.js +77 -0
- package/dist/helpers/api-client.js.map +1 -0
- package/dist/helpers/element-discovery.d.ts +18 -0
- package/dist/helpers/element-discovery.d.ts.map +1 -0
- package/dist/helpers/element-discovery.js +82 -0
- package/dist/helpers/element-discovery.js.map +1 -0
- package/dist/helpers/env-resolver.d.ts +29 -0
- package/dist/helpers/env-resolver.d.ts.map +1 -0
- package/dist/helpers/env-resolver.js +51 -0
- package/dist/helpers/env-resolver.js.map +1 -0
- package/dist/helpers/form-filler.d.ts +13 -0
- package/dist/helpers/form-filler.d.ts.map +1 -0
- package/dist/helpers/form-filler.js +98 -0
- package/dist/helpers/form-filler.js.map +1 -0
- package/dist/helpers/modal-handler.d.ts +16 -0
- package/dist/helpers/modal-handler.d.ts.map +1 -0
- package/dist/helpers/modal-handler.js +95 -0
- package/dist/helpers/modal-handler.js.map +1 -0
- package/dist/helpers/navigation.d.ts +37 -0
- package/dist/helpers/navigation.d.ts.map +1 -0
- package/dist/helpers/navigation.js +83 -0
- package/dist/helpers/navigation.js.map +1 -0
- package/dist/helpers/quality-gate.d.ts +17 -0
- package/dist/helpers/quality-gate.d.ts.map +1 -0
- package/dist/helpers/quality-gate.js +144 -0
- package/dist/helpers/quality-gate.js.map +1 -0
- package/dist/helpers/screenshot.d.ts +24 -0
- package/dist/helpers/screenshot.d.ts.map +1 -0
- package/dist/helpers/screenshot.js +76 -0
- package/dist/helpers/screenshot.js.map +1 -0
- package/dist/helpers/seed-validator.d.ts +15 -0
- package/dist/helpers/seed-validator.d.ts.map +1 -0
- package/dist/helpers/seed-validator.js +53 -0
- package/dist/helpers/seed-validator.js.map +1 -0
- package/helpers/__tests__/api-client.test.ts +199 -0
- package/helpers/__tests__/element-discovery.test.ts +202 -0
- package/helpers/__tests__/form-filler-extended.test.ts +212 -0
- package/helpers/__tests__/form-filler.test.ts +99 -0
- package/helpers/__tests__/modal-handler.test.ts +152 -0
- package/helpers/__tests__/navigation.test.ts +214 -0
- package/helpers/__tests__/quality-gate.test.ts +117 -0
- package/helpers/__tests__/screenshot.test.ts +139 -0
- package/helpers/__tests__/seed-validator.test.ts +114 -0
- package/helpers/api-client.ts +111 -0
- package/helpers/element-discovery.ts +105 -0
- package/helpers/env-resolver.ts +69 -0
- package/helpers/form-filler.ts +126 -0
- package/helpers/modal-handler.ts +108 -0
- package/helpers/navigation.ts +100 -0
- package/helpers/quality-gate.ts +180 -0
- package/helpers/screenshot.ts +111 -0
- package/helpers/seed-validator.ts +70 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"14-data-integrity-auditor.js","sourceRoot":"","sources":["../../agents/14-data-integrity-auditor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAqB7E,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IAC7C,OAAO,GAAG,EAAE,CAAC;IACb,SAAS,GAAG,wBAAwB,CAAC;IAEpC,KAAK,CAAC,SAAS;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,6FAA6F;QAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAES,KAAK,CAAC,OAAO;QACrB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,uDAAuD;aACrE,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,mBAAmB;gBACvB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,qEAAqE;aACnF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,MAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YACjB,uGAAuG;YACvG,MAAM,YAAY,GAAG,QAAiB,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,gBAAgB;gBACpB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,0BAA0B,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;aACtG,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,wBAAwB;QACxB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAE/B,yBAAyB;QACzB,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAElC,gBAAgB;QAChB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAEnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,MAAiB;QAC/C,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,MAAM,aAAa,GAAwB;YACzC,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,eAAe;YAChD,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,SAAS;QACT,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,sBAAsB;gBAC1B,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAC7F,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,uBAAuB;gBAC3B,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,8BAA8B,UAAU,CAAC,MAAM,wBAAwB;aACrF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAoB,CAAC;QAChD,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC;QAEhC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,sBAAsB;gBAC1B,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,0DAA0D;aACxE,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,+CAA+C;QAC/C,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,sBAAsB,SAAS,EAAE;gBACrC,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,oBAAoB,SAAS,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACzG,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,uBAAuB,SAAS,EAAE;gBACtC,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,oBAAoB,SAAS,aAAa,QAAQ,CAAC,MAAM,8BAA8B;aACrG,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAoB,CAAC;YAC3C,sBAAsB;YACtB,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC,eAAe,aAAa,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;gBACvC,UAAU,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC/E,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,0BAA0B,SAAS,EAAE;oBACzC,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,gBAAgB;oBACxB,WAAW,EAAE,yCAAyC,SAAS,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC3F,YAAY,EAAE,yEAAyE;iBACxF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,SAAS;QACT,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;QAC3D,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,wBAAwB,SAAS,EAAE;gBACvC,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,oBAAoB,SAAS,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACzG,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;YAC3E,0CAA0C;YAC1C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACxF,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAoB,CAAC;gBACrD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;oBACxC,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,2BAA2B,SAAS,EAAE;wBAC1C,IAAI,EAAE,gBAAgB;wBACtB,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,gBAAgB;wBACxB,WAAW,EACT,mCAAmC,SAAS,qBAAqB,aAAa,CAAC,IAAI,cAAc,OAAO,CAAC,IAAI,GAAG;wBAClH,YAAY,EAAE,2DAA2D;qBAC1E,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS;QACT,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,wBAAwB,SAAS,EAAE;gBACvC,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,uBAAuB,SAAS,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAC5G,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,yBAAyB,SAAS,EAAE;gBACxC,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,uBAAuB,SAAS,aAAa,UAAU,CAAC,MAAM,wBAAwB;aACpG,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,yBAAyB,SAAS,EAAE;gBACxC,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,gBAAgB;gBACxB,WAAW,EAAE,oBAAoB,SAAS,aAAa,eAAe,CAAC,MAAM,8BAA8B;gBAC3G,YAAY,EAAE,iEAAiE;aAChF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,MAAiB;QAClD,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC;QAE5B,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,aAAa,GAAwB;gBACzC,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,eAAe;gBAC9C,MAAM,EAAE,UAAU;gBAClB,UAAU,EAAE,IAAI;aACjB,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YACpE,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC3D,0DAA0D;gBAC1D,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAoB,CAAC;YAChD,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC;YAChC,IAAI,CAAC,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAEhC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;YAC/D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,QAAQ,CAAC;YAE7C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAoB,CAAC;YAC7C,MAAM,YAAY,GAAG,MAAM,EAAE,MAAM,CAAC;YAEpC,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBACxD,6CAA6C;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;gBAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;gBAElE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBACxB,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,oBAAoB,SAAS,EAAE;wBACnC,IAAI,EAAE,gBAAgB;wBACtB,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,gBAAgB;wBACxB,WAAW,EACT,wCAAwC,UAAU,eAAe,YAAY,IAAI;4BACjF,YAAY,QAAQ,OAAO,SAAS,wBAAwB,MAAM,EAAE;wBACtE,YAAY,EACV,2EAA2E;4BAC3E,sEAAsE;qBACzE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAiB;QAC1C,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvD,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,aAAa,GAAwB;gBACzC,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,eAAe;gBACzC,UAAU,EAAE,IAAI;aACjB,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YACpE,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,QAAQ,CAAC;YAE5E,MAAM,OAAO,GAAG,UAAU,CAAC,IAAoB,CAAC;YAChD,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC;YAChC,IAAI,CAAC,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAEhC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;YAC/D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,QAAQ,CAAC;YAE7C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAoB,CAAC;YAC7C,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAC;YAEpC,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC/C,oEAAoE;gBACpE,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACtE,MAAM,cAAc,GAAG,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;gBAEjG,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9B,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,wBAAwB,SAAS,EAAE;wBACvC,IAAI,EAAE,gBAAgB;wBACtB,QAAQ,EAAE,QAAQ;wBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,gBAAgB;wBACxB,WAAW,EACT,iCAAiC,SAAS,2CAA2C,gBAAgB,GAAG;wBAC1G,YAAY,EACV,iFAAiF;4BACjF,mFAAmF;qBACtF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Finding, Phase } from '../core/types';
|
|
2
|
+
import type { ValidatedConfig } from '../core/config';
|
|
3
|
+
import { BaseAgent } from './base-agent';
|
|
4
|
+
export declare class RegressionSentinelAgent extends BaseAgent {
|
|
5
|
+
readonly agentId = 15;
|
|
6
|
+
readonly agentName = "Regression Sentinel";
|
|
7
|
+
/** Absolute path to the baselines directory (sibling of runDir). */
|
|
8
|
+
private readonly baselinesDir;
|
|
9
|
+
constructor(config: ValidatedConfig, phase: Phase, runDir: string);
|
|
10
|
+
protected preFlight(): Promise<void>;
|
|
11
|
+
protected execute(): Promise<Finding[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Determines whether this is a first run.
|
|
14
|
+
*
|
|
15
|
+
* A first run is defined as:
|
|
16
|
+
* - The baselines directory does not exist at all, OR
|
|
17
|
+
* - The baselines directory exists but contains only a `.gitkeep` file
|
|
18
|
+
* (i.e. it was committed as an empty placeholder with no real baselines).
|
|
19
|
+
*/
|
|
20
|
+
private isFirstRun;
|
|
21
|
+
/** Emits a structured console log so callers can observe the first-run event. */
|
|
22
|
+
private logFirstRun;
|
|
23
|
+
private compareApiSchemas;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=15-regression-sentinel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"15-regression-sentinel.d.ts","sourceRoot":"","sources":["../../agents/15-regression-sentinel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,yBAAyB;IAE3C,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;cAOjD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAa1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAuI7C;;;;;;;OAOG;YACW,UAAU;IAiBxB,iFAAiF;IACjF,OAAO,CAAC,WAAW;YAOL,iBAAiB;CAyFhC"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { mkdir, readdir, readFile, writeFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { BaseAgent } from './base-agent';
|
|
4
|
+
import { compareScreenshots, updateBaseline } from '../helpers/screenshot';
|
|
5
|
+
/** Pixel-diff threshold for screenshot comparison (percentage). */
|
|
6
|
+
const SCREENSHOT_DIFF_THRESHOLD = 0.1;
|
|
7
|
+
/** Directory name for baseline screenshots inside runDir's parent. */
|
|
8
|
+
const BASELINES_DIR_NAME = 'baselines';
|
|
9
|
+
async function fileExists(p) {
|
|
10
|
+
try {
|
|
11
|
+
await stat(p);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class RegressionSentinelAgent extends BaseAgent {
|
|
19
|
+
agentId = 15;
|
|
20
|
+
agentName = 'Regression Sentinel';
|
|
21
|
+
/** Absolute path to the baselines directory (sibling of runDir). */
|
|
22
|
+
baselinesDir;
|
|
23
|
+
constructor(config, phase, runDir) {
|
|
24
|
+
super(config, phase, runDir);
|
|
25
|
+
// Place baselines as a sibling directory to runDir
|
|
26
|
+
const parentDir = join(runDir, '..');
|
|
27
|
+
this.baselinesDir = join(parentDir, BASELINES_DIR_NAME);
|
|
28
|
+
}
|
|
29
|
+
async preFlight() {
|
|
30
|
+
// Ensure the parent directory of runDir exists (so baselinesDir can be created)
|
|
31
|
+
const parentDir = join(this.runDir, '..');
|
|
32
|
+
const parentExists = await fileExists(parentDir);
|
|
33
|
+
if (!parentExists) {
|
|
34
|
+
throw new Error(`Parent directory does not exist: ${parentDir}. Run directory path appears invalid.`);
|
|
35
|
+
}
|
|
36
|
+
// baselinesDir will be created on first run — pre-flight only checks the parent
|
|
37
|
+
}
|
|
38
|
+
async execute() {
|
|
39
|
+
const findings = [];
|
|
40
|
+
// Ensure the run directory has screenshots to compare
|
|
41
|
+
const runDirExists = await fileExists(this.runDir);
|
|
42
|
+
if (!runDirExists) {
|
|
43
|
+
findings.push({
|
|
44
|
+
id: '15-no-run-dir',
|
|
45
|
+
type: 'infra-issue',
|
|
46
|
+
severity: 'critical',
|
|
47
|
+
agentId: this.agentId,
|
|
48
|
+
module: 'regression-sentinel',
|
|
49
|
+
description: `Run directory does not exist: ${this.runDir}`,
|
|
50
|
+
});
|
|
51
|
+
return findings;
|
|
52
|
+
}
|
|
53
|
+
let allFiles;
|
|
54
|
+
try {
|
|
55
|
+
allFiles = await readdir(this.runDir);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
allFiles = [];
|
|
59
|
+
}
|
|
60
|
+
const screenshotFiles = allFiles.filter((f) => f.endsWith('.png') && !f.endsWith('_diff.png'));
|
|
61
|
+
const isFirstRun = await this.isFirstRun();
|
|
62
|
+
if (isFirstRun) {
|
|
63
|
+
// First run: create baselines from all current screenshots
|
|
64
|
+
this.logFirstRun(screenshotFiles.length);
|
|
65
|
+
await mkdir(this.baselinesDir, { recursive: true });
|
|
66
|
+
for (const screenshotFile of screenshotFiles) {
|
|
67
|
+
const currentPath = join(this.runDir, screenshotFile);
|
|
68
|
+
const baselinePath = await updateBaseline(currentPath, this.baselinesDir);
|
|
69
|
+
this.addEvidence({
|
|
70
|
+
type: 'screenshot',
|
|
71
|
+
path: baselinePath,
|
|
72
|
+
description: `Baseline created for ${screenshotFile}`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Store note as evidence
|
|
76
|
+
const notePath = join(this.baselinesDir, 'first-run-note.json');
|
|
77
|
+
await writeFile(notePath, JSON.stringify({
|
|
78
|
+
note: 'First run: baselines established from current screenshots',
|
|
79
|
+
screenshotCount: screenshotFiles.length,
|
|
80
|
+
createdAt: new Date().toISOString(),
|
|
81
|
+
}, null, 2));
|
|
82
|
+
this.addEvidence({
|
|
83
|
+
type: 'log',
|
|
84
|
+
path: notePath,
|
|
85
|
+
description: `First-run baseline note: ${screenshotFiles.length} baseline(s) created`,
|
|
86
|
+
});
|
|
87
|
+
// First run always passes — return no findings
|
|
88
|
+
return findings;
|
|
89
|
+
}
|
|
90
|
+
// Subsequent runs: compare screenshots against baselines
|
|
91
|
+
for (const screenshotFile of screenshotFiles) {
|
|
92
|
+
const currentPath = join(this.runDir, screenshotFile);
|
|
93
|
+
const baselinePath = join(this.baselinesDir, screenshotFile);
|
|
94
|
+
const baselineExists = await fileExists(baselinePath);
|
|
95
|
+
if (!baselineExists) {
|
|
96
|
+
// New screenshot with no baseline yet — establish it
|
|
97
|
+
await updateBaseline(currentPath, this.baselinesDir);
|
|
98
|
+
this.addEvidence({
|
|
99
|
+
type: 'screenshot',
|
|
100
|
+
path: join(this.baselinesDir, screenshotFile),
|
|
101
|
+
description: `New baseline created for ${screenshotFile} (no prior baseline existed)`,
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
let compareResult;
|
|
106
|
+
try {
|
|
107
|
+
compareResult = await compareScreenshots(currentPath, baselinePath, SCREENSHOT_DIFF_THRESHOLD);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
findings.push({
|
|
111
|
+
id: `15-compare-error-${screenshotFile.replace(/\.png$/, '')}`,
|
|
112
|
+
type: 'infra-issue',
|
|
113
|
+
severity: 'medium',
|
|
114
|
+
agentId: this.agentId,
|
|
115
|
+
module: 'regression-sentinel',
|
|
116
|
+
description: `Failed to compare screenshot "${screenshotFile}": ${err instanceof Error ? err.message : String(err)}`,
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (!compareResult.match) {
|
|
121
|
+
const diffPercent = compareResult.diffPercentage.toFixed(2);
|
|
122
|
+
const safeName = screenshotFile.replace(/\.png$/, '');
|
|
123
|
+
const evidencePath = compareResult.diffPath ?? currentPath;
|
|
124
|
+
this.addEvidence({
|
|
125
|
+
type: 'screenshot',
|
|
126
|
+
path: evidencePath,
|
|
127
|
+
description: `Visual diff for "${screenshotFile}": ${diffPercent}% pixels changed`,
|
|
128
|
+
});
|
|
129
|
+
findings.push({
|
|
130
|
+
id: `15-visual-regression-${safeName}`,
|
|
131
|
+
type: 'code-bug-cosmetic',
|
|
132
|
+
severity: 'medium',
|
|
133
|
+
agentId: this.agentId,
|
|
134
|
+
module: 'regression-sentinel',
|
|
135
|
+
description: `Visual regression detected in "${screenshotFile}": ${diffPercent}% pixel difference (threshold: ${SCREENSHOT_DIFF_THRESHOLD}%)`,
|
|
136
|
+
screenshot: evidencePath,
|
|
137
|
+
suggestedFix: 'Review the visual diff image. If the change is intentional, update the baseline by deleting the old baseline file.',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// API schema comparison
|
|
142
|
+
const schemaFindings = await this.compareApiSchemas();
|
|
143
|
+
findings.push(...schemaFindings);
|
|
144
|
+
return findings;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Determines whether this is a first run.
|
|
148
|
+
*
|
|
149
|
+
* A first run is defined as:
|
|
150
|
+
* - The baselines directory does not exist at all, OR
|
|
151
|
+
* - The baselines directory exists but contains only a `.gitkeep` file
|
|
152
|
+
* (i.e. it was committed as an empty placeholder with no real baselines).
|
|
153
|
+
*/
|
|
154
|
+
async isFirstRun() {
|
|
155
|
+
const baseDirExists = await fileExists(this.baselinesDir);
|
|
156
|
+
if (!baseDirExists) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
let entries;
|
|
160
|
+
try {
|
|
161
|
+
entries = await readdir(this.baselinesDir);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
const meaningfulEntries = entries.filter((e) => e !== '.gitkeep');
|
|
167
|
+
return meaningfulEntries.length === 0;
|
|
168
|
+
}
|
|
169
|
+
/** Emits a structured console log so callers can observe the first-run event. */
|
|
170
|
+
logFirstRun(screenshotCount) {
|
|
171
|
+
console.log(`[RegressionSentinel] No baselines found — creating initial baselines from this run ` +
|
|
172
|
+
`(${screenshotCount} screenshot(s) found in ${this.runDir})`);
|
|
173
|
+
}
|
|
174
|
+
async compareApiSchemas() {
|
|
175
|
+
const findings = [];
|
|
176
|
+
const currentSchemaPath = join(this.runDir, 'api-schema-snapshot.json');
|
|
177
|
+
const baselineSchemaPath = join(this.baselinesDir, 'api-schema-snapshot.json');
|
|
178
|
+
const currentExists = await fileExists(currentSchemaPath);
|
|
179
|
+
if (!currentExists) {
|
|
180
|
+
// No schema snapshot in this run — nothing to compare
|
|
181
|
+
return findings;
|
|
182
|
+
}
|
|
183
|
+
const baselineExists = await fileExists(baselineSchemaPath);
|
|
184
|
+
if (!baselineExists) {
|
|
185
|
+
// First time seeing schema snapshot — create baseline
|
|
186
|
+
const schemaContent = await readFile(currentSchemaPath);
|
|
187
|
+
await writeFile(baselineSchemaPath, schemaContent);
|
|
188
|
+
this.addEvidence({
|
|
189
|
+
type: 'snapshot',
|
|
190
|
+
path: baselineSchemaPath,
|
|
191
|
+
description: 'API schema snapshot baseline created',
|
|
192
|
+
});
|
|
193
|
+
return findings;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
const currentSchema = JSON.parse(await readFile(currentSchemaPath, 'utf-8'));
|
|
197
|
+
const baselineSchema = JSON.parse(await readFile(baselineSchemaPath, 'utf-8'));
|
|
198
|
+
const currentKeys = Object.keys(currentSchema).sort();
|
|
199
|
+
const baselineKeys = Object.keys(baselineSchema).sort();
|
|
200
|
+
// Check for removed endpoints
|
|
201
|
+
for (const key of baselineKeys) {
|
|
202
|
+
if (!(key in currentSchema)) {
|
|
203
|
+
findings.push({
|
|
204
|
+
id: `15-schema-removed-${key.replace(/[^a-zA-Z0-9_-]/g, '_')}`,
|
|
205
|
+
type: 'code-bug-logic',
|
|
206
|
+
severity: 'high',
|
|
207
|
+
agentId: this.agentId,
|
|
208
|
+
module: 'regression-sentinel',
|
|
209
|
+
description: `API endpoint "${key}" was present in baseline but is missing in current run — possible breaking change`,
|
|
210
|
+
suggestedFix: 'Verify endpoint removal is intentional and update API consumers accordingly',
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Check for shape changes in existing endpoints
|
|
215
|
+
for (const key of currentKeys) {
|
|
216
|
+
if (key in baselineSchema) {
|
|
217
|
+
const currentShape = JSON.stringify(currentSchema[key]);
|
|
218
|
+
const baselineShape = JSON.stringify(baselineSchema[key]);
|
|
219
|
+
if (currentShape !== baselineShape) {
|
|
220
|
+
findings.push({
|
|
221
|
+
id: `15-schema-changed-${key.replace(/[^a-zA-Z0-9_-]/g, '_')}`,
|
|
222
|
+
type: 'code-bug-logic',
|
|
223
|
+
severity: 'medium',
|
|
224
|
+
agentId: this.agentId,
|
|
225
|
+
module: 'regression-sentinel',
|
|
226
|
+
description: `API schema for endpoint "${key}" changed from baseline`,
|
|
227
|
+
suggestedFix: 'Verify schema change is intentional, update clients, and refresh the baseline snapshot',
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
this.addEvidence({
|
|
233
|
+
type: 'snapshot',
|
|
234
|
+
path: currentSchemaPath,
|
|
235
|
+
description: `API schema snapshot compared against baseline (${currentKeys.length} endpoints)`,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
findings.push({
|
|
240
|
+
id: '15-schema-parse-error',
|
|
241
|
+
type: 'infra-issue',
|
|
242
|
+
severity: 'low',
|
|
243
|
+
agentId: this.agentId,
|
|
244
|
+
module: 'regression-sentinel',
|
|
245
|
+
description: `Failed to parse API schema snapshots for comparison: ${err instanceof Error ? err.message : String(err)}`,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return findings;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=15-regression-sentinel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"15-regression-sentinel.js","sourceRoot":"","sources":["../../agents/15-regression-sentinel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Finding } from '../core/types';
|
|
2
|
+
import { BaseAgent } from './base-agent';
|
|
3
|
+
export declare class ChaosAgent extends BaseAgent {
|
|
4
|
+
readonly agentId = 16;
|
|
5
|
+
readonly agentName = "Chaos Agent";
|
|
6
|
+
protected preFlight(): Promise<void>;
|
|
7
|
+
protected execute(): Promise<Finding[]>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=16-chaos-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"16-chaos-agent.d.ts","sourceRoot":"","sources":["../../agents/16-chaos-agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,qBAAa,UAAW,SAAQ,SAAS;IACvC,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,iBAAiB;cAEnB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAQ1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;CAkN9C"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent';
|
|
2
|
+
import { resolveEnvironment } from '../helpers/env-resolver';
|
|
3
|
+
export class ChaosAgent extends BaseAgent {
|
|
4
|
+
agentId = 16;
|
|
5
|
+
agentName = 'Chaos Agent';
|
|
6
|
+
async preFlight() {
|
|
7
|
+
if (this.phase !== 'beta' && this.phase !== 'uat') {
|
|
8
|
+
throw new Error(`ChaosAgent requires phase "beta" or "uat" but got "${this.phase}"`);
|
|
9
|
+
}
|
|
10
|
+
await resolveEnvironment(this.config, this.phase);
|
|
11
|
+
}
|
|
12
|
+
async execute() {
|
|
13
|
+
const findings = [];
|
|
14
|
+
const envKey = this.phase === 'uat' ? 'uat' : 'beta';
|
|
15
|
+
const env = this.config.environments[envKey] ?? Object.values(this.config.environments)[0];
|
|
16
|
+
if (!env) {
|
|
17
|
+
findings.push({
|
|
18
|
+
id: `${this.agentId}-no-env`,
|
|
19
|
+
type: 'infra-issue',
|
|
20
|
+
severity: 'critical',
|
|
21
|
+
agentId: this.agentId,
|
|
22
|
+
module: 'chaos',
|
|
23
|
+
description: 'No environment configured — cannot run chaos scenarios',
|
|
24
|
+
});
|
|
25
|
+
return findings;
|
|
26
|
+
}
|
|
27
|
+
const isUat = this.phase === 'uat';
|
|
28
|
+
const loginUrl = this.config.auth.loginUrl ?? `${env.baseUrl}/login`;
|
|
29
|
+
const credentials = this.config.auth.credentials?.['admin'] ??
|
|
30
|
+
Object.values(this.config.auth.credentials ?? {})[0];
|
|
31
|
+
const { chromium } = await import('playwright');
|
|
32
|
+
// -----------------------------------------------------------------------
|
|
33
|
+
// Scenario 1: Token expiry — expired JWT should redirect to login
|
|
34
|
+
// -----------------------------------------------------------------------
|
|
35
|
+
try {
|
|
36
|
+
let browser = null;
|
|
37
|
+
let context = null;
|
|
38
|
+
let page = null;
|
|
39
|
+
try {
|
|
40
|
+
browser = await chromium.launch({ headless: true });
|
|
41
|
+
context = await browser.newContext();
|
|
42
|
+
page = await context.newPage();
|
|
43
|
+
// Inject an expired JWT into localStorage before navigating
|
|
44
|
+
await page.goto(env.baseUrl);
|
|
45
|
+
await page.evaluate(() => {
|
|
46
|
+
// Minimal expired JWT: header.payload.signature — exp in the past
|
|
47
|
+
const expiredJwt = 'eyJhbGciOiJIUzI1NiJ9.' +
|
|
48
|
+
btoa(JSON.stringify({ exp: 1, sub: 'test' })).replace(/=/g, '') +
|
|
49
|
+
'.invalid';
|
|
50
|
+
localStorage.setItem('access_token', expiredJwt);
|
|
51
|
+
localStorage.setItem('token', expiredJwt);
|
|
52
|
+
sessionStorage.setItem('access_token', expiredJwt);
|
|
53
|
+
});
|
|
54
|
+
// Navigate to a protected module — should redirect to login
|
|
55
|
+
const firstModule = this.config.modules[0];
|
|
56
|
+
const protectedUrl = firstModule
|
|
57
|
+
? `${env.baseUrl}${firstModule.route}`
|
|
58
|
+
: `${env.baseUrl}/dashboard`;
|
|
59
|
+
await page.goto(protectedUrl, { waitUntil: 'networkidle' });
|
|
60
|
+
const finalUrl = page.url();
|
|
61
|
+
const redirectedToLogin = finalUrl.includes('/login') ||
|
|
62
|
+
finalUrl.includes('/auth') ||
|
|
63
|
+
finalUrl.includes('/signin');
|
|
64
|
+
if (!redirectedToLogin) {
|
|
65
|
+
findings.push({
|
|
66
|
+
id: `${this.agentId}-token-expiry`,
|
|
67
|
+
type: 'code-bug-security',
|
|
68
|
+
severity: 'critical',
|
|
69
|
+
agentId: this.agentId,
|
|
70
|
+
module: 'auth',
|
|
71
|
+
description: `Token expiry scenario: app did not redirect to login after expired JWT was set. ` +
|
|
72
|
+
`Final URL: ${finalUrl}`,
|
|
73
|
+
suggestedFix: 'Validate JWT expiry on every protected route and redirect to login when expired.',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
if (page)
|
|
79
|
+
await page.close().catch(() => undefined);
|
|
80
|
+
if (context)
|
|
81
|
+
await context.close().catch(() => undefined);
|
|
82
|
+
if (browser)
|
|
83
|
+
await browser.close().catch(() => undefined);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
findings.push({
|
|
88
|
+
id: `${this.agentId}-token-expiry-skipped`,
|
|
89
|
+
type: 'infra-issue',
|
|
90
|
+
severity: 'medium',
|
|
91
|
+
agentId: this.agentId,
|
|
92
|
+
module: 'chaos',
|
|
93
|
+
description: 'Chaos test requires a running app with auth — skipped',
|
|
94
|
+
});
|
|
95
|
+
return findings;
|
|
96
|
+
}
|
|
97
|
+
// -----------------------------------------------------------------------
|
|
98
|
+
// Scenario 2: Network throttle — abort selected API routes and verify no crash
|
|
99
|
+
// -----------------------------------------------------------------------
|
|
100
|
+
{
|
|
101
|
+
let browser = null;
|
|
102
|
+
let context = null;
|
|
103
|
+
let page = null;
|
|
104
|
+
const uncaughtErrors = [];
|
|
105
|
+
try {
|
|
106
|
+
browser = await chromium.launch({ headless: true });
|
|
107
|
+
context = await browser.newContext();
|
|
108
|
+
page = await context.newPage();
|
|
109
|
+
// Abort all XHR/fetch requests to /api/* to simulate network degradation
|
|
110
|
+
await page.route('**/api/**', (route) => {
|
|
111
|
+
route.abort('failed').catch(() => undefined);
|
|
112
|
+
});
|
|
113
|
+
page.on('pageerror', (err) => {
|
|
114
|
+
uncaughtErrors.push(err.message);
|
|
115
|
+
});
|
|
116
|
+
// Login without API interception (need to reach login first)
|
|
117
|
+
if (credentials) {
|
|
118
|
+
try {
|
|
119
|
+
await page.goto(loginUrl, { waitUntil: 'networkidle', timeout: 15_000 });
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Tolerable under route abort
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const firstModule = this.config.modules[0];
|
|
126
|
+
const targetUrl = firstModule
|
|
127
|
+
? `${env.baseUrl}${firstModule.route}`
|
|
128
|
+
: `${env.baseUrl}/dashboard`;
|
|
129
|
+
try {
|
|
130
|
+
await page.goto(targetUrl, { waitUntil: 'domcontentloaded', timeout: 15_000 });
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Expected — the page may time out when API routes are aborted
|
|
134
|
+
}
|
|
135
|
+
// Wait a moment for any unhandled errors to surface
|
|
136
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
137
|
+
if (uncaughtErrors.length > 0) {
|
|
138
|
+
findings.push({
|
|
139
|
+
id: `${this.agentId}-network-throttle`,
|
|
140
|
+
type: 'code-bug-logic',
|
|
141
|
+
severity: 'high',
|
|
142
|
+
agentId: this.agentId,
|
|
143
|
+
module: firstModule?.id ?? 'app',
|
|
144
|
+
description: `Network throttle scenario: ${uncaughtErrors.length} uncaught JS error(s) when API routes were aborted. ` +
|
|
145
|
+
`First error: ${uncaughtErrors[0]}`,
|
|
146
|
+
suggestedFix: 'Add error boundaries and graceful loading states for all API-dependent components.',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
if (page)
|
|
152
|
+
await page.close().catch(() => undefined);
|
|
153
|
+
if (context)
|
|
154
|
+
await context.close().catch(() => undefined);
|
|
155
|
+
if (browser)
|
|
156
|
+
await browser.close().catch(() => undefined);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// -----------------------------------------------------------------------
|
|
160
|
+
// Scenario 3: Large data — verify paginated list endpoints don't crash
|
|
161
|
+
// Skipped in UAT mode (destructive: seeds large data)
|
|
162
|
+
// -----------------------------------------------------------------------
|
|
163
|
+
if (!isUat) {
|
|
164
|
+
try {
|
|
165
|
+
const listPaths = ['/api/clients', '/api/invoices', '/api/transactions'];
|
|
166
|
+
for (const path of listPaths) {
|
|
167
|
+
const url = `${env.baseUrl}${path}?page=1&limit=1000`;
|
|
168
|
+
let response = null;
|
|
169
|
+
try {
|
|
170
|
+
response = await fetch(url, {
|
|
171
|
+
method: 'GET',
|
|
172
|
+
signal: AbortSignal.timeout(15_000),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Endpoint may not exist — skip silently
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (response.status === 500 || response.status === 502 || response.status === 503) {
|
|
180
|
+
findings.push({
|
|
181
|
+
id: `${this.agentId}-large-data-${path.replace(/\//g, '-')}`,
|
|
182
|
+
type: 'code-bug-logic',
|
|
183
|
+
severity: 'high',
|
|
184
|
+
agentId: this.agentId,
|
|
185
|
+
module: 'api',
|
|
186
|
+
description: `Large data scenario: ${path} returned ${response.status} when requesting 1 000 records. ` +
|
|
187
|
+
`The endpoint may lack server-side pagination or timeout protection.`,
|
|
188
|
+
suggestedFix: 'Enforce server-side pagination limits and add query timeout guards.',
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
findings.push({
|
|
195
|
+
id: `${this.agentId}-large-data-error`,
|
|
196
|
+
type: 'infra-issue',
|
|
197
|
+
severity: 'medium',
|
|
198
|
+
agentId: this.agentId,
|
|
199
|
+
module: 'api',
|
|
200
|
+
description: `Large data scenario failed unexpectedly: ${error instanceof Error ? error.message : String(error)}`,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return findings;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=16-chaos-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"16-chaos-agent.js","sourceRoot":"","sources":["../../agents/16-chaos-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Finding } from '../core/types';
|
|
2
|
+
import { BaseAgent } from './base-agent';
|
|
3
|
+
export declare class DocumentationValidatorAgent extends BaseAgent {
|
|
4
|
+
readonly agentId = 17;
|
|
5
|
+
readonly agentName = "Documentation Validator";
|
|
6
|
+
protected preFlight(): Promise<void>;
|
|
7
|
+
protected execute(): Promise<Finding[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the project root. The runDir is typically a subdirectory created
|
|
10
|
+
* for the current test run; the actual project root is the repo root.
|
|
11
|
+
* We walk upward from runDir until we find a package.json or use CWD.
|
|
12
|
+
*/
|
|
13
|
+
private resolveProjectRoot;
|
|
14
|
+
/** Recursively collect .md files from projectRoot and any docs/ sub-directory. */
|
|
15
|
+
private collectMarkdownFiles;
|
|
16
|
+
private walkMarkdownFiles;
|
|
17
|
+
/**
|
|
18
|
+
* Extract all HTTP/HTTPS URLs from the given markdown files.
|
|
19
|
+
* Returns a map: url → source file path.
|
|
20
|
+
*/
|
|
21
|
+
private extractUrlsFromFiles;
|
|
22
|
+
/** HEAD each URL; create a 'low' finding for 404 or 5xx responses. */
|
|
23
|
+
private checkUrls;
|
|
24
|
+
/**
|
|
25
|
+
* Scan TypeScript / JavaScript source files for catch blocks that only log
|
|
26
|
+
* error.message without providing a user-friendly message.
|
|
27
|
+
*/
|
|
28
|
+
private scanForBareCatchLogs;
|
|
29
|
+
private walkSourceFiles;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=17-documentation-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"17-documentation-validator.d.ts","sourceRoot":"","sources":["../../agents/17-documentation-validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAmBzC,qBAAa,2BAA4B,SAAQ,SAAS;IACxD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,6BAA6B;cAE/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAa1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAyB7C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAK1B,kFAAkF;YACpE,oBAAoB;YA0BpB,iBAAiB;IAsB/B;;;OAGG;YACW,oBAAoB;IA+BlC,sEAAsE;YACxD,SAAS;IAyCvB;;;OAGG;YACW,oBAAoB;YAuCpB,eAAe;CAsB9B"}
|