@yasserkhanorg/e2e-agents 1.8.1 → 1.8.2

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.
@@ -1,4 +1,6 @@
1
1
  import type { PolicyConfig } from './config.js';
2
+ import type { CrossImpact, Finding, RegressionRisk, StrategyEntry, TestDesign } from '../crew/types.js';
3
+ import type { FlowDecision } from '../validation/output_schema.js';
2
4
  export type RecommendedRunSet = 'smoke' | 'targeted' | 'full';
3
5
  export type CiAction = 'run-now' | 'must-add-tests' | 'safe-to-merge';
4
6
  export interface PolicyEvaluation {
@@ -28,6 +30,32 @@ export interface CoveredFlowSummary {
28
30
  coveredBy: string[];
29
31
  advisoryScenarios?: string[];
30
32
  }
33
+ export interface CrewPlanSummary {
34
+ impactedFlows: number;
35
+ strategyEntries: number;
36
+ testDesigns: number;
37
+ crossImpacts: number;
38
+ highRiskCrossImpacts: number;
39
+ regressionRisks: number;
40
+ findings: number;
41
+ generatedSpecs: number;
42
+ manualReviewEntries: number;
43
+ totalCostUSD: number;
44
+ totalTokens: number;
45
+ }
46
+ export interface CrewPlanInsights {
47
+ workflow: string;
48
+ providerOverride: string;
49
+ summary: CrewPlanSummary;
50
+ impactedFlows: FlowDecision[];
51
+ strategyEntries: StrategyEntry[];
52
+ testDesigns: TestDesign[];
53
+ crossImpacts: CrossImpact[];
54
+ regressionRisks: RegressionRisk[];
55
+ findings: Finding[];
56
+ warnings: string[];
57
+ timings: Record<string, number>;
58
+ }
31
59
  export interface PlanReport {
32
60
  schemaVersion: '1.0.0';
33
61
  runId: string;
@@ -96,6 +124,7 @@ export interface PlanReport {
96
124
  commitGeneratedTests?: string;
97
125
  openPullRequest?: string;
98
126
  };
127
+ crew?: CrewPlanInsights;
99
128
  metrics: {
100
129
  changedFiles: number;
101
130
  impactedFlows: number;
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/agent/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/agent/plan.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,eAAe,EAAC,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAEH,KAAK,UAAU,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAmC,KAAK,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAU9F,OAAO,EAAqB,KAAK,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAyB,KAAK,6BAA6B,EAAE,KAAK,4BAA4B,EAAC,MAAM,oBAAoB,CAAC;AACjI,OAAO,EAEH,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAChC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGH,KAAK,yBAAyB,EACjC,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAcD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,6BAA6B,GAAG,4BAA4B,CAE1G;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,4BAA4B,GAAG,wBAAwB,CASlG;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,eAAoB,GAAG,YAAY,CAStF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,eAAoB,GAAG,sBAAsB,CAgBjG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,sBAAsB,GAAG;IAAE,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAkD7I;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,6BAA6B,GAAG,yBAAyB,CAkBrG"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,eAAe,EAAC,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAEH,KAAK,UAAU,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAmC,KAAK,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAU9F,OAAO,EAAqB,KAAK,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAyB,KAAK,6BAA6B,EAAE,KAAK,4BAA4B,EAAC,MAAM,oBAAoB,CAAC;AACjI,OAAO,EAEH,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAChC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGH,KAAK,yBAAyB,EACjC,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAcD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,6BAA6B,GAAG,4BAA4B,CAE1G;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,4BAA4B,GAAG,wBAAwB,CASlG;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,eAAoB,GAAG,YAAY,CAStF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,eAAoB,GAAG,sBAAsB,CAgBjG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,sBAAsB,GAAG;IAAE,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC,CA+D7I;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,6BAA6B,GAAG,yBAAyB,CAkBrG"}
package/dist/api.js CHANGED
@@ -16,7 +16,7 @@ const git_js_1 = require("./agent/git.js");
16
16
  const feedback_js_1 = require("./agent/feedback.js");
17
17
  const diff_loader_js_1 = require("./engine/diff_loader.js");
18
18
  const ai_enrichment_js_1 = require("./engine/ai_enrichment.js");
19
- const anthropic_provider_js_1 = require("./anthropic_provider.js");
19
+ const provider_factory_js_1 = require("./provider_factory.js");
20
20
  const handoff_js_1 = require("./agent/handoff.js");
21
21
  const traceability_ingest_js_1 = require("./agent/traceability_ingest.js");
22
22
  const traceability_capture_js_1 = require("./agent/traceability_capture.js");
@@ -80,11 +80,22 @@ async function recommendTestsAI(options = {}) {
80
80
  routeFamilies: config.routeFamilies,
81
81
  filteredTestFiles: gitResult.filteredTestFiles,
82
82
  });
83
- const apiKey = process.env.ANTHROPIC_API_KEY;
84
83
  let aiEnrichment;
85
- if (apiKey) {
84
+ let provider;
85
+ try {
86
+ provider = await provider_factory_js_1.LLMProviderFactory.createFromPreference(config.llm.provider);
87
+ }
88
+ catch (error) {
89
+ const configuredProvider = config.llm.provider?.trim().toLowerCase();
90
+ const envProvider = process.env.LLM_PROVIDER?.trim().toLowerCase();
91
+ const shouldThrow = Boolean((configuredProvider && configuredProvider !== 'auto') ||
92
+ (envProvider && envProvider !== 'auto'));
93
+ if (shouldThrow) {
94
+ throw error;
95
+ }
96
+ }
97
+ if (provider) {
86
98
  const diffs = (0, diff_loader_js_1.loadDiffs)(config.path, config.git.since, gitResult.files);
87
- const provider = new anthropic_provider_js_1.AnthropicProvider({ apiKey });
88
99
  // Collect all known spec paths and scenario details from impacted features
89
100
  const specSet = new Set();
90
101
  const specDetailsMap = new Map();
@@ -61,7 +61,7 @@ async function runGenerateCommand(args, config) {
61
61
  catch {
62
62
  console.warn('Could not load API surface catalog. Generation will use generic selectors.');
63
63
  }
64
- const provider = await provider_factory_js_1.LLMProviderFactory.createFromEnv();
64
+ const provider = await provider_factory_js_1.LLMProviderFactory.createFromPreference(config.llm.provider);
65
65
  console.log(`Generating tests for ${scenarios.length} scenario(s)...`);
66
66
  const summary = await (0, runner_js_1.runAgenticGeneration)({
67
67
  scenarios,
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAIzD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ExJ"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAMzD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GxJ"}
@@ -7,6 +7,7 @@ const fs_1 = require("fs");
7
7
  const path_1 = require("path");
8
8
  const plan_builder_js_1 = require("../../engine/plan_builder.js");
9
9
  const api_js_1 = require("../../api.js");
10
+ const plan_crew_js_1 = require("./plan_crew.js");
10
11
  async function runPlanCommand(args, autoConfig, config) {
11
12
  const reportRoot = config.testsRoot || config.path;
12
13
  const apiOptions = {
@@ -43,41 +44,73 @@ async function runPlanCommand(args, autoConfig, config) {
43
44
  const { aiEnrichment } = result;
44
45
  console.log(`AI enrichment: ${aiEnrichment.enrichedFeatures.length} features enriched (${aiEnrichment.tokenUsage.input + aiEnrichment.tokenUsage.output} tokens)`);
45
46
  }
46
- else if (!process.env.ANTHROPIC_API_KEY) {
47
- console.log('Tip: set ANTHROPIC_API_KEY to enable AI-powered enrichment');
47
+ else if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY && !process.env.LLM_PROVIDER) {
48
+ console.log('Tip: configure ANTHROPIC_API_KEY, OPENAI_API_KEY, or LLM_PROVIDER to enable AI-powered enrichment');
48
49
  }
49
50
  }
50
51
  const { plan, planPath, ciSummaryMarkdown, ciSummaryPath } = result;
51
- // Write CI summary to an additional path if --ci-comment-path was specified
52
- if (args.ciCommentPath) {
53
- (0, plan_builder_js_1.writeCiSummary)(reportRoot, ciSummaryMarkdown, args.ciCommentPath);
52
+ let planReport = plan;
53
+ let combinedSummaryMarkdown = ciSummaryMarkdown;
54
+ let crewSummaryPath = '';
55
+ let crewMarkdownPath = '';
56
+ if (args.crew) {
57
+ try {
58
+ const crew = await (0, plan_crew_js_1.runPlanCrewAnalysis)(plan, config, args);
59
+ planReport = {
60
+ ...plan,
61
+ crew,
62
+ };
63
+ combinedSummaryMarkdown = (0, plan_crew_js_1.appendCrewToSummary)(ciSummaryMarkdown, crew);
64
+ const artifacts = (0, plan_crew_js_1.writeCrewArtifacts)(reportRoot, crew);
65
+ crewSummaryPath = artifacts.crewSummaryPath;
66
+ crewMarkdownPath = artifacts.crewMarkdownPath;
67
+ (0, fs_1.writeFileSync)(planPath, JSON.stringify(planReport, null, 2), 'utf-8');
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : String(error);
71
+ console.warn(`Crew analysis unavailable: ${message}`);
72
+ }
54
73
  }
55
- const summaryPath = ciSummaryPath;
74
+ (0, plan_builder_js_1.writeCiSummary)(reportRoot, combinedSummaryMarkdown);
75
+ const summaryPath = args.ciCommentPath
76
+ ? (0, plan_builder_js_1.writeCiSummary)(reportRoot, combinedSummaryMarkdown, args.ciCommentPath)
77
+ : ciSummaryPath;
56
78
  // Compute metrics paths (api already wrote metrics; derive paths for GHA output)
57
79
  const metricsEventsPath = (0, path_1.join)(reportRoot, '.e2e-ai-agents/metrics.jsonl');
58
80
  const metricsSummaryPath = (0, path_1.join)(reportRoot, '.e2e-ai-agents/metrics-summary.json');
59
81
  const ghaOutput = args.githubOutputPath || process.env.GITHUB_OUTPUT;
60
82
  if (ghaOutput) {
61
- (0, fs_1.appendFileSync)(ghaOutput, `run_set=${plan.runSet}\n`);
62
- (0, fs_1.appendFileSync)(ghaOutput, `action=${plan.decision.action}\n`);
63
- (0, fs_1.appendFileSync)(ghaOutput, `confidence=${plan.confidence}\n`);
64
- (0, fs_1.appendFileSync)(ghaOutput, `enforcement_mode=${plan.enforcement.mode}\n`);
65
- (0, fs_1.appendFileSync)(ghaOutput, `enforcement_should_fail=${plan.enforcement.shouldFail}\n`);
66
- (0, fs_1.appendFileSync)(ghaOutput, `recommended_tests_count=${plan.recommendedTests.length}\n`);
67
- (0, fs_1.appendFileSync)(ghaOutput, `required_new_tests_count=${plan.requiredNewTests.length}\n`);
83
+ (0, fs_1.appendFileSync)(ghaOutput, `run_set=${planReport.runSet}\n`);
84
+ (0, fs_1.appendFileSync)(ghaOutput, `action=${planReport.decision.action}\n`);
85
+ (0, fs_1.appendFileSync)(ghaOutput, `confidence=${planReport.confidence}\n`);
86
+ (0, fs_1.appendFileSync)(ghaOutput, `enforcement_mode=${planReport.enforcement.mode}\n`);
87
+ (0, fs_1.appendFileSync)(ghaOutput, `enforcement_should_fail=${planReport.enforcement.shouldFail}\n`);
88
+ (0, fs_1.appendFileSync)(ghaOutput, `recommended_tests_count=${planReport.recommendedTests.length}\n`);
89
+ (0, fs_1.appendFileSync)(ghaOutput, `required_new_tests_count=${planReport.requiredNewTests.length}\n`);
68
90
  (0, fs_1.appendFileSync)(ghaOutput, `plan_path=${planPath}\n`);
69
91
  (0, fs_1.appendFileSync)(ghaOutput, `summary_path=${summaryPath}\n`);
70
92
  (0, fs_1.appendFileSync)(ghaOutput, `metrics_events_path=${metricsEventsPath}\n`);
71
93
  (0, fs_1.appendFileSync)(ghaOutput, `metrics_summary_path=${metricsSummaryPath}\n`);
94
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_enabled=${planReport.crew ? 'true' : 'false'}\n`);
95
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_workflow=${planReport.crew?.workflow || ''}\n`);
96
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_summary_path=${crewSummaryPath}\n`);
97
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_markdown_path=${crewMarkdownPath}\n`);
98
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_impacted_flows=${planReport.crew?.summary.impactedFlows || 0}\n`);
99
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_strategy_entries=${planReport.crew?.summary.strategyEntries || 0}\n`);
100
+ (0, fs_1.appendFileSync)(ghaOutput, `crew_test_designs=${planReport.crew?.summary.testDesigns || 0}\n`);
72
101
  }
73
- console.log(`Suggested run set: ${plan.runSet} (confidence ${plan.confidence})`);
74
- console.log(`Decision: ${plan.decision.action} - ${plan.decision.summary}`);
75
- console.log(`Enforcement: ${plan.enforcement.mode} (shouldFail=${plan.enforcement.shouldFail})`);
102
+ console.log(`Suggested run set: ${planReport.runSet} (confidence ${planReport.confidence})`);
103
+ console.log(`Decision: ${planReport.decision.action} - ${planReport.decision.summary}`);
104
+ console.log(`Enforcement: ${planReport.enforcement.mode} (shouldFail=${planReport.enforcement.shouldFail})`);
76
105
  console.log(`Plan data: ${planPath}`);
77
106
  console.log(`CI summary: ${summaryPath}`);
107
+ if (planReport.crew) {
108
+ console.log(`Crew workflow: ${planReport.crew.workflow} (impactedFlows=${planReport.crew.summary.impactedFlows}, strategyEntries=${planReport.crew.summary.strategyEntries}, testDesigns=${planReport.crew.summary.testDesigns})`);
109
+ console.log(`Crew summary: ${crewSummaryPath}`);
110
+ }
78
111
  console.log(`Plan metrics: ${metricsSummaryPath}`);
79
- const failOnLegacyFlag = args.failOnMustAddTests && plan.decision.action === 'must-add-tests';
80
- if (failOnLegacyFlag || plan.enforcement.shouldFail) {
112
+ const failOnLegacyFlag = args.failOnMustAddTests && planReport.decision.action === 'must-add-tests';
113
+ if (failOnLegacyFlag || planReport.enforcement.shouldFail) {
81
114
  process.exit(2);
82
115
  }
83
116
  }
@@ -0,0 +1,11 @@
1
+ import type { AgentConfig } from '../../agent/config.js';
2
+ import type { CrewPlanInsights, PlanReport } from '../../agent/plan.js';
3
+ import type { ParsedArgs } from '../types.js';
4
+ export declare function runPlanCrewAnalysis(plan: PlanReport, config: AgentConfig, args: ParsedArgs): Promise<CrewPlanInsights>;
5
+ export declare function buildCrewMarkdown(crew: CrewPlanInsights): string;
6
+ export declare function appendCrewToSummary(baseMarkdown: string, crew: CrewPlanInsights): string;
7
+ export declare function writeCrewArtifacts(reportRoot: string, crew: CrewPlanInsights): {
8
+ crewSummaryPath: string;
9
+ crewMarkdownPath: string;
10
+ };
11
+ //# sourceMappingURL=plan_crew.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan_crew.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan_crew.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAC,gBAAgB,EAAE,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAStE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAgC5C,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkD5H;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAwDhE;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAExF;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAC,CAWlI"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.runPlanCrewAnalysis = runPlanCrewAnalysis;
6
+ exports.buildCrewMarkdown = buildCrewMarkdown;
7
+ exports.appendCrewToSummary = appendCrewToSummary;
8
+ exports.writeCrewArtifacts = writeCrewArtifacts;
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const cross_impact_js_1 = require("../../agents/cross-impact.js");
12
+ const impact_analyst_js_1 = require("../../agents/impact-analyst.js");
13
+ const regression_advisor_js_1 = require("../../agents/regression-advisor.js");
14
+ const strategist_js_1 = require("../../agents/strategist.js");
15
+ const test_designer_js_1 = require("../../agents/test-designer.js");
16
+ const orchestrator_js_1 = require("../../crew/orchestrator.js");
17
+ const VALID_WORKFLOWS = new Set(['full-qa', 'quick-check', 'design-only']);
18
+ function uniqueStrings(values) {
19
+ return Array.from(new Set(values.filter(Boolean)));
20
+ }
21
+ function singleLine(value) {
22
+ return value.replace(/\s+/g, ' ').trim();
23
+ }
24
+ function chooseCrewWorkflow(explicitWorkflow, plan) {
25
+ if (explicitWorkflow && VALID_WORKFLOWS.has(explicitWorkflow)) {
26
+ return explicitWorkflow;
27
+ }
28
+ if (plan.decision.action === 'must-add-tests' || plan.metrics.uncoveredP0P1Flows > 0) {
29
+ return 'design-only';
30
+ }
31
+ return 'quick-check';
32
+ }
33
+ function registerCrewAgents(orchestrator) {
34
+ orchestrator.registerAgent(new impact_analyst_js_1.ImpactAnalystAgent());
35
+ orchestrator.registerAgent(new strategist_js_1.StrategistAgent());
36
+ orchestrator.registerAgent(new test_designer_js_1.TestDesignerAgent());
37
+ orchestrator.registerAgent(new cross_impact_js_1.CrossImpactAgent());
38
+ orchestrator.registerAgent(new regression_advisor_js_1.RegressionAdvisorAgent());
39
+ }
40
+ async function runPlanCrewAnalysis(plan, config, args) {
41
+ const reportRoot = config.testsRoot || config.path;
42
+ const workflow = chooseCrewWorkflow(args.crewWorkflow, plan);
43
+ const normalizedProvider = config.llm.provider?.trim().toLowerCase();
44
+ const providerOverride = normalizedProvider && normalizedProvider !== 'auto' ? normalizedProvider : 'auto';
45
+ const orchestrator = new orchestrator_js_1.CrewOrchestrator();
46
+ registerCrewAgents(orchestrator);
47
+ const result = await orchestrator.run({
48
+ appPath: config.path,
49
+ testsRoot: reportRoot,
50
+ gitSince: args.gitSince || config.git.since,
51
+ routeFamilies: config.routeFamilies,
52
+ apiSurface: config.apiSurface,
53
+ workflow,
54
+ providerOverride: providerOverride === 'auto' ? undefined : providerOverride,
55
+ budgetUSD: args.budgetUSD,
56
+ dryRun: args.dryRun,
57
+ });
58
+ const ctx = result.context;
59
+ const highRiskCrossImpacts = ctx.crossImpacts.filter((entry) => entry.riskLevel === 'high');
60
+ const manualReviewEntries = ctx.strategyEntries.filter((entry) => entry.approach === 'manual-review');
61
+ return {
62
+ workflow,
63
+ providerOverride,
64
+ summary: {
65
+ impactedFlows: ctx.impactedFlows.length,
66
+ strategyEntries: ctx.strategyEntries.length,
67
+ testDesigns: ctx.testDesigns.length,
68
+ crossImpacts: ctx.crossImpacts.length,
69
+ highRiskCrossImpacts: highRiskCrossImpacts.length,
70
+ regressionRisks: ctx.regressionRisks.length,
71
+ findings: ctx.findings.length,
72
+ generatedSpecs: ctx.generatedSpecs.length,
73
+ manualReviewEntries: manualReviewEntries.length,
74
+ totalCostUSD: Number(ctx.usage.totalCost.toFixed(4)),
75
+ totalTokens: ctx.usage.totalTokens,
76
+ },
77
+ impactedFlows: ctx.impactedFlows,
78
+ strategyEntries: ctx.strategyEntries,
79
+ testDesigns: ctx.testDesigns,
80
+ crossImpacts: ctx.crossImpacts,
81
+ regressionRisks: ctx.regressionRisks,
82
+ findings: ctx.findings,
83
+ warnings: uniqueStrings([...ctx.warnings, ...result.warnings]),
84
+ timings: result.timings,
85
+ };
86
+ }
87
+ function buildCrewMarkdown(crew) {
88
+ const lines = [
89
+ '### Crew Insights',
90
+ '',
91
+ `Workflow: \`${crew.workflow}\``,
92
+ `Provider override: \`${crew.providerOverride}\``,
93
+ `Impacted flows: **${crew.summary.impactedFlows}**`,
94
+ `Strategy entries: **${crew.summary.strategyEntries}**`,
95
+ `Structured test designs: **${crew.summary.testDesigns}**`,
96
+ `Cross-impacts: **${crew.summary.crossImpacts}** (${crew.summary.highRiskCrossImpacts} high risk)`,
97
+ `Findings: **${crew.summary.findings}**`,
98
+ `Estimated AI cost: **$${crew.summary.totalCostUSD.toFixed(4)}**`,
99
+ ];
100
+ if (crew.strategyEntries.length > 0) {
101
+ lines.push('');
102
+ lines.push('Top Strategy Recommendations:');
103
+ for (const entry of crew.strategyEntries.slice(0, 5)) {
104
+ lines.push(`- ${entry.priority} ${entry.flowName} -> ${entry.approach} (${entry.crossImpactRisk} cross-impact risk)`);
105
+ }
106
+ }
107
+ if (crew.testDesigns.length > 0) {
108
+ lines.push('');
109
+ lines.push('Structured Test Designs:');
110
+ for (const design of crew.testDesigns.slice(0, 3)) {
111
+ lines.push(`- ${design.flowName}: ${design.testCases.length} designed test case(s)`);
112
+ }
113
+ }
114
+ const riskyCrossImpacts = crew.crossImpacts.filter((entry) => entry.riskLevel === 'high');
115
+ if (riskyCrossImpacts.length > 0) {
116
+ lines.push('');
117
+ lines.push('High-Risk Cross-Impacts:');
118
+ for (const entry of riskyCrossImpacts.slice(0, 5)) {
119
+ lines.push(`- ${entry.sourceFamily} -> ${entry.affectedFamily}: ${entry.sharedDependency}`);
120
+ }
121
+ }
122
+ if (crew.findings.length > 0) {
123
+ lines.push('');
124
+ lines.push('Crew Findings:');
125
+ for (const finding of crew.findings.slice(0, 5)) {
126
+ lines.push(`- ${finding.severity} ${finding.type}: ${finding.summary}`);
127
+ }
128
+ }
129
+ if (crew.warnings.length > 0) {
130
+ lines.push('');
131
+ lines.push('Crew Warnings:');
132
+ for (const warning of crew.warnings.slice(0, 5)) {
133
+ lines.push(`- ${singleLine(warning)}`);
134
+ }
135
+ }
136
+ return lines.join('\n');
137
+ }
138
+ function appendCrewToSummary(baseMarkdown, crew) {
139
+ return `${baseMarkdown}\n\n---\n\n${buildCrewMarkdown(crew)}`;
140
+ }
141
+ function writeCrewArtifacts(reportRoot, crew) {
142
+ const outputDir = (0, path_1.join)(reportRoot, '.e2e-ai-agents');
143
+ (0, fs_1.mkdirSync)(outputDir, { recursive: true });
144
+ const crewSummaryPath = (0, path_1.join)(outputDir, 'crew-summary.json');
145
+ const crewMarkdownPath = (0, path_1.join)(outputDir, 'crew-summary.md');
146
+ (0, fs_1.writeFileSync)(crewSummaryPath, JSON.stringify(crew, null, 2), 'utf-8');
147
+ (0, fs_1.writeFileSync)(crewMarkdownPath, buildCrewMarkdown(crew), 'utf-8');
148
+ return { crewSummaryPath, crewMarkdownPath };
149
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"parse_args.d.ts","sourceRoot":"","sources":["../../src/cli/parse_args.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAU,UAAU,EAAC,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,iBAAiB,UAA8D,CAAC;AAE7F,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBlF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAmBtE;AA+ID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA4EpD"}
1
+ {"version":3,"file":"parse_args.d.ts","sourceRoot":"","sources":["../../src/cli/parse_args.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAU,UAAU,EAAC,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,iBAAiB,UAA8D,CAAC;AAE7F,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBlF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAmBtE;AAiJD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA4EpD"}
@@ -62,6 +62,7 @@ const FLAGS = {
62
62
  '--pipeline-parallel': { key: 'pipelineParallel', type: 'boolean' },
63
63
  '--pipeline-dry-run': { key: 'pipelineDryRun', type: 'boolean' },
64
64
  '--fail-on-must-add-tests': { key: 'failOnMustAddTests', type: 'boolean' },
65
+ '--crew': { key: 'crew', type: 'boolean' },
65
66
  '--create-pr': { key: 'createPr', type: 'boolean' },
66
67
  '--dry-run': { key: 'dryRun', type: 'boolean' },
67
68
  '--generate': { key: 'analyzeGenerate', type: 'boolean' },
@@ -105,6 +106,7 @@ const FLAGS = {
105
106
  '--output': { key: 'trainOutput', type: 'string' },
106
107
  '--server-path': { key: 'serverPath', type: 'string' },
107
108
  '--workflow': { key: 'crewWorkflow', type: 'string' },
109
+ '--crew-workflow': { key: 'crewWorkflow', type: 'string' },
108
110
  // -- number flags (with isFinite guard) --
109
111
  '--pipeline-scenarios': { key: 'pipelineScenarios', type: 'number' },
110
112
  '--time': { key: 'timeLimitMinutes', type: 'number' },
@@ -41,6 +41,7 @@ export interface ParsedArgs {
41
41
  ciCommentPath?: string;
42
42
  githubOutputPath?: string;
43
43
  failOnMustAddTests?: boolean;
44
+ crew?: boolean;
44
45
  feedbackInputPath?: string;
45
46
  traceabilityReportPath?: string;
46
47
  traceabilityCaptureOutputPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,eAAe,EAAE,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,OAAO,GACf,MAAM,GACJ,QAAQ,GACR,MAAM,GACN,MAAM,GACN,SAAS,GACT,UAAU,GACV,0BAA0B,GAC1B,UAAU,GACV,sBAAsB,GACtB,qBAAqB,GACrB,SAAS,GACT,YAAY,GACZ,OAAO,GACP,MAAM,CAAC;AAEb,MAAM,WAAW,UAAU;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IACtD,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,gBAAgB,GAAG,eAAe,CAAC,CAAC;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,IAAI,CAyFjC"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,IAAI,CA2FjC"}
package/dist/cli/usage.js CHANGED
@@ -59,6 +59,8 @@ function printUsage() {
59
59
  ' --policy-risky-patterns <globs> Comma-separated risky file globs',
60
60
  ' --policy-enforcement-mode <mode> advisory | warn | block',
61
61
  ' --policy-block-actions <actions> Comma-separated CI actions to block/warn',
62
+ ' --crew Run Crew enrichment and attach insights to plan output',
63
+ ' --crew-workflow <name> full-qa | quick-check | design-only',
62
64
  ' --ci-comment-path <path> Write CI markdown summary',
63
65
  ' --github-output <path> Write GitHub Actions outputs',
64
66
  ' --fail-on-must-add-tests Exit non-zero on must-add-tests decision',
package/dist/esm/api.js CHANGED
@@ -8,7 +8,7 @@ import { getChangedFiles } from './agent/git.js';
8
8
  import { getAdaptiveThresholds } from './agent/feedback.js';
9
9
  import { loadDiffs } from './engine/diff_loader.js';
10
10
  import { enrichImpactWithAI } from './engine/ai_enrichment.js';
11
- import { AnthropicProvider } from './anthropic_provider.js';
11
+ import { LLMProviderFactory } from './provider_factory.js';
12
12
  import { finalizeGeneratedTests } from './agent/handoff.js';
13
13
  import { ingestTraceabilityInput, } from './agent/traceability_ingest.js';
14
14
  import { captureTraceabilityInput, } from './agent/traceability_capture.js';
@@ -72,11 +72,22 @@ export async function recommendTestsAI(options = {}) {
72
72
  routeFamilies: config.routeFamilies,
73
73
  filteredTestFiles: gitResult.filteredTestFiles,
74
74
  });
75
- const apiKey = process.env.ANTHROPIC_API_KEY;
76
75
  let aiEnrichment;
77
- if (apiKey) {
76
+ let provider;
77
+ try {
78
+ provider = await LLMProviderFactory.createFromPreference(config.llm.provider);
79
+ }
80
+ catch (error) {
81
+ const configuredProvider = config.llm.provider?.trim().toLowerCase();
82
+ const envProvider = process.env.LLM_PROVIDER?.trim().toLowerCase();
83
+ const shouldThrow = Boolean((configuredProvider && configuredProvider !== 'auto') ||
84
+ (envProvider && envProvider !== 'auto'));
85
+ if (shouldThrow) {
86
+ throw error;
87
+ }
88
+ }
89
+ if (provider) {
78
90
  const diffs = loadDiffs(config.path, config.git.since, gitResult.files);
79
- const provider = new AnthropicProvider({ apiKey });
80
91
  // Collect all known spec paths and scenario details from impacted features
81
92
  const specSet = new Set();
82
93
  const specDetailsMap = new Map();
@@ -58,7 +58,7 @@ export async function runGenerateCommand(args, config) {
58
58
  catch {
59
59
  console.warn('Could not load API surface catalog. Generation will use generic selectors.');
60
60
  }
61
- const provider = await LLMProviderFactory.createFromEnv();
61
+ const provider = await LLMProviderFactory.createFromPreference(config.llm.provider);
62
62
  console.log(`Generating tests for ${scenarios.length} scenario(s)...`);
63
63
  const summary = await runAgenticGeneration({
64
64
  scenarios,
@@ -1,9 +1,10 @@
1
1
  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2
2
  // See LICENSE.txt for license information.
3
- import { appendFileSync } from 'fs';
3
+ import { appendFileSync, writeFileSync } from 'fs';
4
4
  import { join } from 'path';
5
5
  import { writeCiSummary } from '../../engine/plan_builder.js';
6
6
  import { recommendTestsAI, recommendTestsDeterministic } from '../../api.js';
7
+ import { appendCrewToSummary, runPlanCrewAnalysis, writeCrewArtifacts } from './plan_crew.js';
7
8
  export async function runPlanCommand(args, autoConfig, config) {
8
9
  const reportRoot = config.testsRoot || config.path;
9
10
  const apiOptions = {
@@ -40,41 +41,73 @@ export async function runPlanCommand(args, autoConfig, config) {
40
41
  const { aiEnrichment } = result;
41
42
  console.log(`AI enrichment: ${aiEnrichment.enrichedFeatures.length} features enriched (${aiEnrichment.tokenUsage.input + aiEnrichment.tokenUsage.output} tokens)`);
42
43
  }
43
- else if (!process.env.ANTHROPIC_API_KEY) {
44
- console.log('Tip: set ANTHROPIC_API_KEY to enable AI-powered enrichment');
44
+ else if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY && !process.env.LLM_PROVIDER) {
45
+ console.log('Tip: configure ANTHROPIC_API_KEY, OPENAI_API_KEY, or LLM_PROVIDER to enable AI-powered enrichment');
45
46
  }
46
47
  }
47
48
  const { plan, planPath, ciSummaryMarkdown, ciSummaryPath } = result;
48
- // Write CI summary to an additional path if --ci-comment-path was specified
49
- if (args.ciCommentPath) {
50
- writeCiSummary(reportRoot, ciSummaryMarkdown, args.ciCommentPath);
49
+ let planReport = plan;
50
+ let combinedSummaryMarkdown = ciSummaryMarkdown;
51
+ let crewSummaryPath = '';
52
+ let crewMarkdownPath = '';
53
+ if (args.crew) {
54
+ try {
55
+ const crew = await runPlanCrewAnalysis(plan, config, args);
56
+ planReport = {
57
+ ...plan,
58
+ crew,
59
+ };
60
+ combinedSummaryMarkdown = appendCrewToSummary(ciSummaryMarkdown, crew);
61
+ const artifacts = writeCrewArtifacts(reportRoot, crew);
62
+ crewSummaryPath = artifacts.crewSummaryPath;
63
+ crewMarkdownPath = artifacts.crewMarkdownPath;
64
+ writeFileSync(planPath, JSON.stringify(planReport, null, 2), 'utf-8');
65
+ }
66
+ catch (error) {
67
+ const message = error instanceof Error ? error.message : String(error);
68
+ console.warn(`Crew analysis unavailable: ${message}`);
69
+ }
51
70
  }
52
- const summaryPath = ciSummaryPath;
71
+ writeCiSummary(reportRoot, combinedSummaryMarkdown);
72
+ const summaryPath = args.ciCommentPath
73
+ ? writeCiSummary(reportRoot, combinedSummaryMarkdown, args.ciCommentPath)
74
+ : ciSummaryPath;
53
75
  // Compute metrics paths (api already wrote metrics; derive paths for GHA output)
54
76
  const metricsEventsPath = join(reportRoot, '.e2e-ai-agents/metrics.jsonl');
55
77
  const metricsSummaryPath = join(reportRoot, '.e2e-ai-agents/metrics-summary.json');
56
78
  const ghaOutput = args.githubOutputPath || process.env.GITHUB_OUTPUT;
57
79
  if (ghaOutput) {
58
- appendFileSync(ghaOutput, `run_set=${plan.runSet}\n`);
59
- appendFileSync(ghaOutput, `action=${plan.decision.action}\n`);
60
- appendFileSync(ghaOutput, `confidence=${plan.confidence}\n`);
61
- appendFileSync(ghaOutput, `enforcement_mode=${plan.enforcement.mode}\n`);
62
- appendFileSync(ghaOutput, `enforcement_should_fail=${plan.enforcement.shouldFail}\n`);
63
- appendFileSync(ghaOutput, `recommended_tests_count=${plan.recommendedTests.length}\n`);
64
- appendFileSync(ghaOutput, `required_new_tests_count=${plan.requiredNewTests.length}\n`);
80
+ appendFileSync(ghaOutput, `run_set=${planReport.runSet}\n`);
81
+ appendFileSync(ghaOutput, `action=${planReport.decision.action}\n`);
82
+ appendFileSync(ghaOutput, `confidence=${planReport.confidence}\n`);
83
+ appendFileSync(ghaOutput, `enforcement_mode=${planReport.enforcement.mode}\n`);
84
+ appendFileSync(ghaOutput, `enforcement_should_fail=${planReport.enforcement.shouldFail}\n`);
85
+ appendFileSync(ghaOutput, `recommended_tests_count=${planReport.recommendedTests.length}\n`);
86
+ appendFileSync(ghaOutput, `required_new_tests_count=${planReport.requiredNewTests.length}\n`);
65
87
  appendFileSync(ghaOutput, `plan_path=${planPath}\n`);
66
88
  appendFileSync(ghaOutput, `summary_path=${summaryPath}\n`);
67
89
  appendFileSync(ghaOutput, `metrics_events_path=${metricsEventsPath}\n`);
68
90
  appendFileSync(ghaOutput, `metrics_summary_path=${metricsSummaryPath}\n`);
91
+ appendFileSync(ghaOutput, `crew_enabled=${planReport.crew ? 'true' : 'false'}\n`);
92
+ appendFileSync(ghaOutput, `crew_workflow=${planReport.crew?.workflow || ''}\n`);
93
+ appendFileSync(ghaOutput, `crew_summary_path=${crewSummaryPath}\n`);
94
+ appendFileSync(ghaOutput, `crew_markdown_path=${crewMarkdownPath}\n`);
95
+ appendFileSync(ghaOutput, `crew_impacted_flows=${planReport.crew?.summary.impactedFlows || 0}\n`);
96
+ appendFileSync(ghaOutput, `crew_strategy_entries=${planReport.crew?.summary.strategyEntries || 0}\n`);
97
+ appendFileSync(ghaOutput, `crew_test_designs=${planReport.crew?.summary.testDesigns || 0}\n`);
69
98
  }
70
- console.log(`Suggested run set: ${plan.runSet} (confidence ${plan.confidence})`);
71
- console.log(`Decision: ${plan.decision.action} - ${plan.decision.summary}`);
72
- console.log(`Enforcement: ${plan.enforcement.mode} (shouldFail=${plan.enforcement.shouldFail})`);
99
+ console.log(`Suggested run set: ${planReport.runSet} (confidence ${planReport.confidence})`);
100
+ console.log(`Decision: ${planReport.decision.action} - ${planReport.decision.summary}`);
101
+ console.log(`Enforcement: ${planReport.enforcement.mode} (shouldFail=${planReport.enforcement.shouldFail})`);
73
102
  console.log(`Plan data: ${planPath}`);
74
103
  console.log(`CI summary: ${summaryPath}`);
104
+ if (planReport.crew) {
105
+ console.log(`Crew workflow: ${planReport.crew.workflow} (impactedFlows=${planReport.crew.summary.impactedFlows}, strategyEntries=${planReport.crew.summary.strategyEntries}, testDesigns=${planReport.crew.summary.testDesigns})`);
106
+ console.log(`Crew summary: ${crewSummaryPath}`);
107
+ }
75
108
  console.log(`Plan metrics: ${metricsSummaryPath}`);
76
- const failOnLegacyFlag = args.failOnMustAddTests && plan.decision.action === 'must-add-tests';
77
- if (failOnLegacyFlag || plan.enforcement.shouldFail) {
109
+ const failOnLegacyFlag = args.failOnMustAddTests && planReport.decision.action === 'must-add-tests';
110
+ if (failOnLegacyFlag || planReport.enforcement.shouldFail) {
78
111
  process.exit(2);
79
112
  }
80
113
  }