@avi770/testteam 1.2.0 → 3.0.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 +53 -1
- package/README.md +72 -7
- package/agents/15-regression-sentinel.ts +3 -2
- package/agents/24-signup-onboarding-tester.ts +429 -0
- package/agents/25-crud-flow-tester.ts +302 -0
- package/agents/26-form-validator.ts +297 -0
- package/agents/27-search-filter-tester.ts +326 -0
- package/agents/28-navigation-routing-tester.ts +425 -0
- package/agents/29-responsive-interaction-tester.ts +350 -0
- package/agents/30-multi-user-scenario-tester.ts +319 -0
- package/agents/31-load-tester.ts +134 -0
- package/agents/32-memory-leak-detector.ts +194 -0
- package/agents/33-bundle-analyzer.ts +132 -0
- package/agents/34-xss-scanner.ts +191 -0
- package/agents/35-csrf-tester.ts +82 -0
- package/agents/36-auth-fuzzer.ts +194 -0
- package/agents/37-dependency-scanner.ts +176 -0
- package/agents/38-secrets-scanner.ts +137 -0
- package/agents/39-api-contract-tester.ts +199 -0
- package/agents/40-rate-limit-tester.ts +94 -0
- package/agents/41-api-pagination-tester.ts +97 -0
- package/agents/42-graphql-tester.ts +222 -0
- package/agents/43-data-consistency-checker.ts +205 -0
- package/agents/44-backup-recovery-tester.ts +152 -0
- package/agents/45-data-privacy-scanner.ts +125 -0
- package/agents/46-seo-auditor.ts +294 -0
- package/agents/47-social-preview-tester.ts +232 -0
- package/agents/48-lighthouse-auditor.ts +213 -0
- package/agents/49-i18n-tester.ts +198 -0
- package/agents/50-timezone-tester.ts +173 -0
- package/agents/51-error-recovery-tester.ts +155 -0
- package/agents/52-offline-mode-tester.ts +180 -0
- package/agents/53-graceful-degradation-tester.ts +156 -0
- package/agents/54-websocket-tester.ts +151 -0
- package/agents/55-realtime-sync-tester.ts +194 -0
- package/agents/56-file-upload-tester.ts +194 -0
- package/agents/57-export-tester.ts +174 -0
- package/agents/58-payment-flow-tester.ts +183 -0
- package/agents/59-ssl-tls-auditor.ts +141 -0
- package/agents/60-dns-cdn-tester.ts +117 -0
- package/agents/61-docker-health-checker.ts +111 -0
- package/agents/62-env-config-validator.ts +152 -0
- package/agents/63-log-quality-auditor.ts +136 -0
- package/agents/64-analytics-tracker-tester.ts +165 -0
- package/agents/65-gdpr-compliance-tester.ts +215 -0
- package/agents/66-soc2-control-validator.ts +210 -0
- package/agents/67-wcag-aaa-tester.ts +241 -0
- package/agents/68-dead-code-detector.ts +135 -0
- package/agents/69-type-safety-auditor.ts +164 -0
- package/agents/70-complexity-analyzer.ts +179 -0
- package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
- package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
- package/agents/__tests__/26-form-validator.test.ts +345 -0
- package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
- package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
- package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
- package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
- package/agents/__tests__/31-load-tester.test.ts +189 -0
- package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
- package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
- package/agents/__tests__/34-xss-scanner.test.ts +258 -0
- package/agents/__tests__/35-csrf-tester.test.ts +200 -0
- package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
- package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
- package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
- package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
- package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
- package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
- package/agents/__tests__/42-graphql-tester.test.ts +252 -0
- package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
- package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
- package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
- package/agents/__tests__/46-seo-auditor.test.ts +261 -0
- package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
- package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
- package/agents/__tests__/49-i18n-tester.test.ts +201 -0
- package/agents/__tests__/50-timezone-tester.test.ts +172 -0
- package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
- package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
- package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
- package/agents/__tests__/54-websocket-tester.test.ts +157 -0
- package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
- package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
- package/agents/__tests__/57-export-tester.test.ts +169 -0
- package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
- package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
- package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
- package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
- package/agents/__tests__/62-env-config-validator.test.ts +166 -0
- package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
- package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
- package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
- package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
- package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
- package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
- package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
- package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
- package/agents/__tests__/registry.test.ts +13 -13
- package/agents/base-agent.ts +8 -0
- package/agents/registry.ts +171 -28
- package/core/__tests__/integration.test.ts +4 -4
- package/core/__tests__/orchestrator.test.ts +17 -16
- package/core/cli.ts +128 -6
- package/core/license.ts +208 -211
- package/core/orchestrator.ts +78 -5
- package/dist/agents/15-regression-sentinel.d.ts +2 -1
- package/dist/agents/15-regression-sentinel.d.ts.map +1 -1
- package/dist/agents/15-regression-sentinel.js +2 -2
- package/dist/agents/15-regression-sentinel.js.map +1 -1
- package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
- package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
- package/dist/agents/24-signup-onboarding-tester.js +357 -0
- package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
- package/dist/agents/25-crud-flow-tester.d.ts +11 -0
- package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
- package/dist/agents/25-crud-flow-tester.js +253 -0
- package/dist/agents/25-crud-flow-tester.js.map +1 -0
- package/dist/agents/26-form-validator.d.ts +12 -0
- package/dist/agents/26-form-validator.d.ts.map +1 -0
- package/dist/agents/26-form-validator.js +257 -0
- package/dist/agents/26-form-validator.js.map +1 -0
- package/dist/agents/27-search-filter-tester.d.ts +20 -0
- package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
- package/dist/agents/27-search-filter-tester.js +267 -0
- package/dist/agents/27-search-filter-tester.js.map +1 -0
- package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
- package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
- package/dist/agents/28-navigation-routing-tester.js +363 -0
- package/dist/agents/28-navigation-routing-tester.js.map +1 -0
- package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
- package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
- package/dist/agents/29-responsive-interaction-tester.js +272 -0
- package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
- package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
- package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
- package/dist/agents/30-multi-user-scenario-tester.js +254 -0
- package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
- package/dist/agents/31-load-tester.d.ts +12 -0
- package/dist/agents/31-load-tester.d.ts.map +1 -0
- package/dist/agents/31-load-tester.js +110 -0
- package/dist/agents/31-load-tester.js.map +1 -0
- package/dist/agents/32-memory-leak-detector.d.ts +12 -0
- package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
- package/dist/agents/32-memory-leak-detector.js +167 -0
- package/dist/agents/32-memory-leak-detector.js.map +1 -0
- package/dist/agents/33-bundle-analyzer.d.ts +10 -0
- package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
- package/dist/agents/33-bundle-analyzer.js +111 -0
- package/dist/agents/33-bundle-analyzer.js.map +1 -0
- package/dist/agents/34-xss-scanner.d.ts +11 -0
- package/dist/agents/34-xss-scanner.d.ts.map +1 -0
- package/dist/agents/34-xss-scanner.js +164 -0
- package/dist/agents/34-xss-scanner.js.map +1 -0
- package/dist/agents/35-csrf-tester.d.ts +11 -0
- package/dist/agents/35-csrf-tester.d.ts.map +1 -0
- package/dist/agents/35-csrf-tester.js +70 -0
- package/dist/agents/35-csrf-tester.js.map +1 -0
- package/dist/agents/36-auth-fuzzer.d.ts +13 -0
- package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
- package/dist/agents/36-auth-fuzzer.js +163 -0
- package/dist/agents/36-auth-fuzzer.js.map +1 -0
- package/dist/agents/37-dependency-scanner.d.ts +11 -0
- package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
- package/dist/agents/37-dependency-scanner.js +139 -0
- package/dist/agents/37-dependency-scanner.js.map +1 -0
- package/dist/agents/38-secrets-scanner.d.ts +11 -0
- package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
- package/dist/agents/38-secrets-scanner.js +116 -0
- package/dist/agents/38-secrets-scanner.js.map +1 -0
- package/dist/agents/39-api-contract-tester.d.ts +12 -0
- package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
- package/dist/agents/39-api-contract-tester.js +142 -0
- package/dist/agents/39-api-contract-tester.js.map +1 -0
- package/dist/agents/40-rate-limit-tester.d.ts +12 -0
- package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
- package/dist/agents/40-rate-limit-tester.js +79 -0
- package/dist/agents/40-rate-limit-tester.js.map +1 -0
- package/dist/agents/41-api-pagination-tester.d.ts +12 -0
- package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
- package/dist/agents/41-api-pagination-tester.js +79 -0
- package/dist/agents/41-api-pagination-tester.js.map +1 -0
- package/dist/agents/42-graphql-tester.d.ts +13 -0
- package/dist/agents/42-graphql-tester.d.ts.map +1 -0
- package/dist/agents/42-graphql-tester.js +187 -0
- package/dist/agents/42-graphql-tester.js.map +1 -0
- package/dist/agents/43-data-consistency-checker.d.ts +11 -0
- package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
- package/dist/agents/43-data-consistency-checker.js +176 -0
- package/dist/agents/43-data-consistency-checker.js.map +1 -0
- package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
- package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
- package/dist/agents/44-backup-recovery-tester.js +128 -0
- package/dist/agents/44-backup-recovery-tester.js.map +1 -0
- package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
- package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
- package/dist/agents/45-data-privacy-scanner.js +100 -0
- package/dist/agents/45-data-privacy-scanner.js.map +1 -0
- package/dist/agents/46-seo-auditor.d.ts +12 -0
- package/dist/agents/46-seo-auditor.d.ts.map +1 -0
- package/dist/agents/46-seo-auditor.js +275 -0
- package/dist/agents/46-seo-auditor.js.map +1 -0
- package/dist/agents/47-social-preview-tester.d.ts +11 -0
- package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
- package/dist/agents/47-social-preview-tester.js +219 -0
- package/dist/agents/47-social-preview-tester.js.map +1 -0
- package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
- package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
- package/dist/agents/48-lighthouse-auditor.js +192 -0
- package/dist/agents/48-lighthouse-auditor.js.map +1 -0
- package/dist/agents/49-i18n-tester.d.ts +13 -0
- package/dist/agents/49-i18n-tester.d.ts.map +1 -0
- package/dist/agents/49-i18n-tester.js +172 -0
- package/dist/agents/49-i18n-tester.js.map +1 -0
- package/dist/agents/50-timezone-tester.d.ts +11 -0
- package/dist/agents/50-timezone-tester.d.ts.map +1 -0
- package/dist/agents/50-timezone-tester.js +152 -0
- package/dist/agents/50-timezone-tester.js.map +1 -0
- package/dist/agents/51-error-recovery-tester.d.ts +11 -0
- package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
- package/dist/agents/51-error-recovery-tester.js +134 -0
- package/dist/agents/51-error-recovery-tester.js.map +1 -0
- package/dist/agents/52-offline-mode-tester.d.ts +12 -0
- package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
- package/dist/agents/52-offline-mode-tester.js +161 -0
- package/dist/agents/52-offline-mode-tester.js.map +1 -0
- package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
- package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
- package/dist/agents/53-graceful-degradation-tester.js +130 -0
- package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
- package/dist/agents/54-websocket-tester.d.ts +10 -0
- package/dist/agents/54-websocket-tester.d.ts.map +1 -0
- package/dist/agents/54-websocket-tester.js +132 -0
- package/dist/agents/54-websocket-tester.js.map +1 -0
- package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
- package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
- package/dist/agents/55-realtime-sync-tester.js +175 -0
- package/dist/agents/55-realtime-sync-tester.js.map +1 -0
- package/dist/agents/56-file-upload-tester.d.ts +12 -0
- package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
- package/dist/agents/56-file-upload-tester.js +166 -0
- package/dist/agents/56-file-upload-tester.js.map +1 -0
- package/dist/agents/57-export-tester.d.ts +11 -0
- package/dist/agents/57-export-tester.d.ts.map +1 -0
- package/dist/agents/57-export-tester.js +155 -0
- package/dist/agents/57-export-tester.js.map +1 -0
- package/dist/agents/58-payment-flow-tester.d.ts +11 -0
- package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
- package/dist/agents/58-payment-flow-tester.js +159 -0
- package/dist/agents/58-payment-flow-tester.js.map +1 -0
- package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
- package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
- package/dist/agents/59-ssl-tls-auditor.js +132 -0
- package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
- package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
- package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
- package/dist/agents/60-dns-cdn-tester.js +105 -0
- package/dist/agents/60-dns-cdn-tester.js.map +1 -0
- package/dist/agents/61-docker-health-checker.d.ts +10 -0
- package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
- package/dist/agents/61-docker-health-checker.js +95 -0
- package/dist/agents/61-docker-health-checker.js.map +1 -0
- package/dist/agents/62-env-config-validator.d.ts +10 -0
- package/dist/agents/62-env-config-validator.d.ts.map +1 -0
- package/dist/agents/62-env-config-validator.js +132 -0
- package/dist/agents/62-env-config-validator.js.map +1 -0
- package/dist/agents/63-log-quality-auditor.d.ts +9 -0
- package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
- package/dist/agents/63-log-quality-auditor.js +121 -0
- package/dist/agents/63-log-quality-auditor.js.map +1 -0
- package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
- package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
- package/dist/agents/64-analytics-tracker-tester.js +146 -0
- package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
- package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
- package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
- package/dist/agents/65-gdpr-compliance-tester.js +186 -0
- package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
- package/dist/agents/66-soc2-control-validator.d.ts +14 -0
- package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
- package/dist/agents/66-soc2-control-validator.js +178 -0
- package/dist/agents/66-soc2-control-validator.js.map +1 -0
- package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
- package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
- package/dist/agents/67-wcag-aaa-tester.js +207 -0
- package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
- package/dist/agents/68-dead-code-detector.d.ts +9 -0
- package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
- package/dist/agents/68-dead-code-detector.js +116 -0
- package/dist/agents/68-dead-code-detector.js.map +1 -0
- package/dist/agents/69-type-safety-auditor.d.ts +9 -0
- package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
- package/dist/agents/69-type-safety-auditor.js +148 -0
- package/dist/agents/69-type-safety-auditor.js.map +1 -0
- package/dist/agents/70-complexity-analyzer.d.ts +10 -0
- package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
- package/dist/agents/70-complexity-analyzer.js +154 -0
- package/dist/agents/70-complexity-analyzer.js.map +1 -0
- package/dist/agents/base-agent.d.ts +3 -1
- package/dist/agents/base-agent.d.ts.map +1 -1
- package/dist/agents/base-agent.js +7 -1
- package/dist/agents/base-agent.js.map +1 -1
- package/dist/agents/registry.d.ts +5 -4
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +170 -29
- package/dist/agents/registry.js.map +1 -1
- package/dist/clients/agent-mvp.d.ts +66 -0
- package/dist/clients/agent-mvp.d.ts.map +1 -0
- package/dist/clients/agent-mvp.js +91 -0
- package/dist/clients/agent-mvp.js.map +1 -0
- package/dist/clients/total-recall.d.ts +37 -0
- package/dist/clients/total-recall.d.ts.map +1 -0
- package/dist/clients/total-recall.js +224 -0
- package/dist/clients/total-recall.js.map +1 -0
- package/dist/core/cli.d.ts +3 -0
- package/dist/core/cli.d.ts.map +1 -1
- package/dist/core/cli.js +122 -6
- package/dist/core/cli.js.map +1 -1
- package/dist/core/license.js +2 -5
- package/dist/core/license.js.map +1 -1
- package/dist/core/orchestrator.d.ts +10 -1
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +66 -5
- package/dist/core/orchestrator.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import type { ValidatedConfig } from '../../core/config';
|
|
3
|
+
import type { Phase } from '../../core/types';
|
|
4
|
+
|
|
5
|
+
function makeConfig(overrides: Partial<ValidatedConfig> = {}): ValidatedConfig {
|
|
6
|
+
return {
|
|
7
|
+
schemaVersion: 1, name: 'test',
|
|
8
|
+
projectRoot: '/fake/project',
|
|
9
|
+
auth: { loginUrl: '/login', credentials: { admin: { email: 'a@t.com', password: 's' } } },
|
|
10
|
+
modules: [{ id: 'dashboard', route: '/dashboard', sidebarIcon: true }],
|
|
11
|
+
environments: { alpha: { baseUrl: 'http://localhost:3000', seed: false } },
|
|
12
|
+
portals: [], breakpoints: [], integrations: [], workers: [], workflows: [],
|
|
13
|
+
accuracy: { enabled: false, decimalPrecision: 2, currencySymbol: '$', timezone: 'UTC' },
|
|
14
|
+
tenancy: { enabled: false, isolationField: 'firmId', testFirms: [] },
|
|
15
|
+
costBudget: { maxPerRun: 100, maxPerAgent: 10, alertThreshold: 0.8, onExceeded: 'abort' },
|
|
16
|
+
agentClassification: { blocking: [], advisory: [] },
|
|
17
|
+
thresholds: { unitCoverage: { lines: 80, functions: 80, branches: 80, statements: 80 }, lighthouse: { accessibility: 90, performance: 90, bestPractices: 90, seo: 90 }, apiResponseTime: 2000, bundleSizeLimit: 500000, maxConsoleErrors: 0 },
|
|
18
|
+
disabledAgents: [], disabledAgentSet: new Set<number>(),
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const fetchMock = vi.fn().mockResolvedValue({ ok: true, status: 200 });
|
|
24
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
25
|
+
|
|
26
|
+
vi.mock('../../helpers/navigation', () => ({
|
|
27
|
+
login: vi.fn().mockResolvedValue(undefined),
|
|
28
|
+
waitForSectionLoad: vi.fn().mockResolvedValue(undefined),
|
|
29
|
+
navigateToSection: vi.fn().mockResolvedValue(undefined),
|
|
30
|
+
switchPortal: vi.fn().mockResolvedValue(undefined),
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
const existsSyncMock = vi.fn();
|
|
34
|
+
const readFileSyncMock = vi.fn();
|
|
35
|
+
const readdirSyncMock = vi.fn();
|
|
36
|
+
|
|
37
|
+
vi.mock('node:fs', () => ({
|
|
38
|
+
existsSync: (...args: unknown[]) => existsSyncMock(...args),
|
|
39
|
+
readFileSync: (...args: unknown[]) => readFileSyncMock(...args),
|
|
40
|
+
readdirSync: (...args: unknown[]) => readdirSyncMock(...args),
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
const { ComplexityAnalyzerAgent } = await import('../70-complexity-analyzer');
|
|
44
|
+
|
|
45
|
+
function createAgent(config: ValidatedConfig = makeConfig(), phase: Phase = 'beta') {
|
|
46
|
+
return new ComplexityAnalyzerAgent(config, phase, '/tmp/test-run');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
describe('ComplexityAnalyzerAgent', () => {
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
existsSyncMock.mockReset().mockReturnValue(true);
|
|
52
|
+
readFileSyncMock.mockReset();
|
|
53
|
+
readdirSyncMock.mockReset();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('has agentId 70 and correct name', () => {
|
|
57
|
+
const agent = createAgent();
|
|
58
|
+
expect(agent.agentId).toBe(70);
|
|
59
|
+
expect(agent.agentName).toBe('Complexity Analyzer');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('reports no src dir', async () => {
|
|
63
|
+
existsSyncMock.mockReturnValue(false);
|
|
64
|
+
const agent = createAgent();
|
|
65
|
+
const result = await agent.run();
|
|
66
|
+
const finding = result.findings.find(f => f.id.includes('no-src-dir'));
|
|
67
|
+
expect(finding).toBeDefined();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('reports files over 500 lines as low', async () => {
|
|
71
|
+
readdirSyncMock.mockReturnValue([
|
|
72
|
+
{ name: 'big.ts', isFile: () => true, isDirectory: () => false },
|
|
73
|
+
]);
|
|
74
|
+
readFileSyncMock.mockReturnValue(Array(600).fill('const x = 1;').join('\n'));
|
|
75
|
+
const agent = createAgent();
|
|
76
|
+
const result = await agent.run();
|
|
77
|
+
const finding = result.findings.find(f => f.id.includes('long-file'));
|
|
78
|
+
expect(finding).toBeDefined();
|
|
79
|
+
expect(finding!.severity).toBe('low');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('reports files over 1000 lines as medium', async () => {
|
|
83
|
+
readdirSyncMock.mockReturnValue([
|
|
84
|
+
{ name: 'huge.ts', isFile: () => true, isDirectory: () => false },
|
|
85
|
+
]);
|
|
86
|
+
readFileSyncMock.mockReturnValue(Array(1100).fill('const x = 1;').join('\n'));
|
|
87
|
+
const agent = createAgent();
|
|
88
|
+
const result = await agent.run();
|
|
89
|
+
const finding = result.findings.find(f => f.id.includes('very-long-file'));
|
|
90
|
+
expect(finding).toBeDefined();
|
|
91
|
+
expect(finding!.severity).toBe('medium');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('reports complex functions with >15 branches', async () => {
|
|
95
|
+
readdirSyncMock.mockReturnValue([
|
|
96
|
+
{ name: 'complex.ts', isFile: () => true, isDirectory: () => false },
|
|
97
|
+
]);
|
|
98
|
+
const branches = Array(20).fill(' if (x) { y++; }').join('\n');
|
|
99
|
+
readFileSyncMock.mockReturnValue(`function complexFn() {\n${branches}\n}`);
|
|
100
|
+
const agent = createAgent();
|
|
101
|
+
const result = await agent.run();
|
|
102
|
+
const finding = result.findings.find(f => f.id.includes('complex-function'));
|
|
103
|
+
expect(finding).toBeDefined();
|
|
104
|
+
expect(finding!.severity).toBe('medium');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('no findings for simple code', async () => {
|
|
108
|
+
readdirSyncMock.mockReturnValue([
|
|
109
|
+
{ name: 'simple.ts', isFile: () => true, isDirectory: () => false },
|
|
110
|
+
]);
|
|
111
|
+
readFileSyncMock.mockReturnValue('function simple() {\n return 1;\n}');
|
|
112
|
+
const agent = createAgent();
|
|
113
|
+
const result = await agent.run();
|
|
114
|
+
const complexFinding = result.findings.find(f => f.id.includes('complex-function'));
|
|
115
|
+
expect(complexFinding).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('skips test files', async () => {
|
|
119
|
+
readdirSyncMock.mockReturnValue([
|
|
120
|
+
{ name: 'app.test.ts', isFile: () => true, isDirectory: () => false },
|
|
121
|
+
]);
|
|
122
|
+
const agent = createAgent();
|
|
123
|
+
const result = await agent.run();
|
|
124
|
+
expect(result.status).toBeDefined();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('limits complex function findings to 10', async () => {
|
|
128
|
+
readdirSyncMock.mockReturnValue([
|
|
129
|
+
{ name: 'complex.ts', isFile: () => true, isDirectory: () => false },
|
|
130
|
+
]);
|
|
131
|
+
const funcs = Array.from({ length: 15 }, (_, i) => {
|
|
132
|
+
const branches = Array(20).fill(' if (x) { y++; }').join('\n');
|
|
133
|
+
return `function fn${i}() {\n${branches}\n}`;
|
|
134
|
+
}).join('\n');
|
|
135
|
+
readFileSyncMock.mockReturnValue(funcs);
|
|
136
|
+
const agent = createAgent();
|
|
137
|
+
const result = await agent.run();
|
|
138
|
+
const complexFindings = result.findings.filter(f => f.id.match(/complex-function-\d+/));
|
|
139
|
+
expect(complexFindings.length).toBe(10);
|
|
140
|
+
const summary = result.findings.find(f => f.id.includes('complex-functions-summary'));
|
|
141
|
+
expect(summary).toBeDefined();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('adds evidence with scan stats', async () => {
|
|
145
|
+
readdirSyncMock.mockReturnValue([
|
|
146
|
+
{ name: 'app.ts', isFile: () => true, isDirectory: () => false },
|
|
147
|
+
]);
|
|
148
|
+
readFileSyncMock.mockReturnValue('const x = 1;');
|
|
149
|
+
const agent = createAgent();
|
|
150
|
+
const result = await agent.run();
|
|
151
|
+
expect(result.evidence.length).toBeGreaterThan(0);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('recurses into subdirectories', async () => {
|
|
155
|
+
readdirSyncMock
|
|
156
|
+
.mockReturnValueOnce([
|
|
157
|
+
{ name: 'sub', isFile: () => false, isDirectory: () => true },
|
|
158
|
+
])
|
|
159
|
+
.mockReturnValueOnce([
|
|
160
|
+
{ name: 'helper.ts', isFile: () => true, isDirectory: () => false },
|
|
161
|
+
]);
|
|
162
|
+
readFileSyncMock.mockReturnValue('const x = 1;');
|
|
163
|
+
const agent = createAgent();
|
|
164
|
+
const result = await agent.run();
|
|
165
|
+
expect(result.status).toBeDefined();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('handles empty file', async () => {
|
|
169
|
+
readdirSyncMock.mockReturnValue([
|
|
170
|
+
{ name: 'empty.ts', isFile: () => true, isDirectory: () => false },
|
|
171
|
+
]);
|
|
172
|
+
readFileSyncMock.mockReturnValue('');
|
|
173
|
+
const agent = createAgent();
|
|
174
|
+
const result = await agent.run();
|
|
175
|
+
expect(result.status).toBeDefined();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
} from '../registry';
|
|
8
8
|
|
|
9
9
|
describe('AGENT_TIERS', () => {
|
|
10
|
-
it('should contain exactly
|
|
11
|
-
expect(Object.keys(AGENT_TIERS)).toHaveLength(
|
|
10
|
+
it('should contain exactly 70 agents', () => {
|
|
11
|
+
expect(Object.keys(AGENT_TIERS)).toHaveLength(70);
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
it('should have 8 free-tier agents', () => {
|
|
@@ -16,14 +16,14 @@ describe('AGENT_TIERS', () => {
|
|
|
16
16
|
expect(freeAgents).toHaveLength(8);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
it('should have
|
|
19
|
+
it('should have 26 pro-tier agents', () => {
|
|
20
20
|
const proAgents = Object.entries(AGENT_TIERS).filter(([, t]) => t === 'pro');
|
|
21
|
-
expect(proAgents).toHaveLength(
|
|
21
|
+
expect(proAgents).toHaveLength(26);
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it('should have
|
|
24
|
+
it('should have 36 enterprise-tier agents', () => {
|
|
25
25
|
const entAgents = Object.entries(AGENT_TIERS).filter(([, t]) => t === 'enterprise');
|
|
26
|
-
expect(entAgents).toHaveLength(
|
|
26
|
+
expect(entAgents).toHaveLength(36);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it('should classify known agents correctly', () => {
|
|
@@ -52,8 +52,8 @@ describe('getAgentTier', () => {
|
|
|
52
52
|
|
|
53
53
|
describe('isAgentAvailable', () => {
|
|
54
54
|
const freeAgents = [1, 2, 3, 4, 5, 9, 10, 11];
|
|
55
|
-
const proAgents = [6, 7, 8, 12, 13, 15, 21, 22, 23];
|
|
56
|
-
const enterpriseAgents = [14, 16, 17, 18, 19, 20];
|
|
55
|
+
const proAgents = [6, 7, 8, 12, 13, 15, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 37, 38, 46, 48, 62, 68, 69, 70];
|
|
56
|
+
const enterpriseAgents = [14, 16, 17, 18, 19, 20, 30, 34, 35, 36, 39, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67];
|
|
57
57
|
|
|
58
58
|
describe('free license', () => {
|
|
59
59
|
it('should allow free-tier agents', () => {
|
|
@@ -113,10 +113,10 @@ describe('isAgentAvailable', () => {
|
|
|
113
113
|
// ---------------------------------------------------------------------------
|
|
114
114
|
|
|
115
115
|
describe('registerAllAgents', () => {
|
|
116
|
-
// We need to test that registerAllAgents creates
|
|
116
|
+
// We need to test that registerAllAgents creates 70 agents and registers them all.
|
|
117
117
|
// We mock the orchestrator's registerAgent method.
|
|
118
118
|
|
|
119
|
-
it('registers all
|
|
119
|
+
it('registers all 70 agents with the orchestrator', async () => {
|
|
120
120
|
// We need to dynamically import to avoid circular dependencies with mocked modules
|
|
121
121
|
// Instead, test the function signature by checking it registers the right count
|
|
122
122
|
const { registerAllAgents } = await import('../registry');
|
|
@@ -158,13 +158,13 @@ describe('registerAllAgents', () => {
|
|
|
158
158
|
'/tmp/run',
|
|
159
159
|
);
|
|
160
160
|
|
|
161
|
-
expect(mockOrchestrator.registerAgent).toHaveBeenCalledTimes(
|
|
161
|
+
expect(mockOrchestrator.registerAgent).toHaveBeenCalledTimes(70);
|
|
162
162
|
|
|
163
|
-
// Verify agent IDs 1-
|
|
163
|
+
// Verify agent IDs 1-70 are all registered
|
|
164
164
|
const registeredIds = mockOrchestrator.registerAgent.mock.calls.map(
|
|
165
165
|
(call: unknown[]) => call[0],
|
|
166
166
|
);
|
|
167
|
-
for (let i = 1; i <=
|
|
167
|
+
for (let i = 1; i <= 70; i++) {
|
|
168
168
|
expect(registeredIds).toContain(i);
|
|
169
169
|
}
|
|
170
170
|
});
|
package/agents/base-agent.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { AgentResult, Finding, Phase, EvidenceItem } from '../core/types';
|
|
2
2
|
import type { ValidatedConfig } from '../core/config';
|
|
3
|
+
import type { TotalRecallClient } from '../clients/total-recall';
|
|
3
4
|
|
|
4
5
|
export abstract class BaseAgent {
|
|
5
6
|
constructor(
|
|
6
7
|
protected readonly config: ValidatedConfig,
|
|
7
8
|
protected readonly phase: Phase,
|
|
8
9
|
protected readonly runDir: string,
|
|
10
|
+
protected readonly totalRecall?: TotalRecallClient,
|
|
9
11
|
) {}
|
|
10
12
|
|
|
11
13
|
abstract readonly agentId: number;
|
|
@@ -16,6 +18,12 @@ export abstract class BaseAgent {
|
|
|
16
18
|
try {
|
|
17
19
|
await this.preFlight();
|
|
18
20
|
const findings = await this.execute();
|
|
21
|
+
|
|
22
|
+
// Store findings in Total Recall if available (fire-and-forget)
|
|
23
|
+
if (this.totalRecall && findings.length > 0) {
|
|
24
|
+
await this.totalRecall.storeFindings(this.agentId, this.agentName, findings).catch(() => {});
|
|
25
|
+
}
|
|
26
|
+
|
|
19
27
|
const completedAt = new Date().toISOString();
|
|
20
28
|
return {
|
|
21
29
|
agentId: this.agentId,
|
package/agents/registry.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ValidatedConfig } from '../core/config';
|
|
2
2
|
import type { Phase } from '../core/types';
|
|
3
3
|
import type { Orchestrator } from '../core/orchestrator';
|
|
4
|
+
import type { TotalRecallClient } from '../clients/total-recall';
|
|
4
5
|
|
|
5
6
|
/** License tier type used for agent gating */
|
|
6
7
|
export type LicenseTier = 'free' | 'pro' | 'enterprise';
|
|
@@ -8,8 +9,8 @@ export type LicenseTier = 'free' | 'pro' | 'enterprise';
|
|
|
8
9
|
/**
|
|
9
10
|
* Maps each agent number to its license tier.
|
|
10
11
|
* - free (8 agents): core testing pipeline
|
|
11
|
-
* - pro (
|
|
12
|
-
* - enterprise (
|
|
12
|
+
* - pro (26 agents): advanced testing capabilities
|
|
13
|
+
* - enterprise (36 agents): full platform auditing
|
|
13
14
|
*/
|
|
14
15
|
export const AGENT_TIERS: Record<number, LicenseTier> = {
|
|
15
16
|
/* ── Free tier (8) ── */
|
|
@@ -22,7 +23,7 @@ export const AGENT_TIERS: Record<number, LicenseTier> = {
|
|
|
22
23
|
10: 'free', // Reporter
|
|
23
24
|
11: 'free', // Fixer
|
|
24
25
|
|
|
25
|
-
/* ── Pro tier (
|
|
26
|
+
/* ── Pro tier (26) ── */
|
|
26
27
|
6: 'pro', // API Exerciser
|
|
27
28
|
7: 'pro', // Security Scout
|
|
28
29
|
8: 'pro', // A11y Guardian
|
|
@@ -32,14 +33,61 @@ export const AGENT_TIERS: Record<number, LicenseTier> = {
|
|
|
32
33
|
21: 'pro', // State & Session Tester
|
|
33
34
|
22: 'pro', // Email Notification Verifier
|
|
34
35
|
23: 'pro', // Migration Tester
|
|
36
|
+
24: 'pro', // Signup & Onboarding Tester
|
|
37
|
+
25: 'pro', // CRUD Flow Tester
|
|
38
|
+
26: 'pro', // Form Validator
|
|
39
|
+
27: 'pro', // Search & Filter Tester
|
|
40
|
+
28: 'pro', // Navigation & Routing Tester
|
|
41
|
+
29: 'pro', // Responsive Interaction Tester
|
|
42
|
+
31: 'pro', // Load Tester
|
|
43
|
+
32: 'pro', // Memory Leak Detector
|
|
44
|
+
33: 'pro', // Bundle Analyzer
|
|
45
|
+
37: 'pro', // Dependency Scanner
|
|
46
|
+
38: 'pro', // Secrets Scanner
|
|
47
|
+
46: 'pro', // SEO Auditor
|
|
48
|
+
48: 'pro', // Lighthouse Auditor
|
|
49
|
+
62: 'pro', // Env Config Validator
|
|
50
|
+
68: 'pro', // Dead Code Detector
|
|
51
|
+
69: 'pro', // Type Safety Auditor
|
|
52
|
+
70: 'pro', // Complexity Analyzer
|
|
35
53
|
|
|
36
|
-
/* ── Enterprise tier (
|
|
54
|
+
/* ── Enterprise tier (36) ── */
|
|
37
55
|
14: 'enterprise', // Data Integrity Auditor
|
|
38
56
|
16: 'enterprise', // Chaos Agent
|
|
39
57
|
17: 'enterprise', // Documentation Validator
|
|
40
58
|
18: 'enterprise', // Integration Watchdog
|
|
41
59
|
19: 'enterprise', // Tenant Isolation Auditor
|
|
42
60
|
20: 'enterprise', // Workflow Completion Tester
|
|
61
|
+
30: 'enterprise', // Multi-User Scenario Tester
|
|
62
|
+
34: 'enterprise', // XSS Scanner
|
|
63
|
+
35: 'enterprise', // CSRF Tester
|
|
64
|
+
36: 'enterprise', // Auth Fuzzer
|
|
65
|
+
39: 'enterprise', // API Contract Tester
|
|
66
|
+
40: 'enterprise', // Rate Limit Tester
|
|
67
|
+
41: 'enterprise', // API Pagination Tester
|
|
68
|
+
42: 'enterprise', // GraphQL Tester
|
|
69
|
+
43: 'enterprise', // Data Consistency Checker
|
|
70
|
+
44: 'enterprise', // Backup Recovery Tester
|
|
71
|
+
45: 'enterprise', // Data Privacy Scanner
|
|
72
|
+
47: 'enterprise', // Social Preview Tester
|
|
73
|
+
49: 'enterprise', // i18n Tester
|
|
74
|
+
50: 'enterprise', // Timezone Tester
|
|
75
|
+
51: 'enterprise', // Error Recovery Tester
|
|
76
|
+
52: 'enterprise', // Offline Mode Tester
|
|
77
|
+
53: 'enterprise', // Graceful Degradation Tester
|
|
78
|
+
54: 'enterprise', // WebSocket Tester
|
|
79
|
+
55: 'enterprise', // Realtime Sync Tester
|
|
80
|
+
56: 'enterprise', // File Upload Tester
|
|
81
|
+
57: 'enterprise', // Export Tester
|
|
82
|
+
58: 'enterprise', // Payment Flow Tester
|
|
83
|
+
59: 'enterprise', // SSL/TLS Auditor
|
|
84
|
+
60: 'enterprise', // DNS/CDN Tester
|
|
85
|
+
61: 'enterprise', // Docker Health Checker
|
|
86
|
+
63: 'enterprise', // Log Quality Auditor
|
|
87
|
+
64: 'enterprise', // Analytics Tracker Tester
|
|
88
|
+
65: 'enterprise', // GDPR Compliance Tester
|
|
89
|
+
66: 'enterprise', // SOC2 Control Validator
|
|
90
|
+
67: 'enterprise', // WCAG AAA Tester
|
|
43
91
|
};
|
|
44
92
|
|
|
45
93
|
/** Returns the tier classification for a given agent number. */
|
|
@@ -91,9 +139,56 @@ import { WorkflowCompletionTesterAgent } from './20-workflow-completion-tester';
|
|
|
91
139
|
import { StateSessionTesterAgent } from './21-state-session-tester';
|
|
92
140
|
import { EmailNotificationVerifierAgent } from './22-email-notification-verifier';
|
|
93
141
|
import { MigrationTesterAgent } from './23-migration-tester';
|
|
142
|
+
import { CrudFlowTesterAgent } from './25-crud-flow-tester';
|
|
143
|
+
import { FormValidatorAgent } from './26-form-validator';
|
|
144
|
+
import { SignupOnboardingTesterAgent } from './24-signup-onboarding-tester';
|
|
145
|
+
import { NavigationRoutingTesterAgent } from './28-navigation-routing-tester';
|
|
146
|
+
import { SearchFilterTesterAgent } from './27-search-filter-tester';
|
|
147
|
+
import { ResponsiveInteractionTesterAgent } from './29-responsive-interaction-tester';
|
|
148
|
+
import { MultiUserScenarioTesterAgent } from './30-multi-user-scenario-tester';
|
|
149
|
+
import { LoadTesterAgent } from './31-load-tester';
|
|
150
|
+
import { MemoryLeakDetectorAgent } from './32-memory-leak-detector';
|
|
151
|
+
import { BundleAnalyzerAgent } from './33-bundle-analyzer';
|
|
152
|
+
import { XssScannerAgent } from './34-xss-scanner';
|
|
153
|
+
import { CsrfTesterAgent } from './35-csrf-tester';
|
|
154
|
+
import { AuthFuzzerAgent } from './36-auth-fuzzer';
|
|
155
|
+
import { DependencyScannerAgent } from './37-dependency-scanner';
|
|
156
|
+
import { SecretsScannerAgent } from './38-secrets-scanner';
|
|
157
|
+
import { ApiContractTesterAgent } from './39-api-contract-tester';
|
|
158
|
+
import { RateLimitTesterAgent } from './40-rate-limit-tester';
|
|
159
|
+
import { ApiPaginationTesterAgent } from './41-api-pagination-tester';
|
|
160
|
+
import { GraphqlTesterAgent } from './42-graphql-tester';
|
|
161
|
+
import { DataConsistencyCheckerAgent } from './43-data-consistency-checker';
|
|
162
|
+
import { BackupRecoveryTesterAgent } from './44-backup-recovery-tester';
|
|
163
|
+
import { DataPrivacyScannerAgent } from './45-data-privacy-scanner';
|
|
164
|
+
import { SeoAuditorAgent } from './46-seo-auditor';
|
|
165
|
+
import { SocialPreviewTesterAgent } from './47-social-preview-tester';
|
|
166
|
+
import { LighthouseAuditorAgent } from './48-lighthouse-auditor';
|
|
167
|
+
import { I18nTesterAgent } from './49-i18n-tester';
|
|
168
|
+
import { TimezoneTesterAgent } from './50-timezone-tester';
|
|
169
|
+
import { ErrorRecoveryTesterAgent } from './51-error-recovery-tester';
|
|
170
|
+
import { OfflineModeTesterAgent } from './52-offline-mode-tester';
|
|
171
|
+
import { GracefulDegradationTesterAgent } from './53-graceful-degradation-tester';
|
|
172
|
+
import { WebSocketTesterAgent } from './54-websocket-tester';
|
|
173
|
+
import { RealtimeSyncTesterAgent } from './55-realtime-sync-tester';
|
|
174
|
+
import { FileUploadTesterAgent } from './56-file-upload-tester';
|
|
175
|
+
import { ExportTesterAgent } from './57-export-tester';
|
|
176
|
+
import { PaymentFlowTesterAgent } from './58-payment-flow-tester';
|
|
177
|
+
import { SslTlsAuditorAgent } from './59-ssl-tls-auditor';
|
|
178
|
+
import { DnsCdnTesterAgent } from './60-dns-cdn-tester';
|
|
179
|
+
import { DockerHealthCheckerAgent } from './61-docker-health-checker';
|
|
180
|
+
import { EnvConfigValidatorAgent } from './62-env-config-validator';
|
|
181
|
+
import { LogQualityAuditorAgent } from './63-log-quality-auditor';
|
|
182
|
+
import { AnalyticsTrackerTesterAgent } from './64-analytics-tracker-tester';
|
|
183
|
+
import { GdprComplianceTesterAgent } from './65-gdpr-compliance-tester';
|
|
184
|
+
import { Soc2ControlValidatorAgent } from './66-soc2-control-validator';
|
|
185
|
+
import { WcagAaaTesterAgent } from './67-wcag-aaa-tester';
|
|
186
|
+
import { DeadCodeDetectorAgent } from './68-dead-code-detector';
|
|
187
|
+
import { TypeSafetyAuditorAgent } from './69-type-safety-auditor';
|
|
188
|
+
import { ComplexityAnalyzerAgent } from './70-complexity-analyzer';
|
|
94
189
|
|
|
95
190
|
/**
|
|
96
|
-
* Register all
|
|
191
|
+
* Register all 70 agents with the orchestrator.
|
|
97
192
|
* Each agent is instantiated with the validated config, phase, and run directory.
|
|
98
193
|
* Since agents may run in different phases, we register them for all phases
|
|
99
194
|
* and the orchestrator handles dispatching only the ones needed per phase.
|
|
@@ -103,31 +198,79 @@ export function registerAllAgents(
|
|
|
103
198
|
config: ValidatedConfig,
|
|
104
199
|
phase: Phase,
|
|
105
200
|
runDir: string,
|
|
201
|
+
totalRecall?: TotalRecallClient,
|
|
106
202
|
): void {
|
|
107
203
|
const agents = [
|
|
108
|
-
new AnalystAgent(config, phase, runDir),
|
|
109
|
-
new SeedArchitectAgent(config, phase, runDir),
|
|
110
|
-
new TestGeneratorAgent(config, phase, runDir),
|
|
111
|
-
new UnitRunnerAgent(config, phase, runDir),
|
|
112
|
-
new BrowserCrawlerAgent(config, phase, runDir),
|
|
113
|
-
new ApiExerciserAgent(config, phase, runDir),
|
|
114
|
-
new SecurityScoutAgent(config, phase, runDir),
|
|
115
|
-
new A11yGuardianAgent(config, phase, runDir),
|
|
116
|
-
new HealerAgent(config, phase, runDir),
|
|
117
|
-
new ReporterAgent(config, phase, runDir),
|
|
118
|
-
new FixerAgent(config, phase, runDir),
|
|
119
|
-
new UxInspectorAgent(config, phase, runDir),
|
|
120
|
-
new PerformanceProfilerAgent(config, phase, runDir),
|
|
121
|
-
new DataIntegrityAuditorAgent(config, phase, runDir),
|
|
122
|
-
new RegressionSentinelAgent(config, phase, runDir),
|
|
123
|
-
new ChaosAgent(config, phase, runDir),
|
|
124
|
-
new DocumentationValidatorAgent(config, phase, runDir),
|
|
125
|
-
new IntegrationWatchdogAgent(config, phase, runDir),
|
|
126
|
-
new TenantIsolationAuditorAgent(config, phase, runDir),
|
|
127
|
-
new WorkflowCompletionTesterAgent(config, phase, runDir),
|
|
128
|
-
new StateSessionTesterAgent(config, phase, runDir),
|
|
129
|
-
new EmailNotificationVerifierAgent(config, phase, runDir),
|
|
130
|
-
new MigrationTesterAgent(config, phase, runDir),
|
|
204
|
+
new AnalystAgent(config, phase, runDir, totalRecall),
|
|
205
|
+
new SeedArchitectAgent(config, phase, runDir, totalRecall),
|
|
206
|
+
new TestGeneratorAgent(config, phase, runDir, totalRecall),
|
|
207
|
+
new UnitRunnerAgent(config, phase, runDir, totalRecall),
|
|
208
|
+
new BrowserCrawlerAgent(config, phase, runDir, totalRecall),
|
|
209
|
+
new ApiExerciserAgent(config, phase, runDir, totalRecall),
|
|
210
|
+
new SecurityScoutAgent(config, phase, runDir, totalRecall),
|
|
211
|
+
new A11yGuardianAgent(config, phase, runDir, totalRecall),
|
|
212
|
+
new HealerAgent(config, phase, runDir, totalRecall),
|
|
213
|
+
new ReporterAgent(config, phase, runDir, totalRecall),
|
|
214
|
+
new FixerAgent(config, phase, runDir, totalRecall),
|
|
215
|
+
new UxInspectorAgent(config, phase, runDir, totalRecall),
|
|
216
|
+
new PerformanceProfilerAgent(config, phase, runDir, totalRecall),
|
|
217
|
+
new DataIntegrityAuditorAgent(config, phase, runDir, totalRecall),
|
|
218
|
+
new RegressionSentinelAgent(config, phase, runDir, totalRecall),
|
|
219
|
+
new ChaosAgent(config, phase, runDir, totalRecall),
|
|
220
|
+
new DocumentationValidatorAgent(config, phase, runDir, totalRecall),
|
|
221
|
+
new IntegrationWatchdogAgent(config, phase, runDir, totalRecall),
|
|
222
|
+
new TenantIsolationAuditorAgent(config, phase, runDir, totalRecall),
|
|
223
|
+
new WorkflowCompletionTesterAgent(config, phase, runDir, totalRecall),
|
|
224
|
+
new StateSessionTesterAgent(config, phase, runDir, totalRecall),
|
|
225
|
+
new EmailNotificationVerifierAgent(config, phase, runDir, totalRecall),
|
|
226
|
+
new MigrationTesterAgent(config, phase, runDir, totalRecall),
|
|
227
|
+
new SignupOnboardingTesterAgent(config, phase, runDir, totalRecall),
|
|
228
|
+
new CrudFlowTesterAgent(config, phase, runDir, totalRecall),
|
|
229
|
+
new FormValidatorAgent(config, phase, runDir, totalRecall),
|
|
230
|
+
new SearchFilterTesterAgent(config, phase, runDir, totalRecall),
|
|
231
|
+
new NavigationRoutingTesterAgent(config, phase, runDir, totalRecall),
|
|
232
|
+
new ResponsiveInteractionTesterAgent(config, phase, runDir, totalRecall),
|
|
233
|
+
new MultiUserScenarioTesterAgent(config, phase, runDir, totalRecall),
|
|
234
|
+
new LoadTesterAgent(config, phase, runDir, totalRecall),
|
|
235
|
+
new MemoryLeakDetectorAgent(config, phase, runDir, totalRecall),
|
|
236
|
+
new BundleAnalyzerAgent(config, phase, runDir, totalRecall),
|
|
237
|
+
new XssScannerAgent(config, phase, runDir, totalRecall),
|
|
238
|
+
new CsrfTesterAgent(config, phase, runDir, totalRecall),
|
|
239
|
+
new AuthFuzzerAgent(config, phase, runDir, totalRecall),
|
|
240
|
+
new DependencyScannerAgent(config, phase, runDir, totalRecall),
|
|
241
|
+
new SecretsScannerAgent(config, phase, runDir, totalRecall),
|
|
242
|
+
new ApiContractTesterAgent(config, phase, runDir, totalRecall),
|
|
243
|
+
new RateLimitTesterAgent(config, phase, runDir, totalRecall),
|
|
244
|
+
new ApiPaginationTesterAgent(config, phase, runDir, totalRecall),
|
|
245
|
+
new GraphqlTesterAgent(config, phase, runDir, totalRecall),
|
|
246
|
+
new DataConsistencyCheckerAgent(config, phase, runDir, totalRecall),
|
|
247
|
+
new BackupRecoveryTesterAgent(config, phase, runDir, totalRecall),
|
|
248
|
+
new DataPrivacyScannerAgent(config, phase, runDir, totalRecall),
|
|
249
|
+
new SeoAuditorAgent(config, phase, runDir, totalRecall),
|
|
250
|
+
new SocialPreviewTesterAgent(config, phase, runDir, totalRecall),
|
|
251
|
+
new LighthouseAuditorAgent(config, phase, runDir, totalRecall),
|
|
252
|
+
new I18nTesterAgent(config, phase, runDir, totalRecall),
|
|
253
|
+
new TimezoneTesterAgent(config, phase, runDir, totalRecall),
|
|
254
|
+
new ErrorRecoveryTesterAgent(config, phase, runDir, totalRecall),
|
|
255
|
+
new OfflineModeTesterAgent(config, phase, runDir, totalRecall),
|
|
256
|
+
new GracefulDegradationTesterAgent(config, phase, runDir, totalRecall),
|
|
257
|
+
new WebSocketTesterAgent(config, phase, runDir, totalRecall),
|
|
258
|
+
new RealtimeSyncTesterAgent(config, phase, runDir, totalRecall),
|
|
259
|
+
new FileUploadTesterAgent(config, phase, runDir, totalRecall),
|
|
260
|
+
new ExportTesterAgent(config, phase, runDir, totalRecall),
|
|
261
|
+
new PaymentFlowTesterAgent(config, phase, runDir, totalRecall),
|
|
262
|
+
new SslTlsAuditorAgent(config, phase, runDir, totalRecall),
|
|
263
|
+
new DnsCdnTesterAgent(config, phase, runDir, totalRecall),
|
|
264
|
+
new DockerHealthCheckerAgent(config, phase, runDir, totalRecall),
|
|
265
|
+
new EnvConfigValidatorAgent(config, phase, runDir, totalRecall),
|
|
266
|
+
new LogQualityAuditorAgent(config, phase, runDir, totalRecall),
|
|
267
|
+
new AnalyticsTrackerTesterAgent(config, phase, runDir, totalRecall),
|
|
268
|
+
new GdprComplianceTesterAgent(config, phase, runDir, totalRecall),
|
|
269
|
+
new Soc2ControlValidatorAgent(config, phase, runDir, totalRecall),
|
|
270
|
+
new WcagAaaTesterAgent(config, phase, runDir, totalRecall),
|
|
271
|
+
new DeadCodeDetectorAgent(config, phase, runDir, totalRecall),
|
|
272
|
+
new TypeSafetyAuditorAgent(config, phase, runDir, totalRecall),
|
|
273
|
+
new ComplexityAnalyzerAgent(config, phase, runDir, totalRecall),
|
|
131
274
|
];
|
|
132
275
|
|
|
133
276
|
for (const agent of agents) {
|
|
@@ -169,20 +169,20 @@ describe('Sample Platform — TestTeam Integration', () => {
|
|
|
169
169
|
});
|
|
170
170
|
|
|
171
171
|
describe('Orchestrator.dryRun with sample config', () => {
|
|
172
|
-
it('returns agent IDs [1, 2, 23, 3, 4, 5] for alpha phase', () => {
|
|
172
|
+
it('returns agent IDs [1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70] for alpha phase', () => {
|
|
173
173
|
const validated = validateConfig(sampleConfig);
|
|
174
174
|
const orchestrator = new Orchestrator(validated);
|
|
175
175
|
const plan = orchestrator.dryRun('alpha');
|
|
176
176
|
|
|
177
|
-
expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 3, 4, 5]);
|
|
177
|
+
expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]);
|
|
178
178
|
});
|
|
179
179
|
|
|
180
|
-
it('returns agent IDs
|
|
180
|
+
it('returns all 59 agent IDs for beta phase', () => {
|
|
181
181
|
const validated = validateConfig(sampleConfig);
|
|
182
182
|
const orchestrator = new Orchestrator(validated);
|
|
183
183
|
const plan = orchestrator.dryRun('beta');
|
|
184
184
|
|
|
185
|
-
expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
|
|
185
|
+
expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
186
186
|
});
|
|
187
187
|
|
|
188
188
|
it('marks all alpha agents as unregistered when no agents are registered', () => {
|