claude-coder 1.6.2 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,127 +1,125 @@
1
- # Claude Coder
2
-
3
- **中文** | [English](docs/README.en.md)
4
-
5
- 受 [Anthropic: Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents) 启发,Claude Coder 是一个**自主编码 harness**,依托 Claude Agent SDK 的 `query()` 接口,提供项目扫描、任务分解、多 session 编排、自动校验与 git 回滚的能力,支持一句话需求或 `requirements.md` 驱动,兼容所有 Anthropic API 兼容的模型提供商。
6
-
7
- **核心思路**:AI Agent 单次会话上下文有限,大型需求容易丢失进度或产出不可用代码。本工具将 Agent 包装为一个**可靠的、可重试的函数** — harness 管理任务状态、校验每次产出、失败时自动回滚,Agent 只需专注于编码。
8
-
9
- ---
10
-
11
- ## 快速上手
12
-
13
- ```bash
14
- # 前置:安装 Claude Agent SDK
15
- npm install -g @anthropic-ai/claude-agent-sdk
16
-
17
- # 安装
18
- npm install -g claude-coder
19
-
20
- # 配置模型
21
- claude-coder setup
22
-
23
- # 开始自动编码
24
- cd your-project
25
- claude-coder run "实现用户注册和登录功能"
26
- ```
27
-
28
- ## 工作原理
29
-
30
- ```
31
- 需求输入 ─→ 项目扫描 ─→ 任务分解 ─→ 编码循环
32
-
33
- ┌──────┴──────┐
34
- │ Session N │
35
- │ Claude SDK │
36
- │ 6 步流程 │
37
- └──────┬──────┘
38
-
39
- harness 校验
40
-
41
- 通过 → 下一个任务
42
- 失败 → git 回滚 + 重试
43
- ```
44
-
45
- 每个 session 内,Agent 自主执行 6 步:恢复上下文 → 环境检查 → 选任务 → 编码 → 测试 → 收尾(git commit)。
46
-
47
- ## 命令
48
-
49
- | 命令 | 说明 |
50
- |------|------|
51
- | `claude-coder setup` | 交互式模型配置 |
52
- | `claude-coder run [需求]` | 自动编码循环 |
53
- | `claude-coder run --max 1` | 单次执行 |
54
- | `claude-coder run --dry-run` | 预览模式 |
55
- | `claude-coder init` | 初始化项目环境 |
56
- | `claude-coder add "指令"` | 追加任务 |
57
- | `claude-coder add -r [file]` | 从需求文件追加任务 |
58
- | `claude-coder add "..." --model M` | 指定模型追加任务 |
59
- | `claude-coder auth [url]` | 导出 Playwright 登录状态 |
60
- | `claude-coder validate` | 手动校验 |
61
- | `claude-coder status` | 查看进度和成本 |
62
- | `claude-coder config sync` | 同步配置到 ~/.claude/ |
63
- | `claude-coder config mcp <mode>` | 快速切换 Playwright 模式 |
64
-
65
- **选项**:`--max N` 限制 session 数(默认 50),`--pause N` 每 N 个 session 暂停确认(默认不暂停)。
66
-
67
- ## 使用场景
68
-
69
- **新项目**:`claude-coder run "用 Express + React 做 Todo 应用"` — 自动搭建脚手架、分解任务、逐个实现。
70
-
71
- **已有项目**:`claude-coder run "新增头像上传功能"` — 先扫描现有代码和技术栈,再增量开发。
72
-
73
- **需求文档驱动**:在项目根目录创建 `requirements.md`,运行 `claude-coder run` 需求变更后用 `claude-coder add -r` 同步新任务。
74
-
75
- **追加任务**:`claude-coder add "新增管理员后台"` `claude-coder add -r requirements.md` 仅追加到任务列表,下次 run 时执行。
76
-
77
- **自动测试 + 凭证持久化**:`claude-coder auth http://localhost:3000` — 导出浏览器登录态(cookies + localStorage),Agent 测试时自动使用。缺 API Key 时 Agent 会自行记录到 `test.env` 并继续推进,不会停工。详见 [测试凭证持久化方案](docs/PLAYWRIGHT_CREDENTIALS.md)。
78
-
79
- ## 模型支持
80
-
81
- | 提供商 | 说明 |
82
- |--------|------|
83
- | Claude 官方 | 默认,Anthropic 原版 API |
84
- | GLM (智谱/Z.AI) | GLM 4.7 / GLM 5 |
85
- | 阿里云百炼 | qwen3-coder-plus / glm-5 |
86
- | DeepSeek | deepseek-chat / reasoner |
87
- | 自定义 | 任何 Anthropic 兼容 API |
88
-
89
- ## 项目结构
90
-
91
- ```
92
- your-project/
93
- .claude-coder/ # 运行时数据(gitignored)
94
- .env # 模型配置
95
- project_profile.json # 项目扫描结果
96
- tasks.json # 任务列表 + 状态
97
- session_result.json # 上次 session 结果(扁平)
98
- progress.json # 会话历史 + 成本
99
- tests.json # 验证记录
100
- test.env # 测试凭证(API Key 等,可选)
101
- playwright-auth.json # 登录状态快照(isolated 模式,auth 命令生成)
102
- .runtime/ # 临时文件
103
- logs/ # 每 session 独立日志(含工具调用记录)
104
- browser-profile/ # 持久化浏览器 Profile(persistent 模式,auth 命令生成)
105
- requirements.md # 需求文档(可选)
106
- ```
107
-
108
- ## 常见问题
109
-
110
- **"Credit balance is too low"**:运行 `claude-coder setup` 重新配置 API Key。
111
-
112
- **中断恢复**:直接重新运行 `claude-coder run`,会从上次中断处继续。
113
-
114
- **长时间无响应**:模型处理复杂文件时可能出现 10-20 分钟的思考间隔(spinner 会显示红色警告),这是正常行为。超过 30 分钟无工具调用时 Harness 会自动中断并重试。可通过 `.env` `SESSION_STALL_TIMEOUT=秒数` 调整阈值。
115
-
116
- **跳过任务**:将 `.claude-coder/tasks.json` 中该任务的 `status` 改为 `done`。
117
-
118
- **Windows 支持**:完全支持,纯 Node.js 实现。
119
-
120
- ## 文档
121
-
122
- - [技术架构](docs/ARCHITECTURE.md) — 核心设计规则、模块职责、提示语注入架构、注意力机制、Hook 数据流
123
- - [测试凭证持久化方案](docs/PLAYWRIGHT_CREDENTIALS.md) — 自动测试的凭证管理:Playwright 登录态导出、API Key 持久化、Agent 缺凭证时的行为策略
124
-
125
- ## License
126
-
127
- MIT
1
+ # Claude Coder
2
+
3
+ **中文** | [English](docs/README.en.md)
4
+
5
+ 受 [Anthropic: Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents) 启发,Claude Coder 是一个**自主编码 harness**,依托 Claude Agent SDK 的 `query()` 接口,提供项目扫描、任务分解、多 session 编排、自动校验与 git 回滚的能力,支持一句话需求或 `requirements.md` 驱动,兼容所有 Anthropic API 兼容的模型提供商。
6
+
7
+ **核心思路**:AI Agent 单次会话上下文有限,大型需求容易丢失进度或产出不可用代码。本工具将 Agent 包装为一个**可靠的、可重试的函数** — harness 管理任务状态、校验每次产出、失败时自动回滚,Agent 只需专注于编码。
8
+
9
+ ---
10
+
11
+ ## 快速上手
12
+
13
+ ```bash
14
+ # 前置:安装 Claude Agent SDK
15
+ npm install -g @anthropic-ai/claude-agent-sdk
16
+
17
+ # 安装
18
+ npm install -g claude-coder
19
+
20
+ # 配置模型
21
+ claude-coder setup
22
+
23
+ # 开始自动编码
24
+ cd your-project
25
+ claude-coder run "实现用户注册和登录功能"
26
+ ```
27
+
28
+ ## 工作原理
29
+
30
+ ```
31
+ 需求输入 ─→ 项目扫描 ─→ 任务分解 ─→ 编码循环
32
+
33
+ ┌──────┴──────┐
34
+ │ Session N │
35
+ │ Claude SDK │
36
+ │ 6 步流程 │
37
+ └──────┬──────┘
38
+
39
+ harness 校验
40
+
41
+ 通过 → 下一个任务
42
+ 失败 → git 回滚 + 重试
43
+ ```
44
+
45
+ 每个 session 内,Agent 自主执行 6 步:恢复上下文 → 环境检查 → 选任务 → 编码 → 测试 → 收尾(git commit)。
46
+
47
+ ## 命令
48
+
49
+ | 命令 | 说明 |
50
+ |------|------|
51
+ | `claude-coder setup` | 交互式模型配置 |
52
+ | `claude-coder run [需求]` | 自动编码循环 |
53
+ | `claude-coder run --max 1` | 单次执行 |
54
+ | `claude-coder run --dry-run` | 预览模式 |
55
+ | `claude-coder init` | 初始化项目环境 |
56
+ | `claude-coder add "指令"` | 追加任务 |
57
+ | `claude-coder add -r [file]` | 从需求文件追加任务 |
58
+ | `claude-coder add "..." --model M` | 指定模型追加任务 |
59
+ | `claude-coder auth [url]` | 导出 Playwright 登录状态 |
60
+ | `claude-coder validate` | 手动校验 |
61
+ | `claude-coder status` | 查看进度和成本 |
62
+
63
+ **选项**:`--max N` 限制 session 数(默认 50),`--pause N` N 个 session 暂停确认(默认不暂停)。
64
+
65
+ ## 使用场景
66
+
67
+ **新项目**:`claude-coder run "用 Express + React 做 Todo 应用"` — 自动搭建脚手架、分解任务、逐个实现。
68
+
69
+ **已有项目**:`claude-coder run "新增头像上传功能"` — 先扫描现有代码和技术栈,再增量开发。
70
+
71
+ **需求文档驱动**:在项目根目录创建 `requirements.md`,运行 `claude-coder run` — 需求变更后用 `claude-coder add -r` 同步新任务。
72
+
73
+ **追加任务**:`claude-coder add "新增管理员后台"` `claude-coder add -r requirements.md` — 仅追加到任务列表,下次 run 时执行。
74
+
75
+ **自动测试 + 凭证持久化**:`claude-coder auth http://localhost:3000` 导出浏览器登录态(cookies + localStorage),Agent 测试时自动使用。缺 API Key 时 Agent 会自行记录到 `test.env` 并继续推进,不会停工。详见 [测试凭证持久化方案](docs/PLAYWRIGHT_CREDENTIALS.md)。
76
+
77
+ ## 模型支持
78
+
79
+ | 提供商 | 说明 |
80
+ |--------|------|
81
+ | Claude 官方 | 默认,Anthropic 原版 API |
82
+ | GLM (智谱/Z.AI) | GLM 4.7 / GLM 5 |
83
+ | 阿里云百炼 | qwen3-coder-plus / glm-5 |
84
+ | DeepSeek | deepseek-chat / reasoner |
85
+ | 自定义 | 任何 Anthropic 兼容 API |
86
+
87
+ ## 项目结构
88
+
89
+ ```
90
+ your-project/
91
+ .claude-coder/ # 运行时数据(gitignored)
92
+ .env # 模型配置
93
+ project_profile.json # 项目扫描结果
94
+ tasks.json # 任务列表 + 状态
95
+ session_result.json # 上次 session 结果(扁平)
96
+ progress.json # 会话历史 + 成本
97
+ tests.json # 验证记录
98
+ test.env # 测试凭证(API Key 等,可选)
99
+ playwright-auth.json # 登录状态快照(isolated 模式,auth 命令生成)
100
+ .runtime/ # 临时文件
101
+ logs/ # session 独立日志(含工具调用记录)
102
+ browser-profile/ # 持久化浏览器 Profile(persistent 模式,auth 命令生成)
103
+ requirements.md # 需求文档(可选)
104
+ ```
105
+
106
+ ## 常见问题
107
+
108
+ **"Credit balance is too low"**:运行 `claude-coder setup` 重新配置 API Key。
109
+
110
+ **中断恢复**:直接重新运行 `claude-coder run`,会从上次中断处继续。
111
+
112
+ **长时间无响应**:模型处理复杂文件时可能出现 10-20 分钟的思考间隔(spinner 会显示红色警告),这是正常行为。超过 20 分钟无工具调用时 Harness 会自动中断并重试。可通过 `.env` 中 `SESSION_STALL_TIMEOUT=秒数` 调整阈值。
113
+
114
+ **跳过任务**:将 `.claude-coder/tasks.json` 中该任务的 `status` 改为 `done`。
115
+
116
+ **Windows 支持**:完全支持,纯 Node.js 实现。
117
+
118
+ ## 文档
119
+
120
+ - [技术架构](docs/ARCHITECTURE.md) — 核心设计规则、模块职责、提示语注入架构、注意力机制、Hook 数据流
121
+ - [测试凭证持久化方案](docs/PLAYWRIGHT_CREDENTIALS.md) — 自动测试的凭证管理:Playwright 登录态导出、API Key 持久化、Agent 缺凭证时的行为策略
122
+
123
+ ## License
124
+
125
+ MIT
package/bin/cli.js CHANGED
@@ -1,197 +1,161 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- const pkg = require('../package.json');
5
-
6
- const COMMANDS = {
7
- run: { desc: '自动编码循环', usage: 'claude-coder run [需求] [--max N] [--pause N] [--dry-run]' },
8
- setup: { desc: '交互式模型配置', usage: 'claude-coder setup' },
9
- init: { desc: '初始化项目环境', usage: 'claude-coder init' },
10
- add: { desc: '追加任务到 tasks.json', usage: 'claude-coder add "指令" [--model M] | add -r [file]' },
11
- auth: { desc: '导出 Playwright 登录状态', usage: 'claude-coder auth [url]' },
12
- validate: { desc: '手动校验上次 session', usage: 'claude-coder validate' },
13
- status: { desc: '查看任务进度和成本', usage: 'claude-coder status' },
14
- config: { desc: '配置管理', usage: 'claude-coder config sync | config mcp <mode>' },
15
- };
16
-
17
- function showHelp() {
18
- console.log(`\nClaude Coder v${pkg.version}\n`);
19
- console.log('用法: claude-coder <command> [options]\n');
20
- console.log('命令:');
21
- for (const [name, info] of Object.entries(COMMANDS)) {
22
- console.log(` ${name.padEnd(10)} ${info.desc}`);
23
- }
24
- console.log('\n示例:');
25
- console.log(' claude-coder setup 配置模型和 API Key');
26
- console.log(' claude-coder run "实现用户登录" 开始自动编码');
27
- console.log(' claude-coder run --max 1 单次执行');
28
- console.log(' claude-coder run --max 5 --pause 5 每 5 个 session 暂停确认');
29
- console.log(' claude-coder run --dry-run 预览模式');
30
- console.log(' claude-coder add "新增搜索功能" 追加任务');
31
- console.log(' claude-coder add -r 从 requirements.md 追加任务');
32
- console.log(' claude-coder add "..." --model opus-4 指定模型追加任务');
33
- console.log(' claude-coder auth 导出 Playwright 登录状态');
34
- console.log(' claude-coder auth http://localhost:8080 指定登录 URL');
35
- console.log(' claude-coder config mcp persistent 快速切换 Playwright 模式');
36
- console.log(' claude-coder status 查看进度和成本');
37
- console.log(`\n前置条件: npm install -g @anthropic-ai/claude-agent-sdk`);
38
- }
39
-
40
- function parseArgs(argv) {
41
- const args = argv.slice(2);
42
- const command = args[0];
43
- const opts = { max: 50, pause: 0, dryRun: false, readFile: null, model: null };
44
- const positional = [];
45
-
46
- for (let i = 1; i < args.length; i++) {
47
- switch (args[i]) {
48
- case '--max':
49
- opts.max = parseInt(args[++i], 10) || 50;
50
- break;
51
- case '--pause':
52
- opts.pause = parseInt(args[++i], 10) || 5;
53
- break;
54
- case '--dry-run':
55
- opts.dryRun = true;
56
- break;
57
- case '--model':
58
- opts.model = args[++i] || null;
59
- break;
60
- case '-r': {
61
- const next = args[i + 1];
62
- if (next && !next.startsWith('-')) {
63
- opts.readFile = next;
64
- i++;
65
- } else {
66
- opts.readFile = 'requirements.md';
67
- }
68
- break;
69
- }
70
- case '--help':
71
- case '-h':
72
- showHelp();
73
- process.exit(0);
74
- break;
75
- default:
76
- if (!args[i].startsWith('--')) {
77
- positional.push(args[i]);
78
- }
79
- break;
80
- }
81
- }
82
-
83
- return { command, positional, opts };
84
- }
85
-
86
- async function main() {
87
- const { command, positional, opts } = parseArgs(process.argv);
88
-
89
- if (!command || command === '--help' || command === '-h') {
90
- showHelp();
91
- process.exit(0);
92
- }
93
-
94
- if (command === '--version' || command === '-v') {
95
- console.log(pkg.version);
96
- process.exit(0);
97
- }
98
-
99
- switch (command) {
100
- case 'run': {
101
- const runner = require('../src/runner');
102
- await runner.run(positional[0] || null, opts);
103
- break;
104
- }
105
- case 'setup': {
106
- const setup = require('../src/setup');
107
- await setup.setup();
108
- break;
109
- }
110
- case 'init': {
111
- const { init } = require('../src/init');
112
- await init();
113
- break;
114
- }
115
- case 'add': {
116
- const fs = require('fs');
117
- const nodePath = require('path');
118
- let instruction = positional[0] || '';
119
- if (opts.readFile) {
120
- const reqPath = nodePath.resolve(opts.readFile);
121
- if (!fs.existsSync(reqPath)) {
122
- console.error(`文件不存在: ${reqPath}`);
123
- process.exit(1);
124
- }
125
- instruction = fs.readFileSync(reqPath, 'utf8');
126
- console.log(`已读取需求文件: ${opts.readFile}`);
127
- }
128
- if (!instruction) {
129
- console.error('用法: claude-coder add "任务描述" 或 claude-coder add -r [requirements.md]');
130
- process.exit(1);
131
- }
132
- const runner = require('../src/runner');
133
- await runner.add(instruction, opts);
134
- break;
135
- }
136
- case 'auth': {
137
- const { auth } = require('../src/auth');
138
- await auth(positional[0] || null);
139
- break;
140
- }
141
- case 'validate': {
142
- const validator = require('../src/validator');
143
- const result = await validator.validate();
144
- process.exit(result.fatal ? 1 : 0);
145
- break;
146
- }
147
- case 'status': {
148
- const tasks = require('../src/tasks');
149
- tasks.showStatus();
150
- break;
151
- }
152
- case 'config': {
153
- const config = require('../src/config');
154
- if (positional[0] === 'sync') {
155
- config.syncToGlobal();
156
- } else if (positional[0] === 'mcp') {
157
- const validModes = ['persistent', 'isolated', 'extension'];
158
- const mode = positional[1];
159
- if (!mode || !validModes.includes(mode)) {
160
- console.error(`用法: claude-coder config mcp <${validModes.join('|')}>`);
161
- process.exit(1);
162
- }
163
- const ok = config.updateEnvVar('MCP_PLAYWRIGHT_MODE', mode);
164
- if (!ok) {
165
- console.error('未找到配置文件,请先运行 claude-coder setup');
166
- process.exit(1);
167
- }
168
- config.updateEnvVar('MCP_PLAYWRIGHT', 'true');
169
- const { updateMcpConfig } = require('../src/auth');
170
- updateMcpConfig(config.paths(), mode);
171
- const { log } = config;
172
- log('ok', `Playwright 模式已切换为: ${mode}`);
173
- if (mode === 'persistent') {
174
- log('info', '运行 claude-coder auth <URL> 完成首次登录');
175
- } else if (mode === 'isolated') {
176
- log('info', '运行 claude-coder auth <URL> 录制登录状态');
177
- } else {
178
- log('info', '确保已安装 Playwright MCP Bridge 扩展并启动浏览器');
179
- }
180
- } else {
181
- console.error('用法: claude-coder config sync | config mcp <mode>');
182
- process.exit(1);
183
- }
184
- break;
185
- }
186
- default:
187
- console.error(`未知命令: ${command}`);
188
- showHelp();
189
- process.exit(1);
190
- }
191
- }
192
-
193
- main().catch(err => {
194
- console.error(`\n错误: ${err.message}`);
195
- if (process.env.DEBUG) console.error(err.stack);
196
- process.exit(1);
197
- });
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const pkg = require('../package.json');
5
+
6
+ const COMMANDS = {
7
+ run: { desc: '自动编码循环', usage: 'claude-coder run [--max N] [--pause N] [--dry-run]' },
8
+ setup: { desc: '交互式模型配置', usage: 'claude-coder setup' },
9
+ init: { desc: '初始化项目环境', usage: 'claude-coder init' },
10
+ add: { desc: '追加任务并可选自动执行', usage: 'claude-coder add "指令" [--model M] | add -r [file]' },
11
+ auth: { desc: '导出 Playwright 登录状态', usage: 'claude-coder auth [url]' },
12
+ validate: { desc: '手动校验上次 session', usage: 'claude-coder validate' },
13
+ status: { desc: '查看任务进度和成本', usage: 'claude-coder status' },
14
+ };
15
+
16
+ function showHelp() {
17
+ console.log(`\nClaude Coder v${pkg.version}\n`);
18
+ console.log('用法: claude-coder <command> [options]\n');
19
+ console.log('命令:');
20
+ for (const [name, info] of Object.entries(COMMANDS)) {
21
+ console.log(` ${name.padEnd(10)} ${info.desc}`);
22
+ }
23
+ console.log('\n示例:');
24
+ console.log(' claude-coder setup 配置模型和 API Key');
25
+ console.log(' claude-coder add "实现用户登录" 添加任务(询问是否自动执行)');
26
+ console.log(' claude-coder run 执行所有待处理任务');
27
+ console.log(' claude-coder run --max 1 单次执行');
28
+ console.log(' claude-coder run --max 5 --pause 5 每 5 个 session 暂停确认');
29
+ console.log(' claude-coder run --dry-run 预览模式');
30
+ console.log(' claude-coder add -r 从 requirements.md 追加任务');
31
+ console.log(' claude-coder add "..." --model opus-4 指定模型追加任务');
32
+ console.log(' claude-coder auth 导出 Playwright 登录状态');
33
+ console.log(' claude-coder auth http://localhost:8080 指定登录 URL');
34
+ console.log(' claude-coder status 查看进度和成本');
35
+ console.log(`\n前置条件: npm install -g @anthropic-ai/claude-agent-sdk`);
36
+ }
37
+
38
+ function parseArgs(argv) {
39
+ const args = argv.slice(2);
40
+ const command = args[0];
41
+ const opts = { max: 50, pause: 0, dryRun: false, readFile: null, model: null };
42
+ const positional = [];
43
+
44
+ for (let i = 1; i < args.length; i++) {
45
+ switch (args[i]) {
46
+ case '--max':
47
+ opts.max = parseInt(args[++i], 10) || 50;
48
+ break;
49
+ case '--pause':
50
+ { const v = parseInt(args[++i], 10); opts.pause = (v >= 0 && !isNaN(v)) ? v : 5; }
51
+ break;
52
+ case '--dry-run':
53
+ opts.dryRun = true;
54
+ break;
55
+ case '--model':
56
+ opts.model = args[++i] || null;
57
+ break;
58
+ case '-r': {
59
+ const next = args[i + 1];
60
+ if (next && !next.startsWith('-')) {
61
+ opts.readFile = next;
62
+ i++;
63
+ } else {
64
+ opts.readFile = 'requirements.md';
65
+ }
66
+ break;
67
+ }
68
+ case '--help':
69
+ case '-h':
70
+ showHelp();
71
+ process.exit(0);
72
+ break;
73
+ default:
74
+ if (!args[i].startsWith('--')) {
75
+ positional.push(args[i]);
76
+ }
77
+ break;
78
+ }
79
+ }
80
+
81
+ return { command, positional, opts };
82
+ }
83
+
84
+ async function main() {
85
+ const { command, positional, opts } = parseArgs(process.argv);
86
+
87
+ if (!command || command === '--help' || command === '-h') {
88
+ showHelp();
89
+ process.exit(0);
90
+ }
91
+
92
+ if (command === '--version' || command === '-v') {
93
+ console.log(pkg.version);
94
+ process.exit(0);
95
+ }
96
+
97
+ switch (command) {
98
+ case 'run': {
99
+ const runner = require('../src/runner');
100
+ await runner.run(opts);
101
+ break;
102
+ }
103
+ case 'setup': {
104
+ const setup = require('../src/setup');
105
+ await setup.setup();
106
+ break;
107
+ }
108
+ case 'init': {
109
+ const { init } = require('../src/init');
110
+ await init();
111
+ break;
112
+ }
113
+ case 'add': {
114
+ const fs = require('fs');
115
+ const nodePath = require('path');
116
+ let instruction = positional[0] || '';
117
+ if (opts.readFile) {
118
+ const reqPath = nodePath.resolve(opts.readFile);
119
+ if (!fs.existsSync(reqPath)) {
120
+ console.error(`文件不存在: ${reqPath}`);
121
+ process.exit(1);
122
+ }
123
+ instruction = fs.readFileSync(reqPath, 'utf8');
124
+ console.log(`已读取需求文件: ${opts.readFile}`);
125
+ }
126
+ if (!instruction) {
127
+ console.error('用法: claude-coder add "任务描述" 或 claude-coder add -r [requirements.md]');
128
+ process.exit(1);
129
+ }
130
+ const runner = require('../src/runner');
131
+ await runner.add(instruction, opts);
132
+ break;
133
+ }
134
+ case 'auth': {
135
+ const { auth } = require('../src/auth');
136
+ await auth(positional[0] || null);
137
+ break;
138
+ }
139
+ case 'validate': {
140
+ const validator = require('../src/validator');
141
+ const result = await validator.validate();
142
+ process.exit(result.fatal ? 1 : 0);
143
+ break;
144
+ }
145
+ case 'status': {
146
+ const tasks = require('../src/tasks');
147
+ tasks.showStatus();
148
+ break;
149
+ }
150
+ default:
151
+ console.error(`未知命令: ${command}`);
152
+ showHelp();
153
+ process.exit(1);
154
+ }
155
+ }
156
+
157
+ main().catch(err => {
158
+ console.error(`\n错误: ${err.message}`);
159
+ if (process.env.DEBUG) console.error(err.stack);
160
+ process.exit(1);
161
+ });