claude-coder 1.8.3 → 1.9.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 +59 -12
- package/bin/cli.js +20 -37
- package/package.json +4 -1
- package/recipes/_shared/roles/developer.md +11 -0
- package/recipes/_shared/roles/product.md +12 -0
- package/recipes/_shared/roles/tester.md +12 -0
- package/recipes/_shared/test/report-format.md +86 -0
- package/recipes/backend/base.md +27 -0
- package/recipes/backend/components/auth.md +18 -0
- package/recipes/backend/components/crud-api.md +18 -0
- package/recipes/backend/components/file-service.md +15 -0
- package/recipes/backend/manifest.json +20 -0
- package/recipes/backend/test/api-test.md +25 -0
- package/recipes/console/base.md +37 -0
- package/recipes/console/components/modal-form.md +20 -0
- package/recipes/console/components/pagination.md +17 -0
- package/recipes/console/components/search.md +17 -0
- package/recipes/console/components/table-list.md +18 -0
- package/recipes/console/components/tabs.md +14 -0
- package/recipes/console/components/tree.md +15 -0
- package/recipes/console/components/upload.md +15 -0
- package/recipes/console/manifest.json +24 -0
- package/recipes/console/test/crud-e2e.md +47 -0
- package/recipes/h5/base.md +26 -0
- package/recipes/h5/components/animation.md +11 -0
- package/recipes/h5/components/countdown.md +11 -0
- package/recipes/h5/components/share.md +11 -0
- package/recipes/h5/components/swiper.md +11 -0
- package/recipes/h5/manifest.json +21 -0
- package/recipes/h5/test/h5-e2e.md +20 -0
- package/src/commands/auth.js +87 -15
- package/src/commands/setup-modules/helpers.js +4 -3
- package/src/commands/setup-modules/mcp.js +44 -24
- package/src/commands/setup-modules/safety.js +1 -15
- package/src/commands/setup.js +8 -8
- package/src/common/assets.js +10 -1
- package/src/common/config.js +2 -2
- package/src/common/indicator.js +158 -120
- package/src/common/utils.js +60 -8
- package/src/core/coding.js +16 -38
- package/src/core/go.js +31 -77
- package/src/core/hooks.js +56 -89
- package/src/core/init.js +94 -100
- package/src/core/plan.js +85 -223
- package/src/core/prompts.js +36 -16
- package/src/core/repair.js +7 -17
- package/src/core/runner.js +306 -43
- package/src/core/scan.js +38 -34
- package/src/core/session.js +253 -39
- package/src/core/simplify.js +45 -24
- package/src/core/state.js +105 -0
- package/src/index.js +76 -0
- package/templates/codingSystem.md +2 -2
- package/templates/codingUser.md +1 -1
- package/templates/guidance.json +22 -3
- package/templates/planSystem.md +2 -2
- package/templates/scanSystem.md +3 -3
- package/templates/scanUser.md +1 -1
- package/templates/web-testing.md +17 -0
- package/types/index.d.ts +217 -0
- package/src/core/context.js +0 -117
- package/src/core/harness.js +0 -484
- package/src/core/query.js +0 -50
- package/templates/playwright.md +0 -17
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
### 亮点
|
|
8
8
|
|
|
9
|
-
- **
|
|
9
|
+
- **Session 生命周期管理**:Session 类封装 SDK 管理、query 执行、hooks、indicator 全生命周期,runner 编排循环含 AI 驱动的 JSON 自愈修复
|
|
10
10
|
- **Hook 提示注入**:通过 JSON 配置在工具调用时向模型注入上下文引导,零代码修改即可扩展规则([机制详解](design/hook-mechanism.md))
|
|
11
11
|
- **长时间自循环编码**:多 session 编排 + 倒计时活跃度监控 + git 回滚重试,Agent 可持续编码数小时不中断([守护机制](design/session-guard.md))
|
|
12
12
|
- **配置驱动**:支持 Claude 官方、Coding Plan 多模型路由、DeepSeek 等任意 Anthropic 兼容 API
|
|
@@ -41,6 +41,7 @@ claude-coder run "实现用户注册和登录功能"
|
|
|
41
41
|
|------|------|
|
|
42
42
|
| `claude-coder setup` | 交互式配置(模型、MCP、安全限制、自动审查) |
|
|
43
43
|
| `claude-coder init` | 初始化项目环境(扫描技术栈、生成 profile) |
|
|
44
|
+
| `claude-coder init --deploy-templates` | 部署模板和食谱到项目目录(可自定义) |
|
|
44
45
|
| `claude-coder plan "需求"` | 生成计划方案 |
|
|
45
46
|
| `claude-coder plan -r [file]` | 从需求文件生成计划 |
|
|
46
47
|
| `claude-coder plan --planOnly` | 仅生成计划文档,不分解任务 |
|
|
@@ -52,7 +53,7 @@ claude-coder run "实现用户注册和登录功能"
|
|
|
52
53
|
| `claude-coder run --max 1` | 单次执行 |
|
|
53
54
|
| `claude-coder run --dry-run` | 预览模式(查看任务队列) |
|
|
54
55
|
| `claude-coder simplify [focus]` | 代码审查和简化 |
|
|
55
|
-
| `claude-coder auth [url]` |
|
|
56
|
+
| `claude-coder auth [url]` | 配置浏览器测试工具 / 导出登录状态 |
|
|
56
57
|
| `claude-coder status` | 查看进度和成本 |
|
|
57
58
|
|
|
58
59
|
**选项**:`--max N` 限制 session 数(默认 50),`--pause N` 每 N 个 session 暂停确认,`--model M` 指定模型。
|
|
@@ -68,26 +69,26 @@ claude-coder run "实现用户注册和登录功能"
|
|
|
68
69
|
│ 3 步流程 │
|
|
69
70
|
└──────┬──────┘
|
|
70
71
|
│
|
|
71
|
-
|
|
72
|
+
runner 校验
|
|
72
73
|
(含 AI 自愈)
|
|
73
74
|
│
|
|
74
75
|
通过 → simplify? → push → 下一个任务
|
|
75
76
|
失败 → git 回滚 + 重试
|
|
76
77
|
```
|
|
77
78
|
|
|
78
|
-
每个 session 内,Agent 自主执行 3 步:**实现**(任务上下文由
|
|
79
|
+
每个 session 内,Agent 自主执行 3 步:**实现**(任务上下文由 prompt 注入,编码实现) → **验证**(按 category 选最轻量测试) → **收尾**(git commit + 写 session_result.json)。
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
Runner 在 session 结束后自动校验 `session_result.json` + git 进度。校验失败时 AI 自动尝试修复损坏的 JSON 文件(`repair.js`),仍失败则回滚代码并重试。
|
|
81
82
|
|
|
82
83
|
## 机制文档
|
|
83
84
|
|
|
84
85
|
| 文档 | 说明 |
|
|
85
86
|
|------|------|
|
|
86
|
-
| [技术架构](design/ARCHITECTURE.md) | 核心设计规则、
|
|
87
|
+
| [技术架构](design/ARCHITECTURE.md) | 核心设计规则、Session 类职责、模块关系、Prompt 注入架构 |
|
|
87
88
|
| [Hook 注入机制](design/hook-mechanism.md) | SDK Hook 调研、GuidanceInjector 三级匹配、配置格式、副作用评估 |
|
|
88
89
|
| [Session 守护机制](design/session-guard.md) | 中断策略、倒计时活跃度检测、工具运行状态追踪、防刷屏 |
|
|
89
90
|
| [Go 指令流程](design/go-flow.md) | AI 驱动的需求组装、食谱系统、与 plan 衔接 |
|
|
90
|
-
| [
|
|
91
|
+
| [浏览器测试工具](docs/PLAYWRIGHT_CREDENTIALS.md) | Playwright MCP / Chrome DevTools MCP 对比、安装、凭证管理 |
|
|
91
92
|
| [SDK 使用指南](docs/CLAUDE_AGENT_SDK_GUIDE.md) | Claude Agent SDK 接口参考 |
|
|
92
93
|
|
|
93
94
|
## 使用场景
|
|
@@ -96,11 +97,57 @@ Harness 在 session 结束后自动校验 `session_result.json` + git 进度。
|
|
|
96
97
|
|
|
97
98
|
**已有项目**:`claude-coder run "新增头像上传功能"` — 先扫描现有代码和技术栈,再增量开发。
|
|
98
99
|
|
|
99
|
-
**需求文档驱动**:在项目根目录创建 `requirements.md`,运行 `claude-coder
|
|
100
|
+
**需求文档驱动**:在项目根目录创建 `requirements.md`,运行 `claude-coder plan -r requirements.md` 分解任务后 `claude-coder run` 执行。
|
|
100
101
|
|
|
101
102
|
**AI 驱动需求组装**:`claude-coder go "用户管理页面"` — AI 扫描内置食谱库,自动组装完整需求方案,一键进入 plan 分解任务。支持对话模式 (`go`) 逐步引导非技术人员。
|
|
102
103
|
|
|
103
|
-
**自动测试 + 凭证持久化**:`claude-coder auth http://localhost:3000` — 导出浏览器登录态,Agent 测试时自动使用。详见 [
|
|
104
|
+
**自动测试 + 凭证持久化**:`claude-coder auth http://localhost:3000` — 导出浏览器登录态,Agent 测试时自动使用。详见 [浏览器测试工具指南](docs/PLAYWRIGHT_CREDENTIALS.md)。
|
|
105
|
+
|
|
106
|
+
## 浏览器测试工具
|
|
107
|
+
|
|
108
|
+
支持两种 MCP 浏览器测试工具,通过 `WEB_TEST_TOOL` 环境变量切换:
|
|
109
|
+
|
|
110
|
+
| 维度 | Playwright MCP | Chrome DevTools MCP |
|
|
111
|
+
|------|---------------|---------------------|
|
|
112
|
+
| **维护方** | 微软 | Google |
|
|
113
|
+
| **核心优势** | 25+ 自动化工具,多实例并行 | 连接已打开 Chrome,调试能力强 |
|
|
114
|
+
| **多实例** | 支持 | 不支持(单实例,多开请用 Playwright) |
|
|
115
|
+
| **安装依赖** | `npx playwright install chromium` | Node.js v20.19+ / Chrome 144+ |
|
|
116
|
+
| **凭证方案** | persistent 模式复用登录态 | 直接复用已打开 Chrome 的登录态 |
|
|
117
|
+
| **适合场景** | CI/CD、多并行测试、需要 Chromium 隔离 | 本地开发、调试、利用已有 Chrome 环境 |
|
|
118
|
+
|
|
119
|
+
### 安装步骤
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Playwright MCP(推荐)
|
|
123
|
+
claude-coder setup # → 选择「Playwright MCP」→ 选择模式
|
|
124
|
+
npx playwright install chromium
|
|
125
|
+
claude-coder auth http://your-app.com # 导出登录态
|
|
126
|
+
|
|
127
|
+
# Chrome DevTools MCP(需 Node.js v20.19+)
|
|
128
|
+
claude-coder setup # → 选择「Chrome DevTools MCP」
|
|
129
|
+
# 打开 Chrome → chrome://inspect/#remote-debugging → 启用远程调试
|
|
130
|
+
claude-coder auth # 配置 .mcp.json
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 常见问题
|
|
134
|
+
|
|
135
|
+
**Q: Playwright 和 Chrome DevTools 该选哪个?**
|
|
136
|
+
A: 如果你需要多实例并行测试或 CI/CD 集成,选 Playwright MCP。如果你只需要本地调试、想复用已打开 Chrome 的登录态和扩展,选 Chrome DevTools MCP。
|
|
137
|
+
|
|
138
|
+
**Q: Chrome DevTools MCP 报 `chrome-devtools-mcp` 安装失败?**
|
|
139
|
+
A: 确保 Node.js ≥ v20.19。nvm 用户执行 `nvm alias default 22 && nvm use 22`,然后重新安装 `npm install -g @anthropic-ai/claude-code`。
|
|
140
|
+
|
|
141
|
+
**Q: Playwright 浏览器启动后白屏或超时?**
|
|
142
|
+
A: 运行 `npx playwright install chromium` 确保浏览器已安装。persistent 模式下检查 `.claude-coder/.runtime/browser-profile/` 目录是否存在。
|
|
143
|
+
|
|
144
|
+
**Q: 切换工具后需要重新认证吗?**
|
|
145
|
+
A: 不需要。`claude-coder setup` 切换时自动更新 `.env` 和 `.mcp.json`。之前的认证数据(如 browser-profile)保留,切回时直接可用。
|
|
146
|
+
|
|
147
|
+
**Q: 两个工具可以同时启用吗?**
|
|
148
|
+
A: 不可以。`.mcp.json` 中同时只保留一个工具的配置,切换时自动替换。
|
|
149
|
+
|
|
150
|
+
详见 [浏览器测试工具完整文档](docs/PLAYWRIGHT_CREDENTIALS.md)。
|
|
104
151
|
|
|
105
152
|
## 模型支持
|
|
106
153
|
|
|
@@ -142,9 +189,9 @@ your-project/
|
|
|
142
189
|
progress.json # 会话历史 + 成本
|
|
143
190
|
test.env # 测试凭证(可选)
|
|
144
191
|
go/ # go 指令输出的方案文件
|
|
145
|
-
recipes/ #
|
|
192
|
+
recipes/ # 食谱库(--deploy-templates 时从内置模板部署,可选)
|
|
146
193
|
.runtime/
|
|
147
|
-
harness_state.json #
|
|
194
|
+
harness_state.json # 运行状态(session 计数等)
|
|
148
195
|
logs/ # 每 session 独立日志
|
|
149
196
|
```
|
|
150
197
|
|
|
@@ -154,7 +201,7 @@ your-project/
|
|
|
154
201
|
|
|
155
202
|
**中断恢复**:直接重新运行 `claude-coder run`,从上次中断处继续。
|
|
156
203
|
|
|
157
|
-
**长时间无响应**:模型处理复杂任务时可能出现长思考间隔(indicator 显示黄色"工具执行中"或红色"无响应"
|
|
204
|
+
**长时间无响应**:模型处理复杂任务时可能出现长思考间隔(indicator 显示黄色"工具执行中"或红色"无响应"),这是正常行为。超过阈值后自动中断并重试。通过 `claude-coder setup` 的安全限制配置或 `.env` 中 `SESSION_STALL_TIMEOUT=秒数` 调整。
|
|
158
205
|
|
|
159
206
|
**跳过任务**:将 `.claude-coder/tasks.json` 中该任务的 `status` 改为 `done`。
|
|
160
207
|
|
package/bin/cli.js
CHANGED
|
@@ -6,7 +6,7 @@ const pkg = require('../package.json');
|
|
|
6
6
|
const COMMANDS = {
|
|
7
7
|
run: { desc: '自动编码循环', usage: 'claude-coder run [--max N] [--pause N] [--dry-run]' },
|
|
8
8
|
setup: { desc: '交互式模型配置', usage: 'claude-coder setup' },
|
|
9
|
-
init: { desc: '初始化项目环境', usage: 'claude-coder init' },
|
|
9
|
+
init: { desc: '初始化项目环境', usage: 'claude-coder init [--deploy-templates]' },
|
|
10
10
|
plan: { desc: '生成计划方案', usage: 'claude-coder plan "需求" | plan -r requirements.md [--planOnly] [-i]' },
|
|
11
11
|
simplify: { desc: '代码审查和简化', usage: 'claude-coder simplify [focus]' },
|
|
12
12
|
auth: { desc: '导出 Playwright 登录状态', usage: 'claude-coder auth [url]' },
|
|
@@ -31,6 +31,7 @@ function showHelp() {
|
|
|
31
31
|
console.log(' claude-coder run --max 1 单次执行');
|
|
32
32
|
console.log(' claude-coder run --max 5 --pause 5 每 5 个 session 暂停确认');
|
|
33
33
|
console.log(' claude-coder run --dry-run 预览模式');
|
|
34
|
+
console.log(' claude-coder init --deploy-templates 部署模板和食谱到项目目录(可自定义)');
|
|
34
35
|
console.log(' claude-coder simplify 代码审查和简化');
|
|
35
36
|
console.log(' claude-coder simplify "内存效率" 聚焦特定领域审查');
|
|
36
37
|
console.log(' claude-coder go 对话式需求收集和方案组装');
|
|
@@ -50,6 +51,11 @@ function parseArgs(argv) {
|
|
|
50
51
|
const positional = [];
|
|
51
52
|
|
|
52
53
|
for (let i = 1; i < args.length; i++) {
|
|
54
|
+
// support --key=value syntax
|
|
55
|
+
if (args[i].startsWith('--') && args[i].includes('=')) {
|
|
56
|
+
const eq = args[i].indexOf('=');
|
|
57
|
+
args.splice(i, 1, args[i].slice(0, eq), args[i].slice(eq + 1));
|
|
58
|
+
}
|
|
53
59
|
switch (args[i]) {
|
|
54
60
|
case '--max':
|
|
55
61
|
opts.max = parseInt(args[++i], 10) || 50;
|
|
@@ -87,6 +93,9 @@ function parseArgs(argv) {
|
|
|
87
93
|
case '--interactive':
|
|
88
94
|
opts.interactive = true;
|
|
89
95
|
break;
|
|
96
|
+
case '--deploy-templates':
|
|
97
|
+
opts.deployTemplates = true;
|
|
98
|
+
break;
|
|
90
99
|
case '--help':
|
|
91
100
|
case '-h':
|
|
92
101
|
showHelp();
|
|
@@ -103,7 +112,7 @@ function parseArgs(argv) {
|
|
|
103
112
|
return { command, positional, opts };
|
|
104
113
|
}
|
|
105
114
|
|
|
106
|
-
async function
|
|
115
|
+
async function cliMain() {
|
|
107
116
|
const { command, positional, opts } = parseArgs(process.argv);
|
|
108
117
|
|
|
109
118
|
if (!command || command === '--help' || command === '-h') {
|
|
@@ -117,56 +126,30 @@ async function main() {
|
|
|
117
126
|
}
|
|
118
127
|
|
|
119
128
|
switch (command) {
|
|
120
|
-
case 'run': {
|
|
121
|
-
const runner = require('../src/core/runner');
|
|
122
|
-
await runner.run(opts);
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
129
|
case 'setup': {
|
|
126
130
|
const setup = require('../src/commands/setup');
|
|
127
131
|
await setup.setup();
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
case 'init': {
|
|
131
|
-
const { init } = require('../src/core/init');
|
|
132
|
-
await init();
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
case 'plan': {
|
|
136
|
-
const { run: planRun } = require('../src/core/plan');
|
|
137
|
-
const input = positional[0] || '';
|
|
138
|
-
await planRun(input, opts);
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
case 'simplify': {
|
|
142
|
-
const { simplify } = require('../src/core/simplify');
|
|
143
|
-
await simplify(positional[0] || null, { n: opts.n });
|
|
144
|
-
break;
|
|
132
|
+
return;
|
|
145
133
|
}
|
|
146
134
|
case 'auth': {
|
|
147
135
|
const { auth } = require('../src/commands/auth');
|
|
148
136
|
await auth(positional[0] || null);
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
case 'go': {
|
|
152
|
-
const { run: goRun } = require('../src/core/go');
|
|
153
|
-
await goRun(positional[0] || '', opts);
|
|
154
|
-
break;
|
|
137
|
+
return;
|
|
155
138
|
}
|
|
156
139
|
case 'status': {
|
|
157
140
|
const tasks = require('../src/common/tasks');
|
|
158
141
|
tasks.showStatus();
|
|
159
|
-
|
|
142
|
+
return;
|
|
160
143
|
}
|
|
161
|
-
default:
|
|
162
|
-
console.error(`未知命令: ${command}`);
|
|
163
|
-
showHelp();
|
|
164
|
-
process.exit(1);
|
|
165
144
|
}
|
|
145
|
+
|
|
146
|
+
const { main } = require('../src');
|
|
147
|
+
await main(command, positional[0] || '', opts);
|
|
166
148
|
}
|
|
167
149
|
|
|
168
|
-
|
|
169
|
-
|
|
150
|
+
cliMain().catch(err => {
|
|
151
|
+
const { log } = require('../src/common/config');
|
|
152
|
+
log('error', err.message);
|
|
170
153
|
if (process.env.DEBUG) console.error(err.stack);
|
|
171
154
|
process.exit(1);
|
|
172
155
|
});
|
package/package.json
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-coder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Claude Coder — Autonomous coding agent harness powered by Claude Code SDK. Scan, plan, code, validate, git-commit in a loop.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"claude-coder": "bin/cli.js"
|
|
7
7
|
},
|
|
8
|
+
"types": "types/index.d.ts",
|
|
8
9
|
"files": [
|
|
9
10
|
"bin/",
|
|
10
11
|
"src/",
|
|
12
|
+
"types/",
|
|
13
|
+
"recipes/",
|
|
11
14
|
"templates/"
|
|
12
15
|
],
|
|
13
16
|
"scripts": {
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# 测试报告输出规范
|
|
2
|
+
|
|
3
|
+
测试任务完成后,必须输出两个报告文件。
|
|
4
|
+
|
|
5
|
+
## 1. 结构化数据:.claude-coder/test-report.json
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"project": "项目名",
|
|
10
|
+
"timestamp": "ISO-8601 时间戳",
|
|
11
|
+
"summary": {
|
|
12
|
+
"total": 10,
|
|
13
|
+
"passed": 8,
|
|
14
|
+
"failed": 2,
|
|
15
|
+
"skipped": 0
|
|
16
|
+
},
|
|
17
|
+
"duration_ms": 45000,
|
|
18
|
+
"cases": [
|
|
19
|
+
{
|
|
20
|
+
"id": "TC-001",
|
|
21
|
+
"name": "列表加载",
|
|
22
|
+
"priority": "P0",
|
|
23
|
+
"status": "passed",
|
|
24
|
+
"duration_ms": 2300,
|
|
25
|
+
"steps": [
|
|
26
|
+
{ "description": "导航到列表页", "status": "passed" },
|
|
27
|
+
{ "description": "验证表格存在", "status": "passed" }
|
|
28
|
+
],
|
|
29
|
+
"error": null
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "TC-002",
|
|
33
|
+
"name": "新建功能",
|
|
34
|
+
"priority": "P0",
|
|
35
|
+
"status": "failed",
|
|
36
|
+
"duration_ms": 5200,
|
|
37
|
+
"steps": [
|
|
38
|
+
{ "description": "点击新建按钮", "status": "passed" },
|
|
39
|
+
{ "description": "填写表单", "status": "passed" },
|
|
40
|
+
{ "description": "提交", "status": "failed" }
|
|
41
|
+
],
|
|
42
|
+
"error": "表单校验未触发,直接提交成功"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"environment": {
|
|
46
|
+
"browser": "chromium",
|
|
47
|
+
"baseUrl": "http://localhost:xxxx"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 2. 可读报告:.claude-coder/test-report.md
|
|
53
|
+
|
|
54
|
+
格式模板:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
# 测试报告 — {项目名}
|
|
58
|
+
|
|
59
|
+
> 时间: {timestamp} | 通过率: {passed}/{total} | 耗时: {duration}s
|
|
60
|
+
|
|
61
|
+
## 摘要
|
|
62
|
+
|
|
63
|
+
| 指标 | 数值 |
|
|
64
|
+
|------|------|
|
|
65
|
+
| 总用例 | {total} |
|
|
66
|
+
| 通过 | {passed} |
|
|
67
|
+
| 失败 | {failed} |
|
|
68
|
+
| 跳过 | {skipped} |
|
|
69
|
+
|
|
70
|
+
## 详细结果
|
|
71
|
+
|
|
72
|
+
### ✅ [P0] 列表加载 — PASSED (2.3s)
|
|
73
|
+
1. 导航到列表页 ✓
|
|
74
|
+
2. 验证表格存在 ✓
|
|
75
|
+
|
|
76
|
+
### ❌ [P0] 新建功能 — FAILED (5.2s)
|
|
77
|
+
1. 点击新建按钮 ✓
|
|
78
|
+
2. 填写表单 ✓
|
|
79
|
+
3. 提交 ✗ — 表单校验未触发
|
|
80
|
+
|
|
81
|
+
## 失败用例汇总
|
|
82
|
+
|
|
83
|
+
| 用例 | 优先级 | 失败原因 |
|
|
84
|
+
|------|--------|----------|
|
|
85
|
+
| 新建功能 | P0 | 表单校验未触发 |
|
|
86
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 后端服务 — 基础食谱
|
|
2
|
+
|
|
3
|
+
## 任务分解模式
|
|
4
|
+
|
|
5
|
+
后端服务按以下标准拆分:
|
|
6
|
+
|
|
7
|
+
1. **infra**: 项目结构(如未有后端框架,需初始化)
|
|
8
|
+
- steps:框架搭建、目录结构、数据库连接、中间件配置
|
|
9
|
+
- 验证:服务启动成功,健康检查接口返回 200
|
|
10
|
+
|
|
11
|
+
2. **backend**: 数据模型 + API 接口
|
|
12
|
+
- steps:Model 定义、CRUD Service、Controller/Router、参数校验
|
|
13
|
+
- 验证:curl 测试所有接口返回正确响应
|
|
14
|
+
|
|
15
|
+
3. **backend**: 业务逻辑(复杂场景单独拆分)
|
|
16
|
+
- steps:业务规则、数据转换、关联查询
|
|
17
|
+
- 验证:curl 测试边界场景
|
|
18
|
+
|
|
19
|
+
4. **test**: API 测试
|
|
20
|
+
- steps:正向流程、参数校验、权限校验、边界测试
|
|
21
|
+
|
|
22
|
+
## 通用规则
|
|
23
|
+
|
|
24
|
+
- 一个资源(如 users)的完整 CRUD 合为一个 backend 任务
|
|
25
|
+
- 认证鉴权如果与 CRUD 无关,拆为独立任务
|
|
26
|
+
- 每个接口必须有参数校验
|
|
27
|
+
- 错误响应格式统一
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 认证鉴权
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
认证鉴权拆为独立 backend 任务,不与 CRUD 混合。
|
|
5
|
+
|
|
6
|
+
## 实现要点
|
|
7
|
+
- 注册:用户名/邮箱 + 密码,密码 hash 存储
|
|
8
|
+
- 登录:验证凭证,返回 JWT token 或设置 session
|
|
9
|
+
- Token 验证中间件:拦截受保护路由
|
|
10
|
+
- 角色权限:admin / editor / viewer 等,按路由或按操作控制
|
|
11
|
+
- Token 刷新/续期机制
|
|
12
|
+
|
|
13
|
+
## 验证策略
|
|
14
|
+
- curl 注册 → 201
|
|
15
|
+
- curl 登录 → 200 + token
|
|
16
|
+
- curl 无 token 访问受保护路由 → 401
|
|
17
|
+
- curl 带 token 访问 → 200
|
|
18
|
+
- curl 权限不足 → 403
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# RESTful CRUD API
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
一个资源的完整 CRUD 合为一个 backend 任务。
|
|
5
|
+
|
|
6
|
+
## 实现要点
|
|
7
|
+
- RESTful 风格:GET /资源(列表)、GET /资源/:id(详情)、POST(创建)、PUT(更新)、DELETE(删除)
|
|
8
|
+
- 列表分页:`?page=1&pageSize=10`,返回 `{ data: [], total: N }`
|
|
9
|
+
- 搜索过滤:`?keyword=xxx&status=active`
|
|
10
|
+
- 排序:`?sortBy=createdAt&order=desc`
|
|
11
|
+
- 参数校验:必填项、类型、长度、格式
|
|
12
|
+
- 错误响应统一格式:`{ code: 400, message: "xxx" }`
|
|
13
|
+
|
|
14
|
+
## 验证策略
|
|
15
|
+
- curl POST 创建 → 201 + 返回创建的数据
|
|
16
|
+
- curl GET 列表 → 200 + 分页结构正确
|
|
17
|
+
- curl PUT 更新 → 200 + 数据变更
|
|
18
|
+
- curl DELETE → 200 + 再 GET 确认已删除
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 文件服务
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
文件服务如逻辑简单可合入 CRUD 任务,复杂时独立拆分。
|
|
5
|
+
|
|
6
|
+
## 实现要点
|
|
7
|
+
- 上传接口:multipart/form-data,校验类型和大小
|
|
8
|
+
- 存储:本地文件系统 / 对象存储(S3/OSS)
|
|
9
|
+
- 下载/访问:静态文件服务或签名 URL
|
|
10
|
+
- 文件元信息:原始名、大小、MIME 类型、上传时间
|
|
11
|
+
|
|
12
|
+
## 验证策略
|
|
13
|
+
- curl 上传文件 → 200 + 返回 fileId/URL
|
|
14
|
+
- curl 访问上传的文件 → 200 + 内容正确
|
|
15
|
+
- curl 上传超限文件 → 400 + 错误提示
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "backend",
|
|
3
|
+
"name": "后端服务",
|
|
4
|
+
"description": "后端 API 服务开发(RESTful CRUD、认证鉴权、文件服务等)",
|
|
5
|
+
"base": "base.md",
|
|
6
|
+
"components": [
|
|
7
|
+
{ "id": "crud-api", "label": "CRUD API", "description": "RESTful 增删改查接口 + 分页 + 过滤", "file": "components/crud-api.md", "default": true },
|
|
8
|
+
{ "id": "auth", "label": "认证鉴权", "description": "登录注册、JWT/Session、角色权限", "file": "components/auth.md", "default": false },
|
|
9
|
+
{ "id": "file-service", "label": "文件服务", "description": "文件上传下载、存储、类型校验", "file": "components/file-service.md", "default": false }
|
|
10
|
+
],
|
|
11
|
+
"test": {
|
|
12
|
+
"file": "test/api-test.md",
|
|
13
|
+
"defaultEnabled": true
|
|
14
|
+
},
|
|
15
|
+
"defaults": {
|
|
16
|
+
"components": ["crud-api"],
|
|
17
|
+
"role": "developer",
|
|
18
|
+
"test": true
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# API 测试步骤模板
|
|
2
|
+
|
|
3
|
+
## 标准测试用例
|
|
4
|
+
|
|
5
|
+
### 【P0】CRUD 正向流程
|
|
6
|
+
1. POST 创建资源 → 验证 201 + 返回数据
|
|
7
|
+
2. GET 列表 → 验证新数据在列表中
|
|
8
|
+
3. GET 详情 → 验证数据正确
|
|
9
|
+
4. PUT 更新 → 验证数据变更
|
|
10
|
+
5. DELETE 删除 → 验证 GET 返回 404
|
|
11
|
+
|
|
12
|
+
### 【P0】分页和搜索
|
|
13
|
+
1. 创建多条数据
|
|
14
|
+
2. GET 列表 ?page=1&pageSize=2 → 验证分页字段正确
|
|
15
|
+
3. GET 列表 ?keyword=xxx → 验证过滤结果
|
|
16
|
+
|
|
17
|
+
### 【P1】参数校验
|
|
18
|
+
1. POST 缺少必填字段 → 验证 400
|
|
19
|
+
2. POST 字段格式错误 → 验证 400
|
|
20
|
+
3. PUT 不存在的 ID → 验证 404
|
|
21
|
+
|
|
22
|
+
### 【P1】认证鉴权(如适用)
|
|
23
|
+
1. 无 token 访问 → 验证 401
|
|
24
|
+
2. 错误 token → 验证 401
|
|
25
|
+
3. 权限不足 → 验证 403
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Console 管理后台 — 基础食谱
|
|
2
|
+
|
|
3
|
+
## 任务分解模式
|
|
4
|
+
|
|
5
|
+
管理后台 CRUD 页面按以下标准拆分任务(1 session = 1 task):
|
|
6
|
+
|
|
7
|
+
1. **backend**: API 接口层(RESTful CRUD + 分页 + 搜索过滤)
|
|
8
|
+
- steps 包含:路由定义、Controller、Service、数据模型
|
|
9
|
+
- 验证:curl 请求返回正确状态码和分页结构
|
|
10
|
+
|
|
11
|
+
2. **frontend**: 列表页面(表格 + 搜索栏 + 分页组件)
|
|
12
|
+
- steps 包含:页面组件、数据请求、状态管理
|
|
13
|
+
- 验证:Playwright snapshot 验证页面元素存在
|
|
14
|
+
|
|
15
|
+
3. **frontend**: 弹窗/表单(新建 + 编辑弹窗 + 表单校验)
|
|
16
|
+
- steps 包含:弹窗组件、表单项、校验规则、提交逻辑
|
|
17
|
+
- 验证:Playwright 点击按钮 → snapshot 验证弹窗打开
|
|
18
|
+
|
|
19
|
+
4. **fullstack**: 联调(前后端串通 + 错误处理 + loading 状态)
|
|
20
|
+
- steps 包含:接口联调、错误提示、空状态处理
|
|
21
|
+
- 验证:Playwright 完整 CRUD 流程
|
|
22
|
+
|
|
23
|
+
5. **test**: E2E 测试(可选,参考 test/crud-e2e.md)
|
|
24
|
+
|
|
25
|
+
## 通用规则
|
|
26
|
+
|
|
27
|
+
- 搜索框 + 表格 + 分页合并为一个 frontend 任务(不要拆太碎)
|
|
28
|
+
- 弹窗 + 表单作为独立 frontend 任务(UI 和逻辑较复杂)
|
|
29
|
+
- 后端 API 作为独立 backend 任务
|
|
30
|
+
- 前后端联调作为 fullstack 任务
|
|
31
|
+
- 每个任务必须有可执行的验证步骤
|
|
32
|
+
|
|
33
|
+
## 反面案例
|
|
34
|
+
|
|
35
|
+
- "搜索框"、"表格"、"分页"各拆为独立任务 → 太碎,合并
|
|
36
|
+
- "全部前端"合为一个任务 → 太大(弹窗应独立)
|
|
37
|
+
- 忽略验证步骤 → 每个 task 的 steps 最后一步必须是验证命令
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 弹窗 + 表单
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
弹窗和表单作为独立的 frontend 任务。
|
|
5
|
+
steps 中应包含:弹窗组件 → 表单项 → 校验规则 → 提交 → 关闭 → 列表刷新。
|
|
6
|
+
|
|
7
|
+
## 实现要点
|
|
8
|
+
- 新建弹窗:表单为空,提交调用 POST API
|
|
9
|
+
- 编辑弹窗:表单回填已有数据,提交调用 PUT API
|
|
10
|
+
- 共用同一个弹窗组件(通过 mode 区分新建/编辑)
|
|
11
|
+
- 表单校验:必填项、格式校验(邮箱、手机号等)、长度限制
|
|
12
|
+
- 提交 loading:防重复提交
|
|
13
|
+
- 提交成功后:关闭弹窗 + 刷新列表 + 提示消息
|
|
14
|
+
- 提交失败:显示错误信息,不关闭弹窗
|
|
15
|
+
|
|
16
|
+
## 验证策略
|
|
17
|
+
- 点击新建按钮 → snapshot 验证弹窗打开 + 表单元素存在
|
|
18
|
+
- 不填必填项直接提交 → 验证校验提示出现
|
|
19
|
+
- 正确填写并提交 → 验证弹窗关闭 + 列表数据更新
|
|
20
|
+
- 点击编辑 → 验证弹窗打开 + 数据回填
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 分页组件
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
分页与表格合并为一个 frontend 任务,不单独拆分。
|
|
5
|
+
steps 中应包含:分页参数 → 分页 UI → 翻页请求 → 总数显示。
|
|
6
|
+
|
|
7
|
+
## 实现要点
|
|
8
|
+
- 分页模式:offset + limit(如 `?page=1&pageSize=10`)
|
|
9
|
+
- 总数显示:从 API 响应中取 total 字段
|
|
10
|
+
- 默认每页条数:10 条(可配置)
|
|
11
|
+
- 页码变化触发重新请求
|
|
12
|
+
- URL 同步:当前页码反映在 URL query 中(可选)
|
|
13
|
+
|
|
14
|
+
## 验证策略
|
|
15
|
+
- 验证分页组件渲染(页码、上一页/下一页按钮)
|
|
16
|
+
- 点击第 2 页 → 验证数据变化
|
|
17
|
+
- 验证总数显示正确
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 搜索组件
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
搜索功能通常与列表任务合并为一个 frontend 任务,不单独拆分。
|
|
5
|
+
steps 中应包含:搜索框 UI → 防抖处理 → API 请求参数拼接 → 列表刷新。
|
|
6
|
+
|
|
7
|
+
## 实现要点
|
|
8
|
+
- 输入防抖 300ms,避免频繁请求
|
|
9
|
+
- 搜索关键词作为 query 参数传给列表 API(如 `?keyword=xxx`)
|
|
10
|
+
- 支持清空搜索恢复全量数据
|
|
11
|
+
- 搜索时显示 loading 状态
|
|
12
|
+
- 如有多个筛选条件,使用表单组合(日期范围、下拉选择、关键词等)
|
|
13
|
+
|
|
14
|
+
## 验证策略
|
|
15
|
+
- 输入已知关键词 → snapshot 验证列表数据过滤
|
|
16
|
+
- 清空搜索 → 验证恢复全量
|
|
17
|
+
- 快速连续输入 → 验证只发一次请求(防抖生效)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 数据表格
|
|
2
|
+
|
|
3
|
+
## 任务分解指导
|
|
4
|
+
表格是列表页的核心,与搜索和分页合并为一个 frontend 任务。
|
|
5
|
+
steps 中应包含:列定义 → 数据请求 → 渲染 → 操作列按钮。
|
|
6
|
+
|
|
7
|
+
## 实现要点
|
|
8
|
+
- 列定义清晰:字段名、显示名、宽度、对齐方式、渲染方式
|
|
9
|
+
- 操作列:编辑、删除按钮(按业务需求扩展)
|
|
10
|
+
- 空状态:无数据时显示友好提示
|
|
11
|
+
- Loading 状态:请求中显示骨架屏或 spinner
|
|
12
|
+
- 如需行选择:checkbox 列 + 批量操作栏
|
|
13
|
+
- 如需排序:列头排序图标 + API 排序参数
|
|
14
|
+
|
|
15
|
+
## 验证策略
|
|
16
|
+
- snapshot 验证表格元素存在(table/thead/tbody)
|
|
17
|
+
- 验证至少有 1 行数据(或空状态文案)
|
|
18
|
+
- 验证操作列按钮可点击
|