@oalacea/daemon 0.6.2 → 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.d.ts.map +1 -1
- package/dist/cli/cli.js +39 -3
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/init.command.d.ts +16 -6
- package/dist/cli/commands/init.command.d.ts.map +1 -1
- package/dist/cli/commands/init.command.js +284 -45
- package/dist/cli/commands/init.command.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AASH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8D;;IASvF;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AASH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8D;;IASvF;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DxC;;OAEG;IACH,OAAO,CAAC,QAAQ;IA+BhB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GAAG,UAAU;CAQf"}
|
package/dist/cli/cli.js
CHANGED
|
@@ -27,10 +27,40 @@ export class DaemonCli {
|
|
|
27
27
|
*/
|
|
28
28
|
async run(argv) {
|
|
29
29
|
const args = argv.slice(2); // Skip node and script path
|
|
30
|
-
if (args.length === 0
|
|
30
|
+
if (args.length === 0) {
|
|
31
|
+
// No command provided - check if daemon is already initialized
|
|
32
|
+
const fs = await import('node:fs');
|
|
33
|
+
const path = await import('node:path');
|
|
34
|
+
const configExists = fs.existsSync(path.join(process.cwd(), 'daemon.config.json'));
|
|
35
|
+
if (!configExists) {
|
|
36
|
+
// Auto-run init for first-time users
|
|
37
|
+
logger.info('Welcome to Daemon! Initializing your project...');
|
|
38
|
+
logger.info('');
|
|
39
|
+
const initCommand = this.commands.get('init');
|
|
40
|
+
if (initCommand) {
|
|
41
|
+
try {
|
|
42
|
+
await initCommand.execute([]);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.error('Initialization failed', error);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Already initialized, show help
|
|
52
|
+
this.showHelp();
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
31
57
|
this.showHelp();
|
|
32
58
|
return;
|
|
33
59
|
}
|
|
60
|
+
if (args[0] === '--version') {
|
|
61
|
+
console.log('v0.6.4');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
34
64
|
const commandName = args[0] ?? '';
|
|
35
65
|
const commandArgs = args.slice(1);
|
|
36
66
|
const command = this.commands.get(commandName);
|
|
@@ -52,13 +82,13 @@ export class DaemonCli {
|
|
|
52
82
|
*/
|
|
53
83
|
showHelp() {
|
|
54
84
|
console.log(`
|
|
55
|
-
Daemon v0.6.
|
|
85
|
+
Daemon v0.6.4 - AI-powered automated testing toolkit
|
|
56
86
|
|
|
57
87
|
USAGE:
|
|
58
88
|
daemon <command> [options]
|
|
59
89
|
|
|
60
90
|
COMMANDS:
|
|
61
|
-
init Initialize project with Daemon
|
|
91
|
+
init Initialize project with Daemon (creates EXECUTE.md + Dockerfile.daemon)
|
|
62
92
|
detect Detect project framework and tools
|
|
63
93
|
test Generate and run tests
|
|
64
94
|
|
|
@@ -71,6 +101,12 @@ EXAMPLES:
|
|
|
71
101
|
daemon detect
|
|
72
102
|
daemon test --coverage
|
|
73
103
|
|
|
104
|
+
GETTING STARTED:
|
|
105
|
+
1. Run "daemon init" to initialize your project
|
|
106
|
+
2. Check EXECUTE.md for AI testing instructions
|
|
107
|
+
3. Build Docker: docker build -t daemon-tools -f Dockerfile.daemon .
|
|
108
|
+
4. Start container: docker run -d --name daemon-tools -v %cd:/app daemon-tools
|
|
109
|
+
|
|
74
110
|
For more information, visit: https://github.com/Pamacea/daemon
|
|
75
111
|
`);
|
|
76
112
|
}
|
package/dist/cli/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAazC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACH,QAAQ,CAA8D;IAEvF;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAA0D,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAc;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;QAExD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAazC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACH,QAAQ,CAA8D;IAEvF;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAA0D,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAc;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;QAExD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,+DAA+D;YAC/D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;YAEnF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,qCAAqC;gBACrC,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;wBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,QAAQ;QACd,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2BX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAIb;QACC,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;SAC9B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -26,16 +26,26 @@ export declare class InitCommand {
|
|
|
26
26
|
*/
|
|
27
27
|
execute(args: string[]): Promise<void>;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
29
|
+
* Run detection and return context
|
|
30
30
|
*/
|
|
31
|
-
private
|
|
31
|
+
private runDetection;
|
|
32
|
+
/**
|
|
33
|
+
* Generate prompt with context
|
|
34
|
+
*/
|
|
35
|
+
private generatePrompt;
|
|
32
36
|
/**
|
|
33
|
-
*
|
|
37
|
+
* Build context block for prompt
|
|
34
38
|
*/
|
|
35
|
-
private
|
|
39
|
+
private buildContextBlock;
|
|
36
40
|
/**
|
|
37
|
-
*
|
|
41
|
+
* Generate fallback prompt
|
|
38
42
|
*/
|
|
39
|
-
private
|
|
43
|
+
private generateFallbackPrompt;
|
|
44
|
+
private cyan;
|
|
45
|
+
private bold;
|
|
46
|
+
/**
|
|
47
|
+
* Parse command line arguments
|
|
48
|
+
*/
|
|
49
|
+
private parseArgs;
|
|
40
50
|
}
|
|
41
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"}
|
|
@@ -6,10 +6,40 @@
|
|
|
6
6
|
* @module cli/commands/init
|
|
7
7
|
*/
|
|
8
8
|
import * as path from 'node:path';
|
|
9
|
+
import * as url from 'node:url';
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
9
12
|
import { createLogger } from '../../shared/utils/logger.js';
|
|
10
|
-
import { fileHelper } from '../../shared/utils/file-helper.js';
|
|
11
13
|
import { FrameworkDetector } from '../../services/detection/framework-detector.js';
|
|
12
14
|
const logger = createLogger('InitCommand');
|
|
15
|
+
// Get __dirname equivalent for ES modules
|
|
16
|
+
const __filename = url.fileURLToPath(import.meta.url);
|
|
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
|
+
}
|
|
13
43
|
/**
|
|
14
44
|
* Initialize command for Daemon
|
|
15
45
|
*/
|
|
@@ -22,29 +52,268 @@ export class InitCommand {
|
|
|
22
52
|
* Execute the init command
|
|
23
53
|
*/
|
|
24
54
|
async execute(args) {
|
|
25
|
-
logger.info('Initializing Daemon...');
|
|
26
55
|
const options = this.parseArgs(args);
|
|
27
56
|
try {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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');
|
|
74
|
+
}
|
|
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})`);
|
|
34
125
|
}
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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:');
|
|
152
|
+
logger.info('');
|
|
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...');
|
|
156
|
+
logger.info('');
|
|
42
157
|
}
|
|
43
158
|
catch (error) {
|
|
44
159
|
logger.error('Failed to initialize Daemon', error);
|
|
45
160
|
throw error;
|
|
46
161
|
}
|
|
47
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
|
+
}
|
|
48
317
|
/**
|
|
49
318
|
* Parse command line arguments
|
|
50
319
|
*/
|
|
@@ -77,35 +346,5 @@ export class InitCommand {
|
|
|
77
346
|
}
|
|
78
347
|
return options;
|
|
79
348
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Create Daemon configuration
|
|
82
|
-
*/
|
|
83
|
-
async createConfig(options) {
|
|
84
|
-
const configPath = path.join(process.cwd(), 'daemon.config.json');
|
|
85
|
-
if (await fileHelper.exists(configPath) && !options.force) {
|
|
86
|
-
logger.warn('Daemon config already exists. Use --force to overwrite.');
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const config = {
|
|
90
|
-
version: '0.6.0',
|
|
91
|
-
testRunner: 'vitest',
|
|
92
|
-
e2eRunner: 'playwright',
|
|
93
|
-
performanceTool: 'k6',
|
|
94
|
-
generatedAt: new Date().toISOString(),
|
|
95
|
-
};
|
|
96
|
-
await fileHelper.writeJson(configPath, config);
|
|
97
|
-
logger.debug(`Created config: ${configPath}`);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Create test directories
|
|
101
|
-
*/
|
|
102
|
-
async createDirectories(options) {
|
|
103
|
-
const baseDir = options.output ?? path.join(process.cwd(), 'tests');
|
|
104
|
-
await fileHelper.ensureDir(baseDir);
|
|
105
|
-
await fileHelper.ensureDir(path.join(baseDir, 'unit'));
|
|
106
|
-
await fileHelper.ensureDir(path.join(baseDir, 'integration'));
|
|
107
|
-
await fileHelper.ensureDir(path.join(baseDir, 'e2e'));
|
|
108
|
-
logger.debug(`Created test directories in: ${baseDir}`);
|
|
109
|
-
}
|
|
110
349
|
}
|
|
111
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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"}
|