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.
Files changed (144) hide show
  1. package/CHANGELOG.md +283 -0
  2. package/LICENSE +21 -0
  3. package/README.md +146 -2
  4. package/SCOPE.md +11 -0
  5. package/bin/locate.mjs +46 -0
  6. package/bin/req-doctor.mjs +21 -0
  7. package/bin/req.mjs +179 -0
  8. package/bin/start-pipeline +21 -0
  9. package/bin/start-pipeline.mjs +22 -0
  10. package/config.example.json +132 -0
  11. package/contracts/README.md +18 -0
  12. package/contracts/feature-files.md +117 -0
  13. package/contracts/notifier-event.md +72 -0
  14. package/contracts/result-file.md +21 -0
  15. package/contracts/spec.md +36 -0
  16. package/contracts/state.md +49 -0
  17. package/contracts/verify.md +41 -0
  18. package/docs/adr/0001-step-agents-under-origin-chat.md +15 -0
  19. package/docs/adr/0002-no-directory-switch-in-chat.md +15 -0
  20. package/docs/adr/0003-script-engine-not-hub.md +15 -0
  21. package/docs/adr/0004-result-files.md +15 -0
  22. package/docs/adr/0005-no-default-branch-local-commits-only.md +15 -0
  23. package/docs/adr/0006-skill-install-targets.md +15 -0
  24. package/docs/adr/0007-own-interview-skill.md +15 -0
  25. package/docs/adr/0008-entries-do-not-call-entries.md +15 -0
  26. package/docs/adr/0009-versioned-install-layout.md +15 -0
  27. package/docs/adr/0010-generated-feature-overview.md +15 -0
  28. package/docs/adr/0011-resume-after-completion.md +15 -0
  29. package/docs/adr/0012-review-panel.md +18 -0
  30. package/docs/adr/0013-no-release-tooling.md +15 -0
  31. package/docs/adr/0014-notifier-slot.md +19 -0
  32. package/docs/adr/0015-incremental-continue.md +17 -0
  33. package/docs/adr/0016-upgrade-from-tags.md +19 -0
  34. package/docs/adr/0017-use-paseo-capabilities.md +18 -0
  35. package/docs/adr/0018-own-worktree-option.md +21 -0
  36. package/docs/adr/0019-parallel-orchestration.md +21 -0
  37. package/docs/adr/0020-scheduling-through-the-chat.md +21 -0
  38. package/docs/adr/0021-npm-version-manager.md +19 -0
  39. package/docs/adr/0022-develop-and-verify-phases.md +32 -0
  40. package/docs/adr/0023-types-gate-slices.md +54 -0
  41. package/docs/adr/0024-confirm-early-review-axes.md +27 -0
  42. package/docs/adr/0025-joint-requirements.md +27 -0
  43. package/docs/adr/README.md +29 -0
  44. package/docs/guide//344/275/277/347/224/250/350/200/205/346/214/207/345/215/227.md +96 -0
  45. package/docs/guide//345/256/211/350/243/205/344/270/216/345/215/207/347/272/247.md +348 -0
  46. package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +85 -0
  47. 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
  48. package/engine/prompts/00-shared-context.md +104 -0
  49. package/engine/prompts/02-spec-review.md +46 -0
  50. package/engine/prompts/03-design.md +73 -0
  51. package/engine/prompts/03a-design-proposal.md +30 -0
  52. package/engine/prompts/04-design-review.md +73 -0
  53. package/engine/prompts/04b-design-revise.md +41 -0
  54. package/engine/prompts/05-implement.md +72 -0
  55. package/engine/prompts/06-code-review.md +70 -0
  56. package/engine/prompts/07-review-fix.md +41 -0
  57. package/engine/prompts/07b-handoff.md +45 -0
  58. package/engine/prompts/08-service-start.md +59 -0
  59. package/engine/prompts/09-verify.md +90 -0
  60. package/engine/prompts/10-defect-fix.md +41 -0
  61. package/engine/prompts/10b-reverify.md +43 -0
  62. package/engine/prompts/11-report.md +112 -0
  63. package/engine/prompts/browser-verify.md +13 -0
  64. package/engine/prompts/incremental.md +22 -0
  65. package/engine/prompts/joint.md +55 -0
  66. package/engine/prompts/panel-member.md +38 -0
  67. package/engine/prompts/paseo-services.md +9 -0
  68. package/engine/prompts/related-repos.md +7 -0
  69. package/engine/prompts/review-axis-spec.md +10 -0
  70. package/engine/prompts/review-axis-standards.md +11 -0
  71. package/engine/prompts/types/assessment.md +41 -0
  72. package/engine/prompts/types/defect.md +55 -0
  73. package/engine/prompts/types/refactor.md +39 -0
  74. package/engine/prompts/verify-deployed.md +14 -0
  75. package/engine/src/activity.ts +87 -0
  76. package/engine/src/cli-args.ts +217 -0
  77. package/engine/src/config.ts +619 -0
  78. package/engine/src/configure.ts +237 -0
  79. package/engine/src/control.ts +246 -0
  80. package/engine/src/daemon-check.ts +104 -0
  81. package/engine/src/daemon-version.ts +66 -0
  82. package/engine/src/digest.ts +142 -0
  83. package/engine/src/doctor.ts +462 -0
  84. package/engine/src/eval.ts +324 -0
  85. package/engine/src/features.ts +270 -0
  86. package/engine/src/gate.ts +157 -0
  87. package/engine/src/git.ts +30 -0
  88. package/engine/src/joint.ts +173 -0
  89. package/engine/src/launch.ts +405 -0
  90. package/engine/src/lessons.ts +72 -0
  91. package/engine/src/locations.ts +55 -0
  92. package/engine/src/main.ts +346 -0
  93. package/engine/src/messages.ts +394 -0
  94. package/engine/src/notifiers.ts +76 -0
  95. package/engine/src/notify-test.ts +101 -0
  96. package/engine/src/paseo-json.ts +73 -0
  97. package/engine/src/paseo-profiles.ts +133 -0
  98. package/engine/src/paseo-runtime.ts +437 -0
  99. package/engine/src/paths.ts +10 -0
  100. package/engine/src/pipeline.ts +1840 -0
  101. package/engine/src/playbooks.ts +46 -0
  102. package/engine/src/preflight.ts +337 -0
  103. package/engine/src/prompts.ts +72 -0
  104. package/engine/src/queue.ts +61 -0
  105. package/engine/src/runtime-loader.ts +14 -0
  106. package/engine/src/runtime.ts +155 -0
  107. package/engine/src/schedule-time.ts +51 -0
  108. package/engine/src/smoke-test.ts +202 -0
  109. package/engine/src/spec-review.ts +100 -0
  110. package/engine/src/state.ts +333 -0
  111. package/engine/src/steps.ts +266 -0
  112. package/engine/src/usage.ts +67 -0
  113. package/engine/src/worktree.ts +72 -0
  114. package/install.mjs +928 -0
  115. package/notifiers/im-template.mjs +60 -0
  116. package/package.json +67 -4
  117. package/principles/INDEX.md +11 -0
  118. package/skills/acceptance-criteria/SKILL.md +61 -0
  119. package/skills/principle-delete-before-add/SKILL.md +33 -0
  120. package/skills/principle-dont-block-on-humans/SKILL.md +35 -0
  121. package/skills/principle-fix-root-cause/SKILL.md +33 -0
  122. package/skills/principle-prove-it-works/SKILL.md +33 -0
  123. package/skills/principle-report-honestly/SKILL.md +33 -0
  124. package/skills/principle-speak-to-reader/SKILL.md +33 -0
  125. package/skills/principle-this-requirement-only/SKILL.md +33 -0
  126. package/skills/req/SKILL.md +101 -0
  127. package/skills/req/playbooks/accept.md +65 -0
  128. package/skills/req/playbooks/change.md +51 -0
  129. package/skills/req/playbooks/incident.md +55 -0
  130. package/skills/req/playbooks/new.md +94 -0
  131. package/skills/req/playbooks/small.md +48 -0
  132. package/skills/req/playbooks/status.md +41 -0
  133. package/skills/req/playbooks/takeover.md +51 -0
  134. package/skills/req/playbooks/verify.md +57 -0
  135. package/skills/req-doctor/SKILL.md +36 -0
  136. package/skills/req-retro/SKILL.md +81 -0
  137. package/skills/req-setup/SKILL.md +118 -0
  138. package/skills/req-setup/templates/paseo/copy-local-files.mjs +32 -0
  139. package/skills/req-setup/templates/paseo/with-port.mjs +36 -0
  140. package/skills/requirement-interview/SKILL.md +97 -0
  141. package/skills/requirement-kickoff/SKILL.md +17 -0
  142. package/skills/result-report/SKILL.md +34 -0
  143. package/skills/spec-writing/SKILL.md +55 -0
  144. package/skills/spec-writing/spec-template.md +109 -0
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: req-setup
3
+ description: req-kit 项目接入。在项目根目录为 req-kit 生成或更新项目说明、验证方法(实际运行其中的命令)、Paseo 的 paseo.json 和项目配置,确认后提交。新项目第一次使用 /req 之前、项目的构建或测试方式变了、或用户输入 /req-setup 时使用。
4
+ metadata:
5
+ opencode/slash: "true"
6
+ ---
7
+
8
+ # req-kit 项目接入({{REQ_KIT_VERSION}})
9
+
10
+ 为当前项目生成以下文件,让流水线的每个步骤不必每次重新摸索这个项目:
11
+
12
+ | 文件 | 内容 | 谁读 |
13
+ | --- | --- | --- |
14
+ | `.requirement-pipeline/project-notes.md` | 本项目的约定:包管理工具、目录结构、不能改的地方、提交信息格式、已知的坑 | 流水线每个步骤、`/req` 访谈前 |
15
+ | `GLOSSARY.md` | 术语表(推荐):业务词、含义、代码中的名字。访谈和方案设计会继续补充 | `/req` 访谈、流水线每个步骤 |
16
+ | `.requirement-pipeline/verify.md` | 验证方法:安装依赖、启动服务、运行测试、准备测试数据,命令都实际跑过 | 实现、修复、服务启动、验证、复验步骤 |
17
+ | `paseo.json` | Paseo 的工作区设置(推荐):新建 worktree 时自动安装依赖、复制本地配置;把常驻服务定义为由 Paseo 管理的服务,每个 worktree 分到独立的端口 | Paseo;流水线在服务启动和验证前通过 Paseo 启动这些服务 |
18
+ | `.requirement-pipeline.json` | 项目配置:**质量门的检查命令**(`checks`,推荐)、关联仓库(`relatedRepos`,有就写);本项目用的 agent、默认档位、轮数、超时(需要时) | 流水线 |
19
+
20
+ 格式见 `{{REQ_KIT_ROOT}}/contracts/verify.md`。这个入口通常由开发同事或熟悉项目的测试同事运行。
21
+
22
+ ## 步骤
23
+
24
+ 1. 确认位置
25
+ 2. 自己读项目
26
+ 3. 只问读不出来的事
27
+ 4. 实际运行验证命令
28
+ 5. 写文件并展示
29
+ 6. 确认后提交
30
+
31
+ ## 1. 确认位置
32
+
33
+ 在项目的根目录(git 仓库根)运行。用 `git rev-parse --show-toplevel` 确认当前目录就是仓库根;不是的话,告诉用户到仓库根目录的对话中运行。不要 `cd` 到别处。
34
+
35
+ 建议在项目主目录、主分支上运行,这样文件提交后,之后从主分支新建的 worktree 都会带上。当前在某个需求的 worktree 中时,提醒用户:提交只在这个分支上,合并后其他需求才能用到。
36
+
37
+ 已经有这些文件时,这次是更新:读出现有内容,只改过时或缺失的部分,最后以差异形式展示。
38
+
39
+ ## 2. 自己读项目
40
+
41
+ 先读,不要先问:
42
+
43
+ - `README`、`CONTRIBUTING`、`AGENTS.md`、`CLAUDE.md`、`docs/` 下的开发文档
44
+ - 包管理与脚本:`package.json`(scripts、packageManager、engines)、锁文件类型、`Makefile`、`justfile`、`pyproject.toml`、`go.mod`、`pom.xml`、`build.gradle`、`Cargo.toml` 等
45
+ - 测试:测试框架和配置、测试目录、端到端测试工具(Playwright、Cypress 等)
46
+ - 运行:`docker-compose.yml`、`.env.example`、启动脚本、`paseo.json`
47
+ - CI 配置(`.github/workflows/` 等):它跑的命令通常就是最可靠的验证命令
48
+ - 提交历史:`git log --oneline -20`,看提交信息的格式
49
+ - 功能目录中已有的 `service-start.md`、`verification.md` 里"建议写入 verify.md 的内容"一节(如有)
50
+
51
+ ## 3. 只问读不出来的事
52
+
53
+ 一次一个问题,给选项和推荐。通常只有这些需要问:
54
+
55
+ - 有没有不能改的目录或文件(例如生成的代码、第三方代码、迁移历史)
56
+ - 测试账号、测试数据从哪里来(只记录位置,不要把真实口令写进文件)
57
+ - 外部服务(短信、支付、邮件)在本地怎么替代
58
+ - 端到端验证用什么方式:现有工具,还是手工按步骤走
59
+ - 这个项目的需求默认走哪个档位,要不要换 agent(不需要就不写这些项)
60
+ - 有没有相关的其他仓库(例如这是前端,接口在另一个后端仓库):在这台机器上的位置、它提供什么。登记后流水线的步骤可以只读参考它,不会改动它
61
+ - 多模块的仓库(例如 `web/` 和 `server/` 各有自己的测试):确认各模块的检查命令,第 5 步按模块写进 `checks`
62
+ - 项目已经有 `paseo.json` 时,要不要由你补充;没有时,要不要生成(推荐生成,见第 5 步)
63
+
64
+ ## 4. 实际运行验证命令
65
+
66
+ 按读到的做法,依次实际运行:安装依赖、构建或类型检查、代码检查、测试、启动服务并确认就绪、端到端检查(有的话)。每条记录:命令、所在目录、用时、结果(例如"412 个用例全部通过")。
67
+
68
+ - 失败的命令不要写成可用。查明原因:是环境问题(缺少服务、缺少配置)就写明准备步骤后重试;是项目本身的问题就写进"已知问题"。
69
+ - 启动的服务、容器在结束前关掉。
70
+ - 生成了 `paseo.json` 的服务定义时,设置环境变量 `PASEO_PORT=<一个空闲端口>` 后手工跑一遍它的启动命令(`node scripts/paseo/with-port.mjs …`),确认服务确实监听这个端口,再关掉。准备命令也照样跑一遍(`copy-local-files.mjs` 需要设置 `PASEO_SOURCE_CHECKOUT_PATH`)。
71
+ - 不连接生产环境,不使用生产凭据,不触发真实的外部动作。
72
+
73
+ ## 5. 写文件并展示
74
+
75
+ - `verify.md`:按 `{{REQ_KIT_ROOT}}/contracts/verify.md` 的结构,第一行之后写"最后核对:<日期>(/req-setup,<全部命令已运行 / 哪些没能运行>)"。只写实际跑通的命令;跑不通的写在"已知问题"。
76
+ - `project-notes.md`:一条一行,只写对做需求有影响的约定。例如"包管理用 pnpm,不要用 npm""数据库变更必须写成 migrations/ 下的迁移脚本""不要改动 legacy/ 目录""提交信息用 Conventional Commits 格式"。再加一节**范例文件**:各类代码(接口、页面、数据访问、测试、迁移脚本等)在项目里写得最好的一个文件,例如"接口:`src/api/orders.ts`;单元测试:`test/api/orders.test.ts`"。方案设计会让每个任务照着范例写,代码更像项目原有的样子。只列你读过、确认写得规范的文件。
77
+ - `GLOSSARY.md`(仓库根目录):项目还没有术语表时,从代码、文档和界面文字中整理主要的业务词,每条写含义和代码中的名字(类名、字段、接口路径或表名),格式见 `{{REQ_KIT_ROOT}}/skills/requirement-interview/SKILL.md` 的"术语"一节。已有的只补充"代码中的名字"等缺失的部分,不改别人写的含义。拿不准含义的不要写,留给访谈时问。
78
+ - `paseo.json`(Paseo 读取,格式见 Paseo 文档的 Git worktrees 一节)。它会提交、整个团队共用,而团队成员的电脑可能是 macOS、Linux 或 Windows,Paseo 在各系统上用不同的 shell 执行其中的命令(macOS/Linux:bash 和 sh;Windows:准备命令用 PowerShell、脚本用 cmd.exe)。所以**命令一律写成各系统都一样的形式**:只调用程序本身(`npm`、`pnpm`、`node`、`python` 等),不用 shell 的语法——不写 `$变量`、`%变量%`、`$env:变量`,不用 `&&`、`||`、`cp`、`[ -f … ]`、`Copy-Item`。需要读环境变量或判断文件的逻辑交给下面两个脚本:
79
+ - 把 `{{REQ_KIT_ROOT}}/skills/req-setup/templates/paseo/` 中的 `with-port.mjs` 和 `copy-local-files.mjs` 复制到项目的 `scripts/paseo/`(已有就比较,内容相同不动),和 `paseo.json` 一起提交。它们只依赖 Node.js(req-kit 本来就需要)。
80
+ - `worktree.setup`:写成数组,一行一条命令。通常是安装依赖(用锁文件对应的命令,例如 `npm ci`、`pnpm install --frozen-lockfile`),以及复制不提交的本地配置:`node scripts/paseo/copy-local-files.mjs .env config/local.json`(来源目录里没有的文件会跳过,不会报错)。
81
+ - `scripts`:常用的命令写成脚本(如 `test`、`lint`);常驻服务写成 `"type": "service"`,必须监听 Paseo 分配的端口,不要写死。写法:`node scripts/paseo/with-port.mjs npm run dev -- --port {PORT}`(`{PORT}` 换成 Paseo 分配的端口,同时设置环境变量 `PORT`);程序本来就读取 `PORT` 环境变量的,`node scripts/paseo/with-port.mjs npm start` 即可。服务之间互相调用的地址,让程序读取环境变量 `PASEO_SERVICE_<名称>_URL`。
82
+ - 例子:
83
+
84
+ ```json
85
+ {
86
+ "worktree": { "setup": ["npm ci", "node scripts/paseo/copy-local-files.mjs .env"] },
87
+ "scripts": {
88
+ "test": { "command": "npm test" },
89
+ "web": { "type": "service", "command": "node scripts/paseo/with-port.mjs npm run dev -- --port {PORT}" }
90
+ }
91
+ }
92
+ ```
93
+ - 团队确定只用一种系统、并且用户明确要求时,才可以用那种系统的 shell 写法;`/req-doctor` 会提示它在其他系统上不能用。
94
+ - 已有 `paseo.json` 时只补充缺少的部分,不改别人写的内容。
95
+ - 在 `verify.md` 的启动服务一节注明:服务已定义在 `paseo.json`,由流水线通过 Paseo 启动;同时保留手工启动的命令,供没有 Paseo 时使用。
96
+ - `.requirement-pipeline.json`:
97
+ - `checks`(推荐):质量门的检查。流水线会在写代码和修复的步骤之后**自己运行**它们,只拦"改动之前通过、现在失败"的检查,并把输出发回给那一步的 agent 修复,不依赖 agent 自己说"测试通过了"。把第 4 步实际跑通、几分钟内能跑完的检查写进去:格式、lint、类型检查、单元测试、构建(端到端测试和需要启动服务的检查不要写,它们由功能验证负责)。命令同样写成各系统通用的形式。多模块的仓库按模块分开写,用 `cwd` 指定模块目录(这项检查只在该模块有改动时运行;需要更精确时用 `paths` 列出它关心的目录):
98
+
99
+ ```json
100
+ {
101
+ "checks": [
102
+ { "name": "lint", "command": "npm run lint" },
103
+ { "name": "web 测试", "command": "npm test", "cwd": "web" },
104
+ { "name": "server 测试", "command": "npm test", "cwd": "server", "timeoutMinutes": 15 }
105
+ ]
106
+ }
107
+ ```
108
+ - `relatedRepos`(有关联仓库时):`[{ "name": "后端", "path": "../backend", "role": "提供登录和订单接口" }]`。`path` 写相对项目目录的路径(团队约定把相关仓库放在同一个上级目录最方便),也可以写 `~/` 开头的路径。平时流水线的步骤只读不改;需求说明写了"联合开发"时,流水线会为这个需求在它那里新建工作区,一起开发。关联仓库最好也运行过 `/req-setup`,它自己的检查命令、验证方法和项目说明会用在它的步骤里。
109
+ - 其他设置只在需要和本机配置不同时才写,例如 `"defaultProfile": "quick"`。不要写 `daemonUrl`、`daemonPasswordEnv`、`teamConfig`,写了也会被忽略。
110
+ - `.gitignore`:确认包含 `docs/features/*/.pipeline/`(流水线的运行状态),没有就建议加上。
111
+
112
+ 把这些文件的内容(更新时是差异)展示给用户,并说明运行验证的结果:哪些通过、哪些没能运行以及原因。
113
+
114
+ ## 6. 确认后提交
115
+
116
+ 用户确认后,只提交这几个文件(以及 `GLOSSARY.md`、`scripts/paseo/` 和 `.gitignore` 的改动)。`paseo.json` 必须提交:Paseo 新建 worktree 时读取的是基准分支上已提交的版本,提交信息例如 `chore(req-kit): 项目接入说明与验证方法`。不 push。
117
+
118
+ 最后告诉用户:之后项目的构建、测试或启动方式有变化时,再运行一次 `/req-setup`;也可以直接编辑这些文件。可以运行 `/req-doctor` 确认项目检查全部正常。
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ // Written into the project by req-kit's /req-setup. Copies local files that are not committed
3
+ // (for example .env) from the checkout a new Paseo worktree was created from, the same way on
4
+ // macOS, Linux and Windows. Files that do not exist there, or already exist here, are skipped.
5
+ //
6
+ // paseo.json: "worktree": { "setup": ["npm ci", "node scripts/paseo/copy-local-files.mjs .env"] }
7
+
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+
11
+ const source = process.env.PASEO_SOURCE_CHECKOUT_PATH;
12
+ const files = process.argv.slice(2);
13
+ if (!source) {
14
+ console.log("没有环境变量 PASEO_SOURCE_CHECKOUT_PATH(不是 Paseo 新建 worktree 时运行的),跳过。");
15
+ process.exit(0);
16
+ }
17
+ for (const file of files) {
18
+ const from = path.resolve(source, file);
19
+ const to = path.resolve(process.cwd(), file);
20
+ if (path.resolve(from) === path.resolve(to)) continue;
21
+ if (!fs.existsSync(from)) {
22
+ console.log(`跳过 ${file}:来源目录中没有`);
23
+ continue;
24
+ }
25
+ if (fs.existsSync(to)) {
26
+ console.log(`跳过 ${file}:这里已经有了`);
27
+ continue;
28
+ }
29
+ fs.mkdirSync(path.dirname(to), { recursive: true });
30
+ fs.cpSync(from, to, { recursive: true });
31
+ console.log(`已复制 ${file}`);
32
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ // Written into the project by req-kit's /req-setup. Runs a command with {PORT} replaced by
3
+ // the port Paseo assigned (PASEO_PORT), the same way on macOS, Linux and Windows, whatever
4
+ // shell Paseo uses there (bash, sh, cmd.exe). Also sets PORT for programs that read it.
5
+ //
6
+ // paseo.json: "command": "node scripts/paseo/with-port.mjs npm run dev -- --port {PORT}"
7
+ // by hand: PASEO_PORT=4100 node scripts/paseo/with-port.mjs npm run dev -- --port {PORT}
8
+
9
+ import { spawn } from "node:child_process";
10
+
11
+ const args = process.argv.slice(2);
12
+ if (args.length === 0) {
13
+ console.error("用法:node scripts/paseo/with-port.mjs <命令> [参数…](参数中的 {PORT} 换成环境变量 PASEO_PORT)");
14
+ process.exit(2);
15
+ }
16
+ const port = process.env.PASEO_PORT ?? process.env.PORT;
17
+ if (!port && args.some((a) => a.includes("{PORT}"))) {
18
+ console.error("没有环境变量 PASEO_PORT:它由 Paseo 提供,手工运行时请自己设置。");
19
+ process.exit(2);
20
+ }
21
+ const resolved = args.map((a) => (port ? a.replaceAll("{PORT}", port) : a));
22
+ // npm, npx and other .cmd shims need a shell on Windows.
23
+ const windows = process.platform === "win32";
24
+ const child = spawn(resolved[0], resolved.slice(1).map((a) => (windows && /[\s"]/.test(a) ? `"${a.replace(/"/g, '\\"')}"` : a)), {
25
+ stdio: "inherit",
26
+ shell: windows,
27
+ env: port ? { ...process.env, PORT: port } : process.env,
28
+ });
29
+ for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
30
+ process.on(signal, () => child.kill(signal));
31
+ }
32
+ child.on("error", (error) => {
33
+ console.error(`无法启动 ${resolved[0]}:${error.message}`);
34
+ process.exit(127);
35
+ });
36
+ child.on("exit", (code, signal) => process.exit(code ?? (signal ? 1 : 0)));
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: requirement-interview
3
+ description: req-kit 方法:通过一次一问、带选项和推荐的访谈,把一个需求谈到"换一个人来做也会做出同一个东西"的程度,并边谈边记录到 alignment.md 和 GLOSSARY.md。由 /req 的手册调用;单独使用时也适用于任何需求澄清。
4
+ ---
5
+
6
+ # 需求访谈
7
+
8
+ ## 目标
9
+
10
+ 把需求谈到"换一个人来做,也会做出同一个东西"的清晰程度。访谈的结果之后交给无人值守的开发流水线,流水线里没有人能再回头问,所以**现在没问清楚的地方,后面只能靠猜**。
11
+
12
+ ## 对面是谁
13
+
14
+ 需求方通常是测试、产品经理或项目经理:有一定技术背景,熟悉接口、字段、状态、测试用例、测试环境这些概念,但不读代码。据此:
15
+
16
+ - 可以直接用他们熟悉的概念提问,例如"这个接口失败时返回什么错误码""列表要不要按创建时间倒序"。
17
+ - 不问代码层面的选择(用哪个框架、怎么拆模块、同步还是异步)。这些由你决定,记入 spec 的"技术假设"。
18
+ - 他们往往最清楚异常流程、测试数据和环境,这些要重点问。
19
+
20
+ ## 开口之前
21
+
22
+ 1. 先读项目里已有的资料:`GLOSSARY.md`(术语表;较早的项目可能叫 `CONTEXT.md`)、`docs/adr/`(已做的决定)、`README`、`CLAUDE.md` / `AGENTS.md`、`.requirement-pipeline/project-notes.md`,以及与需求相关的代码和现有页面、接口。
23
+ 2. 能从代码和文档里得到答案的事,不拿去问。可以说"我看到现在的列表是按创建时间倒序的,新功能沿用这个顺序,对吗?",把发现变成一个确认题。
24
+
25
+ ## 怎么问
26
+
27
+ **先听,再复述。** 请对方用自己的话把想要的东西讲一遍。用两三句话复述你的理解,确认后再往下问。
28
+
29
+ **一次只问一个问题。** 每个问题给 2–4 个选项,把你推荐的放在第一个并说明理由。环境里有选择题式的提问工具就用它,否则用带编号的文字选项。对方说"你定"时,采用推荐项,记为假设。
30
+
31
+ **问结果,不问手段。** 问"提交之后,谁应该在多久之内看到这条记录",不问"要不要用消息队列"。
32
+
33
+ **技术限制翻译成可见后果。** 不说"这需要改表结构",而说"这样做的话,以前的历史订单不会带上这个信息,只有新订单才有。可以接受吗?"
34
+
35
+ **用具体例子提问。** "张三周五下午 6 点提交了申请,审批人周一才上班,这期间张三看到的状态是什么?"比"审批超时怎么处理"更好回答。
36
+
37
+ **追问到目的。** 对方说"加一个导出按钮"时,问清楚导出之后拿去做什么。真正的需求常常是另一件事。
38
+
39
+ **主动问对方没想到的情况:**
40
+ - 出错和中断:输入不合法、提交到一半关掉、重复提交、依赖的服务不可用
41
+ - 反悔:能不能撤销、修改、删除,谁可以
42
+ - 权限:谁能看、谁能改、谁不能看
43
+ - 边界:数量上限、时间期限、空值、超长输入、并发
44
+ - 已有的数据和进行中的业务怎么办
45
+ - 测试:用什么测试数据、在哪个环境验证、有没有现成的测试账号或测试替身
46
+ - 这次明确不做什么
47
+
48
+ **每条需求都问"怎么算做对了"。** 要一个可以实际检查的答案,它会成为验收标准(写法见 `{{REQ_KIT_ROOT}}/skills/acceptance-criteria/SKILL.md`)。
49
+
50
+ **控制节奏。** 每谈完一个主题,用一两句话小结"已经定了什么、还剩什么"。对方的说法与现有文档或系统行为矛盾时,直接指出并请对方选择。
51
+
52
+ **区分"必须问"和"可以假设"。** 猜错会做出错误东西的,一定问;其余的按最合理的理解假设并记录(见原则 `principle-dont-block-on-humans`)。
53
+
54
+ ## 边谈边记
55
+
56
+ 在功能目录下维护 `alignment.md`,每定下一件事就追加一条,不要等到最后再回忆:
57
+
58
+ ```markdown
59
+ ## <主题>
60
+ - 问题:<问题>
61
+ - 结论:<定下来的答案>
62
+ - 理由 / 被否的选项:<一句话>
63
+ - 来源:需求方明确确认 / 需求方说"你定"(记为假设)/ 从现有代码或文档得出
64
+ ```
65
+
66
+ **术语。** 出现新的业务或领域术语,或者发现同一个词在不同地方意思不同时,写入仓库根目录的 `GLOSSARY.md`(不存在就创建):
67
+
68
+ ```markdown
69
+ ## <术语>
70
+ <在本项目中的确切含义。一两句话。>
71
+ - 代码中的名字:`<类名、字段名、接口路径或表名>`(从代码中查到的;还没有的不写,方案设计时会补上)
72
+ - 不要与"<容易混淆的词>"混用:<区别>
73
+ ```
74
+
75
+ "代码中的名字"让需求方的说法和代码里的叫法对上:流水线的步骤会用它命名,评审会检查是否一致。
76
+
77
+ 项目里已有 `CONTEXT.md`(旧名)时,先读它;新增的术语仍写入 `GLOSSARY.md`,两者是否合并由开发同事决定。
78
+
79
+ **重要决定。** 影响以后很多需求、并且不容易推翻的决定(例如"订单号对外展示时一律脱敏"),在 `docs/adr/` 下新建一条记录:`<四位编号>-<英文短名>.md`,写明背景、决定、理由。不确定是否算重要时,不写。
80
+
81
+ ## 什么时候可以结束
82
+
83
+ **快速档**:要改什么、改成什么样、不改什么、每条验收标准,都有了结论。
84
+
85
+ **标准档**:下面每一项都有了结论,或被明确标为"假设"或"本次不做":
86
+
87
+ - 要解决的问题,以及做成之后怎么衡量
88
+ - 谁会用,在什么场景下用
89
+ - 主流程的每一步
90
+ - 规则(计算方式、状态变化、限制条件)
91
+ - 出错、反悔、权限、边界、已有数据
92
+ - 测试数据和验证环境
93
+ - 本次不做的范围
94
+ - 每条需求的验收标准
95
+ - 优先级:哪些必须有,哪些可以以后再说
96
+
97
+ 还有只有需求方能回答、且答错会导致做错东西的问题时,继续问,不要带着它进入下一步。
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: requirement-kickoff
3
+ description: 旧入口,已改名为 /req。用户输入 /requirement-kickoff 时使用:提示改用 /req,并按 /req 继续处理。
4
+ metadata:
5
+ opencode/slash: "true"
6
+ ---
7
+
8
+ # 旧入口:/requirement-kickoff
9
+
10
+ 用户的话:$ARGUMENTS
11
+
12
+ 这个入口已经改名为 `/req`(req-kit {{REQ_KIT_VERSION}}),功能相同,并且新增了小改动、查看进度、暂停和继续等场景。
13
+
14
+ 1. 先用一句话告诉用户:以后请输入 `/req`(Pi 中为 `/skill:req`),这次照常处理。
15
+ 2. 然后读取 `{{REQ_KIT_ROOT}}/skills/req/SKILL.md`,把用户的话当作 `/req` 的输入,按它的说明继续。
16
+
17
+ 这个过渡入口会在 req-kit 2.0 中移除。
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: result-report
3
+ description: req-kit 方法:把流水线的通知、状态和各步骤产物整理成需求方能核对的结果说明,结论先行,分清已验证和未验证,写明证据位置和下一步。由 /req 转述进度、通知、完成报告和接手时调用。
4
+ ---
5
+
6
+ # 结果说明
7
+
8
+ 需求方(测试、产品、项目经理)要根据你的话做决定:是否验收、是否需要回答问题、是否找开发同事。说清楚,并且让他们能自己核对。
9
+
10
+ ## 写法
11
+
12
+ 1. **结论先行。** 第一句话就是结论:做到哪一步了、成没成、要不要他们做什么。
13
+ 2. **分清三类。** 已验证(有运行证据)、未验证(说明原因)、有问题(现象和影响)。不要把未验证的说成完成。
14
+ 3. **给出证据位置。** 结论来自哪个文件的哪一节,例如"验收对照表见 report.md 第 3 节""AC-2.1 的测试输出见 verification.md"。能用命令复核的,给出命令。
15
+ 4. **讲需求和结果,不讲实现。** 可以说接口、字段、页面、测试用例;不说类名、函数名、提交号,除非对方问起。
16
+ 5. **下一步具体到动作。** "请按 report.md 的验收对照表逐条试用,AC-3.2 需要用测试账号 B 登录",而不是"请验收"。
17
+ 6. **长度。** 进展一句话;状态两三句;完成或中断不超过 8 行,详细内容指向文件。
18
+
19
+ ## 常见场景
20
+
21
+ - **进展通知**:一句话,例如"方案已经定了(审核 1 轮),开始写代码"。
22
+ - **查看进度**:现在在做什么、已完成哪些、进行了多久;有等待决定或遗留问题时一并说明。
23
+ - **中断**:在哪一步、原因、日志位置;对方能自己处理的(例如测试服务没启动)给出做法,否则建议找开发同事;处理后怎么继续。
24
+ - **完成**:结论(可以验收 / 有遗留问题 / 未完成),最重要的一两条遗留问题,需要他们确认的决定有几条,下一步做什么。
25
+ - **接手**:这个需求要做什么(一两句)、现在在哪个阶段、有哪些待决事项、接下来建议做什么。
26
+
27
+ ## 数据来源
28
+
29
+ 以文件为准,不凭记忆:
30
+
31
+ - 进度:`start-pipeline --status` 的输出、`progress.md`
32
+ - 结论和证据:`report.md`、`verification.md`、`code-review.md`
33
+ - 需要人确认的决定:`report.md` 的"需要你确认的决定"、`decisions.tsv` 中 `needs_human` 为 `yes` 的行
34
+ - 需求和变更:`spec.md`、`changes.md`;验收结果:`acceptance.md`
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: spec-writing
3
+ description: req-kit 方法:把访谈记录(alignment.md)整理成标准需求说明 spec.md,自查后给需求方一份 10 行以内的摘要请其确认,确认后标记为"已确认"并提交。由 /req 的手册调用。
4
+ ---
5
+
6
+ # 需求说明(spec)
7
+
8
+ spec 是开发流水线判断"要做什么"的唯一依据。流水线的每一步都会引用它的编号(FR-n、AC-n.m),最终报告也按它逐条对照。
9
+
10
+ ## 写
11
+
12
+ 1. 按模板 `{{REQ_KIT_ROOT}}/skills/spec-writing/spec-template.md` 的结构,把 `alignment.md` 的内容整理成 `<功能目录>/spec.md`。
13
+ 2. 填好顶部的几行。流水线读其中四行,写法要保持原样:
14
+ - `- 状态:草稿`(确认后改为 `- 状态:已确认(<日期>)`)
15
+ - `- 档位:标准` 或 `- 档位:快速`
16
+ - `- 类型:新需求` / `小改动` / `缺陷` / `重构` / `评估`:缺陷、重构、评估各有自己的开发做法(见下文"按类型的写法")
17
+ - `- 执行方式:分阶段` 或 `- 执行方式:只做研发`:只在用户选了这两种时写;连续(默认)不写这一行。评估不写
18
+ - `- 联合开发:后端`:这个需求还要改其他仓库时才写,写项目配置 `relatedRepos` 中登记的名称,最多两个,用顿号分开
19
+ 其余几行(版本、格式)给人和 `/req` 看。新需求的版本是 1,每次修改需求加 1。
20
+ 3. 快速档可以省略与这次改动无关的章节,但"范围""功能需求与验收标准""假设"必须有。
21
+ 4. 写作要求:
22
+ - 只写"要什么"和"怎么算做对",不写"怎么实现"。技术上的想法只进入"技术假设"一节。
23
+ - 每条功能需求有编号(FR-1、FR-2…),每条验收标准有编号(AC-1.1、AC-1.2…),写法见 `acceptance-criteria`(`{{REQ_KIT_ROOT}}/skills/acceptance-criteria/SKILL.md`)。
24
+ - 没谈到的内容不要自己补。需要补的,回去问,或写进"假设"并说明依据。
25
+ - 术语与仓库的 `GLOSSARY.md` 一致。
26
+
27
+ ## 按类型的写法
28
+
29
+ 模板按新需求写成。另外三种类型的重点不同,流水线也会按类型走不同的做法:
30
+
31
+ - **缺陷**:背景写现象、影响范围、从什么时候开始。必须有**复现步骤**:环境、账号或数据、操作、看到的结果、应有的结果。验收标准至少一条"按复现步骤操作,应该看到……"(修复前不通过、修复后通过),再加上相邻的、不应受影响的行为。流水线会先复现再修,复现不了会回来问,所以复现步骤越具体越好。
32
+ - **重构**:目标写改进什么,并且可以检查(例如"订单模块不再引用旧的支付库")。第一条验收标准是**行为不变**:列出必须保持不变的主要行为(接口、页面、数据、导出的文件),然后是改进目标的验收标准。"本次不做"写明不顺带修改的行为。
33
+ - **评估**:功能需求写成**要回答的问题**(例如"FR-1 现有的订单接口能否支持按门店筛选"),每个问题的验收标准写清楚回答里要有什么(可选方案的对比、影响的模块和功能、工作量和风险、推荐和理由)。范围写明只做评估、不改代码,以及评估的结论用来做什么决定。可以省略"主流程""权限与数据"等与评估无关的章节。
34
+
35
+ 项目有多个模块或多个仓库(例如前端和后端)时,在"范围"中写明这次涉及哪些模块;只改一边、需要参考另一边的,写明参考哪个仓库的什么(例如"后端已有的登录接口")。
36
+
37
+ **联合开发**(几个仓库都要改):头部写 `- 联合开发:<仓库名称>`;"范围"按仓库写各自要做什么;每条验收标准注明由哪个仓库负责,或者是"端到端"(几个仓库一起才能验证);双方要约定的接口(字段、错误码)在需求层面能说清的写进来,细节由方案设计写成接口约定。
38
+
39
+ ## 自查
40
+
41
+ 写完后逐项检查,发现问题就改:
42
+
43
+ - 每条 FR 至少有一条可以实际检查的 AC,每条 AC 至少有一组具体的输入和期望输出
44
+ - 异常和边界情况都有对应的 AC,而不是只有正常流程
45
+ - 没有"快速""友好""合理"这类无法检查的词,除非给出了具体标准
46
+ - 各条需求之间没有互相矛盾
47
+ - "测试与验证"一节写明了测试数据和验证环境(快速档可以只写一句)
48
+ - "待确认问题"一节为空。不为空就回去问
49
+
50
+ ## 确认
51
+
52
+ 1. 给需求方一份 10 行以内的摘要:会做什么、不做什么、有哪些假设需要他们知情、他们之后会怎么验收。告诉他们完整文件的位置,愿意的话可以直接打开看。
53
+ 2. 请他们确认。提出修改时,回到访谈,改完再自查、再确认。
54
+ 3. 确认后,把顶部改为 `- 状态:已确认(<日期>)`。没有确认的 spec 不要标为"已确认"。
55
+ 4. 如果是 git 仓库,把功能目录、`GLOSSARY.md` 和 `docs/adr/` 中本次的改动提交到当前分支。只提交这些文件,不 push。提交信息例如 `docs(<功能目录名>): 需求说明已确认`。
@@ -0,0 +1,109 @@
1
+ # <需求名称>
2
+
3
+ - 状态:草稿 / 已确认(<确认日期>)
4
+ - 档位:标准 / 快速
5
+ <!-- 执行方式选了"分阶段"或"只做研发"时,在这里加一行"- 执行方式:分阶段"或"- 执行方式:只做研发";连续执行(默认)不写 -->
6
+ - 类型:新需求 / 小改动 / 缺陷 / 重构 / 评估
7
+ <!-- 这个需求还要改其他仓库(例如后端)时,加一行"- 联合开发:后端",写项目配置 relatedRepos 中登记的名称,最多两个,用顿号分开 -->
8
+ - 版本:1
9
+ - 格式:req-kit/spec@1
10
+ - 需求提出人:<姓名或角色>
11
+ - 功能目录:`docs/features/<YYYYMMDD>-<英文短名>/`
12
+ - 对齐记录:`alignment.md`
13
+
14
+ ## 1. 背景与目标
15
+
16
+ <现在遇到了什么问题,影响了谁。两三句话。>
17
+
18
+ **目标**:<做成之后,什么会变好。>
19
+
20
+ **怎么衡量做成了**:<可以观察或统计的结果。>
21
+
22
+ ## 2. 用户与使用场景
23
+
24
+ | 角色 | 是谁 | 在什么情况下会用到 |
25
+ | --- | --- | --- |
26
+ | <角色名> | <一句话描述> | <典型场景> |
27
+
28
+ ## 3. 范围
29
+
30
+ **本次要做**
31
+ - <条目>
32
+
33
+ **本次不做**(已和需求方确认)
34
+ - <条目>:<不做的原因,或以后再考虑>
35
+
36
+ <!-- 多模块或多仓库的项目:写明涉及的模块(如 web/、server/);只改一边时写明参考另一边的什么(如"后端已有的登录接口") -->
37
+
38
+ ## 4. 主流程
39
+
40
+ <按顺序描述用户从开始到结束会经历的每一步,以及每一步之后系统的表现。可以提到页面、接口、字段,不写代码实现。>
41
+
42
+ 1. <步骤>
43
+ 2. <步骤>
44
+
45
+ ## 5. 功能需求与验收标准
46
+
47
+ 每条需求按下面的格式写。优先级:必须有 / 应该有 / 可以以后再说。验收标准的写法见 `acceptance-criteria`:前置条件、操作、预期结果,简单的可以写成一句话。
48
+
49
+ ### FR-1 <需求标题>(优先级:必须有)
50
+
51
+ <用一两句话说明用户需要什么,以及为什么。>
52
+
53
+ 验收标准:
54
+
55
+ - **AC-1.1** <标题>
56
+ - 前置条件:<数据、账号、环境>
57
+ - 操作:<做了什么>
58
+ - 预期结果:<应该看到什么>
59
+ - **AC-1.2** 在<异常或边界情况>下,当<做了什么>,应该<看到什么结果>。
60
+
61
+ ### FR-2 <需求标题>(优先级:…)
62
+
63
+ …
64
+
65
+ ## 6. 业务规则
66
+
67
+ | 编号 | 规则 | 例子 |
68
+ | --- | --- | --- |
69
+ | BR-1 | <计算方式、状态变化条件、限制条件等> | <一个具体的例子> |
70
+
71
+ ## 7. 权限与数据
72
+
73
+ - **谁能看 / 谁能改**:<按角色说明>
74
+ - **涉及的业务信息**:<有哪些信息,哪些是必填,哪些敏感>
75
+ - **已有数据和进行中的业务**:<上线时怎么处理>
76
+
77
+ ## 8. 测试与验证
78
+
79
+ - **测试数据 / 账号**:<访谈中定下的>
80
+ - **验证环境**:<本地 / 测试环境 / 其他,以及需要的准备>
81
+ - **需求方会怎么验收**:<亲自试用的步骤,或者执行的命令>
82
+
83
+ ## 9. 其他要求
84
+
85
+ <只写谈到过的。例如:多久之内要有反应、同时多少人使用、需要保留多长时间的记录、哪些设备上要能用。每一条都给出可以检查的标准。>
86
+
87
+ ## 10. 假设
88
+
89
+ 没有得到需求方明确回答、由 AI 按推荐方案定下的事项。需求方请过目。
90
+
91
+ | 编号 | 假设内容 | 依据 | 如果假设不成立会影响什么 |
92
+ | --- | --- | --- | --- |
93
+ | A-1 | | | |
94
+
95
+ ## 11. 技术假设(给方案设计阶段参考)
96
+
97
+ 访谈中没有问需求方、留给技术方案决定的事项,以及从现有代码中观察到的相关情况。这里的内容不是需求,方案设计时可以调整。
98
+
99
+ - <条目>
100
+
101
+ ## 12. 待确认问题
102
+
103
+ <定稿时这一节应该为空。>
104
+
105
+ ## 13. 术语
106
+
107
+ | 术语 | 含义 |
108
+ | --- | --- |
109
+ | <需求方使用的词> | <在本需求中的确切意思。与仓库的 `GLOSSARY.md` 保持一致> |