@oalacea/daemon 0.6.3 → 0.6.4
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/dist/cli/cli.js
CHANGED
|
@@ -58,7 +58,7 @@ export class DaemonCli {
|
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
if (args[0] === '--version') {
|
|
61
|
-
console.log('v0.6.
|
|
61
|
+
console.log('v0.6.4');
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
const commandName = args[0] ?? '';
|
|
@@ -82,7 +82,7 @@ export class DaemonCli {
|
|
|
82
82
|
*/
|
|
83
83
|
showHelp() {
|
|
84
84
|
console.log(`
|
|
85
|
-
Daemon v0.6.
|
|
85
|
+
Daemon v0.6.4 - AI-powered automated testing toolkit
|
|
86
86
|
|
|
87
87
|
USAGE:
|
|
88
88
|
daemon <command> [options]
|
|
@@ -26,28 +26,26 @@ export declare class InitCommand {
|
|
|
26
26
|
*/
|
|
27
27
|
execute(args: string[]): Promise<void>;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*/
|
|
31
|
-
private parseArgs;
|
|
32
|
-
/**
|
|
33
|
-
* Create Daemon configuration
|
|
29
|
+
* Run detection and return context
|
|
34
30
|
*/
|
|
35
|
-
private
|
|
31
|
+
private runDetection;
|
|
36
32
|
/**
|
|
37
|
-
*
|
|
33
|
+
* Generate prompt with context
|
|
38
34
|
*/
|
|
39
|
-
private
|
|
35
|
+
private generatePrompt;
|
|
40
36
|
/**
|
|
41
|
-
*
|
|
37
|
+
* Build context block for prompt
|
|
42
38
|
*/
|
|
43
|
-
private
|
|
39
|
+
private buildContextBlock;
|
|
44
40
|
/**
|
|
45
|
-
*
|
|
41
|
+
* Generate fallback prompt
|
|
46
42
|
*/
|
|
47
|
-
private
|
|
43
|
+
private generateFallbackPrompt;
|
|
44
|
+
private cyan;
|
|
45
|
+
private bold;
|
|
48
46
|
/**
|
|
49
|
-
*
|
|
47
|
+
* Parse command line arguments
|
|
50
48
|
*/
|
|
51
|
-
private
|
|
49
|
+
private parseArgs;
|
|
52
50
|
}
|
|
53
51
|
//# sourceMappingURL=init.command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"init.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyCH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;;IAM7C;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4H5C;;OAEG;YACW,YAAY;IA4B1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiDzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuD9B,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,IAAI;IAIZ;;OAEG;IACH,OAAO,CAAC,SAAS;CA8BlB"}
|
|
@@ -7,13 +7,39 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as path from 'node:path';
|
|
9
9
|
import * as url from 'node:url';
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
10
12
|
import { createLogger } from '../../shared/utils/logger.js';
|
|
11
|
-
import { fileHelper } from '../../shared/utils/file-helper.js';
|
|
12
13
|
import { FrameworkDetector } from '../../services/detection/framework-detector.js';
|
|
13
14
|
const logger = createLogger('InitCommand');
|
|
14
15
|
// Get __dirname equivalent for ES modules
|
|
15
16
|
const __filename = url.fileURLToPath(import.meta.url);
|
|
16
17
|
const __dirname = path.dirname(__filename);
|
|
18
|
+
// Configuration
|
|
19
|
+
const CONFIG = {
|
|
20
|
+
IMAGE: 'daemon-tools',
|
|
21
|
+
CONTAINER: 'daemon-tools',
|
|
22
|
+
PROMPT_DEST: path.join(process.cwd(), '.daemon', 'EXECUTE.md'),
|
|
23
|
+
DOCKERFILE: path.resolve(__dirname, '../../../bin/Dockerfile'),
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Run shell command with timeout
|
|
27
|
+
*/
|
|
28
|
+
function run(cmd, options = {}) {
|
|
29
|
+
try {
|
|
30
|
+
return execSync(cmd, {
|
|
31
|
+
encoding: 'utf-8',
|
|
32
|
+
stdio: 'pipe',
|
|
33
|
+
timeout: options.timeout ?? 60000
|
|
34
|
+
}).trim();
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (!options.silent && error.status !== null) {
|
|
38
|
+
logger.debug(`Command exited with code ${error.status}`);
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
17
43
|
/**
|
|
18
44
|
* Initialize command for Daemon
|
|
19
45
|
*/
|
|
@@ -26,39 +52,268 @@ export class InitCommand {
|
|
|
26
52
|
* Execute the init command
|
|
27
53
|
*/
|
|
28
54
|
async execute(args) {
|
|
29
|
-
logger.info('Initializing Daemon...');
|
|
30
55
|
const options = this.parseArgs(args);
|
|
31
56
|
try {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
57
|
+
logger.info('');
|
|
58
|
+
logger.info('═══════════════════════════════════════════════════');
|
|
59
|
+
logger.info(' Daemon - AI-Powered Test Generation');
|
|
60
|
+
logger.info('═══════════════════════════════════════════════════');
|
|
61
|
+
logger.info('');
|
|
62
|
+
logger.info(' Automated testing toolkit for web applications');
|
|
63
|
+
logger.info('');
|
|
64
|
+
// --- Step 1: Check Docker ---
|
|
65
|
+
logger.info(' → Checking Docker...');
|
|
66
|
+
if (run('docker info', { silent: true }) === null) {
|
|
67
|
+
logger.error('');
|
|
68
|
+
logger.error(' Docker is not running.');
|
|
69
|
+
logger.error('');
|
|
70
|
+
logger.error(' Start Docker Desktop (or the Docker daemon) and try again.');
|
|
71
|
+
logger.error('');
|
|
72
|
+
logger.error(' Install Docker: https://docs.docker.com/get-docker/');
|
|
73
|
+
throw new Error('Docker not running');
|
|
38
74
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
75
|
+
logger.success(' Docker is running');
|
|
76
|
+
// --- Step 2: Build image if missing ---
|
|
77
|
+
const imageExists = run(`docker images -q ${CONFIG.IMAGE}`);
|
|
78
|
+
if (!imageExists) {
|
|
79
|
+
logger.info('');
|
|
80
|
+
logger.warn(' ◆ The testing toolkit needs to be installed (~500 MB Docker image).');
|
|
81
|
+
logger.info(' This only happens once.');
|
|
82
|
+
logger.info('');
|
|
83
|
+
logger.info(' → Building testing toolkit...');
|
|
84
|
+
logger.info(' This may take 2-3 minutes on first run...');
|
|
85
|
+
logger.info('');
|
|
86
|
+
const buildCmd = `docker build -t ${CONFIG.IMAGE} -f "${CONFIG.DOCKERFILE}" "${path.dirname(CONFIG.DOCKERFILE)}"`;
|
|
87
|
+
try {
|
|
88
|
+
execSync(buildCmd, { stdio: 'inherit', timeout: 600000 });
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new Error(`Failed to build toolkit. Try: ${buildCmd}`);
|
|
92
|
+
}
|
|
93
|
+
logger.success(' Testing toolkit installed');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
logger.success(' Testing toolkit ready');
|
|
97
|
+
}
|
|
98
|
+
// --- Step 3: Start container if not running ---
|
|
99
|
+
const containerRunning = run(`docker ps --filter "name=^${CONFIG.CONTAINER}$" --format "{{.Names}}"`);
|
|
100
|
+
if (containerRunning === CONFIG.CONTAINER) {
|
|
101
|
+
logger.success(` Toolkit container running (${CONFIG.CONTAINER})`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const containerExists = run(`docker ps -a --filter "name=^${CONFIG.CONTAINER}$" --format "{{.Names}}"`);
|
|
105
|
+
if (containerExists === CONFIG.CONTAINER) {
|
|
106
|
+
process.stdout.write(' → Starting toolkit container...');
|
|
107
|
+
if (run(`docker start ${CONFIG.CONTAINER}`, { timeout: 30000 }) === null) {
|
|
108
|
+
logger.error('');
|
|
109
|
+
throw new Error('Failed to start container');
|
|
110
|
+
}
|
|
111
|
+
logger.info(' done');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const isLinux = process.platform === 'linux';
|
|
115
|
+
const networkFlag = isLinux ? '--network=host' : '';
|
|
116
|
+
process.stdout.write(` → Creating toolkit container (${CONFIG.CONTAINER})...`);
|
|
117
|
+
const runCmd = `docker run -d --name ${CONFIG.CONTAINER} ${networkFlag} ${CONFIG.IMAGE}`.replace(/\s+/g, ' ');
|
|
118
|
+
if (run(runCmd, { timeout: 30000 }) === null) {
|
|
119
|
+
logger.error('');
|
|
120
|
+
throw new Error(`Failed to create container. Try: ${runCmd}`);
|
|
121
|
+
}
|
|
122
|
+
logger.info(' done');
|
|
123
|
+
}
|
|
124
|
+
logger.success(` Toolkit container running (${CONFIG.CONTAINER})`);
|
|
125
|
+
}
|
|
126
|
+
// --- Step 4: Run detection ---
|
|
127
|
+
logger.info(' → Analyzing project...');
|
|
128
|
+
const context = await this.runDetection(options);
|
|
129
|
+
// --- Step 5: Create daemon directory and prompt ---
|
|
130
|
+
const daemonDir = path.dirname(CONFIG.PROMPT_DEST);
|
|
131
|
+
if (!fs.existsSync(daemonDir)) {
|
|
132
|
+
fs.mkdirSync(daemonDir, { recursive: true });
|
|
133
|
+
}
|
|
134
|
+
const prompt = this.generatePrompt(context);
|
|
135
|
+
fs.writeFileSync(CONFIG.PROMPT_DEST, prompt, 'utf-8');
|
|
136
|
+
logger.success(` Prompt installed to ${this.bold('./.daemon/EXECUTE.md')}`);
|
|
137
|
+
// --- Step 6: Print summary ---
|
|
138
|
+
logger.info('');
|
|
139
|
+
logger.info(' Detected Configuration:');
|
|
140
|
+
logger.info(` Framework: ${this.cyan(context.framework ?? 'Unknown')}`);
|
|
141
|
+
logger.info(` Language: ${this.cyan(context.language ?? 'JavaScript/TypeScript')}`);
|
|
142
|
+
logger.info(` Test Runner: ${this.cyan(context.testRunner ?? 'Vitest')}`);
|
|
143
|
+
if (context.database) {
|
|
144
|
+
logger.info(` Database: ${this.cyan(context.database.type)}`);
|
|
145
|
+
logger.info(` Connection: ${this.cyan(context.database.connection)}`);
|
|
146
|
+
}
|
|
147
|
+
logger.info(` Existing: ${this.cyan((context.existingTests ?? 0) + ' tests')}`);
|
|
148
|
+
logger.info(` Target: ${this.cyan(context.target ?? 'http://localhost:3000')}`);
|
|
149
|
+
logger.info('');
|
|
150
|
+
// --- Step 7: Print instructions ---
|
|
151
|
+
logger.success(' Ready! Open your AI agent from your project directory and paste:');
|
|
48
152
|
logger.info('');
|
|
49
|
-
logger.info('
|
|
50
|
-
logger.info('
|
|
51
|
-
logger.info('
|
|
52
|
-
logger.info(' 3. Run "daemon detect" to see project details');
|
|
53
|
-
logger.info(' 4. Check EXECUTE.md for AI testing instructions');
|
|
153
|
+
logger.info(` ${this.cyan('Read ./.daemon/EXECUTE.md and start the testing process')}`);
|
|
154
|
+
logger.info('');
|
|
155
|
+
logger.info(' Works with Claude Code, Cursor, Windsurf, Aider, Codex...');
|
|
54
156
|
logger.info('');
|
|
55
|
-
logger.info('For more information, visit: https://github.com/Pamacea/daemon');
|
|
56
157
|
}
|
|
57
158
|
catch (error) {
|
|
58
159
|
logger.error('Failed to initialize Daemon', error);
|
|
59
160
|
throw error;
|
|
60
161
|
}
|
|
61
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Run detection and return context
|
|
165
|
+
*/
|
|
166
|
+
async runDetection(options) {
|
|
167
|
+
if (!options.skipDetection) {
|
|
168
|
+
const result = await this.detector.detect(process.cwd());
|
|
169
|
+
return {
|
|
170
|
+
framework: result.value ?? 'Unknown',
|
|
171
|
+
language: 'JavaScript/TypeScript',
|
|
172
|
+
testRunner: 'Vitest',
|
|
173
|
+
database: null,
|
|
174
|
+
existingTests: 0,
|
|
175
|
+
coverage: null,
|
|
176
|
+
dependencies: [],
|
|
177
|
+
target: 'http://localhost:3000'
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// Default context
|
|
181
|
+
return {
|
|
182
|
+
framework: 'Unknown',
|
|
183
|
+
language: 'JavaScript/TypeScript',
|
|
184
|
+
testRunner: 'Vitest',
|
|
185
|
+
database: null,
|
|
186
|
+
existingTests: 0,
|
|
187
|
+
coverage: null,
|
|
188
|
+
dependencies: [],
|
|
189
|
+
target: 'http://localhost:3000'
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Generate prompt with context
|
|
194
|
+
*/
|
|
195
|
+
generatePrompt(context) {
|
|
196
|
+
const promptSrc = path.resolve(__dirname, '../../../prompts/EXECUTE.md');
|
|
197
|
+
if (!fs.existsSync(promptSrc)) {
|
|
198
|
+
return this.generateFallbackPrompt(context);
|
|
199
|
+
}
|
|
200
|
+
const basePrompt = fs.readFileSync(promptSrc, 'utf-8');
|
|
201
|
+
const contextBlock = this.buildContextBlock(context);
|
|
202
|
+
return contextBlock + '\n' + basePrompt;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Build context block for prompt
|
|
206
|
+
*/
|
|
207
|
+
buildContextBlock(context) {
|
|
208
|
+
const lines = [
|
|
209
|
+
'> **DETECTED CONTEXT**'
|
|
210
|
+
];
|
|
211
|
+
if (context.framework) {
|
|
212
|
+
lines.push(`> Framework: ${context.framework}`);
|
|
213
|
+
}
|
|
214
|
+
if (context.language) {
|
|
215
|
+
lines.push(`> Language: ${context.language}`);
|
|
216
|
+
}
|
|
217
|
+
if (context.testRunner) {
|
|
218
|
+
lines.push(`> Test Runner: ${context.testRunner}`);
|
|
219
|
+
}
|
|
220
|
+
if (context.database) {
|
|
221
|
+
lines.push(`> Database: ${context.database.type ?? 'detected'}`);
|
|
222
|
+
lines.push(`> DB Connection: ${context.database.connection ?? 'DATABASE_URL'}`);
|
|
223
|
+
lines.push(`> Test Strategy: Transaction rollback (do not modify real data)`);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
lines.push(`> Database: none detected`);
|
|
227
|
+
}
|
|
228
|
+
lines.push(`> Existing Tests: ${context.existingTests ?? 0} found`);
|
|
229
|
+
if (context.coverage) {
|
|
230
|
+
lines.push(`> Current Coverage: ${context.coverage}`);
|
|
231
|
+
}
|
|
232
|
+
if (context.dependencies && context.dependencies.length > 0) {
|
|
233
|
+
lines.push(`> Key Dependencies: ${context.dependencies.join(', ')}`);
|
|
234
|
+
}
|
|
235
|
+
lines.push(`> Target: ${context.target ?? 'http://localhost:3000'}`);
|
|
236
|
+
lines.push('');
|
|
237
|
+
lines.push('> **IMPORTANT**:');
|
|
238
|
+
lines.push('> - Use this detected context. Do not re-detect.');
|
|
239
|
+
lines.push('> - Always read source code before generating tests.');
|
|
240
|
+
lines.push('> - Run tests to verify they work before declaring success.');
|
|
241
|
+
if (context.database) {
|
|
242
|
+
lines.push('> - Use transaction rollback for DB tests - never modify real data.');
|
|
243
|
+
}
|
|
244
|
+
lines.push('');
|
|
245
|
+
lines.push('> **WORKFLOW**:');
|
|
246
|
+
lines.push('> 1. Read ./.daemon/EXECUTE.md for full instructions');
|
|
247
|
+
lines.push('> 2. Generate tests following the detected patterns');
|
|
248
|
+
lines.push('> 3. Run tests via Docker container');
|
|
249
|
+
lines.push('> 4. Fix failures iteratively until all pass');
|
|
250
|
+
lines.push('> 5. Generate final report');
|
|
251
|
+
lines.push('');
|
|
252
|
+
return lines.join('\n');
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Generate fallback prompt
|
|
256
|
+
*/
|
|
257
|
+
generateFallbackPrompt(context) {
|
|
258
|
+
return `# Daemon — Automated Testing Process
|
|
259
|
+
|
|
260
|
+
> **DETECTED CONTEXT**
|
|
261
|
+
> Framework: ${context.framework ?? 'Unknown'}
|
|
262
|
+
> Language: ${context.language ?? 'JavaScript/TypeScript'}
|
|
263
|
+
> Test Runner: ${context.testRunner ?? 'Vitest'}
|
|
264
|
+
> Database: ${context.database?.type ?? 'none'}
|
|
265
|
+
> Target: ${context.target ?? 'http://localhost:3000'}
|
|
266
|
+
|
|
267
|
+
## Instructions
|
|
268
|
+
|
|
269
|
+
This is the automated testing agent. Follow these steps:
|
|
270
|
+
|
|
271
|
+
1. **Read the project structure** - Understand the framework and patterns
|
|
272
|
+
2. **Generate unit tests** - For components, hooks, utilities
|
|
273
|
+
3. **Generate integration tests** - For API routes and database operations
|
|
274
|
+
4. **Generate E2E tests** - For critical user flows
|
|
275
|
+
5. **Run and fix** - Iteratively fix failing tests
|
|
276
|
+
|
|
277
|
+
## Testing Templates
|
|
278
|
+
|
|
279
|
+
### Unit Tests
|
|
280
|
+
\`\`\`typescript
|
|
281
|
+
import { render, screen } from '@testing-library/react';
|
|
282
|
+
import { describe, it, expect } from 'vitest';
|
|
283
|
+
|
|
284
|
+
describe('Component', () => {
|
|
285
|
+
it('should render', () => {
|
|
286
|
+
render(<Component />);
|
|
287
|
+
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
\`\`\`
|
|
291
|
+
|
|
292
|
+
## Fix Loop
|
|
293
|
+
|
|
294
|
+
When tests fail:
|
|
295
|
+
1. Analyze the error
|
|
296
|
+
2. Determine if it's a test issue or code bug
|
|
297
|
+
3. Apply fix
|
|
298
|
+
4. Re-test
|
|
299
|
+
|
|
300
|
+
## Completion
|
|
301
|
+
|
|
302
|
+
Report:
|
|
303
|
+
\`\`\`
|
|
304
|
+
✓ Unit Tests: X created, Y passing
|
|
305
|
+
✓ Integration: X created, Y passing
|
|
306
|
+
✓ E2E: X created, Y passing
|
|
307
|
+
\`\`\`
|
|
308
|
+
`;
|
|
309
|
+
}
|
|
310
|
+
// Helper functions for styling
|
|
311
|
+
cyan(text) {
|
|
312
|
+
return `\x1b[36m${text}\x1b[0m`;
|
|
313
|
+
}
|
|
314
|
+
bold(text) {
|
|
315
|
+
return `\x1b[1m${text}\x1b[0m`;
|
|
316
|
+
}
|
|
62
317
|
/**
|
|
63
318
|
* Parse command line arguments
|
|
64
319
|
*/
|
|
@@ -91,126 +346,5 @@ export class InitCommand {
|
|
|
91
346
|
}
|
|
92
347
|
return options;
|
|
93
348
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Create Daemon configuration
|
|
96
|
-
*/
|
|
97
|
-
async createConfig(options) {
|
|
98
|
-
const configPath = path.join(process.cwd(), 'daemon.config.json');
|
|
99
|
-
if (await fileHelper.exists(configPath) && !options.force) {
|
|
100
|
-
logger.warn('Daemon config already exists. Use --force to overwrite.');
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const config = {
|
|
104
|
-
version: '0.6.3',
|
|
105
|
-
testRunner: 'vitest',
|
|
106
|
-
e2eRunner: 'playwright',
|
|
107
|
-
performanceTool: 'k6',
|
|
108
|
-
generatedAt: new Date().toISOString(),
|
|
109
|
-
};
|
|
110
|
-
await fileHelper.writeJson(configPath, config);
|
|
111
|
-
logger.debug(`Created config: ${configPath}`);
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Copy EXECUTE.md prompt to project
|
|
115
|
-
*/
|
|
116
|
-
async createExecutePrompt() {
|
|
117
|
-
const executePath = path.join(process.cwd(), 'EXECUTE.md');
|
|
118
|
-
// Get the path to the packaged EXECUTE.md
|
|
119
|
-
// When published, it's in the package root
|
|
120
|
-
const packageRoot = path.resolve(__dirname, '../../../..');
|
|
121
|
-
const sourceExecutePath = path.join(packageRoot, 'prompts', 'EXECUTE.md');
|
|
122
|
-
try {
|
|
123
|
-
// Try to read from the package
|
|
124
|
-
const fs = await import('node:fs');
|
|
125
|
-
if (fs.existsSync(sourceExecutePath)) {
|
|
126
|
-
const content = fs.readFileSync(sourceExecutePath, 'utf-8');
|
|
127
|
-
await fileHelper.writeFile(executePath, content);
|
|
128
|
-
logger.success('Created EXECUTE.md - Testing guide for AI agents');
|
|
129
|
-
logger.info('Use this file with Claude Code or other AI agents for automated testing');
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
// Fallback: Create a minimal EXECUTE.md
|
|
133
|
-
const minimalContent = `# Daemon - Testing Instructions
|
|
134
|
-
|
|
135
|
-
This project has been initialized with Daemon testing toolkit.
|
|
136
|
-
|
|
137
|
-
## Quick Start
|
|
138
|
-
|
|
139
|
-
1. Start the Docker container:
|
|
140
|
-
\`\`\`bash
|
|
141
|
-
docker build -t daemon-tools -f Dockerfile.daemon .
|
|
142
|
-
docker run -d --name daemon-tools -v \$(pwd):/app -p 3000:3000 daemon-tools
|
|
143
|
-
\`\`\`
|
|
144
|
-
|
|
145
|
-
2. Run tests:
|
|
146
|
-
\`\`\`bash
|
|
147
|
-
# Unit tests
|
|
148
|
-
docker exec daemon-tools npm test
|
|
149
|
-
|
|
150
|
-
# E2E tests
|
|
151
|
-
docker exec daemon-tools npx playwright test
|
|
152
|
-
|
|
153
|
-
# Performance tests
|
|
154
|
-
docker exec daemon-tools k6 run tests/performance/load.js
|
|
155
|
-
\`\`\`
|
|
156
|
-
|
|
157
|
-
## Full Documentation
|
|
158
|
-
|
|
159
|
-
For complete testing instructions, see:
|
|
160
|
-
https://github.com/Pamacea/daemon
|
|
161
|
-
|
|
162
|
-
Generated by Daemon v${await this.getVersion()}
|
|
163
|
-
`;
|
|
164
|
-
await fileHelper.writeFile(executePath, minimalContent);
|
|
165
|
-
logger.success('Created EXECUTE.md');
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
logger.warn('Could not create EXECUTE.md:', error);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Setup Docker container
|
|
174
|
-
*/
|
|
175
|
-
async setupDocker() {
|
|
176
|
-
const dockerfileSourcePath = path.resolve(__dirname, '../../../bin/Dockerfile');
|
|
177
|
-
const dockerfileDestPath = path.join(process.cwd(), 'Dockerfile.daemon');
|
|
178
|
-
try {
|
|
179
|
-
const fs = await import('node:fs');
|
|
180
|
-
if (fs.existsSync(dockerfileSourcePath)) {
|
|
181
|
-
fs.copyFileSync(dockerfileSourcePath, dockerfileDestPath);
|
|
182
|
-
logger.success('Created Dockerfile.daemon - Docker configuration for testing tools');
|
|
183
|
-
logger.info('To build: docker build -t daemon-tools -f Dockerfile.daemon .');
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
logger.warn('Could not copy Dockerfile:', error);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Get package version
|
|
192
|
-
*/
|
|
193
|
-
async getVersion() {
|
|
194
|
-
try {
|
|
195
|
-
const packagePath = path.resolve(__dirname, '../../../package.json');
|
|
196
|
-
const fs = await import('node:fs');
|
|
197
|
-
const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
|
|
198
|
-
return pkg.version || '0.6.3';
|
|
199
|
-
}
|
|
200
|
-
catch {
|
|
201
|
-
return '0.6.3';
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Create test directories
|
|
206
|
-
*/
|
|
207
|
-
async createDirectories(options) {
|
|
208
|
-
const baseDir = options.output ?? path.join(process.cwd(), 'tests');
|
|
209
|
-
await fileHelper.ensureDir(baseDir);
|
|
210
|
-
await fileHelper.ensureDir(path.join(baseDir, 'unit'));
|
|
211
|
-
await fileHelper.ensureDir(path.join(baseDir, 'integration'));
|
|
212
|
-
await fileHelper.ensureDir(path.join(baseDir, 'e2e'));
|
|
213
|
-
logger.debug(`Created test directories in: ${baseDir}`);
|
|
214
|
-
}
|
|
215
349
|
}
|
|
216
350
|
//# sourceMappingURL=init.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"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"}
|