claude-coder 1.7.1 → 1.8.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/README.md +177 -125
- package/bin/cli.js +159 -161
- package/package.json +52 -47
- package/src/commands/auth.js +294 -0
- package/src/commands/setup-modules/helpers.js +105 -0
- package/src/commands/setup-modules/index.js +26 -0
- package/src/commands/setup-modules/mcp.js +95 -0
- package/src/commands/setup-modules/provider.js +261 -0
- package/src/commands/setup-modules/safety.js +62 -0
- package/src/commands/setup-modules/simplify.js +53 -0
- package/src/commands/setup.js +172 -0
- package/src/common/assets.js +192 -0
- package/src/{config.js → common/config.js} +138 -201
- package/src/common/constants.js +57 -0
- package/src/{indicator.js → common/indicator.js} +222 -233
- package/src/common/interaction.js +170 -0
- package/src/common/logging.js +77 -0
- package/src/common/sdk.js +51 -0
- package/src/{tasks.js → common/tasks.js} +157 -172
- package/src/common/utils.js +147 -0
- package/src/core/base.js +54 -0
- package/src/core/coding.js +55 -0
- package/src/core/context.js +132 -0
- package/src/core/hooks.js +529 -0
- package/src/{init.js → core/init.js} +163 -144
- package/src/core/plan.js +318 -0
- package/src/core/prompts.js +253 -0
- package/src/core/query.js +48 -0
- package/src/core/repair.js +58 -0
- package/src/{runner.js → core/runner.js} +352 -396
- package/src/core/scan.js +89 -0
- package/src/core/simplify.js +59 -0
- package/src/core/validator.js +138 -0
- package/{prompts/ADD_GUIDE.md → templates/addGuide.md} +98 -98
- package/templates/addUser.md +26 -0
- package/{prompts/CLAUDE.md → templates/agentProtocol.md} +195 -199
- package/templates/bash-process.md +5 -0
- package/{prompts/coding_user.md → templates/codingUser.md} +31 -31
- package/templates/guidance.json +35 -0
- package/templates/playwright.md +17 -0
- package/templates/requirements.example.md +56 -56
- package/{prompts/SCAN_PROTOCOL.md → templates/scanProtocol.md} +118 -118
- package/{prompts/scan_user.md → templates/scanUser.md} +17 -17
- package/templates/test_rule.md +194 -194
- package/prompts/add_user.md +0 -24
- package/src/auth.js +0 -245
- package/src/hooks.js +0 -166
- package/src/prompts.js +0 -295
- package/src/scanner.js +0 -62
- package/src/session.js +0 -354
- package/src/setup.js +0 -579
- package/src/validator.js +0 -181
package/README.md
CHANGED
|
@@ -1,125 +1,177 @@
|
|
|
1
|
-
# Claude Coder
|
|
2
|
-
|
|
3
|
-
**中文** | [English](docs/README.en.md)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
#
|
|
21
|
-
claude-
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
|
50
|
-
|
|
51
|
-
| `claude-coder
|
|
52
|
-
| `claude-coder
|
|
53
|
-
| `claude-coder
|
|
54
|
-
| `claude-coder
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
1
|
+
# Claude Coder
|
|
2
|
+
|
|
3
|
+
**中文** | [English](docs/README.en.md)
|
|
4
|
+
|
|
5
|
+
一个**长时间自运行的自主编码 Agent Harness**:基于 Claude Agent SDK,通过 Hook 提示注入引导模型行为,倒计时活跃度监控保障稳定运行,多 session 编排实现一句话需求到完整项目的全自动交付。
|
|
6
|
+
|
|
7
|
+
### 亮点
|
|
8
|
+
|
|
9
|
+
- **自动编码**:多 session 编排 + 倒计时活跃度监控 + git 回滚重试,Agent 可持续编码数小时不中断([守护机制](design/session-guard.md))
|
|
10
|
+
- **自动审查**:定期自动运行代码审查(simplify),注入当前任务上下文,确保代码质量和任务对齐
|
|
11
|
+
- **自动维护**:tasks.json 里程碑归档保持文件精简;文件损坏时 AI 自动修复,无需人工干预
|
|
12
|
+
- **Hook 提示注入**:通过 JSON 配置在工具调用时向模型注入上下文引导,零代码修改即可扩展规则([机制详解](design/hook-mechanism.md))
|
|
13
|
+
- **配置驱动**:支持 Claude 官方、Coding Plan 多模型路由、DeepSeek 等任意 Anthropic 兼容 API
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 快速上手
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 前置:安装 Claude Agent SDK
|
|
21
|
+
npm install -g @anthropic-ai/claude-agent-sdk
|
|
22
|
+
|
|
23
|
+
# 安装
|
|
24
|
+
npm install -g claude-coder
|
|
25
|
+
|
|
26
|
+
# 配置模型
|
|
27
|
+
claude-coder setup
|
|
28
|
+
|
|
29
|
+
# 进入项目目录
|
|
30
|
+
cd your-project
|
|
31
|
+
|
|
32
|
+
# 初始化项目(扫描技术栈、生成 profile)
|
|
33
|
+
claude-coder init
|
|
34
|
+
|
|
35
|
+
# 开始自动编码
|
|
36
|
+
claude-coder run "实现用户注册和登录功能"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 命令列表
|
|
40
|
+
|
|
41
|
+
| 命令 | 说明 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| `claude-coder setup` | 交互式配置(模型、MCP、安全限制、自动审查) |
|
|
44
|
+
| `claude-coder init` | 初始化项目环境(扫描技术栈、生成 profile) |
|
|
45
|
+
| `claude-coder plan "需求"` | 生成计划方案 |
|
|
46
|
+
| `claude-coder plan -r [file]` | 从需求文件生成计划 |
|
|
47
|
+
| `claude-coder plan --planOnly` | 仅生成计划文档,不分解任务 |
|
|
48
|
+
| `claude-coder plan -i "需求"` | 交互模式,允许模型提问 |
|
|
49
|
+
| `claude-coder run [需求]` | 自动编码循环 |
|
|
50
|
+
| `claude-coder run --max 1` | 单次执行 |
|
|
51
|
+
| `claude-coder run --dry-run` | 预览模式(查看任务队列) |
|
|
52
|
+
| `claude-coder simplify [focus]` | 代码审查和简化 |
|
|
53
|
+
| `claude-coder auth [url]` | 导出 Playwright 登录状态(session cookie 自动持久化) |
|
|
54
|
+
| `claude-coder status` | 查看进度和成本 |
|
|
55
|
+
|
|
56
|
+
**选项**:`--max N` 限制 session 数(默认 50),`--pause N` 每 N 个 session 暂停确认,`--model M` 指定模型。
|
|
57
|
+
|
|
58
|
+
## 工作原理
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
需求输入 ─→ 项目扫描 ─→ 任务分解 ─→ 编码循环
|
|
62
|
+
│
|
|
63
|
+
┌──────┴──────┐
|
|
64
|
+
│ Session N │
|
|
65
|
+
│ Claude SDK │
|
|
66
|
+
│ 6 步流程 │
|
|
67
|
+
└──────┬──────┘
|
|
68
|
+
│
|
|
69
|
+
harness 校验
|
|
70
|
+
│
|
|
71
|
+
通过 ─┬→ 下一个任务
|
|
72
|
+
│
|
|
73
|
+
(定期) 自动审查 simplify
|
|
74
|
+
(自动) 里程碑归档
|
|
75
|
+
│
|
|
76
|
+
失败 → git 回滚 + 重试
|
|
77
|
+
JSON 损坏 → AI 自动修复
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
每个 session 内,Agent 自主执行 6 步:恢复上下文 → 环境检查 → 选任务 → 编码 → 测试 → 收尾(git commit)。
|
|
81
|
+
|
|
82
|
+
Harness 在循环间自动维护:
|
|
83
|
+
- **自动审查**:每 N 个 session 运行 simplify,审查最近代码变更并注入当前任务上下文
|
|
84
|
+
- **里程碑归档**:完成任务自动归档到 `completed_milestones`,保持 tasks.json 精简
|
|
85
|
+
- **AI 修复**:tasks.json 等关键文件损坏时,自动启动 AI session 修复
|
|
86
|
+
|
|
87
|
+
## 机制文档
|
|
88
|
+
|
|
89
|
+
| 文档 | 说明 |
|
|
90
|
+
|------|------|
|
|
91
|
+
| [Hook 注入机制](design/hook-mechanism.md) | SDK Hook 调研、GuidanceInjector 三级匹配、配置格式、副作用评估 |
|
|
92
|
+
| [Session 守护机制](design/session-guard.md) | 中断策略、倒计时活跃度检测、工具运行状态追踪、防刷屏 |
|
|
93
|
+
| [技术架构](design/ARCHITECTURE.md) | 核心设计规则、模块职责、提示语注入架构 |
|
|
94
|
+
| [测试凭证方案](docs/PLAYWRIGHT_CREDENTIALS.md) | Playwright 登录态导出、API Key 持久化 |
|
|
95
|
+
| [SDK 使用指南](docs/CLAUDE_AGENT_SDK_GUIDE.md) | Claude Agent SDK 接口参考 |
|
|
96
|
+
|
|
97
|
+
## 使用场景
|
|
98
|
+
|
|
99
|
+
**新项目**:`claude-coder run "用 Express + React 做 Todo 应用"` — 自动搭建脚手架、分解任务、逐个实现。
|
|
100
|
+
|
|
101
|
+
**已有项目**:`claude-coder run "新增头像上传功能"` — 先扫描现有代码和技术栈,再增量开发。
|
|
102
|
+
|
|
103
|
+
**需求文档驱动**:`claude-coder plan -r requirements.md` 从需求文件生成计划并分解任务,再运行 `claude-coder run` 自动执行。
|
|
104
|
+
|
|
105
|
+
**自动测试 + 登录态持久化**:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# 首次登录:浏览器打开 → 手动登录 → 关闭浏览器
|
|
109
|
+
claude-coder auth http://localhost:9991
|
|
110
|
+
|
|
111
|
+
# 验证登录态:再次运行,浏览器应直接进入已登录状态
|
|
112
|
+
claude-coder auth http://localhost:9991
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Session cookie 自动转为持久化(30 天有效),Agent 测试时通过 Playwright MCP 自动复用。详见 [测试凭证方案](docs/PLAYWRIGHT_CREDENTIALS.md)。
|
|
116
|
+
|
|
117
|
+
## 模型支持
|
|
118
|
+
|
|
119
|
+
| 提供商 | 说明 |
|
|
120
|
+
|--------|------|
|
|
121
|
+
| 默认 | Claude 官方模型,使用系统登录态 |
|
|
122
|
+
| Coding Plan | 自建 API,推荐的多模型路由配置 |
|
|
123
|
+
| API | DeepSeek 或其他 Anthropic 兼容 API |
|
|
124
|
+
|
|
125
|
+
## 建议配置
|
|
126
|
+
|
|
127
|
+
### 长时间自运行 Agent(最稳)
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL=glm-5
|
|
131
|
+
ANTHROPIC_DEFAULT_SONNET_MODEL=qwen3-coder-next
|
|
132
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL=qwen3-coder-plus
|
|
133
|
+
ANTHROPIC_MODEL=kimi-k2.5
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 自用 Claude Code(最强)
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL=qwen3-max-2026-01-23
|
|
140
|
+
ANTHROPIC_DEFAULT_SONNET_MODEL=qwen3-coder-next
|
|
141
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL=qwen3-coder-plus
|
|
142
|
+
ANTHROPIC_MODEL=glm-5
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 项目结构
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
your-project/
|
|
149
|
+
.claude-coder/ # 运行时数据(gitignored)
|
|
150
|
+
.env # 模型配置
|
|
151
|
+
project_profile.json # 项目扫描结果
|
|
152
|
+
tasks.json # 任务列表 + 状态
|
|
153
|
+
session_result.json # 上次 session 结果
|
|
154
|
+
progress.json # 会话历史 + 成本
|
|
155
|
+
tests.json # 验证记录
|
|
156
|
+
test.env # 测试凭证(Agent 按需创建)
|
|
157
|
+
.runtime/
|
|
158
|
+
logs/ # 每 session 独立日志
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## 常见问题
|
|
162
|
+
|
|
163
|
+
**"Credit balance is too low"**:运行 `claude-coder setup` 重新配置 API Key。
|
|
164
|
+
|
|
165
|
+
**中断恢复**:直接重新运行 `claude-coder run`,从上次中断处继续。
|
|
166
|
+
|
|
167
|
+
**长时间无响应**:模型处理复杂任务时可能出现长思考间隔(indicator 显示黄色"工具执行中"或红色"无响应"),这是正常行为。超过阈值后 harness 自动中断并重试。通过 `claude-coder setup` 的安全限制配置或 `.env` 中 `SESSION_STALL_TIMEOUT=秒数` 调整。
|
|
168
|
+
|
|
169
|
+
**跳过任务**:将 `.claude-coder/tasks.json` 中该任务的 `status` 改为 `done`。
|
|
170
|
+
|
|
171
|
+
## 参考文章
|
|
172
|
+
|
|
173
|
+
[Anthropic: Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)
|
|
174
|
+
|
|
175
|
+
## License
|
|
176
|
+
|
|
177
|
+
MIT
|
package/bin/cli.js
CHANGED
|
@@ -1,161 +1,159 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
const pkg = require('../package.json');
|
|
5
|
-
|
|
6
|
-
const COMMANDS = {
|
|
7
|
-
run:
|
|
8
|
-
setup:
|
|
9
|
-
init:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
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
|
|
26
|
-
console.log(' claude-coder
|
|
27
|
-
console.log(' claude-coder
|
|
28
|
-
console.log(' claude-coder
|
|
29
|
-
console.log(' claude-coder run
|
|
30
|
-
console.log(' claude-coder
|
|
31
|
-
console.log(' claude-coder
|
|
32
|
-
console.log(' claude-coder
|
|
33
|
-
console.log(' claude-coder
|
|
34
|
-
console.log(' claude-coder
|
|
35
|
-
console.log(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
case '--
|
|
50
|
-
|
|
51
|
-
break;
|
|
52
|
-
case '--
|
|
53
|
-
opts.
|
|
54
|
-
break;
|
|
55
|
-
case '--
|
|
56
|
-
opts.
|
|
57
|
-
break;
|
|
58
|
-
case '
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
break;
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
process.exit(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
|
+
plan: { desc: '生成计划方案', usage: 'claude-coder plan "需求" | plan -r requirements.md [--planOnly] [-i]' },
|
|
11
|
+
simplify: { desc: '代码审查和简化', usage: 'claude-coder simplify [focus]' },
|
|
12
|
+
auth: { desc: '导出 Playwright 登录状态', usage: 'claude-coder auth [url]' },
|
|
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 plan "实现用户登录" 生成计划方案');
|
|
26
|
+
console.log(' claude-coder plan -r requirements.md 从文件读取需求');
|
|
27
|
+
console.log(' claude-coder plan --planOnly 仅生成计划文档');
|
|
28
|
+
console.log(' claude-coder plan -i "优化系统" 交互模式,允许模型提问');
|
|
29
|
+
console.log(' claude-coder run 执行所有待处理任务');
|
|
30
|
+
console.log(' claude-coder run --max 1 单次执行');
|
|
31
|
+
console.log(' claude-coder run --max 5 --pause 5 每 5 个 session 暂停确认');
|
|
32
|
+
console.log(' claude-coder run --dry-run 预览模式');
|
|
33
|
+
console.log(' claude-coder simplify 代码审查和简化');
|
|
34
|
+
console.log(' claude-coder simplify "内存效率" 聚焦特定领域审查');
|
|
35
|
+
console.log(' claude-coder auth 导出 Playwright 登录状态');
|
|
36
|
+
console.log(' claude-coder auth http://localhost:8080 指定登录 URL');
|
|
37
|
+
console.log(' claude-coder status 查看进度和成本');
|
|
38
|
+
console.log(`\n前置条件: npm install -g @anthropic-ai/claude-agent-sdk`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function parseArgs(argv) {
|
|
42
|
+
const args = argv.slice(2);
|
|
43
|
+
const command = args[0];
|
|
44
|
+
const opts = { max: 50, pause: 0, dryRun: false, readFile: null, model: null, n: 3, planOnly: false, interactive: false };
|
|
45
|
+
const positional = [];
|
|
46
|
+
|
|
47
|
+
for (let i = 1; i < args.length; i++) {
|
|
48
|
+
switch (args[i]) {
|
|
49
|
+
case '--max':
|
|
50
|
+
opts.max = parseInt(args[++i], 10) || 50;
|
|
51
|
+
break;
|
|
52
|
+
case '--pause':
|
|
53
|
+
{ const v = parseInt(args[++i], 10); opts.pause = (v >= 0 && !isNaN(v)) ? v : 5; }
|
|
54
|
+
break;
|
|
55
|
+
case '--dry-run':
|
|
56
|
+
opts.dryRun = true;
|
|
57
|
+
break;
|
|
58
|
+
case '--model':
|
|
59
|
+
opts.model = args[++i] || null;
|
|
60
|
+
break;
|
|
61
|
+
case '-n':
|
|
62
|
+
case '--n':
|
|
63
|
+
opts.n = parseInt(args[++i], 10) || 3;
|
|
64
|
+
break;
|
|
65
|
+
case '-r': {
|
|
66
|
+
const next = args[i + 1];
|
|
67
|
+
if (next && !next.startsWith('-')) {
|
|
68
|
+
opts.readFile = next;
|
|
69
|
+
i++;
|
|
70
|
+
} else {
|
|
71
|
+
opts.readFile = 'requirements.md';
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case '--planOnly':
|
|
76
|
+
opts.planOnly = true;
|
|
77
|
+
break;
|
|
78
|
+
case '-i':
|
|
79
|
+
case '--interactive':
|
|
80
|
+
opts.interactive = true;
|
|
81
|
+
break;
|
|
82
|
+
case '--help':
|
|
83
|
+
case '-h':
|
|
84
|
+
showHelp();
|
|
85
|
+
process.exit(0);
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
if (!args[i].startsWith('--')) {
|
|
89
|
+
positional.push(args[i]);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return { command, positional, opts };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function main() {
|
|
99
|
+
const { command, positional, opts } = parseArgs(process.argv);
|
|
100
|
+
|
|
101
|
+
if (!command || command === '--help' || command === '-h') {
|
|
102
|
+
showHelp();
|
|
103
|
+
process.exit(0);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (command === '--version' || command === '-v') {
|
|
107
|
+
console.log(pkg.version);
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
switch (command) {
|
|
112
|
+
case 'run': {
|
|
113
|
+
const runner = require('../src/core/runner');
|
|
114
|
+
await runner.run(opts);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'setup': {
|
|
118
|
+
const setup = require('../src/commands/setup');
|
|
119
|
+
await setup.setup();
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case 'init': {
|
|
123
|
+
const { init } = require('../src/core/init');
|
|
124
|
+
await init();
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
case 'plan': {
|
|
128
|
+
const { run: planRun } = require('../src/core/plan');
|
|
129
|
+
const input = positional[0] || '';
|
|
130
|
+
await planRun(input, opts);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
case 'simplify': {
|
|
134
|
+
const { simplify } = require('../src/core/simplify');
|
|
135
|
+
await simplify(positional[0] || null, { n: opts.n });
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case 'auth': {
|
|
139
|
+
const { auth } = require('../src/commands/auth');
|
|
140
|
+
await auth(positional[0] || null);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 'status': {
|
|
144
|
+
const tasks = require('../src/common/tasks');
|
|
145
|
+
tasks.showStatus();
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
default:
|
|
149
|
+
console.error(`未知命令: ${command}`);
|
|
150
|
+
showHelp();
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
main().catch(err => {
|
|
156
|
+
console.error(`\n错误: ${err.message}`);
|
|
157
|
+
if (process.env.DEBUG) console.error(err.stack);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
});
|