paseo-req-kit 0.0.0-stage → 1.8.0-beta.3
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/CHANGELOG.md +283 -0
- package/LICENSE +21 -0
- package/README.md +146 -2
- package/SCOPE.md +11 -0
- package/bin/locate.mjs +46 -0
- package/bin/req-doctor.mjs +21 -0
- package/bin/req.mjs +179 -0
- package/bin/start-pipeline +21 -0
- package/bin/start-pipeline.mjs +22 -0
- package/config.example.json +132 -0
- package/contracts/README.md +18 -0
- package/contracts/feature-files.md +117 -0
- package/contracts/notifier-event.md +72 -0
- package/contracts/result-file.md +21 -0
- package/contracts/spec.md +36 -0
- package/contracts/state.md +49 -0
- package/contracts/verify.md +41 -0
- package/docs/adr/0001-step-agents-under-origin-chat.md +15 -0
- package/docs/adr/0002-no-directory-switch-in-chat.md +15 -0
- package/docs/adr/0003-script-engine-not-hub.md +15 -0
- package/docs/adr/0004-result-files.md +15 -0
- package/docs/adr/0005-no-default-branch-local-commits-only.md +15 -0
- package/docs/adr/0006-skill-install-targets.md +15 -0
- package/docs/adr/0007-own-interview-skill.md +15 -0
- package/docs/adr/0008-entries-do-not-call-entries.md +15 -0
- package/docs/adr/0009-versioned-install-layout.md +15 -0
- package/docs/adr/0010-generated-feature-overview.md +15 -0
- package/docs/adr/0011-resume-after-completion.md +15 -0
- package/docs/adr/0012-review-panel.md +18 -0
- package/docs/adr/0013-no-release-tooling.md +15 -0
- package/docs/adr/0014-notifier-slot.md +19 -0
- package/docs/adr/0015-incremental-continue.md +17 -0
- package/docs/adr/0016-upgrade-from-tags.md +19 -0
- package/docs/adr/0017-use-paseo-capabilities.md +18 -0
- package/docs/adr/0018-own-worktree-option.md +21 -0
- package/docs/adr/0019-parallel-orchestration.md +21 -0
- package/docs/adr/0020-scheduling-through-the-chat.md +21 -0
- package/docs/adr/0021-npm-version-manager.md +19 -0
- package/docs/adr/0022-develop-and-verify-phases.md +32 -0
- package/docs/adr/0023-types-gate-slices.md +54 -0
- package/docs/adr/0024-confirm-early-review-axes.md +27 -0
- package/docs/adr/0025-joint-requirements.md +27 -0
- package/docs/adr/README.md +29 -0
- package/docs/guide//344/275/277/347/224/250/350/200/205/346/214/207/345/215/227.md +96 -0
- package/docs/guide//345/256/211/350/243/205/344/270/216/345/215/207/347/272/247.md +348 -0
- package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +85 -0
- package/docs/guide//351/241/271/347/233/256/345/256/232/345/210/266/344/270/216/350/277/220/350/241/214/350/247/204/345/210/231.md +356 -0
- package/engine/prompts/00-shared-context.md +104 -0
- package/engine/prompts/02-spec-review.md +46 -0
- package/engine/prompts/03-design.md +73 -0
- package/engine/prompts/03a-design-proposal.md +30 -0
- package/engine/prompts/04-design-review.md +73 -0
- package/engine/prompts/04b-design-revise.md +41 -0
- package/engine/prompts/05-implement.md +72 -0
- package/engine/prompts/06-code-review.md +70 -0
- package/engine/prompts/07-review-fix.md +41 -0
- package/engine/prompts/07b-handoff.md +45 -0
- package/engine/prompts/08-service-start.md +59 -0
- package/engine/prompts/09-verify.md +90 -0
- package/engine/prompts/10-defect-fix.md +41 -0
- package/engine/prompts/10b-reverify.md +43 -0
- package/engine/prompts/11-report.md +112 -0
- package/engine/prompts/browser-verify.md +13 -0
- package/engine/prompts/incremental.md +22 -0
- package/engine/prompts/joint.md +55 -0
- package/engine/prompts/panel-member.md +38 -0
- package/engine/prompts/paseo-services.md +9 -0
- package/engine/prompts/related-repos.md +7 -0
- package/engine/prompts/review-axis-spec.md +10 -0
- package/engine/prompts/review-axis-standards.md +11 -0
- package/engine/prompts/types/assessment.md +41 -0
- package/engine/prompts/types/defect.md +55 -0
- package/engine/prompts/types/refactor.md +39 -0
- package/engine/prompts/verify-deployed.md +14 -0
- package/engine/src/activity.ts +87 -0
- package/engine/src/cli-args.ts +217 -0
- package/engine/src/config.ts +619 -0
- package/engine/src/configure.ts +237 -0
- package/engine/src/control.ts +246 -0
- package/engine/src/daemon-check.ts +104 -0
- package/engine/src/daemon-version.ts +66 -0
- package/engine/src/digest.ts +142 -0
- package/engine/src/doctor.ts +462 -0
- package/engine/src/eval.ts +324 -0
- package/engine/src/features.ts +270 -0
- package/engine/src/gate.ts +157 -0
- package/engine/src/git.ts +30 -0
- package/engine/src/joint.ts +173 -0
- package/engine/src/launch.ts +405 -0
- package/engine/src/lessons.ts +72 -0
- package/engine/src/locations.ts +55 -0
- package/engine/src/main.ts +346 -0
- package/engine/src/messages.ts +394 -0
- package/engine/src/notifiers.ts +76 -0
- package/engine/src/notify-test.ts +101 -0
- package/engine/src/paseo-json.ts +73 -0
- package/engine/src/paseo-profiles.ts +133 -0
- package/engine/src/paseo-runtime.ts +437 -0
- package/engine/src/paths.ts +10 -0
- package/engine/src/pipeline.ts +1840 -0
- package/engine/src/playbooks.ts +46 -0
- package/engine/src/preflight.ts +337 -0
- package/engine/src/prompts.ts +72 -0
- package/engine/src/queue.ts +61 -0
- package/engine/src/runtime-loader.ts +14 -0
- package/engine/src/runtime.ts +155 -0
- package/engine/src/schedule-time.ts +51 -0
- package/engine/src/smoke-test.ts +202 -0
- package/engine/src/spec-review.ts +100 -0
- package/engine/src/state.ts +333 -0
- package/engine/src/steps.ts +266 -0
- package/engine/src/usage.ts +67 -0
- package/engine/src/worktree.ts +72 -0
- package/install.mjs +928 -0
- package/notifiers/im-template.mjs +60 -0
- package/package.json +67 -4
- package/principles/INDEX.md +11 -0
- package/skills/acceptance-criteria/SKILL.md +61 -0
- package/skills/principle-delete-before-add/SKILL.md +33 -0
- package/skills/principle-dont-block-on-humans/SKILL.md +35 -0
- package/skills/principle-fix-root-cause/SKILL.md +33 -0
- package/skills/principle-prove-it-works/SKILL.md +33 -0
- package/skills/principle-report-honestly/SKILL.md +33 -0
- package/skills/principle-speak-to-reader/SKILL.md +33 -0
- package/skills/principle-this-requirement-only/SKILL.md +33 -0
- package/skills/req/SKILL.md +101 -0
- package/skills/req/playbooks/accept.md +65 -0
- package/skills/req/playbooks/change.md +51 -0
- package/skills/req/playbooks/incident.md +55 -0
- package/skills/req/playbooks/new.md +94 -0
- package/skills/req/playbooks/small.md +48 -0
- package/skills/req/playbooks/status.md +41 -0
- package/skills/req/playbooks/takeover.md +51 -0
- package/skills/req/playbooks/verify.md +57 -0
- package/skills/req-doctor/SKILL.md +36 -0
- package/skills/req-retro/SKILL.md +81 -0
- package/skills/req-setup/SKILL.md +118 -0
- package/skills/req-setup/templates/paseo/copy-local-files.mjs +32 -0
- package/skills/req-setup/templates/paseo/with-port.mjs +36 -0
- package/skills/requirement-interview/SKILL.md +97 -0
- package/skills/requirement-kickoff/SKILL.md +17 -0
- package/skills/result-report/SKILL.md +34 -0
- package/skills/spec-writing/SKILL.md +55 -0
- package/skills/spec-writing/spec-template.md +109 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// req-kit 外部通知模板:接入企业内部 IM(或任何其他渠道)。
|
|
2
|
+
//
|
|
3
|
+
// 用法:
|
|
4
|
+
// 1. 复制到 ~/.req-kit/notifiers/im.mjs(或团队配置仓库中),按下面的 TODO 实现发送。
|
|
5
|
+
// 2. 在本机配置 ~/.req-kit/config.json(或团队配置)中加上:
|
|
6
|
+
// "notifiers": [
|
|
7
|
+
// { "module": "~/.req-kit/notifiers/im.mjs",
|
|
8
|
+
// "events": ["blocked", "failed", "completed"],
|
|
9
|
+
// "options": { "webhook": "https://im.example.internal/hook/xxxx" } }
|
|
10
|
+
// ]
|
|
11
|
+
// module 可以是绝对路径、"~/" 开头的路径,或相对配置文件所在目录的路径。
|
|
12
|
+
// events 不写时发送全部事件:milestone、blocked、permission、failed、completed、phase_done、approval、digest。
|
|
13
|
+
// 3. 在终端运行 `req notify-test`(或 `req notify-test --type blocked`)发一条测试通知,不需要运行流水线。
|
|
14
|
+
//
|
|
15
|
+
// 约定(详见 contracts/notifier-event.md):
|
|
16
|
+
// - 导出 default(或名为 notify 的)函数,参数为 (event, options),可以是 async。
|
|
17
|
+
// - 15 秒内没有完成按失败处理;抛出的错误只写进流水线日志,不影响流水线。
|
|
18
|
+
// - 只能使用 Node.js 22 内置的能力(例如全局 fetch),req-kit 不会为它安装依赖。
|
|
19
|
+
// - 不要把口令写在这个文件里:放在环境变量中,用 process.env 读取。
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {object} event 通知事件,字段见 contracts/notifier-event.md
|
|
23
|
+
* @param {Record<string, unknown>} options 配置中的 options
|
|
24
|
+
*/
|
|
25
|
+
export default async function notify(event, options) {
|
|
26
|
+
const title = {
|
|
27
|
+
milestone: "进展",
|
|
28
|
+
blocked: "需要你决定",
|
|
29
|
+
permission: "等待批准",
|
|
30
|
+
failed: "开发中断",
|
|
31
|
+
completed: "开发完成",
|
|
32
|
+
digest: "需求总览",
|
|
33
|
+
phase_done: "研发完成,可以提测",
|
|
34
|
+
approval: "请确认方案",
|
|
35
|
+
}[event.type] ?? event.type;
|
|
36
|
+
|
|
37
|
+
// 一条通用的纯文本消息,大多数 IM 机器人都能直接使用。
|
|
38
|
+
// 需求总览(digest)的 text 已经是完整的多行文字。
|
|
39
|
+
const lines = event.type === "digest" ? [event.text] : [`【req-kit · ${title}】${event.feature.title}`, event.text];
|
|
40
|
+
if (event.type === "completed" && event.details.summary) lines.push("", String(event.details.summary));
|
|
41
|
+
if (event.type === "phase_done") lines.push("", `提测说明:${event.details.handoffPath}`);
|
|
42
|
+
if (event.type === "approval") lines.push("", `要确认的内容:${event.details.previewPath}`);
|
|
43
|
+
if (event.type === "blocked") lines.push("", ...event.details.questions.map((q, i) => `${i + 1}. ${q}`));
|
|
44
|
+
if (event.type !== "digest") lines.push("", `需求目录:${event.feature.dir}${event.branch ? `(分支 ${event.branch})` : ""}`);
|
|
45
|
+
const text = lines.join("\n");
|
|
46
|
+
|
|
47
|
+
// TODO:按企业内部 IM 的接口实现发送。例如一个接收 JSON 的群机器人:
|
|
48
|
+
//
|
|
49
|
+
// const response = await fetch(String(options.webhook), {
|
|
50
|
+
// method: "POST",
|
|
51
|
+
// headers: { "Content-Type": "application/json", Authorization: `Bearer ${process.env.MY_IM_TOKEN}` },
|
|
52
|
+
// body: JSON.stringify({ msgtype: "text", text: { content: text } }),
|
|
53
|
+
// });
|
|
54
|
+
// if (!response.ok) throw new Error(`IM 返回 ${response.status}`);
|
|
55
|
+
//
|
|
56
|
+
// 还没有实现时,先什么也不做(流水线日志中会记录"外部通知已发送")。
|
|
57
|
+
// 用 req notify-test 测试时,把将要发送的内容打印出来,方便核对排版。
|
|
58
|
+
if (process.env.REQ_KIT_NOTIFY_TEST === "1") console.log(`--- 将要发送的内容 ---\n${text}\n---------------------`);
|
|
59
|
+
void options;
|
|
60
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,69 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paseo-req-kit",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.8.0-beta.3",
|
|
4
|
+
"description": "req-kit: a requirement-development workflow for Paseo. /req aligns a requirement in chat; the engine runs design, implementation, review and verification as Paseo agents.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/yiyisf/paseo-req-kit.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://yiyisf.github.io/paseo-req-kit/",
|
|
12
|
+
"bugs": "https://github.com/yiyisf/paseo-req-kit/issues",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"paseo",
|
|
15
|
+
"agents",
|
|
16
|
+
"requirements",
|
|
17
|
+
"workflow",
|
|
18
|
+
"claude-code",
|
|
19
|
+
"codex"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22"
|
|
23
|
+
},
|
|
24
|
+
"reqKit": {
|
|
25
|
+
"paseo": ">=0.11.0 <0.12.0"
|
|
26
|
+
},
|
|
27
|
+
"bin": {
|
|
28
|
+
"req": "bin/req.mjs",
|
|
29
|
+
"req-kit": "bin/req.mjs",
|
|
30
|
+
"start-pipeline": "bin/start-pipeline.mjs"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"test": "node --import tsx --test --test-concurrency=1 engine/test/*.test.ts test/*.test.ts",
|
|
35
|
+
"smoke": "tsx engine/src/smoke-test.ts",
|
|
36
|
+
"doctor": "node bin/req-doctor.mjs",
|
|
37
|
+
"eval": "tsx engine/src/eval.ts",
|
|
38
|
+
"eval:self-check": "tsx engine/src/eval.ts --reference"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@getpaseo/client": "^0.11.2",
|
|
42
|
+
"tsx": "^4.20.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.0.0",
|
|
46
|
+
"typescript": "^5.6.0"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"bin/",
|
|
50
|
+
"engine/src/",
|
|
51
|
+
"engine/prompts/",
|
|
52
|
+
"skills/",
|
|
53
|
+
"principles/",
|
|
54
|
+
"contracts/",
|
|
55
|
+
"notifiers/",
|
|
56
|
+
"docs/guide/",
|
|
57
|
+
"docs/adr/",
|
|
58
|
+
"install.mjs",
|
|
59
|
+
"config.example.json",
|
|
60
|
+
"CHANGELOG.md",
|
|
61
|
+
"SCOPE.md",
|
|
62
|
+
"README.md",
|
|
63
|
+
"LICENSE"
|
|
64
|
+
],
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public",
|
|
67
|
+
"provenance": true
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# req-kit 工作原则索引
|
|
2
|
+
|
|
3
|
+
这七条原则同时用于聊天中的 `/req`(需求对齐)和流水线的各个步骤。每条一句话,括号里是对应的 skill,展开说明了为什么、正反例和常见借口。
|
|
4
|
+
|
|
5
|
+
1. **按读者说话**(`principle-speak-to-reader`):对需求方讲需求和结果,不讲代码实现;接口、字段、测试用例这类他们熟悉的概念可以直接用,类名、函数名、堆栈留在文件里。
|
|
6
|
+
2. **证明它能用**(`principle-prove-it-works`):"通过"必须有实际运行过的命令和看到的输出作为证据;没运行过就不是通过。
|
|
7
|
+
3. **如实报告**(`principle-report-honestly`):未验证、未完成、有分歧、被驳回的意见都写出来;读者会直接相信你写的内容。
|
|
8
|
+
4. **修根因**(`principle-fix-root-cause`):找到问题真正的原因再改;不削弱测试或检查来让它通过;能用测试、类型、配置挡住的问题,就不只写在文档里。
|
|
9
|
+
5. **只做这个需求**(`principle-this-requirement-only`):不顺手重构、不升级无关依赖、不改无关文件;看到无关问题记下来交给人决定。
|
|
10
|
+
6. **先删再加**(`principle-delete-before-add`):能复用已有代码、删掉多余部分解决的,不新增;新增时选最简单可行的做法。
|
|
11
|
+
7. **别卡在等人**(`principle-dont-block-on-humans`):能合理假设的就假设并记录下来,继续往前走;只有猜错会做出错误东西的问题才停下来问。
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: acceptance-criteria
|
|
3
|
+
description: req-kit 方法:把功能需求(FR)拆成可以亲手试用、也可以直接转为测试用例的验收标准(AC-n.m),覆盖正常流程、异常和边界。由 /req 的手册和 spec-writing 调用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 验收标准
|
|
7
|
+
|
|
8
|
+
验收标准(AC)是需求方验收、流水线验证和测试同事编写用例的共同依据。写到一个没参加过对话的人也能据此判断"通过还是不通过"的程度。
|
|
9
|
+
|
|
10
|
+
## 格式
|
|
11
|
+
|
|
12
|
+
每条 AC 有编号 `AC-<FR 编号>.<序号>`,例如 FR-2 的第一条是 `AC-2.1`。写成三段:
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
- **AC-2.1** <一句话标题>
|
|
16
|
+
- 前置条件:<数据、账号、环境、开关等起始状态>
|
|
17
|
+
- 操作:<用户做了什么,或调用了什么接口、执行了什么命令>
|
|
18
|
+
- 预期结果:<应该看到什么。具体到页面上的文字、接口返回的字段和值、数据的变化>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
简单的 AC 可以写成一句话:"在<什么情况>下,当<做了什么>,应该<看到什么>。"只要三个要素都在。
|
|
22
|
+
|
|
23
|
+
## 要求
|
|
24
|
+
|
|
25
|
+
- **用具体的例子。** 每条 AC 至少带一组真实的数据:输入什么、得到什么("输入手机号 13800000000,60 秒内再点发送,提示'请 45 秒后重试'"),而不是"在限制时间内重复发送会被拒绝"。按规则计算的(金额、时间、状态变化),给出两三组覆盖边界的例子,可以写成表格。这些例子会直接成为测试的期望值:需求方确认的,就是测试会检查的东西。
|
|
26
|
+
- **可检查。** 不用"快速""友好""合理""正常"这类词,除非给出具体标准("3 秒内返回""错误提示为'验证码已过期,请重新获取'")。
|
|
27
|
+
- **每条 FR 至少一条 AC。** 并且不只写正常流程:输入不合法、权限不足、重复操作、边界值、依赖不可用,凡是访谈中谈到的都要有对应的 AC。
|
|
28
|
+
- **一条 AC 只检查一件事。** 一条里出现"并且……并且……"时,考虑拆开。
|
|
29
|
+
- **写明测试数据。** 需要特定数据或账号时,在前置条件里写清楚;访谈中定下的测试账号、测试环境也写进来。
|
|
30
|
+
- **写明怎么验证(可选)。** 已知可以用命令或接口验证的,写出来,例如"`GET /api/orders?status=paid` 返回的列表中不包含已退款订单"。这方便流水线和测试同事直接复用。
|
|
31
|
+
- **不写实现。** AC 描述可观察的行为,不描述代码怎么写。
|
|
32
|
+
|
|
33
|
+
## 例子
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
### FR-2 验证码登录(优先级:必须有)
|
|
37
|
+
|
|
38
|
+
- **AC-2.1** 正确的验证码可以登录
|
|
39
|
+
- 前置条件:手机号 13800000001 已注册,已获取验证码 123456(5 分钟内)
|
|
40
|
+
- 操作:在登录页输入手机号和验证码,点"登录"
|
|
41
|
+
- 预期结果:进入首页,右上角显示该用户的昵称
|
|
42
|
+
- **AC-2.2** 验证码过期
|
|
43
|
+
- 前置条件:同上,但验证码获取于 6 分钟前
|
|
44
|
+
- 操作:输入该验证码登录
|
|
45
|
+
- 预期结果:停留在登录页,提示"验证码已过期,请重新获取",不进入首页
|
|
46
|
+
- **AC-2.3** 连续输错被锁定:同一手机号连续输错 3 次后,第 4 次无论对错都提示"尝试次数过多,请 5 分钟后再试"。
|
|
47
|
+
- **AC-2.4** 重发间隔(按规则计算,用表格给出例子)
|
|
48
|
+
|
|
49
|
+
| 上次发送后过了 | 点"重新发送" | 结果 |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| 15 秒 | 是 | 提示"请 45 秒后重试",不发送 |
|
|
52
|
+
| 59 秒 | 是 | 提示"请 1 秒后重试",不发送 |
|
|
53
|
+
| 60 秒 | 是 | 发送新的验证码,旧的立即失效 |
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 自查
|
|
57
|
+
|
|
58
|
+
- 每条 FR 都有 AC,异常和边界情况都有 AC
|
|
59
|
+
- 每条 AC 的预期结果都是能看到、能比较的东西,并且至少有一组具体的输入和期望输出
|
|
60
|
+
- 按规则计算的 AC,例子覆盖了边界(刚好达到、差一点、超过)
|
|
61
|
+
- 拿着 AC 的人不需要再问任何问题就能执行
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-delete-before-add
|
|
3
|
+
description: req-kit 工作原则:先删再加。能复用已有代码或删掉多余部分解决的,不新增。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 先删再加
|
|
7
|
+
|
|
8
|
+
**能复用已有代码或删掉多余部分解决的,不新增。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
每一行新代码都要被阅读、测试和维护。先看项目里有没有现成的做法可以复用,再考虑新增;新增时选最简单可行的方案,而不是为想象中的未来需求预留扩展。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"项目里已有发送短信的封装 sendSms(),直接复用;新增的只是验证码的生成和校验,约 60 行。"
|
|
19
|
+
|
|
20
|
+
不好的做法:
|
|
21
|
+
|
|
22
|
+
"新建了一个通用的通知框架,支持短信、邮件、推送三种渠道,本次只用到短信。"
|
|
23
|
+
|
|
24
|
+
## 常见借口
|
|
25
|
+
|
|
26
|
+
- **"以后肯定会用到。"** 以后需要时再加。现在加的扩展点多半猜不准以后的需求。
|
|
27
|
+
- **"复用旧代码要先读懂它,太慢。"** 读懂已有做法正是避免重复和冲突的前提。
|
|
28
|
+
|
|
29
|
+
## 用在哪里
|
|
30
|
+
|
|
31
|
+
方案设计(方案中说明复用了什么)、代码实现、代码评审。
|
|
32
|
+
|
|
33
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-dont-block-on-humans
|
|
3
|
+
description: req-kit 工作原则:别卡在等人。能合理假设的就假设并记录,只有猜错会做出错误东西的问题才停下来问。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 别卡在等人
|
|
7
|
+
|
|
8
|
+
**能合理假设的就假设并记录,只有猜错会做出错误东西的问题才停下来问。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
流水线无人值守,停下来等人会让需求方等上几个小时;但不该猜的事情猜错了,代价更大。区分两者的标准是:如果猜错,做出来的东西是不是就错了。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"spec 没写分页大小,按项目中其他列表页的 20 条处理,记为假设 A-3。"
|
|
19
|
+
|
|
20
|
+
"spec 没说过期的优惠券能否退款,两种理解会导致完全不同的结果,记为阻塞问题,请需求方决定。"
|
|
21
|
+
|
|
22
|
+
不好的做法:
|
|
23
|
+
|
|
24
|
+
"不确定按钮颜色,流水线暂停等待确认。"(可以按现有风格假设);或者"退款规则不清楚,按我的理解实现了"(应当询问)
|
|
25
|
+
|
|
26
|
+
## 常见借口
|
|
27
|
+
|
|
28
|
+
- **"问一下总没错。"** 在无人值守的流程里,每一次停下来都有成本。能从代码、文档、spec 推断的就推断。
|
|
29
|
+
- **"假设了就不用记了。"** 每条假设都要写进产物的"假设"一节,报告会汇总给需求方确认。
|
|
30
|
+
|
|
31
|
+
## 用在哪里
|
|
32
|
+
|
|
33
|
+
需求对齐时区分"必须问"和"可以假设";方案设计和方案审核中的"阻塞问题"。
|
|
34
|
+
|
|
35
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-fix-root-cause
|
|
3
|
+
description: req-kit 工作原则:修根因。找到问题真正的原因再改,不削弱检查来让它通过。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 修根因
|
|
7
|
+
|
|
8
|
+
**找到问题真正的原因再改,不削弱检查来让它通过。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
删掉失败的测试、放宽断言、针对测试写死返回值,都会让检查失去意义,并把问题留到线上。能用测试、类型检查、lint、CI 挡住的问题,比写进文档或提示词更可靠。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"测试失败是因为时区:服务端按 UTC 计算截止日期。改为按用户所在时区计算,并新增一条跨零点的测试用例。"
|
|
19
|
+
|
|
20
|
+
不好的做法:
|
|
21
|
+
|
|
22
|
+
"测试在 CI 上偶尔失败,已把超时从 5 秒调到 60 秒并加了重试。"(没有查原因)
|
|
23
|
+
|
|
24
|
+
## 常见借口
|
|
25
|
+
|
|
26
|
+
- **"先让它过,回头再查。"** "回头"通常不会发生。查不出原因时,如实写明现象和已排查的范围。
|
|
27
|
+
- **"这个测试本来就写得不好。"** 可以改进测试,但要说明它原来想检查什么、新的写法如何仍然检查到。
|
|
28
|
+
|
|
29
|
+
## 用在哪里
|
|
30
|
+
|
|
31
|
+
评审问题修复、缺陷修复、/req-retro(按"CI → 配置 → 项目说明 → 提示词"的顺序选择落点)。
|
|
32
|
+
|
|
33
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-prove-it-works
|
|
3
|
+
description: req-kit 工作原则:证明它能用。"通过"必须有实际运行过的命令和看到的输出作为证据。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 证明它能用
|
|
7
|
+
|
|
8
|
+
**"通过"必须有实际运行过的命令和看到的输出作为证据。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
需求方会根据报告决定是否验收,往往不会、也不应该把每一条都重新跑一遍。没有证据的"通过"把风险悄悄转给了他们,而且往往要到上线后才暴露。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"AC-2.1 通过:执行 `pnpm test sms-login` ,12 个用例全部通过(输出见 verification.md 第 3 节);手工在本地页面输入错误验证码 3 次,第 4 次被锁定 5 分钟,截图 evidence/ac-2.1.png。"
|
|
19
|
+
|
|
20
|
+
不好的做法:
|
|
21
|
+
|
|
22
|
+
"AC-2.1 通过:代码逻辑已覆盖该场景。"
|
|
23
|
+
|
|
24
|
+
## 常见借口
|
|
25
|
+
|
|
26
|
+
- **"代码一看就是对的,没必要跑。"** 看起来对和运行起来对是两回事。跑不了就写"未验证"并说明原因。
|
|
27
|
+
- **"测试环境起不来,先标通过,后面再补。"** 标"未验证",写明环境问题。把未验证写成通过是唯一不可接受的结果。
|
|
28
|
+
|
|
29
|
+
## 用在哪里
|
|
30
|
+
|
|
31
|
+
代码实现、服务启动验证、功能验证、复验、完成报告的验收对照表。
|
|
32
|
+
|
|
33
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-report-honestly
|
|
3
|
+
description: req-kit 工作原则:如实报告。未验证、未完成、有分歧、被驳回的意见都写出来。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 如实报告
|
|
7
|
+
|
|
8
|
+
**未验证、未完成、有分歧、被驳回的意见都写出来。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
读者没有能力也没有时间核对每一句话,他们会直接相信你写的内容。一份"都很好"的报告如果有一处不实,整份报告就失去了价值;而如实写出的"未完成"可以让人及时补救。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"结论:已完成,有遗留问题。导出 Excel 在 1 万行以上时超过 30 秒(AC-4.2 未达成);评审中关于缓存的一条建议被驳回,理由是需求没有并发场景,请开发同事确认。"
|
|
19
|
+
|
|
20
|
+
不好的做法:
|
|
21
|
+
|
|
22
|
+
"结论:已完成。性能方面后续可以继续优化。"
|
|
23
|
+
|
|
24
|
+
## 常见借口
|
|
25
|
+
|
|
26
|
+
- **"写出问题会显得没做好。"** 隐瞒的问题迟早会被发现,那时代价更大。如实报告是被明确要求的结果,而不是失败。
|
|
27
|
+
- **"这个分歧不重要,就不提了。"** 重不重要由读者判断。一句话写出来,成本很低。
|
|
28
|
+
|
|
29
|
+
## 用在哪里
|
|
30
|
+
|
|
31
|
+
每个步骤的产物、结果文件、完成报告、发回对话的通知。
|
|
32
|
+
|
|
33
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-speak-to-reader
|
|
3
|
+
description: req-kit 工作原则:按读者说话。对需求方讲需求和结果,不讲代码实现。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 按读者说话
|
|
7
|
+
|
|
8
|
+
**对需求方讲需求和结果,不讲代码实现。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
需求方是测试、产品、项目经理这类有技术背景但不读代码的同事。他们能判断"这个接口返回的字段对不对""这个用例覆盖了没有",但没法判断"这个类拆得合不合理"。把实现细节讲给他们,只会得到猜测式的回答,还会让真正需要他们决定的事被淹没。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"提交后状态会变成'待审批',审批人在待办列表里能看到这一条;如果审批人 3 天没处理,会再提醒一次。这条规则要不要对周末也生效?"
|
|
19
|
+
|
|
20
|
+
不好的做法:
|
|
21
|
+
|
|
22
|
+
"我们在 ApprovalService 里加了一个定时任务,用 cron 每小时扫一次 pending 状态的记录。你看 cron 表达式用哪个?"
|
|
23
|
+
|
|
24
|
+
## 常见借口
|
|
25
|
+
|
|
26
|
+
- **"他们是测试,懂技术,讲细一点没关系。"** 懂测试不等于读代码。讲到接口、字段、状态、用例这一层就够了,再往下是开发同事的事。
|
|
27
|
+
- **"不讲实现,他们不知道我做了多少。"** 他们关心的是结果对不对、怎么验证。工作量体现在验收对照表和证据里。
|
|
28
|
+
|
|
29
|
+
## 用在哪里
|
|
30
|
+
|
|
31
|
+
聊天中的提问、spec、通知转述、报告正文。类名、函数名、提交号放进附录或文件里。
|
|
32
|
+
|
|
33
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: principle-this-requirement-only
|
|
3
|
+
description: req-kit 工作原则:只做这个需求。不顺手重构、不升级无关依赖、不改无关文件。在使用 /req 对齐需求、或作为需求开发流水线的步骤工作时参考。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 只做这个需求
|
|
7
|
+
|
|
8
|
+
**不顺手重构、不升级无关依赖、不改无关文件。**
|
|
9
|
+
|
|
10
|
+
## 为什么
|
|
11
|
+
|
|
12
|
+
无关的改动会让评审变难、让风险变大,也会让需求方无法判断"这次到底改了什么"。一个需求的提交应该能单独审阅、单独回退。
|
|
13
|
+
|
|
14
|
+
## 例子
|
|
15
|
+
|
|
16
|
+
好的做法:
|
|
17
|
+
|
|
18
|
+
"发现 utils/date.ts 中有一个与本需求无关的时区隐患,已记入报告的'经验与改进建议',未修改。"
|
|
19
|
+
|
|
20
|
+
不好的做法:
|
|
21
|
+
|
|
22
|
+
"顺便把整个 utils 目录改成了新的写法,并升级了日期库。"
|
|
23
|
+
|
|
24
|
+
## 常见借口
|
|
25
|
+
|
|
26
|
+
- **"反正都在改这个文件。"** 只改与需求相关的部分。整理代码可以作为单独的需求提出。
|
|
27
|
+
- **"升级依赖能修好一个警告。"** 与本需求无关就不升级,把警告记下来。
|
|
28
|
+
|
|
29
|
+
## 用在哪里
|
|
30
|
+
|
|
31
|
+
方案设计、代码实现、评审问题修复、缺陷修复;聊天中一个对话只处理一个需求。
|
|
32
|
+
|
|
33
|
+
所有原则的一句话版本见 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: req
|
|
3
|
+
description: req-kit 需求开发入口。提新需求或小改动、查看进度、暂停或继续、修改需求、验收、报告上线后的问题、接手别人的需求时使用;也可以直接调用 /req 加一句话描述。由它判断走哪本手册,需求确认后在后台启动开发流水线(设计、实现、评审、验证、报告)。
|
|
4
|
+
metadata:
|
|
5
|
+
opencode/slash: "true"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# req-kit 需求开发入口({{REQ_KIT_VERSION}})
|
|
9
|
+
|
|
10
|
+
用户的话:$ARGUMENTS
|
|
11
|
+
|
|
12
|
+
(上面显示的是占位符本身或为空时,以用户在本次消息中说的为准。)
|
|
13
|
+
|
|
14
|
+
## 对面是谁
|
|
15
|
+
|
|
16
|
+
使用者通常是测试、产品经理或项目经理:有一定技术背景,熟悉接口、字段、状态、测试用例和测试环境,能在终端执行给定的命令,但不读代码。和他们说话时讲需求和结果,不讲代码实现。
|
|
17
|
+
|
|
18
|
+
## 先读原则
|
|
19
|
+
|
|
20
|
+
读 `{{REQ_KIT_ROOT}}/principles/INDEX.md`。七条原则在整个对话中都适用,流水线的每一步也遵守同样的原则。
|
|
21
|
+
|
|
22
|
+
## 选手册
|
|
23
|
+
|
|
24
|
+
根据用户的话和当前目录的情况选一本手册,然后读取它并照做:
|
|
25
|
+
|
|
26
|
+
| 用户想做的事 | 典型说法 | 手册 |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| 提一个新需求,包括修一个缺陷、重构代码、先评估能不能做 | "我想加一个……""这里有个 bug……""整理一下……的代码""帮我评估一下能不能做……" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/new.md` |
|
|
29
|
+
| 一个范围很小的改动 | "把这个按钮的文字改成……""加一个配置项" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/small.md` |
|
|
30
|
+
| 查看进度、暂停、继续 | "做到哪了""先停一下""继续开发" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/status.md` |
|
|
31
|
+
| 研发完成后开始测试验证(提测) | "可以提测了""开始测试""我是测试,来测这个需求" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/verify.md` |
|
|
32
|
+
| 修改已经确认的需求 | "刚才那个需求我想改一下""再加一条规则" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/change.md` |
|
|
33
|
+
| 验收 | "做完了,我来验收""帮我对一下验收标准" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/accept.md` |
|
|
34
|
+
| 上线后发现问题 | "线上发现……不对""用户反馈……" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/incident.md` |
|
|
35
|
+
| 接手或回顾一个需求 | "这个需求是之前同事提的""这个需求现在什么情况" | `{{REQ_KIT_ROOT}}/skills/req/playbooks/takeover.md` |
|
|
36
|
+
|
|
37
|
+
判断方法:
|
|
38
|
+
|
|
39
|
+
- 先看这个项目里有哪些需求:执行"列出需求"命令(见下面"开发流水线命令"),它会列出所有工作区中的需求和各自的阶段。用户说"继续""进度""验收"之类,且只有一个相关的需求时,直接用它。
|
|
40
|
+
- 新需求和小改动拿不准时,先按"新需求"开始。新需求手册在复述之后会判断规模,必要时改走快速档。
|
|
41
|
+
- 用户想改的是已经验收或上线的功能:修改按"新需求"或"小改动"处理,问题按"上线后发现问题"处理。
|
|
42
|
+
- 实在判断不了,用一个选择题问用户。
|
|
43
|
+
|
|
44
|
+
项目还没有接入(没有 `.requirement-pipeline/verify.md`)时,在开始前提醒一句:建议请开发同事或测试同事先运行一次 `/req-setup`,这样开发和验证步骤会更快、更稳定;不接入也可以继续。
|
|
45
|
+
|
|
46
|
+
## 公布步骤
|
|
47
|
+
|
|
48
|
+
选定手册后,把手册开头"步骤"一节的各项原样放进你的待办列表(有待办工具时),让用户随时看到做到哪一步。每完成一项就勾掉。没有待办工具时,开始时用一句话列出步骤即可。
|
|
49
|
+
|
|
50
|
+
同一个对话中,用户之后说的话("做到哪了""先停一下""继续")不需要再带 `/req`,仍然按本 skill 处理。
|
|
51
|
+
|
|
52
|
+
## 通用规则
|
|
53
|
+
|
|
54
|
+
- **一次只问一个问题**,给 2–4 个选项,推荐项放第一个并说明理由。有选择题式的提问工具就用它。
|
|
55
|
+
- **一个对话只处理一个需求。** 用户提出第二个无关需求时,建议新开一个对话(最好是新的工作区)。
|
|
56
|
+
- **不切换工作目录。** 流水线会把这个对话的工作目录当作仓库目录,每个步骤都作为子 agent 挂在这个对话下、在同一个目录中工作。不要 `cd` 到别的目录再执行命令;功能目录必须建在当前工作目录之内;需求属于其他项目时,请用户到那个项目中新开对话。
|
|
57
|
+
- **不在对话中途切换分支。**
|
|
58
|
+
- **需求在自动新建的工作区中时**(用"启动(自动新建工作区)"启动过):这个对话的工作目录不变,命令照常在这里执行,功能目录写原来的相对路径即可,流水线会找到它。需求文件已移到新工作区,读写时用流水线输出或通知中给出的完整路径。
|
|
59
|
+
- 需要检查安装或配置时,告诉用户运行 `/req-doctor`(或请开发同事运行),不要自己去改安装目录或配置文件。
|
|
60
|
+
|
|
61
|
+
## 开发流水线命令
|
|
62
|
+
|
|
63
|
+
以下命令在 bash、PowerShell、cmd 中写法相同,在当前工作目录执行。它们会自动识别当前对话(Paseo 提供的 `PASEO_AGENT_ID`、`PASEO_AGENT_CWD`),不需要传对话 ID 或仓库目录。`<功能目录>` 换成实际路径,例如 `docs/features/20261012-sms-login`。
|
|
64
|
+
|
|
65
|
+
| 做什么 | 命令 |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| 需求说明审阅 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --spec-review` |
|
|
68
|
+
| 启动 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录>` |
|
|
69
|
+
| 启动(自动新建工作区) | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --worktree` |
|
|
70
|
+
| 预约启动 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --at <时间>`(时间写 `22:00`、`明天 8:30`、`2026-10-14 08:30` 或 `+2h`;可以和 `--worktree` 一起用) |
|
|
71
|
+
| 指定执行方式 | 在启动命令后加 `--phases gated`(分阶段:研发完成后停下等待测试验证)或 `--phases develop-only`(只做研发);通常写在需求说明的"执行方式"一行,不用加 |
|
|
72
|
+
| 预约测试验证 | 在启动或继续命令后加 `--verify-at <时间>`:研发完成后到这个时间自动开始测试验证(隐含分阶段) |
|
|
73
|
+
| 开始测试验证 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --phase verify`(可以加 `--verify-env local\|deployed`、`--defects fix\|handback\|report`、`--at <时间>`) |
|
|
74
|
+
| 查看进度 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --status` |
|
|
75
|
+
| 暂停 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --stop` |
|
|
76
|
+
| 继续 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --resume` |
|
|
77
|
+
| 确认方案后继续 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --approve`(只在方案确认点、用户确认之后用) |
|
|
78
|
+
| 从头重来 | `node "{{PIPELINE_LAUNCHER}}" --feature <功能目录> --restart` |
|
|
79
|
+
| 列出需求 | `node "{{PIPELINE_LAUNCHER}}" --list` |
|
|
80
|
+
|
|
81
|
+
启动命令检查条件后在后台运行,一两秒内返回:
|
|
82
|
+
- 输出"已在后台启动":告诉用户开发已经开始。每个步骤会以"[功能目录名] 步骤名"出现在这个对话的子 agent 列表里,想看可以点开。
|
|
83
|
+
- 输出"未启动":把原因告诉用户。spec 未确认 → 回到确认;同一目录已有流水线在运行 → 等它结束;工作目录不一致 → 到需求所在的项目中开对话;当前在默认分支 → 问用户是否改用"启动(自动新建工作区)";其他原因(找不到程序、配置有误等)→ 请用户运行 `/req-doctor` 或联系开发同事,并附上输出。
|
|
84
|
+
|
|
85
|
+
## 收到流水线通知时
|
|
86
|
+
|
|
87
|
+
流水线会把消息发进这个对话,开头是"【需求开发流水线通知】"。这些消息不是用户发的。收到时,先把正在说的话说完,再:
|
|
88
|
+
|
|
89
|
+
1. 按 `{{REQ_KIT_ROOT}}/skills/result-report/SKILL.md` 把要点转告用户,不要原样粘贴,除非用户要求。
|
|
90
|
+
2. 按通知类型处理:
|
|
91
|
+
- **进展**(标题带"进展"):一句话转告,例如"方案已经定了,开始写代码"。
|
|
92
|
+
- **需要需求方决定**:用 `requirement-interview` 的方式(`{{REQ_KIT_ROOT}}/skills/requirement-interview/SKILL.md`)逐个提问,把答案记入 `alignment.md` 并更新 `spec.md`(版本加 1,在 `changes.md` 中记一节,原因写"方案审核提出的问题";缺陷复现不了时写"补充复现信息"),请用户再次确认,然后执行通知中给出的继续命令。
|
|
93
|
+
- **请确认方案**(方案确认点):按通知中的做法,把 `preview.md` 的要点讲给用户(会看到的变化、需要确认的假设;有界面原型的告诉用户在哪里看),问"按这个做,还是有要改的地方"。用户确认后执行通知中的确认命令(`--approve`);要改的,问清楚后更新需求说明(`changes.md` 中原因写"方案确认时的修改"),请用户确认,再执行继续命令(`--resume`)。不要替用户确认。
|
|
94
|
+
- **等待权限批准**:告诉用户打开通知中提到的 agent 处理批准。
|
|
95
|
+
- **流水线中断**:说明发生了什么、日志在哪里。用户能处理的(例如环境没启动)告诉他怎么做;问题解决后执行通知中给出的继续命令。涉及配置或代码的,请开发同事处理。
|
|
96
|
+
- **需求说明审阅完成**:按通知中的做法核对问题、逐个问用户,再请用户确认需求说明。
|
|
97
|
+
- **研发完成,待测试验证**(分阶段执行时):告诉用户研发已完成、可以提测,用两三句话讲 `handoff.md` 中"这次改了什么"和"建议重点测试";然后按 `verify.md` 手册处理(用户想现在开始、预约,或交给测试同事在他们自己的对话里开始)。通知里说已经预约了测试验证的,告诉用户时间即可。
|
|
98
|
+
- **排队 / 排队结束**:一句话转告。
|
|
99
|
+
- **预约的提醒、自动继续、定时检查、预约的开始时间**(由 Paseo 定时任务发来,开头写着"预约的""定时检查"):严格按消息中的步骤执行命令;消息说"不要打扰用户"的情况就不要回复用户。
|
|
100
|
+
- **研发完成(只做研发)**:转告研发结论和摘要,说明流水线没有做测试验证,需要人工测试;问是否现在按 `accept.md` 开始人工测试(以 `handoff.md` 为线索)。
|
|
101
|
+
- **流水线结束**:转告结论和摘要,读功能目录中的 `report.md`,告诉用户"需要你做的事"和"需要你确认的决定"有几条,并问是否现在开始验收(`accept.md`)。用户追问细节时,以 `report.md` 和功能目录中的其他文件为准回答。评估类需求没有验收:转告结论和推荐的做法,问用户是否按评估结果提一个新需求(按 `new.md`,以 `assessment.md` 最后一节的需求草稿为起点,新需求用新的功能目录)。
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# 手册:验收
|
|
2
|
+
|
|
3
|
+
流水线结束后,带需求方按验收标准逐条核对,记录结果,并决定不通过的项怎么处理。
|
|
4
|
+
|
|
5
|
+
## 步骤
|
|
6
|
+
|
|
7
|
+
1. 确认可以验收
|
|
8
|
+
2. 准备验收清单
|
|
9
|
+
3. 逐条验收
|
|
10
|
+
4. 记录结论
|
|
11
|
+
5. 处理不通过的项
|
|
12
|
+
|
|
13
|
+
## 1. 确认可以验收
|
|
14
|
+
|
|
15
|
+
找到功能目录(同 `status.md` 第 1 步),读 `report.md`。
|
|
16
|
+
|
|
17
|
+
- 流水线还没有结束:告诉需求方现在的进度,等结束后再验收。
|
|
18
|
+
- 结论是"未完成":说明原因,建议先处理(继续开发、修改需求,或请开发同事看一下),不进入验收。
|
|
19
|
+
- 结论是"已完成,可以验收"或"已完成,有遗留问题":继续。有遗留问题时,先把遗留问题讲清楚,请需求方判断是否仍要验收。
|
|
20
|
+
- 执行方式是"只做研发"(报告是研发报告,流水线没有做测试验证):这次验收就是人工测试。继续,但第 2 步要以 `handoff.md` 为线索:先按其中"怎么跑起来"把环境准备好,"建议重点测试"的各项排在清单前面,"已知问题"提前讲清楚。所有 AC 都需要亲自验证,不能沿用流水线的结论。
|
|
21
|
+
|
|
22
|
+
确认验收用的环境:通常就是当前工作区。需要启动服务时,按 `.requirement-pipeline/verify.md` 或 `service-start.md` 中的方法启动,并告诉需求方访问地址。验收结束后关掉你启动的服务。
|
|
23
|
+
|
|
24
|
+
## 2. 准备验收清单
|
|
25
|
+
|
|
26
|
+
从 `spec.md` 取出全部验收标准(已取消的除外),对照 `report.md` 的验收对照表和 `verification.md`,生成清单:
|
|
27
|
+
|
|
28
|
+
- 每条 AC:要做什么、应该看到什么、流水线的验证结果和证据
|
|
29
|
+
- 流水线标为"未验证"或"未达成"的排在前面
|
|
30
|
+
- `report.md` 中"需要你确认的决定"一并列出
|
|
31
|
+
|
|
32
|
+
在功能目录下创建 `acceptance.md`,格式见 `{{REQ_KIT_ROOT}}/contracts/feature-files.md`,"验收结论"先写"进行中"。
|
|
33
|
+
|
|
34
|
+
## 3. 逐条验收
|
|
35
|
+
|
|
36
|
+
一次一条,带需求方核对:
|
|
37
|
+
|
|
38
|
+
- 说明这条要验证什么、怎么操作、预期结果。能用命令验证的,给出命令(需求方可以自己执行,也可以由你执行并展示输出);需要在页面上操作的,给出具体步骤和测试数据。
|
|
39
|
+
- 请需求方给出结果:通过 / 不通过 / 先不验。不通过时,请他描述现象(看到了什么、与预期差在哪里),有截图更好。
|
|
40
|
+
- 每条结果立即写进 `acceptance.md` 的表格。
|
|
41
|
+
|
|
42
|
+
"需要你确认的决定"逐条请需求方表态:同意,或不同意(不同意的按"不通过"处理)。
|
|
43
|
+
|
|
44
|
+
需求方想补充验收标准之外的检查时,可以做,结果记在表格下方的"其他发现"中;它们不影响这次验收的结论,但可以作为新的需求或缺陷提出。
|
|
45
|
+
|
|
46
|
+
## 4. 记录结论
|
|
47
|
+
|
|
48
|
+
全部核对完后,与需求方确定结论,写入 `acceptance.md` 顶部:
|
|
49
|
+
|
|
50
|
+
- **通过**:所有必须有的 AC 都通过("可以以后再说"的 AC 不通过不影响结论,但要记录)。
|
|
51
|
+
- **不通过**:有必须有的 AC 不通过。
|
|
52
|
+
|
|
53
|
+
提交 `acceptance.md`。
|
|
54
|
+
|
|
55
|
+
## 5. 处理不通过的项
|
|
56
|
+
|
|
57
|
+
逐项和需求方确定处理方式,记在 `acceptance.md` 的"不通过的处理"一节:
|
|
58
|
+
|
|
59
|
+
- **实现与需求不符**(需求没变,但做得不对):按 `change.md` 处理,但不改需求内容,只把不通过的现象补进相关 AC 的说明(必要时补一条更具体的 AC),版本加 1,`changes.md` 中原因写"验收发现的问题"。继续开发后,流水线会从方案设计开始,在已有方案和代码的基础上只处理这些问题,并按新的 AC 重新验证。
|
|
60
|
+
- **需求本身要改**(验收时发现想要的不是这样):按 `change.md` 修改需求。
|
|
61
|
+
- **接受现状**:记录理由,必要时作为以后的新需求。
|
|
62
|
+
|
|
63
|
+
全部通过时:告诉需求方验收完成,下一步请开发同事审阅代码并合并上线(流水线只做本地提交)。可以把 `report.md` 和 `acceptance.md` 一起发给开发同事。
|
|
64
|
+
|
|
65
|
+
验收不通过、或者过程中问题较多(多次返工、中断、需求改了几次)时,建议请开发同事运行 `/req-retro` 复盘,把改进沉淀到项目里。
|