bcoder 0.0.5 → 0.0.6
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 +1 -1
- package/bcoder/skills/bc-create-project/SKILL.md +78 -0
- package/bcoder/skills/bc-execute-plans/SKILL.md +30 -24
- package/bcoder/skills/bc-finish-a-dev/SKILL.md +30 -43
- package/bcoder/skills/bc-requirements-analysis/SKILL.md +56 -33
- package/bcoder/skills/bc-requirements-analysis/references/design-doc-template.md +53 -0
- package/bcoder/skills/bc-use-git-worktrees/SKILL.md +28 -30
- package/bcoder/skills/{bc-useing-bcoder → bc-using-bcoder}/SKILL.md +20 -23
- package/bcoder/skills/bc-write-plans/SKILL.md +37 -65
- package/bcoder/skills/bc-write-plans/references/plan-doc-template.md +58 -0
- package/dist/cli/index.js +11 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tools.d.ts.map +1 -1
- package/dist/cli/tools.js +66 -3
- package/dist/cli/tools.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bc-create-project
|
|
3
|
+
description: 当项目没有代码时,使用此技能创建项目。它是一个通用的项目初始化技能,可以根据用户需求创建不同类型的项目。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 项目初始化
|
|
7
|
+
|
|
8
|
+
**开始时声明:** "我正在使用 项目初始化( bc-create-project ) 技能来创建此项目。"
|
|
9
|
+
|
|
10
|
+
## 工作流程
|
|
11
|
+
|
|
12
|
+
### 第一步:确定项目类型
|
|
13
|
+
|
|
14
|
+
询问用户:
|
|
15
|
+
1. **项目类型** - 前端、后端还是全栈?
|
|
16
|
+
2. **技术栈偏好** - 有特定的技术要求吗?
|
|
17
|
+
3. **项目规模** - 小型原型、中型应用还是大型系统?
|
|
18
|
+
4. **团队经验** - 团队对哪些技术栈更熟悉?
|
|
19
|
+
5. **项目目标** - 项目的主要目的和期望是什么?
|
|
20
|
+
|
|
21
|
+
### 第二步:选择具体技能
|
|
22
|
+
|
|
23
|
+
根据用户的回答,推荐并使用相应的专业技能:
|
|
24
|
+
|
|
25
|
+
| 项目类型 | 推荐技能 | 适用场景 |
|
|
26
|
+
|---------|---------|---------|
|
|
27
|
+
| **前端** | bc-create-frontend-project | 创建 Vue 3 前端项目 |
|
|
28
|
+
| **后端** | bc-create-backend-project | 创建 Spring Boot 后端项目 |
|
|
29
|
+
| **全栈** | 先使用 bc-create-frontend-project,再使用 bc-create-backend-project | 创建完整的前后端分离项目 |
|
|
30
|
+
|
|
31
|
+
### 第三步:执行项目创建
|
|
32
|
+
|
|
33
|
+
1. **前端项目**:使用 bc-create-frontend-project 技能创建 Vue 3 项目
|
|
34
|
+
2. **后端项目**:使用 bc-create-backend-project 技能创建 Spring Boot 项目
|
|
35
|
+
3. **全栈项目**:依次执行前端和后端项目创建
|
|
36
|
+
|
|
37
|
+
### 第四步:验证项目
|
|
38
|
+
|
|
39
|
+
确保创建的项目能够:
|
|
40
|
+
1. **前端项目**:通过 `npm install` 和 `npm run dev` 正常运行
|
|
41
|
+
2. **后端项目**:能够编译和启动服务
|
|
42
|
+
3. **全栈项目**:前后端能够正常通信
|
|
43
|
+
|
|
44
|
+
## 项目创建指南
|
|
45
|
+
|
|
46
|
+
### 前端项目
|
|
47
|
+
|
|
48
|
+
- **技术栈**:Vue 3.x、Vite、Vue Router 4.x
|
|
49
|
+
- **项目结构**:标准 Vue 3 项目结构,包含组件、页面、路由等
|
|
50
|
+
- **配置**:支持子路径部署,使用 hash 模式路由
|
|
51
|
+
|
|
52
|
+
### 后端项目
|
|
53
|
+
|
|
54
|
+
- **技术栈**:Java 25 + Spring Boot 3.5.8
|
|
55
|
+
- **架构选项**:分层、按模块打包、模块化单体、番茄、DDD+六边形
|
|
56
|
+
- **依赖**:Spring Web MVC、Mybatis、Lombok、Validation 等
|
|
57
|
+
|
|
58
|
+
### 全栈项目
|
|
59
|
+
|
|
60
|
+
- **前端**:Vue 3 项目,配置 API 调用
|
|
61
|
+
- **后端**:Spring Boot 项目,提供 RESTful API
|
|
62
|
+
- **集成**:确保前后端能够正常通信
|
|
63
|
+
|
|
64
|
+
## 关键原则
|
|
65
|
+
|
|
66
|
+
- **根据需求选择合适的技术栈** - 不要过度工程化
|
|
67
|
+
- **遵循最佳实践** - 使用行业标准和推荐的架构
|
|
68
|
+
- **确保项目可运行** - 验证项目能够正常构建和运行
|
|
69
|
+
- **保持灵活性** - 根据用户的具体需求调整项目配置
|
|
70
|
+
|
|
71
|
+
## 与其他技能的协同
|
|
72
|
+
|
|
73
|
+
- **bc-requirements-analysis**:在创建项目前,使用此技能分析需求
|
|
74
|
+
- **bc-write-plans**:为复杂项目创建详细的实施计划
|
|
75
|
+
- **bc-execute-plans**:执行项目实施计划
|
|
76
|
+
- **bc-finish-a-dev**:完成项目开发并进行总结
|
|
77
|
+
|
|
78
|
+
|
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bc-execute-plans
|
|
3
|
-
description:
|
|
3
|
+
description: 已有书面实施计划且需按计划执行时使用。带审查检查点、批量执行、批次间报告。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 执行计划
|
|
7
7
|
|
|
8
8
|
## 概述
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
加载计划文件,批判性审查后按任务批量执行,每批完成后报告并等待反馈,全部完成后调用 bc-finish-a-dev 收尾。
|
|
11
11
|
|
|
12
|
-
**核心原则:**
|
|
12
|
+
**核心原则:** 带审查检查点的批量执行,不跳过验证、不猜测。
|
|
13
13
|
|
|
14
|
-
**开始时声明:** "
|
|
14
|
+
**开始时声明:** "我正在使用 执行计划 ( bc-execute-plans ) 技能来实施此计划。"
|
|
15
|
+
|
|
16
|
+
## 何时使用
|
|
17
|
+
|
|
18
|
+
- 用户在选择「立即执行」或「执行计划」后,**调用本技能**,按已有计划逐任务实施。
|
|
19
|
+
- **输入**:通常为 bc-write-plans 产出的 `docs/plans/YYYY-MM-DD-<topic>-plan.md`。
|
|
20
|
+
- **前置**:若需隔离环境,先使用 bc-use-git-worktrees;若用户已在目标分支或明确不隔离,可直接开始。
|
|
15
21
|
|
|
16
22
|
## 流程
|
|
17
23
|
|
|
18
24
|
### 步骤 1:加载和审查计划
|
|
19
|
-
1.
|
|
20
|
-
2.
|
|
21
|
-
3.
|
|
22
|
-
4.
|
|
25
|
+
1. 阅读计划文件(通常为 `docs/plans/YYYY-MM-DD-<topic>-plan.md`)
|
|
26
|
+
2. 批判性审查:识别计划中的问题或关注点
|
|
27
|
+
3. 若有关注点:在开始前向用户提出,待澄清后再执行
|
|
28
|
+
4. 若无关注点:为计划中的任务创建 TodoWrite,然后进入步骤 2
|
|
23
29
|
|
|
24
30
|
### 步骤 2:执行批次
|
|
25
|
-
|
|
31
|
+
**每批默认执行前 3 个任务**(或计划中剩余任务数,取较小者)。
|
|
26
32
|
|
|
27
33
|
对于每个任务:
|
|
28
34
|
1. 标记为进行中
|
|
@@ -45,9 +51,8 @@ description: 当你有一个书面的实施计划,并需要在带有审查检
|
|
|
45
51
|
### 步骤 5:完成开发
|
|
46
52
|
|
|
47
53
|
在所有任务完成并验证后:
|
|
48
|
-
- 声明:"
|
|
49
|
-
-
|
|
50
|
-
- 按照该技能验证测试,提供选项,执行选择
|
|
54
|
+
- 声明:"我正在使用 完成开发分支 ( bc-finish-a-dev ) 技能来完成这项工作。"
|
|
55
|
+
- **必须调用**:**bc-finish-a-dev**(验证测试、提供合并/PR/清理等选项并执行用户选择)
|
|
51
56
|
|
|
52
57
|
## 何时停止并寻求帮助
|
|
53
58
|
|
|
@@ -67,18 +72,19 @@ description: 当你有一个书面的实施计划,并需要在带有审查检
|
|
|
67
72
|
|
|
68
73
|
**不要强行通过阻塞** - 停止并询问。
|
|
69
74
|
|
|
70
|
-
##
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
|
|
75
|
+
## 关键原则
|
|
76
|
+
- 先批判性审查计划,再执行
|
|
77
|
+
- 严格按计划步骤执行,不跳过验证
|
|
78
|
+
- 批次之间只报告并等待反馈,不自动进入下一批
|
|
79
|
+
- 被阻塞时停止并寻求澄清,不猜测
|
|
80
|
+
- 未经用户明确同意,不在 main/master 上直接实施
|
|
81
|
+
- 计划要求时引用相关技能(如 bc-finish-a-dev)
|
|
82
|
+
|
|
83
|
+
## 避免
|
|
84
|
+
- 未审查计划就动手;跳过验证步骤;阻塞时强行通过;批次间不等待就继续;在 main/master 上直接改且未经同意。
|
|
78
85
|
|
|
79
86
|
## 集成
|
|
80
87
|
|
|
81
|
-
|
|
82
|
-
- **bc-use-git-worktrees
|
|
83
|
-
- **bc-
|
|
84
|
-
- **bc-finish-a-dev** - 在所有任务后完成开发
|
|
88
|
+
- **bc-write-plans**:产出本技能所执行的计划文档。
|
|
89
|
+
- **bc-use-git-worktrees**:若需隔离(如不在 main/master 上直接改),在开始前调用以创建工作空间;若用户明确在当前分支执行则可跳过。
|
|
90
|
+
- **bc-finish-a-dev**:所有任务完成并验证后,必须调用以完成合并/PR/清理。
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bc-finish-a-dev
|
|
3
|
-
description:
|
|
3
|
+
description: 实现完成且需决定如何集成时使用。验证测试后呈现合并/PR/保持/放弃四选项,执行选择并清理。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 完成开发分支
|
|
7
7
|
|
|
8
8
|
## 概述
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
在实现完成、验证通过后,呈现 4 个结构化选项(本地合并、创建 PR、保持原样、放弃),按用户选择执行并做相应清理。
|
|
11
11
|
|
|
12
|
-
**核心原则:** 验证测试 → 呈现选项 → 执行选择 →
|
|
12
|
+
**核心原则:** 验证测试 → 呈现选项 → 执行选择 → 按选项清理。
|
|
13
13
|
|
|
14
|
-
**开始时声明:** "
|
|
14
|
+
**开始时声明:** "我正在使用 完成开发分支 ( bc-finish-a-dev ) 技能来完成这项工作。"
|
|
15
|
+
|
|
16
|
+
## 何时使用
|
|
17
|
+
|
|
18
|
+
- **由 bc-execute-plans 在步骤 5 调用**:所有计划任务完成并验证后,必须调用本技能。
|
|
19
|
+
- **或**:用户明确说「完成开发」「合并/PR」「收尾」等,且当前分支工作已就绪时,可直接调用本技能。
|
|
20
|
+
- **输入**:当前分支(或 worktree)上的完成状态;**输出**:按用户选择完成合并/PR/保持/放弃及工作树清理。
|
|
15
21
|
|
|
16
22
|
## 流程
|
|
17
23
|
|
|
@@ -37,14 +43,15 @@ npm test / cargo test / pytest / go test ./...
|
|
|
37
43
|
|
|
38
44
|
**如果测试通过:** 继续到步骤 2。
|
|
39
45
|
|
|
46
|
+
**若项目无测试套件**(如仅有占位 `npm test`):可用构建验证(如 `npm run build`)替代,或经用户确认后跳过验证、直接呈现选项。
|
|
47
|
+
|
|
40
48
|
### 步骤 2:确定基础分支
|
|
41
49
|
|
|
42
50
|
```bash
|
|
43
|
-
# 尝试常见的基础分支
|
|
44
51
|
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
|
|
45
52
|
```
|
|
46
53
|
|
|
47
|
-
|
|
54
|
+
若无法自动确定(如无 main/master),询问用户:"这个分支从哪个分支分叉?是 main 吗?"
|
|
48
55
|
|
|
49
56
|
### 步骤 3:呈现选项
|
|
50
57
|
|
|
@@ -151,49 +158,29 @@ git worktree remove <worktree-path>
|
|
|
151
158
|
|
|
152
159
|
## 快速参考
|
|
153
160
|
|
|
154
|
-
| 选项 | 合并 | 推送 |
|
|
155
|
-
|
|
156
|
-
| 1. 本地合并 | ✓ | - |
|
|
157
|
-
| 2. 创建 PR | - | ✓ |
|
|
158
|
-
| 3. 保持原样 | - | - |
|
|
159
|
-
| 4. 放弃 | - | - |
|
|
160
|
-
|
|
161
|
-
## 常见错误
|
|
162
|
-
|
|
163
|
-
**跳过测试验证**
|
|
164
|
-
- **问题:** 合并损坏的代码,创建失败的 PR
|
|
165
|
-
- **修复:** 在提供选项之前始终验证测试
|
|
161
|
+
| 选项 | 合并 | 推送 | 清理 worktree | 清理分支 |
|
|
162
|
+
|--------|-------|------|-----------------|----------|
|
|
163
|
+
| 1. 本地合并 | ✓ | - | ✓(若在 worktree 中) | ✓ |
|
|
164
|
+
| 2. 创建 PR | - | ✓ | ✓(若在 worktree 中) | - |
|
|
165
|
+
| 3. 保持原样 | - | - | 不清理 | - |
|
|
166
|
+
| 4. 放弃 | - | - | ✓(若在 worktree 中) | ✓ (强制) |
|
|
166
167
|
|
|
167
|
-
|
|
168
|
-
- **问题:** "接下来我应该做什么?" → 模糊不清
|
|
169
|
-
- **修复:** 精确呈现 4 个结构化选项
|
|
168
|
+
步骤 5:仅对选项 1、2、4 在「当前在 worktree 中」时执行 `git worktree remove`;选项 3 不清理。
|
|
170
169
|
|
|
171
|
-
|
|
172
|
-
- **问题:** 在可能需要时移除工作树(选项 2、3)
|
|
173
|
-
- **修复:** 仅为选项 1 和 4 清理
|
|
170
|
+
## 常见错误
|
|
174
171
|
|
|
175
|
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
172
|
+
- **跳过测试验证**:合并/PR 前必须先验证;否则合并损坏代码或创建失败 PR。
|
|
173
|
+
- **开放式问题**:不要问「接下来做什么?」;精确呈现 4 个选项。
|
|
174
|
+
- **错误清理工作树**:仅对选项 1、2、4 在需要时清理 worktree;选项 3 保留工作树。
|
|
175
|
+
- **放弃时无确认**:选项 4 必须要求用户输入 `discard` 确认后再执行。
|
|
178
176
|
|
|
179
|
-
##
|
|
177
|
+
## 避免
|
|
180
178
|
|
|
181
|
-
**永远不要:**
|
|
182
|
-
- 继续处理失败的测试
|
|
183
|
-
- 不验证结果测试就合并
|
|
184
|
-
- 未经确认就删除工作
|
|
185
|
-
- 未经明确请求就强制推送
|
|
179
|
+
**永远不要:** 测试失败仍继续合并/PR;未验证就合并;未经 `discard` 确认就执行放弃;未经请求就强制推送。
|
|
186
180
|
|
|
187
|
-
**始终:**
|
|
188
|
-
- 在提供选项之前验证测试
|
|
189
|
-
- 精确呈现 4 个选项
|
|
190
|
-
- 为选项 4 获取输入确认
|
|
191
|
-
- 仅为选项 1 和 4 清理工作树
|
|
181
|
+
**始终:** 先验证再呈现选项;精确呈现 4 个选项且不添加解释;选项 4 必须获 `discard` 确认;按快速参考表清理工作树(1、2、4 需时则清理,3 保留)。
|
|
192
182
|
|
|
193
183
|
## 集成
|
|
194
184
|
|
|
195
|
-
|
|
196
|
-
- **bc-
|
|
197
|
-
|
|
198
|
-
**与以下技能配合:**
|
|
199
|
-
- **bc-use-git-worktrees** - 清理由该技能创建的工作树
|
|
185
|
+
- **bc-execute-plans**:在所有计划任务完成后,在步骤 5 必须调用本技能。
|
|
186
|
+
- **bc-use-git-worktrees**:若开发在 worktree 中进行,本技能在选项 1、2、4 执行后会清理该 worktree(步骤 5)。
|
|
@@ -1,54 +1,77 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bc-requirements-analysis
|
|
3
|
-
description:
|
|
3
|
+
description: 创造性工作(新功能、组件、行为修改)前必须使用。在实现前探索用户意图、需求与设计。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 将想法转化为设计
|
|
7
7
|
|
|
8
8
|
## 概述
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
通过自然的协作对话,将想法转化为完整的设计与规格。
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
先了解当前项目背景,再**一次只提一个问题**完善想法。理解要构建的内容后,将设计拆成小段(约 200–300 字)呈现,每段后确认是否合理。
|
|
13
13
|
|
|
14
|
-
**开始时声明:** "我正在使用 需求分析 ( bc-requirements-analysis )
|
|
14
|
+
**开始时声明:** "我正在使用 需求分析 ( bc-requirements-analysis ) 技能来探索需求与设计。"
|
|
15
|
+
|
|
16
|
+
## 何时使用
|
|
17
|
+
|
|
18
|
+
- 用户表达「想做某功能」「加个 XX」「优化 Y」「改一下 Z 的行为」等创造性需求时,**先调用本技能**,再写代码或写计划。
|
|
19
|
+
- 与 **bc-write-plans** 衔接:本技能产出设计文档;用户选择「立即执行」时,再调用 bc-write-plans 产出实施计划。
|
|
15
20
|
|
|
16
21
|
## 流程
|
|
17
22
|
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
|
|
23
|
+
**1. 理解想法:**
|
|
24
|
+
- 先查看当前项目状态(相关文件、文档、近期提交)
|
|
25
|
+
- 一次只提一个问题来完善想法
|
|
26
|
+
- 优先用选择题,必要时用开放式问题
|
|
27
|
+
- 若某主题需深入,拆成多个问题逐条问
|
|
28
|
+
- 重点弄清:**目的、约束、成功标准、风险**
|
|
29
|
+
|
|
30
|
+
**2. 探索方法:**
|
|
31
|
+
- 提出 2–3 种方案,说明各自优缺点
|
|
32
|
+
- 以对话方式呈现选项,给出你的建议与理由
|
|
33
|
+
- 先说明你推荐的方案并解释原因
|
|
34
|
+
|
|
35
|
+
**3. 呈现设计:**
|
|
36
|
+
- 确信理解要构建的内容后,再呈现设计
|
|
37
|
+
- 拆成约 200–300 字的小节
|
|
38
|
+
- 每节后问:「到目前为止是否正确?」
|
|
39
|
+
- 覆盖:架构、组件、数据流、错误处理、测试
|
|
40
|
+
- 若某处不合理,随时回到澄清,**不写文档**
|
|
41
|
+
|
|
42
|
+
**4. 设计之后(仅在设计被用户确认后):**
|
|
43
|
+
- 按本技能 **references/design-doc-template.md** 模板填写,将设计写入 `docs/plans/YYYY-MM-DD-<topic>-design.md`(topic 英文短横线,如 `init-tool-selection`),可按实际需求增删小节
|
|
44
|
+
- 若用户选择「修改设计」:先不写文档,回到澄清与修改;再次确认后再写(或覆盖原文档)
|
|
25
45
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- 以对话方式呈现选项,并提供你的建议和理由
|
|
29
|
-
- 先介绍你推荐的选项并解释原因
|
|
46
|
+
**5. 询问下一步:**
|
|
47
|
+
"准备好编写实施计划了吗?可选:立即执行、稍后、修改设计"
|
|
30
48
|
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
- 在每个部分后询问到目前为止是否正确
|
|
35
|
-
- 涵盖:架构、组件、数据流、错误处理、测试
|
|
36
|
-
- 当某些内容不合理时,准备回去澄清
|
|
49
|
+
- **立即执行**:已保存 design 文档 → 调用 **bc-write-plans** 生成实施计划
|
|
50
|
+
- **稍后**:设计已落档,可稍后手动实现或再调用 bc-write-plans
|
|
51
|
+
- **修改设计**:回到澄清与修改设计(不写/不更新文档直至再次确认)
|
|
37
52
|
|
|
38
|
-
##
|
|
53
|
+
## 设计文档模板
|
|
39
54
|
|
|
40
|
-
|
|
41
|
-
- 将验证后的设计写入 `docs/plans/YYYY-MM-DD-<topic>-design.md`
|
|
55
|
+
落档时按此结构填写,必选节保留,可选节按需增删。
|
|
42
56
|
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
57
|
+
- **文档模板**:本技能下 `references/design-doc-template.md`(可复制作为起点)
|
|
58
|
+
- **落档路径**:`docs/plans/YYYY-MM-DD-<topic>-design.md`,`<topic>` 英文短横线(如 `init-tool-selection`)
|
|
59
|
+
- **小改动**:可只保留概述、设计目标、设计方案(1 节)、成功标准
|
|
60
|
+
|
|
61
|
+
## 何时可简化或跳过
|
|
62
|
+
|
|
63
|
+
- 纯 bug 修复、纯文案/配置修改:可跳过完整需求分析。
|
|
64
|
+
- 用户已给出完整规格且无需探索:可简化为「快速确认范围与方案 → 写设计 → 再问是否写计划」。
|
|
46
65
|
|
|
47
66
|
## 关键原则
|
|
48
67
|
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
68
|
+
- **一次一个问题**:不要一次抛出多个问题
|
|
69
|
+
- **首选选择题**:在可能时用选项降低认知负担
|
|
70
|
+
- **严格 YAGNI**:从设计中去掉不必要的功能
|
|
71
|
+
- **探索替代方案**:在定案前至少给出 2–3 种方案及权衡
|
|
72
|
+
- **增量验证**:分小节呈现设计,每节都确认
|
|
73
|
+
- **保持灵活**:发现不合理时,回到澄清而非硬推
|
|
74
|
+
|
|
75
|
+
## 避免
|
|
76
|
+
|
|
77
|
+
- 一次问多个问题;未获用户确认设计就写文档;跳过方案对比直接给单一设计;用户说「要改」仍继续写文档或写计划。
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# [功能/主题名称] 设计
|
|
2
|
+
|
|
3
|
+
**日期**: YYYY-MM-DD
|
|
4
|
+
**状态**: 已确认 | 草稿
|
|
5
|
+
|
|
6
|
+
## 概述
|
|
7
|
+
|
|
8
|
+
(1–3 句)本设计要解决什么问题、达成什么结果。
|
|
9
|
+
|
|
10
|
+
## 需求背景(可选)
|
|
11
|
+
|
|
12
|
+
当前状况、痛点或触发本需求的原因;若无明显背景可省略。
|
|
13
|
+
|
|
14
|
+
## 设计目标
|
|
15
|
+
|
|
16
|
+
1. **目标一**:简短描述
|
|
17
|
+
2. **目标二**:……
|
|
18
|
+
3. **约束/非目标**:不做什么、边界条件(可选)
|
|
19
|
+
|
|
20
|
+
## 设计方案
|
|
21
|
+
|
|
22
|
+
### 1. [子主题一]
|
|
23
|
+
|
|
24
|
+
(200–300 字为宜)具体方案描述,可含流程、交互、数据结构等。
|
|
25
|
+
|
|
26
|
+
### 2. [子主题二]
|
|
27
|
+
|
|
28
|
+
……
|
|
29
|
+
|
|
30
|
+
### N. [子主题 N]
|
|
31
|
+
|
|
32
|
+
……
|
|
33
|
+
|
|
34
|
+
## 技术要点(可选)
|
|
35
|
+
|
|
36
|
+
- 关键依赖、接口、文件/模块
|
|
37
|
+
- 与现有代码的衔接点
|
|
38
|
+
- 实现时需特别注意的点
|
|
39
|
+
|
|
40
|
+
## 成功标准
|
|
41
|
+
|
|
42
|
+
- [ ] 可验证的验收条件 1
|
|
43
|
+
- [ ] 可验证的验收条件 2
|
|
44
|
+
- [ ] ……
|
|
45
|
+
|
|
46
|
+
## 风险与注意事项(可选)
|
|
47
|
+
|
|
48
|
+
- 风险或限制;实现/上线时需注意的事项
|
|
49
|
+
- 后续可优化方向(可选)
|
|
50
|
+
|
|
51
|
+
## 设计之后(可选)
|
|
52
|
+
|
|
53
|
+
- 实现时使用 **bc-write-plans** 生成实施计划;或注明「稍后实现」等。
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bc-use-git-worktrees
|
|
3
|
-
description:
|
|
3
|
+
description: 需要与当前工作空间隔离时使用。创建带目录选择与安全验证的 git worktree,供执行计划或功能开发。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 使用 Git Worktrees
|
|
7
7
|
|
|
8
8
|
## 概述
|
|
9
9
|
|
|
10
|
-
Git
|
|
10
|
+
Git worktree 在同一仓库下创建隔离工作目录,可在多分支并行工作且不切换当前目录。本技能约定:先按优先级选目录,再验证安全(项目本地目录须被 git 忽略),最后创建 worktree 并做基线验证。
|
|
11
11
|
|
|
12
|
-
**核心原则:**
|
|
12
|
+
**核心原则:** 目录选择有优先级 + 项目本地目录必须验证被忽略 + 创建后做干净基线验证。
|
|
13
13
|
|
|
14
|
-
**开始时声明:** "我正在使用
|
|
14
|
+
**开始时声明:** "我正在使用 Git Worktrees ( bc-use-git-worktrees ) 技能来设置隔离的工作空间。"
|
|
15
|
+
|
|
16
|
+
## 何时使用
|
|
17
|
+
|
|
18
|
+
- **由 bc-execute-plans 在开始执行计划前调用**:若需隔离(不在 main/master 上直接改),先调用本技能创建工作空间,再逐任务执行;若用户明确在当前分支执行则可跳过。
|
|
19
|
+
- **或**:用户明确要求「用 worktree」「隔离开发」「新建分支做 XX」时,直接调用本技能。
|
|
20
|
+
- **输出**:worktree 路径、干净基线(依赖安装 + 测试通过),供后续实施计划或开发使用。
|
|
15
21
|
|
|
16
22
|
## 目录选择流程
|
|
17
23
|
|
|
@@ -27,17 +33,19 @@ ls -d worktrees 2>/dev/null # 替代
|
|
|
27
33
|
|
|
28
34
|
**如果找到:** 使用该目录。如果两者都存在,`.worktrees` 获胜。
|
|
29
35
|
|
|
30
|
-
### 2.
|
|
36
|
+
### 2. 检查项目配置(可选)
|
|
37
|
+
|
|
38
|
+
若项目有约定 worktree 目录(如 `CLAUDE.md`、`README` 中说明),按约定读取:
|
|
31
39
|
|
|
32
40
|
```bash
|
|
33
41
|
grep -i "worktree.*director" CLAUDE.md 2>/dev/null
|
|
34
42
|
```
|
|
35
43
|
|
|
36
|
-
|
|
44
|
+
**若找到首选项:** 使用它,不询问。
|
|
37
45
|
|
|
38
46
|
### 3. 询问用户
|
|
39
47
|
|
|
40
|
-
|
|
48
|
+
若不存在目录且无项目配置首选项:
|
|
41
49
|
|
|
42
50
|
```
|
|
43
51
|
未找到 worktree 目录。我应该在哪里创建 worktrees?
|
|
@@ -74,6 +82,8 @@ git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/d
|
|
|
74
82
|
|
|
75
83
|
## 创建步骤
|
|
76
84
|
|
|
85
|
+
**前置**:已完成目录选择流程并得到 `LOCATION`(.worktrees / worktrees / 全局路径);`BRANCH_NAME` 由实施计划中的功能名或用户指定(如 `feature/xxx`)。
|
|
86
|
+
|
|
77
87
|
### 1. 检测项目名称
|
|
78
88
|
|
|
79
89
|
```bash
|
|
@@ -129,10 +139,12 @@ pytest
|
|
|
129
139
|
go test ./...
|
|
130
140
|
```
|
|
131
141
|
|
|
132
|
-
**如果测试失败:**
|
|
142
|
+
**如果测试失败:** 报告失败,询问用户是否继续或先调查。
|
|
133
143
|
|
|
134
144
|
**如果测试通过:** 报告就绪。
|
|
135
145
|
|
|
146
|
+
**若项目无测试命令**(如仅有占位 `npm test`):可只做构建验证(如 `npm run build`),或经用户确认后跳过基线验证。
|
|
147
|
+
|
|
136
148
|
### 5. 报告位置
|
|
137
149
|
|
|
138
150
|
```
|
|
@@ -148,7 +160,7 @@ Worktree 准备就绪在 <full-path>
|
|
|
148
160
|
| `.worktrees/` 存在 | 使用它(验证被忽略) |
|
|
149
161
|
| `worktrees/` 存在 | 使用它(验证被忽略) |
|
|
150
162
|
| 两者都存在 | 使用 `.worktrees/` |
|
|
151
|
-
| 都不存在 |
|
|
163
|
+
| 都不存在 | 检查项目配置 → 询问用户 |
|
|
152
164
|
| 目录未被忽略 | 添加到 .gitignore + 提交 |
|
|
153
165
|
| 基线期间测试失败 | 报告失败 + 询问 |
|
|
154
166
|
| 无 package.json/Cargo.toml | 跳过依赖安装 |
|
|
@@ -163,7 +175,7 @@ Worktree 准备就绪在 <full-path>
|
|
|
163
175
|
### 假设目录位置
|
|
164
176
|
|
|
165
177
|
- **问题:** 创建不一致,违反项目约定
|
|
166
|
-
- **修复:**
|
|
178
|
+
- **修复:** 遵循优先级:现有目录 > 项目配置 > 询问用户
|
|
167
179
|
|
|
168
180
|
### 在测试失败时继续
|
|
169
181
|
|
|
@@ -178,7 +190,7 @@ Worktree 准备就绪在 <full-path>
|
|
|
178
190
|
## 示例工作流
|
|
179
191
|
|
|
180
192
|
```
|
|
181
|
-
你:我正在使用 bc-
|
|
193
|
+
你:我正在使用 Git Worktrees ( bc-use-git-worktrees ) 技能来设置隔离的工作空间。
|
|
182
194
|
|
|
183
195
|
[检查 .worktrees/ - 存在]
|
|
184
196
|
[验证被忽略 - git check-ignore 确认 .worktrees/ 被忽略]
|
|
@@ -191,27 +203,13 @@ Worktree 准备就绪在 /Users/jesse/myproject/.worktrees/auth
|
|
|
191
203
|
准备实现 auth 功能
|
|
192
204
|
```
|
|
193
205
|
|
|
194
|
-
##
|
|
206
|
+
## 避免
|
|
195
207
|
|
|
196
|
-
**永远不要:**
|
|
197
|
-
- 创建 worktree 而不验证它被忽略(项目本地)
|
|
198
|
-
- 跳过基线测试验证
|
|
199
|
-
- 在未询问的情况下继续失败的测试
|
|
200
|
-
- 在模棱两可时假没目录位置
|
|
201
|
-
- 跳过 CLAUDE.md 检查
|
|
208
|
+
**永远不要:** 在未验证项目本地目录被 git 忽略的情况下创建 worktree;跳过基线测试;测试失败未获用户确认就继续;在目录不明确时假设位置;跳过目录优先级(现有 > 配置 > 询问)。
|
|
202
209
|
|
|
203
|
-
**始终:**
|
|
204
|
-
- 遵循目录优先级:现有 > CLAUDE.md > 询问
|
|
205
|
-
- 验证项目本地目录被忽略
|
|
206
|
-
- 自动检测并运行项目设置
|
|
207
|
-
- 验证干净的测试基线
|
|
210
|
+
**始终:** 按优先级选目录;项目本地目录必须 `git check-ignore` 通过;自动检测并运行项目设置(npm/cargo/pip 等);创建后跑基线测试并报告结果。
|
|
208
211
|
|
|
209
212
|
## 集成
|
|
210
213
|
|
|
211
|
-
|
|
212
|
-
- **bc-
|
|
213
|
-
- **bc-execute-plans** - 在执行任何任务之前必需
|
|
214
|
-
- 任何需要隔离工作空间的技能
|
|
215
|
-
|
|
216
|
-
**与以下技能配合:**
|
|
217
|
-
- **bc-finish-a-dev** - 工作完成后清理必需
|
|
214
|
+
- **bc-execute-plans**:若需隔离,在开始执行计划前调用本技能创建 worktree;执行完成后由 **bc-finish-a-dev** 在选项 1、2、4 时清理该 worktree。
|
|
215
|
+
- **bc-finish-a-dev**:在选项 1、2、4 执行后会检查当前是否在 worktree 中,若是则执行 `git worktree remove` 清理。
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bc-using-bcoder
|
|
3
|
-
description:
|
|
3
|
+
description: 对话开始时使用。确立如何查找和使用技能;在任何响应(含澄清)之前先调用 Skill 工具。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# 使用 BCoder 技能
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
如果你认为即使只有 1% 的机会技能可能适用于你正在做的事情,你绝对必须调用技能。
|
|
8
|
+
## 概述
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
本技能规定:**先查技能,再响应**。若你认为有哪怕 1% 可能适用,必须先调用技能检查;若适用则必须使用,不可跳过。
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
**开始时声明:** "我正在使用 BCoder ( bc-using-bcoder ) 技能。"
|
|
13
|
+
|
|
14
|
+
**极端重要:** 技能可能适用时,必须调用技能。适用则必须使用。不可协商、不可跳过、不可合理化绕过。
|
|
15
15
|
|
|
16
16
|
## 如何访问技能
|
|
17
17
|
|
|
@@ -19,11 +19,9 @@ description: 当开始任何对话时使用 - 确立如何查找和使用技能
|
|
|
19
19
|
|
|
20
20
|
**在其他环境中:** 检查你平台的文档以了解如何加载技能。
|
|
21
21
|
|
|
22
|
-
# 使用技能
|
|
23
|
-
|
|
24
22
|
## 规则
|
|
25
23
|
|
|
26
|
-
|
|
24
|
+
**先调用技能,再响应或操作。** 有 1% 可能适用就调用检查;若调用后确认不适用,可不采用。不要用「先澄清/先看代码」等理由延后调用。
|
|
27
25
|
|
|
28
26
|
```dot
|
|
29
27
|
digraph skill_flow {
|
|
@@ -68,24 +66,23 @@ digraph skill_flow {
|
|
|
68
66
|
|
|
69
67
|
## 技能优先级
|
|
70
68
|
|
|
71
|
-
|
|
69
|
+
当多个技能可能适用时,按此顺序:
|
|
72
70
|
|
|
73
|
-
1.
|
|
74
|
-
2.
|
|
71
|
+
1. **流程技能优先**:bc-requirements-analysis(需求与设计)→ bc-write-plans(实施计划)→ bc-execute-plans(逐任务执行)
|
|
72
|
+
2. **收尾技能**:bc-finish-a-dev(合并/PR/清理)
|
|
75
73
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
**示例:**
|
|
75
|
+
- 「想做 X」「加个 Y」「优化 Z」→ 先 **bc-requirements-analysis**,设计确认后再 **bc-write-plans**,再 **bc-execute-plans**
|
|
76
|
+
- 「按计划实现」「执行计划」→ **bc-execute-plans**
|
|
77
|
+
- 「完成开发」「合并/PR」→ **bc-finish-a-dev**
|
|
80
78
|
|
|
81
|
-
|
|
79
|
+
**领域/场景技能**(如 bc-create-backend-project、bc-use-git-worktrees)在流程确定后按场景选用,技能内会说明何时适用。
|
|
82
80
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
**灵活**(模式):将原则适应到上下文。
|
|
81
|
+
## 技能类型
|
|
86
82
|
|
|
87
|
-
|
|
83
|
+
- **刚性**(如 TDD、execute-plans):完全遵循,不跳过步骤。
|
|
84
|
+
- **灵活**(如模式、建议):将原则适应到上下文。技能内会说明属于哪种。
|
|
88
85
|
|
|
89
86
|
## 用户指令
|
|
90
87
|
|
|
91
|
-
|
|
88
|
+
用户说 WHAT(「添加 X」「修复 Y」),不说 HOW。**不因「看起来简单」就跳过工作流**——先查技能,再响应。
|
|
@@ -1,95 +1,67 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bc-write-plans
|
|
3
|
-
description:
|
|
3
|
+
description: 多步骤任务的规格或设计确定后使用,在接触代码之前产出可执行实施计划。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 编写计划
|
|
7
7
|
|
|
8
8
|
## 概述
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
假设他们是熟练的开发人员,但几乎不了解我们的工具集或问题域。假设他们不太了解良好的测试设计。
|
|
10
|
+
编写全面的实施计划,假设执行者对代码库零上下文。记录每个任务要接触的文件、代码、测试与验证方式、如何运行与提交。计划拆成可咬大小(约 2–5 分钟/步)的任务。DRY、YAGNI、频繁提交;有测试时优先 TDD。
|
|
13
11
|
|
|
14
12
|
**开始时声明:** "我正在使用 编写计划 ( bc-write-plans ) 技能来创建实施计划。"
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## 小颗粒度任务
|
|
19
|
-
|
|
20
|
-
**每个步骤是一个动作(2-5 分钟):**
|
|
21
|
-
- "编写失败测试" - 步骤
|
|
22
|
-
- "运行以确保它失败" - 步骤
|
|
23
|
-
- "编写最小代码以使测试通过" - 步骤
|
|
24
|
-
- "运行测试并确保它们通过" - 步骤
|
|
25
|
-
- "提交" - 步骤
|
|
26
|
-
|
|
27
|
-
## 计划文档头
|
|
28
|
-
|
|
29
|
-
**每个计划必须以此头开始:**
|
|
30
|
-
|
|
31
|
-
```markdown
|
|
32
|
-
# [功能名称] 实施计划
|
|
14
|
+
**计划保存到:** `docs/plans/YYYY-MM-DD-<topic>-plan.md`(`<topic>` 与设计文档一致,英文短横线,如 `init-tool-selection`)
|
|
33
15
|
|
|
34
|
-
|
|
16
|
+
## 何时使用
|
|
35
17
|
|
|
36
|
-
|
|
18
|
+
- 用户在设计确认后选择「立即执行」,或已有设计/规格文档且要求写实施计划时,**调用本技能**。
|
|
19
|
+
- **输入**:通常为 bc-requirements-analysis 产出的 `docs/plans/YYYY-MM-DD-<topic>-design.md`,或等价规格。
|
|
20
|
+
- **输出**:`docs/plans/YYYY-MM-DD-<topic>-plan.md`,供 bc-execute-plans 逐任务执行。
|
|
37
21
|
|
|
38
|
-
|
|
22
|
+
## 流程
|
|
39
23
|
|
|
40
|
-
|
|
24
|
+
1. **读设计/规格**:读取 design 文档或等价规格,确认目标、架构、技术栈与成功标准。
|
|
25
|
+
2. **写计划头**:按本技能 `references/plan-doc-template.md` 中的计划文档头填写,目标/架构/技术栈与设计一致。
|
|
26
|
+
3. **拆任务**:按设计拆成可咬大小的任务(每任务约 2–5 分钟),每任务对应明确文件与步骤。
|
|
27
|
+
4. **写每任务步骤**:按模板中的任务结构,写明文件路径、具体代码或命令、运行命令与预期输出。
|
|
28
|
+
5. **保存**:落档到 `docs/plans/YYYY-MM-DD-<topic>-plan.md`,`<topic>` 与设计文档一致。
|
|
29
|
+
6. **执行交接**:提供执行选项(检查文档、立即执行、稍后执行)。
|
|
41
30
|
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## 任务结构
|
|
46
|
-
|
|
47
|
-
```markdown
|
|
48
|
-
### 任务 N:[组件名称]
|
|
49
|
-
|
|
50
|
-
**文件:**
|
|
51
|
-
- 创建:`exact/path/to/file.py`
|
|
52
|
-
- 修改:`exact/path/to/existing.py:123-145`
|
|
53
|
-
- 测试:`tests/exact/path/to/test.py`
|
|
31
|
+
## 小颗粒度任务
|
|
54
32
|
|
|
55
|
-
|
|
33
|
+
**每个步骤是一个动作(约 2–5 分钟):**
|
|
34
|
+
- 有测试时(TDD):编写失败测试 → 运行以验证失败 → 编写最小实现 → 运行以验证通过 → 提交
|
|
35
|
+
- 无测试或仅构建验证时:编写/修改代码 → 运行构建或验证命令 → 提交
|
|
36
|
+
- 始终:**精确文件路径、完整代码片段(非「添加验证」)、带预期输出的命令**
|
|
56
37
|
|
|
57
|
-
|
|
58
|
-
def test_specific_behavior():
|
|
59
|
-
result = function(input)
|
|
60
|
-
assert result == expected
|
|
61
|
-
```
|
|
38
|
+
## 计划文档模板
|
|
62
39
|
|
|
63
|
-
|
|
40
|
+
- **模板**:本技能下 `references/plan-doc-template.md`(含计划文档头、任务结构示例与说明);落档时按此填写,任务粒度见上方「小颗粒度任务」。
|
|
41
|
+
- **落档路径**:`docs/plans/YYYY-MM-DD-<topic>-plan.md`,`<topic>` 与设计文档一致,英文短横线(如 `init-tool-selection`)。
|
|
64
42
|
|
|
65
|
-
|
|
66
|
-
预期:失败并显示"function not defined"
|
|
43
|
+
## 关键原则
|
|
67
44
|
|
|
68
|
-
|
|
45
|
+
- **精确路径**:每个任务写明创建/修改/测试的完整路径
|
|
46
|
+
- **完整代码**:计划中写清代码片段或关键逻辑,不用「添加验证」等模糊表述
|
|
47
|
+
- **可验证命令**:每步给出运行命令与预期输出
|
|
48
|
+
- **可咬大小**:单任务 2–5 分钟可完成,DRY、YAGNI、频繁提交
|
|
49
|
+
- **引用技能**:需要时用 @ 语法引用相关技能(如 bc-execute-plans)
|
|
69
50
|
|
|
70
|
-
|
|
71
|
-
def function(input):
|
|
72
|
-
return expected
|
|
73
|
-
```
|
|
51
|
+
## 避免
|
|
74
52
|
|
|
75
|
-
|
|
53
|
+
- 任务过大、缺少文件路径;步骤只有「添加 XX」无具体代码或命令;跳过验证步骤;计划与设计文档 topic 不一致。
|
|
76
54
|
|
|
77
|
-
|
|
78
|
-
预期:通过
|
|
55
|
+
## 何时可简化
|
|
79
56
|
|
|
80
|
-
|
|
81
|
-
- 始终精确的文件路径
|
|
82
|
-
- 计划中的完整代码(不是"添加验证")
|
|
83
|
-
- 带有预期输出的精确命令
|
|
84
|
-
- 使用 @ 语法引用相关技能
|
|
85
|
-
- DRY、YAGNI、TDD、频繁提交
|
|
57
|
+
- 改动极小(1–2 步可完成):可写简版计划(仅计划头 + 一两项任务),或经用户同意后直接实现。
|
|
86
58
|
|
|
87
59
|
## 执行交接
|
|
88
60
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
**"计划完成并保存到 `docs/plans/<filename>.md`。两个执行选项:"**
|
|
61
|
+
保存计划后,提供执行选择(保持选项简洁,不展开解释):
|
|
92
62
|
|
|
93
|
-
**
|
|
63
|
+
**"计划完成并保存到 `docs/plans/YYYY-MM-DD-<topic>-plan.md`。执行选项:"**
|
|
94
64
|
|
|
95
|
-
|
|
65
|
+
1. **检查文档**:查看设计及计划文档,确认无误后再执行
|
|
66
|
+
2. **立即执行**:调用 **bc-execute-plans** 逐任务执行
|
|
67
|
+
3. **稍后执行**:计划已落档,稍后手动按计划实现或再调用 bc-execute-plans
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 计划文档模板
|
|
2
|
+
|
|
3
|
+
每个计划必须以此头开始,任务按下方结构编写。示例为 TDD/Python;其他技术栈替换为对应测试/构建命令(如 `npm run build`、`npm test`);无测试时任务可为:编写/修改 → 验证构建 → 提交。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 计划文档头(必选)
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
# [功能名称] 实施计划
|
|
11
|
+
|
|
12
|
+
> **对于 AI编程工具 (如 Claude 或 Cursor 等):** 必需子技能:使用 bc-execute-plans 来逐任务实施此计划。
|
|
13
|
+
|
|
14
|
+
**目标:** [一句话描述这构建什么]
|
|
15
|
+
|
|
16
|
+
**架构:** [2-3 句话关于方法]
|
|
17
|
+
|
|
18
|
+
**技术栈:** [关键技术/库]
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 任务结构示例(TDD / Python)
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
### 任务 N:[组件名称]
|
|
29
|
+
|
|
30
|
+
**文件:**
|
|
31
|
+
- 创建:`exact/path/to/file.py`
|
|
32
|
+
- 修改:`exact/path/to/existing.py:123-145`
|
|
33
|
+
- 测试:`tests/exact/path/to/test.py`
|
|
34
|
+
|
|
35
|
+
**步骤 1:编写失败测试**
|
|
36
|
+
|
|
37
|
+
(此处写完整测试代码,非「添加验证」)
|
|
38
|
+
|
|
39
|
+
**步骤 2:运行测试以验证它失败**
|
|
40
|
+
|
|
41
|
+
运行:`pytest tests/path/test.py::test_name -v`
|
|
42
|
+
预期:失败并显示"function not defined"
|
|
43
|
+
|
|
44
|
+
**步骤 3:编写最小实现**
|
|
45
|
+
|
|
46
|
+
(此处写完整实现代码)
|
|
47
|
+
|
|
48
|
+
**步骤 4:运行测试以验证它通过**
|
|
49
|
+
|
|
50
|
+
运行:`pytest tests/path/test.py::test_name -v`
|
|
51
|
+
预期:通过
|
|
52
|
+
|
|
53
|
+
**步骤 5:提交**
|
|
54
|
+
|
|
55
|
+
运行:`git add ... && git commit -m "..."`
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
无测试或仅构建验证时,任务可为:**步骤 1:编写/修改代码** → **步骤 2:运行构建或验证命令** → **步骤 3:提交**。每步写明精确路径、完整代码或命令、预期输出。
|
package/dist/cli/index.js
CHANGED
|
@@ -65,18 +65,18 @@ program
|
|
|
65
65
|
try {
|
|
66
66
|
const stats = await fs_1.promises.stat(resolvedPath);
|
|
67
67
|
if (!stats.isDirectory()) {
|
|
68
|
-
throw new Error(
|
|
68
|
+
throw new Error(`路径 "${targetPath}" 不是目录`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
catch (error) {
|
|
72
72
|
if (error.code === 'ENOENT') {
|
|
73
|
-
console.log(
|
|
73
|
+
console.log(`目录 "${targetPath}" 不存在,将被创建。`);
|
|
74
74
|
}
|
|
75
75
|
else if (error.message && error.message.includes('not a directory')) {
|
|
76
|
-
throw
|
|
76
|
+
throw new Error(`路径 "${targetPath}" 不是目录`);
|
|
77
77
|
}
|
|
78
78
|
else {
|
|
79
|
-
throw new Error(
|
|
79
|
+
throw new Error(`无法访问路径 "${targetPath}":${error.message}`);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
spinner.succeed(chalk_1.default.green("初始化完成,下一步将进行工具选择!")); // 绿色文字
|
|
@@ -90,18 +90,22 @@ program
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
catch (err) {
|
|
93
|
-
spinner.fail(err?.message ?? "
|
|
93
|
+
spinner.fail(chalk_1.default.red(err?.message ?? "工具选择无效"));
|
|
94
94
|
process.exit(1);
|
|
95
95
|
}
|
|
96
|
+
// 允许 toolIds 为空数组(用户选择跳过)
|
|
96
97
|
if (toolIds.length > 0) {
|
|
97
98
|
await (0, tools_1.writeToolStructure)(resolvedPath, toolIds);
|
|
98
99
|
await (0, tools_1.copyBcoderToToolFolders)(resolvedPath, toolIds);
|
|
100
|
+
spinner.succeed(`初始化完成:${resolvedPath}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
spinner.succeed(chalk_1.default.yellow(`初始化完成:${resolvedPath}(未配置工具,可稍后手动配置)`));
|
|
99
104
|
}
|
|
100
|
-
spinner.succeed(`初始化完成:${resolvedPath}`);
|
|
101
105
|
}
|
|
102
106
|
catch (error) {
|
|
103
107
|
console.log();
|
|
104
|
-
spinner.fail(
|
|
108
|
+
spinner.fail(chalk_1.default.red(`错误:${error.message}`));
|
|
105
109
|
process.exit(1);
|
|
106
110
|
}
|
|
107
111
|
});
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC,CAAC,0BAA0B;AAC/D,2BAAoC,CAAC,aAAa;AAClD,2CAA6B,CAAC,yBAAyB;AAKvD,8CAAsB;AACtB,kDAA0B;AAC1B,kDAA0B;AAG1B,uCAAiD;AACjD,mCAMiB;AAGjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAElD,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,qBAAqB,CAAC;KAClC,OAAO,CAAC,OAAO,CAAC,CAAC;AAElB,OAAO;KACN,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACjC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC;KACjC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,EAAE,OAA6C,EAAE,EAAE;IAChF,IAAI,OAAO,GAAG,IAAA,aAAG,GAAE,CAAC;IACpB,IAAA,eAAK,GAAE,CAAC;IACR,MAAM,IAAA,8BAAoB,GAAE,CAAC;IAC7B,OAAO,GAAG,IAAA,aAAG,EAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,aAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/cli/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/cli/tools.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW,uCAAwC,CAAC;AACjE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIrD,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQpE;AAmDD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B7D;AAED,uDAAuD;AACvD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AA6BD,yDAAyD;AACzD,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,kDAAkD;AAClD,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBjF;AAED,8DAA8D;AAC9D,wBAAsB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAenF;AAGD,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F"}
|
package/dist/cli/tools.js
CHANGED
|
@@ -32,6 +32,9 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.TOOL_DISPLAY_NAMES = exports.VALID_TOOLS = void 0;
|
|
37
40
|
exports.parseToolsOption = parseToolsOption;
|
|
@@ -43,6 +46,7 @@ exports.updateBcoderInToolFolders = updateBcoderInToolFolders;
|
|
|
43
46
|
exports.writeToolStructure = writeToolStructure;
|
|
44
47
|
const fs_1 = require("fs");
|
|
45
48
|
const path = __importStar(require("path"));
|
|
49
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
50
|
const prompts_1 = require("@inquirer/prompts");
|
|
47
51
|
exports.VALID_TOOLS = ["cursor", "claude", "trae"];
|
|
48
52
|
exports.TOOL_DISPLAY_NAMES = {
|
|
@@ -56,17 +60,76 @@ function parseToolsOption(value) {
|
|
|
56
60
|
const parts = value.split(",").map((s) => s.trim().toLowerCase()).filter(Boolean);
|
|
57
61
|
const invalid = parts.filter((p) => !exports.VALID_TOOLS.includes(p));
|
|
58
62
|
if (invalid.length > 0) {
|
|
59
|
-
throw new Error(
|
|
63
|
+
throw new Error(`无效的工具:${invalid.join(", ")}。允许的工具:cursor, claude, trae`);
|
|
60
64
|
}
|
|
61
65
|
return [...new Set(parts)];
|
|
62
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* 格式化已选工具显示名称
|
|
69
|
+
* @param toolIds 工具 ID 数组
|
|
70
|
+
* @returns 格式化的工具名称字符串
|
|
71
|
+
*/
|
|
72
|
+
function formatSelectedTools(toolIds) {
|
|
73
|
+
if (toolIds.length === 0)
|
|
74
|
+
return "无";
|
|
75
|
+
return toolIds.map(id => exports.TOOL_DISPLAY_NAMES[id] ?? id).join(",");
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 显示选择确认预览
|
|
79
|
+
* @param toolIds 已选择的工具 ID 数组
|
|
80
|
+
* @returns Promise<boolean> 用户是否确认
|
|
81
|
+
*/
|
|
82
|
+
async function showConfirmationPreview(toolIds) {
|
|
83
|
+
const toolNames = toolIds.map(id => exports.TOOL_DISPLAY_NAMES[id] ?? id);
|
|
84
|
+
console.log(chalk_1.default.cyan("\n您选择了以下工具:"));
|
|
85
|
+
toolNames.forEach(name => {
|
|
86
|
+
console.log(chalk_1.default.green(` ✓ ${name}`));
|
|
87
|
+
});
|
|
88
|
+
console.log(); // 空行
|
|
89
|
+
return await (0, prompts_1.confirm)({
|
|
90
|
+
message: "确认继续?",
|
|
91
|
+
default: true,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 处理未选择工具的情况
|
|
96
|
+
* @returns Promise<'retry' | 'skip'> 用户选择的操作
|
|
97
|
+
*/
|
|
98
|
+
async function handleEmptySelection() {
|
|
99
|
+
console.log(chalk_1.default.yellow("\n⚠ 您还没有选择任何工具"));
|
|
100
|
+
console.log();
|
|
101
|
+
const action = await (0, prompts_1.select)({
|
|
102
|
+
message: "请选择操作:",
|
|
103
|
+
choices: [
|
|
104
|
+
{ name: "重新选择工具", value: "retry" },
|
|
105
|
+
{ name: "确认跳过(稍后手动配置)", value: "skip" },
|
|
106
|
+
],
|
|
107
|
+
});
|
|
108
|
+
return action;
|
|
109
|
+
}
|
|
63
110
|
async function promptToolSelection() {
|
|
64
111
|
const answers = await (0, prompts_1.checkbox)({
|
|
65
|
-
message: "
|
|
112
|
+
message: "请选择要配置的 AI 编程工具\n" +
|
|
113
|
+
chalk_1.default.gray("提示:使用 ↑↓ 键移动,空格键选择/取消,Enter 确认"),
|
|
66
114
|
choices: exports.VALID_TOOLS.map((id) => ({ name: exports.TOOL_DISPLAY_NAMES[id] ?? id, value: id })),
|
|
67
115
|
});
|
|
68
116
|
if (answers.length === 0) {
|
|
69
|
-
|
|
117
|
+
// 友好处理未选择情况
|
|
118
|
+
const action = await handleEmptySelection();
|
|
119
|
+
if (action === 'retry') {
|
|
120
|
+
// 重新选择
|
|
121
|
+
return await promptToolSelection();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// 跳过,返回空数组
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// 显示确认预览
|
|
129
|
+
const confirmed = await showConfirmationPreview(answers);
|
|
130
|
+
if (!confirmed) {
|
|
131
|
+
// 用户选择取消,递归调用重新选择
|
|
132
|
+
return await promptToolSelection();
|
|
70
133
|
}
|
|
71
134
|
return [...answers];
|
|
72
135
|
}
|
package/dist/cli/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/cli/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/cli/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bcoder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "极轻量级的企业 AI Coding 助手:init 初始化项目与 AI 工具目录,update 同步 bcoder 模板",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"url": ""
|
|
32
32
|
},
|
|
33
33
|
"engines": {
|
|
34
|
-
"node": ">=
|
|
34
|
+
"node": ">=20"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/clear": "^0.1.4",
|