mycontext-cli 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -114
- package/dist/cli.js +67 -0
- package/dist/cli.js.map +1 -1
- package/dist/clients/MyContextAIClient.d.ts.map +1 -1
- package/dist/clients/MyContextAIClient.js +12 -0
- package/dist/clients/MyContextAIClient.js.map +1 -1
- package/dist/commands/agent.d.ts +22 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +245 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +18 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +0 -9
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync-readme.d.ts +14 -0
- package/dist/commands/sync-readme.d.ts.map +1 -0
- package/dist/commands/sync-readme.js +131 -0
- package/dist/commands/sync-readme.js.map +1 -0
- package/dist/commands/test.d.ts +76 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +361 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/mcp/browser-test-runner.d.ts +89 -0
- package/dist/mcp/browser-test-runner.d.ts.map +1 -0
- package/dist/mcp/browser-test-runner.js +786 -0
- package/dist/mcp/browser-test-runner.js.map +1 -0
- package/dist/mcp/test-mission-manager.d.ts +82 -0
- package/dist/mcp/test-mission-manager.d.ts.map +1 -0
- package/dist/mcp/test-mission-manager.js +327 -0
- package/dist/mcp/test-mission-manager.js.map +1 -0
- package/dist/mcp/test-reporter.d.ts +54 -0
- package/dist/mcp/test-reporter.d.ts.map +1 -0
- package/dist/mcp/test-reporter.js +358 -0
- package/dist/mcp/test-reporter.js.map +1 -0
- package/dist/mcp/testing-server.d.ts +36 -0
- package/dist/mcp/testing-server.d.ts.map +1 -0
- package/dist/mcp/testing-server.js +516 -0
- package/dist/mcp/testing-server.js.map +1 -0
- package/dist/package.json +6 -2
- package/dist/services/ContextService.d.ts +38 -0
- package/dist/services/ContextService.d.ts.map +1 -0
- package/dist/services/ContextService.js +104 -0
- package/dist/services/ContextService.js.map +1 -0
- package/dist/services/ProbeManager.d.ts +32 -0
- package/dist/services/ProbeManager.d.ts.map +1 -0
- package/dist/services/ProbeManager.js +116 -0
- package/dist/services/ProbeManager.js.map +1 -0
- package/dist/types/design-pipeline.d.ts +6 -0
- package/dist/types/design-pipeline.d.ts.map +1 -1
- package/dist/types/flow-testing.d.ts +179 -0
- package/dist/types/flow-testing.d.ts.map +1 -0
- package/dist/types/flow-testing.js +7 -0
- package/dist/types/flow-testing.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/designManifestManager.d.ts +4 -0
- package/dist/utils/designManifestManager.d.ts.map +1 -1
- package/dist/utils/designManifestManager.js +161 -0
- package/dist/utils/designManifestManager.js.map +1 -1
- package/dist/utils/githubModelsClient.d.ts.map +1 -1
- package/dist/utils/githubModelsClient.js +6 -2
- package/dist/utils/githubModelsClient.js.map +1 -1
- package/dist/utils/mcpTools.d.ts +21 -21
- package/package.json +6 -2
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Commands
|
|
3
|
+
*
|
|
4
|
+
* CLI wrapper commands for the Flow Testing MCP Server.
|
|
5
|
+
* Provides convenient commands for creating and running UI flow tests.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
interface TestCommandOptions {
|
|
9
|
+
headless?: boolean;
|
|
10
|
+
url?: string;
|
|
11
|
+
slowMo?: number;
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface TestInitOptions {
|
|
15
|
+
fromUserFlows?: boolean;
|
|
16
|
+
interactive?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Test command handler
|
|
20
|
+
*/
|
|
21
|
+
export declare class TestCommand {
|
|
22
|
+
private projectPath;
|
|
23
|
+
private missionManager;
|
|
24
|
+
private _testRunner?;
|
|
25
|
+
private _reporter?;
|
|
26
|
+
constructor(projectPath?: string);
|
|
27
|
+
private get testRunner();
|
|
28
|
+
private get reporter();
|
|
29
|
+
/**
|
|
30
|
+
* Run an ad-hoc test from natural language
|
|
31
|
+
*/
|
|
32
|
+
runAdHocTest(missionDescription: string, options: TestCommandOptions): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Run a saved test mission
|
|
35
|
+
*/
|
|
36
|
+
runTest(missionId: string, options: TestCommandOptions): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* List all test missions
|
|
39
|
+
*/
|
|
40
|
+
listMissions(options: {
|
|
41
|
+
status?: string;
|
|
42
|
+
tag?: string;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Initialize a new test mission
|
|
46
|
+
*/
|
|
47
|
+
initMission(options: TestInitOptions): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Initialize missions from user flows
|
|
50
|
+
*/
|
|
51
|
+
private initFromUserFlows;
|
|
52
|
+
/**
|
|
53
|
+
* Initialize mission interactively
|
|
54
|
+
*/
|
|
55
|
+
private initInteractive;
|
|
56
|
+
/**
|
|
57
|
+
* Show test report
|
|
58
|
+
*/
|
|
59
|
+
showReport(executionId: string, options: {
|
|
60
|
+
verbose?: boolean;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Run all tests
|
|
64
|
+
*/
|
|
65
|
+
runAll(options: TestCommandOptions): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Import test missions from a JSON file
|
|
68
|
+
*/
|
|
69
|
+
importMissions(filePath: string): Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Register test commands
|
|
73
|
+
*/
|
|
74
|
+
export declare function registerTestCommands(program: Command): void;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,WAAW,CAAC,CAAoB;IACxC,OAAO,CAAC,SAAS,CAAC,CAAe;gBAErB,WAAW,CAAC,EAAE,MAAM;IAKhC,OAAO,KAAK,UAAU,GAKrB;IAED,OAAO,KAAK,QAAQ,GAKnB;IAED;;OAEG;IACG,YAAY,CAChB,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAiChB;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD7E;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmE1D;;OAEG;YACW,iBAAiB;IAoB/B;;OAEG;YACW,eAAe;IAc7B;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpF;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CxD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF3D"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test Commands
|
|
4
|
+
*
|
|
5
|
+
* CLI wrapper commands for the Flow Testing MCP Server.
|
|
6
|
+
* Provides convenient commands for creating and running UI flow tests.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TestCommand = void 0;
|
|
13
|
+
exports.registerTestCommands = registerTestCommands;
|
|
14
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
15
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
16
|
+
const test_mission_manager_1 = require("../mcp/test-mission-manager");
|
|
17
|
+
const browser_test_runner_1 = require("../mcp/browser-test-runner");
|
|
18
|
+
const test_reporter_1 = require("../mcp/test-reporter");
|
|
19
|
+
/**
|
|
20
|
+
* Test command handler
|
|
21
|
+
*/
|
|
22
|
+
class TestCommand {
|
|
23
|
+
constructor(projectPath) {
|
|
24
|
+
this.projectPath = projectPath || process.cwd();
|
|
25
|
+
this.missionManager = new test_mission_manager_1.TestMissionManager(this.projectPath);
|
|
26
|
+
}
|
|
27
|
+
get testRunner() {
|
|
28
|
+
if (!this._testRunner) {
|
|
29
|
+
this._testRunner = new browser_test_runner_1.BrowserTestRunner(this.projectPath);
|
|
30
|
+
}
|
|
31
|
+
return this._testRunner;
|
|
32
|
+
}
|
|
33
|
+
get reporter() {
|
|
34
|
+
if (!this._reporter) {
|
|
35
|
+
this._reporter = new test_reporter_1.TestReporter(this.projectPath);
|
|
36
|
+
}
|
|
37
|
+
return this._reporter;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run an ad-hoc test from natural language
|
|
41
|
+
*/
|
|
42
|
+
async runAdHocTest(missionDescription, options) {
|
|
43
|
+
console.log(chalk_1.default.blue.bold("\n🧪 Running Ad-Hoc Test\n"));
|
|
44
|
+
// Create temporary mission
|
|
45
|
+
const mission = await this.missionManager.createMission({
|
|
46
|
+
name: `ad-hoc-${Date.now()}`,
|
|
47
|
+
mission: missionDescription,
|
|
48
|
+
expectedOutcome: "Test completes successfully",
|
|
49
|
+
tags: ["ad-hoc"],
|
|
50
|
+
startUrl: options.url,
|
|
51
|
+
});
|
|
52
|
+
// Run test
|
|
53
|
+
await this.runTest(mission.id, options);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run a saved test mission
|
|
57
|
+
*/
|
|
58
|
+
async runTest(missionId, options) {
|
|
59
|
+
console.log(chalk_1.default.blue.bold("\n🧪 Running Test\n"));
|
|
60
|
+
// Get mission
|
|
61
|
+
const mission = await this.missionManager.getMission(missionId);
|
|
62
|
+
if (!mission) {
|
|
63
|
+
console.error(chalk_1.default.red(`❌ Mission not found: ${missionId}`));
|
|
64
|
+
console.log(chalk_1.default.gray("\nRun 'mycontext test:list' to see available missions"));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(chalk_1.default.cyan(`Mission: ${mission.name}`));
|
|
68
|
+
console.log(chalk_1.default.gray(mission.mission));
|
|
69
|
+
// Run test
|
|
70
|
+
const result = await this.testRunner.runTest(mission, {
|
|
71
|
+
headless: options.headless !== false,
|
|
72
|
+
baseUrl: options.url,
|
|
73
|
+
slowMo: options.slowMo,
|
|
74
|
+
});
|
|
75
|
+
// Save result
|
|
76
|
+
await this.missionManager.saveExecution(result);
|
|
77
|
+
// Generate and print report
|
|
78
|
+
const report = await this.reporter.generateReport(result, mission);
|
|
79
|
+
this.reporter.printReport(report);
|
|
80
|
+
// Exit with appropriate code
|
|
81
|
+
process.exit(result.status === "passed" ? 0 : 1);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* List all test missions
|
|
85
|
+
*/
|
|
86
|
+
async listMissions(options) {
|
|
87
|
+
console.log(chalk_1.default.blue.bold("\n📋 Test Missions\n"));
|
|
88
|
+
const missions = await this.missionManager.listMissions({
|
|
89
|
+
status: options.status,
|
|
90
|
+
tag: options.tag,
|
|
91
|
+
});
|
|
92
|
+
if (missions.length === 0) {
|
|
93
|
+
console.log(chalk_1.default.yellow("No test missions found."));
|
|
94
|
+
console.log(chalk_1.default.gray("\nCreate a mission with: mycontext test:init"));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
missions.forEach((mission, index) => {
|
|
98
|
+
console.log(chalk_1.default.bold(`${index + 1}. ${mission.name}`));
|
|
99
|
+
console.log(chalk_1.default.gray(` ID: ${mission.id}`));
|
|
100
|
+
console.log(chalk_1.default.gray(` Mission: ${mission.mission}`));
|
|
101
|
+
console.log(chalk_1.default.gray(` Expected: ${mission.expectedOutcome}`));
|
|
102
|
+
if (mission.tags && mission.tags.length > 0) {
|
|
103
|
+
console.log(chalk_1.default.gray(` Tags: ${mission.tags.join(", ")}`));
|
|
104
|
+
}
|
|
105
|
+
console.log(chalk_1.default.gray(` Created: ${new Date(mission.createdAt).toLocaleString()}`));
|
|
106
|
+
console.log("");
|
|
107
|
+
});
|
|
108
|
+
// Show statistics
|
|
109
|
+
const stats = await this.missionManager.getStatistics();
|
|
110
|
+
console.log(chalk_1.default.bold("Statistics:"));
|
|
111
|
+
console.log(chalk_1.default.gray(` Total Missions: ${stats.totalMissions}`));
|
|
112
|
+
console.log(chalk_1.default.gray(` Total Executions: ${stats.totalExecutions}`));
|
|
113
|
+
console.log(chalk_1.default.gray(` Pass Rate: ${stats.passRate}%`));
|
|
114
|
+
console.log(chalk_1.default.gray(` Average Duration: ${stats.averageDuration}ms`));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Initialize a new test mission
|
|
118
|
+
*/
|
|
119
|
+
async initMission(options) {
|
|
120
|
+
console.log(chalk_1.default.blue.bold("\n🎬 Initialize Test Mission\n"));
|
|
121
|
+
if (options.fromUserFlows) {
|
|
122
|
+
await this.initFromUserFlows();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (options.interactive) {
|
|
126
|
+
await this.initInteractive();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Prompt for mission details
|
|
130
|
+
const answers = await (0, prompts_1.default)([
|
|
131
|
+
{
|
|
132
|
+
type: "text",
|
|
133
|
+
name: "name",
|
|
134
|
+
message: "Test mission name:",
|
|
135
|
+
validate: (value) => (value.length > 0 ? true : "Name is required"),
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: "text",
|
|
139
|
+
name: "mission",
|
|
140
|
+
message: "Mission description (what to test):",
|
|
141
|
+
validate: (value) => (value.length > 0 ? true : "Description is required"),
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: "text",
|
|
145
|
+
name: "expectedOutcome",
|
|
146
|
+
message: "Expected outcome:",
|
|
147
|
+
validate: (value) => (value.length > 0 ? true : "Expected outcome is required"),
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
name: "startUrl",
|
|
152
|
+
message: "Starting URL (optional):",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: "text",
|
|
156
|
+
name: "tags",
|
|
157
|
+
message: "Tags (comma-separated, optional):",
|
|
158
|
+
},
|
|
159
|
+
]);
|
|
160
|
+
if (!answers.name) {
|
|
161
|
+
console.log(chalk_1.default.yellow("\nCancelled"));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Create mission
|
|
165
|
+
const mission = await this.missionManager.createMission({
|
|
166
|
+
name: answers.name,
|
|
167
|
+
mission: answers.mission,
|
|
168
|
+
expectedOutcome: answers.expectedOutcome,
|
|
169
|
+
startUrl: answers.startUrl || undefined,
|
|
170
|
+
tags: answers.tags
|
|
171
|
+
? answers.tags.split(",").map((t) => t.trim())
|
|
172
|
+
: [],
|
|
173
|
+
});
|
|
174
|
+
console.log(chalk_1.default.green(`\n✅ Mission created: ${mission.id}`));
|
|
175
|
+
console.log(chalk_1.default.gray(`\nRun with: mycontext test:run ${mission.name}`));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Initialize missions from user flows
|
|
179
|
+
*/
|
|
180
|
+
async initFromUserFlows() {
|
|
181
|
+
console.log(chalk_1.default.cyan("Importing test missions from user flows..."));
|
|
182
|
+
try {
|
|
183
|
+
const missions = await this.missionManager.importFromUserFlows();
|
|
184
|
+
console.log(chalk_1.default.green(`\n✅ Imported ${missions.length} missions from user flows`));
|
|
185
|
+
missions.forEach((mission) => {
|
|
186
|
+
console.log(chalk_1.default.gray(` • ${mission.name}`));
|
|
187
|
+
});
|
|
188
|
+
console.log(chalk_1.default.gray("\nRun with: mycontext test:run <name>"));
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.error(chalk_1.default.red(`\n❌ Error: ${error.message}`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Initialize mission interactively
|
|
196
|
+
*/
|
|
197
|
+
async initInteractive() {
|
|
198
|
+
console.log(chalk_1.default.yellow("\n🎥 Interactive recording mode is not yet implemented."));
|
|
199
|
+
console.log(chalk_1.default.gray("This feature will allow you to perform actions in a browser,"));
|
|
200
|
+
console.log(chalk_1.default.gray("and the AI will observe and create a reusable test."));
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Show test report
|
|
204
|
+
*/
|
|
205
|
+
async showReport(executionId, options) {
|
|
206
|
+
console.log(chalk_1.default.blue.bold("\n📊 Test Report\n"));
|
|
207
|
+
const report = await this.reporter.getReport(executionId);
|
|
208
|
+
if (!report) {
|
|
209
|
+
console.error(chalk_1.default.red(`❌ Report not found: ${executionId}`));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (options.verbose) {
|
|
213
|
+
const formatted = await this.reporter.formatReport(report, {
|
|
214
|
+
includeScreenshots: true,
|
|
215
|
+
});
|
|
216
|
+
console.log(formatted);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.reporter.printReport(report);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Run all tests
|
|
224
|
+
*/
|
|
225
|
+
async runAll(options) {
|
|
226
|
+
console.log(chalk_1.default.blue.bold("\n🧪 Running All Tests\n"));
|
|
227
|
+
const missions = await this.missionManager.listMissions();
|
|
228
|
+
if (missions.length === 0) {
|
|
229
|
+
console.log(chalk_1.default.yellow("No test missions found."));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const results = [];
|
|
233
|
+
for (const mission of missions) {
|
|
234
|
+
console.log(chalk_1.default.cyan(`\n▶ Running: ${mission.name}`));
|
|
235
|
+
const result = await this.testRunner.runTest(mission, {
|
|
236
|
+
headless: options.headless !== false,
|
|
237
|
+
baseUrl: options.url,
|
|
238
|
+
slowMo: options.slowMo,
|
|
239
|
+
});
|
|
240
|
+
await this.missionManager.saveExecution(result);
|
|
241
|
+
results.push(result);
|
|
242
|
+
}
|
|
243
|
+
// Summary
|
|
244
|
+
const passed = results.filter((r) => r.status === "passed").length;
|
|
245
|
+
const failed = results.filter((r) => r.status === "failed").length;
|
|
246
|
+
const errors = results.filter((r) => r.status === "error").length;
|
|
247
|
+
console.log(chalk_1.default.bold.blue("\n📊 Test Summary\n"));
|
|
248
|
+
console.log(chalk_1.default.green(` Passed: ${passed}/${results.length}`));
|
|
249
|
+
console.log(chalk_1.default.red(` Failed: ${failed}/${results.length}`));
|
|
250
|
+
console.log(chalk_1.default.yellow(` Errors: ${errors}/${results.length}`));
|
|
251
|
+
process.exit(failed > 0 || errors > 0 ? 1 : 0);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Import test missions from a JSON file
|
|
255
|
+
*/
|
|
256
|
+
async importMissions(filePath) {
|
|
257
|
+
console.log(chalk_1.default.blue.bold("\n📥 Importing Test Missions\n"));
|
|
258
|
+
try {
|
|
259
|
+
const missions = await this.missionManager.importFromJson(filePath);
|
|
260
|
+
console.log(chalk_1.default.green(`\n✅ Successfully imported ${missions.length} missions:\n`));
|
|
261
|
+
missions.forEach((mission, index) => {
|
|
262
|
+
console.log(chalk_1.default.bold(`${index + 1}. ${mission.name}`));
|
|
263
|
+
console.log(chalk_1.default.gray(` ID: ${mission.id}`));
|
|
264
|
+
console.log(chalk_1.default.gray(` Tags: ${mission.tags?.join(", ") || "none"}`));
|
|
265
|
+
console.log("");
|
|
266
|
+
});
|
|
267
|
+
console.log(chalk_1.default.gray("Run tests with: mycontext test:run <mission-name>"));
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.error(chalk_1.default.red(`\n❌ Import failed: ${error.message}`));
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.TestCommand = TestCommand;
|
|
276
|
+
/**
|
|
277
|
+
* Register test commands
|
|
278
|
+
*/
|
|
279
|
+
function registerTestCommands(program) {
|
|
280
|
+
const test = program
|
|
281
|
+
.command("test")
|
|
282
|
+
.description("Run UI flow tests with AI-powered navigation");
|
|
283
|
+
// test "mission description" - Run ad-hoc test
|
|
284
|
+
test
|
|
285
|
+
.argument("[mission]", "Natural language test mission")
|
|
286
|
+
.option("--no-headless", "Show browser (non-headless mode)")
|
|
287
|
+
.option("--url <url>", "Starting URL")
|
|
288
|
+
.option("--slow-mo <ms>", "Slow down by N milliseconds")
|
|
289
|
+
.option("-v, --verbose", "Verbose output")
|
|
290
|
+
.action(async (mission, options) => {
|
|
291
|
+
const cmd = new TestCommand();
|
|
292
|
+
if (mission) {
|
|
293
|
+
await cmd.runAdHocTest(mission, options);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
test.help();
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
// test:run <name> - Run saved mission
|
|
300
|
+
program
|
|
301
|
+
.command("test:run")
|
|
302
|
+
.description("Run a saved test mission")
|
|
303
|
+
.argument("<name>", "Mission name or ID")
|
|
304
|
+
.option("--no-headless", "Show browser (non-headless mode)")
|
|
305
|
+
.option("--url <url>", "Starting URL")
|
|
306
|
+
.option("--slow-mo <ms>", "Slow down by N milliseconds")
|
|
307
|
+
.action(async (name, options) => {
|
|
308
|
+
const cmd = new TestCommand();
|
|
309
|
+
await cmd.runTest(name, options);
|
|
310
|
+
});
|
|
311
|
+
// test:list - List missions
|
|
312
|
+
program
|
|
313
|
+
.command("test:list")
|
|
314
|
+
.description("List all test missions")
|
|
315
|
+
.option("--status <status>", "Filter by status (all|passing|failing)")
|
|
316
|
+
.option("--tag <tag>", "Filter by tag")
|
|
317
|
+
.action(async (options) => {
|
|
318
|
+
const cmd = new TestCommand();
|
|
319
|
+
await cmd.listMissions(options);
|
|
320
|
+
});
|
|
321
|
+
// test:init - Initialize mission
|
|
322
|
+
program
|
|
323
|
+
.command("test:init")
|
|
324
|
+
.description("Create a new test mission")
|
|
325
|
+
.option("--from-user-flows", "Import from 02-user-flows.md")
|
|
326
|
+
.option("--interactive", "Interactive recording mode")
|
|
327
|
+
.action(async (options) => {
|
|
328
|
+
const cmd = new TestCommand();
|
|
329
|
+
await cmd.initMission(options);
|
|
330
|
+
});
|
|
331
|
+
// test:report <id> - Show report
|
|
332
|
+
program
|
|
333
|
+
.command("test:report")
|
|
334
|
+
.description("Show test execution report")
|
|
335
|
+
.argument("<id>", "Execution ID")
|
|
336
|
+
.option("-v, --verbose", "Show full report")
|
|
337
|
+
.action(async (id, options) => {
|
|
338
|
+
const cmd = new TestCommand();
|
|
339
|
+
await cmd.showReport(id, options);
|
|
340
|
+
});
|
|
341
|
+
// test:all - Run all tests
|
|
342
|
+
program
|
|
343
|
+
.command("test:all")
|
|
344
|
+
.description("Run all test missions")
|
|
345
|
+
.option("--no-headless", "Show browser (non-headless mode)")
|
|
346
|
+
.option("--url <url>", "Starting URL")
|
|
347
|
+
.action(async (options) => {
|
|
348
|
+
const cmd = new TestCommand();
|
|
349
|
+
await cmd.runAll(options);
|
|
350
|
+
});
|
|
351
|
+
// test:import <file> - Import missions from JSON
|
|
352
|
+
program
|
|
353
|
+
.command("test:import")
|
|
354
|
+
.description("Import test missions from a JSON file")
|
|
355
|
+
.argument("<file>", "Path to JSON file containing test missions")
|
|
356
|
+
.action(async (file) => {
|
|
357
|
+
const cmd = new TestCommand();
|
|
358
|
+
await cmd.importMissions(file);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Test Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes test missions using Playwright + AI-powered navigation.
|
|
5
|
+
* The AI agent autonomously navigates the UI, makes decisions, and validates outcomes.
|
|
6
|
+
*/
|
|
7
|
+
import { TestMission, TestExecutionResult, BrowserConfig, InteractiveTestSession } from "../types/flow-testing";
|
|
8
|
+
export declare class BrowserTestRunner {
|
|
9
|
+
private projectPath;
|
|
10
|
+
private browser?;
|
|
11
|
+
private context?;
|
|
12
|
+
private aiClient;
|
|
13
|
+
private contextService;
|
|
14
|
+
private screenshotsDir;
|
|
15
|
+
constructor(projectPath: string);
|
|
16
|
+
/**
|
|
17
|
+
* Initialize AI client from project config
|
|
18
|
+
*/
|
|
19
|
+
private initializeAIClient;
|
|
20
|
+
/**
|
|
21
|
+
* Run a test mission
|
|
22
|
+
*/
|
|
23
|
+
runTest(mission: TestMission, config?: BrowserConfig): Promise<TestExecutionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Execute mission using AI
|
|
26
|
+
*/
|
|
27
|
+
private executeWithAI;
|
|
28
|
+
/**
|
|
29
|
+
* Ask AI for next action
|
|
30
|
+
*/
|
|
31
|
+
private askAI;
|
|
32
|
+
/**
|
|
33
|
+
* Infer what value to use for a field based on test data
|
|
34
|
+
*/
|
|
35
|
+
private inferFieldValue;
|
|
36
|
+
/**
|
|
37
|
+
* Execute an action on the page
|
|
38
|
+
*/
|
|
39
|
+
private executeAction;
|
|
40
|
+
/**
|
|
41
|
+
* Convert jQuery-style or ambiguous selectors to Playwright-compatible selectors
|
|
42
|
+
*/
|
|
43
|
+
private convertToPlaywrightSelector;
|
|
44
|
+
/**
|
|
45
|
+
* Try to find form inputs using intelligent strategies
|
|
46
|
+
*/
|
|
47
|
+
private tryFormInputStrategies;
|
|
48
|
+
/**
|
|
49
|
+
* Find element using multiple strategies
|
|
50
|
+
*/
|
|
51
|
+
private findElement;
|
|
52
|
+
/**
|
|
53
|
+
* Validate mission completion
|
|
54
|
+
*/
|
|
55
|
+
private validateMission;
|
|
56
|
+
/**
|
|
57
|
+
* Get simplified DOM for AI analysis
|
|
58
|
+
*/
|
|
59
|
+
private getSimplifiedDOM;
|
|
60
|
+
/**
|
|
61
|
+
* Get page content formatted for AI
|
|
62
|
+
*/
|
|
63
|
+
private getPageContentForAI;
|
|
64
|
+
/**
|
|
65
|
+
* Generate AI notes about the test execution
|
|
66
|
+
*/
|
|
67
|
+
private generateAINotes;
|
|
68
|
+
/**
|
|
69
|
+
* Take screenshot
|
|
70
|
+
*/
|
|
71
|
+
private takeScreenshot;
|
|
72
|
+
/**
|
|
73
|
+
* Launch browser
|
|
74
|
+
*/
|
|
75
|
+
private launchBrowser;
|
|
76
|
+
/**
|
|
77
|
+
* Close browser
|
|
78
|
+
*/
|
|
79
|
+
private closeBrowser;
|
|
80
|
+
/**
|
|
81
|
+
* Start interactive recording mode
|
|
82
|
+
*/
|
|
83
|
+
startRecording(name: string, startUrl: string): Promise<InteractiveTestSession>;
|
|
84
|
+
/**
|
|
85
|
+
* Start watch mode
|
|
86
|
+
*/
|
|
87
|
+
startWatchMode(missions: string[], watchPaths: string[]): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=browser-test-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-test-runner.d.ts","sourceRoot":"","sources":["../../src/mcp/browser-test-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACL,WAAW,EACX,mBAAmB,EAGnB,aAAa,EACb,sBAAsB,EAGvB,MAAM,uBAAuB,CAAC;AAM/B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAS;gBAEnB,WAAW,EAAE,MAAM;IAc/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,GAAE,aAAkC,GACzC,OAAO,CAAC,mBAAmB,CAAC;IAuJ/B;;OAEG;YACW,aAAa;IA0H3B;;OAEG;YACW,KAAK;IAwEnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqCvB;;OAEG;YACW,aAAa;IAuH3B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA8BnC;;OAEG;YACW,sBAAsB;IA8EpC;;OAEG;YACW,WAAW;IAoCzB;;OAEG;YACW,eAAe;IAsE7B;;OAEG;YACW,gBAAgB;IA2B9B;;OAEG;YACW,mBAAmB;IAUjC;;OAEG;YACW,eAAe;IAY7B;;OAEG;YACW,cAAc;IAe5B;;OAEG;YACW,aAAa;IAc3B;;OAEG;YACW,YAAY;IAS1B;;OAEG;IACG,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC;IAMlC;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC;CAKjB"}
|