@devcxl/opencode-cabbage 0.1.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 +88 -0
- package/assets/agents/dev-lifecycle.md +135 -0
- package/assets/agents/team/architect.md +36 -0
- package/assets/agents/team/backend.md +44 -0
- package/assets/agents/team/frontend.md +41 -0
- package/assets/agents/team/reviewer.md +56 -0
- package/assets/commands/code.md +4 -0
- package/assets/commands/design.md +4 -0
- package/assets/commands/handoff.md +4 -0
- package/assets/commands/release.md +4 -0
- package/assets/commands/requirements.md +4 -0
- package/assets/commands/review.md +4 -0
- package/assets/commands/setup.md +4 -0
- package/assets/commands/tasks.md +4 -0
- package/assets/commands/test.md +4 -0
- package/assets/context/CONTEXT.md +40 -0
- package/assets/prompts/ADR-FORMAT.md +45 -0
- package/assets/prompts/PRD-FORMAT.md +17 -0
- package/assets/prompts/bootstrap.md +19 -0
- package/assets/skills/flow-code/SKILL.md +93 -0
- package/assets/skills/flow-design/SKILL.md +70 -0
- package/assets/skills/flow-handoff/SKILL.md +47 -0
- package/assets/skills/flow-release/SKILL.md +50 -0
- package/assets/skills/flow-requirements/SKILL.md +48 -0
- package/assets/skills/flow-requirements/references/interview-guide.md +35 -0
- package/assets/skills/flow-review/SKILL.md +88 -0
- package/assets/skills/flow-review/references/smell-baseline.md +18 -0
- package/assets/skills/flow-setup/SKILL.md +43 -0
- package/assets/skills/flow-tasks/SKILL.md +104 -0
- package/assets/skills/flow-test/SKILL.md +44 -0
- package/assets/templates/gitignore +5 -0
- package/dist/flowrun/audit.d.ts +5 -0
- package/dist/flowrun/audit.js +67 -0
- package/dist/flowrun/audit.js.map +1 -0
- package/dist/flowrun/gate.d.ts +18 -0
- package/dist/flowrun/gate.js +130 -0
- package/dist/flowrun/gate.js.map +1 -0
- package/dist/flowrun/github.d.ts +20 -0
- package/dist/flowrun/github.js +134 -0
- package/dist/flowrun/github.js.map +1 -0
- package/dist/flowrun/index.d.ts +7 -0
- package/dist/flowrun/index.js +8 -0
- package/dist/flowrun/index.js.map +1 -0
- package/dist/flowrun/merge.d.ts +24 -0
- package/dist/flowrun/merge.js +116 -0
- package/dist/flowrun/merge.js.map +1 -0
- package/dist/flowrun/resilience.d.ts +18 -0
- package/dist/flowrun/resilience.js +80 -0
- package/dist/flowrun/resilience.js.map +1 -0
- package/dist/flowrun/types.d.ts +81 -0
- package/dist/flowrun/types.js +20 -0
- package/dist/flowrun/types.js.map +1 -0
- package/dist/flowrun/validator.d.ts +9 -0
- package/dist/flowrun/validator.js +97 -0
- package/dist/flowrun/validator.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/agents.d.ts +15 -0
- package/dist/plugin/agents.js +64 -0
- package/dist/plugin/agents.js.map +1 -0
- package/dist/plugin/bootstrap.d.ts +3 -0
- package/dist/plugin/bootstrap.js +17 -0
- package/dist/plugin/bootstrap.js.map +1 -0
- package/dist/plugin/commands.d.ts +16 -0
- package/dist/plugin/commands.js +62 -0
- package/dist/plugin/commands.js.map +1 -0
- package/dist/plugin/goal.d.ts +41 -0
- package/dist/plugin/goal.js +194 -0
- package/dist/plugin/goal.js.map +1 -0
- package/dist/plugin/prompts.d.ts +3 -0
- package/dist/plugin/prompts.js +26 -0
- package/dist/plugin/prompts.js.map +1 -0
- package/dist/plugin/server.d.ts +2 -0
- package/dist/plugin/server.js +269 -0
- package/dist/plugin/server.js.map +1 -0
- package/dist/plugin/skills.d.ts +1 -0
- package/dist/plugin/skills.js +39 -0
- package/dist/plugin/skills.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.js +9 -0
- package/dist/plugin.js.map +1 -0
- package/dist/util/fs.d.ts +1 -0
- package/dist/util/fs.js +11 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/gh.d.ts +4 -0
- package/dist/util/gh.js +7 -0
- package/dist/util/gh.js.map +1 -0
- package/dist/util/paths.d.ts +17 -0
- package/dist/util/paths.js +78 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/shell.d.ts +1 -0
- package/dist/util/shell.js +4 -0
- package/dist/util/shell.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-design
|
|
3
|
+
description: 技术方案设计 → 方案文档 + ADR 输出
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-design
|
|
7
|
+
|
|
8
|
+
基于 PRD 进行技术方案设计,输出方案文档和 ADR。
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
- `/requirements` 已完成 → `docs/prd/<title>.md` + Parent Issue 存在
|
|
12
|
+
- 阅读 `../CONTEXT.md` 了解领域术语
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
### 1. 阅读上下文
|
|
17
|
+
- 阅读 PRD:`docs/prd/<title>.md`
|
|
18
|
+
- 阅读已有 ADR:`docs/adr/`(确保设计不与已有架构决策冲突)
|
|
19
|
+
- 阅读 `docs/dev/out-of-scope.md`(了解已排除范围)
|
|
20
|
+
|
|
21
|
+
### 2. 技术方案设计
|
|
22
|
+
输出到 `docs/dev/specs/<title>.md`,包含:
|
|
23
|
+
- 技术选型与理由
|
|
24
|
+
- 架构与数据流
|
|
25
|
+
- API / 数据模型
|
|
26
|
+
- 与已有的 ADR 的兼容性检查
|
|
27
|
+
|
|
28
|
+
### 3. 记录 ADR
|
|
29
|
+
为每个关键决策记录 ADR 到 `docs/adr/<YYYY-MM-DD>-<slug>.md`。
|
|
30
|
+
ADR 格式参考 `../_prompts/adr-format`。
|
|
31
|
+
|
|
32
|
+
ADR 至少记录:
|
|
33
|
+
- 技术选型决策
|
|
34
|
+
- 架构模式决策
|
|
35
|
+
- 任何可能有争议的方案选择
|
|
36
|
+
|
|
37
|
+
### 4. 附到 GitHub Issue
|
|
38
|
+
```bash
|
|
39
|
+
mkdir -p docs/dev/handoff
|
|
40
|
+
cat > docs/dev/handoff/design-comment.md << 'EOF'
|
|
41
|
+
## 技术方案
|
|
42
|
+
|
|
43
|
+
...(摘要)
|
|
44
|
+
|
|
45
|
+
## ADR
|
|
46
|
+
|
|
47
|
+
...(ADR 列表)
|
|
48
|
+
|
|
49
|
+
完整文档:docs/dev/specs/<title>.md
|
|
50
|
+
EOF
|
|
51
|
+
gh issue comment <issue-number> --body-file docs/dev/handoff/design-comment.md
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 5. 提交文档
|
|
55
|
+
设计文档和 ADR 是设计阶段产物,直接提交到 main,确保后续 worktree 创建时能读取:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git add docs/dev/specs/<title>.md docs/adr/<date>-<slug>.md
|
|
59
|
+
git commit -m "docs: <title> — 技术方案 + ADR"
|
|
60
|
+
git push origin main
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Output
|
|
64
|
+
- `docs/dev/specs/<title>.md` — 技术方案
|
|
65
|
+
- `docs/adr/<date>-<slug>.md` — ADR 决议
|
|
66
|
+
- Parent Issue 收到设计评论
|
|
67
|
+
- 文档已提交到 main
|
|
68
|
+
|
|
69
|
+
## 后续
|
|
70
|
+
- **/tasks** — 基于设计方案拆解为 DAG 任务
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-handoff
|
|
3
|
+
description: 打包上下文,跨会话传递进度
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-handoff
|
|
7
|
+
|
|
8
|
+
当上下文窗口压力过大或需要跨会话传递进度时使用。
|
|
9
|
+
|
|
10
|
+
## 何时使用
|
|
11
|
+
- 上下文窗口接近极限(约 80k+ tokens)
|
|
12
|
+
- 需要切换到另一个任务再回来
|
|
13
|
+
- 当前阶段等待外部输入无法继续
|
|
14
|
+
|
|
15
|
+
## Workflow
|
|
16
|
+
|
|
17
|
+
### 1. 打包当前状态
|
|
18
|
+
创建 handoff 文档,记录:
|
|
19
|
+
|
|
20
|
+
```markdown
|
|
21
|
+
# Handoff: <流程/阶段名>
|
|
22
|
+
|
|
23
|
+
## 上下文
|
|
24
|
+
- 项目: <项目名>
|
|
25
|
+
- 当前阶段: <stage>
|
|
26
|
+
- 已完成的工作: <列表>
|
|
27
|
+
- 未完成的决策: <列表>
|
|
28
|
+
|
|
29
|
+
## 关键产出
|
|
30
|
+
- <已产出的文件/Issue/PR 列表>
|
|
31
|
+
|
|
32
|
+
## 下一步
|
|
33
|
+
1. <下一步行动>
|
|
34
|
+
2. <需要用户输入的问题>
|
|
35
|
+
|
|
36
|
+
## 待办
|
|
37
|
+
- [ ] <待完成任务>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. 保存 Handoff 文件
|
|
41
|
+
保存到 `docs/dev/handoff-<YYYY-MM-DD>.md`。
|
|
42
|
+
|
|
43
|
+
### 3. 指示用户
|
|
44
|
+
告知用户:在下次会话中可以直接引用该 handoff 文件以恢复上下文。
|
|
45
|
+
|
|
46
|
+
## Output
|
|
47
|
+
- `docs/dev/handoff-<date>.md`
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-release
|
|
3
|
+
description: 版本 → Changelog → Release → npm publish(仅人工)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-release
|
|
7
|
+
|
|
8
|
+
版本号更新 → tag 推送 → Release 草稿 → 人工审核发布 → 自动 npm publish。
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
- main 分支最新,所有 PR 已合并
|
|
12
|
+
- CI 通过
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
### 1. 确认版本号
|
|
17
|
+
从 conventional commits 自动确定 semver bump:
|
|
18
|
+
```bash
|
|
19
|
+
git log $(git describe --tags --abbrev=0)..HEAD --oneline
|
|
20
|
+
```
|
|
21
|
+
- `fix:` → patch | `feat:` → minor | `BREAKING:` → major
|
|
22
|
+
|
|
23
|
+
### 2. 更新版本号 → 打 tag → 推送
|
|
24
|
+
```bash
|
|
25
|
+
npm version <major|minor|patch> --no-git-tag-version
|
|
26
|
+
# 更新 CHANGELOG.md
|
|
27
|
+
git commit -m "chore(release): v<version>"
|
|
28
|
+
git tag v<version>
|
|
29
|
+
git push origin main --tags
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 3. Release 草稿(自动)
|
|
33
|
+
tag 推送触发 `.github/workflows/release-draft.yml`:
|
|
34
|
+
- 构建 + 测试
|
|
35
|
+
- 生成 Release 草稿(含自动 release notes)
|
|
36
|
+
|
|
37
|
+
### 4. 人工审核发布
|
|
38
|
+
GitHub Releases 页面 → 检查 Release 草稿 → 点击 **Publish release**。
|
|
39
|
+
|
|
40
|
+
发布触发 `.github/workflows/release-publish.yml`:
|
|
41
|
+
- 自动 `npm publish`(需要 `NPM_TOKEN` 仓库 Secret)
|
|
42
|
+
|
|
43
|
+
## Output
|
|
44
|
+
- 版本已更新
|
|
45
|
+
- tag 已推送
|
|
46
|
+
- Release 草稿已创建(待人工发布)
|
|
47
|
+
- 发布后自动推送 npm
|
|
48
|
+
|
|
49
|
+
## 后续
|
|
50
|
+
无需后续阶段。Flow 完成。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-requirements
|
|
3
|
+
description: 需求访谈 → PRD 输出 → GitHub Issue 创建
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-requirements
|
|
7
|
+
|
|
8
|
+
通过采访式对话澄清需求,输出 PRD 文档并创建 GitHub Issue。
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
- `/setup` 已完成(gh CLI 可用)
|
|
12
|
+
|
|
13
|
+
## Workflow
|
|
14
|
+
|
|
15
|
+
### 1. 需求访谈
|
|
16
|
+
按参考文档 `references/interview-guide.md` 进行深度盘问,澄清:
|
|
17
|
+
- 用户故事与业务价值
|
|
18
|
+
- 边界条件
|
|
19
|
+
- 验收标准
|
|
20
|
+
- 技术约束
|
|
21
|
+
- 排除范围(记录到 out-of-scope)
|
|
22
|
+
|
|
23
|
+
### 2. 输出 PRD
|
|
24
|
+
整理为 PRD 文档保存到 `docs/prd/<title>.md`。
|
|
25
|
+
|
|
26
|
+
参考 `_prompts/prd-format` 中的格式要求。
|
|
27
|
+
|
|
28
|
+
### 3. 记录 Out-of-Scope
|
|
29
|
+
将在访谈中明确排除的需求记入 `docs/dev/out-of-scope.md`:
|
|
30
|
+
- 便于后续回顾为什么某些功能不做
|
|
31
|
+
- 避免重复讨论
|
|
32
|
+
|
|
33
|
+
### 4. 创建 Parent GitHub Issue
|
|
34
|
+
```bash
|
|
35
|
+
mkdir -p tmp
|
|
36
|
+
gh issue create \
|
|
37
|
+
--title "<PRD Title>" \
|
|
38
|
+
--label "enhancement" \
|
|
39
|
+
--body-file docs/prd/<title>.md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Output
|
|
43
|
+
- `docs/prd/<title>.md` — PRD 文档
|
|
44
|
+
- `docs/dev/out-of-scope.md` — 排除范围记录
|
|
45
|
+
- GitHub Parent Issue 已创建
|
|
46
|
+
|
|
47
|
+
## 下一阶段
|
|
48
|
+
- **/design** — 基于此 PRD 进行技术设计
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 需求访谈指南
|
|
2
|
+
|
|
3
|
+
## 必问维度
|
|
4
|
+
|
|
5
|
+
### 用户与场景
|
|
6
|
+
- 谁是最终用户?
|
|
7
|
+
- 他们在什么场景下使用?
|
|
8
|
+
- 解决了什么痛点?
|
|
9
|
+
|
|
10
|
+
### 业务价值
|
|
11
|
+
- 不做会怎样?
|
|
12
|
+
- 如何衡量成功?(指标)
|
|
13
|
+
- 优先级:P0(必须) / P1(重要) / P2(锦上添花)
|
|
14
|
+
|
|
15
|
+
### 范围
|
|
16
|
+
- **In Scope**: 精确描述包含的功能边界
|
|
17
|
+
- **Out of Scope**: 明确排除什么,为什么
|
|
18
|
+
|
|
19
|
+
### 验收标准
|
|
20
|
+
- "怎样才算做完?" 追问到可验证的程度
|
|
21
|
+
- 避免模糊描述("用户体验好"→ 追问具体标准)
|
|
22
|
+
|
|
23
|
+
### 技术约束
|
|
24
|
+
- 语言/框架版本限制
|
|
25
|
+
- 部署环境
|
|
26
|
+
- 性能要求(QPS、P99 延迟)
|
|
27
|
+
- 安全/合规要求
|
|
28
|
+
|
|
29
|
+
## 追问技巧
|
|
30
|
+
|
|
31
|
+
1. **"然后呢?"** — 当用户给出一个答案后追问,通常前 2 个回答只是表面
|
|
32
|
+
2. **"如果不做这个会怎样?"** — 验证真实优先级
|
|
33
|
+
3. **"谁来判断这个做对了?"** — 明确决策者/验收人
|
|
34
|
+
4. **"和现有功能的关系?"** — 发现依赖/冲突
|
|
35
|
+
5. **OOPS 追问**:当用户说"这个简单"或"这个以后再说"时,记录到 out-of-scope
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-review
|
|
3
|
+
description: 双轴审查(规范 + 规格)→ 自动合并
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-review
|
|
7
|
+
|
|
8
|
+
沿两条轴线审查 PR 代码:规范(是否符合编码标准)和规格(是否实现了原始需求)。
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
- PR 已创建
|
|
12
|
+
- 可选的 `/test` 已完成
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
### 1. 获取审查材料
|
|
17
|
+
```bash
|
|
18
|
+
gh pr diff <pr-number>
|
|
19
|
+
gh pr view <pr-number> --json title,body,files
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. 阅读约束来源
|
|
23
|
+
- 检查相关 ADR(`docs/adr/`)— 确认代码是否遵循架构决策
|
|
24
|
+
- 确认规格来源:commit 消息中的 Issue 引用或 `docs/prd/` / `docs/dev/specs/`
|
|
25
|
+
|
|
26
|
+
### 3. 文档同步确认
|
|
27
|
+
确认 PR 中是否包含文档同步:
|
|
28
|
+
- 检查 PR body 是否列出已同步的文档
|
|
29
|
+
- 检查 `docs/guides/` 和 `docs/dev/guides/` 是否有相应变更
|
|
30
|
+
- 如涉及配置/API 变更但文档未同步 → 标记为阻断性问题
|
|
31
|
+
|
|
32
|
+
### 4. 双轴审查
|
|
33
|
+
并行检查两个维度:
|
|
34
|
+
|
|
35
|
+
**规范轴(Normative)** — 代码是否符合文档化的编码标准?
|
|
36
|
+
参考 `references/smell-baseline.md` 中的代码气味基线。
|
|
37
|
+
|
|
38
|
+
**规格轴(Specification)** — 代码是否忠实实现了需求?
|
|
39
|
+
对照 PRD(`docs/prd/`)和设计方案(`docs/dev/specs/`)验证。
|
|
40
|
+
- 如发现实现与设计偏差 → 追加到 `docs/dev/changelog/<YYYY-MM-DD-NNN-slug>.md`
|
|
41
|
+
|
|
42
|
+
### 5. 合并前检查
|
|
43
|
+
在合并前确认以下项:
|
|
44
|
+
- 文档同步已完成(`docs/guides/` 已更新或无需更新)
|
|
45
|
+
- changelog 已记录偏差(如有)
|
|
46
|
+
- CI 已通过
|
|
47
|
+
|
|
48
|
+
### 6. 发表审查意见
|
|
49
|
+
发现阻断性问题:
|
|
50
|
+
```bash
|
|
51
|
+
gh pr review <pr-number> --request-changes --body "..."
|
|
52
|
+
```
|
|
53
|
+
无问题或非阻断性建议:
|
|
54
|
+
```bash
|
|
55
|
+
gh pr review <pr-number> --approve --body "..."
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 7. 等待 CI + 自动合并
|
|
59
|
+
```bash
|
|
60
|
+
gh pr checks <pr-number> --watch
|
|
61
|
+
gh pr merge <pr-number> --squash --delete-branch
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 8. 关闭关联 Sub Issue
|
|
65
|
+
如果 PR body 未包含 `Closes #<num>`(或 PR 合并后 GitHub 未自动关闭),手动关闭:
|
|
66
|
+
```bash
|
|
67
|
+
gh issue close <issue-num> --comment "已完成,已合并至 main"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 9. 清理 Worktree
|
|
71
|
+
PR 合并后,清理对应的 worktree 和分支:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# 从主仓库执行
|
|
75
|
+
git worktree remove .worktree/<task-slug> --force
|
|
76
|
+
git branch -D feat/<task-slug>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
> 清理时机:PR 合并后立即执行。`--force` 确保即使 worktree 有未提交变更也能清理(代码已合并到 main,worktree 内变更已无意义)。如清理失败(如进程占用),记录警告但不阻塞流程。
|
|
80
|
+
|
|
81
|
+
## Output
|
|
82
|
+
- PR 已审查
|
|
83
|
+
- PR 已合并(条件满足时)
|
|
84
|
+
- 关联 Sub Issue 已关闭
|
|
85
|
+
- changelog 已记录偏差(如有)
|
|
86
|
+
|
|
87
|
+
## 后续
|
|
88
|
+
- **/release** — 发布(如所有 PR 已合并)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 代码气味基线
|
|
2
|
+
|
|
3
|
+
参考 Fowler《重构》第 3 章。这些气味仅在审查 diff 中出现时报告;跳过工具已强制执行的部分。
|
|
4
|
+
|
|
5
|
+
## 气味清单
|
|
6
|
+
|
|
7
|
+
| 气味 | 表现 | 建议修复 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 神秘命名 | 变量/函数名无法表达意图 | 重命名,让名字自解释 |
|
|
10
|
+
| 重复代码 | 相同逻辑出现在多处 | 提取函数/类 |
|
|
11
|
+
| 特性依恋 | 一个方法过度使用其他类的数据 | 将逻辑移到数据所属的类 |
|
|
12
|
+
| 数据泥团 | 相同的数据项组合反复出现 | 提取为值对象 |
|
|
13
|
+
| 基本类型偏执 | 用 string/number 表示领域概念 | 创建值类型/枚举 |
|
|
14
|
+
| 霰弹式修改 | 一个改动需要改多处 | 用 Move Method/Field 集中职责 |
|
|
15
|
+
| 发散式变更 | 一个类因不同原因频繁修改 | 拆分类,分离关注点 |
|
|
16
|
+
| 臆测通用性 | 为不存在的未来需求做的抽象 | YAGNI — 删除 |
|
|
17
|
+
| 消息链 | a.b().c().d() 式的长链调用 | 隐藏委托 |
|
|
18
|
+
| 中间人 | 类的主要工作是委托给其他类 | 删除中间层 |
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-setup
|
|
3
|
+
description: 初始化项目文档结构,验证开发环境
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-setup
|
|
7
|
+
|
|
8
|
+
初始化项目文档结构,验证开发环境。
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
### 1. 创建文档目录
|
|
13
|
+
确保以下目录结构存在:
|
|
14
|
+
```
|
|
15
|
+
docs/
|
|
16
|
+
├── prd/ # 产品需求文档
|
|
17
|
+
├── adr/ # 架构决策记录
|
|
18
|
+
└── dev/
|
|
19
|
+
├── specs/ # 技术方案
|
|
20
|
+
├── tasks/ # DAG 任务定义
|
|
21
|
+
├── api/ # API 设计文档
|
|
22
|
+
├── db/ # 数据库设计
|
|
23
|
+
├── guides/ # 开发指南
|
|
24
|
+
└── handoff/ # 上下文交接
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. 验证环境
|
|
28
|
+
```bash
|
|
29
|
+
gh auth status
|
|
30
|
+
git remote get-url origin
|
|
31
|
+
```
|
|
32
|
+
确保 gh CLI 已认证、项目已关联 GitHub 远程。
|
|
33
|
+
|
|
34
|
+
### 3. 完成标记
|
|
35
|
+
```bash
|
|
36
|
+
mkdir -p .opencode/opencode-cabbage
|
|
37
|
+
echo "setup-complete" > .opencode/opencode-cabbage/setup-complete
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
- `docs/` 目录已就绪
|
|
42
|
+
- 开发环境已验证
|
|
43
|
+
- 可开始 `/requirements`
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-tasks
|
|
3
|
+
description: DAG 任务拆解 → Sub Issues 创建
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-tasks
|
|
7
|
+
|
|
8
|
+
将设计方案拆解为 DAG(有向无环图)任务,创建 GitHub Sub Issues。
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
- `/design` 已完成 → `docs/dev/specs/<title>.md` 存在
|
|
12
|
+
- Parent GitHub Issue 存在
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
### 1. DAG 拆解
|
|
17
|
+
将设计拆解为最小可执行单元,识别并行/串行关系。
|
|
18
|
+
|
|
19
|
+
拆解原则:
|
|
20
|
+
- 每个任务应在 1-2 小时内完成实现
|
|
21
|
+
- 无依赖的任务标记为可并行
|
|
22
|
+
- 任务粒度以"一个人可独立完成"为标准
|
|
23
|
+
|
|
24
|
+
DAG 使用 Mermaid 语法绘制,示例:
|
|
25
|
+
|
|
26
|
+
```mermaid
|
|
27
|
+
graph TD
|
|
28
|
+
A["Task A(无依赖)"] --> B["Task B(依赖 A)"]
|
|
29
|
+
A --> C["Task C(依赖 A)"]
|
|
30
|
+
D["Task D(无依赖)"]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
保存为 `docs/dev/tasks/<YYYY-MM-DD-NNN-slug>/DAG.md`。
|
|
34
|
+
|
|
35
|
+
### 2. 创建任务文件
|
|
36
|
+
每个任务 `docs/dev/tasks/<task-name>.md`:
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
---
|
|
40
|
+
name: "<task-name>"
|
|
41
|
+
depends_on: ["<前置任务>"]
|
|
42
|
+
labels: ["backend"]
|
|
43
|
+
worktree_root: ".worktree/<task-name>/"
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 目标
|
|
47
|
+
|
|
48
|
+
## 实现要点
|
|
49
|
+
|
|
50
|
+
## 验收标准
|
|
51
|
+
|
|
52
|
+
## Worktree
|
|
53
|
+
- 路径: `.worktree/<task-name>/`
|
|
54
|
+
- 分支: `feat/<task-name>`
|
|
55
|
+
- 创建时机: `/code` 阶段首次执行时自动创建
|
|
56
|
+
- 清理时机: PR 合并后自动删除
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 3. 创建 Sub Issues
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
mkdir -p docs/dev/handoff
|
|
63
|
+
cat > docs/dev/handoff/task-issue-body.md << 'EOF'
|
|
64
|
+
## 依赖
|
|
65
|
+
前置任务: <列表>
|
|
66
|
+
|
|
67
|
+
## Worktree
|
|
68
|
+
- 路径: `.worktree/<task-name>/`
|
|
69
|
+
- 分支: `feat/<task-name>`
|
|
70
|
+
|
|
71
|
+
## 描述
|
|
72
|
+
...
|
|
73
|
+
EOF
|
|
74
|
+
gh issue create \
|
|
75
|
+
--title "<task-name>" \
|
|
76
|
+
--label "task" \
|
|
77
|
+
--parent <parent-number> \
|
|
78
|
+
--body-file docs/dev/handoff/task-issue-body.md
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 4. 提交任务文件
|
|
82
|
+
任务定义文件是设计阶段产物,直接提交到 main,确保后续 worktree 创建时能读取:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git add docs/dev/tasks/<YYYY-MM-DD-NNN-slug>/
|
|
86
|
+
git commit -m "docs: <title> — 任务定义"
|
|
87
|
+
git push origin main
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Output
|
|
91
|
+
- `docs/dev/tasks/*.md` — 独立任务文件
|
|
92
|
+
- GitHub Sub Issues 已创建(依赖关系在 body 中声明)
|
|
93
|
+
- 任务文件已提交到 main
|
|
94
|
+
|
|
95
|
+
## Sub Issue 关闭时机
|
|
96
|
+
Sub Issue 不在 `/tasks` 阶段关闭,而是在对应 PR 合并后自动关闭:
|
|
97
|
+
|
|
98
|
+
| 阶段 | 动作 |
|
|
99
|
+
|------|------|
|
|
100
|
+
| `/code` | PR body 含 `Closes #<issue-num>`,合并后 GitHub 自动关闭 |
|
|
101
|
+
| `/review` | 如 PR 未自动关闭 Sub Issue,reviewer 手动 `gh issue close <num>` |
|
|
102
|
+
|
|
103
|
+
## 后续
|
|
104
|
+
- **/code** — 认领 Sub Issue 开始编码
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-test
|
|
3
|
+
description: 触发 CI → 监控 → 测试结果汇报
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-test
|
|
7
|
+
|
|
8
|
+
触发 CI 运行 E2E 测试,监控结果并汇报。
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
- PR 已创建
|
|
12
|
+
|
|
13
|
+
## Workflow
|
|
14
|
+
|
|
15
|
+
### 1. 确认 CI 配置
|
|
16
|
+
检查 `.github/workflows/`。如缺失,引导用户创建:
|
|
17
|
+
|
|
18
|
+
```yaml
|
|
19
|
+
name: E2E
|
|
20
|
+
on: [pull_request]
|
|
21
|
+
jobs:
|
|
22
|
+
test:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
- run: npm ci
|
|
27
|
+
- run: npm run test:e2e
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. 触发并监控
|
|
31
|
+
```bash
|
|
32
|
+
gh pr checks <pr-number> --watch
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. 结果汇报
|
|
36
|
+
- **全部通过** ✅ → 继续
|
|
37
|
+
- **失败** ❌ → 分析原因,建议修复
|
|
38
|
+
- **超时/异常** ⚠️ → 检查 CI 配置
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
- CI 结果汇报给用户
|
|
42
|
+
|
|
43
|
+
## 后续
|
|
44
|
+
- **/review** — 审查 PR
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FlowRun, FlowStage, TaskState } from "./types.js";
|
|
2
|
+
export declare function postAuditComment(issueNumber: number, body: string): Promise<boolean>;
|
|
3
|
+
export declare function postPRComment(prNumber: number, body: string): Promise<boolean>;
|
|
4
|
+
export declare function buildStageAudit(flowRun: FlowRun, stage: FlowStage): string;
|
|
5
|
+
export declare function buildMergeAudit(task: TaskState): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { gh } from "../util/gh.js";
|
|
2
|
+
import { escapeShellArg } from "../util/shell.js";
|
|
3
|
+
export async function postAuditComment(issueNumber, body) {
|
|
4
|
+
try {
|
|
5
|
+
const escaped = escapeShellArg(body);
|
|
6
|
+
await gh(`issue comment ${issueNumber} --body '${escaped}'`);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function postPRComment(prNumber, body) {
|
|
14
|
+
try {
|
|
15
|
+
const escaped = escapeShellArg(body);
|
|
16
|
+
await gh(`pr comment ${prNumber} --body '${escaped}'`);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function buildStageAudit(flowRun, stage) {
|
|
24
|
+
const s = flowRun.stages[stage];
|
|
25
|
+
if (!s)
|
|
26
|
+
return `Stage "${stage}" not found`;
|
|
27
|
+
const lines = [
|
|
28
|
+
`### Stage: ${stage}`,
|
|
29
|
+
`Status: ${s.status}`,
|
|
30
|
+
`Completed: ${s.completedAt ?? "not yet"}`,
|
|
31
|
+
];
|
|
32
|
+
if (s.checks.length > 0) {
|
|
33
|
+
lines.push("", "**Checks:**");
|
|
34
|
+
for (const check of s.checks) {
|
|
35
|
+
lines.push(`- ${check.name}: ${check.status}`);
|
|
36
|
+
for (const ev of check.evidence) {
|
|
37
|
+
lines.push(` - \`${ev.command}\` → exit ${ev.exitCode}: ${ev.summary}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return lines.join("\n");
|
|
42
|
+
}
|
|
43
|
+
export function buildMergeAudit(task) {
|
|
44
|
+
const lines = [
|
|
45
|
+
`### Task: ${task.id}`,
|
|
46
|
+
`PR: #${task.prNumber}`,
|
|
47
|
+
`Status: ${task.status}`,
|
|
48
|
+
"",
|
|
49
|
+
"**Merge Checkpoints:**",
|
|
50
|
+
];
|
|
51
|
+
if (task.prCheckpoints) {
|
|
52
|
+
const cp = task.prCheckpoints;
|
|
53
|
+
const gates = {
|
|
54
|
+
localChecks: cp.localChecks.status,
|
|
55
|
+
ciChecks: cp.ciChecks.status,
|
|
56
|
+
reviewerApproval: cp.reviewerApproval.status,
|
|
57
|
+
goalVerification: cp.goalVerification.status,
|
|
58
|
+
branchProtection: cp.branchProtection.status,
|
|
59
|
+
mergeResult: cp.mergeResult.status,
|
|
60
|
+
};
|
|
61
|
+
for (const [name, status] of Object.entries(gates)) {
|
|
62
|
+
lines.push(`- ${name}: ${status}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/flowrun/audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAY;IACtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,EAAE,CAAC,iBAAiB,WAAW,YAAY,OAAO,GAAG,CAAC,CAAA;QAC5D,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY;IAChE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,EAAE,CAAC,cAAc,QAAQ,YAAY,OAAO,GAAG,CAAC,CAAA;QACtD,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,KAAgB;IAChE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/B,IAAI,CAAC,CAAC;QAAE,OAAO,UAAU,KAAK,aAAa,CAAA;IAE3C,MAAM,KAAK,GAAa;QACtB,cAAc,KAAK,EAAE;QACrB,WAAW,CAAC,CAAC,MAAM,EAAE;QACrB,cAAc,CAAC,CAAC,WAAW,IAAI,SAAS,EAAE;KAC3C,CAAA;IAED,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAA;QAC7B,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;YAC9C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,aAAa,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAe;IAC7C,MAAM,KAAK,GAAa;QACtB,aAAa,IAAI,CAAC,EAAE,EAAE;QACtB,QAAQ,IAAI,CAAC,QAAQ,EAAE;QACvB,WAAW,IAAI,CAAC,MAAM,EAAE;QACxB,EAAE;QACF,wBAAwB;KACzB,CAAA;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAA;QAC7B,MAAM,KAAK,GAA2B;YACpC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM;YAClC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM;YAC5B,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM;YAC5C,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM;YAC5C,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM;YAC5C,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM;SACnC,CAAA;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type FlowRun, type FlowStage, type TaskState } from "./types.js";
|
|
2
|
+
export interface GateResult {
|
|
3
|
+
allowed: boolean;
|
|
4
|
+
reason?: string;
|
|
5
|
+
missing: string[];
|
|
6
|
+
failedChecks: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function canStartStage(flowRun: FlowRun, stage: FlowStage): GateResult;
|
|
9
|
+
export declare function canCompleteStage(flowRun: FlowRun, stage: FlowStage): GateResult;
|
|
10
|
+
export declare function canStartTask(flowRun: FlowRun, taskId: string): GateResult;
|
|
11
|
+
export declare function canCompleteTask(flowRun: FlowRun, taskId: string): GateResult;
|
|
12
|
+
export declare function canMerge(flowRun: FlowRun): GateResult;
|
|
13
|
+
export declare function allTasksComplete(flowRun: FlowRun): boolean;
|
|
14
|
+
export declare function getReadyTasks(flowRun: FlowRun): TaskState[];
|
|
15
|
+
export declare function determineNextStage(flowRun: FlowRun): {
|
|
16
|
+
stage: FlowStage | null;
|
|
17
|
+
reason: string;
|
|
18
|
+
};
|