mycontext-cli 4.2.10 → 4.2.11
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 +13 -4
- package/dist/README.md +13 -4
- package/dist/agents/implementations/ArchitectAgent.js.map +1 -1
- package/dist/agents/implementations/BuildStrategyAgent.js.map +1 -1
- package/dist/agents/implementations/CodeGenSubAgent.js.map +1 -1
- package/dist/agents/implementations/DemoRecorderAgent.d.ts +73 -0
- package/dist/agents/implementations/DemoRecorderAgent.d.ts.map +1 -0
- package/dist/agents/implementations/DemoRecorderAgent.js +485 -0
- package/dist/agents/implementations/DemoRecorderAgent.js.map +1 -0
- package/dist/agents/implementations/DesignPipelineAgent.d.ts +4 -0
- package/dist/agents/implementations/DesignPipelineAgent.d.ts.map +1 -1
- package/dist/agents/implementations/DesignPipelineAgent.js +82 -10
- package/dist/agents/implementations/DesignPipelineAgent.js.map +1 -1
- package/dist/agents/implementations/DocsSubAgent.js.map +1 -1
- package/dist/agents/implementations/FeaturePlannerAgent.d.ts +10 -0
- package/dist/agents/implementations/FeaturePlannerAgent.d.ts.map +1 -0
- package/dist/agents/implementations/FeaturePlannerAgent.js +35 -0
- package/dist/agents/implementations/FeaturePlannerAgent.js.map +1 -0
- package/dist/agents/implementations/QASubAgent.js.map +1 -1
- package/dist/agents/implementations/SecurityAgent.js.map +1 -1
- package/dist/agents/implementations/VOScriptExtractorAgent.d.ts +84 -0
- package/dist/agents/implementations/VOScriptExtractorAgent.d.ts.map +1 -0
- package/dist/agents/implementations/VOScriptExtractorAgent.js +414 -0
- package/dist/agents/implementations/VOScriptExtractorAgent.js.map +1 -0
- package/dist/agents/implementations/VisionNavigatorAgent.d.ts +52 -0
- package/dist/agents/implementations/VisionNavigatorAgent.d.ts.map +1 -0
- package/dist/agents/implementations/VisionNavigatorAgent.js +313 -0
- package/dist/agents/implementations/VisionNavigatorAgent.js.map +1 -0
- package/dist/agents/implementations/VisionTestCoordinator.d.ts +51 -0
- package/dist/agents/implementations/VisionTestCoordinator.d.ts.map +1 -0
- package/dist/agents/implementations/VisionTestCoordinator.js +348 -0
- package/dist/agents/implementations/VisionTestCoordinator.js.map +1 -0
- package/dist/agents/implementations/VisualValidatorAgent.d.ts +83 -0
- package/dist/agents/implementations/VisualValidatorAgent.d.ts.map +1 -0
- package/dist/agents/implementations/VisualValidatorAgent.js +472 -0
- package/dist/agents/implementations/VisualValidatorAgent.js.map +1 -0
- package/dist/agents/orchestrator/SubAgentOrchestrator.js.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/clients/ClaudeSDKClient.d.ts +4 -0
- package/dist/clients/ClaudeSDKClient.d.ts.map +1 -1
- package/dist/clients/ClaudeSDKClient.js +8 -0
- package/dist/clients/ClaudeSDKClient.js.map +1 -1
- package/dist/clients/MyContextAIClient.d.ts +4 -0
- package/dist/clients/MyContextAIClient.d.ts.map +1 -1
- package/dist/clients/MyContextAIClient.js +69 -0
- package/dist/clients/MyContextAIClient.js.map +1 -1
- package/dist/clients/ProviderChain.d.ts +1 -0
- package/dist/clients/ProviderChain.d.ts.map +1 -1
- package/dist/clients/ProviderChain.js +3 -0
- package/dist/clients/ProviderChain.js.map +1 -1
- package/dist/clients/XAIClient.d.ts +4 -0
- package/dist/clients/XAIClient.d.ts.map +1 -1
- package/dist/clients/XAIClient.js +8 -0
- package/dist/clients/XAIClient.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +110 -204
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plan-feature.d.ts +3 -0
- package/dist/commands/plan-feature.d.ts.map +1 -0
- package/dist/commands/plan-feature.js +57 -0
- package/dist/commands/plan-feature.js.map +1 -0
- package/dist/commands/sanitize.d.ts.map +1 -1
- package/dist/commands/sanitize.js +95 -7
- package/dist/commands/sanitize.js.map +1 -1
- package/dist/commands/vision-test.d.ts +67 -0
- package/dist/commands/vision-test.d.ts.map +1 -0
- package/dist/commands/vision-test.js +347 -0
- package/dist/commands/vision-test.js.map +1 -0
- package/dist/core/ai/AICore.d.ts +13 -0
- package/dist/core/ai/AICore.d.ts.map +1 -1
- package/dist/core/ai/AICore.js +65 -0
- package/dist/core/ai/AICore.js.map +1 -1
- package/dist/doctor/rules/node-rules.d.ts.map +1 -1
- package/dist/doctor/rules/node-rules.js +41 -0
- package/dist/doctor/rules/node-rules.js.map +1 -1
- package/dist/interfaces/AIClient.d.ts +1 -0
- package/dist/interfaces/AIClient.d.ts.map +1 -1
- package/dist/interfaces/AIClient.js.map +1 -1
- package/dist/mcp/vision-test-runner.d.ts +57 -0
- package/dist/mcp/vision-test-runner.d.ts.map +1 -0
- package/dist/mcp/vision-test-runner.js +337 -0
- package/dist/mcp/vision-test-runner.js.map +1 -0
- package/dist/mcp/vision-testing-server.d.ts +38 -0
- package/dist/mcp/vision-testing-server.d.ts.map +1 -0
- package/dist/mcp/vision-testing-server.js +637 -0
- package/dist/mcp/vision-testing-server.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/services/gemini-vision.d.ts +3 -11
- package/dist/services/gemini-vision.d.ts.map +1 -1
- package/dist/services/gemini-vision.js +13 -132
- package/dist/services/gemini-vision.js.map +1 -1
- package/dist/services/llmClarifier.d.ts +9 -0
- package/dist/services/llmClarifier.d.ts.map +1 -0
- package/dist/services/llmClarifier.js +22 -0
- package/dist/services/llmClarifier.js.map +1 -0
- package/dist/services/vision-element-finder.d.ts +64 -0
- package/dist/services/vision-element-finder.d.ts.map +1 -0
- package/dist/services/vision-element-finder.js +446 -0
- package/dist/services/vision-element-finder.js.map +1 -0
- package/dist/types/flow-testing.d.ts +1 -1
- package/dist/types/flow-testing.d.ts.map +1 -1
- package/dist/types/vision-testing.d.ts +382 -0
- package/dist/types/vision-testing.d.ts.map +1 -0
- package/dist/types/vision-testing.js +9 -0
- package/dist/types/vision-testing.js.map +1 -0
- package/dist/utils/claudeAgentClient.d.ts +4 -0
- package/dist/utils/claudeAgentClient.d.ts.map +1 -1
- package/dist/utils/claudeAgentClient.js +8 -0
- package/dist/utils/claudeAgentClient.js.map +1 -1
- package/dist/utils/geminiClient.d.ts +41 -6
- package/dist/utils/geminiClient.d.ts.map +1 -1
- package/dist/utils/geminiClient.js +124 -18
- package/dist/utils/geminiClient.js.map +1 -1
- package/dist/utils/githubModelsClient.d.ts +19 -6
- package/dist/utils/githubModelsClient.d.ts.map +1 -1
- package/dist/utils/githubModelsClient.js +94 -7
- package/dist/utils/githubModelsClient.js.map +1 -1
- package/dist/utils/openRouterClient.d.ts +12 -3
- package/dist/utils/openRouterClient.d.ts.map +1 -1
- package/dist/utils/openRouterClient.js +91 -2
- package/dist/utils/openRouterClient.js.map +1 -1
- package/dist/utils/unifiedDesignContextLoader.d.ts.map +1 -1
- package/dist/utils/unifiedDesignContextLoader.js +15 -0
- package/dist/utils/unifiedDesignContextLoader.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vision Test Coordinator
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates all vision-based testing agents using the Living Brain (context.json) as
|
|
6
|
+
* the communication blackboard. Coordinates navigation, validation, demo recording, and
|
|
7
|
+
* script generation in a cohesive workflow.
|
|
8
|
+
*
|
|
9
|
+
* Uses the SubAgentOrchestrator pattern for robust agent management.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.VisionTestCoordinator = void 0;
|
|
49
|
+
const SubAgentOrchestrator_1 = require("../orchestrator/SubAgentOrchestrator");
|
|
50
|
+
const VisionNavigatorAgent_1 = require("./VisionNavigatorAgent");
|
|
51
|
+
const VisualValidatorAgent_1 = require("./VisualValidatorAgent");
|
|
52
|
+
const DemoRecorderAgent_1 = require("./DemoRecorderAgent");
|
|
53
|
+
const VOScriptExtractorAgent_1 = require("./VOScriptExtractorAgent");
|
|
54
|
+
const ContextService_1 = require("../../services/ContextService");
|
|
55
|
+
const AICore_1 = require("../../core/ai/AICore");
|
|
56
|
+
const uuid_1 = require("uuid");
|
|
57
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
class VisionTestCoordinator {
|
|
60
|
+
constructor() {
|
|
61
|
+
this.name = "VisionTestCoordinator";
|
|
62
|
+
this.description = "Master coordinator for vision-based testing workflows";
|
|
63
|
+
this.personality = `You are a master coordinator overseeing an autonomous testing team.
|
|
64
|
+
You delegate tasks to specialized agents, monitor their progress via the Living Brain, and
|
|
65
|
+
ensure all pieces come together into a cohesive test execution. You're the conductor of the
|
|
66
|
+
vision testing orchestra.`;
|
|
67
|
+
this.llmProvider = "multi"; // Uses multiple providers through agents
|
|
68
|
+
this.expertise = [
|
|
69
|
+
"Test orchestration",
|
|
70
|
+
"Agent coordination",
|
|
71
|
+
"Workflow management",
|
|
72
|
+
"Result aggregation",
|
|
73
|
+
"Living Brain communication",
|
|
74
|
+
];
|
|
75
|
+
// Initialize orchestrator
|
|
76
|
+
this.orchestrator = new SubAgentOrchestrator_1.SubAgentOrchestrator();
|
|
77
|
+
// Initialize specialized agents
|
|
78
|
+
this.navigatorAgent = new VisionNavigatorAgent_1.VisionNavigatorAgent();
|
|
79
|
+
this.validatorAgent = new VisualValidatorAgent_1.VisualValidatorAgent();
|
|
80
|
+
this.recorderAgent = new DemoRecorderAgent_1.DemoRecorderAgent();
|
|
81
|
+
this.voExtractorAgent = new VOScriptExtractorAgent_1.VOScriptExtractorAgent();
|
|
82
|
+
// Register agents with orchestrator
|
|
83
|
+
this.orchestrator.registerAgent(this.navigatorAgent);
|
|
84
|
+
this.orchestrator.registerAgent(this.validatorAgent);
|
|
85
|
+
this.orchestrator.registerAgent(this.recorderAgent);
|
|
86
|
+
this.orchestrator.registerAgent(this.voExtractorAgent);
|
|
87
|
+
}
|
|
88
|
+
async run(input) {
|
|
89
|
+
const { page, browserContext, mission, projectPath } = input;
|
|
90
|
+
// Initialize context service
|
|
91
|
+
this.contextService = new ContextService_1.ContextService(projectPath);
|
|
92
|
+
await this.contextService.initialize();
|
|
93
|
+
const executionId = (0, uuid_1.v4)();
|
|
94
|
+
const startTime = Date.now();
|
|
95
|
+
console.log(chalk_1.default.bold.blue(`\n${"=".repeat(60)}`));
|
|
96
|
+
console.log(chalk_1.default.bold.blue(`🎯 VISION TEST COORDINATOR`));
|
|
97
|
+
console.log(chalk_1.default.bold.blue(`${"=".repeat(60)}\n`));
|
|
98
|
+
console.log(chalk_1.default.white(`Mission: ${mission.name}`));
|
|
99
|
+
console.log(chalk_1.default.gray(`ID: ${executionId}`));
|
|
100
|
+
console.log(chalk_1.default.gray(`Record Demo: ${mission.recordDemo || false}\n`));
|
|
101
|
+
// Write mission start to Living Brain
|
|
102
|
+
await this.writeLivingBrain({
|
|
103
|
+
timestamp: new Date().toISOString(),
|
|
104
|
+
agentName: this.name,
|
|
105
|
+
updateType: "test-start",
|
|
106
|
+
data: {
|
|
107
|
+
executionId,
|
|
108
|
+
missionId: mission.id,
|
|
109
|
+
missionName: mission.name,
|
|
110
|
+
recordDemo: mission.recordDemo,
|
|
111
|
+
},
|
|
112
|
+
metadata: {
|
|
113
|
+
testId: mission.id,
|
|
114
|
+
executionId,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
try {
|
|
118
|
+
// PHASE 1: Navigation
|
|
119
|
+
console.log(chalk_1.default.bold.cyan(`\n━━━ PHASE 1: NAVIGATION ━━━`));
|
|
120
|
+
const navigationResult = await this.orchestrator.executeAgent(this.navigatorAgent.name, {
|
|
121
|
+
page,
|
|
122
|
+
mission,
|
|
123
|
+
projectPath,
|
|
124
|
+
maxSteps: 20,
|
|
125
|
+
});
|
|
126
|
+
const steps = navigationResult.steps;
|
|
127
|
+
console.log(chalk_1.default.green(`\n✓ Navigation complete: ${steps.length} steps executed`));
|
|
128
|
+
// PHASE 2: Validation (if validation rules exist)
|
|
129
|
+
console.log(chalk_1.default.bold.cyan(`\n━━━ PHASE 2: VALIDATION ━━━`));
|
|
130
|
+
let validationResults = [];
|
|
131
|
+
if (mission.validationRules &&
|
|
132
|
+
mission.validationRules.length > 0) {
|
|
133
|
+
// Get final screenshot
|
|
134
|
+
const finalStep = steps[steps.length - 1];
|
|
135
|
+
const currentScreenshot = finalStep?.screenshot || "";
|
|
136
|
+
const validationOutput = await this.orchestrator.executeAgent(this.validatorAgent.name, {
|
|
137
|
+
currentScreenshot,
|
|
138
|
+
baselineScreenshot: mission.baselineScreenshots?.[0],
|
|
139
|
+
validationRules: mission.validationRules,
|
|
140
|
+
projectPath,
|
|
141
|
+
page,
|
|
142
|
+
});
|
|
143
|
+
validationResults = validationOutput.results;
|
|
144
|
+
console.log(chalk_1.default.green(`\n✓ Validation complete: ${validationOutput.summary.passed}/${validationOutput.summary.totalChecks} passed`));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(chalk_1.default.gray(" No validation rules defined, skipping..."));
|
|
148
|
+
}
|
|
149
|
+
// PHASE 3: Demo Recording (if requested)
|
|
150
|
+
let demoArtifacts;
|
|
151
|
+
if (mission.recordDemo && mission.demoConfig) {
|
|
152
|
+
console.log(chalk_1.default.bold.cyan(`\n━━━ PHASE 3: DEMO RECORDING ━━━`));
|
|
153
|
+
const recorderOutput = await this.orchestrator.executeAgent(this.recorderAgent.name, {
|
|
154
|
+
browserContext,
|
|
155
|
+
steps,
|
|
156
|
+
config: mission.demoConfig,
|
|
157
|
+
projectPath,
|
|
158
|
+
missionName: mission.name,
|
|
159
|
+
missionDescription: mission.description,
|
|
160
|
+
});
|
|
161
|
+
demoArtifacts = recorderOutput.artifacts;
|
|
162
|
+
if (demoArtifacts) {
|
|
163
|
+
console.log(chalk_1.default.green(`\n✓ Demo artifacts generated in ${Object.keys(demoArtifacts.formats).length} format(s)`));
|
|
164
|
+
}
|
|
165
|
+
// PHASE 4: VO Script Generation (if requested)
|
|
166
|
+
if (mission.demoConfig.includeVoiceOver) {
|
|
167
|
+
console.log(chalk_1.default.bold.cyan(`\n━━━ PHASE 4: VO SCRIPT GENERATION ━━━`));
|
|
168
|
+
const voScriptPath = path.join(projectPath, ".mycontext", "demos", `${mission.name}-${Date.now()}`, "voiceover-script.json");
|
|
169
|
+
const voOutput = await this.orchestrator.executeAgent(this.voExtractorAgent.name, {
|
|
170
|
+
steps,
|
|
171
|
+
missionName: mission.name,
|
|
172
|
+
missionDescription: mission.description,
|
|
173
|
+
narrationStyle: mission.demoConfig.narrationStyle,
|
|
174
|
+
projectPath,
|
|
175
|
+
outputPath: voScriptPath,
|
|
176
|
+
generateAudio: mission.demoConfig.generateAudio,
|
|
177
|
+
ttsConfig: mission.demoConfig.ttsConfig,
|
|
178
|
+
});
|
|
179
|
+
if (demoArtifacts && voOutput.success) {
|
|
180
|
+
demoArtifacts.voiceOver = {
|
|
181
|
+
script: voOutput.script,
|
|
182
|
+
audio: voOutput.audioPath
|
|
183
|
+
? {
|
|
184
|
+
path: voOutput.audioPath,
|
|
185
|
+
duration: voOutput.script.totalDuration,
|
|
186
|
+
format: "mp3",
|
|
187
|
+
}
|
|
188
|
+
: undefined,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
console.log(chalk_1.default.green(`\n✓ Voice-over script generated with ${voOutput.script.segments.length} segments`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Calculate final result
|
|
195
|
+
const endTime = Date.now();
|
|
196
|
+
const duration = endTime - startTime;
|
|
197
|
+
const successfulSteps = steps.filter((s) => s.success).length;
|
|
198
|
+
const passedValidations = validationResults.filter((v) => v.passed).length;
|
|
199
|
+
const allStepsSuccessful = successfulSteps === steps.length;
|
|
200
|
+
const allValidationsPassed = validationResults.length === 0 ||
|
|
201
|
+
passedValidations === validationResults.length;
|
|
202
|
+
const finalStatus = allStepsSuccessful && allValidationsPassed ? "passed" : "failed";
|
|
203
|
+
// Get final URL
|
|
204
|
+
const finalUrl = page.url();
|
|
205
|
+
// Build test execution result
|
|
206
|
+
const testResult = {
|
|
207
|
+
missionId: mission.id,
|
|
208
|
+
executionId,
|
|
209
|
+
status: finalStatus,
|
|
210
|
+
startedAt: new Date(startTime).toISOString(),
|
|
211
|
+
completedAt: new Date(endTime).toISOString(),
|
|
212
|
+
duration,
|
|
213
|
+
steps,
|
|
214
|
+
validationResults,
|
|
215
|
+
finalState: {
|
|
216
|
+
url: finalUrl,
|
|
217
|
+
screenshot: steps[steps.length - 1]?.screenshot,
|
|
218
|
+
},
|
|
219
|
+
visualSummary: {
|
|
220
|
+
totalScreenshots: steps.filter((s) => s.screenshot).length,
|
|
221
|
+
visualRegressionsDetected: validationResults.filter((v) => !v.passed && v.rule.type?.includes("visual")).length,
|
|
222
|
+
colorSchemeMatches: validationResults.every((v) => v.passed || v.rule.type !== "color-scheme-match"),
|
|
223
|
+
layoutMatches: validationResults.every((v) => v.passed || v.rule.type !== "layout-match"),
|
|
224
|
+
},
|
|
225
|
+
demoArtifacts,
|
|
226
|
+
};
|
|
227
|
+
// Write completion to Living Brain
|
|
228
|
+
await this.writeLivingBrain({
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
agentName: this.name,
|
|
231
|
+
updateType: "test-complete",
|
|
232
|
+
data: {
|
|
233
|
+
executionId,
|
|
234
|
+
status: finalStatus,
|
|
235
|
+
duration,
|
|
236
|
+
totalSteps: steps.length,
|
|
237
|
+
successfulSteps,
|
|
238
|
+
validationResults: validationResults.length,
|
|
239
|
+
passedValidations,
|
|
240
|
+
demoGenerated: !!demoArtifacts,
|
|
241
|
+
},
|
|
242
|
+
metadata: {
|
|
243
|
+
testId: mission.id,
|
|
244
|
+
executionId,
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
// Print final summary
|
|
248
|
+
console.log(chalk_1.default.bold.blue(`\n${"=".repeat(60)}`));
|
|
249
|
+
console.log(chalk_1.default.bold[finalStatus === "passed" ? "green" : "red"](`${finalStatus === "passed" ? "✅ TEST PASSED" : "❌ TEST FAILED"}`));
|
|
250
|
+
console.log(chalk_1.default.bold.blue(`${"=".repeat(60)}\n`));
|
|
251
|
+
console.log(chalk_1.default.white(`Duration: ${(duration / 1000).toFixed(1)}s`));
|
|
252
|
+
console.log(chalk_1.default.white(`Steps: ${successfulSteps}/${steps.length} successful`));
|
|
253
|
+
if (validationResults.length > 0) {
|
|
254
|
+
console.log(chalk_1.default.white(`Validations: ${passedValidations}/${validationResults.length} passed`));
|
|
255
|
+
}
|
|
256
|
+
if (demoArtifacts) {
|
|
257
|
+
console.log(chalk_1.default.white(`Demo formats: ${Object.keys(demoArtifacts.formats).join(", ")}`));
|
|
258
|
+
}
|
|
259
|
+
console.log("");
|
|
260
|
+
return {
|
|
261
|
+
result: testResult,
|
|
262
|
+
success: finalStatus === "passed",
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
const endTime = Date.now();
|
|
267
|
+
const duration = endTime - startTime;
|
|
268
|
+
console.error(chalk_1.default.red(`\n❌ Test execution error: ${error.message}`));
|
|
269
|
+
// Write error to Living Brain
|
|
270
|
+
await this.writeLivingBrain({
|
|
271
|
+
timestamp: new Date().toISOString(),
|
|
272
|
+
agentName: this.name,
|
|
273
|
+
updateType: "error",
|
|
274
|
+
data: {
|
|
275
|
+
executionId,
|
|
276
|
+
error: error.message,
|
|
277
|
+
stack: error.stack,
|
|
278
|
+
duration,
|
|
279
|
+
},
|
|
280
|
+
metadata: {
|
|
281
|
+
testId: mission.id,
|
|
282
|
+
executionId,
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
// Return error result
|
|
286
|
+
const errorResult = {
|
|
287
|
+
missionId: mission.id,
|
|
288
|
+
executionId,
|
|
289
|
+
status: "error",
|
|
290
|
+
startedAt: new Date(startTime).toISOString(),
|
|
291
|
+
completedAt: new Date(endTime).toISOString(),
|
|
292
|
+
duration,
|
|
293
|
+
steps: [],
|
|
294
|
+
validationResults: [],
|
|
295
|
+
finalState: {
|
|
296
|
+
url: page.url(),
|
|
297
|
+
},
|
|
298
|
+
error: {
|
|
299
|
+
message: error.message,
|
|
300
|
+
stack: error.stack,
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
return {
|
|
304
|
+
result: errorResult,
|
|
305
|
+
success: false,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Write update to Living Brain
|
|
311
|
+
*/
|
|
312
|
+
async writeLivingBrain(update) {
|
|
313
|
+
try {
|
|
314
|
+
// Read current context using AICore
|
|
315
|
+
const aiCore = AICore_1.AICore.getInstance();
|
|
316
|
+
const currentContext = (await aiCore.getLivingContext()) || {};
|
|
317
|
+
if (!currentContext.testExecutionHistory) {
|
|
318
|
+
currentContext.testExecutionHistory = [];
|
|
319
|
+
}
|
|
320
|
+
currentContext.testExecutionHistory.push(update);
|
|
321
|
+
// Keep only last 100 updates
|
|
322
|
+
if (currentContext.testExecutionHistory.length > 100) {
|
|
323
|
+
currentContext.testExecutionHistory = currentContext.testExecutionHistory.slice(-100);
|
|
324
|
+
}
|
|
325
|
+
// Save back to context.json using AICore
|
|
326
|
+
await aiCore.saveLivingContext(currentContext);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
console.warn("Failed to write to Living Brain:", error);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
async validate(input) {
|
|
333
|
+
return !!(input.page &&
|
|
334
|
+
input.browserContext &&
|
|
335
|
+
input.mission &&
|
|
336
|
+
input.projectPath);
|
|
337
|
+
}
|
|
338
|
+
async getStatus() {
|
|
339
|
+
return {
|
|
340
|
+
name: this.name,
|
|
341
|
+
status: "idle",
|
|
342
|
+
errorCount: 0,
|
|
343
|
+
successCount: 0,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
exports.VisionTestCoordinator = VisionTestCoordinator;
|
|
348
|
+
//# sourceMappingURL=VisionTestCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisionTestCoordinator.js","sourceRoot":"","sources":["../../../src/agents/implementations/VisionTestCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visual Validator Agent
|
|
3
|
+
*
|
|
4
|
+
* Performs visual regression testing by comparing screenshots.
|
|
5
|
+
* Detects UI changes, color scheme drift, layout shifts, and more.
|
|
6
|
+
*
|
|
7
|
+
* Communicates via Living Brain (context.json).
|
|
8
|
+
*/
|
|
9
|
+
import { Page } from "playwright";
|
|
10
|
+
import { SubAgent } from "../interfaces/SubAgent";
|
|
11
|
+
import { VisualValidationResult, VisionValidationRule, VisualDiffResult } from "../../types/vision-testing";
|
|
12
|
+
export interface VisualValidatorInput {
|
|
13
|
+
currentScreenshot: string;
|
|
14
|
+
baselineScreenshot?: string;
|
|
15
|
+
validationRules: VisionValidationRule[];
|
|
16
|
+
projectPath: string;
|
|
17
|
+
page?: Page;
|
|
18
|
+
}
|
|
19
|
+
export interface VisualValidatorOutput {
|
|
20
|
+
results: VisualValidationResult[];
|
|
21
|
+
passed: boolean;
|
|
22
|
+
visualDiff?: VisualDiffResult;
|
|
23
|
+
summary: {
|
|
24
|
+
totalChecks: number;
|
|
25
|
+
passed: number;
|
|
26
|
+
failed: number;
|
|
27
|
+
warnings: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare class VisualValidatorAgent implements SubAgent<VisualValidatorInput, VisualValidatorOutput> {
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
personality: string;
|
|
34
|
+
llmProvider: string;
|
|
35
|
+
expertise: string[];
|
|
36
|
+
private visionService;
|
|
37
|
+
private contextService?;
|
|
38
|
+
constructor();
|
|
39
|
+
run(input: VisualValidatorInput): Promise<VisualValidatorOutput>;
|
|
40
|
+
/**
|
|
41
|
+
* Validate visual match between current and baseline screenshots
|
|
42
|
+
*/
|
|
43
|
+
private validateVisualMatch;
|
|
44
|
+
/**
|
|
45
|
+
* Validate color scheme matches expectations
|
|
46
|
+
*/
|
|
47
|
+
private validateColorScheme;
|
|
48
|
+
/**
|
|
49
|
+
* Validate layout structure
|
|
50
|
+
*/
|
|
51
|
+
private validateLayout;
|
|
52
|
+
/**
|
|
53
|
+
* Validate text readability
|
|
54
|
+
*/
|
|
55
|
+
private validateTextReadability;
|
|
56
|
+
/**
|
|
57
|
+
* Validate no visual regression
|
|
58
|
+
*/
|
|
59
|
+
private validateNoRegression;
|
|
60
|
+
/**
|
|
61
|
+
* Validate DOM-based rules (fallback for non-visual checks)
|
|
62
|
+
*/
|
|
63
|
+
private validateDOMRule;
|
|
64
|
+
/**
|
|
65
|
+
* Compare two screenshots and detect differences
|
|
66
|
+
* NOTE: This is a placeholder - in production would use pixelmatch or sharp
|
|
67
|
+
*/
|
|
68
|
+
private compareScreenshots;
|
|
69
|
+
/**
|
|
70
|
+
* Write update to Living Brain
|
|
71
|
+
*/
|
|
72
|
+
private writeLivingBrain;
|
|
73
|
+
validate(input: VisualValidatorInput): Promise<boolean>;
|
|
74
|
+
getStatus(): Promise<{
|
|
75
|
+
name: string;
|
|
76
|
+
status: "idle" | "running" | "completed" | "error";
|
|
77
|
+
lastRun?: Date;
|
|
78
|
+
executionTime?: number;
|
|
79
|
+
errorCount: number;
|
|
80
|
+
successCount: number;
|
|
81
|
+
}>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=VisualValidatorAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisualValidatorAgent.d.ts","sourceRoot":"","sources":["../../../src/agents/implementations/VisualValidatorAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EACL,QAAQ,EACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAGjB,MAAM,4BAA4B,CAAC;AAQpC,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,oBAAoB,EAAE,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,oBACX,YAAW,QAAQ,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;IAEhE,IAAI,SAA0B;IAC9B,WAAW,SACoE;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAiB;;IAqBlC,GAAG,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA8ItE;;OAEG;YACW,mBAAmB;IAuDjC;;OAEG;YACW,mBAAmB;IAwCjC;;OAEG;YACW,cAAc;IA2B5B;;OAEG;YACW,uBAAuB;IAoCrC;;OAEG;YACW,oBAAoB;IAYlC;;OAEG;YACW,eAAe;IAmF7B;;;OAGG;YACW,kBAAkB;IAsChC;;OAEG;YACW,gBAAgB;IA0BxB,QAAQ,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQvD,SAAS,IAAI,OAAO,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;QACnD,OAAO,CAAC,EAAE,IAAI,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CAQH"}
|