@zhiweiliu/playwright-generator 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +344 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/generate.d.ts +7 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +113 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +183 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/claude.d.ts +9 -0
- package/dist/llm/claude.d.ts.map +1 -0
- package/dist/llm/claude.js +81 -0
- package/dist/llm/claude.js.map +1 -0
- package/dist/llm/copilot.d.ts +9 -0
- package/dist/llm/copilot.d.ts.map +1 -0
- package/dist/llm/copilot.js +65 -0
- package/dist/llm/copilot.js.map +1 -0
- package/dist/llm/index.d.ts +6 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +30 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/provider.d.ts +17 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +25 -0
- package/dist/llm/provider.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initializeProject = initializeProject;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
async function initializeProject(projectPath) {
|
|
11
|
+
const projectRoot = path_1.default.resolve(projectPath);
|
|
12
|
+
try {
|
|
13
|
+
console.log(chalk_1.default.blue(`Initializing Playwright LLM Test Case Generator in ${projectRoot}...`));
|
|
14
|
+
// Create directory structure
|
|
15
|
+
const directories = [
|
|
16
|
+
"tests",
|
|
17
|
+
"generated",
|
|
18
|
+
"page-objects",
|
|
19
|
+
"utils",
|
|
20
|
+
"audit/screenshots",
|
|
21
|
+
".github/workflows",
|
|
22
|
+
];
|
|
23
|
+
for (const dir of directories) {
|
|
24
|
+
const dirPath = path_1.default.join(projectRoot, dir);
|
|
25
|
+
await fs_extra_1.default.ensureDir(dirPath);
|
|
26
|
+
console.log(chalk_1.default.green(`✓ Created directory: ${dir}`));
|
|
27
|
+
}
|
|
28
|
+
// Copy .env.example to project
|
|
29
|
+
const envExamplePath = path_1.default.join(__dirname, "../../.env.example");
|
|
30
|
+
const targetEnvPath = path_1.default.join(projectRoot, ".env.example");
|
|
31
|
+
if (fs_extra_1.default.existsSync(envExamplePath)) {
|
|
32
|
+
await fs_extra_1.default.copy(envExamplePath, targetEnvPath);
|
|
33
|
+
}
|
|
34
|
+
// Create .env file if it doesn't exist
|
|
35
|
+
const envPath = path_1.default.join(projectRoot, ".env");
|
|
36
|
+
if (!fs_extra_1.default.existsSync(envPath)) {
|
|
37
|
+
await fs_extra_1.default.writeFile(envPath, fs_extra_1.default.readFileSync(targetEnvPath, "utf-8"));
|
|
38
|
+
console.log(chalk_1.default.green("✓ Created .env file"));
|
|
39
|
+
}
|
|
40
|
+
// Create playwright.config.ts
|
|
41
|
+
const playwrightConfig = `import { defineConfig, devices } from '@playwright/test';
|
|
42
|
+
|
|
43
|
+
export default defineConfig({
|
|
44
|
+
testDir: './generated',
|
|
45
|
+
fullyParallel: true,
|
|
46
|
+
forbidOnly: !!process.env.CI,
|
|
47
|
+
retries: process.env.CI ? 2 : 0,
|
|
48
|
+
workers: process.env.CI ? 1 : 4,
|
|
49
|
+
reporter: 'html',
|
|
50
|
+
use: {
|
|
51
|
+
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
|
52
|
+
trace: 'on-first-retry',
|
|
53
|
+
screenshot: 'only-on-failure',
|
|
54
|
+
video: 'retain-on-failure',
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
projects: [
|
|
58
|
+
{
|
|
59
|
+
name: 'chromium',
|
|
60
|
+
use: { ...devices['Desktop Chrome'] },
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'firefox',
|
|
64
|
+
use: { ...devices['Desktop Firefox'] },
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'webkit',
|
|
68
|
+
use: { ...devices['Desktop Safari'] },
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
|
|
72
|
+
webServer: {
|
|
73
|
+
command: 'npm run server',
|
|
74
|
+
url: 'http://localhost:3000',
|
|
75
|
+
reuseExistingServer: !process.env.CI,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
`;
|
|
79
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectRoot, "playwright.config.ts"), playwrightConfig);
|
|
80
|
+
console.log(chalk_1.default.green("✓ Created playwright.config.ts"));
|
|
81
|
+
// Create package.json for the generated project
|
|
82
|
+
const packageJson = {
|
|
83
|
+
name: "playwright-tests",
|
|
84
|
+
version: "1.0.0",
|
|
85
|
+
description: "Playwright tests generated by @zhiweiliu/playwright-generator",
|
|
86
|
+
scripts: {
|
|
87
|
+
test: "playwright test",
|
|
88
|
+
"test:tag": "playwright test --grep",
|
|
89
|
+
"test:case": "playwright test --grep",
|
|
90
|
+
"test:debug": "playwright test --debug",
|
|
91
|
+
"test:headed": "playwright test --headed",
|
|
92
|
+
"test:browser": "playwright test --project",
|
|
93
|
+
report: "playwright show-report",
|
|
94
|
+
server: 'echo "Add your server startup command here"',
|
|
95
|
+
},
|
|
96
|
+
devDependencies: {
|
|
97
|
+
"@playwright/test": "^1.40.0",
|
|
98
|
+
},
|
|
99
|
+
keywords: ["playwright", "testing", "automation"],
|
|
100
|
+
author: "",
|
|
101
|
+
license: "MIT",
|
|
102
|
+
};
|
|
103
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectRoot, "package.json"), JSON.stringify(packageJson, null, 2));
|
|
104
|
+
console.log(chalk_1.default.green("✓ Created package.json"));
|
|
105
|
+
// Create example test case
|
|
106
|
+
const exampleTestCase = `# [TC-0001] [SMOKE] [LOGIN]
|
|
107
|
+
|
|
108
|
+
## Test: User logs in with valid credentials
|
|
109
|
+
|
|
110
|
+
Given the user is on the login page
|
|
111
|
+
When the user enters valid username and password
|
|
112
|
+
And clicks the login button
|
|
113
|
+
Then the user should be redirected to the dashboard
|
|
114
|
+
And the user name should be displayed in the header
|
|
115
|
+
`;
|
|
116
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectRoot, "tests", "example.test.md"), exampleTestCase);
|
|
117
|
+
console.log(chalk_1.default.green("✓ Created example test case"));
|
|
118
|
+
// Create GitHub Actions workflow
|
|
119
|
+
const workflow = `name: Playwright Tests
|
|
120
|
+
|
|
121
|
+
on:
|
|
122
|
+
push:
|
|
123
|
+
branches: [main]
|
|
124
|
+
pull_request:
|
|
125
|
+
branches: [main]
|
|
126
|
+
schedule:
|
|
127
|
+
- cron: '0 0 * * *' # Run daily at midnight UTC
|
|
128
|
+
|
|
129
|
+
jobs:
|
|
130
|
+
test:
|
|
131
|
+
timeout-minutes: 60
|
|
132
|
+
runs-on: ubuntu-latest
|
|
133
|
+
steps:
|
|
134
|
+
- uses: actions/checkout@v4
|
|
135
|
+
- uses: actions/setup-node@v4
|
|
136
|
+
with:
|
|
137
|
+
node-version: lts/*
|
|
138
|
+
- run: npm install
|
|
139
|
+
- run: npx playwright install --with-deps
|
|
140
|
+
- run: npm test
|
|
141
|
+
- uses: actions/upload-artifact@v4
|
|
142
|
+
if: always()
|
|
143
|
+
with:
|
|
144
|
+
name: playwright-report
|
|
145
|
+
path: playwright-report/
|
|
146
|
+
retention-days: 30
|
|
147
|
+
`;
|
|
148
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectRoot, ".github/workflows/playwright-tests.yml"), workflow);
|
|
149
|
+
console.log(chalk_1.default.green("✓ Created GitHub Actions workflow"));
|
|
150
|
+
// Create .gitignore if it doesn't exist
|
|
151
|
+
const gitignorePath = path_1.default.join(projectRoot, ".gitignore");
|
|
152
|
+
if (!fs_extra_1.default.existsSync(gitignorePath)) {
|
|
153
|
+
const gitignore = `node_modules/
|
|
154
|
+
dist/
|
|
155
|
+
.DS_Store
|
|
156
|
+
.env
|
|
157
|
+
.env.local
|
|
158
|
+
*.log
|
|
159
|
+
npm-debug.log*
|
|
160
|
+
yarn-debug.log*
|
|
161
|
+
yarn-error.log*
|
|
162
|
+
playwright-report/
|
|
163
|
+
blob-report/
|
|
164
|
+
playwright/.cache/
|
|
165
|
+
audit/screenshots/*
|
|
166
|
+
`;
|
|
167
|
+
await fs_extra_1.default.writeFile(gitignorePath, gitignore);
|
|
168
|
+
console.log(chalk_1.default.green("✓ Created .gitignore"));
|
|
169
|
+
}
|
|
170
|
+
console.log(chalk_1.default.green.bold("\\n✓ Project initialized successfully!"));
|
|
171
|
+
console.log(chalk_1.default.cyan("\\nNext steps:"));
|
|
172
|
+
console.log("1. Edit .env with your API credentials");
|
|
173
|
+
console.log("2. Write test cases in the tests/ folder");
|
|
174
|
+
console.log("3. Run: npx playwright-generator generate --tc TC-0001");
|
|
175
|
+
console.log("4. Install dependencies: npm install");
|
|
176
|
+
console.log("5. Run tests: npm test");
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.error(chalk_1.default.red("Error initializing project:"), error);
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
aiModel: "copilot" | "claude";
|
|
3
|
+
copilotApiKey?: string;
|
|
4
|
+
claudeApiKey?: string;
|
|
5
|
+
browser: "chromium" | "firefox" | "webkit";
|
|
6
|
+
headless: boolean;
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
timeout: number;
|
|
9
|
+
retries: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class ConfigManager {
|
|
12
|
+
private static instance;
|
|
13
|
+
private config;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(): ConfigManager;
|
|
16
|
+
private loadConfig;
|
|
17
|
+
getConfig(): Config;
|
|
18
|
+
validateConfig(): boolean;
|
|
19
|
+
getEnvFilePath(projectRoot: string): string;
|
|
20
|
+
envFileExists(projectRoot: string): boolean;
|
|
21
|
+
}
|
|
22
|
+
declare const _default: ConfigManager;
|
|
23
|
+
export default _default;
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,UAAU;IAelB,SAAS,IAAI,MAAM;IAInB,cAAc,IAAI,OAAO;IAczB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI3C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAG5C;;AAED,wBAA2C"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigManager = void 0;
|
|
7
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
// Load environment variables
|
|
11
|
+
dotenv_1.default.config();
|
|
12
|
+
class ConfigManager {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.config = this.loadConfig();
|
|
15
|
+
}
|
|
16
|
+
static getInstance() {
|
|
17
|
+
if (!ConfigManager.instance) {
|
|
18
|
+
ConfigManager.instance = new ConfigManager();
|
|
19
|
+
}
|
|
20
|
+
return ConfigManager.instance;
|
|
21
|
+
}
|
|
22
|
+
loadConfig() {
|
|
23
|
+
return {
|
|
24
|
+
aiModel: process.env.AI_MODEL || "copilot",
|
|
25
|
+
copilotApiKey: process.env.COPILOT_API_KEY,
|
|
26
|
+
claudeApiKey: process.env.CLAUDE_API_KEY,
|
|
27
|
+
browser: process.env.BROWSER ||
|
|
28
|
+
"chromium",
|
|
29
|
+
headless: process.env.HEADLESS !== "false",
|
|
30
|
+
baseUrl: process.env.BASE_URL || "http://localhost:3000",
|
|
31
|
+
timeout: parseInt(process.env.TIMEOUT || "30000", 10),
|
|
32
|
+
retries: parseInt(process.env.RETRIES || "1", 10),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
getConfig() {
|
|
36
|
+
return this.config;
|
|
37
|
+
}
|
|
38
|
+
validateConfig() {
|
|
39
|
+
const { aiModel, copilotApiKey, claudeApiKey } = this.config;
|
|
40
|
+
if (aiModel === "copilot" && !copilotApiKey) {
|
|
41
|
+
throw new Error("COPILOT_API_KEY is required when using Copilot model");
|
|
42
|
+
}
|
|
43
|
+
if (aiModel === "claude" && !claudeApiKey) {
|
|
44
|
+
throw new Error("CLAUDE_API_KEY is required when using Claude model");
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
getEnvFilePath(projectRoot) {
|
|
49
|
+
return path_1.default.join(projectRoot, ".env");
|
|
50
|
+
}
|
|
51
|
+
envFileExists(projectRoot) {
|
|
52
|
+
return fs_1.default.existsSync(this.getEnvFilePath(projectRoot));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.ConfigManager = ConfigManager;
|
|
56
|
+
exports.default = ConfigManager.getInstance();
|
|
57
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,gDAAwB;AACxB,4CAAoB;AAEpB,6BAA6B;AAC7B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAahB,MAAa,aAAa;IAIxB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,OAAO,EAAG,OAAO,CAAC,GAAG,CAAC,QAAiC,IAAI,SAAS;YACpE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YAC1C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;YACxC,OAAO,EACJ,OAAO,CAAC,GAAG,CAAC,OAA6C;gBAC1D,UAAU;YACZ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO;YAC1C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB;YACxD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,EAAE,EAAE,CAAC;YACrD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,cAAc;QACZ,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE7D,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,OAAO,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AAvDD,sCAuDC;AAED,kBAAe,aAAa,CAAC,WAAW,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./config";
|
|
2
|
+
export * from "./commands/init";
|
|
3
|
+
export * from "./commands/generate";
|
|
4
|
+
export * from "./llm/provider";
|
|
5
|
+
export { CopilotProvider } from "./llm/copilot";
|
|
6
|
+
export { ClaudeProvider } from "./llm/claude";
|
|
7
|
+
export { LLMFactory } from "./llm";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.LLMFactory = exports.ClaudeProvider = exports.CopilotProvider = void 0;
|
|
18
|
+
__exportStar(require("./config"), exports);
|
|
19
|
+
__exportStar(require("./commands/init"), exports);
|
|
20
|
+
__exportStar(require("./commands/generate"), exports);
|
|
21
|
+
__exportStar(require("./llm/provider"), exports);
|
|
22
|
+
var copilot_1 = require("./llm/copilot");
|
|
23
|
+
Object.defineProperty(exports, "CopilotProvider", { enumerable: true, get: function () { return copilot_1.CopilotProvider; } });
|
|
24
|
+
var claude_1 = require("./llm/claude");
|
|
25
|
+
Object.defineProperty(exports, "ClaudeProvider", { enumerable: true, get: function () { return claude_1.ClaudeProvider; } });
|
|
26
|
+
var llm_1 = require("./llm");
|
|
27
|
+
Object.defineProperty(exports, "LLMFactory", { enumerable: true, get: function () { return llm_1.LLMFactory; } });
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,kDAAgC;AAChC,sDAAoC;AACpC,iDAA+B;AAC/B,yCAAgD;AAAvC,0GAAA,eAAe,OAAA;AACxB,uCAA8C;AAArC,wGAAA,cAAc,OAAA;AACvB,6BAAmC;AAA1B,iGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { LLMProvider, LLMPrompt, GeneratedCode } from "./provider";
|
|
2
|
+
export declare class ClaudeProvider extends LLMProvider {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
constructor(apiKey: string);
|
|
6
|
+
validateConnection(): Promise<boolean>;
|
|
7
|
+
generateTestCode(prompt: LLMPrompt): Promise<GeneratedCode>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/llm/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA2C;gBAE9C,MAAM,EAAE,MAAM;IAQpB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IA8BtC,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;CA4ClE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ClaudeProvider = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const provider_1 = require("./provider");
|
|
9
|
+
class ClaudeProvider extends provider_1.LLMProvider {
|
|
10
|
+
constructor(apiKey) {
|
|
11
|
+
super();
|
|
12
|
+
this.baseUrl = "https://api.anthropic.com/v1/messages";
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
throw new Error("Claude API key is required");
|
|
15
|
+
}
|
|
16
|
+
this.apiKey = apiKey;
|
|
17
|
+
}
|
|
18
|
+
async validateConnection() {
|
|
19
|
+
try {
|
|
20
|
+
const response = await axios_1.default.post(this.baseUrl, {
|
|
21
|
+
model: "claude-3-sonnet-20240229",
|
|
22
|
+
max_tokens: 100,
|
|
23
|
+
messages: [
|
|
24
|
+
{
|
|
25
|
+
role: "user",
|
|
26
|
+
content: "test",
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
}, {
|
|
30
|
+
headers: {
|
|
31
|
+
"x-api-key": this.apiKey,
|
|
32
|
+
"anthropic-version": "2023-06-01",
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
},
|
|
35
|
+
timeout: 5000,
|
|
36
|
+
});
|
|
37
|
+
return response.status === 200;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error("Claude connection validation failed:", error);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async generateTestCode(prompt) {
|
|
45
|
+
try {
|
|
46
|
+
const systemPrompt = this.buildPrompt(prompt.testCase);
|
|
47
|
+
const response = await axios_1.default.post(this.baseUrl, {
|
|
48
|
+
model: "claude-3-sonnet-20240229",
|
|
49
|
+
max_tokens: 2000,
|
|
50
|
+
messages: [
|
|
51
|
+
{
|
|
52
|
+
role: "user",
|
|
53
|
+
content: systemPrompt,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
}, {
|
|
57
|
+
headers: {
|
|
58
|
+
"x-api-key": this.apiKey,
|
|
59
|
+
"anthropic-version": "2023-06-01",
|
|
60
|
+
"Content-Type": "application/json",
|
|
61
|
+
},
|
|
62
|
+
timeout: 30000,
|
|
63
|
+
});
|
|
64
|
+
const generatedCode = response.data.content?.[0]?.text || "";
|
|
65
|
+
if (!generatedCode.trim()) {
|
|
66
|
+
throw new Error("Empty response from Claude");
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
code: generatedCode,
|
|
70
|
+
timestamp: new Date(),
|
|
71
|
+
model: "claude",
|
|
72
|
+
testCaseId: prompt.testCaseId,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error(`Failed to generate code with Claude: ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.ClaudeProvider = ClaudeProvider;
|
|
81
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/llm/claude.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,yCAAmE;AAEnE,MAAa,cAAe,SAAQ,sBAAW;IAI7C,YAAY,MAAc;QACxB,KAAK,EAAE,CAAC;QAHF,YAAO,GAAG,uCAAuC,CAAC;QAIxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ;gBACE,KAAK,EAAE,0BAA0B;gBACjC,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;qBAChB;iBACF;aACF,EACD;gBACE,OAAO,EAAE;oBACP,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,mBAAmB,EAAE,YAAY;oBACjC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,OAAO,EAAE,IAAI;aACd,CACF,CAAC;YACF,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAiB;QACtC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEvD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ;gBACE,KAAK,EAAE,0BAA0B;gBACjC,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,YAAY;qBACtB;iBACF;aACF,EACD;gBACE,OAAO,EAAE;oBACP,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,mBAAmB,EAAE,YAAY;oBACjC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,OAAO,EAAE,KAAK;aACf,CACF,CAAC;YAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAE7D,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,KAAK,EAAE,QAAQ;gBACf,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjG,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAtFD,wCAsFC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { LLMProvider, LLMPrompt, GeneratedCode } from "./provider";
|
|
2
|
+
export declare class CopilotProvider extends LLMProvider {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
constructor(apiKey: string);
|
|
6
|
+
validateConnection(): Promise<boolean>;
|
|
7
|
+
generateTestCode(prompt: LLMPrompt): Promise<GeneratedCode>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=copilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/llm/copilot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA4D;gBAE/D,MAAM,EAAE,MAAM;IAQpB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAoBtC,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;CAsClE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CopilotProvider = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const provider_1 = require("./provider");
|
|
9
|
+
class CopilotProvider extends provider_1.LLMProvider {
|
|
10
|
+
constructor(apiKey) {
|
|
11
|
+
super();
|
|
12
|
+
this.baseUrl = "https://api.github.com/copilot_internal/v2/completions";
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
throw new Error("Copilot API key is required");
|
|
15
|
+
}
|
|
16
|
+
this.apiKey = apiKey;
|
|
17
|
+
}
|
|
18
|
+
async validateConnection() {
|
|
19
|
+
try {
|
|
20
|
+
const response = await axios_1.default.post(this.baseUrl, { prompt: "test" }, {
|
|
21
|
+
headers: {
|
|
22
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
},
|
|
25
|
+
timeout: 5000,
|
|
26
|
+
});
|
|
27
|
+
return response.status === 200;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error("Copilot connection validation failed:", error);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async generateTestCode(prompt) {
|
|
35
|
+
try {
|
|
36
|
+
const systemPrompt = this.buildPrompt(prompt.testCase);
|
|
37
|
+
const response = await axios_1.default.post(this.baseUrl, {
|
|
38
|
+
prompt: systemPrompt,
|
|
39
|
+
max_tokens: 2000,
|
|
40
|
+
temperature: 0.7,
|
|
41
|
+
}, {
|
|
42
|
+
headers: {
|
|
43
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
44
|
+
"Content-Type": "application/json",
|
|
45
|
+
},
|
|
46
|
+
timeout: 30000,
|
|
47
|
+
});
|
|
48
|
+
const generatedCode = response.data.choices?.[0]?.text || "";
|
|
49
|
+
if (!generatedCode.trim()) {
|
|
50
|
+
throw new Error("Empty response from Copilot");
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
code: generatedCode,
|
|
54
|
+
timestamp: new Date(),
|
|
55
|
+
model: "copilot",
|
|
56
|
+
testCaseId: prompt.testCaseId,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`Failed to generate code with Copilot: ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.CopilotProvider = CopilotProvider;
|
|
65
|
+
//# sourceMappingURL=copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/llm/copilot.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,yCAAmE;AAEnE,MAAa,eAAgB,SAAQ,sBAAW;IAI9C,YAAY,MAAc;QACxB,KAAK,EAAE,CAAC;QAHF,YAAO,GAAG,wDAAwD,CAAC;QAIzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACtC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,OAAO,EAAE,IAAI;aACd,CACF,CAAC;YACF,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAiB;QACtC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEvD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ;gBACE,MAAM,EAAE,YAAY;gBACpB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,GAAG;aACjB,EACD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACtC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,OAAO,EAAE,KAAK;aACf,CACF,CAAC;YAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAE7D,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClG,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAtED,0CAsEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKzC,qBAAa,UAAU;IACrB,MAAM,CAAC,cAAc,IAAI,WAAW;CAuBrC;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LLMFactory = void 0;
|
|
7
|
+
const copilot_1 = require("./copilot");
|
|
8
|
+
const claude_1 = require("./claude");
|
|
9
|
+
const config_1 = __importDefault(require("../config"));
|
|
10
|
+
class LLMFactory {
|
|
11
|
+
static createProvider() {
|
|
12
|
+
const config = config_1.default.getConfig();
|
|
13
|
+
if (config.aiModel === "copilot") {
|
|
14
|
+
if (!config.copilotApiKey) {
|
|
15
|
+
throw new Error("Copilot API key not configured. Set COPILOT_API_KEY in .env");
|
|
16
|
+
}
|
|
17
|
+
return new copilot_1.CopilotProvider(config.copilotApiKey);
|
|
18
|
+
}
|
|
19
|
+
if (config.aiModel === "claude") {
|
|
20
|
+
if (!config.claudeApiKey) {
|
|
21
|
+
throw new Error("Claude API key not configured. Set CLAUDE_API_KEY in .env");
|
|
22
|
+
}
|
|
23
|
+
return new claude_1.ClaudeProvider(config.claudeApiKey);
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`Unknown AI model: ${config.aiModel}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.LLMFactory = LLMFactory;
|
|
29
|
+
exports.default = LLMFactory;
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":";;;;;;AACA,uCAA4C;AAC5C,qCAA0C;AAC1C,uDAAsC;AAEtC,MAAa,UAAU;IACrB,MAAM,CAAC,cAAc;QACnB,MAAM,MAAM,GAAG,gBAAa,CAAC,SAAS,EAAE,CAAC;QAEzC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,yBAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,uBAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;CACF;AAxBD,gCAwBC;AAED,kBAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface LLMPrompt {
|
|
2
|
+
testCase: string;
|
|
3
|
+
testCaseId: string;
|
|
4
|
+
tags: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface GeneratedCode {
|
|
7
|
+
code: string;
|
|
8
|
+
timestamp: Date;
|
|
9
|
+
model: string;
|
|
10
|
+
testCaseId: string;
|
|
11
|
+
}
|
|
12
|
+
export declare abstract class LLMProvider {
|
|
13
|
+
abstract generateTestCode(prompt: LLMPrompt): Promise<GeneratedCode>;
|
|
14
|
+
abstract validateConnection(): Promise<boolean>;
|
|
15
|
+
protected buildPrompt(testCaseContent: string): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;IACpE,QAAQ,CAAC,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAE/C,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM;CAkBvD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LLMProvider = void 0;
|
|
4
|
+
class LLMProvider {
|
|
5
|
+
buildPrompt(testCaseContent) {
|
|
6
|
+
return `You are an expert Playwright test automation engineer.
|
|
7
|
+
Generate Playwright TypeScript test code based on the following natural language test case.
|
|
8
|
+
The generated code should:
|
|
9
|
+
- Use Playwright best practices
|
|
10
|
+
- Include proper assertions
|
|
11
|
+
- Handle element waits automatically (Playwright auto-waits)
|
|
12
|
+
- Be readable and maintainable
|
|
13
|
+
- Include comments explaining complex steps
|
|
14
|
+
|
|
15
|
+
Natural language test case:
|
|
16
|
+
${testCaseContent}
|
|
17
|
+
|
|
18
|
+
Generate ONLY the test function code, without explanations. Use this format:
|
|
19
|
+
test('Test Description', async ({ page }) => {
|
|
20
|
+
// Your test code here
|
|
21
|
+
});`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.LLMProvider = LLMProvider;
|
|
25
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":";;;AAaA,MAAsB,WAAW;IAIrB,WAAW,CAAC,eAAuB;QAC3C,OAAO;;;;;;;;;;EAUT,eAAe;;;;;IAKb,CAAC;IACH,CAAC;CACF;AAtBD,kCAsBC"}
|