paseo-req-kit 1.14.0-beta.5 → 1.14.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.
Files changed (71) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/package.json +1 -1
  3. package/paseo-plugin/package.json +1 -1
  4. package/site-dist/404.html +2 -2
  5. package/site-dist/assets/{app.TlOHPtfE.js → app.VQ-QxRPH.js} +1 -1
  6. package/site-dist/assets/changelog.md.CIKYJXpF.js +1 -0
  7. package/site-dist/assets/chunks/@localSearchIndexroot.h7oQE_np.js +1 -0
  8. package/site-dist/assets/chunks/{VPLocalSearchBox.BUVNy7_o.js → VPLocalSearchBox.CT4Vlj76.js} +1 -1
  9. package/site-dist/assets/chunks/{theme.BFeiG1US.js → theme.B_UmHHou.js} +2 -2
  10. package/site-dist/assets/{guide_getting-started.md.UhkLCUoY.js → guide_getting-started.md.CZM53rO_.js} +1 -1
  11. package/site-dist/assets/{guide_getting-started.md.UhkLCUoY.lean.js → guide_getting-started.md.CZM53rO_.lean.js} +1 -1
  12. package/site-dist/changelog.html +5 -5
  13. package/site-dist/guide/getting-started.html +5 -5
  14. package/site-dist/guide/how-it-works.html +4 -4
  15. package/site-dist/guide/index.html +4 -4
  16. package/site-dist/guide/install.html +4 -4
  17. package/site-dist/guide/maintainer.html +4 -4
  18. package/site-dist/guide/phases.html +4 -4
  19. package/site-dist/guide/project.html +4 -4
  20. package/site-dist/guide/user.html +4 -4
  21. package/site-dist/hashmap.json +1 -1
  22. package/site-dist/index.html +4 -4
  23. package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +4 -4
  24. package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +4 -4
  25. package/site-dist/reference/adr/0003-script-engine-not-hub.html +4 -4
  26. package/site-dist/reference/adr/0004-result-files.html +4 -4
  27. package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +4 -4
  28. package/site-dist/reference/adr/0006-skill-install-targets.html +4 -4
  29. package/site-dist/reference/adr/0007-own-interview-skill.html +4 -4
  30. package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +4 -4
  31. package/site-dist/reference/adr/0009-versioned-install-layout.html +4 -4
  32. package/site-dist/reference/adr/0010-generated-feature-overview.html +4 -4
  33. package/site-dist/reference/adr/0011-resume-after-completion.html +4 -4
  34. package/site-dist/reference/adr/0012-review-panel.html +4 -4
  35. package/site-dist/reference/adr/0013-no-release-tooling.html +4 -4
  36. package/site-dist/reference/adr/0014-notifier-slot.html +4 -4
  37. package/site-dist/reference/adr/0015-incremental-continue.html +4 -4
  38. package/site-dist/reference/adr/0016-upgrade-from-tags.html +4 -4
  39. package/site-dist/reference/adr/0017-use-paseo-capabilities.html +4 -4
  40. package/site-dist/reference/adr/0018-own-worktree-option.html +4 -4
  41. package/site-dist/reference/adr/0019-parallel-orchestration.html +4 -4
  42. package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +4 -4
  43. package/site-dist/reference/adr/0021-npm-version-manager.html +4 -4
  44. package/site-dist/reference/adr/0022-develop-and-verify-phases.html +4 -4
  45. package/site-dist/reference/adr/0023-types-gate-slices.html +4 -4
  46. package/site-dist/reference/adr/0024-confirm-early-review-axes.html +4 -4
  47. package/site-dist/reference/adr/0025-joint-requirements.html +4 -4
  48. package/site-dist/reference/adr/0026-machine-records-and-api.html +4 -4
  49. package/site-dist/reference/adr/0027-paseo-plugin.html +4 -4
  50. package/site-dist/reference/adr/0028-external-integrations.html +4 -4
  51. package/site-dist/reference/adr/0029-requirements-from-cards.html +4 -4
  52. package/site-dist/reference/adr/0030-card-intake-process.html +4 -4
  53. package/site-dist/reference/adr/0031-fewer-interventions.html +4 -4
  54. package/site-dist/reference/adr/0032-npm-only-install.html +4 -4
  55. package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +4 -4
  56. package/site-dist/reference/adr/index.html +4 -4
  57. package/site-dist/reference/commands.html +4 -4
  58. package/site-dist/reference/config.html +4 -4
  59. package/site-dist/reference/contracts/cli-json.html +4 -4
  60. package/site-dist/reference/contracts/feature-files.html +4 -4
  61. package/site-dist/reference/contracts/index.html +4 -4
  62. package/site-dist/reference/contracts/notifier-event.html +4 -4
  63. package/site-dist/reference/contracts/result-file.html +4 -4
  64. package/site-dist/reference/contracts/spec.html +4 -4
  65. package/site-dist/reference/contracts/state.html +4 -4
  66. package/site-dist/reference/contracts/usage-record.html +4 -4
  67. package/site-dist/reference/contracts/verify.html +4 -4
  68. package/site-dist/reference/scope.html +4 -4
  69. package/site-dist/assets/changelog.md.DiGi8kHU.js +0 -1
  70. package/site-dist/assets/chunks/@localSearchIndexroot.Dk_-Yka5.js +0 -1
  71. /package/site-dist/assets/{changelog.md.DiGi8kHU.lean.js → changelog.md.CIKYJXpF.lean.js} +0 -0
@@ -9,9 +9,9 @@
9
9
  <link rel="preload stylesheet" href="/assets/style.Dwsa4SMe.css" as="style">
10
10
  <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/assets/app.TlOHPtfE.js"></script>
12
+ <script type="module" src="/assets/app.VQ-QxRPH.js"></script>
13
13
  <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
- <link rel="modulepreload" href="/assets/chunks/theme.BFeiG1US.js">
14
+ <link rel="modulepreload" href="/assets/chunks/theme.B_UmHHou.js">
15
15
  <link rel="modulepreload" href="/assets/chunks/framework.B9qR_F1m.js">
16
16
  <link rel="modulepreload" href="/assets/guide_project.md.DIjDRoAq.lean.js">
17
17
  <link rel="icon" type="image/svg+xml" href="/logo.svg">
@@ -23,7 +23,7 @@
23
23
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
24
24
  </head>
25
25
  <body>
26
- <div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-ab19afbb><!--]--><span data-v-9f43907a>req-kit</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="搜索文档"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">搜索文档</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/guide/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>指南</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/reference/commands" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>参考</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/changelog" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>更新记录</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bfe7971f><span class="text" data-v-bfe7971f><!----><span data-v-bfe7971f>v1.14.0-beta.5</span><span class="vpi-chevron-down text-icon" data-v-bfe7971f></span></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/changelog" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>更新记录</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link vp-external-link-icon" href="https://github.com/yiyisf/paseo-req-kit/releases" target="_blank" rel="noreferrer" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>GitHub Releases</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/reference/scope" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>范围与取舍</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/yiyisf/paseo-req-kit" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>外观</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/yiyisf/paseo-req-kit" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>目录</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>回到顶部</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>开始</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>req-kit 是什么</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/getting-started" data-v-0009425e><!--[--><p class="text" data-v-0009425e>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/how-it-works" data-v-0009425e><!--[--><p class="text" data-v-0009425e>工作原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>使用</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/user" data-v-0009425e><!--[--><p class="text" data-v-0009425e>使用者指南</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/phases" data-v-0009425e><!--[--><p class="text" data-v-0009425e>分阶段执行与提测</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 has-active" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>安装与维护</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/install" data-v-0009425e><!--[--><p class="text" data-v-0009425e>安装与升级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/project" data-v-0009425e><!--[--><p class="text" data-v-0009425e>项目定制与运行规则</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/maintainer" data-v-0009425e><!--[--><p class="text" data-v-0009425e>维护者指南</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>本页内容</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _guide_project external-link-icon-enabled" data-v-e6f2a212><div><div><h1 id="项目定制与运行规则" tabindex="-1">项目定制与运行规则 <a class="header-anchor" href="#项目定制与运行规则" aria-label="Permalink to &quot;项目定制与运行规则&quot;">​</a></h1><h2 id="每个需求一个-worktree-工作区" tabindex="-1">每个需求一个 worktree 工作区 <a class="header-anchor" href="#每个需求一个-worktree-工作区" aria-label="Permalink to &quot;每个需求一个 worktree 工作区&quot;">​</a></h2><p>在 Paseo 中为每个需求新建工作区:<strong>New workspace</strong> → 选择项目 → <strong>Isolation</strong> 选 <strong>New worktree</strong> → 起点选主分支,然后在这个工作区的对话里输入 <code>/req</code>。</p><ul><li>流水线在这个工作区自己的目录和分支上运行、提交,不影响项目主目录。</li><li>同一个目录一次只能运行一条流水线;用了 worktree,几个需求可以同时进行。</li><li>在主目录发起时,<code>/req</code> 会先建议改用 worktree;使用者坚持的话,它会新建 <code>feature/&lt;功能目录名&gt;</code> 分支再继续。</li></ul><p><strong>分支规则</strong>:流水线把启动时检出的分支作为本次需求的工作分支,所有步骤都提交到这里,不切换、不新建分支。它拒绝在默认分支(<code>main</code>、<code>master</code> 或 <code>origin/HEAD</code> 指向的分支)或 detached HEAD 上启动;续跑时分支变了也会拒绝。</p><h2 id="档位" tabindex="-1">档位 <a class="header-anchor" href="#档位" aria-label="Permalink to &quot;档位&quot;">​</a></h2><table tabindex="0"><thead><tr><th>档位</th><th>适用</th><th>访谈</th><th>流程</th></tr></thead><tbody><tr><td>快速(<code>quick</code>)</td><td>小改动:文案、样式、配置项、字段显示等,不涉及数据结构、权限、对外接口</td><td>只问要改什么、改成什么样、不改什么、验收标准</td><td>审核、评审、缺陷修复各一轮;不做服务启动验证;产物从简</td></tr><tr><td>标准(<code>standard</code>)</td><td>其他情况</td><td>完整访谈</td><td>审核最多 2 轮、评审最多 3 轮、缺陷修复最多 3 轮</td></tr></tbody></table><p><code>/req</code> 会根据需求推荐档位,用户确认后写进 spec(<code>- 档位:快速</code>)。流水线按以下顺序决定档位:<code>--profile</code> 参数 → 续跑时沿用上次的档位 → spec 中的档位 → 配置中的 <code>defaultProfile</code>。各档的轮数和是否做服务启动验证可以在配置的 <code>profiles</code> 中调整。</p><h2 id="需求类型" tabindex="-1">需求类型 <a class="header-anchor" href="#需求类型" aria-label="Permalink to &quot;需求类型&quot;">​</a></h2><p>spec 头部的 <code>- 类型:</code> 决定流水线走哪种做法(1.8 起)。缺陷、重构、评估有自己的做法,新需求和小改动走通常的流程:</p><table tabindex="0"><thead><tr><th>类型</th><th>做法</th><th>关键证据</th></tr></thead><tbody><tr><td>缺陷(<code>缺陷</code>、<code>bug</code>)</td><td>方案设计改为&quot;复现与定位&quot;:先提交一个修复前失败的复现测试或脚本,写 <code>diagnosis.md</code>(根因、影响面);复现不了就暂停,把需要补充的信息发回对话。修复要让复现转绿,评审实际确认它修复前失败</td><td>同一个复现,修复前失败、修复后通过</td></tr><tr><td>重构(<code>重构</code>、<code>技术改进</code>)</td><td>先补特征测试锁住现有行为并单独提交,再小步改动、每步全绿;评审的首要问题是&quot;行为有没有变&quot;</td><td>重构前后同一组测试一致</td></tr><tr><td>评估(<code>评估</code>、<code>调研</code>)</td><td>只读:调研评估(<code>assessment.md</code>)→ 评估审阅 ⇄ 修订 → 评估报告;没有实现、评审、提测和验证,执行方式按连续</td><td>引用的代码位置和实际运行的命令</td></tr></tbody></table><p>各类型的做法写在 <code>engine/prompts/types/&lt;类型&gt;.md</code>,按步骤分节,接在每一步的任务之后;可以用 <code>prompts.local/types/</code> 覆盖。不想用某个类型的做法时,从配置 <code>requirementTypes</code>(默认 <code>[&quot;defect&quot;, &quot;refactor&quot;, &quot;assessment&quot;]</code>)中去掉它,这个类型就按新需求处理。设计决定见 ADR 0023。</p><h2 id="方案确认点-开工前请需求方确认-做完后会看到什么" tabindex="-1">方案确认点:开工前请需求方确认&quot;做完后会看到什么&quot; <a class="header-anchor" href="#方案确认点-开工前请需求方确认-做完后会看到什么" aria-label="Permalink to &quot;方案确认点:开工前请需求方确认&quot;做完后会看到什么&quot;&quot;">​</a></h2><p>方案审核通过后、写代码之前,流水线可以停下来请需求方确认(1.8 起)。方案设计写 <code>preview.md</code>(按操作顺序描述做完后会看到什么、需要确认的假设、不会变的地方),界面改动还在 <code>prototype/</code> 中画出静态的原型页面。对话里的 AI 把要点讲给需求方:确认后执行 <code>--approve</code>(终端里 <code>req approve &lt;需求&gt;</code>)开始写代码;要改的,更新需求说明后 <code>--resume</code>,方案调整后再确认一次。需求方确认过的预览和原型,实现和功能验证都以它为准:界面与原型不一致按缺陷处理。</p><table tabindex="0"><thead><tr><th>配置</th><th>默认</th><th>说明</th></tr></thead><tbody><tr><td><code>designApproval.mode</code></td><td><code>ui</code></td><td><code>ui</code>:方案判断这次是界面改动(结果文件 <code>ui_change</code>)时才停;<code>always</code>:每次都停;<code>off</code>:不停</td></tr><tr><td><code>designApproval.profiles</code></td><td><code>[&quot;standard&quot;]</code></td><td>哪些档位使用;快速档默认不停</td></tr><tr><td><code>designApproval.autoContinueHours</code></td><td>0</td><td>大于 0 时,等了这么久还没确认就按方案继续(通过对话执行);0 表示一直等待。等待超过 <code>waitingReminderHours</code> 会提醒一次</td></tr></tbody></table><p>等待确认时进度显示&quot;等待需求方确认方案&quot;,需求总览归入&quot;需要处理&quot;,外部通知收到 <code>approval</code> 事件。评估类需求不写代码,不经过确认点。</p><p><strong>原型审查页(1.13 起)。</strong> 有 <code>prototype/</code> 的需求,插件的需求页面和&quot;等你处理&quot;里有&quot;审查原型&quot;按钮(等待确认方案时是最醒目的&quot;审查原型并确认方案&quot;),审查页嵌在 Paseo 的网页端和桌面端里打开,手机上在浏览器中打开;终端里是 <code>req review &lt;需求&gt;</code>。需求方在原型上点选要改的地方(页面记下元素、文字、颜色、大小和位置)、双击直接改文字,切换状态和电脑、手机宽度,然后提交:意见整理成带位置信息的清单转给需求会话(与插件中写修改意见的效果相同),或者直接确认方案。草稿和提交记录在功能目录的 <code>.pipeline/review/</code> 中,每一版原型也存在那里,原型改过后页面会标出这一版改了哪里。</p><p>为了让审查页能用,方案设计按约定写原型:每个改动区域标 <code>data-ac</code>(对应的 AC)和 <code>data-label</code>(用需求方的话说是什么),各种状态包在 <code>&lt;section data-state=&quot;状态名&quot;&gt;</code> 中,按钮、标题、字段名写最终的文字。原型里的脚本不会运行。</p><p>审查页由一个本机服务提供:用到时在后台启动,空闲 4 小时后自己退出,只监听 <code>127.0.0.1</code>,地址中带随机令牌(插件设为只读时给只读的地址)。审查页允许被本机地址上的页面(Paseo 网页端)嵌入;要限定或放开,设 <code>REQ_KIT_REVIEW_FRAME_ANCESTORS</code>(CSP <code>frame-ancestors</code> 的值)。需求方在别的电脑上用浏览器访问 Paseo 网页端时,在运行 Paseo daemon 的机器上设置环境变量 <code>REQ_KIT_REVIEW_HOST</code>(例如 <code>0.0.0.0</code>)、<code>REQ_KIT_REVIEW_PUBLIC_URL</code>(别人访问这台机器用的地址,例如 <code>http://10.1.2.3:6781</code>),需要时用 <code>REQ_KIT_REVIEW_PORT</code> 换端口(默认 6781),然后重启 Paseo daemon 让插件拿到新的环境变量(只设 <code>REQ_KIT_REVIEW_HOST</code> 时,地址用这台电脑的计算机名)。没有设置时从别的电脑打开 Paseo 网页、点&quot;审查原型&quot;,页面会说明为什么打不开、该怎么设置(1.13)。</p><h2 id="代码评审分两个方向" tabindex="-1">代码评审分两个方向 <a class="header-anchor" href="#代码评审分两个方向" aria-label="Permalink to &quot;代码评审分两个方向&quot;">​</a></h2><p>标准档第一轮代码评审由两位评审者同时进行(1.8 起),各自写意见,再由 reviewer 核实、汇总成一份结论:</p><ul><li><strong>规格评审</strong>:每条验收标准是否真的实现并有测试、测试的期望值是否与验收标准的例子一致、有没有做需求之外的事、与确认过的预览是否一致。</li><li><strong>规范评审</strong>:项目惯例和范例文件、术语表中的代码名称、测试质量、安全与数据、简单性,以及可以变成规则的问题。</li></ul><p>两位都用配置的 reviewer agent,相当于多两次评审的用量;之后的轮次只核对修复,仍由一位评审。<code>reviewAxes.enabled</code> 设为 <code>false</code> 关闭,<code>reviewAxes.profiles</code> 选择档位(默认只有标准档)。配置了评审小组(<code>reviewPanel</code>)时,以评审小组为准。</p><h2 id="验收测试先提交" tabindex="-1">验收测试先提交 <a class="header-anchor" href="#验收测试先提交" aria-label="Permalink to &quot;验收测试先提交&quot;">​</a></h2><p>方案判断适合测试先行时,代码实现先把从验收标准的例子写出的测试单独提交一次(这时它们是失败的),在结果文件中写明这些测试文件和那次提交。代码评审前,流水线核对它们之后有没有被改过,被改过的交给评审逐个确认有没有依据:为了让测试通过而放宽断言的,按阻塞提出。</p><h2 id="术语表和范例文件" tabindex="-1">术语表和范例文件 <a class="header-anchor" href="#术语表和范例文件" aria-label="Permalink to &quot;术语表和范例文件&quot;">​</a></h2><ul><li><strong><code>GLOSSARY.md</code></strong>(仓库根目录):业务词、含义、代码中的名字。<code>/req-setup</code> 第一次整理,访谈遇到新词时补充,方案设计为新概念补上代码中的名字;各步骤按它命名,规范评审检查是否一致。</li><li><strong>范例文件</strong>:<code>/req-setup</code> 在 <code>project-notes.md</code> 中列出各类代码(接口、页面、测试、迁移脚本)写得最好的文件。方案的每个任务写明参照哪个文件,实现照它的结构、命名、错误处理和测试写法来。</li></ul><h2 id="反复出现的问题变成规则" tabindex="-1">反复出现的问题变成规则 <a class="header-anchor" href="#反复出现的问题变成规则" aria-label="Permalink to &quot;反复出现的问题变成规则&quot;">​</a></h2><p>完成报告把这次评审、质量门、缺陷中&quot;一条项目规则就能挡住&quot;的问题写进功能目录的 <code>lessons.tsv</code>(类别、问题、出处、建议的规则、放在哪一层)。同一个类别在两个以上的需求里出现时,<code>req digest</code> 的需求总览会列在&quot;反复出现的问题&quot;中,<code>/req-retro</code> 会建议把它变成 lint 规则、类型约束、测试或项目说明里的一行,批准后落地。已经处理的类别写进 <code>.requirement-pipeline/lessons-handled.txt</code>(一行一个),总览不再提示。</p><h2 id="质量门-流水线自己运行的检查" tabindex="-1">质量门:流水线自己运行的检查 <a class="header-anchor" href="#质量门-流水线自己运行的检查" aria-label="Permalink to &quot;质量门:流水线自己运行的检查&quot;">​</a></h2><p>项目配置 <code>.requirement-pipeline.json</code> 的 <code>checks</code> 列出流水线<strong>自己运行</strong>的检查,通常由 <code>/req-setup</code> 从实际跑通的命令写入:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
26
+ <div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-ab19afbb><!--]--><span data-v-9f43907a>req-kit</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="搜索文档"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">搜索文档</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/guide/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>指南</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/reference/commands" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>参考</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/changelog" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>更新记录</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bfe7971f><span class="text" data-v-bfe7971f><!----><span data-v-bfe7971f>v1.14.0</span><span class="vpi-chevron-down text-icon" data-v-bfe7971f></span></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/changelog" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>更新记录</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link vp-external-link-icon" href="https://github.com/yiyisf/paseo-req-kit/releases" target="_blank" rel="noreferrer" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>GitHub Releases</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/reference/scope" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>范围与取舍</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/yiyisf/paseo-req-kit" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>外观</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/yiyisf/paseo-req-kit" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>目录</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>回到顶部</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>开始</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>req-kit 是什么</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/getting-started" data-v-0009425e><!--[--><p class="text" data-v-0009425e>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/how-it-works" data-v-0009425e><!--[--><p class="text" data-v-0009425e>工作原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>使用</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/user" data-v-0009425e><!--[--><p class="text" data-v-0009425e>使用者指南</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/phases" data-v-0009425e><!--[--><p class="text" data-v-0009425e>分阶段执行与提测</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 has-active" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>安装与维护</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/install" data-v-0009425e><!--[--><p class="text" data-v-0009425e>安装与升级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/project" data-v-0009425e><!--[--><p class="text" data-v-0009425e>项目定制与运行规则</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/maintainer" data-v-0009425e><!--[--><p class="text" data-v-0009425e>维护者指南</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>本页内容</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _guide_project external-link-icon-enabled" data-v-e6f2a212><div><div><h1 id="项目定制与运行规则" tabindex="-1">项目定制与运行规则 <a class="header-anchor" href="#项目定制与运行规则" aria-label="Permalink to &quot;项目定制与运行规则&quot;">​</a></h1><h2 id="每个需求一个-worktree-工作区" tabindex="-1">每个需求一个 worktree 工作区 <a class="header-anchor" href="#每个需求一个-worktree-工作区" aria-label="Permalink to &quot;每个需求一个 worktree 工作区&quot;">​</a></h2><p>在 Paseo 中为每个需求新建工作区:<strong>New workspace</strong> → 选择项目 → <strong>Isolation</strong> 选 <strong>New worktree</strong> → 起点选主分支,然后在这个工作区的对话里输入 <code>/req</code>。</p><ul><li>流水线在这个工作区自己的目录和分支上运行、提交,不影响项目主目录。</li><li>同一个目录一次只能运行一条流水线;用了 worktree,几个需求可以同时进行。</li><li>在主目录发起时,<code>/req</code> 会先建议改用 worktree;使用者坚持的话,它会新建 <code>feature/&lt;功能目录名&gt;</code> 分支再继续。</li></ul><p><strong>分支规则</strong>:流水线把启动时检出的分支作为本次需求的工作分支,所有步骤都提交到这里,不切换、不新建分支。它拒绝在默认分支(<code>main</code>、<code>master</code> 或 <code>origin/HEAD</code> 指向的分支)或 detached HEAD 上启动;续跑时分支变了也会拒绝。</p><h2 id="档位" tabindex="-1">档位 <a class="header-anchor" href="#档位" aria-label="Permalink to &quot;档位&quot;">​</a></h2><table tabindex="0"><thead><tr><th>档位</th><th>适用</th><th>访谈</th><th>流程</th></tr></thead><tbody><tr><td>快速(<code>quick</code>)</td><td>小改动:文案、样式、配置项、字段显示等,不涉及数据结构、权限、对外接口</td><td>只问要改什么、改成什么样、不改什么、验收标准</td><td>审核、评审、缺陷修复各一轮;不做服务启动验证;产物从简</td></tr><tr><td>标准(<code>standard</code>)</td><td>其他情况</td><td>完整访谈</td><td>审核最多 2 轮、评审最多 3 轮、缺陷修复最多 3 轮</td></tr></tbody></table><p><code>/req</code> 会根据需求推荐档位,用户确认后写进 spec(<code>- 档位:快速</code>)。流水线按以下顺序决定档位:<code>--profile</code> 参数 → 续跑时沿用上次的档位 → spec 中的档位 → 配置中的 <code>defaultProfile</code>。各档的轮数和是否做服务启动验证可以在配置的 <code>profiles</code> 中调整。</p><h2 id="需求类型" tabindex="-1">需求类型 <a class="header-anchor" href="#需求类型" aria-label="Permalink to &quot;需求类型&quot;">​</a></h2><p>spec 头部的 <code>- 类型:</code> 决定流水线走哪种做法(1.8 起)。缺陷、重构、评估有自己的做法,新需求和小改动走通常的流程:</p><table tabindex="0"><thead><tr><th>类型</th><th>做法</th><th>关键证据</th></tr></thead><tbody><tr><td>缺陷(<code>缺陷</code>、<code>bug</code>)</td><td>方案设计改为&quot;复现与定位&quot;:先提交一个修复前失败的复现测试或脚本,写 <code>diagnosis.md</code>(根因、影响面);复现不了就暂停,把需要补充的信息发回对话。修复要让复现转绿,评审实际确认它修复前失败</td><td>同一个复现,修复前失败、修复后通过</td></tr><tr><td>重构(<code>重构</code>、<code>技术改进</code>)</td><td>先补特征测试锁住现有行为并单独提交,再小步改动、每步全绿;评审的首要问题是&quot;行为有没有变&quot;</td><td>重构前后同一组测试一致</td></tr><tr><td>评估(<code>评估</code>、<code>调研</code>)</td><td>只读:调研评估(<code>assessment.md</code>)→ 评估审阅 ⇄ 修订 → 评估报告;没有实现、评审、提测和验证,执行方式按连续</td><td>引用的代码位置和实际运行的命令</td></tr></tbody></table><p>各类型的做法写在 <code>engine/prompts/types/&lt;类型&gt;.md</code>,按步骤分节,接在每一步的任务之后;可以用 <code>prompts.local/types/</code> 覆盖。不想用某个类型的做法时,从配置 <code>requirementTypes</code>(默认 <code>[&quot;defect&quot;, &quot;refactor&quot;, &quot;assessment&quot;]</code>)中去掉它,这个类型就按新需求处理。设计决定见 ADR 0023。</p><h2 id="方案确认点-开工前请需求方确认-做完后会看到什么" tabindex="-1">方案确认点:开工前请需求方确认&quot;做完后会看到什么&quot; <a class="header-anchor" href="#方案确认点-开工前请需求方确认-做完后会看到什么" aria-label="Permalink to &quot;方案确认点:开工前请需求方确认&quot;做完后会看到什么&quot;&quot;">​</a></h2><p>方案审核通过后、写代码之前,流水线可以停下来请需求方确认(1.8 起)。方案设计写 <code>preview.md</code>(按操作顺序描述做完后会看到什么、需要确认的假设、不会变的地方),界面改动还在 <code>prototype/</code> 中画出静态的原型页面。对话里的 AI 把要点讲给需求方:确认后执行 <code>--approve</code>(终端里 <code>req approve &lt;需求&gt;</code>)开始写代码;要改的,更新需求说明后 <code>--resume</code>,方案调整后再确认一次。需求方确认过的预览和原型,实现和功能验证都以它为准:界面与原型不一致按缺陷处理。</p><table tabindex="0"><thead><tr><th>配置</th><th>默认</th><th>说明</th></tr></thead><tbody><tr><td><code>designApproval.mode</code></td><td><code>ui</code></td><td><code>ui</code>:方案判断这次是界面改动(结果文件 <code>ui_change</code>)时才停;<code>always</code>:每次都停;<code>off</code>:不停</td></tr><tr><td><code>designApproval.profiles</code></td><td><code>[&quot;standard&quot;]</code></td><td>哪些档位使用;快速档默认不停</td></tr><tr><td><code>designApproval.autoContinueHours</code></td><td>0</td><td>大于 0 时,等了这么久还没确认就按方案继续(通过对话执行);0 表示一直等待。等待超过 <code>waitingReminderHours</code> 会提醒一次</td></tr></tbody></table><p>等待确认时进度显示&quot;等待需求方确认方案&quot;,需求总览归入&quot;需要处理&quot;,外部通知收到 <code>approval</code> 事件。评估类需求不写代码,不经过确认点。</p><p><strong>原型审查页(1.13 起)。</strong> 有 <code>prototype/</code> 的需求,插件的需求页面和&quot;等你处理&quot;里有&quot;审查原型&quot;按钮(等待确认方案时是最醒目的&quot;审查原型并确认方案&quot;),审查页嵌在 Paseo 的网页端和桌面端里打开,手机上在浏览器中打开;终端里是 <code>req review &lt;需求&gt;</code>。需求方在原型上点选要改的地方(页面记下元素、文字、颜色、大小和位置)、双击直接改文字,切换状态和电脑、手机宽度,然后提交:意见整理成带位置信息的清单转给需求会话(与插件中写修改意见的效果相同),或者直接确认方案。草稿和提交记录在功能目录的 <code>.pipeline/review/</code> 中,每一版原型也存在那里,原型改过后页面会标出这一版改了哪里。</p><p>为了让审查页能用,方案设计按约定写原型:每个改动区域标 <code>data-ac</code>(对应的 AC)和 <code>data-label</code>(用需求方的话说是什么),各种状态包在 <code>&lt;section data-state=&quot;状态名&quot;&gt;</code> 中,按钮、标题、字段名写最终的文字。原型里的脚本不会运行。</p><p>审查页由一个本机服务提供:用到时在后台启动,空闲 4 小时后自己退出,只监听 <code>127.0.0.1</code>,地址中带随机令牌(插件设为只读时给只读的地址)。审查页允许被本机地址上的页面(Paseo 网页端)嵌入;要限定或放开,设 <code>REQ_KIT_REVIEW_FRAME_ANCESTORS</code>(CSP <code>frame-ancestors</code> 的值)。需求方在别的电脑上用浏览器访问 Paseo 网页端时,在运行 Paseo daemon 的机器上设置环境变量 <code>REQ_KIT_REVIEW_HOST</code>(例如 <code>0.0.0.0</code>)、<code>REQ_KIT_REVIEW_PUBLIC_URL</code>(别人访问这台机器用的地址,例如 <code>http://10.1.2.3:6781</code>),需要时用 <code>REQ_KIT_REVIEW_PORT</code> 换端口(默认 6781),然后重启 Paseo daemon 让插件拿到新的环境变量(只设 <code>REQ_KIT_REVIEW_HOST</code> 时,地址用这台电脑的计算机名)。没有设置时从别的电脑打开 Paseo 网页、点&quot;审查原型&quot;,页面会说明为什么打不开、该怎么设置(1.13)。</p><h2 id="代码评审分两个方向" tabindex="-1">代码评审分两个方向 <a class="header-anchor" href="#代码评审分两个方向" aria-label="Permalink to &quot;代码评审分两个方向&quot;">​</a></h2><p>标准档第一轮代码评审由两位评审者同时进行(1.8 起),各自写意见,再由 reviewer 核实、汇总成一份结论:</p><ul><li><strong>规格评审</strong>:每条验收标准是否真的实现并有测试、测试的期望值是否与验收标准的例子一致、有没有做需求之外的事、与确认过的预览是否一致。</li><li><strong>规范评审</strong>:项目惯例和范例文件、术语表中的代码名称、测试质量、安全与数据、简单性,以及可以变成规则的问题。</li></ul><p>两位都用配置的 reviewer agent,相当于多两次评审的用量;之后的轮次只核对修复,仍由一位评审。<code>reviewAxes.enabled</code> 设为 <code>false</code> 关闭,<code>reviewAxes.profiles</code> 选择档位(默认只有标准档)。配置了评审小组(<code>reviewPanel</code>)时,以评审小组为准。</p><h2 id="验收测试先提交" tabindex="-1">验收测试先提交 <a class="header-anchor" href="#验收测试先提交" aria-label="Permalink to &quot;验收测试先提交&quot;">​</a></h2><p>方案判断适合测试先行时,代码实现先把从验收标准的例子写出的测试单独提交一次(这时它们是失败的),在结果文件中写明这些测试文件和那次提交。代码评审前,流水线核对它们之后有没有被改过,被改过的交给评审逐个确认有没有依据:为了让测试通过而放宽断言的,按阻塞提出。</p><h2 id="术语表和范例文件" tabindex="-1">术语表和范例文件 <a class="header-anchor" href="#术语表和范例文件" aria-label="Permalink to &quot;术语表和范例文件&quot;">​</a></h2><ul><li><strong><code>GLOSSARY.md</code></strong>(仓库根目录):业务词、含义、代码中的名字。<code>/req-setup</code> 第一次整理,访谈遇到新词时补充,方案设计为新概念补上代码中的名字;各步骤按它命名,规范评审检查是否一致。</li><li><strong>范例文件</strong>:<code>/req-setup</code> 在 <code>project-notes.md</code> 中列出各类代码(接口、页面、测试、迁移脚本)写得最好的文件。方案的每个任务写明参照哪个文件,实现照它的结构、命名、错误处理和测试写法来。</li></ul><h2 id="反复出现的问题变成规则" tabindex="-1">反复出现的问题变成规则 <a class="header-anchor" href="#反复出现的问题变成规则" aria-label="Permalink to &quot;反复出现的问题变成规则&quot;">​</a></h2><p>完成报告把这次评审、质量门、缺陷中&quot;一条项目规则就能挡住&quot;的问题写进功能目录的 <code>lessons.tsv</code>(类别、问题、出处、建议的规则、放在哪一层)。同一个类别在两个以上的需求里出现时,<code>req digest</code> 的需求总览会列在&quot;反复出现的问题&quot;中,<code>/req-retro</code> 会建议把它变成 lint 规则、类型约束、测试或项目说明里的一行,批准后落地。已经处理的类别写进 <code>.requirement-pipeline/lessons-handled.txt</code>(一行一个),总览不再提示。</p><h2 id="质量门-流水线自己运行的检查" tabindex="-1">质量门:流水线自己运行的检查 <a class="header-anchor" href="#质量门-流水线自己运行的检查" aria-label="Permalink to &quot;质量门:流水线自己运行的检查&quot;">​</a></h2><p>项目配置 <code>.requirement-pipeline.json</code> 的 <code>checks</code> 列出流水线<strong>自己运行</strong>的检查,通常由 <code>/req-setup</code> 从实际跑通的命令写入:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
27
27
  <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;checks&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
28
28
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;lint&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;command&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;npm run lint&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
29
29
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;web 测试&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;command&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;npm test&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;cwd&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;web&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
@@ -100,7 +100,7 @@
100
100
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;可维护性&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;provider&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;opencode/anthropic/&lt;模型 ID&gt;&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;modeId&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;build&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;featureValues&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;auto_accept&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } }</span></span>
101
101
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
102
102
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><ul><li>成员并行运行,在同一个目录里只读代码、写各自的意见文件(<code>&lt;功能目录&gt;/review-panel/</code>),不提交,不改文件。</li><li>某位成员失败时,只汇总完成的成员;全部失败时该步骤失败。</li><li>成本:每次启用的评审多出 N 个 agent 的用量,所以默认只用于标准档的第一轮。</li><li>成员的模型和模式会在 <code>/req-doctor</code> 中一并检查。</li></ul><h2 id="需求总览、决策记录、变更与验收记录" tabindex="-1">需求总览、决策记录、变更与验收记录 <a class="header-anchor" href="#需求总览、决策记录、变更与验收记录" aria-label="Permalink to &quot;需求总览、决策记录、变更与验收记录&quot;">​</a></h2><ul><li><strong>需求总览</strong>:<code>node &lt;req-kit&gt;/bin/start-pipeline.mjs --list</code> 列出这个仓库所有 worktree 中的需求和各自的阶段(对齐中、开发中、待验收、已验收等)。总览现场生成,不提交到仓库,避免各分支合并时冲突。</li><li><strong>决策记录</strong> <code>decisions.tsv</code>:各步骤把不显而易见的选择(假设、取舍、偏离方案、驳回的评审意见、决定不修的问题)各记一行。会影响结果的标为 <code>needs_human=yes</code>,完成报告把它们列入&quot;需要你确认的决定&quot;。</li><li><strong>变更记录</strong> <code>changes.md</code>:每次修改需求(包括方案审核提出问题、验收发现问题)记一节,spec 头部的&quot;版本&quot;随之加 1。</li><li><strong>验收记录</strong> <code>acceptance.md</code>:由 <code>/req</code> 的验收手册写,逐条记录验收结果和结论。</li></ul><p>格式见 <code>contracts/feature-files.md</code>。</p><h2 id="运行规则" tabindex="-1">运行规则 <a class="header-anchor" href="#运行规则" aria-label="Permalink to &quot;运行规则&quot;">​</a></h2><p><strong>步骤和轮数</strong>(轮数按档位,在配置的 <code>profiles</code> 中调整;下面是标准档的默认值):</p><table tabindex="0"><thead><tr><th>环节</th><th>规则</th></tr></thead><tbody><tr><td>评审小组(可选)</td><td>开启时,标准档的方案审核和代码评审第一轮先由小组成员并行评审,再由评审者核实汇总</td></tr><tr><td>方案审核 ⇄ 方案修订</td><td>最多 2 轮审核。判定&quot;阻塞&quot;时暂停并请需求方决定;最后一轮仍要求修改时,修订后直接进入实现</td></tr><tr><td>代码评审 ⇄ 评审问题修复</td><td>最多 3 轮评审,通过即止;轮数用完时修复后进入下一阶段</td></tr><tr><td>提测说明</td><td>代码评审之后执行,写 <code>handoff.md</code>。分阶段执行时研发阶段到此结束</td></tr><tr><td>服务启动验证</td><td>方案设计判断项目有常驻服务、且档位开启了 <code>serviceStart</code> 时才执行(在已部署的测试环境中验证时不执行)</td></tr><tr><td>缺陷修复 ⇄ 复验</td><td>功能验证发现缺陷时执行,最多 3 轮,复验通过即止(<code>phases.verify.defects</code> 为 <code>handback</code> 或 <code>report</code> 时见上文&quot;执行方式&quot;)</td></tr><tr><td>完成报告</td><td>只要没有暂停或中断就一定执行,遗留问题写进报告</td></tr><tr><td>完成后继续</td><td>完成后 spec.md 被修改过(需求变更、验收发现问题),<code>--resume</code> 从方案设计开始,各步骤在已有方案和代码的基础上只处理变化的部分;没改过则拒绝。<code>--restart</code> 则完全从零开始</td></tr><tr><td>增量继续</td><td>需求变更、回答了方案审核的问题后继续时:方案在原文末尾追加&quot;第 N 次尝试&quot;一节;实现只改需要改的;代码评审只看本次开始以来的改动;验证重新验证变化涉及的验收标准,其余的至少跑一遍现有测试;报告说明是第几次。做法写在 <code>engine/prompts/incremental.md</code>,可以用 <code>prompts.local/</code> 替换</td></tr></tbody></table><p><strong>结果文件</strong>:每步必须写一个 JSON 结果文件,流水线只看它,不看 agent 的回复文字。文件缺失或格式不对时,会在同一个会话里提醒 agent 补写,最多 2 次,仍不对则判定该步骤失败。</p><p><strong>等待与超时</strong>:每步有总时限(<code>stepTimeoutMinutes</code>)。到时 agent 还在做时,先再给它同样长的时间(<code>selfHeal</code>,见下);仍未完成才判定失败,但不停止 agent。继续(<code>--resume</code>、自动重试)时先看这一步上一次的 agent:已经做完、结果文件有效就直接用它的结果;还在做就接着等它一轮(这一轮不再额外延长);第二次仍超时才停止它、另起一个 agent。需求改过、开始了新一次尝试时,上一次留下的 agent 直接停掉,不接手(1.12.1)。同一步不会有两个 agent 同时在做(它们会改同样的文件、在同一个工作区提交、写同一个结果文件)。连续读不到 agent 状态时同样处理。等待被拆成每段 10 分钟(打开 <code>scanGuard</code> 时每段 1 分钟、打开 <code>dangerGuard</code> 时每段 15 秒,以便查看正在运行的命令;只是读取状态,不占模型 token),连接断开时自动重试。agent 等待权限批准时,同一个请求只通知一次,然后继续等待。</p><p><strong>临时错误自动重试</strong>:步骤因限流(429)、服务暂时不可用(502/503/504/529、overloaded)、网络中断等临时错误失败时,等待后用新的 agent 重做这一步,并告诉它工作区里可能留有上一次没做完的改动。默认最多重试 2 次,分别等 1 分钟和 5 分钟:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;retry&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;attempts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;backoffSeconds&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">60</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">300</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] }</span></span></code></pre></div><p><code>attempts</code> 设为 0 关闭;<code>backoffSeconds</code> 的个数少于重试次数时,后面的重试使用最后一个值。超时、结果文件不合格、agent 自己判定失败等不是临时错误,不按这里重试。重试用完仍失败时,中断通知会注明已重试的次数。</p><p><strong>自愈</strong>(1.12,<code>selfHeal</code>,默认 <code>true</code>):能安全自动处理的中断不再等人。</p><table tabindex="0"><thead><tr><th>情况</th><th>自动处理</th></tr></thead><tbody><tr><td>步骤超时,agent 还在做</td><td>不打断它,再等同样长的时间;仍未完成才中断</td></tr><tr><td>agent 报错(不是临时错误)</td><td>新开一个 agent 重做这一步一次;配置了备用模型时用备用模型</td></tr><tr><td>提醒后仍没有有效的结果文件</td><td>新开一个 agent 重做这一步一次</td></tr><tr><td>限流、额度用完,重试用完</td><td>配置了备用模型时,用备用模型再做一次;仍不行就中断,并按 Paseo 显示的额度恢复时间预约自动继续(恢复后 5 分钟;没有恢复时间时按 <code>autoResumeMinutes</code>)</td></tr><tr><td>方案审核说需要需求方决定</td><td>先请 builder 从代码、文档和需求说明中找答案(<code>answerQuestionsFirst</code>,默认 <code>true</code>),只把真正的业务取舍连同推荐答案交给需求方;都能回答时不停下。最后一轮审核的问题被自答时,再加一轮审核复核这些答案(1.12.1)</td></tr></tbody></table><p><strong>备用模型</strong>(1.12,可选):<code>agents.fallback</code>,写法同 builder、reviewer,可以用 <code>paseoProfile</code>。<code>req configure</code> 和插件的&quot;模型&quot;设置页会推荐一个与主模型不同厂商的模型。</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;agents&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;builder&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;">…</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;reviewer&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;">…</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;fallback&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;provider&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;opencode/&lt;模型 ID&gt;&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } }</span></span></code></pre></div><p>自动处理的每一次都记在进度日志、状态文件的 <code>recoveries</code> 和使用记录中,<code>req stats</code> 的&quot;人工介入&quot;一节汇总:停下等人的原因、自动处理了多少次、到达提测的需求中没有非必要介入的比例。</p><p><strong>打断大目录搜索</strong>(1.13,<code>scanGuard</code>,默认开):步骤 agent 有时为了找一个类或一个包,去搜索整个磁盘、用户目录、Maven 本地仓库(<code>~/.m2</code>)、Gradle 缓存、全局 <code>node_modules</code> 或整个 <code>node_modules</code>,一次就是几十分钟,这一步迟迟做不完。步骤运行时,流水线大约每分钟看一次 agent 正在运行的命令:搜索这类大目录的命令运行超过 1 分钟、或者任何搜索命令运行超过 <code>minutes</code> 分钟,就打断它,并告诉 agent 改用什么办法(在仓库里用 <code>git grep</code>;按 <code>pom.xml</code> 里的坐标直接打开那一个依赖目录、用 <code>unzip -l</code> 看那一个 jar;<code>mvn dependency:tree</code>;找不到就写进&quot;假设&quot;继续)。构建和测试命令(<code>mvn</code>、<code>gradle</code>、<code>npm test</code> 等)不打断;只搜具体的子目录(如 <code>~/.m2/repository/com/acme/foo</code>)或排除了 <code>node_modules</code> 的搜索也不算。同一个命令只打断一次,每轮最多打断 5 次;每次都记在进度日志和 <code>recoveries</code>(<code>stop_scan</code>)中。各步骤的提示词里也写明了只在仓库里搜索。</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;scanGuard&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;enabled&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;minutes&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;paths&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;D:/share&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] }</span></span></code></pre></div><p><code>paths</code>:另外不允许整个搜索的目录(例如共享盘);<code>enabled: false</code> 关闭。</p><p><strong>拦截危险命令</strong>(1.14,<code>dangerGuard</code>,默认开):步骤 agent 通常以免确认模式运行命令,&quot;只做本地提交、不碰生产&quot;以前只写在提示词里。现在步骤运行时,流水线每 15 秒看一次 agent 运行过和正在运行的命令(读 Paseo 的记录,不用模型)。下面这些会被处理:推送(<code>git push</code>,强推、删除远程分支单独标出)、改远程地址;发布制品(<code>npm publish</code>、<code>mvn deploy</code>、<code>gradle publish</code>、<code>docker push</code> 等);改动集群和基础设施(<code>kubectl apply/delete/exec…</code>、<code>helm install/upgrade…</code>、<code>terraform apply/destroy</code>、<code>ansible-playbook</code>);连接其他机器上的数据库(<code>mysql -h &lt;带点的主机名或地址&gt;</code> 等,<code>localhost</code> 和 docker compose 里的服务名如 <code>db</code> 不算);登录或复制到其他机器(<code>ssh</code>、<code>scp</code>、<code>rsync</code>,<code>git@</code> 不算);删除仓库以外的目录(<code>rm -rf ~</code>、<code>/</code>、<code>..</code>、仓库外的绝对路径,临时目录除外);下载脚本直接执行(<code>curl … | sh</code>);关机、格式化等系统级操作;以及命令里出现 <code>production</code> 中任何一项(生产环境的主机名、地址、库名)。还在运行的命令立即打断,告诉 agent 不要再做、把需要人做的写进产物;已经运行完的也会告诉它。每次都通知需求的对话(和外部通知的 <code>alert</code> 事件,<code>details.kind</code> 为 <code>danger</code>),记在状态文件的 <code>dangers</code> 里,并写进完成报告。这是按命令文字的检查,能拦住常见的情况,不是沙箱。</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;dangerGuard&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;enabled&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;production&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;prod.example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;10.8.0.&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">], </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;allow&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;^ssh test-box&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] }</span></span></code></pre></div><p><code>production</code>:生产环境的标记(出现在命令或访问的地址里就拦),建议团队配置里写上;<code>allow</code>:放行的命令(正则表达式),例如测试机的登录;<code>enabled: false</code> 关闭。</p><p><strong>密钥扫描</strong>(1.14,<code>secretScan</code>,默认开):每个改代码的步骤之后(和质量门一起),流水线检查本需求新增的内容:从这次尝试开始时的提交以来,每次提交加进来的行、还没提交的改动和新文件。常见格式的密钥(私钥、AWS、GitHub、GitLab、Slack、模型服务的 API 密钥、JWT、地址里带的口令)在任何文件里都算;<code>password = &quot;…&quot;</code>、<code>token: …</code> 这样的赋值只在代码和配置里算,测试和文档不算,值是占位符(<code>${…}</code>、<code>&lt;your-token&gt;</code>、<code>changeme</code>)或从环境变量读取的也不算。发现了就交回这一步的 agent:改成从配置或环境变量读取;已经写进本需求提交的,用 <code>git commit --fixup</code> 和非交互的 <code>git rebase --autosquash</code> 从这些还没推送的提交里去掉;确实不是密钥的,在那一行加注释 <code>req-kit:allow-secret</code>。最多要求 <code>qualityGate.fixAttempts</code> 次,仍有的通知需求的对话、写进代码评审和完成报告;配置了 <code>push</code> 的需求<strong>不会推送</strong>有疑似密钥的分支。</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;secretScan&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;enabled&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;allow&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;test/fixtures/**&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] }</span></span></code></pre></div><p><code>allow</code>:不扫描的文件(路径或通配符);<code>enabled: false</code> 关闭。</p><p><strong>同一个目录一次只运行一条流水线</strong>,因为各步骤都在这个目录中修改和提交。需要并行时,为每个需求使用单独的 worktree 工作区。</p><h2 id="注意事项" tabindex="-1">注意事项 <a class="header-anchor" href="#注意事项" aria-label="Permalink to &quot;注意事项&quot;">​</a></h2><ul><li><strong>发起流水线的聊天 agent 需要能访问本机网络。</strong> 流水线进程继承它的运行环境,需要连接 <code>ws://127.0.0.1:6767</code>。用 Codex 做聊天 agent 时,请使用 <code>full-access</code> 模式;沙箱模式可能禁止网络。</li><li><strong>必须在仓库对应的项目对话中发起,对话过程中不要切换工作目录。</strong> 步骤 agent 一律作为子 agent 挂在发起的对话下,而 Paseo 会让子 agent 使用父 agent 的工作目录,所以仓库目录必须就是这个对话的工作目录。在对话中启动时,<code>--repo</code> 默认就取对话的工作目录;两者不一致、或发起的对话已不存在时,流水线拒绝启动并说明原因。</li><li><strong>步骤 agent 以免确认模式运行</strong>,在本机拥有执行命令的权限。提示词禁止了危险操作,但这不是安全边界。请让仓库目录中不包含生产环境凭据。</li><li><strong>聊天被归档时</strong>,挂在它下面的步骤 agent 也会被归档;通知会发送失败,但流水线会继续运行到结束,结果仍可在 <code>report.md</code> 和日志中查看。</li><li><strong>daemon 重启</strong>会中断正在运行的步骤 agent。流水线会在连续 5 次无法获取状态后判定该步骤失败,之后可以用 <code>--resume</code> 继续。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/guide/项目定制与运行规则.md">docs/guide/项目定制与运行规则.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/guide/项目定制与运行规则.md">在 GitHub 上编辑</a></p></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/guide/install" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>上一页</span><span class="title" data-v-1bcd8184>安装与升级</span><!--]--></a></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/guide/maintainer" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>下一页</span><span class="title" data-v-1bcd8184>维护者指南</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>以 MIT 许可发布。req-kit 是运行在 Paseo 上的社区项目。</p><p class="copyright" data-v-566314d4>Copyright © 2026 yiyisf</p></div></footer><!--[--><!--]--></div></div>
103
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"DiGi8kHU\",\"guide_getting-started.md\":\"UhkLCUoY\",\"guide_how-it-works.md\":\"D-kQsF1t\",\"guide_index.md\":\"CLnGCmGW\",\"guide_install.md\":\"DkCyZsOU\",\"guide_maintainer.md\":\"C1v7EpSY\",\"guide_phases.md\":\"BpGAb1re\",\"guide_project.md\":\"DIjDRoAq\",\"guide_user.md\":\"UV0WxdJa\",\"index.md\":\"Cf_sSf_f\",\"reference_adr_0001-step-agents-under-origin-chat.md\":\"RtRTq7oi\",\"reference_adr_0002-no-directory-switch-in-chat.md\":\"BxtN-Aa2\",\"reference_adr_0003-script-engine-not-hub.md\":\"66EgZtqx\",\"reference_adr_0004-result-files.md\":\"DbqcCozI\",\"reference_adr_0005-no-default-branch-local-commits-only.md\":\"CkImA4s6\",\"reference_adr_0006-skill-install-targets.md\":\"CwY8YepV\",\"reference_adr_0007-own-interview-skill.md\":\"CryhxRyG\",\"reference_adr_0008-entries-do-not-call-entries.md\":\"DsRWAgeA\",\"reference_adr_0009-versioned-install-layout.md\":\"CSg1VqlW\",\"reference_adr_0010-generated-feature-overview.md\":\"D8F3MK-h\",\"reference_adr_0011-resume-after-completion.md\":\"BCrZrKjf\",\"reference_adr_0012-review-panel.md\":\"k9rrHFFc\",\"reference_adr_0013-no-release-tooling.md\":\"BQeJ8dEI\",\"reference_adr_0014-notifier-slot.md\":\"C23QR1xO\",\"reference_adr_0015-incremental-continue.md\":\"Buy7wwO8\",\"reference_adr_0016-upgrade-from-tags.md\":\"qfIW-tqJ\",\"reference_adr_0017-use-paseo-capabilities.md\":\"CjcGli87\",\"reference_adr_0018-own-worktree-option.md\":\"fVDpgGSE\",\"reference_adr_0019-parallel-orchestration.md\":\"DrfrV0To\",\"reference_adr_0020-scheduling-through-the-chat.md\":\"BqSemGFG\",\"reference_adr_0021-npm-version-manager.md\":\"CU3PG6y5\",\"reference_adr_0022-develop-and-verify-phases.md\":\"C6fQDLq4\",\"reference_adr_0023-types-gate-slices.md\":\"D2E6yyYQ\",\"reference_adr_0024-confirm-early-review-axes.md\":\"FmK_ke0x\",\"reference_adr_0025-joint-requirements.md\":\"ChoKvMUx\",\"reference_adr_0026-machine-records-and-api.md\":\"veybjBPq\",\"reference_adr_0027-paseo-plugin.md\":\"BMX33ZNU\",\"reference_adr_0028-external-integrations.md\":\"DtdMe8RK\",\"reference_adr_0029-requirements-from-cards.md\":\"BHd1SQPe\",\"reference_adr_0030-card-intake-process.md\":\"kLc-DG9_\",\"reference_adr_0031-fewer-interventions.md\":\"BDnQcz8g\",\"reference_adr_0032-npm-only-install.md\":\"C-3L1FkX\",\"reference_adr_0033-prototype-review-and-ui-check.md\":\"hFcQzmaa\",\"reference_adr_index.md\":\"BYF-Ofor\",\"reference_commands.md\":\"ClKbS-t8\",\"reference_config.md\":\"CRe27LaA\",\"reference_contracts_cli-json.md\":\"CCvKLasM\",\"reference_contracts_feature-files.md\":\"DSiA8OEH\",\"reference_contracts_index.md\":\"Bkznz4px\",\"reference_contracts_notifier-event.md\":\"B9WqeZdO\",\"reference_contracts_result-file.md\":\"DmR4fjB-\",\"reference_contracts_spec.md\":\"Dh5XczZL\",\"reference_contracts_state.md\":\"STlqkPPS\",\"reference_contracts_usage-record.md\":\"MjVps4CA\",\"reference_contracts_verify.md\":\"CbA88u6S\",\"reference_scope.md\":\"Kzqw8U_f\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"req-kit\",\"titleTemplate\":\":title · req-kit\",\"description\":\"在 Paseo 中用对话对齐需求,由一组 AI agent 在后台完成设计、实现、评审和验证。给测试、产品、项目经理用的需求开发体系。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.svg\",\"siteTitle\":\"req-kit\",\"nav\":[{\"text\":\"指南\",\"link\":\"/guide/\",\"activeMatch\":\"^/guide/\"},{\"text\":\"参考\",\"link\":\"/reference/commands\",\"activeMatch\":\"^/reference/\"},{\"text\":\"更新记录\",\"link\":\"/changelog\"},{\"text\":\"v1.14.0-beta.5\",\"items\":[{\"text\":\"更新记录\",\"link\":\"/changelog\"},{\"text\":\"GitHub Releases\",\"link\":\"https://github.com/yiyisf/paseo-req-kit/releases\"},{\"text\":\"范围与取舍\",\"link\":\"/reference/scope\"}]}],\"sidebar\":{\"/guide/\":[{\"text\":\"开始\",\"items\":[{\"text\":\"req-kit 是什么\",\"link\":\"/guide/\"},{\"text\":\"快速开始\",\"link\":\"/guide/getting-started\"},{\"text\":\"工作原理\",\"link\":\"/guide/how-it-works\"}]},{\"text\":\"使用\",\"items\":[{\"text\":\"使用者指南\",\"link\":\"/guide/user\"},{\"text\":\"分阶段执行与提测\",\"link\":\"/guide/phases\"}]},{\"text\":\"安装与维护\",\"items\":[{\"text\":\"安装与升级\",\"link\":\"/guide/install\"},{\"text\":\"项目定制与运行规则\",\"link\":\"/guide/project\"},{\"text\":\"维护者指南\",\"link\":\"/guide/maintainer\"}]}],\"/reference/\":[{\"text\":\"参考\",\"items\":[{\"text\":\"命令\",\"link\":\"/reference/commands\"},{\"text\":\"配置项\",\"link\":\"/reference/config\"},{\"text\":\"范围与取舍\",\"link\":\"/reference/scope\"}]},{\"text\":\"文件格式约定\",\"collapsed\":false,\"items\":[{\"text\":\"总览\",\"link\":\"/reference/contracts/\"},{\"text\":\"需求说明 spec.md\",\"link\":\"/reference/contracts/spec\"},{\"text\":\"状态文件 state.json\",\"link\":\"/reference/contracts/state\"},{\"text\":\"结果文件\",\"link\":\"/reference/contracts/result-file\"},{\"text\":\"功能目录中的文件\",\"link\":\"/reference/contracts/feature-files\"},{\"text\":\"验证方法 verify.md\",\"link\":\"/reference/contracts/verify\"},{\"text\":\"外部通知事件\",\"link\":\"/reference/contracts/notifier-event\"},{\"text\":\"req api 的 JSON 输出\",\"link\":\"/reference/contracts/cli-json\"},{\"text\":\"需求索引与使用记录\",\"link\":\"/reference/contracts/usage-record\"}]},{\"text\":\"设计决定(ADR)\",\"collapsed\":true,\"items\":[{\"text\":\"总览\",\"link\":\"/reference/adr/\"},{\"text\":\"0001 步骤 agent 挂在发起的对话下\",\"link\":\"/reference/adr/0001-step-agents-under-origin-chat\"},{\"text\":\"0002 对话过程中不切换工作目录\",\"link\":\"/reference/adr/0002-no-directory-switch-in-chat\"},{\"text\":\"0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流\",\"link\":\"/reference/adr/0003-script-engine-not-hub\"},{\"text\":\"0004 步骤结论只看结果文件\",\"link\":\"/reference/adr/0004-result-files\"},{\"text\":\"0005 不在默认分支上运行,只做本地提交\",\"link\":\"/reference/adr/0005-no-default-branch-local-commits-only\"},{\"text\":\"0006 只安装到 ~/.agents/skills 和 ~/.claude/skills\",\"link\":\"/reference/adr/0006-skill-install-targets\"},{\"text\":\"0007 自带需求访谈 skill,不依赖外部 skill 包\",\"link\":\"/reference/adr/0007-own-interview-skill\"},{\"text\":\"0008 入口 skill 之间不互相调用\",\"link\":\"/reference/adr/0008-entries-do-not-call-entries\"},{\"text\":\"0009 程序与本机配置分开存放,按版本目录并存\",\"link\":\"/reference/adr/0009-versioned-install-layout\"},{\"text\":\"0010 需求总览现场生成,不维护 INDEX.md\",\"link\":\"/reference/adr/0010-generated-feature-overview\"},{\"text\":\"0011 完成后修改 spec 可以继续开发\",\"link\":\"/reference/adr/0011-resume-after-completion\"},{\"text\":\"0012 评审小组:首轮并行评审,评审者核实汇总\",\"link\":\"/reference/adr/0012-review-panel\"},{\"text\":\"0013 发布不使用 changesets 等工具\",\"link\":\"/reference/adr/0013-no-release-tooling\"},{\"text\":\"0014 外部通知只留接口,不内置任何 IM\",\"link\":\"/reference/adr/0014-notifier-slot\"},{\"text\":\"0015 需求变更后增量继续,而不是从零重做\",\"link\":\"/reference/adr/0015-incremental-continue\"},{\"text\":\"0016 一键升级:从 git 标签下载到 versions/ 再切换\",\"link\":\"/reference/adr/0016-upgrade-from-tags\"},{\"text\":\"0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线\",\"link\":\"/reference/adr/0017-use-paseo-capabilities\"},{\"text\":\"0018 可选:流水线为需求新建 worktree 工作区\",\"link\":\"/reference/adr/0018-own-worktree-option\"},{\"text\":\"0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案\",\"link\":\"/reference/adr/0019-parallel-orchestration\"},{\"text\":\"0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行\",\"link\":\"/reference/adr/0020-scheduling-through-the-chat\"},{\"text\":\"0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下\",\"link\":\"/reference/adr/0021-npm-version-manager\"},{\"text\":\"0022 分阶段执行:研发阶段、闸口、测试验证阶段\",\"link\":\"/reference/adr/0022-develop-and-verify-phases\"},{\"text\":\"0023 需求类型、质量门、按切片实现\",\"link\":\"/reference/adr/0023-types-gate-slices\"},{\"text\":\"0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则\",\"link\":\"/reference/adr/0024-confirm-early-review-axes\"},{\"text\":\"0025 联合需求:一个需求同时改几个仓库\",\"link\":\"/reference/adr/0025-joint-requirements\"},{\"text\":\"0026 本机的需求索引、使用记录和 req api\",\"link\":\"/reference/adr/0026-machine-records-and-api\"},{\"text\":\"0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作\",\"link\":\"/reference/adr/0027-paseo-plugin\"},{\"text\":\"0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的\",\"link\":\"/reference/adr/0028-external-integrations\"},{\"text\":\"0029 从卡片开始的需求:需求会话代替人,卡片描述代替对话\",\"link\":\"/reference/adr/0029-requirements-from-cards\"},{\"text\":\"0030 接单器:共享机器上定时接卡片、转达回复\",\"link\":\"/reference/adr/0030-card-intake-process\"},{\"text\":\"0031 少等人:每种中断都有自动的下一步\",\"link\":\"/reference/adr/0031-fewer-interventions\"},{\"text\":\"0032 安装、升级和文档只依赖 npm 源\",\"link\":\"/reference/adr/0032-npm-only-install\"},{\"text\":\"0033 原型审查页和不靠看图的界面检查\",\"link\":\"/reference/adr/0033-prototype-review-and-ui-check\"}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/yiyisf/paseo-req-kit\"}],\"editLink\":{\"pattern\":\"https://github.com/yiyisf/paseo-req-kit/edit/main/site/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"footer\":{\"message\":\"以 MIT 许可发布。req-kit 是运行在 Paseo 上的社区项目。\",\"copyright\":\"Copyright © 2026 yiyisf\"},\"search\":{\"provider\":\"local\",\"options\":{\"translations\":{\"button\":{\"buttonText\":\"搜索文档\",\"buttonAriaLabel\":\"搜索文档\"},\"modal\":{\"noResultsText\":\"没有找到相关结果\",\"resetButtonTitle\":\"清除\",\"footer\":{\"selectText\":\"选择\",\"navigateText\":\"切换\",\"closeText\":\"关闭\"}}}}},\"outline\":{\"level\":[2,3],\"label\":\"本页内容\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"lastUpdated\":{\"text\":\"最后更新\"},\"returnToTopLabel\":\"回到顶部\",\"sidebarMenuLabel\":\"目录\",\"darkModeSwitchLabel\":\"外观\",\"lightModeSwitchTitle\":\"切换到浅色\",\"darkModeSwitchTitle\":\"切换到深色\",\"externalLinkIcon\":true,\"notFound\":{\"title\":\"页面不存在\",\"quote\":\"这个页面可能已经移动或删除。\",\"linkText\":\"回到首页\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
103
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"CIKYJXpF\",\"guide_getting-started.md\":\"CZM53rO_\",\"guide_how-it-works.md\":\"D-kQsF1t\",\"guide_index.md\":\"CLnGCmGW\",\"guide_install.md\":\"DkCyZsOU\",\"guide_maintainer.md\":\"C1v7EpSY\",\"guide_phases.md\":\"BpGAb1re\",\"guide_project.md\":\"DIjDRoAq\",\"guide_user.md\":\"UV0WxdJa\",\"index.md\":\"Cf_sSf_f\",\"reference_adr_0001-step-agents-under-origin-chat.md\":\"RtRTq7oi\",\"reference_adr_0002-no-directory-switch-in-chat.md\":\"BxtN-Aa2\",\"reference_adr_0003-script-engine-not-hub.md\":\"66EgZtqx\",\"reference_adr_0004-result-files.md\":\"DbqcCozI\",\"reference_adr_0005-no-default-branch-local-commits-only.md\":\"CkImA4s6\",\"reference_adr_0006-skill-install-targets.md\":\"CwY8YepV\",\"reference_adr_0007-own-interview-skill.md\":\"CryhxRyG\",\"reference_adr_0008-entries-do-not-call-entries.md\":\"DsRWAgeA\",\"reference_adr_0009-versioned-install-layout.md\":\"CSg1VqlW\",\"reference_adr_0010-generated-feature-overview.md\":\"D8F3MK-h\",\"reference_adr_0011-resume-after-completion.md\":\"BCrZrKjf\",\"reference_adr_0012-review-panel.md\":\"k9rrHFFc\",\"reference_adr_0013-no-release-tooling.md\":\"BQeJ8dEI\",\"reference_adr_0014-notifier-slot.md\":\"C23QR1xO\",\"reference_adr_0015-incremental-continue.md\":\"Buy7wwO8\",\"reference_adr_0016-upgrade-from-tags.md\":\"qfIW-tqJ\",\"reference_adr_0017-use-paseo-capabilities.md\":\"CjcGli87\",\"reference_adr_0018-own-worktree-option.md\":\"fVDpgGSE\",\"reference_adr_0019-parallel-orchestration.md\":\"DrfrV0To\",\"reference_adr_0020-scheduling-through-the-chat.md\":\"BqSemGFG\",\"reference_adr_0021-npm-version-manager.md\":\"CU3PG6y5\",\"reference_adr_0022-develop-and-verify-phases.md\":\"C6fQDLq4\",\"reference_adr_0023-types-gate-slices.md\":\"D2E6yyYQ\",\"reference_adr_0024-confirm-early-review-axes.md\":\"FmK_ke0x\",\"reference_adr_0025-joint-requirements.md\":\"ChoKvMUx\",\"reference_adr_0026-machine-records-and-api.md\":\"veybjBPq\",\"reference_adr_0027-paseo-plugin.md\":\"BMX33ZNU\",\"reference_adr_0028-external-integrations.md\":\"DtdMe8RK\",\"reference_adr_0029-requirements-from-cards.md\":\"BHd1SQPe\",\"reference_adr_0030-card-intake-process.md\":\"kLc-DG9_\",\"reference_adr_0031-fewer-interventions.md\":\"BDnQcz8g\",\"reference_adr_0032-npm-only-install.md\":\"C-3L1FkX\",\"reference_adr_0033-prototype-review-and-ui-check.md\":\"hFcQzmaa\",\"reference_adr_index.md\":\"BYF-Ofor\",\"reference_commands.md\":\"ClKbS-t8\",\"reference_config.md\":\"CRe27LaA\",\"reference_contracts_cli-json.md\":\"CCvKLasM\",\"reference_contracts_feature-files.md\":\"DSiA8OEH\",\"reference_contracts_index.md\":\"Bkznz4px\",\"reference_contracts_notifier-event.md\":\"B9WqeZdO\",\"reference_contracts_result-file.md\":\"DmR4fjB-\",\"reference_contracts_spec.md\":\"Dh5XczZL\",\"reference_contracts_state.md\":\"STlqkPPS\",\"reference_contracts_usage-record.md\":\"MjVps4CA\",\"reference_contracts_verify.md\":\"CbA88u6S\",\"reference_scope.md\":\"Kzqw8U_f\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"req-kit\",\"titleTemplate\":\":title · req-kit\",\"description\":\"在 Paseo 中用对话对齐需求,由一组 AI agent 在后台完成设计、实现、评审和验证。给测试、产品、项目经理用的需求开发体系。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.svg\",\"siteTitle\":\"req-kit\",\"nav\":[{\"text\":\"指南\",\"link\":\"/guide/\",\"activeMatch\":\"^/guide/\"},{\"text\":\"参考\",\"link\":\"/reference/commands\",\"activeMatch\":\"^/reference/\"},{\"text\":\"更新记录\",\"link\":\"/changelog\"},{\"text\":\"v1.14.0\",\"items\":[{\"text\":\"更新记录\",\"link\":\"/changelog\"},{\"text\":\"GitHub Releases\",\"link\":\"https://github.com/yiyisf/paseo-req-kit/releases\"},{\"text\":\"范围与取舍\",\"link\":\"/reference/scope\"}]}],\"sidebar\":{\"/guide/\":[{\"text\":\"开始\",\"items\":[{\"text\":\"req-kit 是什么\",\"link\":\"/guide/\"},{\"text\":\"快速开始\",\"link\":\"/guide/getting-started\"},{\"text\":\"工作原理\",\"link\":\"/guide/how-it-works\"}]},{\"text\":\"使用\",\"items\":[{\"text\":\"使用者指南\",\"link\":\"/guide/user\"},{\"text\":\"分阶段执行与提测\",\"link\":\"/guide/phases\"}]},{\"text\":\"安装与维护\",\"items\":[{\"text\":\"安装与升级\",\"link\":\"/guide/install\"},{\"text\":\"项目定制与运行规则\",\"link\":\"/guide/project\"},{\"text\":\"维护者指南\",\"link\":\"/guide/maintainer\"}]}],\"/reference/\":[{\"text\":\"参考\",\"items\":[{\"text\":\"命令\",\"link\":\"/reference/commands\"},{\"text\":\"配置项\",\"link\":\"/reference/config\"},{\"text\":\"范围与取舍\",\"link\":\"/reference/scope\"}]},{\"text\":\"文件格式约定\",\"collapsed\":false,\"items\":[{\"text\":\"总览\",\"link\":\"/reference/contracts/\"},{\"text\":\"需求说明 spec.md\",\"link\":\"/reference/contracts/spec\"},{\"text\":\"状态文件 state.json\",\"link\":\"/reference/contracts/state\"},{\"text\":\"结果文件\",\"link\":\"/reference/contracts/result-file\"},{\"text\":\"功能目录中的文件\",\"link\":\"/reference/contracts/feature-files\"},{\"text\":\"验证方法 verify.md\",\"link\":\"/reference/contracts/verify\"},{\"text\":\"外部通知事件\",\"link\":\"/reference/contracts/notifier-event\"},{\"text\":\"req api 的 JSON 输出\",\"link\":\"/reference/contracts/cli-json\"},{\"text\":\"需求索引与使用记录\",\"link\":\"/reference/contracts/usage-record\"}]},{\"text\":\"设计决定(ADR)\",\"collapsed\":true,\"items\":[{\"text\":\"总览\",\"link\":\"/reference/adr/\"},{\"text\":\"0001 步骤 agent 挂在发起的对话下\",\"link\":\"/reference/adr/0001-step-agents-under-origin-chat\"},{\"text\":\"0002 对话过程中不切换工作目录\",\"link\":\"/reference/adr/0002-no-directory-switch-in-chat\"},{\"text\":\"0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流\",\"link\":\"/reference/adr/0003-script-engine-not-hub\"},{\"text\":\"0004 步骤结论只看结果文件\",\"link\":\"/reference/adr/0004-result-files\"},{\"text\":\"0005 不在默认分支上运行,只做本地提交\",\"link\":\"/reference/adr/0005-no-default-branch-local-commits-only\"},{\"text\":\"0006 只安装到 ~/.agents/skills 和 ~/.claude/skills\",\"link\":\"/reference/adr/0006-skill-install-targets\"},{\"text\":\"0007 自带需求访谈 skill,不依赖外部 skill 包\",\"link\":\"/reference/adr/0007-own-interview-skill\"},{\"text\":\"0008 入口 skill 之间不互相调用\",\"link\":\"/reference/adr/0008-entries-do-not-call-entries\"},{\"text\":\"0009 程序与本机配置分开存放,按版本目录并存\",\"link\":\"/reference/adr/0009-versioned-install-layout\"},{\"text\":\"0010 需求总览现场生成,不维护 INDEX.md\",\"link\":\"/reference/adr/0010-generated-feature-overview\"},{\"text\":\"0011 完成后修改 spec 可以继续开发\",\"link\":\"/reference/adr/0011-resume-after-completion\"},{\"text\":\"0012 评审小组:首轮并行评审,评审者核实汇总\",\"link\":\"/reference/adr/0012-review-panel\"},{\"text\":\"0013 发布不使用 changesets 等工具\",\"link\":\"/reference/adr/0013-no-release-tooling\"},{\"text\":\"0014 外部通知只留接口,不内置任何 IM\",\"link\":\"/reference/adr/0014-notifier-slot\"},{\"text\":\"0015 需求变更后增量继续,而不是从零重做\",\"link\":\"/reference/adr/0015-incremental-continue\"},{\"text\":\"0016 一键升级:从 git 标签下载到 versions/ 再切换\",\"link\":\"/reference/adr/0016-upgrade-from-tags\"},{\"text\":\"0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线\",\"link\":\"/reference/adr/0017-use-paseo-capabilities\"},{\"text\":\"0018 可选:流水线为需求新建 worktree 工作区\",\"link\":\"/reference/adr/0018-own-worktree-option\"},{\"text\":\"0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案\",\"link\":\"/reference/adr/0019-parallel-orchestration\"},{\"text\":\"0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行\",\"link\":\"/reference/adr/0020-scheduling-through-the-chat\"},{\"text\":\"0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下\",\"link\":\"/reference/adr/0021-npm-version-manager\"},{\"text\":\"0022 分阶段执行:研发阶段、闸口、测试验证阶段\",\"link\":\"/reference/adr/0022-develop-and-verify-phases\"},{\"text\":\"0023 需求类型、质量门、按切片实现\",\"link\":\"/reference/adr/0023-types-gate-slices\"},{\"text\":\"0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则\",\"link\":\"/reference/adr/0024-confirm-early-review-axes\"},{\"text\":\"0025 联合需求:一个需求同时改几个仓库\",\"link\":\"/reference/adr/0025-joint-requirements\"},{\"text\":\"0026 本机的需求索引、使用记录和 req api\",\"link\":\"/reference/adr/0026-machine-records-and-api\"},{\"text\":\"0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作\",\"link\":\"/reference/adr/0027-paseo-plugin\"},{\"text\":\"0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的\",\"link\":\"/reference/adr/0028-external-integrations\"},{\"text\":\"0029 从卡片开始的需求:需求会话代替人,卡片描述代替对话\",\"link\":\"/reference/adr/0029-requirements-from-cards\"},{\"text\":\"0030 接单器:共享机器上定时接卡片、转达回复\",\"link\":\"/reference/adr/0030-card-intake-process\"},{\"text\":\"0031 少等人:每种中断都有自动的下一步\",\"link\":\"/reference/adr/0031-fewer-interventions\"},{\"text\":\"0032 安装、升级和文档只依赖 npm 源\",\"link\":\"/reference/adr/0032-npm-only-install\"},{\"text\":\"0033 原型审查页和不靠看图的界面检查\",\"link\":\"/reference/adr/0033-prototype-review-and-ui-check\"}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/yiyisf/paseo-req-kit\"}],\"editLink\":{\"pattern\":\"https://github.com/yiyisf/paseo-req-kit/edit/main/site/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"footer\":{\"message\":\"以 MIT 许可发布。req-kit 是运行在 Paseo 上的社区项目。\",\"copyright\":\"Copyright © 2026 yiyisf\"},\"search\":{\"provider\":\"local\",\"options\":{\"translations\":{\"button\":{\"buttonText\":\"搜索文档\",\"buttonAriaLabel\":\"搜索文档\"},\"modal\":{\"noResultsText\":\"没有找到相关结果\",\"resetButtonTitle\":\"清除\",\"footer\":{\"selectText\":\"选择\",\"navigateText\":\"切换\",\"closeText\":\"关闭\"}}}}},\"outline\":{\"level\":[2,3],\"label\":\"本页内容\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"lastUpdated\":{\"text\":\"最后更新\"},\"returnToTopLabel\":\"回到顶部\",\"sidebarMenuLabel\":\"目录\",\"darkModeSwitchLabel\":\"外观\",\"lightModeSwitchTitle\":\"切换到浅色\",\"darkModeSwitchTitle\":\"切换到深色\",\"externalLinkIcon\":true,\"notFound\":{\"title\":\"页面不存在\",\"quote\":\"这个页面可能已经移动或删除。\",\"linkText\":\"回到首页\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
104
104
 
105
105
  </body>
106
106
  </html>