create-harness-vibe-coding 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/bin/create-harness-vibe-coding.js +2 -0
- package/package.json +39 -0
- package/src/generator.js +107 -0
- package/src/index.js +106 -0
- package/src/prompts.js +41 -0
- package/templates/common/.claude/rules/ecc/common.md +32 -0
- package/templates/common/.claude/settings.json +34 -0
- package/templates/common/AGENTS.md +5 -0
- package/templates/common/CLAUDE.md +119 -0
- package/templates/common/MEMORY.md +35 -0
- package/templates/common/SETUP.md +91 -0
- package/templates/common/docs/README.md +112 -0
- package/templates/common/docs/domain/ports.md +73 -0
- package/templates/common/docs/features/_template.md +135 -0
- package/templates/common/docs/harness/agent-workflow.md +145 -0
- package/templates/common/docs/harness/architecture.md +87 -0
- package/templates/common/docs/harness/data-flow.md +59 -0
- package/templates/common/docs/harness/state-machines.md +50 -0
- package/templates/common/docs/research/PRD.md +63 -0
- package/templates/common/docs/research/scaffolds.md +60 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# {{projectName}} — 文档入口
|
|
2
|
+
|
|
3
|
+
> **定位**:给人和 coding agent 共用的项目地图。`AGENTS.md` 负责让 agent 先读 `CLAUDE.md`,再从这里进入项目事实源。
|
|
4
|
+
>
|
|
5
|
+
> **原则**:短入口 + 分主题文档。不要把所有规则塞进 `CLAUDE.md` 或 `AGENTS.md`。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0-1 项目必经流程
|
|
10
|
+
|
|
11
|
+
从零开始做一个项目时,必须按下面顺序产出文档。前一阶段没有最低可用结论,不进入后一阶段。
|
|
12
|
+
|
|
13
|
+
| 顺序 | 产物 | 必须回答的问题 | 完成标准 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| 1 | [research/scaffolds.md](research/scaffolds.md) | 别人怎么做?有哪些候选模板、框架、约束?为什么采用/不采用? | 至少 3 个参考物;每个写清 Purpose / Strength / Weakness / Decision |
|
|
16
|
+
| 2 | [research/PRD.md](research/PRD.md) | 这个 MVP 到底解决什么?明确不做什么?怎么验收? | 一页内;包含 MVP、Non-goals、可验证验收标准 |
|
|
17
|
+
| 3 | [harness/architecture.md](harness/architecture.md) | 系统分几层?组件边界是什么?harness 能做什么、不能做什么? | 分层依赖、核心组件、不可违反约束、关键决策都写清 |
|
|
18
|
+
| 4 | [domain/ports.md](domain/ports.md) | 层与层之间用什么合同通信?错误和幂等语义是什么? | 每个端口有前置条件、后置条件、错误语义、已知实现 |
|
|
19
|
+
| 5 | [harness/data-flow.md](harness/data-flow.md) | 正常路径和失败路径怎么跑?调用方看到什么? | 至少 1 条核心流程;每个失败点都有系统行为和恢复方式 |
|
|
20
|
+
| 6 | [harness/state-machines.md](harness/state-machines.md) | 哪些组件有状态?哪些转移合法/非法? | 每个有状态组件有状态枚举、转移表、非法转移说明 |
|
|
21
|
+
| 7 | [harness/agent-workflow.md](harness/agent-workflow.md) | agent 怎么分工、TDD、验证和闭环? | Feature doc 模板、subagent 分工、write set、完成标准写清 |
|
|
22
|
+
| 8 | tests + implementation | 设计是否被代码证明? | 最小垂直切片可运行;测试覆盖核心成功/失败路径 |
|
|
23
|
+
|
|
24
|
+
**硬门槛**:
|
|
25
|
+
- 如果相关文档仍然只剩 `{{...}}` 占位符,不要声称架构已定稿。
|
|
26
|
+
- **最小可开始编码的文档集**:`research/PRD.md` + `harness/architecture.md` + 至少 1 个已填好的端口合同。达到这个门槛后可以开始最小垂直切片,但必须在 feature doc 或测试里记录尚未补齐的 `data-flow.md` / `state-machines.md` 风险。
|
|
27
|
+
- 如果新增或修改架构边界,必须同步更新对应文档和测试。
|
|
28
|
+
- 如果实现需要超过一个短会话,先按 [features/_template.md](features/_template.md) 开 feature doc;feature doc 必须包含目的、边界、任务、验证、决策记录。
|
|
29
|
+
|
|
30
|
+
## 每份文档的完成标准
|
|
31
|
+
|
|
32
|
+
| 文档 | 最低完成标准 | 可以暂缺 |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| `research/scaffolds.md` | 至少 3 个参考物;每个有 Purpose / Strength / Weakness / Decision;有最终决策 | 被放弃方案可后补 |
|
|
35
|
+
| `research/PRD.md` | Why、MVP、Non-goals、决策优先级、验收标准都不是占位符 | 非功能性指标可先写 MVP 级目标 |
|
|
36
|
+
| `harness/architecture.md` | 分层依赖、核心组件、至少 1 条 ADR、不可违反约束 | Runner 变体可在只有一种 runner 时写"暂无" |
|
|
37
|
+
| `domain/ports.md` | 至少 1 个端口有前置条件、后置条件、错误语义、幂等性、已知实现 | 后续端口可随 feature 增量补 |
|
|
38
|
+
| `harness/data-flow.md` | 至少 1 条核心流程有正常路径 + 失败路径 | 次要流程可后补 |
|
|
39
|
+
| `harness/state-machines.md` | 已有有状态组件都有状态枚举和转移表 | 无状态组件不用写 |
|
|
40
|
+
| `harness/agent-workflow.md` | 开 feature doc、write set、验证、关闭标准明确 | subagent 角色可按需要扩展 |
|
|
41
|
+
| `features/*.md` | Requirements / Design / Tasks / Verification 四段闭环 | 小修可走快车道并说明原因 |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Harness 边界
|
|
46
|
+
|
|
47
|
+
当前模板采用 `interfaces -> harness -> application -> domain` 加 `infrastructure` 适配器的分层思路。这里的 `domain` 是任意业务域:数据分析、文档处理、代码修复、运营自动化等都可以挂在同一个 harness 底座上。
|
|
48
|
+
|
|
49
|
+
| 层 | 负责 | 不负责 |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| `interfaces/` | CLI / API / UI 入口 | 业务规则、数据源细节 |
|
|
52
|
+
| `harness/` | 运行外壳、调度、安全门、审计、可观测性、失败控制 | 领域业务规则、领域决策、适配器实现细节 |
|
|
53
|
+
| `application/` | 用例编排,把领域端口组合成业务行为 | 具体外部服务实现 |
|
|
54
|
+
| `domain/` | 业务对象、业务不变量、端口协议 | 导入 harness / infrastructure / interfaces |
|
|
55
|
+
| `infrastructure/` | 文件系统、数据库、外部 API、模型服务等端口实现 | 定义业务合同 |
|
|
56
|
+
|
|
57
|
+
判断一段代码该不该在 `harness/`:如果它是在"运行期间保护、记录、调度、恢复系统",放 harness;如果它是在"决定某个业务动作是否应该发生、代表什么领域含义",放 application/domain。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 文档地图
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
docs/
|
|
65
|
+
├── README.md ← 你在这里
|
|
66
|
+
├── features/
|
|
67
|
+
│ └── _template.md ← 单功能实现文档模板(Kiro-lite)
|
|
68
|
+
├── harness/
|
|
69
|
+
│ ├── agent-workflow.md ← agent 分工、TDD、闭环、write set 规则
|
|
70
|
+
│ ├── architecture.md ← 组件全景、分层规则、关键设计决策
|
|
71
|
+
│ ├── data-flow.md ← 端到端事件流转:正常路径 + 异常路径
|
|
72
|
+
│ └── state-machines.md ← 有状态组件的状态转移图和转移表
|
|
73
|
+
├── domain/
|
|
74
|
+
│ └── ports.md ← 跨层接口契约:前置/后置、错误语义
|
|
75
|
+
└── research/
|
|
76
|
+
├── PRD.md ← 一页 MVP 边界和验收标准模板
|
|
77
|
+
└── scaffolds.md ← 调研结论、参考模板、技术选型理由
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 阅读顺序
|
|
83
|
+
|
|
84
|
+
| 角色 | 先读 | 然后读 |
|
|
85
|
+
| --- | --- | --- |
|
|
86
|
+
| 新加入开发者 | [research/PRD.md](research/PRD.md) | [harness/architecture.md](harness/architecture.md) |
|
|
87
|
+
| 实现者 | [harness/agent-workflow.md](harness/agent-workflow.md) | [features/_template.md](features/_template.md) |
|
|
88
|
+
| 审查者 | [harness/state-machines.md](harness/state-machines.md) | tests |
|
|
89
|
+
| 架构维护者 | [research/scaffolds.md](research/scaffolds.md) | [harness/architecture.md](harness/architecture.md) |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 维护规则
|
|
94
|
+
|
|
95
|
+
- 代码变更影响架构:更新 `harness/architecture.md`。
|
|
96
|
+
- 新增跨层接口:更新 `domain/ports.md`。
|
|
97
|
+
- 新增流程或失败路径:更新 `harness/data-flow.md`。
|
|
98
|
+
- 新增有状态组件:更新 `harness/state-machines.md`。
|
|
99
|
+
- 新增外部依赖、模板、框架选择:更新 `research/scaffolds.md`。
|
|
100
|
+
- 新增非平凡功能:复制 `features/_template.md` 创建 feature doc,并按 `harness/agent-workflow.md` 闭环。
|
|
101
|
+
- 文档规则反复被 agent 忽略:不要继续加长入口文件,把规则变成测试、lint 或更具体的模板。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 外部参考
|
|
106
|
+
|
|
107
|
+
- OpenAI, Harness Engineering: 短 `AGENTS.md` 作为目录,`docs/` 作为事实源;架构边界用测试/lint 机械化验证。
|
|
108
|
+
- Anthropic, Claude Code Best Practices: `CLAUDE.md` 保持短且可维护,可用 `@docs/...` 引入项目文档。
|
|
109
|
+
- OpenAI, PLANS.md / ExecPlans: 复杂任务使用自包含、可验证、可恢复的执行计划。
|
|
110
|
+
- GitHub Spec Kit / Kiro Specs: 借用 requirements -> design -> tasks -> verification 的结构。
|
|
111
|
+
- Anthropic, Building Effective Agents: agent loop 要基于环境反馈、明确停止条件和人工检查点。
|
|
112
|
+
- arc42 / C4 / ADR / ARCHITECTURE.md: 分别提供架构章节、静态结构视图、决策记录和轻量代码地图。
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# 端口协议 — {{projectName}}
|
|
2
|
+
|
|
3
|
+
> **职责**:定义跨层接口契约。这是分层架构的"法律合同"。每个端口不仅写签名,还写前置条件、后置条件、错误语义。
|
|
4
|
+
>
|
|
5
|
+
> **原则**:端口文档 != API 参考文档。它是一个合同(contract),指定调用方义务和实现方保证。
|
|
6
|
+
>
|
|
7
|
+
> 哲学来源:Bertrand Meyer 的 Design by Contract (Eiffel) + Alistair Cockburn 的六边形架构端口文档。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 端口分类
|
|
12
|
+
|
|
13
|
+
### 1.1 驱动端口(Inbound — 外部调用应用)
|
|
14
|
+
|
|
15
|
+
| 端口 | 定义位置 | 用途 |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `{{INBOUND_PORT_1}}` | `{{LOCATION}}` | {{DESCRIPTION}} |
|
|
18
|
+
|
|
19
|
+
### 1.2 被驱动端口(Outbound — 应用调用外部)
|
|
20
|
+
|
|
21
|
+
| 端口 | 定义位置 | 用途 |
|
|
22
|
+
| --- | --- | --- |
|
|
23
|
+
| `{{OUTBOUND_PORT_1}}` | `{{LOCATION}}` | {{DESCRIPTION}} |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. 端口定义模板
|
|
28
|
+
|
|
29
|
+
每个端口按以下格式填写:
|
|
30
|
+
|
|
31
|
+
- **类别**:驱动 / 被驱动
|
|
32
|
+
- **定义位置**:`{{FILE_PATH}}`
|
|
33
|
+
- **协议类**:`{{CLASS_OR_INTERFACE}}`
|
|
34
|
+
|
|
35
|
+
### 用途
|
|
36
|
+
|
|
37
|
+
{{WHAT_THIS_PORT_DOES}}
|
|
38
|
+
|
|
39
|
+
### 方法
|
|
40
|
+
|
|
41
|
+
**前置条件**(调用方必须保证):
|
|
42
|
+
- {{PRECONDITION_1}}
|
|
43
|
+
- {{PRECONDITION_2}}
|
|
44
|
+
|
|
45
|
+
**后置条件**(实现方保证):
|
|
46
|
+
- {{POSTCONDITION_1}}
|
|
47
|
+
- {{POSTCONDITION_2}}
|
|
48
|
+
|
|
49
|
+
**错误语义**:
|
|
50
|
+
|
|
51
|
+
| 异常类型 | 触发条件 | 调用方应 |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `{{EXCEPTION_TYPE}}` | {{CONDITION}} | {{CALLER_ACTION}} |
|
|
54
|
+
|
|
55
|
+
**幂等性**:{{YES_NO_AND_DETAILS}}
|
|
56
|
+
|
|
57
|
+
### 已知实现
|
|
58
|
+
|
|
59
|
+
| 适配器 | 位置 | 用途 |
|
|
60
|
+
| --- | --- | --- |
|
|
61
|
+
| `{{ADAPTER_NAME}}` | `{{LOCATION}}` | {{PURPOSE}} |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 3. 跨端口不变量
|
|
66
|
+
|
|
67
|
+
- {{INVARIANT_1}}
|
|
68
|
+
- {{INVARIANT_2}}
|
|
69
|
+
- 新增端口必须定义在 `domain/ports` 中,适配器放在 `infrastructure/`。
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
> **提示**:当前 ports.md 是模板。请根据你的项目领域替换 `{{...}}` 占位符。参考 `docs/harness/data-flow.md` 了解端口如何被编排。
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# {{FEATURE_NAME}}
|
|
2
|
+
|
|
3
|
+
> **状态**:Draft / In Progress / Blocked / Done
|
|
4
|
+
> **创建日期**:{{YYYY-MM-DD}}
|
|
5
|
+
> **负责人**:{{OWNER_OR_AGENT}}
|
|
6
|
+
> **关联文档**:{{PRD_OR_ARCH_DOC_LINKS}}
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Requirements
|
|
11
|
+
|
|
12
|
+
### 1.1 背景
|
|
13
|
+
|
|
14
|
+
{{WHY_THIS_FEATURE_EXISTS}}
|
|
15
|
+
|
|
16
|
+
### 1.2 目标
|
|
17
|
+
|
|
18
|
+
- {{GOAL_1}}
|
|
19
|
+
- {{GOAL_2}}
|
|
20
|
+
|
|
21
|
+
### 1.3 非目标
|
|
22
|
+
|
|
23
|
+
- {{NON_GOAL_1}}
|
|
24
|
+
- {{NON_GOAL_2}}
|
|
25
|
+
|
|
26
|
+
### 1.4 验收标准
|
|
27
|
+
|
|
28
|
+
- [ ] {{ACCEPTANCE_CRITERION_1}}
|
|
29
|
+
- [ ] {{ACCEPTANCE_CRITERION_2}}
|
|
30
|
+
- [ ] {{ACCEPTANCE_CRITERION_3}}
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Design
|
|
35
|
+
|
|
36
|
+
### 2.1 影响范围
|
|
37
|
+
|
|
38
|
+
| 区域 | 是否影响 | 说明 |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| `harness/architecture.md` | {{YES_NO}} | {{NOTE}} |
|
|
41
|
+
| `domain/ports.md` | {{YES_NO}} | {{NOTE}} |
|
|
42
|
+
| `harness/data-flow.md` | {{YES_NO}} | {{NOTE}} |
|
|
43
|
+
| `harness/state-machines.md` | {{YES_NO}} | {{NOTE}} |
|
|
44
|
+
| tests | {{YES_NO}} | {{NOTE}} |
|
|
45
|
+
|
|
46
|
+
### 2.2 Allowed Write Set
|
|
47
|
+
|
|
48
|
+
- `{{PATH_OR_GLOB_1}}`
|
|
49
|
+
- `{{PATH_OR_GLOB_2}}`
|
|
50
|
+
|
|
51
|
+
### 2.3 Forbidden Scope
|
|
52
|
+
|
|
53
|
+
- `{{PATH_OR_BEHAVIOR_1}}`
|
|
54
|
+
- `{{PATH_OR_BEHAVIOR_2}}`
|
|
55
|
+
|
|
56
|
+
### 2.4 方案
|
|
57
|
+
|
|
58
|
+
#### 候选方案
|
|
59
|
+
|
|
60
|
+
| 方案 | 优点 | 缺点 | 结论 |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| {{OPTION_A}} | {{PROS_A}} | {{CONS_A}} | {{ACCEPT_REJECT}} |
|
|
63
|
+
| {{OPTION_B}} | {{PROS_B}} | {{CONS_B}} | {{ACCEPT_REJECT}} |
|
|
64
|
+
|
|
65
|
+
#### 选择理由
|
|
66
|
+
|
|
67
|
+
{{SELECTED_DESIGN_AND_RATIONALE}}
|
|
68
|
+
|
|
69
|
+
### 2.5 边界条件
|
|
70
|
+
|
|
71
|
+
- {{EDGE_CASE_1}} -> {{EXPECTED_BEHAVIOR_1}}
|
|
72
|
+
- {{EDGE_CASE_2}} -> {{EXPECTED_BEHAVIOR_2}}
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3. Tasks
|
|
77
|
+
|
|
78
|
+
> 每个 task 必须有验证方式。需要 subagent 时,先写清角色和 write set。
|
|
79
|
+
|
|
80
|
+
| # | Task | Owner | Write Set | Verify |
|
|
81
|
+
| --- | --- | --- | --- | --- |
|
|
82
|
+
| 1 | {{WRITE_FAILING_TEST_OR_DOC_CHECK}} | {{OWNER}} | `{{PATH}}` | `{{COMMAND_OR_CHECK}}` |
|
|
83
|
+
| 2 | {{IMPLEMENT_MINIMAL_CHANGE}} | {{OWNER}} | `{{PATH}}` | `{{COMMAND_OR_CHECK}}` |
|
|
84
|
+
| 3 | {{SYNC_DOCS_OR_BOUNDARIES}} | {{OWNER}} | `{{PATH}}` | `{{COMMAND_OR_CHECK}}` |
|
|
85
|
+
|
|
86
|
+
### Subagent Plan
|
|
87
|
+
|
|
88
|
+
| Role | Needed? | Scope |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| Explorer | {{YES_NO}} | {{READ_ONLY_SCOPE}} |
|
|
91
|
+
| Test Writer | {{YES_NO}} | {{TEST_WRITE_SET}} |
|
|
92
|
+
| Implementer | {{YES_NO}} | {{IMPLEMENTATION_WRITE_SET}} |
|
|
93
|
+
| Reviewer | {{YES_NO}} | {{REVIEW_SCOPE}} |
|
|
94
|
+
| Verifier | {{YES_NO}} | {{VERIFY_COMMANDS}} |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 4. Verification
|
|
99
|
+
|
|
100
|
+
### 4.1 Test Results
|
|
101
|
+
|
|
102
|
+
| Command | Result | Notes |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| `{{TEST_COMMAND}}` | {{PASS_FAIL_NOT_RUN}} | {{NOTES}} |
|
|
105
|
+
| `{{OTHER_COMMAND}}` | {{PASS_FAIL_NOT_RUN}} | {{NOTES}} |
|
|
106
|
+
|
|
107
|
+
### 4.2 Review Findings
|
|
108
|
+
|
|
109
|
+
- {{FINDING_OR_NONE}}
|
|
110
|
+
|
|
111
|
+
### 4.3 Docs Sync
|
|
112
|
+
|
|
113
|
+
- [ ] `harness/architecture.md`
|
|
114
|
+
- [ ] `domain/ports.md`
|
|
115
|
+
- [ ] `harness/data-flow.md`
|
|
116
|
+
- [ ] `harness/state-machines.md`
|
|
117
|
+
- [ ] `research/scaffolds.md`
|
|
118
|
+
- [ ] Not needed because {{REASON}}
|
|
119
|
+
|
|
120
|
+
### 4.4 Decision Log
|
|
121
|
+
|
|
122
|
+
| Date | Decision | Reason |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| {{YYYY-MM-DD}} | {{DECISION}} | {{REASON}} |
|
|
125
|
+
|
|
126
|
+
### 4.5 Closeout
|
|
127
|
+
|
|
128
|
+
- [ ] Acceptance criteria satisfied.
|
|
129
|
+
- [ ] Tests or manual verification recorded.
|
|
130
|
+
- [ ] Boundary impact documented.
|
|
131
|
+
- [ ] Remaining risks listed or explicitly none.
|
|
132
|
+
- [ ] If docs/code/tests conflicted, Decision Log records how it was resolved.
|
|
133
|
+
|
|
134
|
+
Remaining risks:
|
|
135
|
+
- {{RISK_OR_NONE}}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Agent Workflow Harness
|
|
2
|
+
|
|
3
|
+
> **职责**:约束 agent 如何实现一个功能。它不是 runtime 代码架构,而是 engineering harness:防止 AI 跳过需求、乱改边界、缺测试、没有闭环。
|
|
4
|
+
>
|
|
5
|
+
> **原则**:小任务轻流程,大任务有文档;用测试和边界检查约束 agent,而不是靠长提示词。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 什么时候必须开 Feature Doc
|
|
10
|
+
|
|
11
|
+
使用 [../features/_template.md](../features/_template.md) 创建一个新的 `docs/features/{{FEATURE_SLUG}}.md`。
|
|
12
|
+
|
|
13
|
+
必须开文档:
|
|
14
|
+
- 新增功能或用户可见行为。
|
|
15
|
+
- 修改跨层契约、端口、状态机、数据流或权限规则。
|
|
16
|
+
- 影响多个模块,或预计超过一个短会话。
|
|
17
|
+
- 修复边界不清的 bug,需要先定义期望行为。
|
|
18
|
+
- 需要 subagents 分工、TDD 或人工审批。
|
|
19
|
+
|
|
20
|
+
可以不开文档:
|
|
21
|
+
- 拼写、链接、注释等纯文档小修。
|
|
22
|
+
- 单测试断言或单行安全修复,且边界完全清楚。
|
|
23
|
+
- 只读调查或一次性命令输出。
|
|
24
|
+
|
|
25
|
+
如果不确定,开一个短 feature doc。短文档比隐含假设便宜。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. Kiro-lite 流程
|
|
30
|
+
|
|
31
|
+
每个非平凡功能按一个文件走完四段,不默认拆多个文件。
|
|
32
|
+
|
|
33
|
+
1. **Requirements**:写清目标、非目标、验收标准。
|
|
34
|
+
2. **Design**:写清影响范围、允许修改文件、不允许修改文件、接口/状态/数据流变化。
|
|
35
|
+
3. **Tasks**:拆成可验证任务,每个任务有 owner、write set、验证命令。
|
|
36
|
+
4. **Verification**:记录测试结果、边界检查、文档同步、剩余风险。
|
|
37
|
+
|
|
38
|
+
只有当 feature doc 超过约 200 行,或任务需要多人/多 agent 长时间并行时,才升级为目录:
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
docs/features/{{FEATURE_SLUG}}/
|
|
42
|
+
├── requirements.md
|
|
43
|
+
├── design.md
|
|
44
|
+
├── tasks.md
|
|
45
|
+
└── verification.md
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 3. Subagent 分工
|
|
51
|
+
|
|
52
|
+
Subagent 是分工工具,不是责任转移。主 agent 负责最终集成、验证和解释。
|
|
53
|
+
|
|
54
|
+
| 角色 | 允许做 | 禁止做 | 输出 |
|
|
55
|
+
| --- | --- | --- | --- |
|
|
56
|
+
| Explorer | 只读调查、找上下文、列风险 | 修改文件、重构、下结论替代验证 | 相关文件、风险点、建议测试 |
|
|
57
|
+
| Test Writer | 只写/改测试和测试 fixtures | 改生产代码、放宽断言 | 失败测试、测试意图 |
|
|
58
|
+
| Implementer | 在指定 write set 内实现 | 触碰未授权文件、扩大 scope | 改动文件、实现说明 |
|
|
59
|
+
| Reviewer | 只读审查边界、过度设计、缺测试 | 修改代码、重排任务 | findings、severity、文件行号 |
|
|
60
|
+
| Verifier | 运行验证命令、汇总结果 | 改业务代码掩盖失败 | 命令、结果、失败原因 |
|
|
61
|
+
|
|
62
|
+
分工规则:
|
|
63
|
+
- 同一时间并行 subagents 的 write set 必须不重叠。
|
|
64
|
+
- Explorer 和 Reviewer 默认只读。
|
|
65
|
+
- Test Writer 必须先于 Implementer,除非是纯文档或无法自动测试的变更。
|
|
66
|
+
- Implementer 只能执行 feature doc 里列出的 tasks。
|
|
67
|
+
- Verifier 的失败结果必须写回 feature doc,不能只在聊天里口头说明。
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. TDD 闭环
|
|
72
|
+
|
|
73
|
+
默认闭环:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
feature doc -> failing test -> minimal implementation -> tests pass -> boundary check -> docs sync -> review -> close
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
TDD 规则:
|
|
80
|
+
- 新行为先写失败测试,再实现。
|
|
81
|
+
- bug fix 先写复现测试,再修复。
|
|
82
|
+
- 重构先记录现有测试,再移动代码,最后证明行为未变。
|
|
83
|
+
- 无法自动测试时,feature doc 必须写明人工验证步骤和不可自动化原因。
|
|
84
|
+
- 不允许为了通过测试删除关键断言、放宽边界测试或跳过失败测试。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 4.1 矛盾处理
|
|
89
|
+
|
|
90
|
+
当 agent 发现 PRD、architecture、ports、data-flow、state-machines、tests 或代码互相矛盾时:
|
|
91
|
+
|
|
92
|
+
1. 停止实现,不继续猜测。
|
|
93
|
+
2. 在 feature doc 的 Decision Log 记录冲突位置、冲突内容、可选解释和推荐选择。
|
|
94
|
+
3. 如果冲突影响安全边界、端口合同、状态机或用户可见行为,先询问维护者。
|
|
95
|
+
4. 如果冲突只影响命名、注释或明显过期文档,可以按代码和测试事实修正 docs,并在 Verification 记录原因。
|
|
96
|
+
5. 修正后再继续 TDD 闭环。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 5. Write Set 和边界
|
|
101
|
+
|
|
102
|
+
Feature doc 必须写:
|
|
103
|
+
- **Allowed write set**:本次允许修改哪些文件/目录。
|
|
104
|
+
- **Forbidden scope**:明确不碰哪些文件/行为。
|
|
105
|
+
- **Architecture impact**:是否影响 `architecture.md`、`ports.md`、`data-flow.md`、`state-machines.md`。
|
|
106
|
+
- **Rollback note**:失败时如何回退本次改动,不要求回退用户已有改动。
|
|
107
|
+
|
|
108
|
+
默认禁止:
|
|
109
|
+
- 顺手重构无关模块。
|
|
110
|
+
- 为了实现一个功能修改公共契约但不更新 docs。
|
|
111
|
+
- 让 harness 承担 domain 业务判断。
|
|
112
|
+
- 绕过权限、审计、状态机和边界测试。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 6. 完成标准
|
|
117
|
+
|
|
118
|
+
一个 feature 只有同时满足这些条件才算完成:
|
|
119
|
+
- Requirements 的验收标准逐条可验证。
|
|
120
|
+
- Tasks 全部完成或明确取消并说明原因。
|
|
121
|
+
- 新增/修改行为有测试或人工验证记录。
|
|
122
|
+
- 测试框架(如 pytest、vitest、go test)通过;如果不能通过,记录具体失败和是否与本次变更相关。
|
|
123
|
+
- 架构边界测试通过,或 feature doc 记录为什么需要改变边界。
|
|
124
|
+
- 受影响 docs 已同步。
|
|
125
|
+
- Reviewer 没有未处理的 critical/high findings。
|
|
126
|
+
|
|
127
|
+
## 6.1 快车道
|
|
128
|
+
|
|
129
|
+
满足以下全部条件时,可以不开完整 feature doc,但必须在提交说明或聊天结果里写清验证:
|
|
130
|
+
|
|
131
|
+
- 只影响拼写、链接、注释、单个测试断言或单行安全修复。
|
|
132
|
+
- 不改变跨层端口、状态机、数据流、权限、审计或用户可见行为。
|
|
133
|
+
- 不新增依赖,不移动文件,不扩大 public API。
|
|
134
|
+
- 能用一个命令或一次人工检查验证。
|
|
135
|
+
|
|
136
|
+
如果快车道过程中发现影响范围变大,立即补 feature doc。
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 7. 外部参考
|
|
141
|
+
|
|
142
|
+
- OpenAI ExecPlans:复杂任务要有自包含、可恢复、可验证的执行计划。
|
|
143
|
+
- GitHub Spec Kit:constitution -> specify -> plan -> tasks -> implement。
|
|
144
|
+
- Kiro Specs:requirements -> design -> tasks,适合约束 agent 先想清楚再写代码。
|
|
145
|
+
- Claude Code Subagents / Hooks:focused subagents、权限限制、hook-based guardrails。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Harness Architecture — {{projectName}}
|
|
2
|
+
|
|
3
|
+
> **职责**:定义系统的分层结构、组件全景和关键设计决策。
|
|
4
|
+
> **不写什么**:代码细节(AI 能读代码)、API 文档(放 docstring)。
|
|
5
|
+
>
|
|
6
|
+
> 哲学来源:arc42 第 5 章 (Building Block View) + C4 Model Level 3 (Component) + matklad 的轻量 ARCHITECTURE.md。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 分层规则
|
|
11
|
+
|
|
12
|
+
<!-- 这是整个架构最硬性的约束。每个层的"允许依赖什么"必须明确。 -->
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
┌──────────────────────────┐
|
|
16
|
+
│ interfaces/ │ ← 用户入口(CLI / API / UI)
|
|
17
|
+
│ 可依赖: harness │
|
|
18
|
+
├──────────────────────────┤
|
|
19
|
+
│ harness/ │ ← 通用运行外壳:编排、安全、审计、调度
|
|
20
|
+
│ 可依赖: application │ 不包含业务规则
|
|
21
|
+
├──────────────────────────┤
|
|
22
|
+
│ application/ │ ← 业务用例编排
|
|
23
|
+
│ 可依赖: domain │
|
|
24
|
+
├──────────────────────────┤
|
|
25
|
+
│ domain/ │ ← 纯业务对象 + 端口协议
|
|
26
|
+
│ 只依赖: 标准库 │ 不依赖任何外部实现
|
|
27
|
+
├──────────────────────────┤
|
|
28
|
+
│ infrastructure/ │ ← 适配器实现(数据源、外部服务)
|
|
29
|
+
│ 实现 domain 的端口 │
|
|
30
|
+
└──────────────────────────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**硬约束**:
|
|
34
|
+
- domain 绝不导入 infrastructure/ 或 interfaces/
|
|
35
|
+
- application 只依赖 domain
|
|
36
|
+
- harness 协调流程但不包含领域业务规则
|
|
37
|
+
- 所有跨层通信通过 domain 定义的端口协议
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. Harness 核心组件
|
|
42
|
+
|
|
43
|
+
### 2.1 Runner / Loop
|
|
44
|
+
|
|
45
|
+
- **职责**:驱动一次任务从输入到完成:加载上下文、调用 application use-case、处理停止条件。
|
|
46
|
+
- **设计决策**:
|
|
47
|
+
- Runner 只编排,不解释领域含义 — 为什么:保持 harness 可复用于不同业务域
|
|
48
|
+
- 停止条件显式建模 — 为什么:防止 agent loop 无限运行或静默半完成
|
|
49
|
+
- **不负责**:业务规则、领域对象创建细节、外部服务实现
|
|
50
|
+
|
|
51
|
+
### 2.2 Permission Policy
|
|
52
|
+
|
|
53
|
+
- **职责**:决定某个工具、文件、网络或外部动作是否允许执行。
|
|
54
|
+
- **设计决策**:
|
|
55
|
+
- 默认拒绝高风险动作,允许规则显式声明 — 为什么:底座要先保证安全边界
|
|
56
|
+
- **不负责**:判断业务动作是否正确
|
|
57
|
+
|
|
58
|
+
### 2.3 Event Bus / Audit Trail
|
|
59
|
+
|
|
60
|
+
- **职责**:记录任务生命周期、工具调用、失败、人工审批和最终结果。
|
|
61
|
+
- **设计决策**:
|
|
62
|
+
- 事件追加写入,审计记录不可原地改写 — 为什么:方便回放、排错和复盘
|
|
63
|
+
- **不负责**:替业务系统保存最终数据
|
|
64
|
+
|
|
65
|
+
### 2.4 State / Checkpoint Store
|
|
66
|
+
|
|
67
|
+
- **职责**:保存可恢复状态、上下文摘要、任务进度和中断点。
|
|
68
|
+
- **设计决策**:
|
|
69
|
+
- 状态格式必须可序列化 — 为什么:便于 replay、resume、测试和迁移
|
|
70
|
+
- **不负责**:长期业务数据库建模
|
|
71
|
+
|
|
72
|
+
### 2.5 Tool Registry
|
|
73
|
+
|
|
74
|
+
- **职责**:注册可调用工具及其输入/输出契约、权限标签和错误语义。
|
|
75
|
+
- **设计决策**:
|
|
76
|
+
- 工具契约写清输入、输出、错误和副作用 — 为什么:降低 agent 误用工具的概率
|
|
77
|
+
- **不负责**:工具内部业务实现
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 3. 架构约束(不可协商)
|
|
82
|
+
|
|
83
|
+
- `domain/` 只定义业务模型、业务不变量和端口协议,不导入 `harness/`、`infrastructure/` 或 `interfaces/`。
|
|
84
|
+
- `harness/` 可以协调流程、安全门、审计和停止条件,但不能决定业务含义。
|
|
85
|
+
- 所有跨层外部能力都通过 `domain` 端口表达,适配器实现放在 `infrastructure/`。
|
|
86
|
+
- 拒绝和失败必须能被测试或在 feature doc 中写明人工验证。
|
|
87
|
+
- 审计事件追加记录,不原地改写。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 数据流 — {{projectName}}
|
|
2
|
+
|
|
3
|
+
> **职责**:定义每个事件/请求的完整生命周期——正常路径 + 所有失败分支。
|
|
4
|
+
> **这是整个 docs 里最重要的文件**——AI 实现时最常编造的就是失败路径行为。写清楚就不会。
|
|
5
|
+
>
|
|
6
|
+
> 哲学来源:EventCatalog 模式 + arc42 第 6 章 (Runtime View)。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 事件目录
|
|
11
|
+
|
|
12
|
+
| 事件类型 | 生产者 | 消费者 | Payload 关键字段 | 投递语义 | 排序要求 |
|
|
13
|
+
| --- | --- | --- | --- | --- | --- |
|
|
14
|
+
| `{{EVENT_1}}` | `{{PRODUCER}}` | `{{CONSUMERS}}` | `{{KEY_FIELDS}}` | {{SEMANTICS}} | {{ORDERING}} |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 2. 核心流程
|
|
19
|
+
|
|
20
|
+
### 2.1 正常路径
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
sequenceDiagram
|
|
24
|
+
participant Caller
|
|
25
|
+
participant Runner
|
|
26
|
+
participant Bus as EventBus/Audit
|
|
27
|
+
participant Port1 as {{PORT_NAME_1}}
|
|
28
|
+
participant Port2 as {{PORT_NAME_2}}
|
|
29
|
+
|
|
30
|
+
Caller->>Runner: {{ENTRY_POINT}}
|
|
31
|
+
Runner->>Bus: publish {{START_EVENT}}
|
|
32
|
+
Runner->>Port1: {{ACTION_1}}
|
|
33
|
+
Port1-->>Runner: {{RESULT_1}}
|
|
34
|
+
Runner->>Port2: {{ACTION_2}}
|
|
35
|
+
Port2-->>Runner: {{RESULT_2}}
|
|
36
|
+
Runner->>Bus: publish {{END_EVENT}}
|
|
37
|
+
Runner-->>Caller: {{FINAL_RESULT}}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2.2 失败路径
|
|
41
|
+
|
|
42
|
+
每个失败点必须写清:
|
|
43
|
+
- **触发条件**
|
|
44
|
+
- **系统行为**
|
|
45
|
+
- **事件发布**
|
|
46
|
+
- **调用方感知**
|
|
47
|
+
- **恢复方式**
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 3. 错误处理约定
|
|
52
|
+
|
|
53
|
+
- **可重试错误**:{{POLICY}}
|
|
54
|
+
- **不可重试错误**:{{POLICY}}
|
|
55
|
+
- **静默忽略**:{{POLICY}}
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
> **提示**:当前 data-flow.md 是空模板。请按项目实际流程填写。格式参考 ECC 仓库的实际项目示例。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 状态机 — {{projectName}}
|
|
2
|
+
|
|
3
|
+
> **职责**:定义所有有状态组件的状态、转移、守卫条件、边界行为。长流程 harness 的大量 bug 来自非法状态转移。
|
|
4
|
+
>
|
|
5
|
+
> 哲学来源:UML 2.5.1 第 15.3.14 节 + "转移表是整个文档最重要的产物"。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 状态机模板
|
|
10
|
+
|
|
11
|
+
每个有状态组件按此格式填写:
|
|
12
|
+
|
|
13
|
+
### 状态枚举
|
|
14
|
+
|
|
15
|
+
| 状态 | 描述 | 进入条件 | 退出条件 |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| `{{STATE_1}}` | {{DESCRIPTION}} | {{CONDITION}} | {{CONDITION}} |
|
|
18
|
+
| `{{STATE_2}}` | {{DESCRIPTION}} | {{CONDITION}} | {{CONDITION}} |
|
|
19
|
+
|
|
20
|
+
### 状态转移图
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
stateDiagram-v2
|
|
24
|
+
[*] --> {{INITIAL_STATE}}
|
|
25
|
+
{{INITIAL_STATE}} --> {{STATE_2}} : {{TRIGGER}}
|
|
26
|
+
{{STATE_2}} --> {{INITIAL_STATE}} : {{TRIGGER}}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 转移表(最重要)
|
|
30
|
+
|
|
31
|
+
| 当前状态 ↓ / 事件 → | `{{EVENT_1}}` | `{{EVENT_2}}` | `{{EVENT_3}}` |
|
|
32
|
+
| --- | --- | --- | --- |
|
|
33
|
+
| **`{{STATE_1}}`** | {{TARGET}} | {{TARGET}} | {{TARGET}} |
|
|
34
|
+
| **`{{STATE_2}}`** | {{TARGET}} | {{TARGET}} | {{TARGET}} |
|
|
35
|
+
|
|
36
|
+
### 守卫条件
|
|
37
|
+
|
|
38
|
+
| 转移 | 守卫条件 | 备注 |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| `{{SOURCE}} -> {{TARGET}}` | {{GUARD}} | {{NOTE}} |
|
|
41
|
+
|
|
42
|
+
### 非法转移
|
|
43
|
+
|
|
44
|
+
| 转移 | 为什么非法 |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| `{{SOURCE}} -> {{TARGET}}` | {{REASON}} |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
> **提示**:当前 state-machines.md 是空模板。请按项目实际的有状态组件填写。
|