@yasserkhanorg/e2e-agents 1.7.7 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/agent/git.d.ts +5 -0
- package/dist/agent/git.d.ts.map +1 -1
- package/dist/agent/git.js +13 -0
- package/dist/agents/coverage-evaluator.d.ts +8 -0
- package/dist/agents/coverage-evaluator.d.ts.map +1 -0
- package/dist/agents/coverage-evaluator.js +41 -0
- package/dist/agents/cross-impact.d.ts +13 -0
- package/dist/agents/cross-impact.d.ts.map +1 -0
- package/dist/agents/cross-impact.js +135 -0
- package/dist/agents/executor.d.ts +8 -0
- package/dist/agents/executor.d.ts.map +1 -0
- package/dist/agents/executor.js +70 -0
- package/dist/agents/explorer.d.ts +12 -0
- package/dist/agents/explorer.d.ts.map +1 -0
- package/dist/agents/explorer.js +43 -0
- package/dist/agents/generator.d.ts +8 -0
- package/dist/agents/generator.d.ts.map +1 -0
- package/dist/agents/generator.js +77 -0
- package/dist/agents/healer.d.ts +8 -0
- package/dist/agents/healer.d.ts.map +1 -0
- package/dist/agents/healer.js +31 -0
- package/dist/agents/impact-analyst.d.ts +8 -0
- package/dist/agents/impact-analyst.d.ts.map +1 -0
- package/dist/agents/impact-analyst.js +38 -0
- package/dist/agents/regression-advisor.d.ts +8 -0
- package/dist/agents/regression-advisor.d.ts.map +1 -0
- package/dist/agents/regression-advisor.js +116 -0
- package/dist/agents/strategist.d.ts +9 -0
- package/dist/agents/strategist.d.ts.map +1 -0
- package/dist/agents/strategist.js +87 -0
- package/dist/agents/test-designer.d.ts +8 -0
- package/dist/agents/test-designer.d.ts.map +1 -0
- package/dist/agents/test-designer.js +106 -0
- package/dist/cli/commands/crew.d.ts +3 -0
- package/dist/cli/commands/crew.d.ts.map +1 -0
- package/dist/cli/commands/crew.js +137 -0
- package/dist/cli/parse_args.d.ts.map +1 -1
- package/dist/cli/parse_args.js +2 -1
- package/dist/cli/types.d.ts +2 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli.js +5 -0
- package/dist/crew/context.d.ts +40 -0
- package/dist/crew/context.d.ts.map +1 -0
- package/dist/crew/context.js +36 -0
- package/dist/crew/orchestrator.d.ts +36 -0
- package/dist/crew/orchestrator.d.ts.map +1 -0
- package/dist/crew/orchestrator.js +171 -0
- package/dist/crew/protocol.d.ts +33 -0
- package/dist/crew/protocol.d.ts.map +1 -0
- package/dist/crew/protocol.js +4 -0
- package/dist/crew/provider.d.ts +3 -0
- package/dist/crew/provider.d.ts.map +1 -0
- package/dist/crew/provider.js +16 -0
- package/dist/crew/sanitize.d.ts +3 -0
- package/dist/crew/sanitize.d.ts.map +1 -0
- package/dist/crew/sanitize.js +31 -0
- package/dist/crew/types.d.ts +52 -0
- package/dist/crew/types.d.ts.map +1 -0
- package/dist/crew/types.js +4 -0
- package/dist/crew/workflows.d.ts +52 -0
- package/dist/crew/workflows.d.ts.map +1 -0
- package/dist/crew/workflows.js +36 -0
- package/dist/esm/agent/git.js +12 -0
- package/dist/esm/agents/coverage-evaluator.js +37 -0
- package/dist/esm/agents/cross-impact.js +131 -0
- package/dist/esm/agents/executor.js +66 -0
- package/dist/esm/agents/explorer.js +39 -0
- package/dist/esm/agents/generator.js +73 -0
- package/dist/esm/agents/healer.js +27 -0
- package/dist/esm/agents/impact-analyst.js +34 -0
- package/dist/esm/agents/regression-advisor.js +112 -0
- package/dist/esm/agents/strategist.js +83 -0
- package/dist/esm/agents/test-designer.js +102 -0
- package/dist/esm/cli/commands/crew.js +134 -0
- package/dist/esm/cli/parse_args.js +2 -1
- package/dist/esm/cli.js +5 -0
- package/dist/esm/crew/context.js +32 -0
- package/dist/esm/crew/orchestrator.js +167 -0
- package/dist/esm/crew/protocol.js +3 -0
- package/dist/esm/crew/provider.js +13 -0
- package/dist/esm/crew/sanitize.js +27 -0
- package/dist/esm/crew/types.js +3 -0
- package/dist/esm/crew/workflows.js +33 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/knowledge/route_families.js +2 -2
- package/dist/esm/logger.js +1 -2
- package/dist/esm/ollama_provider.js +1 -1
- package/dist/esm/prompts/cross-impact.js +71 -0
- package/dist/esm/prompts/strategist.js +79 -0
- package/dist/esm/prompts/test-designer.js +107 -0
- package/dist/esm/provider_factory.js +6 -10
- package/dist/esm/training/enricher.js +4 -3
- package/dist/esm/training/validator.js +2 -1
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -1
- package/dist/knowledge/route_families.d.ts.map +1 -1
- package/dist/knowledge/route_families.js +2 -2
- package/dist/logger.d.ts +1 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -2
- package/dist/ollama_provider.js +1 -1
- package/dist/prompts/cross-impact.d.ts +22 -0
- package/dist/prompts/cross-impact.d.ts.map +1 -0
- package/dist/prompts/cross-impact.js +75 -0
- package/dist/prompts/strategist.d.ts +25 -0
- package/dist/prompts/strategist.d.ts.map +1 -0
- package/dist/prompts/strategist.js +83 -0
- package/dist/prompts/test-designer.d.ts +33 -0
- package/dist/prompts/test-designer.d.ts.map +1 -0
- package/dist/prompts/test-designer.js +111 -0
- package/dist/provider_factory.d.ts.map +1 -1
- package/dist/provider_factory.js +6 -10
- package/dist/training/enricher.d.ts.map +1 -1
- package/dist/training/enricher.js +4 -3
- package/dist/training/validator.d.ts.map +1 -1
- package/dist/training/validator.js +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
import { sanitizeForPrompt } from '../crew/sanitize.js';
|
|
4
|
+
export function buildStrategistPrompt(ctx) {
|
|
5
|
+
const flowsBlock = ctx.impactedFlows
|
|
6
|
+
.map((f) => {
|
|
7
|
+
const specs = f.existingSpecs.map((s) => `${s.path} (${s.coverageLevel})`).join(', ') || 'none';
|
|
8
|
+
return [
|
|
9
|
+
`- ${f.flowId} (${f.priority}): ${f.flowName}`,
|
|
10
|
+
` Route Family: ${f.routeFamily}`,
|
|
11
|
+
` Action: ${f.action}`,
|
|
12
|
+
` Confidence: ${f.confidence}%`,
|
|
13
|
+
` Existing Coverage: ${specs}`,
|
|
14
|
+
` User Actions: ${sanitizeForPrompt(f.userActions.join('; ') || 'unknown')}`,
|
|
15
|
+
` Changed Files: ${f.changedFiles.join(', ')}`,
|
|
16
|
+
].join('\n');
|
|
17
|
+
})
|
|
18
|
+
.join('\n\n');
|
|
19
|
+
const crossImpactBlock = ctx.crossImpacts.length > 0
|
|
20
|
+
? ctx.crossImpacts.map((ci) => `- ${ci.sourceFamily} → ${ci.affectedFamily} (${ci.riskLevel}): ${ci.sharedDependency} — ${ci.evidence}`).join('\n')
|
|
21
|
+
: 'No cross-family impacts detected.';
|
|
22
|
+
const regressionBlock = ctx.regressionRisks.length > 0
|
|
23
|
+
? ctx.regressionRisks.map((r) => `- ${r.familyId} (risk=${r.riskScore}): ${r.reason}`).join('\n')
|
|
24
|
+
: 'No regression risk data available.';
|
|
25
|
+
return [
|
|
26
|
+
'You are a senior QA strategist designing the overall test strategy for a code change.',
|
|
27
|
+
'',
|
|
28
|
+
`IMPACTED FLOWS (${ctx.impactedFlows.length}):`,
|
|
29
|
+
flowsBlock,
|
|
30
|
+
'',
|
|
31
|
+
'CROSS-FAMILY IMPACTS:',
|
|
32
|
+
crossImpactBlock,
|
|
33
|
+
'',
|
|
34
|
+
'REGRESSION RISK:',
|
|
35
|
+
regressionBlock,
|
|
36
|
+
'',
|
|
37
|
+
'TASK: Design a prioritized test strategy for each impacted flow.',
|
|
38
|
+
'',
|
|
39
|
+
'For each flow, decide:',
|
|
40
|
+
'1. Approach: full-test (comprehensive), smoke-test (critical path only), skip, or manual-review',
|
|
41
|
+
'2. Priority: P0 (critical path), P1 (important), P2 (nice to have)',
|
|
42
|
+
'3. Test categories to cover (from: happy-path, edge-case, boundary, negative, state-transition, race-condition, permission, accessibility, performance)',
|
|
43
|
+
'4. Cross-impact risk level based on shared dependencies',
|
|
44
|
+
'',
|
|
45
|
+
'Return strict JSON only with this shape:',
|
|
46
|
+
'{"strategy":[{"flowId":"<id>","flowName":"<name>","priority":"P0|P1|P2","approach":"full-test|smoke-test|skip|manual-review","rationale":"<why this approach>","testCategories":["happy-path","edge-case",...],"crossImpactRisk":"high|medium|low|none"}]}',
|
|
47
|
+
'',
|
|
48
|
+
'Rules:',
|
|
49
|
+
'- P0 flows with create_spec or add_scenarios action should always get full-test.',
|
|
50
|
+
'- Flows with high cross-impact risk should be promoted to at least P1.',
|
|
51
|
+
'- Flows with high regression risk should include edge-case and boundary categories.',
|
|
52
|
+
'- Skip flows only if confidence < 30 AND no cross-impact risk.',
|
|
53
|
+
'- Include accessibility category for any flow involving interactive UI elements.',
|
|
54
|
+
'- Include permission category for any flow involving role-based features.',
|
|
55
|
+
'- Keep rationale concise (1-2 sentences) explaining why this approach was chosen.',
|
|
56
|
+
].join('\n');
|
|
57
|
+
}
|
|
58
|
+
export function parseStrategistResponse(text) {
|
|
59
|
+
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
60
|
+
const candidates = fenced ? [fenced[1], text] : [text];
|
|
61
|
+
for (const candidate of candidates) {
|
|
62
|
+
const start = candidate.indexOf('{');
|
|
63
|
+
const end = candidate.lastIndexOf('}');
|
|
64
|
+
if (start < 0 || end <= start) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const raw = candidate.slice(start, end + 1);
|
|
68
|
+
try {
|
|
69
|
+
const parsed = JSON.parse(raw);
|
|
70
|
+
if (parsed && Array.isArray(parsed.strategy)) {
|
|
71
|
+
return parsed;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
import { formatApiSurfaceForPrompt } from '../knowledge/api_surface.js';
|
|
4
|
+
import { sanitizeForPrompt } from '../crew/sanitize.js';
|
|
5
|
+
export function buildTestDesignerPrompt(ctx) {
|
|
6
|
+
const relevantClasses = ctx.apiSurface.pageObjects
|
|
7
|
+
.map((po) => po.className)
|
|
8
|
+
.filter((name) => {
|
|
9
|
+
const lower = name.toLowerCase();
|
|
10
|
+
const hints = [ctx.flow.routeFamily, ctx.flow.featureId, ...ctx.flow.userActions.join(' ').split(/\s+/)]
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.map((s) => s.toLowerCase().replace(/[^a-z]/g, ''));
|
|
13
|
+
return lower.includes('page') || hints.some((h) => h.length > 3 && lower.includes(h));
|
|
14
|
+
})
|
|
15
|
+
.slice(0, 10);
|
|
16
|
+
const apiBlock = relevantClasses.length > 0
|
|
17
|
+
? formatApiSurfaceForPrompt(ctx.apiSurface, relevantClasses)
|
|
18
|
+
: 'No page objects available.';
|
|
19
|
+
const existingSpecsBlock = ctx.existingSpecs.length > 0
|
|
20
|
+
? ctx.existingSpecs.map((s) => `- ${s.relativePath}: ${s.testTitles.join(', ')}`).join('\n')
|
|
21
|
+
: 'No existing specs.';
|
|
22
|
+
const crossImpactBlock = ctx.crossImpacts.length > 0
|
|
23
|
+
? ctx.crossImpacts.map((ci) => `- ${ci.sourceFamily} → ${ci.affectedFamily}: ${ci.sharedDependency} (${ci.riskLevel})`).join('\n')
|
|
24
|
+
: 'None detected.';
|
|
25
|
+
const categories = ctx.strategy.testCategories.join(', ');
|
|
26
|
+
return [
|
|
27
|
+
'You are a senior QA engineer designing comprehensive test cases for a Mattermost user flow.',
|
|
28
|
+
'',
|
|
29
|
+
`FLOW: ${ctx.flow.flowName}`,
|
|
30
|
+
`Flow ID: ${ctx.flow.flowId}`,
|
|
31
|
+
`Route Family: ${ctx.flow.routeFamily}${ctx.flow.featureId ? ` / ${ctx.flow.featureId}` : ''}`,
|
|
32
|
+
`Route: ${ctx.flow.specificRoute || '(not specified)'}`,
|
|
33
|
+
`Priority: ${ctx.strategy.priority}`,
|
|
34
|
+
`Approach: ${ctx.strategy.approach}`,
|
|
35
|
+
`User Actions: ${sanitizeForPrompt(ctx.flow.userActions.join('; ') || 'unknown')}`,
|
|
36
|
+
`Evidence: ${sanitizeForPrompt(ctx.flow.evidence)}`,
|
|
37
|
+
'',
|
|
38
|
+
`REQUIRED TEST CATEGORIES: ${categories}`,
|
|
39
|
+
'',
|
|
40
|
+
'AVAILABLE PAGE OBJECTS:',
|
|
41
|
+
apiBlock,
|
|
42
|
+
'',
|
|
43
|
+
'EXISTING SPECS (avoid duplicating these):',
|
|
44
|
+
existingSpecsBlock,
|
|
45
|
+
'',
|
|
46
|
+
'CROSS-FAMILY IMPACTS:',
|
|
47
|
+
crossImpactBlock,
|
|
48
|
+
'',
|
|
49
|
+
'TASK: Design structured test cases for this flow.',
|
|
50
|
+
'',
|
|
51
|
+
'Return strict JSON only with this shape:',
|
|
52
|
+
'{"testDesign":{"flowId":"<id>","flowName":"<name>","testCases":[{"name":"<descriptive name>","type":"<category>","preconditions":["<state required>"],"steps":["<user action>"],"expectedOutcome":"<what should happen>","priority":"P0|P1|P2","rationale":"<why this test matters>"}]}}',
|
|
53
|
+
'',
|
|
54
|
+
'TYPE VALUES: happy-path, edge-case, boundary, negative, state-transition, race-condition, permission, accessibility, performance',
|
|
55
|
+
'',
|
|
56
|
+
'Rules:',
|
|
57
|
+
'- Every test must describe a specific USER ACTION, not an implementation detail.',
|
|
58
|
+
'- Steps must be concrete: "click Create Channel button" not "test channel creation".',
|
|
59
|
+
'- Include preconditions (logged-in role, existing data state, etc.).',
|
|
60
|
+
'- Reference only page objects and methods listed above.',
|
|
61
|
+
'- Include a mandatory rationale explaining why this specific test case matters.',
|
|
62
|
+
'- Do NOT duplicate tests already covered by existing specs.',
|
|
63
|
+
'- Maximum 15 test cases per flow.',
|
|
64
|
+
'- For accessibility: test keyboard navigation, screen reader support, ARIA labels.',
|
|
65
|
+
'- For performance: test with realistic data volumes, measure load times.',
|
|
66
|
+
'- For edge cases: test unicode input, max-length fields, empty states, concurrent edits.',
|
|
67
|
+
'',
|
|
68
|
+
'FEW-SHOT EXAMPLES:',
|
|
69
|
+
'',
|
|
70
|
+
'Edge case example:',
|
|
71
|
+
'```json',
|
|
72
|
+
'{"name":"channel creation with unicode characters and max-length name","type":"edge-case","preconditions":["logged in as team member","team has < 1000 channels"],"steps":["open create channel dialog","enter 64-character name with emoji and CJK characters","click Create"],"expectedOutcome":"channel created successfully, name renders correctly in sidebar and header","priority":"P1","rationale":"catches encoding issues in channel name storage and rendering"}',
|
|
73
|
+
'```',
|
|
74
|
+
'',
|
|
75
|
+
'Permission example:',
|
|
76
|
+
'```json',
|
|
77
|
+
'{"name":"guest user cannot archive a public channel","type":"permission","preconditions":["logged in as guest user","guest has access to public channel"],"steps":["open channel header menu","look for Archive Channel option"],"expectedOutcome":"Archive Channel option is not visible in the menu","priority":"P0","rationale":"permission escalation bug — guests archiving channels could disrupt entire teams"}',
|
|
78
|
+
'```',
|
|
79
|
+
'',
|
|
80
|
+
'Accessibility example:',
|
|
81
|
+
'```json',
|
|
82
|
+
'{"name":"keyboard navigation through channel switcher results","type":"accessibility","preconditions":["logged in","channel switcher open via Ctrl+K"],"steps":["type partial channel name","press ArrowDown to navigate results","press Enter to select"],"expectedOutcome":"focus moves visually and via aria-activedescendant, selected channel opens","priority":"P1","rationale":"screen reader users rely on keyboard navigation — broken focus management makes the app unusable"}',
|
|
83
|
+
'```',
|
|
84
|
+
].join('\n');
|
|
85
|
+
}
|
|
86
|
+
export function parseTestDesignerResponse(text) {
|
|
87
|
+
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
88
|
+
const candidates = fenced ? [fenced[1], text] : [text];
|
|
89
|
+
for (const candidate of candidates) {
|
|
90
|
+
const start = candidate.indexOf('{');
|
|
91
|
+
const end = candidate.lastIndexOf('}');
|
|
92
|
+
if (start < 0 || end <= start) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const raw = candidate.slice(start, end + 1);
|
|
96
|
+
try {
|
|
97
|
+
const parsed = JSON.parse(raw);
|
|
98
|
+
if (parsed?.testDesign?.testCases && Array.isArray(parsed.testDesign.testCases)) {
|
|
99
|
+
return parsed;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
2
|
// See LICENSE.txt for license information.
|
|
3
3
|
import { AnthropicProvider } from './anthropic_provider.js';
|
|
4
|
+
import { logger } from './logger.js';
|
|
4
5
|
import { CustomProvider } from './custom_provider.js';
|
|
5
6
|
import { OllamaProvider } from './ollama_provider.js';
|
|
6
7
|
import { OpenAIProvider } from './openai_provider.js';
|
|
@@ -131,8 +132,7 @@ export class LLMProviderFactory {
|
|
|
131
132
|
const ollama = new OllamaProvider({});
|
|
132
133
|
const health = await ollama.checkHealth();
|
|
133
134
|
if (health.healthy) {
|
|
134
|
-
|
|
135
|
-
console.log('Auto-detected Ollama provider (free, local)');
|
|
135
|
+
logger.info('Auto-detected Ollama provider (free, local)');
|
|
136
136
|
return ollama;
|
|
137
137
|
}
|
|
138
138
|
throw new Error('No LLM provider available. Please either:\n' +
|
|
@@ -218,8 +218,7 @@ class HybridProvider {
|
|
|
218
218
|
}
|
|
219
219
|
async generateText(prompt, options) {
|
|
220
220
|
// Use primary for text generation (free)
|
|
221
|
-
|
|
222
|
-
console.log(`[Hybrid] Using ${this.primary.name} for text generation`);
|
|
221
|
+
logger.debug(`[Hybrid] Using ${this.primary.name} for text generation`);
|
|
223
222
|
return await this.primary.generateText(prompt, options);
|
|
224
223
|
}
|
|
225
224
|
async analyzeImage(images, prompt, options) {
|
|
@@ -227,8 +226,7 @@ class HybridProvider {
|
|
|
227
226
|
if (this.useFallbackFor.has('vision')) {
|
|
228
227
|
// Use fallback if primary doesn't support vision
|
|
229
228
|
if (!this.primary.capabilities.vision) {
|
|
230
|
-
|
|
231
|
-
console.log(`[Hybrid] Using ${this.fallback.name} for vision analysis (primary doesn't support vision)`);
|
|
229
|
+
logger.debug(`[Hybrid] Using ${this.fallback.name} for vision analysis (primary doesn't support vision)`);
|
|
232
230
|
if (!this.fallback.analyzeImage) {
|
|
233
231
|
throw new UnsupportedCapabilityError(this.name, 'vision');
|
|
234
232
|
}
|
|
@@ -237,8 +235,7 @@ class HybridProvider {
|
|
|
237
235
|
}
|
|
238
236
|
// Try primary first
|
|
239
237
|
if (this.primary.analyzeImage) {
|
|
240
|
-
|
|
241
|
-
console.log(`[Hybrid] Using ${this.primary.name} for vision analysis`);
|
|
238
|
+
logger.debug(`[Hybrid] Using ${this.primary.name} for vision analysis`);
|
|
242
239
|
return await this.primary.analyzeImage(images, prompt, options);
|
|
243
240
|
}
|
|
244
241
|
throw new UnsupportedCapabilityError(this.name, 'vision');
|
|
@@ -248,8 +245,7 @@ class HybridProvider {
|
|
|
248
245
|
if (!this.primary.streamText) {
|
|
249
246
|
throw new UnsupportedCapabilityError(this.primary.name, 'streaming');
|
|
250
247
|
}
|
|
251
|
-
|
|
252
|
-
console.log(`[Hybrid] Using ${this.primary.name} for streaming`);
|
|
248
|
+
logger.debug(`[Hybrid] Using ${this.primary.name} for streaming`);
|
|
253
249
|
yield* this.primary.streamText(prompt, options);
|
|
254
250
|
}
|
|
255
251
|
getUsageStats() {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// See LICENSE.txt for license information.
|
|
3
3
|
import { lstatSync, readdirSync, readFileSync } from 'fs';
|
|
4
4
|
import { join, relative, resolve } from 'path';
|
|
5
|
+
import { logger } from '../logger.js';
|
|
5
6
|
import { isGuessedRoute } from './types.js';
|
|
6
7
|
const MAX_FILES_PER_FAMILY = 20;
|
|
7
8
|
const MAX_LINES_PER_FILE = 50;
|
|
@@ -289,11 +290,11 @@ export async function enrichFamilies(families, scanned, projectRoot, provider, b
|
|
|
289
290
|
// Truncate at the last complete section boundary to avoid malformed input
|
|
290
291
|
const lastSectionEnd = prompt.lastIndexOf('\n---\n', MAX_PROMPT_CHARS);
|
|
291
292
|
if (lastSectionEnd > 0) {
|
|
292
|
-
|
|
293
|
+
logger.warn(`[train] Prompt truncated from ${prompt.length} chars at section boundary`);
|
|
293
294
|
prompt = prompt.slice(0, lastSectionEnd);
|
|
294
295
|
}
|
|
295
296
|
else {
|
|
296
|
-
|
|
297
|
+
logger.warn(`[train] Prompt truncated from ${prompt.length} to ${MAX_PROMPT_CHARS} chars`);
|
|
297
298
|
prompt = prompt.slice(0, MAX_PROMPT_CHARS);
|
|
298
299
|
}
|
|
299
300
|
}
|
|
@@ -325,7 +326,7 @@ export async function enrichFamilies(families, scanned, projectRoot, provider, b
|
|
|
325
326
|
}
|
|
326
327
|
catch (error) {
|
|
327
328
|
// On LLM failure, keep families unchanged
|
|
328
|
-
|
|
329
|
+
logger.warn(`[train] LLM enrichment failed for chunk: ${error instanceof Error ? error.message : String(error)}`);
|
|
329
330
|
enriched.push(...chunk);
|
|
330
331
|
}
|
|
331
332
|
finally {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// See LICENSE.txt for license information.
|
|
3
3
|
import { execFileSync } from 'child_process';
|
|
4
4
|
import { resolve } from 'path';
|
|
5
|
+
import { logger } from '../logger.js';
|
|
5
6
|
import { bindFilesToFamilies } from '../knowledge/route_families.js';
|
|
6
7
|
/**
|
|
7
8
|
* Glob-style patterns for infrastructure / cross-cutting files that will never
|
|
@@ -103,7 +104,7 @@ export function getCommitFiles(projectRoot, since) {
|
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
106
|
catch (error) {
|
|
106
|
-
|
|
107
|
+
logger.warn(`[train] git log failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
107
108
|
return [];
|
|
108
109
|
}
|
|
109
110
|
return parseGitLog(log);
|
package/dist/index.d.ts
CHANGED
|
@@ -54,6 +54,23 @@ export type { PlanReport } from './agent/plan.js';
|
|
|
54
54
|
export { runAgenticGeneration } from './agentic/runner.js';
|
|
55
55
|
export type { ScenarioInput, AgenticRunOptions } from './agentic/runner.js';
|
|
56
56
|
export type { AgenticConfig, AgenticResult, AgenticSummary, PlaywrightRunResult, TestFailure } from './agentic/types.js';
|
|
57
|
+
export { CrewOrchestrator } from './crew/orchestrator.js';
|
|
58
|
+
export type { CrewConfig, CrewResult } from './crew/orchestrator.js';
|
|
59
|
+
export type { CrewContext } from './crew/context.js';
|
|
60
|
+
export type { Agent, AgentTask, AgentResult, AgentMessage } from './crew/protocol.js';
|
|
61
|
+
export type { AgentRole, TestCaseType, TestCase, TestDesign, CrossImpact, Finding, RegressionRisk, StrategyEntry, } from './crew/types.js';
|
|
62
|
+
export type { WorkflowDef, WorkflowName } from './crew/workflows.js';
|
|
63
|
+
export { WORKFLOWS } from './crew/workflows.js';
|
|
64
|
+
export { ImpactAnalystAgent } from './agents/impact-analyst.js';
|
|
65
|
+
export { CoverageEvaluatorAgent } from './agents/coverage-evaluator.js';
|
|
66
|
+
export { GeneratorAgent } from './agents/generator.js';
|
|
67
|
+
export { ExecutorAgent } from './agents/executor.js';
|
|
68
|
+
export { HealerAgent } from './agents/healer.js';
|
|
69
|
+
export { ExplorerAgent } from './agents/explorer.js';
|
|
70
|
+
export { StrategistAgent } from './agents/strategist.js';
|
|
71
|
+
export { TestDesignerAgent } from './agents/test-designer.js';
|
|
72
|
+
export { CrossImpactAgent } from './agents/cross-impact.js';
|
|
73
|
+
export { RegressionAdvisorAgent } from './agents/regression-advisor.js';
|
|
57
74
|
export { scanProject } from './training/scanner.js';
|
|
58
75
|
export { mergeFamilies, detectStaleFamilies } from './training/merger.js';
|
|
59
76
|
export { enrichFamilies } from './training/enricher.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAGH,YAAY,EACR,WAAW,EACX,eAAe,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,YAAY,GACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,gBAAgB,EAAE,0BAA0B,EAAC,MAAM,yBAAyB,CAAC;AAGrF,OAAO,EAAC,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,uBAAuB,CAAC;AAChF,YAAY,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAC,0BAA0B,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAC,MAAM,UAAU,CAAC;AACjJ,YAAY,EACR,eAAe,EACf,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,GAChC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAC,aAAa,IAAI,eAAe,EAAE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAC3H,YAAY,EAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAC,MAAM,2BAA2B,CAAC;AAC5K,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAC,0BAA0B,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACvH,YAAY,EAAC,2BAA2B,EAAE,kBAAkB,EAAE,YAAY,EAAE,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAC3H,OAAO,EAAC,sBAAsB,EAAC,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAC,6BAA6B,EAAE,4BAA4B,EAAC,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAC,uBAAuB,EAAC,MAAM,gCAAgC,CAAC;AACvE,YAAY,EAAC,yBAAyB,EAAE,wBAAwB,EAAE,uBAAuB,EAAC,MAAM,gCAAgC,CAAC;AACjI,OAAO,EAAC,wBAAwB,EAAC,MAAM,iCAAiC,CAAC;AACzE,YAAY,EAAC,0BAA0B,EAAE,yBAAyB,EAAC,MAAM,iCAAiC,CAAC;AAG3G,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,YAAY,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,4BAA4B,CAAC;AAC/E,YAAY,EAAC,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,UAAU,EAAE,cAAc,EAAC,MAAM,+BAA+B,CAAC;AACrI,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,YAAY,EAAC,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAC,MAAM,iCAAiC,CAAC;AACvG,OAAO,EAAC,qBAAqB,EAAE,uBAAuB,EAAE,yBAAyB,EAAC,MAAM,yBAAyB,CAAC;AAClH,YAAY,EAAC,uBAAuB,EAAE,uBAAuB,EAAC,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAAC,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAC/G,YAAY,EAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAC,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACzE,YAAY,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAC,uBAAuB,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AACxK,YAAY,EAAC,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAChI,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAAC,MAAM,4BAA4B,CAAC;AAClF,YAAY,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAC,cAAc,EAAE,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5E,YAAY,EAAC,SAAS,EAAE,SAAS,EAAC,MAAM,2BAA2B,CAAC;AAGpE,YAAY,EAAC,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AACnG,YAAY,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAC,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAGvH,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAC,aAAa,EAAE,mBAAmB,EAAC,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAC,cAAc,EAAC,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAC,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AACtH,YAAY,EACR,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EACxD,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,GAClF,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// See LICENSE.txt for license information.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.runAgenticGeneration = exports.getSpecsForFamily = exports.buildSpecIndex = exports.loadOrBuildApiSurface = exports.buildApiSurface = exports.getUserFlowsForBinding = exports.getPriorityForBinding = exports.getCypressSpecDirsForBinding = exports.bindFilesToFamilies = exports.loadRouteFamilyManifest = exports.buildQualityFixPrompt = exports.buildHealPrompt = exports.renderHealMarkdown = exports.resolveHealTargets = exports.healFromReport = exports.runHealStage = exports.detectHallucinatedMethods = exports.parseGenerationResponse = exports.buildGenerationPrompt = exports.runGenerationStage = exports.runPipeline = exports.captureTraceabilityInput = exports.ingestTraceabilityInput = exports.finalizeGeneratedTests = exports.getAdaptiveThresholds = exports.readFlakyTests = exports.readCalibration = exports.appendFeedbackAndRecompute = exports.buildPlanFromImpact = exports.extractScenarios = exports.getPartialGaps = exports.getGapsWithSuppressed = exports.getGaps = exports.analyzeImpactV2 = exports.captureTraceability = exports.ingestTraceability = exports.handoffGeneratedTests = exports.recommendTestsDeterministic = exports.analyzeImpactDeterministic = exports.validateProviderSetup = exports.LLMProviderFactory = exports.CustomProvider = exports.checkOpenAISetup = exports.OpenAIProvider = exports.checkOllamaSetup = exports.OllamaProvider = exports.checkAnthropicSetup = exports.AnthropicProvider = exports.UnsupportedCapabilityError = exports.LLMProviderError = void 0;
|
|
6
|
-
exports.formatValidationReport = exports.buildValidationReport = exports.validateCommit = exports.getCommitFiles = exports.enrichFamilies = exports.detectStaleFamilies = exports.mergeFamilies = exports.scanProject = void 0;
|
|
6
|
+
exports.formatValidationReport = exports.buildValidationReport = exports.validateCommit = exports.getCommitFiles = exports.enrichFamilies = exports.detectStaleFamilies = exports.mergeFamilies = exports.scanProject = exports.RegressionAdvisorAgent = exports.CrossImpactAgent = exports.TestDesignerAgent = exports.StrategistAgent = exports.ExplorerAgent = exports.HealerAgent = exports.ExecutorAgent = exports.GeneratorAgent = exports.CoverageEvaluatorAgent = exports.ImpactAnalystAgent = exports.WORKFLOWS = exports.CrewOrchestrator = void 0;
|
|
7
7
|
var provider_interface_js_1 = require("./provider_interface.js");
|
|
8
8
|
Object.defineProperty(exports, "LLMProviderError", { enumerable: true, get: function () { return provider_interface_js_1.LLMProviderError; } });
|
|
9
9
|
Object.defineProperty(exports, "UnsupportedCapabilityError", { enumerable: true, get: function () { return provider_interface_js_1.UnsupportedCapabilityError; } });
|
|
@@ -84,6 +84,32 @@ Object.defineProperty(exports, "getSpecsForFamily", { enumerable: true, get: fun
|
|
|
84
84
|
// Agentic generation
|
|
85
85
|
var runner_js_1 = require("./agentic/runner.js");
|
|
86
86
|
Object.defineProperty(exports, "runAgenticGeneration", { enumerable: true, get: function () { return runner_js_1.runAgenticGeneration; } });
|
|
87
|
+
// Crew (multi-agent QA workflows)
|
|
88
|
+
var orchestrator_js_2 = require("./crew/orchestrator.js");
|
|
89
|
+
Object.defineProperty(exports, "CrewOrchestrator", { enumerable: true, get: function () { return orchestrator_js_2.CrewOrchestrator; } });
|
|
90
|
+
var workflows_js_1 = require("./crew/workflows.js");
|
|
91
|
+
Object.defineProperty(exports, "WORKFLOWS", { enumerable: true, get: function () { return workflows_js_1.WORKFLOWS; } });
|
|
92
|
+
// Crew agents
|
|
93
|
+
var impact_analyst_js_1 = require("./agents/impact-analyst.js");
|
|
94
|
+
Object.defineProperty(exports, "ImpactAnalystAgent", { enumerable: true, get: function () { return impact_analyst_js_1.ImpactAnalystAgent; } });
|
|
95
|
+
var coverage_evaluator_js_1 = require("./agents/coverage-evaluator.js");
|
|
96
|
+
Object.defineProperty(exports, "CoverageEvaluatorAgent", { enumerable: true, get: function () { return coverage_evaluator_js_1.CoverageEvaluatorAgent; } });
|
|
97
|
+
var generator_js_1 = require("./agents/generator.js");
|
|
98
|
+
Object.defineProperty(exports, "GeneratorAgent", { enumerable: true, get: function () { return generator_js_1.GeneratorAgent; } });
|
|
99
|
+
var executor_js_1 = require("./agents/executor.js");
|
|
100
|
+
Object.defineProperty(exports, "ExecutorAgent", { enumerable: true, get: function () { return executor_js_1.ExecutorAgent; } });
|
|
101
|
+
var healer_js_1 = require("./agents/healer.js");
|
|
102
|
+
Object.defineProperty(exports, "HealerAgent", { enumerable: true, get: function () { return healer_js_1.HealerAgent; } });
|
|
103
|
+
var explorer_js_1 = require("./agents/explorer.js");
|
|
104
|
+
Object.defineProperty(exports, "ExplorerAgent", { enumerable: true, get: function () { return explorer_js_1.ExplorerAgent; } });
|
|
105
|
+
var strategist_js_1 = require("./agents/strategist.js");
|
|
106
|
+
Object.defineProperty(exports, "StrategistAgent", { enumerable: true, get: function () { return strategist_js_1.StrategistAgent; } });
|
|
107
|
+
var test_designer_js_1 = require("./agents/test-designer.js");
|
|
108
|
+
Object.defineProperty(exports, "TestDesignerAgent", { enumerable: true, get: function () { return test_designer_js_1.TestDesignerAgent; } });
|
|
109
|
+
var cross_impact_js_1 = require("./agents/cross-impact.js");
|
|
110
|
+
Object.defineProperty(exports, "CrossImpactAgent", { enumerable: true, get: function () { return cross_impact_js_1.CrossImpactAgent; } });
|
|
111
|
+
var regression_advisor_js_1 = require("./agents/regression-advisor.js");
|
|
112
|
+
Object.defineProperty(exports, "RegressionAdvisorAgent", { enumerable: true, get: function () { return regression_advisor_js_1.RegressionAdvisorAgent; } });
|
|
87
113
|
// Training (route-families bootstrap and maintenance)
|
|
88
114
|
var scanner_js_1 = require("./training/scanner.js");
|
|
89
115
|
Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return scanner_js_1.scanProject; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route_families.d.ts","sourceRoot":"","sources":["../../src/knowledge/route_families.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route_families.d.ts","sourceRoot":"","sources":["../../src/knowledge/route_families.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ exports.getRoutesForBinding = getRoutesForBinding;
|
|
|
16
16
|
exports.clearManifestCache = clearManifestCache;
|
|
17
17
|
const fs_1 = require("fs");
|
|
18
18
|
const path_1 = require("path");
|
|
19
|
+
const logger_js_1 = require("../logger.js");
|
|
19
20
|
const manifestCache = new Map();
|
|
20
21
|
function matchesGlob(filePath, pattern) {
|
|
21
22
|
const normalized = filePath.replace(/\\/g, '/');
|
|
@@ -168,8 +169,7 @@ function loadRouteFamilyManifest(testsRoot, config) {
|
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
if (config?.strict) {
|
|
171
|
-
|
|
172
|
-
console.warn('[e2e-agents] Route family manifest not found. The manifest is optional context for AI enrichment — create .e2e-ai-agents/route-families.json to enable family-level routing hints.');
|
|
172
|
+
logger_js_1.logger.warn('Route family manifest not found. Create .e2e-ai-agents/route-families.json to enable family-level routing hints.');
|
|
173
173
|
}
|
|
174
174
|
return null;
|
|
175
175
|
}
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,oBAAY,QAAQ;IAChB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACZ;AAqCD,qBAAa,MAAM;IACf,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAU;gBAEd,QAAQ,CAAC,EAAE,QAAQ;IAK/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAC,GAAG,EAAE,MAAM,MAAM,CAAA;KAAC;IAWzC,OAAO,CAAC,GAAG;CAoBd;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.logger = exports.Logger = exports.LogLevel = void 0;
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* Replaces 18 console.log statements with configurable logging
|
|
7
|
+
* Structured logging system.
|
|
9
8
|
* Environment variable: LOG_LEVEL (ERROR, WARN, INFO, DEBUG)
|
|
10
9
|
*/
|
|
11
10
|
var LogLevel;
|
package/dist/ollama_provider.js
CHANGED
|
@@ -110,7 +110,7 @@ class OllamaProvider extends base_provider_js_1.BaseProvider {
|
|
|
110
110
|
// SECURITY: Validate and sanitize URL
|
|
111
111
|
const urlValidation = validateOllamaUrl(config.baseUrl);
|
|
112
112
|
if (!urlValidation.valid && urlValidation.warning) {
|
|
113
|
-
|
|
113
|
+
logger_js_1.logger.warn(urlValidation.warning);
|
|
114
114
|
}
|
|
115
115
|
// SECURITY: Validate timeout
|
|
116
116
|
const timeout = validateTimeout(config.timeout);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Impact Analyst prompt — finds ripple effects across route families.
|
|
3
|
+
*/
|
|
4
|
+
import type { RouteFamily } from '../knowledge/route_families.js';
|
|
5
|
+
export interface CrossImpactPromptContext {
|
|
6
|
+
changedFiles: string[];
|
|
7
|
+
families: RouteFamily[];
|
|
8
|
+
/** The families directly impacted by changed files */
|
|
9
|
+
directlyImpactedFamilyIds: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function buildCrossImpactPrompt(ctx: CrossImpactPromptContext): string;
|
|
12
|
+
export interface CrossImpactAgentResponse {
|
|
13
|
+
crossImpacts: Array<{
|
|
14
|
+
sourceFamily: string;
|
|
15
|
+
affectedFamily: string;
|
|
16
|
+
sharedDependency: string;
|
|
17
|
+
riskLevel: 'high' | 'medium' | 'low' | string;
|
|
18
|
+
evidence: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare function parseCrossImpactResponse(text: string): CrossImpactAgentResponse | null;
|
|
22
|
+
//# sourceMappingURL=cross-impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-impact.d.ts","sourceRoot":"","sources":["../../src/prompts/cross-impact.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gCAAgC,CAAC;AAIhE,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,sDAAsD;IACtD,yBAAyB,EAAE,MAAM,EAAE,CAAC;CACvC;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CA+C5E;AAED,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,KAAK,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACN;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAqBtF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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.buildCrossImpactPrompt = buildCrossImpactPrompt;
|
|
6
|
+
exports.parseCrossImpactResponse = parseCrossImpactResponse;
|
|
7
|
+
const sanitize_js_1 = require("../crew/sanitize.js");
|
|
8
|
+
function buildCrossImpactPrompt(ctx) {
|
|
9
|
+
const familiesBlock = ctx.families
|
|
10
|
+
.map((f) => {
|
|
11
|
+
const paths = [
|
|
12
|
+
...(f.webappPaths || []),
|
|
13
|
+
...(f.serverPaths || []),
|
|
14
|
+
...(f.components || []),
|
|
15
|
+
];
|
|
16
|
+
return `- ${f.id}: routes=[${f.routes.join(', ')}] paths=[${paths.join(', ')}] pageObjects=[${(f.pageObjects || []).join(', ')}]`;
|
|
17
|
+
})
|
|
18
|
+
.join('\n');
|
|
19
|
+
const changedBlock = ctx.changedFiles.map((f) => (0, sanitize_js_1.sanitizeForPrompt)(f)).join('\n');
|
|
20
|
+
return [
|
|
21
|
+
'You are analyzing code changes in Mattermost to identify cross-family ripple effects.',
|
|
22
|
+
'When a change in one route family could affect another family through shared dependencies,',
|
|
23
|
+
'that is a cross-impact.',
|
|
24
|
+
'',
|
|
25
|
+
`CHANGED FILES (${ctx.changedFiles.length}):`,
|
|
26
|
+
changedBlock,
|
|
27
|
+
'',
|
|
28
|
+
`DIRECTLY IMPACTED FAMILIES: ${ctx.directlyImpactedFamilyIds.join(', ')}`,
|
|
29
|
+
'',
|
|
30
|
+
`ALL ROUTE FAMILIES (${ctx.families.length}):`,
|
|
31
|
+
familiesBlock,
|
|
32
|
+
'',
|
|
33
|
+
'TASK: Identify cross-family impacts. For each pair, explain the shared dependency.',
|
|
34
|
+
'',
|
|
35
|
+
'Look for:',
|
|
36
|
+
'1. Shared webapp paths (same component used by multiple families)',
|
|
37
|
+
'2. Shared page objects (same PO class referenced by multiple families)',
|
|
38
|
+
'3. Shared API endpoints (changes affecting data used by multiple families)',
|
|
39
|
+
'4. Shared components (React components imported across family boundaries)',
|
|
40
|
+
'5. Shared state management (Redux stores, contexts used across families)',
|
|
41
|
+
'',
|
|
42
|
+
'Return strict JSON only with this shape:',
|
|
43
|
+
'{"crossImpacts":[{"sourceFamily":"<directly impacted family>","affectedFamily":"<indirectly affected family>","sharedDependency":"<what connects them>","riskLevel":"high|medium|low","evidence":"<specific file/component/API that creates the dependency>"}]}',
|
|
44
|
+
'',
|
|
45
|
+
'Rules:',
|
|
46
|
+
'- Only report cross-impacts where both families are in the manifest.',
|
|
47
|
+
'- sourceFamily must be one of the directly impacted families.',
|
|
48
|
+
'- affectedFamily must be DIFFERENT from sourceFamily.',
|
|
49
|
+
'- Risk levels: high = shared data model/state, medium = shared UI component, low = shared utility.',
|
|
50
|
+
'- Evidence must cite specific files, components, or API paths.',
|
|
51
|
+
'- Return empty array if no cross-impacts are found.',
|
|
52
|
+
].join('\n');
|
|
53
|
+
}
|
|
54
|
+
function parseCrossImpactResponse(text) {
|
|
55
|
+
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
56
|
+
const candidates = fenced ? [fenced[1], text] : [text];
|
|
57
|
+
for (const candidate of candidates) {
|
|
58
|
+
const start = candidate.indexOf('{');
|
|
59
|
+
const end = candidate.lastIndexOf('}');
|
|
60
|
+
if (start < 0 || end <= start) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const raw = candidate.slice(start, end + 1);
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
if (parsed && Array.isArray(parsed.crossImpacts)) {
|
|
67
|
+
return parsed;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategist prompt — designs overall test strategy from impact analysis,
|
|
3
|
+
* cross-impact data, and regression risk.
|
|
4
|
+
*/
|
|
5
|
+
import type { FlowDecision } from '../validation/output_schema.js';
|
|
6
|
+
import type { CrossImpact, RegressionRisk } from '../crew/types.js';
|
|
7
|
+
export interface StrategistPromptContext {
|
|
8
|
+
impactedFlows: FlowDecision[];
|
|
9
|
+
crossImpacts: CrossImpact[];
|
|
10
|
+
regressionRisks: RegressionRisk[];
|
|
11
|
+
}
|
|
12
|
+
export declare function buildStrategistPrompt(ctx: StrategistPromptContext): string;
|
|
13
|
+
export interface StrategistAgentResponse {
|
|
14
|
+
strategy: Array<{
|
|
15
|
+
flowId: string;
|
|
16
|
+
flowName: string;
|
|
17
|
+
priority: 'P0' | 'P1' | 'P2' | string;
|
|
18
|
+
approach: 'full-test' | 'smoke-test' | 'skip' | 'manual-review' | string;
|
|
19
|
+
rationale: string;
|
|
20
|
+
testCategories: string[];
|
|
21
|
+
crossImpactRisk: 'high' | 'medium' | 'low' | 'none' | string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export declare function parseStrategistResponse(text: string): StrategistAgentResponse | null;
|
|
25
|
+
//# sourceMappingURL=strategist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategist.d.ts","sourceRoot":"","sources":["../../src/prompts/strategist.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAC,WAAW,EAAE,cAAc,EAAgB,MAAM,kBAAkB,CAAC;AAGjF,MAAM,WAAW,uBAAuB;IACpC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,cAAc,EAAE,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CA4D1E;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;QACtC,QAAQ,EAAE,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC;QACzE,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;KAChE,CAAC,CAAC;CACN;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAqBpF"}
|