ai-project-manage-cli 5.0.14 → 5.0.16
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/dist/index.js +80 -88
- package/package.json +2 -2
- package/template/AGENTS.md +14 -15
- package/template/rules/reply.md +15 -0
- package/template/rules/write_doc.md +30 -0
- package/template/skills/apm-apply-change/SKILL.md +60 -122
- package/template/skills/apm-deploy/SKILL.md +4 -15
- package/template/skills/apm-dev/SKILL.md +26 -10
- package/template/skills/apm-propose/SKILL.md +29 -168
- package/template/skills/apm-propose/design.md +37 -0
- package/template/skills/apm-propose/proposal.md +31 -0
- package/template/skills/apm-propose/specs.md +39 -0
- package/template/skills/apm-propose/tasks.md +16 -0
- package/template/skills/apm-review/SKILL.md +10 -14
- package/template/skills/apm-write-prd/SKILL.md +8 -61
- package/template/skills/apm-write-prd/template.md +55 -0
|
@@ -1,178 +1,116 @@
|
|
|
1
|
-
|
|
1
|
+
## 文档说明
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
按工作项中的 **`plans/tasks.md`** 驱动实现:**读规划 → 写代码 → 对账元数据 → 勾选 → 单独 commit**,直至全部完成、**停止执行**或硬阻塞。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 输入
|
|
8
|
-
|
|
9
|
-
若本轮未提供 `sessionId`:
|
|
10
|
-
|
|
11
|
-
1. 若对话中已能**唯一**确定工作项目录名,则用之。
|
|
12
|
-
2. 否则直接停止工作即可,**不要**调用 AskUserQuestion,**不要**停下来让用户当场选择。
|
|
13
|
-
|
|
14
|
-
## 停止执行(优先于继续推进)
|
|
15
|
-
|
|
16
|
-
若在实施过程中**发现**任一情况,**立即停止**本技能所驱动的后续实现与勾选(不再继续下一项任务),仅在会话中输出:
|
|
17
|
-
|
|
18
|
-
1. **客观事实**:已读到的文件/路径、与代码或任务条目的**具体矛盾点**(可摘引,避免主观评价)。
|
|
19
|
-
2. **当前进度**:处理到 `tasks.md` 的哪一条、仓库是否已有未提交改动(若有,说明范围)。
|
|
20
|
-
3. **需要用户提供什么**:为继续推进所**缺的信息或决策**(例如:以何者为准、是否接受某类改动、需确认的业务口径)。用**清单**列出,**一句一项**。
|
|
21
|
-
|
|
22
|
-
**禁止**:给出「建议你先改 A / 再改 B」「可选方案 1/2/3」「宜采用…」等**替用户决策**或**行动建议**;不指导用户如何改文档、不预设优先级。
|
|
5
|
+
**工作项根目录**:`.apm/sessions/<sessionId>/`(下文路径均相对该目录)
|
|
23
6
|
|
|
24
|
-
|
|
7
|
+
| 文件 | 路径 | 用途 |
|
|
8
|
+
| ----------------- | ------------------- | ----------------------------------------------------------------------------------------- |
|
|
9
|
+
| tasks(**驱动**) | `plans/tasks.md` | 唯一进度来源(`- [ ]` / `- [x]`);缺文件、无待办 → 阻塞,须先 **apm-propose** 或手工补齐 |
|
|
10
|
+
| PRD | `docs/PRD.md` | 范围与验收 |
|
|
11
|
+
| proposal | `plans/proposal.md` | 变更背景(按需) |
|
|
12
|
+
| design | `plans/design.md` | **改哪里**、技术决策(按任务引用) |
|
|
13
|
+
| specs | `plans/specs/*.md` | **做什么**(按任务 **需求编号** 引用) |
|
|
25
14
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
## 工作项路径与必备文件
|
|
29
|
-
|
|
30
|
-
- **根路径**:**`.apm/sessions/<sessionId>/`**
|
|
31
|
-
- **必备**:**`tasks.md`**(含 `- [ ]` / `- [x]` 待办)。若不存在或无可执行条目:**阻塞**,说明须先完成 **apm-propose**(或手工补齐 `tasks.md`)。
|
|
32
|
-
- **强烈建议读**:**`docs/PRD.md`**(`.apm/sessions/<sessionId>/docs/PRD.md`,范围与验收);实现时按需 **Read** **`proposal.md`**、**`design.md`**、**`specs/`**(与 **`tasks-instruction.md`** 中每条任务的元数据一致)。
|
|
33
|
-
- **进度**:仅由 **`tasks.md`** 中复选框统计「已完成 / 总数」。
|
|
15
|
+
**前置**:`plans/tasks.md` 须由 **apm-propose** 生成,格式见 `.apm/skills/apm-propose/tasks.md`(`- [ ]`、元数据子列表等)。
|
|
34
16
|
|
|
35
|
-
|
|
17
|
+
**sessionId**:若本轮未提供——对话中能**唯一**确定 `.apm/sessions/` 下目录名则用之,否则**停止**(不 AskUserQuestion)。确定后于**首次回复**写明 **使用工作项:`<sessionId>`** 即可,不必单独成步。
|
|
36
18
|
|
|
37
|
-
|
|
19
|
+
**单任务循环**:说明当前项 → 最小实现 → 对账(需求编号 / 预期与实际路径 / 完成标准)→ `- [x]` → **一项待办 = 一个 commit**。
|
|
38
20
|
|
|
39
21
|
---
|
|
40
22
|
|
|
41
|
-
##
|
|
23
|
+
## 停止执行(优先于继续推进)
|
|
42
24
|
|
|
43
|
-
|
|
25
|
+
发现规划与代码**严重不一致**、需用户做产品/架构**决策**、或环境/权限等**硬阻塞**时:**不再**处理下一项、**不**勾选完成,仅输出:
|
|
44
26
|
|
|
45
|
-
|
|
27
|
+
1. **客观事实**:已读路径、与任务/代码的**具体矛盾**(可摘引)。
|
|
28
|
+
2. **当前进度**:`plans/tasks.md` 处理到哪一条;未提交改动范围(若有)。
|
|
29
|
+
3. **需要用户提供什么**:清单,一句一项。
|
|
46
30
|
|
|
47
|
-
|
|
31
|
+
**禁止**:替用户决策、给「建议先改 A/B」、可选方案、排障命令(除非任务/文档已写明须执行的命令)。
|
|
48
32
|
|
|
49
|
-
|
|
50
|
-
- 若文件缺失、为空、或无任何 `- [ ]`:**停止**,提示先具备可执行 `tasks`(规划阶段)。
|
|
51
|
-
- 若全部已为 `- [x]`:**可**直接汇报「已全部完成」(仅作事实陈述,不建议是否提交或发 MR)。
|
|
33
|
+
**允许**:说明「缺某信息则无法继续」的逻辑关系(不展开成方案)。
|
|
52
34
|
|
|
53
|
-
|
|
35
|
+
**仍可继续**:任务略含糊,但在 PRD / design / specs / tasks 已有文字内可**自洽**完成;若有**假设**须写清。一旦假设触及「以谁为准」→ 转 **停止执行**。
|
|
54
36
|
|
|
55
|
-
|
|
37
|
+
---
|
|
56
38
|
|
|
57
|
-
|
|
58
|
-
- 与任务相关的 **`design.md`** 片段、**`specs/`** 下对应文件(见任务条目的 **需求编号** / 描述)
|
|
39
|
+
## 工作流程
|
|
59
40
|
|
|
60
|
-
|
|
41
|
+
### 步骤 1:读取 `plans/tasks.md` 并判断状态
|
|
61
42
|
|
|
62
|
-
|
|
43
|
+
1. **Read** `plans/tasks.md`。
|
|
44
|
+
2. 缺失、为空或无 `- [ ]` → **停止**,提示先具备可执行 tasks。
|
|
45
|
+
3. 若全部为 `- [x]` → 仅陈述「已全部完成」(不建议是否提交/MR)。
|
|
63
46
|
|
|
64
|
-
|
|
47
|
+
### 步骤 2:读取实现上下文
|
|
65
48
|
|
|
66
|
-
|
|
67
|
-
- **进度**:「N/M 个任务已完成」(由 `tasks.md` 勾选统计)
|
|
68
|
-
- **当前将处理**:下一条 `- [ ]` 的摘要(含组号/编号如 `2.1`)
|
|
49
|
+
开始**第一个**未勾选任务前,至少 **Read** `docs/PRD.md` 及当前项所需的 `plans/design.md` / `plans/specs/` 片段(见任务 **需求编号**)。不要求每项任务重读全部规划;以**当前任务行** + 缺口再 Read 为准。
|
|
69
50
|
|
|
70
|
-
|
|
51
|
+
#### 单会话读取策略
|
|
71
52
|
|
|
72
|
-
|
|
53
|
+
| 文件 | 建议 |
|
|
54
|
+
| ---------------------------------- | -------------------------------------------------------------------------------- |
|
|
55
|
+
| `docs/PRD.md` | 本会话首次实现前至少读一次 |
|
|
56
|
+
| `plans/design.md` / `plans/specs/` | 连续多项时,已读过且无疑虑可不重复全文;按任务元数据 **Read(偏移)** 或再读全文 |
|
|
73
57
|
|
|
74
|
-
|
|
75
|
-
2. **实现**所需代码/配置/迁移等;改动保持**最小**、与该项描述一致。
|
|
76
|
-
3. **标记完成前**在回复或备注中收集依据(与 **`tasks-instruction.md`** 子列表字段对齐即可):
|
|
77
|
-
- **需求编号**:本实现对应 specs / tasks 中的哪条需求或场景。
|
|
78
|
-
- **预期改动路径** 与 **实际改动文件**:若有合理偏差,简要说明原因。
|
|
79
|
-
- **验证用例编号**(若任务中有)。
|
|
80
|
-
- **验证结果** / **完成标准**:如何确认本项已达成(可简短)。
|
|
81
|
-
4. 仅在依据已齐、且自洽通过后,将 **`tasks.md`** 中对应行 **`- [ ]` 改为 `- [x]`**。
|
|
82
|
-
5. **Git**:本待办对应的**实现 + 勾选**等改动,**单独 `git commit` 一次**(**一项待办 = 一个 commit**;勿把多项待办混在同一 commit)。提交信息建议包含 `requirementId` 与任务编号或简述。
|
|
58
|
+
### 步骤 3:展示进度并开始循环
|
|
83
59
|
|
|
84
|
-
|
|
60
|
+
展示 **工作项**、**N/M 已完成**(由勾选统计)、**当前将处理**的下一条 `- [ ]`(含编号如 `2.1`)。
|
|
85
61
|
|
|
86
|
-
|
|
87
|
-
- 命令失败、环境错误、权限等**硬阻塞** → 说明原因、失败点、已执行步骤;**不**给排障步骤或替代命令建议(除非任务本身要求执行某命令且该命令已写在任务/文档中)。
|
|
88
|
-
- 用户中断。
|
|
62
|
+
对每条未勾选任务(建议自上而下):
|
|
89
63
|
|
|
90
|
-
|
|
64
|
+
1. 说明正在处理的编号与简述。
|
|
65
|
+
2. **最小**改动实现;与该项描述一致。
|
|
66
|
+
3. **勾选前**对账(与 `plans/tasks.md` 子列表字段一致):
|
|
67
|
+
- **需求编号**、**预期改动路径** vs **实际改动文件**(偏差须简述)
|
|
68
|
+
- **验证用例编号**(若有)、**完成标准** / 验证结果
|
|
69
|
+
4. 依据齐且自洽后,将对应行改为 `- [x]`,**立即**单独 `git commit`(信息含任务编号或简述)。
|
|
91
70
|
|
|
92
|
-
###
|
|
71
|
+
### 步骤 4:收尾
|
|
93
72
|
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
- 若**全部完成**:仅陈述事实(进度与勾选状态),**不**建议后续流程(MR/发布/归档等)。
|
|
97
|
-
- 若**暂停**:按 **「停止执行」** 或硬阻塞格式输出,**无**「可选后续」或方案建议。
|
|
73
|
+
- **全部完成**:进度 N/M、本会话已完成项摘要;**不**建议 MR/发布等后续流程。
|
|
74
|
+
- **暂停**:按 **停止执行** 三节输出;无「可选后续」。
|
|
98
75
|
|
|
99
76
|
---
|
|
100
77
|
|
|
101
|
-
##
|
|
78
|
+
## 会话输出(示例)
|
|
79
|
+
|
|
80
|
+
**进行中**
|
|
102
81
|
|
|
103
82
|
```
|
|
104
83
|
## 正在实施:<sessionId>
|
|
105
84
|
|
|
106
85
|
处理任务 3/7:2.1 实现导出接口
|
|
107
|
-
[...实现过程...]
|
|
108
86
|
✓ 任务完成 · commit <short-sha> <subject>
|
|
109
|
-
|
|
110
|
-
处理任务 4/7:2.2 …
|
|
111
87
|
```
|
|
112
88
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
## 全部完成时的输出(示例)
|
|
89
|
+
**全部完成**
|
|
116
90
|
|
|
117
91
|
```
|
|
118
92
|
## 实现完成
|
|
119
|
-
|
|
120
|
-
**工作项:** <sessionId>
|
|
121
|
-
**进度:** 7/7 个任务已完成 ✓
|
|
122
|
-
|
|
123
|
-
### 本会话已完成
|
|
124
|
-
- [x] …
|
|
125
|
-
- [x] …
|
|
126
|
-
|
|
93
|
+
**工作项:** <sessionId> · **进度:** 7/7 ✓
|
|
127
94
|
(每项待办均已对应独立 commit。)
|
|
128
95
|
```
|
|
129
96
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
## 暂停时的输出(示例)
|
|
97
|
+
**暂停**
|
|
133
98
|
|
|
134
99
|
```
|
|
135
100
|
## 实现已暂停
|
|
136
|
-
|
|
137
|
-
**工作项:** <sessionId>
|
|
138
|
-
**进度:** 4/7 个任务已完成
|
|
139
|
-
|
|
101
|
+
**进度:** 4/7
|
|
140
102
|
### 事实与原因
|
|
141
|
-
|
|
142
|
-
|
|
103
|
+
…
|
|
143
104
|
### 需要用户提供(或决策)
|
|
144
105
|
- …
|
|
145
|
-
- …
|
|
146
106
|
```
|
|
147
107
|
|
|
148
|
-
(无方案列表、无「建议」;用户补充信息后可再次运行本技能。)
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## 约束
|
|
153
|
-
|
|
154
|
-
- 持续执行待办直至完成、**停止执行**或硬阻塞。
|
|
155
|
-
- 开始前须已能对照 **`tasks.md`** 与 **`docs/PRD.md`**(及任务所需的 design/spec);**不要**在未读清当前任务依赖时盲改。
|
|
156
|
-
- 任务表述有歧义时,仅在**无需用户决策**的前提下依据 **specs / design / docs/PRD.md** 推断;一旦涉及**以谁为准**或**严重不一致**,**停止执行**(见上文)。
|
|
157
|
-
- **不**因「发现规划与代码不符」而**主动建议**修改 `design.md` / `specs/` / `tasks.md`;**停止**并说明事实与需用户提供的材料即可。
|
|
158
|
-
- 代码改动保持最小、与**当前任务**范围一致。
|
|
159
|
-
- 未完成需求/验证对账前,**不要**将任务勾为完成。
|
|
160
|
-
- 验证失败或依据不足时,保持 **`- [ ]`**,并明确写出缺口。
|
|
161
|
-
- 若任务元数据缺失(需求编号、预期改动路径、完成标准等),在可能范围内于实现前**补全或按 tasks 模板推断**,并在说明中注明。
|
|
162
|
-
- 每完成一项任务并记录依据后,**立即**更新勾选并**随即**单独 `git commit`。
|
|
163
|
-
- 遇硬阻塞时暂停并说明原因(**不**给出替代命令或排查建议,除非任务/文档已写明);
|
|
164
|
-
- 需求不清且无法自洽推断时,**停止执行**并列出需用户提供的材料;**不反问用户**。
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## 与规划流程的衔接
|
|
169
|
-
|
|
170
|
-
- **`tasks.md`** 须由 **apm-propose**(或等价流程)生成并符合 **`tasks-instruction.md`** 格式(`- [ ]`、元数据子列表等),否则本技能无法可靠追踪。
|
|
171
|
-
- 若执行中发现 **`design` / `specs` 与代码严重不一致**:**停止执行**,按上文输出事实与**需用户提供**的决策/信息;**不**建议先改哪类工件、不代用户排优先级。
|
|
172
|
-
|
|
173
108
|
---
|
|
174
109
|
|
|
175
|
-
##
|
|
110
|
+
## Guardrails
|
|
176
111
|
|
|
177
|
-
-
|
|
178
|
-
-
|
|
112
|
+
- 持续执行待办,直至完成、**停止执行**或硬阻塞。
|
|
113
|
+
- 未读清当前任务依赖前**不要**盲改;未对账前**不要**勾选完成。
|
|
114
|
+
- 验证失败或依据不足时保持 `- [ ]` 并写明缺口;元数据缺失时在实现前尽量补全或按 tasks 模板推断并注明。
|
|
115
|
+
- **不要**因发现规划与代码不符而主动改 `plans/` 下规划文件或建议改哪份;**停止**并交还用户。
|
|
116
|
+
- **可分段调用**:部分完成后结束会话,下次同一工作项继续;规划修订由用户在流程外完成后再运行本技能。
|
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
## 工作流程
|
|
2
2
|
|
|
3
3
|
### 步骤1: 阅读部署文档
|
|
4
|
+
使用**Read**工具阅读 `.apm/deploy/README.md`
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### 步骤2: 按照文档执行部署命令,禁止猜测参数
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
遇到以下情况拒绝部署,直接退出即可
|
|
8
|
+
如果遇到以下情况则无需部署,直接退出部署流程
|
|
10
9
|
1. 没有找到部署文档,或者部署文档没有可执行的部署命令(或者说部署不可执行)
|
|
11
|
-
2. 用户没有明确部署环境
|
|
12
|
-
|
|
13
|
-
### 步骤3: 按照文档执行部署
|
|
14
|
-
|
|
15
|
-
**严格对照** README:顺序、工作目录(若文档指定 `cd`)、环境变量、所用 CLI(如 `rush`、`docker`、`kubectl` 等)均以文档为准;将步骤 3 得到的 **`env` 等**按 README 约定注入命令或环境(禁止凭猜测填值)。**默认在 `<repoRoot>` 执行**;
|
|
16
|
-
|
|
17
|
-
## Guardrails
|
|
18
|
-
|
|
19
|
-
- **gitignore 不等于不存在**:`.apm` 下文件可能不入 Git 索引;**禁止**用「搜索无结果」代替 **Read** 或磁盘校验。
|
|
20
|
-
- **不臆造**:README 未写的命令、环境、目标集群/命名空间,**不补充**;工作项 YAML **未提供**的字段**不得**编造。
|
|
21
|
-
- **不报假成功**:命令失败或未完成 README 目标时,结论必须为「否」或等价表述。
|
|
10
|
+
2. 用户没有明确部署环境
|
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
## 工作流程
|
|
2
2
|
|
|
3
|
-
1
|
|
3
|
+
### 步骤 1: 获取当前版本 PRD 的内容以及协作内容
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
1. 用 **Read** 工具阅读 `.apm/sessions/<会话ID>/docs/PRD.md`,如果不存在则开发失败,退出流程。
|
|
6
|
+
2. 按需阅读 `.apm/sessions/<会话ID>/docs`下的其他文档,比如前后端联调的文档
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
### 步骤 2: 明确开发模式
|
|
9
|
+
|
|
10
|
+
**Quick 开发**(满足越多越适用):
|
|
11
|
+
|
|
12
|
+
- 影响范围局部:少量文件或单一层次(例如仅前端组件、或仅一个后端模块小改)。
|
|
13
|
+
- 无新表结构/大规模迁移/权限模型变更。
|
|
14
|
+
- PRD 验收点清晰且数量少(经验上 **≤3** 条独立验收维度)。
|
|
15
|
+
- 不需要跨多服务的架构裁定即可开工。
|
|
16
|
+
|
|
17
|
+
**Spec 开发**:(命中任一条即可):
|
|
18
|
+
|
|
19
|
+
- 前后端联动、多包改造或新公共抽象。
|
|
20
|
+
- 新数据模型、迁移、或安全/审计/权限相关。
|
|
21
|
+
- PRD 范围大、条款多,或存在明显「待确认/多方案」需先规划。
|
|
22
|
+
- 评估认为不先产出 **proposal / design / specs / tasks** 不宜直接编码。
|
|
23
|
+
|
|
24
|
+
### 步骤 3: 如果前一步判定为 **Quick 开发** 才(在子 Agent 中)执行本步骤,否则执行下一步:
|
|
9
25
|
|
|
10
26
|
- 父 Agent 已通过 **Read** 掌握 `PRD.md`;若启动新子 Agent,在委派提示中写明会话 ID、消息 ID、工作项路径、以及「实现须严格对照 PRD,改动范围最小化;完成后若有代码改动须单独 `git commit`」。
|
|
11
27
|
- 使用 **Task** 工具,`subagent_type: generalPurpose`,**readonly: false**,委派子 Agent:
|
|
@@ -14,14 +30,14 @@
|
|
|
14
30
|
- **Git**:实现与自洽验收通过后,若有代码改动,**立即 `git add` + `git commit` 一次**(Quick 通常为单次交付,**一次实现 = 一个 commit**;勿拆成无意义碎 commit)。提交信息建议包含 `seesionId`(可从 `session.yaml` 或 PRD 获取)与 PRD 摘要或验收点简述。
|
|
15
31
|
- 完成后在返回中说明:改了哪些路径、如何对照验收、是否通过本地可执行的检查(若子 Agent 跑了 `rushx build` / 测试等则写明结果);若有 commit,写明 **short-sha** 与 **subject**,无代码改动则注明跳过 commit。
|
|
16
32
|
|
|
17
|
-
|
|
33
|
+
### 步骤 4: 如果前一步判定为 **Spec 开发** 才(在子 Agent 中)执行本步骤,否则执行下一步:
|
|
18
34
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
35
|
+
1. 父 Agent **Read** `.apm/skills/apm-propose/SKILL.md` 和 `.apm/skills/apm-apply-change/SKILL.md`
|
|
36
|
+
2. **子 Agent A(规划)**:Task `generalPurpose`,提示其自行 **Read** `.apm/skills/apm-propose/SKILL.md` 并完整遵循:在 `plans/` 下生成 **proposal、design、specs、tasks** 等工件。
|
|
37
|
+
3. **子 Agent B(实现)**:待 A 成功落盘后,再 Task `generalPurpose`,提示其自行 **Read** `.apm/skills/apm-apply-change/SKILL.md` 并完整遵循:按 **`plans/tasks.md`** 驱动实现与勾选;遵守该技能中的停止条件与 commit 约定。
|
|
38
|
+
4. 若 **apm-propose** 未产出可用 **`plans/tasks.md`**,不得强行进入 **apm-apply-change**;表格中标记阻塞原因。
|
|
23
39
|
|
|
24
|
-
|
|
40
|
+
### 步骤 5: 提交并 push 代码,保证工作区干净
|
|
25
41
|
|
|
26
42
|
- Quick / Spec 子 Agent 完成且本地已有 commit 时,父 Agent **立即 `git push`**(当前分支首次 push 用 `git push -u origin HEAD`)。
|
|
27
43
|
- 无本地 commit、无远程或未配置 upstream 时说明原因,勿强行 push。
|
|
@@ -1,191 +1,52 @@
|
|
|
1
|
-
|
|
1
|
+
## 文档说明
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
从 **PRD** 为事实来源,在 `plans/` 下产出四份规划工件(`docs/PRD.md` 除外),供 **apm-apply-change** 按 `plans/tasks.md` 勾选推进实现。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 输入
|
|
8
|
-
|
|
9
|
-
| 字段 | 规则 |
|
|
10
|
-
| --------------- | ------------------------------------------------------ |
|
|
11
|
-
| **`sessionId`** | **必填**。与 `.apm/sessions/<sessionId>/` 目录名一致。 |
|
|
12
|
-
| **需求正文** | **唯一权威**:`.apm/sessions/<sessionId>/docs/PRD.md`。 |
|
|
13
|
-
|
|
14
|
-
用户补充仅在与 PRD 兼容时写入,并标注 **「会话补充(PRD 未载明)」**。PRD 未写明的**不反问用户**,写入后续工件的假设 / 待确认。
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## 流程
|
|
19
|
-
|
|
20
|
-
**顺序**:`proposal` → `design` 与 `specs`(可并行,均依赖 proposal;specs 不依赖 design)→ `tasks`(依赖 design 与 specs 均已落盘)。
|
|
21
|
-
|
|
22
|
-
用 **TodoWrite** 跟踪四工件(`ready` / `blocked` / `done`),**每完成一工件即落盘并标 `done`**;依赖未满足时**不得**写下一工件。
|
|
23
|
-
|
|
24
|
-
1. **Read `docs/PRD.md` 全文**(路径:`.apm/sessions/<sessionId>/docs/PRD.md`);必要时 **SemanticSearch** / **Read** 仓库代码,便于 tasks 中 **预期改动路径** 可落地。
|
|
25
|
-
2. 按解锁顺序撰写各工件(见下方章节)。
|
|
26
|
-
3. 全部完成后汇总:工作项路径、已创建文件、PRD 与各工件的对应关系(一两句);回复含各工件一句话用途。
|
|
27
|
-
|
|
28
|
-
### 单会话读取策略
|
|
29
|
-
|
|
30
|
-
同一会话连续跑完时,可省略重复 Read,但**不得**省略依赖关系;断点续写或新会话须按各工件「依赖」重新 Read 磁盘文件。
|
|
31
|
-
|
|
32
|
-
| 文件 | 建议 |
|
|
33
|
-
| ---------------------- | ----------------------------------------------------------------- |
|
|
34
|
-
| `docs/PRD.md` | 进入流程时至少读一次全文;后续按需再读。 |
|
|
35
|
-
| `proposal.md` | 落盘后写 design/specs 时,若会话内已有刚写入的全文可不重复 Read。 |
|
|
36
|
-
| `design.md` / `specs/` | 写 tasks 时若无可靠记忆须 Read;以落盘文件为准。 |
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## proposal 工件
|
|
41
|
-
|
|
42
|
-
**路径**:`.apm/sessions/<sessionId>/proposal.md`
|
|
5
|
+
**工作项根目录**:`.apm/sessions/<sessionId>/`(下文路径均相对该目录)
|
|
43
6
|
|
|
44
|
-
|
|
7
|
+
| 工件 | 落盘路径 | 作用 | 依赖 | 撰写规范 |
|
|
8
|
+
| ----------- | ----------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------- | ------------------------ |
|
|
9
|
+
| PRD(输入) | `docs/PRD.md` | 需求与验收的事实来源 | — | — |
|
|
10
|
+
| proposal | `plans/proposal.md` | **Why / What**;**Capabilities** 与 `plans/specs/` 的契约;不写实现细节 | PRD | **Read** `./proposal.md` |
|
|
11
|
+
| design | `plans/design.md` | **How**:架构与决策;不写逐行代码,不替代 `plans/tasks.md` | PRD、proposal | **Read** `./design.md` |
|
|
12
|
+
| specs | `plans/specs/<name>.md` | 系统**应做什么**;与 **Capabilities** 逐条对齐,不得虚构 PRD/proposal 未出现的能力 | PRD、proposal(**不**依赖 design) | **Read** `./specs.md` |
|
|
13
|
+
| tasks | `plans/tasks.md` | 将 specs + design 拆为 `- [ ]` 可勾选任务 | PRD、proposal、design、specs(至少 1 个 `.md`) | **Read** `./tasks.md` |
|
|
45
14
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
**Capabilities** 是 proposal 与 specs 的契约:每一项须在后续 `specs/` 可追溯。
|
|
49
|
-
|
|
50
|
-
- **New Capabilities**:每条对应 `specs/<kebab-name>.md`(如 `user-auth`)。
|
|
51
|
-
- **Modified Capabilities**:规格层行为变更;无则写「无」。
|
|
52
|
-
|
|
53
|
-
```markdown
|
|
54
|
-
## Why
|
|
55
|
-
|
|
56
|
-
<!-- 1~2 句:解决什么、为何是现在 -->
|
|
57
|
-
|
|
58
|
-
## What Changes
|
|
59
|
-
|
|
60
|
-
<!-- 变更要点;破坏性变更标注 BREAKING -->
|
|
61
|
-
|
|
62
|
-
## Capabilities
|
|
63
|
-
|
|
64
|
-
### New Capabilities
|
|
65
|
-
|
|
66
|
-
- `<name>`: <brief description>
|
|
67
|
-
|
|
68
|
-
### Modified Capabilities
|
|
69
|
-
|
|
70
|
-
- `<existing-name>`: <what requirement behavior changes> <!-- 无则写 无 -->
|
|
71
|
-
|
|
72
|
-
## Impact
|
|
73
|
-
|
|
74
|
-
<!-- 受影响代码、API、依赖、系统 -->
|
|
75
|
-
```
|
|
15
|
+
**撰写顺序**:`proposal` → `design` 与 `specs`(可并行)→ `tasks`(须等 design 与 specs 均已落盘)。
|
|
76
16
|
|
|
77
17
|
---
|
|
78
18
|
|
|
79
|
-
##
|
|
80
|
-
|
|
81
|
-
**路径**:`.apm/sessions/<sessionId>/design.md`
|
|
82
|
-
|
|
83
|
-
**依赖**:`docs/PRD.md`、`proposal.md`
|
|
84
|
-
|
|
85
|
-
说明 **如何实现**(HOW):架构与决策,不写逐行代码,不替代 tasks 里的步骤枚举。
|
|
86
|
-
|
|
87
|
-
跨模块、新依赖、安全/性能/迁移复杂或方案待拍板时写完整版;否则可精简,但保留 **Context** 与 **Decisions**。
|
|
19
|
+
## 工作流程
|
|
88
20
|
|
|
89
|
-
|
|
90
|
-
## Context
|
|
91
|
-
|
|
92
|
-
## Goals / Non-Goals
|
|
93
|
-
|
|
94
|
-
**Goals:**
|
|
95
|
-
**Non-Goals:**
|
|
96
|
-
|
|
97
|
-
## Decisions
|
|
98
|
-
|
|
99
|
-
<!-- 每项:备选 + 取舍理由 -->
|
|
100
|
-
|
|
101
|
-
## Risks / Trade-offs
|
|
102
|
-
|
|
103
|
-
<!-- [风险] → 缓解 -->
|
|
104
|
-
|
|
105
|
-
## Migration Plan
|
|
106
|
-
|
|
107
|
-
<!-- 无则写 无 / 不适用 -->
|
|
108
|
-
|
|
109
|
-
## Open Questions
|
|
110
|
-
|
|
111
|
-
<!-- 无则写 无 -->
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## specs 工件
|
|
117
|
-
|
|
118
|
-
**路径**:`.apm/sessions/<sessionId>/specs/`
|
|
119
|
-
|
|
120
|
-
**依赖**:`docs/PRD.md`、`proposal.md`(不依赖 design)
|
|
121
|
-
|
|
122
|
-
定义系统 **应做什么**;与 proposal **Capabilities** 逐条对齐,**不得**虚构 PRD/proposal 未出现的能力。
|
|
123
|
-
|
|
124
|
-
**文件组织**:一能力一文件 `specs/<短横线名称>.md`(或 `specs/<名称>/规格.md`,同一工作项内择一,勿混用)。
|
|
125
|
-
|
|
126
|
-
**结构**:
|
|
127
|
-
|
|
128
|
-
- 分块(`##`):**新增需求** / **变更需求** / **移除需求** / **重命名需求**(按需组合;纯新增只用「新增需求」)。
|
|
129
|
-
- 需求:`**### 需求:<名称>**`;行为用 **须、必须**。
|
|
130
|
-
- 场景:`**#### 场景:<名称>**`(固定四个 `#`);正文 `- **当** …` / `- **则** …`。
|
|
131
|
-
- **每条需求至少一个场景**;变更需求须写**完整替换段落**(从需求到全部场景),禁止只贴片段。
|
|
132
|
-
|
|
133
|
-
```markdown
|
|
134
|
-
## 新增需求
|
|
135
|
-
|
|
136
|
-
### 需求:<名称>
|
|
137
|
-
|
|
138
|
-
系统须 …
|
|
139
|
-
|
|
140
|
-
#### 场景:<名称>
|
|
141
|
-
|
|
142
|
-
- **当** …
|
|
143
|
-
- **则** …
|
|
144
|
-
|
|
145
|
-
## 变更需求
|
|
146
|
-
|
|
147
|
-
<!-- 完整替换后的需求 + 全部场景 -->
|
|
148
|
-
|
|
149
|
-
## 移除需求
|
|
150
|
-
|
|
151
|
-
### 需求:<名称>
|
|
152
|
-
|
|
153
|
-
**原因**:… **迁移说明**:…
|
|
154
|
-
|
|
155
|
-
## 重命名需求
|
|
156
|
-
|
|
157
|
-
- **原名称:** … **新名称:** …
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
---
|
|
21
|
+
### 步骤 1:读取 PRD 与协作上下文
|
|
161
22
|
|
|
162
|
-
|
|
23
|
+
1. **Read** `docs/PRD.md`;不存在则失败并退出。
|
|
24
|
+
2. 按需 **Read** `docs/` 下其他文档(如联调说明)。
|
|
163
25
|
|
|
164
|
-
|
|
26
|
+
### 步骤 2:按顺序落盘四工件
|
|
165
27
|
|
|
166
|
-
|
|
28
|
+
遵循上表**撰写顺序**与**依赖**;每完成一工件即写入对应**落盘路径**。
|
|
167
29
|
|
|
168
|
-
|
|
30
|
+
### 步骤 3:跟踪与收尾
|
|
169
31
|
|
|
170
|
-
|
|
32
|
+
1. 用 **TodoWrite** 跟踪四工件(`ready` / `blocked` / `done`);依赖未满足时**不得**写下一工件。
|
|
33
|
+
2. 撰写前 **Read** 依赖项及该工件**撰写规范**列中的 `./*.md`;写 `tasks` 前必要时 **SemanticSearch** / **Read** 仓库代码,使**预期改动路径**可落地。
|
|
34
|
+
3. 全部完成后汇总:工作项路径、已创建文件、PRD 与各工件对应关系(一两句);回复含各工件一句话用途。
|
|
171
35
|
|
|
172
|
-
|
|
173
|
-
- 每项下方缩进子列表:**需求编号**(对应 specs 中需求/场景)、**预期改动路径**、**验证用例编号**(可选)、**完成标准**。
|
|
174
|
-
- **做什么**以 specs 为准,**改哪里**以 design 为准;按技术依赖排序。
|
|
36
|
+
#### 单会话读取策略
|
|
175
37
|
|
|
176
|
-
|
|
177
|
-
## 1. 数据层
|
|
38
|
+
同一会话连续跑完时可省略重复 Read,但**不得**省略依赖关系;断点续写或新会话须按上表**依赖**列重新 Read 磁盘文件。
|
|
178
39
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
40
|
+
| 文件 | 建议 |
|
|
41
|
+
| ---------------------------------- | ----------------------------------------------------- |
|
|
42
|
+
| `docs/PRD.md` | 进入流程时至少读一次全文 |
|
|
43
|
+
| `plans/proposal.md` | 写 design/specs 时,若本会话刚写入全文可不重复 Read |
|
|
44
|
+
| `plans/design.md` / `plans/specs/` | 写 `plans/tasks.md` 时若无可靠记忆须 Read;以落盘为准 |
|
|
184
45
|
|
|
185
46
|
---
|
|
186
47
|
|
|
187
48
|
## Guardrails
|
|
188
49
|
|
|
189
50
|
- 后写须与 PRD 及已落盘前序文件一致。
|
|
190
|
-
-
|
|
51
|
+
- 四工件缺一不可(`plans/specs/` 至少一个 `.md`);落盘非空后再进下一工件。
|
|
191
52
|
- **默认不覆盖**已有规划文件;用户明确要求「整目录覆盖重生成」时除外。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
## 撰写说明
|
|
2
|
+
|
|
3
|
+
跨模块、新依赖、安全/性能/迁移复杂或方案待拍板时写完整版;否则可精简,但保留 **Context** 与 **Decisions**。
|
|
4
|
+
|
|
5
|
+
## 模板
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
<!-- 背景、约束、与 PRD / proposal 的衔接 -->
|
|
11
|
+
|
|
12
|
+
## Goals / Non-Goals
|
|
13
|
+
|
|
14
|
+
**Goals:**
|
|
15
|
+
|
|
16
|
+
<!-- 本设计要达成的目标 -->
|
|
17
|
+
|
|
18
|
+
**Non-Goals:**
|
|
19
|
+
|
|
20
|
+
<!-- 明确不在本设计范围内的事项 -->
|
|
21
|
+
|
|
22
|
+
## Decisions
|
|
23
|
+
|
|
24
|
+
<!-- 每项:备选 + 取舍理由 -->
|
|
25
|
+
|
|
26
|
+
## Risks / Trade-offs
|
|
27
|
+
|
|
28
|
+
<!-- [风险] → 缓解 -->
|
|
29
|
+
|
|
30
|
+
## Migration Plan
|
|
31
|
+
|
|
32
|
+
<!-- 无则写 无 / 不适用 -->
|
|
33
|
+
|
|
34
|
+
## Open Questions
|
|
35
|
+
|
|
36
|
+
<!-- 无则写 无 -->
|
|
37
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
## 模板
|
|
2
|
+
|
|
3
|
+
```markdown
|
|
4
|
+
## Why
|
|
5
|
+
|
|
6
|
+
<!-- 1~2 句:解决什么、为何是现在 -->
|
|
7
|
+
|
|
8
|
+
## What Changes
|
|
9
|
+
|
|
10
|
+
<!-- 变更要点;破坏性变更标注 BREAKING -->
|
|
11
|
+
|
|
12
|
+
## Capabilities
|
|
13
|
+
|
|
14
|
+
<!-- proposal 与 specs 的契约:每一项须在后续 `plans/specs/` 可追溯 -->
|
|
15
|
+
|
|
16
|
+
### New Capabilities
|
|
17
|
+
|
|
18
|
+
<!-- 每条对应 `plans/specs/<kebab-name>.md`(如 `user-auth`)。 -->
|
|
19
|
+
|
|
20
|
+
- `<name>`: <brief description>
|
|
21
|
+
|
|
22
|
+
### Modified Capabilities
|
|
23
|
+
|
|
24
|
+
<!-- 规格层行为变更;无则写「无」 -->
|
|
25
|
+
|
|
26
|
+
- `<existing-name>`: <what requirement behavior changes>
|
|
27
|
+
|
|
28
|
+
## Impact
|
|
29
|
+
|
|
30
|
+
<!-- 受影响代码、API、依赖、系统 -->
|
|
31
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
## 文件组织
|
|
2
|
+
|
|
3
|
+
一能力一文件 `plans/specs/<短横线名称>.md`(或 `plans/specs/<名称>/规格.md`,同一工作项内择一,勿混用)。
|
|
4
|
+
|
|
5
|
+
## 结构约定
|
|
6
|
+
|
|
7
|
+
- 分块(`##`):**新增需求** / **变更需求** / **移除需求** / **重命名需求**(按需组合;纯新增只用「新增需求」)。
|
|
8
|
+
- 需求:`**### 需求:<名称>**`;行为用 **须、必须**。
|
|
9
|
+
- 场景:`**#### 场景:<名称>**`(固定四个 `#`);正文 `- **当** …` / `- **则** …`。
|
|
10
|
+
- **每条需求至少一个场景**;变更需求须写**完整替换段落**(从需求到全部场景),禁止只贴片段。
|
|
11
|
+
|
|
12
|
+
## 模板
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
## 新增需求
|
|
16
|
+
|
|
17
|
+
### 需求:<名称>
|
|
18
|
+
|
|
19
|
+
系统须 …
|
|
20
|
+
|
|
21
|
+
#### 场景:<名称>
|
|
22
|
+
|
|
23
|
+
- **当** …
|
|
24
|
+
- **则** …
|
|
25
|
+
|
|
26
|
+
## 变更需求
|
|
27
|
+
|
|
28
|
+
<!-- 完整替换后的需求 + 全部场景 -->
|
|
29
|
+
|
|
30
|
+
## 移除需求
|
|
31
|
+
|
|
32
|
+
### 需求:<名称>
|
|
33
|
+
|
|
34
|
+
**原因**:… **迁移说明**:…
|
|
35
|
+
|
|
36
|
+
## 重命名需求
|
|
37
|
+
|
|
38
|
+
- **原名称:** … **新名称:** …
|
|
39
|
+
```
|