claude-coder 1.8.2 → 1.8.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/README.md +167 -167
- package/bin/cli.js +172 -172
- package/package.json +53 -52
- 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 +290 -240
- package/src/commands/setup-modules/helpers.js +99 -99
- package/src/commands/setup-modules/index.js +25 -25
- package/src/commands/setup-modules/mcp.js +94 -94
- package/src/commands/setup-modules/provider.js +260 -260
- package/src/commands/setup-modules/safety.js +61 -61
- package/src/commands/setup-modules/simplify.js +52 -52
- package/src/commands/setup.js +172 -172
- package/src/common/assets.js +236 -236
- package/src/common/config.js +125 -125
- package/src/common/constants.js +55 -55
- package/src/common/indicator.js +222 -222
- package/src/common/interaction.js +170 -170
- package/src/common/logging.js +77 -77
- package/src/common/sdk.js +50 -50
- package/src/common/tasks.js +88 -88
- package/src/common/utils.js +161 -161
- package/src/core/coding.js +55 -55
- package/src/core/context.js +117 -117
- package/src/core/go.js +310 -310
- package/src/core/harness.js +484 -484
- package/src/core/hooks.js +533 -533
- package/src/core/init.js +171 -171
- package/src/core/plan.js +325 -325
- package/src/core/prompts.js +227 -227
- package/src/core/query.js +49 -49
- package/src/core/repair.js +46 -46
- package/src/core/runner.js +195 -195
- package/src/core/scan.js +89 -89
- package/src/core/session.js +56 -56
- package/src/core/simplify.js +53 -52
- package/templates/bash-process.md +12 -12
- package/templates/codingSystem.md +65 -65
- package/templates/codingUser.md +17 -17
- package/templates/coreProtocol.md +29 -29
- package/templates/goSystem.md +130 -130
- package/templates/guidance.json +52 -52
- package/templates/planSystem.md +78 -78
- package/templates/planUser.md +8 -8
- package/templates/playwright.md +16 -16
- package/templates/requirements.example.md +57 -57
- package/templates/scanSystem.md +120 -120
- package/templates/scanUser.md +10 -10
- package/templates/test_rule.md +194 -194
package/bin/cli.js
CHANGED
|
@@ -1,172 +1,172 @@
|
|
|
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
|
-
go: { desc: 'AI 驱动的需求组装', usage: 'claude-coder go ["需求"] [-r file] [--reset]' },
|
|
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 plan "实现用户登录" 生成计划方案');
|
|
27
|
-
console.log(' claude-coder plan -r requirements.md 从文件读取需求');
|
|
28
|
-
console.log(' claude-coder plan --planOnly 仅生成计划文档');
|
|
29
|
-
console.log(' claude-coder plan -i "优化系统" 交互模式,允许模型提问');
|
|
30
|
-
console.log(' claude-coder run 执行所有待处理任务');
|
|
31
|
-
console.log(' claude-coder run --max 1 单次执行');
|
|
32
|
-
console.log(' claude-coder run --max 5 --pause 5 每 5 个 session 暂停确认');
|
|
33
|
-
console.log(' claude-coder run --dry-run 预览模式');
|
|
34
|
-
console.log(' claude-coder simplify 代码审查和简化');
|
|
35
|
-
console.log(' claude-coder simplify "内存效率" 聚焦特定领域审查');
|
|
36
|
-
console.log(' claude-coder go 对话式需求收集和方案组装');
|
|
37
|
-
console.log(' claude-coder go "用户管理页面" AI 自动分析需求并组装方案');
|
|
38
|
-
console.log(' claude-coder go -r requirements.md 从文件读取需求并自动组装');
|
|
39
|
-
console.log(' claude-coder go --reset 重置 Go 记忆');
|
|
40
|
-
console.log(' claude-coder auth 导出 Playwright 登录状态');
|
|
41
|
-
console.log(' claude-coder auth http://localhost:8080 指定登录 URL');
|
|
42
|
-
console.log(' claude-coder status 查看进度和成本');
|
|
43
|
-
console.log(`\n前置条件: npm install -g @anthropic-ai/claude-agent-sdk`);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function parseArgs(argv) {
|
|
47
|
-
const args = argv.slice(2);
|
|
48
|
-
const command = args[0];
|
|
49
|
-
const opts = { max: 50, pause: 0, dryRun: false, readFile: null, model: null, n: 3, planOnly: false, interactive: false };
|
|
50
|
-
const positional = [];
|
|
51
|
-
|
|
52
|
-
for (let i = 1; i < args.length; i++) {
|
|
53
|
-
switch (args[i]) {
|
|
54
|
-
case '--max':
|
|
55
|
-
opts.max = parseInt(args[++i], 10) || 50;
|
|
56
|
-
break;
|
|
57
|
-
case '--pause':
|
|
58
|
-
{ const v = parseInt(args[++i], 10); opts.pause = (v >= 0 && !isNaN(v)) ? v : 5; }
|
|
59
|
-
break;
|
|
60
|
-
case '--dry-run':
|
|
61
|
-
opts.dryRun = true;
|
|
62
|
-
break;
|
|
63
|
-
case '--model':
|
|
64
|
-
opts.model = args[++i] || null;
|
|
65
|
-
break;
|
|
66
|
-
case '-n':
|
|
67
|
-
case '--n':
|
|
68
|
-
opts.n = parseInt(args[++i], 10) || 3;
|
|
69
|
-
break;
|
|
70
|
-
case '-r': {
|
|
71
|
-
const next = args[i + 1];
|
|
72
|
-
if (next && !next.startsWith('-')) {
|
|
73
|
-
opts.readFile = next;
|
|
74
|
-
i++;
|
|
75
|
-
} else {
|
|
76
|
-
opts.readFile = 'requirements.md';
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
case '--planOnly':
|
|
81
|
-
opts.planOnly = true;
|
|
82
|
-
break;
|
|
83
|
-
case '--reset':
|
|
84
|
-
opts.reset = true;
|
|
85
|
-
break;
|
|
86
|
-
case '-i':
|
|
87
|
-
case '--interactive':
|
|
88
|
-
opts.interactive = true;
|
|
89
|
-
break;
|
|
90
|
-
case '--help':
|
|
91
|
-
case '-h':
|
|
92
|
-
showHelp();
|
|
93
|
-
process.exit(0);
|
|
94
|
-
break;
|
|
95
|
-
default:
|
|
96
|
-
if (!args[i].startsWith('--')) {
|
|
97
|
-
positional.push(args[i]);
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return { command, positional, opts };
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function main() {
|
|
107
|
-
const { command, positional, opts } = parseArgs(process.argv);
|
|
108
|
-
|
|
109
|
-
if (!command || command === '--help' || command === '-h') {
|
|
110
|
-
showHelp();
|
|
111
|
-
process.exit(0);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (command === '--version' || command === '-v') {
|
|
115
|
-
console.log(pkg.version);
|
|
116
|
-
process.exit(0);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
switch (command) {
|
|
120
|
-
case 'run': {
|
|
121
|
-
const runner = require('../src/core/runner');
|
|
122
|
-
await runner.run(opts);
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
case 'setup': {
|
|
126
|
-
const setup = require('../src/commands/setup');
|
|
127
|
-
await setup.setup();
|
|
128
|
-
break;
|
|
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;
|
|
145
|
-
}
|
|
146
|
-
case 'auth': {
|
|
147
|
-
const { auth } = require('../src/commands/auth');
|
|
148
|
-
await auth(positional[0] || null);
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
case 'go': {
|
|
152
|
-
const { run: goRun } = require('../src/core/go');
|
|
153
|
-
await goRun(positional[0] || '', opts);
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
case 'status': {
|
|
157
|
-
const tasks = require('../src/common/tasks');
|
|
158
|
-
tasks.showStatus();
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
default:
|
|
162
|
-
console.error(`未知命令: ${command}`);
|
|
163
|
-
showHelp();
|
|
164
|
-
process.exit(1);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
main().catch(err => {
|
|
169
|
-
console.error(`\n错误: ${err.message}`);
|
|
170
|
-
if (process.env.DEBUG) console.error(err.stack);
|
|
171
|
-
process.exit(1);
|
|
172
|
-
});
|
|
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
|
+
go: { desc: 'AI 驱动的需求组装', usage: 'claude-coder go ["需求"] [-r file] [--reset]' },
|
|
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 plan "实现用户登录" 生成计划方案');
|
|
27
|
+
console.log(' claude-coder plan -r requirements.md 从文件读取需求');
|
|
28
|
+
console.log(' claude-coder plan --planOnly 仅生成计划文档');
|
|
29
|
+
console.log(' claude-coder plan -i "优化系统" 交互模式,允许模型提问');
|
|
30
|
+
console.log(' claude-coder run 执行所有待处理任务');
|
|
31
|
+
console.log(' claude-coder run --max 1 单次执行');
|
|
32
|
+
console.log(' claude-coder run --max 5 --pause 5 每 5 个 session 暂停确认');
|
|
33
|
+
console.log(' claude-coder run --dry-run 预览模式');
|
|
34
|
+
console.log(' claude-coder simplify 代码审查和简化');
|
|
35
|
+
console.log(' claude-coder simplify "内存效率" 聚焦特定领域审查');
|
|
36
|
+
console.log(' claude-coder go 对话式需求收集和方案组装');
|
|
37
|
+
console.log(' claude-coder go "用户管理页面" AI 自动分析需求并组装方案');
|
|
38
|
+
console.log(' claude-coder go -r requirements.md 从文件读取需求并自动组装');
|
|
39
|
+
console.log(' claude-coder go --reset 重置 Go 记忆');
|
|
40
|
+
console.log(' claude-coder auth 导出 Playwright 登录状态');
|
|
41
|
+
console.log(' claude-coder auth http://localhost:8080 指定登录 URL');
|
|
42
|
+
console.log(' claude-coder status 查看进度和成本');
|
|
43
|
+
console.log(`\n前置条件: npm install -g @anthropic-ai/claude-agent-sdk`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function parseArgs(argv) {
|
|
47
|
+
const args = argv.slice(2);
|
|
48
|
+
const command = args[0];
|
|
49
|
+
const opts = { max: 50, pause: 0, dryRun: false, readFile: null, model: null, n: 3, planOnly: false, interactive: false };
|
|
50
|
+
const positional = [];
|
|
51
|
+
|
|
52
|
+
for (let i = 1; i < args.length; i++) {
|
|
53
|
+
switch (args[i]) {
|
|
54
|
+
case '--max':
|
|
55
|
+
opts.max = parseInt(args[++i], 10) || 50;
|
|
56
|
+
break;
|
|
57
|
+
case '--pause':
|
|
58
|
+
{ const v = parseInt(args[++i], 10); opts.pause = (v >= 0 && !isNaN(v)) ? v : 5; }
|
|
59
|
+
break;
|
|
60
|
+
case '--dry-run':
|
|
61
|
+
opts.dryRun = true;
|
|
62
|
+
break;
|
|
63
|
+
case '--model':
|
|
64
|
+
opts.model = args[++i] || null;
|
|
65
|
+
break;
|
|
66
|
+
case '-n':
|
|
67
|
+
case '--n':
|
|
68
|
+
opts.n = parseInt(args[++i], 10) || 3;
|
|
69
|
+
break;
|
|
70
|
+
case '-r': {
|
|
71
|
+
const next = args[i + 1];
|
|
72
|
+
if (next && !next.startsWith('-')) {
|
|
73
|
+
opts.readFile = next;
|
|
74
|
+
i++;
|
|
75
|
+
} else {
|
|
76
|
+
opts.readFile = 'requirements.md';
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
case '--planOnly':
|
|
81
|
+
opts.planOnly = true;
|
|
82
|
+
break;
|
|
83
|
+
case '--reset':
|
|
84
|
+
opts.reset = true;
|
|
85
|
+
break;
|
|
86
|
+
case '-i':
|
|
87
|
+
case '--interactive':
|
|
88
|
+
opts.interactive = true;
|
|
89
|
+
break;
|
|
90
|
+
case '--help':
|
|
91
|
+
case '-h':
|
|
92
|
+
showHelp();
|
|
93
|
+
process.exit(0);
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
if (!args[i].startsWith('--')) {
|
|
97
|
+
positional.push(args[i]);
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return { command, positional, opts };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function main() {
|
|
107
|
+
const { command, positional, opts } = parseArgs(process.argv);
|
|
108
|
+
|
|
109
|
+
if (!command || command === '--help' || command === '-h') {
|
|
110
|
+
showHelp();
|
|
111
|
+
process.exit(0);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (command === '--version' || command === '-v') {
|
|
115
|
+
console.log(pkg.version);
|
|
116
|
+
process.exit(0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
switch (command) {
|
|
120
|
+
case 'run': {
|
|
121
|
+
const runner = require('../src/core/runner');
|
|
122
|
+
await runner.run(opts);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
case 'setup': {
|
|
126
|
+
const setup = require('../src/commands/setup');
|
|
127
|
+
await setup.setup();
|
|
128
|
+
break;
|
|
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;
|
|
145
|
+
}
|
|
146
|
+
case 'auth': {
|
|
147
|
+
const { auth } = require('../src/commands/auth');
|
|
148
|
+
await auth(positional[0] || null);
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case 'go': {
|
|
152
|
+
const { run: goRun } = require('../src/core/go');
|
|
153
|
+
await goRun(positional[0] || '', opts);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case 'status': {
|
|
157
|
+
const tasks = require('../src/common/tasks');
|
|
158
|
+
tasks.showStatus();
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
default:
|
|
162
|
+
console.error(`未知命令: ${command}`);
|
|
163
|
+
showHelp();
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
main().catch(err => {
|
|
169
|
+
console.error(`\n错误: ${err.message}`);
|
|
170
|
+
if (process.env.DEBUG) console.error(err.stack);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
});
|
package/package.json
CHANGED
|
@@ -1,52 +1,53 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "claude-coder",
|
|
3
|
-
"version": "1.8.
|
|
4
|
-
"description": "Claude Coder — Autonomous coding agent harness powered by Claude Code SDK. Scan, plan, code, validate, git-commit in a loop.",
|
|
5
|
-
"bin": {
|
|
6
|
-
"claude-coder": "bin/cli.js"
|
|
7
|
-
},
|
|
8
|
-
"files": [
|
|
9
|
-
"bin/",
|
|
10
|
-
"src/",
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"claude",
|
|
19
|
-
"claude
|
|
20
|
-
"
|
|
21
|
-
"
|
|
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
|
-
|
|
52
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-coder",
|
|
3
|
+
"version": "1.8.4",
|
|
4
|
+
"description": "Claude Coder — Autonomous coding agent harness powered by Claude Code SDK. Scan, plan, code, validate, git-commit in a loop.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"claude-coder": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"src/",
|
|
11
|
+
"recipes/",
|
|
12
|
+
"templates/"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"test": "node test/complete.test.js && node test/integration.test.js && node test/flow.test.js"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"claude-coder",
|
|
19
|
+
"claude",
|
|
20
|
+
"claude-code",
|
|
21
|
+
"ai",
|
|
22
|
+
"agent",
|
|
23
|
+
"autonomous",
|
|
24
|
+
"automation",
|
|
25
|
+
"coding",
|
|
26
|
+
"harness",
|
|
27
|
+
"loop",
|
|
28
|
+
"agent-harness",
|
|
29
|
+
"task-decomposition",
|
|
30
|
+
"code-generation"
|
|
31
|
+
],
|
|
32
|
+
"author": "lk19940215",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"registry": "https://registry.npmjs.org/"
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/lk19940215/claude-coder.git"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@anthropic-ai/claude-agent-sdk": ">=0.1.0"
|
|
46
|
+
},
|
|
47
|
+
"optionalDependencies": {
|
|
48
|
+
"playwright": "^1.58.2"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.71"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -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 + 错误提示
|