@jojonax/codex-copilot 1.5.5 → 1.6.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 -21
- package/README.md +144 -44
- package/bin/cli.js +189 -182
- package/package.json +39 -39
- package/src/commands/evolve.js +316 -316
- package/src/commands/fix.js +447 -447
- package/src/commands/init.js +298 -298
- package/src/commands/reset.js +61 -61
- package/src/commands/retry.js +190 -190
- package/src/commands/run.js +958 -958
- package/src/commands/skip.js +62 -62
- package/src/commands/status.js +95 -95
- package/src/commands/usage.js +361 -361
- package/src/utils/automator.js +279 -279
- package/src/utils/checkpoint.js +246 -246
- package/src/utils/detect-prd.js +137 -137
- package/src/utils/git.js +388 -388
- package/src/utils/github.js +486 -486
- package/src/utils/json.js +220 -220
- package/src/utils/logger.js +41 -41
- package/src/utils/prompt.js +49 -49
- package/src/utils/provider.js +770 -769
- package/src/utils/self-heal.js +330 -330
- package/src/utils/shell-bootstrap.js +404 -0
- package/src/utils/update-check.js +103 -103
package/bin/cli.js
CHANGED
|
@@ -1,182 +1,189 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* codex-copilot CLI - PRD → Auto Dev → PR → Review → Fix → Merge
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* codex-copilot init # Initialize project (auto-detect PRD, generate tasks)
|
|
8
|
-
* codex-copilot run # Start automated development loop
|
|
9
|
-
* codex-copilot status # View current progress
|
|
10
|
-
* codex-copilot reset # Reset state (start over)
|
|
11
|
-
* codex-copilot update # Update to latest version
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { resolve, dirname } from 'path';
|
|
15
|
-
import { existsSync, readFileSync } from 'fs';
|
|
16
|
-
import { execSync } from 'child_process';
|
|
17
|
-
import { fileURLToPath } from 'url';
|
|
18
|
-
|
|
19
|
-
import { init } from '../src/commands/init.js';
|
|
20
|
-
import { run } from '../src/commands/run.js';
|
|
21
|
-
import { status } from '../src/commands/status.js';
|
|
22
|
-
import { reset } from '../src/commands/reset.js';
|
|
23
|
-
import { retry } from '../src/commands/retry.js';
|
|
24
|
-
import { skip } from '../src/commands/skip.js';
|
|
25
|
-
import { usage } from '../src/commands/usage.js';
|
|
26
|
-
import { evolve } from '../src/commands/evolve.js';
|
|
27
|
-
import { fix } from '../src/commands/fix.js';
|
|
28
|
-
import { log } from '../src/utils/logger.js';
|
|
29
|
-
import { checkForUpdates } from '../src/utils/update-check.js';
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
console.log('
|
|
43
|
-
console.log(
|
|
44
|
-
console.log(
|
|
45
|
-
console.log('
|
|
46
|
-
console.log('');
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
case '
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
case '--
|
|
147
|
-
case '-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
console.log('
|
|
157
|
-
console.log('
|
|
158
|
-
console.log('
|
|
159
|
-
console.log('
|
|
160
|
-
console.log('
|
|
161
|
-
console.log('
|
|
162
|
-
console.log('');
|
|
163
|
-
console.log('
|
|
164
|
-
console.log('
|
|
165
|
-
console.log('
|
|
166
|
-
console.log('
|
|
167
|
-
console.log('');
|
|
168
|
-
console.log('
|
|
169
|
-
console.log('');
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* codex-copilot CLI - PRD → Auto Dev → PR → Review → Fix → Merge
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* codex-copilot init # Initialize project (auto-detect PRD, generate tasks)
|
|
8
|
+
* codex-copilot run # Start automated development loop
|
|
9
|
+
* codex-copilot status # View current progress
|
|
10
|
+
* codex-copilot reset # Reset state (start over)
|
|
11
|
+
* codex-copilot update # Update to latest version
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { resolve, dirname } from 'path';
|
|
15
|
+
import { existsSync, readFileSync } from 'fs';
|
|
16
|
+
import { execSync } from 'child_process';
|
|
17
|
+
import { fileURLToPath } from 'url';
|
|
18
|
+
|
|
19
|
+
import { init } from '../src/commands/init.js';
|
|
20
|
+
import { run } from '../src/commands/run.js';
|
|
21
|
+
import { status } from '../src/commands/status.js';
|
|
22
|
+
import { reset } from '../src/commands/reset.js';
|
|
23
|
+
import { retry } from '../src/commands/retry.js';
|
|
24
|
+
import { skip } from '../src/commands/skip.js';
|
|
25
|
+
import { usage } from '../src/commands/usage.js';
|
|
26
|
+
import { evolve } from '../src/commands/evolve.js';
|
|
27
|
+
import { fix } from '../src/commands/fix.js';
|
|
28
|
+
import { log } from '../src/utils/logger.js';
|
|
29
|
+
import { checkForUpdates } from '../src/utils/update-check.js';
|
|
30
|
+
import { bootstrapShell } from '../src/utils/shell-bootstrap.js';
|
|
31
|
+
|
|
32
|
+
const command = process.argv[2];
|
|
33
|
+
const projectDir = process.cwd();
|
|
34
|
+
|
|
35
|
+
// Read version from package.json
|
|
36
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
37
|
+
const __dirname = dirname(__filename);
|
|
38
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));
|
|
39
|
+
const version = pkg.version;
|
|
40
|
+
|
|
41
|
+
// Banner
|
|
42
|
+
console.log('');
|
|
43
|
+
console.log(' ╔══════════════════════════════════════════╗');
|
|
44
|
+
console.log(` ║ 🤖 Codex-Copilot v${version.padEnd(18)}║`);
|
|
45
|
+
console.log(' ║ PRD-Driven Auto Development ║');
|
|
46
|
+
console.log(' ╚══════════════════════════════════════════╝');
|
|
47
|
+
console.log('');
|
|
48
|
+
|
|
49
|
+
async function main() {
|
|
50
|
+
// Ensure POSIX shell (sh) is available on Windows
|
|
51
|
+
// Auto-detects Git-for-Windows, adds to PATH, or installs if missing
|
|
52
|
+
if (!(await bootstrapShell())) {
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
switch (command) {
|
|
58
|
+
case 'init':
|
|
59
|
+
await init(projectDir);
|
|
60
|
+
break;
|
|
61
|
+
|
|
62
|
+
case 'run':
|
|
63
|
+
if (!existsSync(resolve(projectDir, '.codex-copilot/tasks.json'))) {
|
|
64
|
+
log.error('Not initialized. Run: codex-copilot init');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
await run(projectDir);
|
|
68
|
+
break;
|
|
69
|
+
|
|
70
|
+
case 'status':
|
|
71
|
+
if (!existsSync(resolve(projectDir, '.codex-copilot/tasks.json'))) {
|
|
72
|
+
log.error('Not initialized. Run: codex-copilot init');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
await status(projectDir);
|
|
76
|
+
process.exit(0);
|
|
77
|
+
break;
|
|
78
|
+
|
|
79
|
+
case 'reset':
|
|
80
|
+
await reset(projectDir);
|
|
81
|
+
process.exit(0);
|
|
82
|
+
break;
|
|
83
|
+
|
|
84
|
+
case 'retry':
|
|
85
|
+
if (!existsSync(resolve(projectDir, '.codex-copilot/tasks.json'))) {
|
|
86
|
+
log.error('Not initialized. Run: codex-copilot init');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
await retry(projectDir);
|
|
90
|
+
process.exit(0);
|
|
91
|
+
break;
|
|
92
|
+
|
|
93
|
+
case 'skip': {
|
|
94
|
+
if (!existsSync(resolve(projectDir, '.codex-copilot/tasks.json'))) {
|
|
95
|
+
log.error('Not initialized. Run: codex-copilot init');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
const skipTaskId = process.argv[3];
|
|
99
|
+
if (!skipTaskId) {
|
|
100
|
+
log.error('Usage: codex-copilot skip <task_id>');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
await skip(projectDir, skipTaskId);
|
|
104
|
+
process.exit(0);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
case 'usage':
|
|
109
|
+
await usage();
|
|
110
|
+
process.exit(0);
|
|
111
|
+
break;
|
|
112
|
+
|
|
113
|
+
case 'fix':
|
|
114
|
+
case 'repair':
|
|
115
|
+
await fix(projectDir);
|
|
116
|
+
process.exit(0);
|
|
117
|
+
break;
|
|
118
|
+
|
|
119
|
+
case 'evolve':
|
|
120
|
+
case 'next':
|
|
121
|
+
if (!existsSync(resolve(projectDir, '.codex-copilot/config.json'))) {
|
|
122
|
+
log.error('Not initialized. Run: codex-copilot init');
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
await evolve(projectDir);
|
|
126
|
+
break;
|
|
127
|
+
|
|
128
|
+
case 'update':
|
|
129
|
+
log.info('Updating to latest version...');
|
|
130
|
+
try {
|
|
131
|
+
execSync('npm install -g @jojonax/codex-copilot@latest --force', {
|
|
132
|
+
encoding: 'utf-8',
|
|
133
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
134
|
+
});
|
|
135
|
+
const newVersion = execSync('npm view @jojonax/codex-copilot version', {
|
|
136
|
+
encoding: 'utf-8',
|
|
137
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
138
|
+
}).trim();
|
|
139
|
+
log.info(`✅ Updated to v${newVersion}`);
|
|
140
|
+
} catch {
|
|
141
|
+
log.error('Update failed. Try manually: npm install -g @jojonax/codex-copilot@latest --force');
|
|
142
|
+
}
|
|
143
|
+
process.exit(0);
|
|
144
|
+
break;
|
|
145
|
+
|
|
146
|
+
case '--version':
|
|
147
|
+
case '-v':
|
|
148
|
+
console.log(`v${version}`);
|
|
149
|
+
process.exit(0);
|
|
150
|
+
break;
|
|
151
|
+
|
|
152
|
+
case 'help':
|
|
153
|
+
case '--help':
|
|
154
|
+
case '-h':
|
|
155
|
+
default:
|
|
156
|
+
console.log(' Usage: codex-copilot <command>');
|
|
157
|
+
console.log('');
|
|
158
|
+
console.log(' Commands:');
|
|
159
|
+
console.log(' init Initialize project (auto-detect PRD, generate task queue)');
|
|
160
|
+
console.log(' run Start automated development loop');
|
|
161
|
+
console.log(' status View current task progress');
|
|
162
|
+
console.log(' reset Reset state and start over');
|
|
163
|
+
console.log(' retry Retry blocked tasks with enhanced prompts');
|
|
164
|
+
console.log(' skip <id> Force-skip a task to unblock dependents');
|
|
165
|
+
console.log(' usage Show AI token usage for recent sessions');
|
|
166
|
+
console.log(' evolve Start next PRD iteration round (gap analysis → plan → run)');
|
|
167
|
+
console.log(' fix Repair corrupted project files');
|
|
168
|
+
console.log(' update Update to latest version');
|
|
169
|
+
console.log('');
|
|
170
|
+
console.log(' Workflow:');
|
|
171
|
+
console.log(' 1. cd into your project directory');
|
|
172
|
+
console.log(' 2. codex-copilot init (auto-detect PRD and decompose tasks)');
|
|
173
|
+
console.log(' 3. codex-copilot run (start automated dev loop)');
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log(' \x1b[36mⓘ This is a help page. Exit and run the commands above directly in your terminal.\x1b[0m');
|
|
176
|
+
console.log('');
|
|
177
|
+
process.exit(0);
|
|
178
|
+
}
|
|
179
|
+
} catch (err) {
|
|
180
|
+
log.error(`Execution failed: ${err.message}`);
|
|
181
|
+
if (process.env.DEBUG) console.error(err);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Check for updates (non-blocking, cached 24h)
|
|
187
|
+
checkForUpdates(version);
|
|
188
|
+
|
|
189
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@jojonax/codex-copilot",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "PRD-driven automated development orchestrator
|
|
5
|
-
"bin": {
|
|
6
|
-
"codex-copilot": "./bin/cli.js"
|
|
7
|
-
},
|
|
8
|
-
"type": "module",
|
|
9
|
-
"files": [
|
|
10
|
-
"bin/",
|
|
11
|
-
"src/",
|
|
12
|
-
"README.md",
|
|
13
|
-
"LICENSE"
|
|
14
|
-
],
|
|
15
|
-
"keywords": [
|
|
16
|
-
"codex",
|
|
17
|
-
"cursor",
|
|
18
|
-
"ai",
|
|
19
|
-
"automation",
|
|
20
|
-
"prd",
|
|
21
|
-
"code-review",
|
|
22
|
-
"github",
|
|
23
|
-
"developer-tools",
|
|
24
|
-
"cli"
|
|
25
|
-
],
|
|
26
|
-
"author": "Jonas Qin",
|
|
27
|
-
"license": "MIT",
|
|
28
|
-
"repository": {
|
|
29
|
-
"type": "git",
|
|
30
|
-
"url": "git+https://github.com/jonasqin/codex-copilot.git"
|
|
31
|
-
},
|
|
32
|
-
"homepage": "https://github.com/jonasqin/codex-copilot#readme",
|
|
33
|
-
"bugs": {
|
|
34
|
-
"url": "https://github.com/jonasqin/codex-copilot/issues"
|
|
35
|
-
},
|
|
36
|
-
"engines": {
|
|
37
|
-
"node": ">=18"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@jojonax/codex-copilot",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"description": "PRD-driven automated development orchestrator — works with any AI coding tool",
|
|
5
|
+
"bin": {
|
|
6
|
+
"codex-copilot": "./bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"src/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"keywords": [
|
|
16
|
+
"codex",
|
|
17
|
+
"cursor",
|
|
18
|
+
"ai",
|
|
19
|
+
"automation",
|
|
20
|
+
"prd",
|
|
21
|
+
"code-review",
|
|
22
|
+
"github",
|
|
23
|
+
"developer-tools",
|
|
24
|
+
"cli"
|
|
25
|
+
],
|
|
26
|
+
"author": "Jonas Qin",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/jonasqin/codex-copilot.git"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://github.com/jonasqin/codex-copilot#readme",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/jonasqin/codex-copilot/issues"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
}
|
|
39
|
+
}
|