paseo-req-kit 1.12.0 → 1.13.0-beta.1

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 (218) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +8 -3
  3. package/bin/bootstrap.d.mts +12 -0
  4. package/bin/bootstrap.mjs +418 -0
  5. package/bin/req-docs.d.mts +5 -0
  6. package/bin/req-docs.mjs +169 -0
  7. package/bin/req.mjs +12 -1
  8. package/docs/adr/0032-npm-only-install.md +27 -0
  9. package/docs/adr/README.md +1 -0
  10. package/docs/guide//345/256/211/350/243/205/344/270/216/345/215/207/347/272/247.md +22 -2
  11. package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +1 -1
  12. 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 +2 -2
  13. package/engine/src/card-cmd.ts +18 -3
  14. package/engine/src/card.ts +26 -3
  15. package/engine/src/daemon-check.ts +2 -1
  16. package/engine/src/messages.ts +9 -1
  17. package/engine/src/paseo-runtime.ts +27 -2
  18. package/engine/src/pipeline.ts +33 -8
  19. package/engine/src/state.ts +20 -1
  20. package/package.json +3 -1
  21. package/paseo-plugin/package.json +1 -1
  22. package/site-dist/404.html +27 -0
  23. package/site-dist/assets/app.C_2Vhmv-.js +1 -0
  24. package/site-dist/assets/changelog.md.VHiXRXap.js +1 -0
  25. package/site-dist/assets/changelog.md.VHiXRXap.lean.js +1 -0
  26. package/site-dist/assets/chunks/@localSearchIndexroot.hC_y1UNZ.js +1 -0
  27. package/site-dist/assets/chunks/VPLocalSearchBox.zPMXlb4V.js +9 -0
  28. package/site-dist/assets/chunks/framework.B9qR_F1m.js +20 -0
  29. package/site-dist/assets/chunks/theme.DRjHgCIR.js +2 -0
  30. package/site-dist/assets/guide_getting-started.md.DjqrOQ_8.js +6 -0
  31. package/site-dist/assets/guide_getting-started.md.DjqrOQ_8.lean.js +1 -0
  32. package/site-dist/assets/guide_how-it-works.md.D-kQsF1t.js +25 -0
  33. package/site-dist/assets/guide_how-it-works.md.D-kQsF1t.lean.js +1 -0
  34. package/site-dist/assets/guide_index.md.CLnGCmGW.js +1 -0
  35. package/site-dist/assets/guide_index.md.CLnGCmGW.lean.js +1 -0
  36. package/site-dist/assets/guide_install.md.DkCyZsOU.js +42 -0
  37. package/site-dist/assets/guide_install.md.DkCyZsOU.lean.js +42 -0
  38. package/site-dist/assets/guide_maintainer.md.C7Aav_lk.js +1 -0
  39. package/site-dist/assets/guide_maintainer.md.C7Aav_lk.lean.js +1 -0
  40. package/site-dist/assets/guide_phases.md.BpGAb1re.js +1 -0
  41. package/site-dist/assets/guide_phases.md.BpGAb1re.lean.js +1 -0
  42. package/site-dist/assets/guide_project.md.r2g5uU_4.js +77 -0
  43. package/site-dist/assets/guide_project.md.r2g5uU_4.lean.js +77 -0
  44. package/site-dist/assets/guide_user.md.FpCmz9S0.js +1 -0
  45. package/site-dist/assets/guide_user.md.FpCmz9S0.lean.js +1 -0
  46. package/site-dist/assets/index.md.Cf_sSf_f.js +1 -0
  47. package/site-dist/assets/index.md.Cf_sSf_f.lean.js +1 -0
  48. package/site-dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  49. package/site-dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  50. package/site-dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  51. package/site-dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  52. package/site-dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  53. package/site-dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  54. package/site-dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  55. package/site-dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  56. package/site-dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  57. package/site-dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  58. package/site-dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  59. package/site-dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  60. package/site-dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  61. package/site-dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  62. package/site-dist/assets/reference_adr_0001-step-agents-under-origin-chat.md.RtRTq7oi.js +1 -0
  63. package/site-dist/assets/reference_adr_0001-step-agents-under-origin-chat.md.RtRTq7oi.lean.js +1 -0
  64. package/site-dist/assets/reference_adr_0002-no-directory-switch-in-chat.md.BxtN-Aa2.js +1 -0
  65. package/site-dist/assets/reference_adr_0002-no-directory-switch-in-chat.md.BxtN-Aa2.lean.js +1 -0
  66. package/site-dist/assets/reference_adr_0003-script-engine-not-hub.md.66EgZtqx.js +1 -0
  67. package/site-dist/assets/reference_adr_0003-script-engine-not-hub.md.66EgZtqx.lean.js +1 -0
  68. package/site-dist/assets/reference_adr_0004-result-files.md.DbqcCozI.js +1 -0
  69. package/site-dist/assets/reference_adr_0004-result-files.md.DbqcCozI.lean.js +1 -0
  70. package/site-dist/assets/reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.js +1 -0
  71. package/site-dist/assets/reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.lean.js +1 -0
  72. package/site-dist/assets/reference_adr_0006-skill-install-targets.md.CwY8YepV.js +1 -0
  73. package/site-dist/assets/reference_adr_0006-skill-install-targets.md.CwY8YepV.lean.js +1 -0
  74. package/site-dist/assets/reference_adr_0007-own-interview-skill.md.CryhxRyG.js +1 -0
  75. package/site-dist/assets/reference_adr_0007-own-interview-skill.md.CryhxRyG.lean.js +1 -0
  76. package/site-dist/assets/reference_adr_0008-entries-do-not-call-entries.md.DsRWAgeA.js +1 -0
  77. package/site-dist/assets/reference_adr_0008-entries-do-not-call-entries.md.DsRWAgeA.lean.js +1 -0
  78. package/site-dist/assets/reference_adr_0009-versioned-install-layout.md.CSg1VqlW.js +1 -0
  79. package/site-dist/assets/reference_adr_0009-versioned-install-layout.md.CSg1VqlW.lean.js +1 -0
  80. package/site-dist/assets/reference_adr_0010-generated-feature-overview.md.D8F3MK-h.js +1 -0
  81. package/site-dist/assets/reference_adr_0010-generated-feature-overview.md.D8F3MK-h.lean.js +1 -0
  82. package/site-dist/assets/reference_adr_0011-resume-after-completion.md.BCrZrKjf.js +1 -0
  83. package/site-dist/assets/reference_adr_0011-resume-after-completion.md.BCrZrKjf.lean.js +1 -0
  84. package/site-dist/assets/reference_adr_0012-review-panel.md.k9rrHFFc.js +1 -0
  85. package/site-dist/assets/reference_adr_0012-review-panel.md.k9rrHFFc.lean.js +1 -0
  86. package/site-dist/assets/reference_adr_0013-no-release-tooling.md.BQeJ8dEI.js +1 -0
  87. package/site-dist/assets/reference_adr_0013-no-release-tooling.md.BQeJ8dEI.lean.js +1 -0
  88. package/site-dist/assets/reference_adr_0014-notifier-slot.md.C23QR1xO.js +1 -0
  89. package/site-dist/assets/reference_adr_0014-notifier-slot.md.C23QR1xO.lean.js +1 -0
  90. package/site-dist/assets/reference_adr_0015-incremental-continue.md.Buy7wwO8.js +1 -0
  91. package/site-dist/assets/reference_adr_0015-incremental-continue.md.Buy7wwO8.lean.js +1 -0
  92. package/site-dist/assets/reference_adr_0016-upgrade-from-tags.md.qfIW-tqJ.js +1 -0
  93. package/site-dist/assets/reference_adr_0016-upgrade-from-tags.md.qfIW-tqJ.lean.js +1 -0
  94. package/site-dist/assets/reference_adr_0017-use-paseo-capabilities.md.CjcGli87.js +1 -0
  95. package/site-dist/assets/reference_adr_0017-use-paseo-capabilities.md.CjcGli87.lean.js +1 -0
  96. package/site-dist/assets/reference_adr_0018-own-worktree-option.md.fVDpgGSE.js +1 -0
  97. package/site-dist/assets/reference_adr_0018-own-worktree-option.md.fVDpgGSE.lean.js +1 -0
  98. package/site-dist/assets/reference_adr_0019-parallel-orchestration.md.DrfrV0To.js +1 -0
  99. package/site-dist/assets/reference_adr_0019-parallel-orchestration.md.DrfrV0To.lean.js +1 -0
  100. package/site-dist/assets/reference_adr_0020-scheduling-through-the-chat.md.BqSemGFG.js +1 -0
  101. package/site-dist/assets/reference_adr_0020-scheduling-through-the-chat.md.BqSemGFG.lean.js +1 -0
  102. package/site-dist/assets/reference_adr_0021-npm-version-manager.md.CU3PG6y5.js +1 -0
  103. package/site-dist/assets/reference_adr_0021-npm-version-manager.md.CU3PG6y5.lean.js +1 -0
  104. package/site-dist/assets/reference_adr_0022-develop-and-verify-phases.md.C6fQDLq4.js +1 -0
  105. package/site-dist/assets/reference_adr_0022-develop-and-verify-phases.md.C6fQDLq4.lean.js +1 -0
  106. package/site-dist/assets/reference_adr_0023-types-gate-slices.md.D2E6yyYQ.js +1 -0
  107. package/site-dist/assets/reference_adr_0023-types-gate-slices.md.D2E6yyYQ.lean.js +1 -0
  108. package/site-dist/assets/reference_adr_0024-confirm-early-review-axes.md.FmK_ke0x.js +1 -0
  109. package/site-dist/assets/reference_adr_0024-confirm-early-review-axes.md.FmK_ke0x.lean.js +1 -0
  110. package/site-dist/assets/reference_adr_0025-joint-requirements.md.ChoKvMUx.js +1 -0
  111. package/site-dist/assets/reference_adr_0025-joint-requirements.md.ChoKvMUx.lean.js +1 -0
  112. package/site-dist/assets/reference_adr_0026-machine-records-and-api.md.veybjBPq.js +1 -0
  113. package/site-dist/assets/reference_adr_0026-machine-records-and-api.md.veybjBPq.lean.js +1 -0
  114. package/site-dist/assets/reference_adr_0027-paseo-plugin.md.BMX33ZNU.js +1 -0
  115. package/site-dist/assets/reference_adr_0027-paseo-plugin.md.BMX33ZNU.lean.js +1 -0
  116. package/site-dist/assets/reference_adr_0028-external-integrations.md.DtdMe8RK.js +1 -0
  117. package/site-dist/assets/reference_adr_0028-external-integrations.md.DtdMe8RK.lean.js +1 -0
  118. package/site-dist/assets/reference_adr_0029-requirements-from-cards.md.BHd1SQPe.js +1 -0
  119. package/site-dist/assets/reference_adr_0029-requirements-from-cards.md.BHd1SQPe.lean.js +1 -0
  120. package/site-dist/assets/reference_adr_0030-card-intake-process.md.kLc-DG9_.js +1 -0
  121. package/site-dist/assets/reference_adr_0030-card-intake-process.md.kLc-DG9_.lean.js +1 -0
  122. package/site-dist/assets/reference_adr_0031-fewer-interventions.md.BDnQcz8g.js +1 -0
  123. package/site-dist/assets/reference_adr_0031-fewer-interventions.md.BDnQcz8g.lean.js +1 -0
  124. package/site-dist/assets/reference_adr_0032-npm-only-install.md.C-3L1FkX.js +1 -0
  125. package/site-dist/assets/reference_adr_0032-npm-only-install.md.C-3L1FkX.lean.js +1 -0
  126. package/site-dist/assets/reference_adr_index.md.DTVyIA6V.js +1 -0
  127. package/site-dist/assets/reference_adr_index.md.DTVyIA6V.lean.js +1 -0
  128. package/site-dist/assets/reference_commands.md.ClKbS-t8.js +1 -0
  129. package/site-dist/assets/reference_commands.md.ClKbS-t8.lean.js +1 -0
  130. package/site-dist/assets/reference_config.md.CRe27LaA.js +6 -0
  131. package/site-dist/assets/reference_config.md.CRe27LaA.lean.js +1 -0
  132. package/site-dist/assets/reference_contracts_cli-json.md.gkER6rX7.js +1 -0
  133. package/site-dist/assets/reference_contracts_cli-json.md.gkER6rX7.lean.js +1 -0
  134. package/site-dist/assets/reference_contracts_feature-files.md.DSiA8OEH.js +26 -0
  135. package/site-dist/assets/reference_contracts_feature-files.md.DSiA8OEH.lean.js +26 -0
  136. package/site-dist/assets/reference_contracts_index.md.Bkznz4px.js +1 -0
  137. package/site-dist/assets/reference_contracts_index.md.Bkznz4px.lean.js +1 -0
  138. package/site-dist/assets/reference_contracts_notifier-event.md.CCfrkm_A.js +24 -0
  139. package/site-dist/assets/reference_contracts_notifier-event.md.CCfrkm_A.lean.js +24 -0
  140. package/site-dist/assets/reference_contracts_result-file.md.DmR4fjB-.js +1 -0
  141. package/site-dist/assets/reference_contracts_result-file.md.DmR4fjB-.lean.js +1 -0
  142. package/site-dist/assets/reference_contracts_spec.md.BwwS0L_j.js +8 -0
  143. package/site-dist/assets/reference_contracts_spec.md.BwwS0L_j.lean.js +8 -0
  144. package/site-dist/assets/reference_contracts_state.md.5bNTC3ow.js +1 -0
  145. package/site-dist/assets/reference_contracts_state.md.5bNTC3ow.lean.js +1 -0
  146. package/site-dist/assets/reference_contracts_usage-record.md._C0OXWeq.js +10 -0
  147. package/site-dist/assets/reference_contracts_usage-record.md._C0OXWeq.lean.js +10 -0
  148. package/site-dist/assets/reference_contracts_verify.md.CbA88u6S.js +29 -0
  149. package/site-dist/assets/reference_contracts_verify.md.CbA88u6S.lean.js +29 -0
  150. package/site-dist/assets/reference_scope.md.Kzqw8U_f.js +1 -0
  151. package/site-dist/assets/reference_scope.md.Kzqw8U_f.lean.js +1 -0
  152. package/site-dist/assets/style.Dwsa4SMe.css +1 -0
  153. package/site-dist/changelog.html +30 -0
  154. package/site-dist/guide/getting-started.html +35 -0
  155. package/site-dist/guide/how-it-works.html +54 -0
  156. package/site-dist/guide/index.html +30 -0
  157. package/site-dist/guide/install.html +71 -0
  158. package/site-dist/guide/maintainer.html +30 -0
  159. package/site-dist/guide/phases.html +30 -0
  160. package/site-dist/guide/project.html +106 -0
  161. package/site-dist/guide/user.html +30 -0
  162. package/site-dist/hashmap.json +1 -0
  163. package/site-dist/icons/agents.svg +1 -0
  164. package/site-dist/icons/chat.svg +1 -0
  165. package/site-dist/icons/paseo.svg +1 -0
  166. package/site-dist/icons/phases.svg +1 -0
  167. package/site-dist/icons/review.svg +1 -0
  168. package/site-dist/icons/safe.svg +1 -0
  169. package/site-dist/index.html +30 -0
  170. package/site-dist/install.ps1 +118 -0
  171. package/site-dist/install.sh +198 -0
  172. package/site-dist/logo.svg +11 -0
  173. package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +30 -0
  174. package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +30 -0
  175. package/site-dist/reference/adr/0003-script-engine-not-hub.html +30 -0
  176. package/site-dist/reference/adr/0004-result-files.html +30 -0
  177. package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +30 -0
  178. package/site-dist/reference/adr/0006-skill-install-targets.html +30 -0
  179. package/site-dist/reference/adr/0007-own-interview-skill.html +30 -0
  180. package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +30 -0
  181. package/site-dist/reference/adr/0009-versioned-install-layout.html +30 -0
  182. package/site-dist/reference/adr/0010-generated-feature-overview.html +30 -0
  183. package/site-dist/reference/adr/0011-resume-after-completion.html +30 -0
  184. package/site-dist/reference/adr/0012-review-panel.html +30 -0
  185. package/site-dist/reference/adr/0013-no-release-tooling.html +30 -0
  186. package/site-dist/reference/adr/0014-notifier-slot.html +30 -0
  187. package/site-dist/reference/adr/0015-incremental-continue.html +30 -0
  188. package/site-dist/reference/adr/0016-upgrade-from-tags.html +30 -0
  189. package/site-dist/reference/adr/0017-use-paseo-capabilities.html +30 -0
  190. package/site-dist/reference/adr/0018-own-worktree-option.html +30 -0
  191. package/site-dist/reference/adr/0019-parallel-orchestration.html +30 -0
  192. package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +30 -0
  193. package/site-dist/reference/adr/0021-npm-version-manager.html +30 -0
  194. package/site-dist/reference/adr/0022-develop-and-verify-phases.html +30 -0
  195. package/site-dist/reference/adr/0023-types-gate-slices.html +30 -0
  196. package/site-dist/reference/adr/0024-confirm-early-review-axes.html +30 -0
  197. package/site-dist/reference/adr/0025-joint-requirements.html +30 -0
  198. package/site-dist/reference/adr/0026-machine-records-and-api.html +30 -0
  199. package/site-dist/reference/adr/0027-paseo-plugin.html +30 -0
  200. package/site-dist/reference/adr/0028-external-integrations.html +30 -0
  201. package/site-dist/reference/adr/0029-requirements-from-cards.html +30 -0
  202. package/site-dist/reference/adr/0030-card-intake-process.html +30 -0
  203. package/site-dist/reference/adr/0031-fewer-interventions.html +30 -0
  204. package/site-dist/reference/adr/0032-npm-only-install.html +30 -0
  205. package/site-dist/reference/adr/index.html +30 -0
  206. package/site-dist/reference/commands.html +30 -0
  207. package/site-dist/reference/config.html +35 -0
  208. package/site-dist/reference/contracts/cli-json.html +30 -0
  209. package/site-dist/reference/contracts/feature-files.html +55 -0
  210. package/site-dist/reference/contracts/index.html +30 -0
  211. package/site-dist/reference/contracts/notifier-event.html +53 -0
  212. package/site-dist/reference/contracts/result-file.html +30 -0
  213. package/site-dist/reference/contracts/spec.html +37 -0
  214. package/site-dist/reference/contracts/state.html +30 -0
  215. package/site-dist/reference/contracts/usage-record.html +39 -0
  216. package/site-dist/reference/contracts/verify.html +58 -0
  217. package/site-dist/reference/scope.html +30 -0
  218. package/site-dist/vp-icons.css +1 -0
@@ -0,0 +1,42 @@
1
+ import{_ as e,o as n,c as t,j as l,a as i}from"./chunks/framework.B9qR_F1m.js";const c=JSON.parse('{"title":"安装与升级","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"guide/install.md","filePath":"guide/install.md","lastUpdated":null}'),a={name:"guide/install.md"};function d(h,s,u,o,k,r){return n(),t("div",null,[...s[0]||(s[0]=[l("div",null,[l("h1",{id:"安装与升级",tabindex:"-1"},[i("安装与升级 "),l("a",{class:"header-anchor",href:"#安装与升级","aria-label":'Permalink to "安装与升级"'},"​")]),l("p",null,[i("本文面向负责安装的人:通常是开发同事,有经验的测试或产品同事也可以按步骤完成。安装在"),l("strong",null,"运行 Paseo daemon 的那台机器"),i("上做一次,之后这台机器上所有项目的 Paseo 对话都能使用 "),l("code",null,"/req"),i("。")]),l("h2",{id:"_1-安装布局",tabindex:"-1"},[i("1. 安装布局 "),l("a",{class:"header-anchor",href:"#_1-安装布局","aria-label":'Permalink to "1. 安装布局"'},"​")]),l("p",null,"程序和本机配置分开存放。升级时只替换程序,配置不动;旧版本目录保留,可以随时回滚。"),l("div",{class:"language-text vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"text"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",null,"<npm 全局目录>/paseo-req-kit/ 版本管理器(npm i -g 安装,提供 req 命令)")]),i(`
2
+ `),l("span",{class:"line"},[l("span",null,"~/tools/req-kit/versions/")]),i(`
3
+ `),l("span",{class:"line"},[l("span",null,"├── 1.7.0/node_modules/paseo-req-kit/ 一个版本的程序(npm 安装;依赖在 1.7.0/node_modules 下)")]),i(`
4
+ `),l("span",{class:"line"},[l("span",null,"├── 1.6.0/ git 方式安装的版本(含 node_modules),继续可用")]),i(`
5
+ `),l("span",{class:"line"},[l("span",null,"└── … 各版本并存,随时切换")]),i(`
6
+ `),l("span",{class:"line"},[l("span",null,"~/.req-kit/")]),i(`
7
+ `),l("span",{class:"line"},[l("span",null,"├── config.json 本机配置")]),i(`
8
+ `),l("span",{class:"line"},[l("span",null,"├── prompts.local/ 本机提示词覆盖(可选)")]),i(`
9
+ `),l("span",{class:"line"},[l("span",null,"├── active.json 当前启用的版本")]),i(`
10
+ `),l("span",{class:"line"},[l("span",null,"├── bin/req、req.cmd req 命令,指向当前启用的版本")]),i(`
11
+ `),l("span",{class:"line"},[l("span",null,"├── notifiers/ 外部通知模块(可选,自己实现,见第 12 节)")]),i(`
12
+ `),l("span",{class:"line"},[l("span",null,"└── install-log/ 安装、升级、回滚记录")]),i(`
13
+ `),l("span",{class:"line"},[l("span",null,"~/.agents/skills/… 安装器复制的 skill(Codex、Pi、OpenCode 等读取)")]),i(`
14
+ `),l("span",{class:"line"},[l("span",null,"~/.claude/skills/… 同上(Claude Code;~/.claude 存在时)")])])])]),l("p",null,[i("Windows 上 "),l("code",null,"~"),i(" 即 "),l("code",null,"%USERPROFILE%"),i("(如 "),l("code",null,"D:\\Users\\<用户名>"),i(")。安装器不使用符号链接,不需要管理员权限。环境变量 "),l("code",null,"REQ_KIT_HOME"),i(" 可以把 "),l("code",null,"~/.req-kit"),i(" 换到别的位置。")]),l("h2",{id:"_2-前置条件",tabindex:"-1"},[i("2. 前置条件 "),l("a",{class:"header-anchor",href:"#_2-前置条件","aria-label":'Permalink to "2. 前置条件"'},"​")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"项目"),l("th",null,"要求"),l("th",null,"如何确认")])]),l("tbody",null,[l("tr",null,[l("td",null,"Paseo"),l("td",null,"0.11,daemon 在运行(一键安装会在没有时安装 Paseo 命令行并启动)"),l("td",null,[i("Paseo 桌面端能正常对话,或浏览器打开 "),l("code",null,"http://localhost:6767/"),i(";默认地址 "),l("code",null,"ws://127.0.0.1:6767/ws")])]),l("tr",null,[l("td",null,"Node.js"),l("td",null,"22 或更新"),l("td",null,[l("code",null,"node -v")])]),l("tr",null,[l("td",null,"npm"),l("td",null,[i("Node.js 自带;公司网络需配置镜像("),l("code",null,"npm config get registry"),i(")")]),l("td",null,[l("code",null,"npm -v")])]),l("tr",null,[l("td",null,"git"),l("td",null,"近期版本(只有 git 方式安装时需要)"),l("td",null,[l("code",null,"git --version")])]),l("tr",null,[l("td",null,"agent"),l("td",null,"Claude Code、Codex、OpenCode、Pi 至少一种,已在 Paseo 中登录"),l("td",null,"在 Paseo 中用它开一个对话")]),l("tr",null,[l("td",null,"网络"),l("td",null,'能访问 npm 源(公共的,或公司镜像;内网见第 3 节"公司内网")'),l("td",null,[l("code",null,"npm ping")])]),l("tr",null,[l("td",null,"daemon 密码"),l("td",null,[i("daemon 设了密码时,放在环境变量中(默认 "),l("code",null,"PASEO_DAEMON_PASSWORD"),i(")")]),l("td",null,"未设密码可跳过")]),l("tr",null,[l("td",null,"Paseo 工具和浏览器(可选)"),l("td",null,[i("设置 → 本机 → Agents 打开 "),l("strong",null,"Enable Paseo tools"),i(",并开启浏览器工具:步骤 agent 可以重启 Paseo 管理的服务、用内置浏览器验证网页(需要桌面端在线)")]),l("td",null,[l("code",null,"/req-doctor"),i(' 的"Paseo daemon"一节')])]),l("tr",null,[l("td",null,"Agent profiles(推荐)"),l("td",null,'设置 → 本机 → Agents → Agent profiles 中建好"实现""评审"等 profile,配置中引用,见第 4 节'),l("td",null,[l("code",null,"/req-doctor")])])])]),l("h2",{id:"_3-首次安装",tabindex:"-1"},[i("3. 首次安装 "),l("a",{class:"header-anchor",href:"#_3-首次安装","aria-label":'Permalink to "3. 首次安装"'},"​")]),l("p",null,[l("strong",null,"推荐:一键安装。"),i(" 一条命令完成检查环境、安装、启用、安装 skill 和配置 agent,再次运行即升级:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# 任何系统(1.13 起;只需要 Node.js 22+ 和能访问的 npm 源)")]),i(`
15
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npx"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -y"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," paseo-req-kit@latest"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")])])])]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# macOS、Linux、Windows 的 Git Bash 或 WSL")]),i(`
16
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"curl"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -fsSL"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," https://paseo-req-kit.vercel.app/install.sh"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}}," |"),l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}}," sh")])])])]),l("div",{class:"language-powershell vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"powershell"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# Windows PowerShell(不受脚本执行策略限制)")]),i(`
17
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"irm https:"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"//"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"paseo"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"req"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"kit.vercel.app"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"install.ps1 "),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"|"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," iex")])])])]),l("p",null,[i("几种写法做的事情一样:1.13 起安装脚本只是选好版本(npm 上有就用 npm 的,没有时用 GitHub Release 的安装包),再运行那个版本自带的安装命令 "),l("code",null,"req install"),i("("),l("code",null,"bin/bootstrap.mjs"),i("),也就是 "),l("code",null,"npx … install"),i(" 运行的那一个。指定版本或 beta 版:"),l("code",null,"npx -y paseo-req-kit@1.13.0 install"),i("、"),l("code",null,"npx -y paseo-req-kit@beta install"),i("。")]),l("p",null,[i('依次:检查 Node.js 22+、npm、git;确定 npm 源(见下面的"公司内网");从 npm 安装 '),l("code",null,"paseo-req-kit"),i(",npm 上没有时改用 GitHub Release 的安装包;npm 全局目录不可写时装到 "),l("code",null,"~/.req-kit/npm"),i("(不需要 sudo);"),l("strong",null,"检查 Paseo"),i("(见下);运行 "),l("code",null,"req setup"),i(";本机配置还没填时运行 "),l("code",null,"req configure --auto"),i("(1.12:不提问,按推荐选好已登录的 agent:两个不同厂商的分别做 builder 和 reviewer,再选一个做备用模型,都用免确认模式;自动选不了时改为逐项选择);最后提示把 "),l("code",null,"req"),i(" 加入 PATH(如需要)。选项:"),l("code",null,"req install"),i(" / "),l("code",null,"npx … install"),i(" 后面写 "),l("code",null,"--registry <地址>"),i("、"),l("code",null,"--no-save-registry"),i("、"),l("code",null,"--no-configure"),i("、"),l("code",null,"--skip-paseo"),i("、"),l("code",null,"--with-plugin"),i("、"),l("code",null,"--no-plugin"),i(";"),l("code",null,"install.sh"),i(" 写在 "),l("code",null,"sh -s --"),i(" 之后(另有 "),l("code",null,"--beta"),i("、"),l("code",null,"--version <版本>"),i("、"),l("code",null,"--from npm|release"),i(");"),l("code",null,"install.ps1"),i(" 用变量("),l("code",null,"$ReqKitBeta = $true; irm … | iex"),i(",还有 "),l("code",null,"$ReqKitVersion"),i("、"),l("code",null,"$ReqKitFrom"),i("、"),l("code",null,"$ReqKitRegistry"),i("、"),l("code",null,"$ReqKitNoSaveRegistry"),i("、"),l("code",null,"$ReqKitNoConfigure"),i("、"),l("code",null,"$ReqKitSkipPaseo"),i("、"),l("code",null,"$ReqKitPlugin"),i(")。")]),l("p",null,[l("strong",null,"公司内网(只有 npm 镜像,打不开 GitHub 和文档站点)。"),i(" 不需要任何站点,用 npx 加上镜像地址:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npx"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -y"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --registry=https://npm.example.internal/"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," paseo-req-kit@latest"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")])])])]),l("ul",null,[l("li",null,[i("镜像地址会"),l("strong",null,"保存为本机的 npm 源"),i("("),l("code",null,"npm config set registry"),i(",屏幕上会写出原来的值),以后 "),l("code",null,"req upgrade"),i("、"),l("code",null,"req versions"),i(" 和安装 Paseo 命令行都从镜像取。只想这一次用镜像时加 "),l("code",null,"--no-save-registry"),i("。本机原本就配好了镜像时不用写 "),l("code",null,"--registry"),i("。")]),l("li",null,[i("镜像上还没有这个版本(镜像同步有延迟)时会直接说明,不会去访问 GitHub;稍后再运行,或请管理镜像的同事手动同步 "),l("code",null,"paseo-req-kit"),i("。")]),l("li",null,[i("文档:装好后运行 "),l("code",null,"req docs"),i(",在本机打开和这个版本一致的文档站点(发布时构建进 npm 包,不需要外网)。")]),l("li",null,'只支持 npm 方式安装和升级;git 方式(下面的"用 git 安装")要能访问 GitHub。'),l("li",null,[i("第一次在内网机器上安装 Paseo 命令行时请留意输出:它依赖的个别组件(例如 "),l("code",null,"node-pty"),i(")在镜像里没有对应平台的预编译包时会尝试现场编译,需要能下载 Node.js 头文件(可以在 "),l("code",null,".npmrc"),i(" 中设置 "),l("code",null,"disturl"),i(" 指向公司镜像)。桌面版 Paseo 的自动更新走 GitHub,内网需另行分发安装包。")])]),l("p",null,"检查 Paseo 这一步:"),l("ul",null,[l("li",null,[l("strong",null,[i("有 "),l("code",null,"paseo"),i(" 命令")]),i(":核对它的版本是否在这个 req-kit 支持的范围内(不在时提醒,不替换);开启 daemon 自带的网页界面("),l("code",null,"paseo daemon config set features.webUi.enabled true"),i(");daemon 没在运行就 "),l("code",null,"paseo daemon start"),i("。daemon 已在运行而网页界面是刚开启的,只提示 "),l("code",null,"paseo daemon restart"),i(",不自动重启——重启会中断正在运行的 agent。")]),l("li",null,[l("strong",null,[i("没有 "),l("code",null,"paseo"),i(" 命令,但 daemon 在运行")]),i(":通常是桌面版 Paseo 管理的 daemon,什么都不装;需要网页界面时在桌面版中开启。")]),l("li",null,[l("strong",null,"都没有(新机器)"),i(":用 npm 安装与 req-kit 匹配的 Paseo 命令行(例如 "),l("code",null,"@getpaseo/cli@~0.11.0"),i("),开启网页界面,启动 daemon。之后在浏览器打开 "),l("code",null,"http://localhost:6767/"),i(" 就能用 Paseo 对话。")]),l("li",null,[i("最后检查有没有 agent 命令行(Claude Code、Codex、OpenCode、Pi、Copilot),一个都没有时提醒:至少装一个并登录,再运行 "),l("code",null,"req configure"),i("。")])]),l("p",null,[i("不想让脚本动 Paseo(例如由别人统一管理)时加 "),l("code",null,"--skip-paseo"),i("。完成后接着做下面的"),l("strong",null,"第四步"),i("到"),l("strong",null,"第六步"),i("。")]),l("p",null,[l("strong",null,"也可以用 npm 安装(1.7.0 起)。"),i(" 一键安装做的就是这几条命令,Windows 上 "),l("code",null,"req"),i(" 命令由 npm 放进 PATH,不用自己设置:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npm"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," i"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -g"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," paseo-req-kit"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # beta 版:npm i -g paseo-req-kit@beta")]),i(`
18
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," setup"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 装进 ~/tools/req-kit/versions/<版本>,安装 skill,生成本机配置")]),i(`
19
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," configure"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 配置向导:选 builder、reviewer 和备用模型用的 agent")]),i(`
20
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," configure"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --auto"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 不提问,按推荐选好(也可以在 Paseo 的 设置 → 插件 → req-kit → 模型 中修改)")]),i(`
21
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," doctor"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --no-project"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 体检")])])])]),l("p",null,[i("全局安装的包是版本管理器:"),l("code",null,"req setup"),i(" 把这个版本装进 "),l("code",null,"versions/<版本>"),i(",之后 "),l("code",null,"req upgrade"),i(" 安装新版本、"),l("code",null,"req use <版本>"),i(" 切换,各版本并存,正在运行的流水线不受影响。其他 "),l("code",null,"req"),i(" 命令都转交给当前启用的版本。公司网络使用 npm 镜像或私有仓库时,按平常的方式配置 "),l("code",null,".npmrc"),i(" 即可。")]),l("p",null,[i("完全离线时,用 GitHub Release 上附带的安装包:"),l("code",null,"npm i -g ./paseo-req-kit-<版本>.tgz"),i(",再 "),l("code",null,"req setup"),i("(依赖需要能从本机 npm 缓存或镜像取得)。")]),l("p",null,[i("还没有发布到 npm 的版本(或 npm 上取不到时),也可以直接用 Release 上安装包的地址:"),l("code",null,"npm i -g https://github.com/yiyisf/paseo-req-kit/releases/download/<版本>/paseo-req-kit-<版本>.tgz"),i(",再 "),l("code",null,"req setup"),i("。")]),l("p",null,[i("之后接着做下面的"),l("strong",null,"第三步"),i("到"),l("strong",null,"第六步"),i("(配置 agent、体检和冒烟测试、接入项目、使用者上手)。")]),l("p",null,[l("strong",null,"其他方式:用 git 安装。"),i(" 不方便用 npm 全局安装时,可以把版本放进它自己的目录:")]),l("p",null,[l("strong",null,"第一步:取得程序。"),i(" 把要安装的版本放进它自己的版本目录:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"git"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," clone"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --branch"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.9.1"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --depth"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," https://github.com/yiyisf/paseo-req-kit"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.9.1")])])])]),l("p",null,"Windows PowerShell:"),l("div",{class:"language-powershell vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"powershell"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"git clone "),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"--"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"branch "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1.9"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"."),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}}," --"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"depth "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," https:"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"//"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"github.com"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"yiyisf"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"paseo"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"req"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"kit "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"$"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"env:"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"USERPROFILE"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'\\tools\\req-kit\\versions\\1.9.1"')])])])]),l("p",null,[l("strong",null,"第二步:安装依赖并启用。")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"cd"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.9.1")]),i(`
22
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npm"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")]),i(`
23
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs")])])])]),l("p",null,[l("code",null,"install.mjs"),i(" 会:检查 Node.js 和依赖;"),l("code",null,"~/.req-kit/config.json"),i(" 不存在时从示例生成一份;把 "),l("code",null,"skills/"),i(" 下的全部 skill 复制到各 agent 的 skill 目录,并把其中的路径替换为这个版本目录的绝对路径;在每个 skill 目录写入标记文件 "),l("code",null,".req-kit-install.json"),i(";记录当前启用的版本;在 "),l("code",null,"~/.req-kit/bin"),i(" 写入 "),l("code",null,"req"),i(" 命令。同名目录已存在但不是 req-kit 装的,不会覆盖,除非加 "),l("code",null,"--force"),i("。")]),l("p",null,[l("strong",null,"第三步:配置 agent。"),i(" 为 "),l("code",null,"builder"),i("(方案设计、实现、修复、报告)和 "),l("code",null,"reviewer"),i("(方案审核、代码评审、功能验证)各选一个 agent。推荐用配置向导(Paseo 需要在运行):")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --configure")])])])]),l("p",null,[i("它会列出 daemon 上已登录可用的 agent 和模型,自动选择不会停下来等待批准的模式,问几个选择题(直接回车选推荐项),确认后写入 "),l("code",null,"~/.req-kit/config.json"),i("(原文件备份),其他设置保持不变。也可以手工编辑,写法见第 4 节;不确定模型 ID 时运行 "),l("code",null,"npm run smoke -- check"),i(" 查看可用的值。配好后再运行一次 "),l("code",null,"node install.mjs"),i(",全部 ✓ 即完成。")]),l("p",null,[l("strong",null,[l("code",null,"req"),i(" 命令(可选)。")]),i(" 安装输出会给出把 "),l("code",null,"~/.req-kit/bin"),i(" 加入 PATH 的命令,执行一次后,新开的终端中可以直接用 "),l("code",null,"req"),i(":")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"命令"),l("th",null,"作用")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"req list")]),l("td",null,"列出当前项目的所有需求和阶段")]),l("tr",null,[l("td",null,[l("code",null,"req status [需求]")]),l("td",null,"查看进度;只有一个需求运行过时可以不写")]),l("tr",null,[l("td",null,[l("code",null,"req stop <需求>"),i(" / "),l("code",null,"req resume <需求>")]),l("td",null,"停止 / 继续")]),l("tr",null,[l("td",null,[l("code",null,"req doctor")]),l("td",null,"体检")]),l("tr",null,[l("td",null,[l("code",null,"req docs")]),l("td",null,"在本机打开这个版本的文档站点(1.13 起,不需要外网)")]),l("tr",null,[l("td",null,[l("code",null,"req configure")]),l("td",null,"配置向导")]),l("tr",null,[l("td",null,[l("code",null,"req upgrade")]),l("td",null,"升级到最新版本")]),l("tr",null,[l("td",null,[l("code",null,"req notify-test")]),l("td",null,"给外部通知发测试消息")]),l("tr",null,[l("td",null,[l("code",null,"req digest")]),l("td",null,[i("项目的需求总览;"),l("code",null,"--notify"),i(" 发到外部通知,"),l("code",null,'--schedule "0 9 * * 1"'),i(" 每周一 9 点自动发送")])]),l("tr",null,[l("td",null,[l("code",null,"req stats")]),l("td",null,[i("本机的使用统计;"),l("code",null,"--report --month 2026-10"),i(" 生成汇报用的文件,"),l("code",null,"--export"),i(" / "),l("code",null,"--merge"),i(" 汇总多台机器")])]),l("tr",null,[l("td",null,[l("code",null,"req sync <需求>"),i(" / "),l("code",null,"req integration test [需求]")]),l("td",null,[i("外部系统对接:补发和试运行(见 "),l("a",{href:"./project"},"项目定制与运行规则"),i(' 的"外部系统对接")')])]),l("tr",null,[l("td",null,[l("code",null,"req index --rebuild")]),l("td",null,"把 1.9 之前运行过的需求登记进本机的需求索引(Paseo 插件据此列出所有需求)")])])]),l("p",null,[l("code",null,"<需求>"),i(" 可以只写名称中能唯一确定的一部分,如 "),l("code",null,"sms-login"),i("。"),l("code",null,"req help"),i(" 查看全部。不加 PATH 也可以用完整路径 "),l("code",null,"~/.req-kit/bin/req"),i("(Windows 为 "),l("code",null,"%USERPROFILE%\\.req-kit\\bin\\req.cmd"),i(")。")]),l("p",null,[i("团队有统一配置时(统一的模型、评审小组、超时、要求的 req-kit 版本),把团队配置仓库克隆到本机,在本机配置中加上 "),l("code",null,'"teamConfig": "<团队配置文件的路径>"'),i("(绝对路径,或相对 "),l("code",null,"~/.req-kit/"),i(" 的路径)。团队配置不能设置 daemon 地址和密码。详见 "),l("a",{href:"./project"},"项目定制与运行规则"),i(' 的"团队配置"。')]),l("p",null,[l("strong",null,"第四步:体检和冒烟测试。"),i(" 先运行:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," bin/req-doctor.mjs"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --no-project")])])])]),l("p",null,"然后按第 5 节做冒烟测试。"),l("p",null,[l("strong",null,"第五步:接入项目(每个项目一次,推荐)。"),i(" 在项目主目录、主分支上开一个 Paseo 对话,输入 "),l("code",null,"/req-setup"),i("。它会读项目、只问读不出来的事、实际运行验证命令,生成 "),l("code",null,".requirement-pipeline/project-notes.md"),i("(项目约定)和 "),l("code",null,".requirement-pipeline/verify.md"),i("(验证方法),确认后提交。详见 "),l("a",{href:"./project"},"项目定制与运行规则"),i("。")]),l("p",null,[l("strong",null,"第六步:使用者上手。"),i(" 把 "),l("a",{href:"./user"},"使用者指南"),i(" 发给使用者,陪他们完成第一个小需求。")]),l("h3",{id:"安装器参数",tabindex:"-1"},[i("安装器参数 "),l("a",{class:"header-anchor",href:"#安装器参数","aria-label":'Permalink to "安装器参数"'},"​")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"参数"),l("th",null,"作用")])]),l("tbody",null,[l("tr",null,[l("td",null,"(无)"),l("td",null,"安装或切换到这个版本")]),l("tr",null,[l("td",null,[l("code",null,"--check")]),l("td",null,"只检查,不修改任何文件")]),l("tr",null,[l("td",null,[l("code",null,"--import-legacy <目录>")]),l("td",null,[i("先从旧脚本版导入配置和 "),l("code",null,"prompts.local/")])]),l("tr",null,[l("td",null,[l("code",null,"--target <目录>")]),l("td",null,"额外安装到另一个 skill 目录(可重复,会被记住,之后的升级也会更新它)")]),l("tr",null,[l("td",null,[l("code",null,"--force")]),l("td",null,"覆盖不是 req-kit 安装的同名 skill")]),l("tr",null,[l("td",null,[l("code",null,"--prune")]),l("td",null,"列出可以删除的旧版本目录(保留当前和上一个版本)")]),l("tr",null,[l("td",null,[l("code",null,"--uninstall")]),l("td",null,[i("删除 req-kit 安装的 skill 和 "),l("code",null,"req"),i(" 命令,保留 "),l("code",null,"~/.req-kit"),i(" 中的配置")])]),l("tr",null,[l("td",null,[l("code",null,"--configure")]),l("td",null,"配置向导")]),l("tr",null,[l("td",null,[l("code",null,"--upgrade [版本]")]),l("td",null,"下载并切换到最新版本或指定版本,见第 6 节")]),l("tr",null,[l("td",null,[l("code",null,"--latest")]),l("td",null,"查看最新发布的版本")]),l("tr",null,[l("td",null,[l("code",null,"--from npm|git|<git 地址>")]),l("td",null,[i("配合 "),l("code",null,"--upgrade"),i("、"),l("code",null,"--latest"),i(":指定升级来源")])]),l("tr",null,[l("td",null,[l("code",null,"--beta")]),l("td",null,[i("配合 "),l("code",null,"--upgrade"),i("、"),l("code",null,"--latest"),i(":正式版也考虑 beta 版")])]),l("tr",null,[l("td",null,[l("code",null,"--setup"),i(" / "),l("code",null,"--use <版本>"),i(" / "),l("code",null,"--versions")]),l("td",null,[i("版本管理(即 "),l("code",null,"req setup"),i("、"),l("code",null,"req use"),i("、"),l("code",null,"req versions"),i(")")])])])]),l("h2",{id:"_4-不同-agent-的配置",tabindex:"-1"},[i("4. 不同 agent 的配置 "),l("a",{class:"header-anchor",href:"#_4-不同-agent-的配置","aria-label":'Permalink to "4. 不同 agent 的配置"'},"​")]),l("p",null,[l("strong",null,"推荐:引用 Paseo 的 agent profile。"),i(' 在 Paseo 的 设置 → 本机 → Agents → Agent profiles 中为"实现"和"评审"各建一个 profile(选好 provider、模型、免确认的模式),然后在配置中只写名称:')]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"agents"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": {")]),i(`
24
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "builder"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"paseoProfile"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"实现"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," },")]),i(`
25
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "reviewer"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"paseoProfile"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"评审"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," }")]),i(`
26
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"}")])])])]),l("p",null,[i("每次运行开始时从 Paseo 读取 profile 的设置,之后换模型只需在 Paseo 中修改 profile。写在 "),l("code",null,"paseoProfile"),i(" 旁边的字段(如 "),l("code",null,"modeId"),i("、"),l("code",null,"thinkingOptionId"),i(")优先于 profile 中的设置。名称写错时流水线不会启动,并列出现有的 profile;"),l("code",null,"/req-doctor"),i(" 也会检查。配置向导在 Paseo 中有 profile 时会先列出它们。")]),l("p",null,"也可以直接写各项设置:"),l("p",null,"每个角色的配置项:"),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"provider")]),l("td",null,[l("code",null,"<Paseo 中的 provider ID>/<模型 ID>"),i(",只在第一个 "),l("code",null,"/"),i(" 处拆分")])]),l("tr",null,[l("td",null,[l("code",null,"modeId")]),l("td",null,"agent 的模式。必须选不会停下来等待批准的模式;没有模式的 agent 不写")]),l("tr",null,[l("td",null,[l("code",null,"featureValues")]),l("td",null,"agent 的功能开关,目前只有 OpenCode 需要")]),l("tr",null,[l("td",null,[l("code",null,"thinkingOptionId")]),l("td",null,"可选,思考强度,可用值取决于 agent 和模型")])])]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"agent"),l("th",null,[l("code",null,"provider"),i(" 写法")]),l("th",null,"无人值守的设置"),l("th",null,"思考强度")])]),l("tbody",null,[l("tr",null,[l("td",null,"Claude Code"),l("td",null,[l("code",null,"claude/<模型 ID>")]),l("td",null,[l("code",null,'"modeId": "bypassPermissions"')]),l("td",null,"取决于模型")]),l("tr",null,[l("td",null,"Codex"),l("td",null,[l("code",null,"codex/<模型 ID>")]),l("td",null,[l("code",null,'"modeId": "full-access"')]),l("td",null,"取决于模型")]),l("tr",null,[l("td",null,"OpenCode"),l("td",null,[l("code",null,"opencode/<上游>/<模型 ID>")]),l("td",null,[l("code",null,'"modeId": "build"'),i(" 加 "),l("code",null,'"featureValues": { "auto_accept": true }')]),l("td",null,"取决于模型(variant)")]),l("tr",null,[l("td",null,"Pi"),l("td",null,[l("code",null,"pi/<上游>/<模型 ID>")]),l("td",null,[i("不写 "),l("code",null,"modeId"),i("(Pi 没有模式,也不请求批准)")]),l("td",null,[l("code",null,"off"),i("、"),l("code",null,"minimal"),i("、"),l("code",null,"low"),i("、"),l("code",null,"medium"),i("、"),l("code",null,"high"),i("、"),l("code",null,"xhigh"),i("、"),l("code",null,"max")])])])]),l("p",null,[i("以上来自 Paseo 0.11.2 源码,以你的 daemon 实际返回为准("),l("code",null,"npm run smoke -- check"),i(" 或 "),l("code",null,"/req-doctor"),i(")。")]),l("ul",null,[l("li",null,[l("strong",null,"Claude Code"),i(":其他模式("),l("code",null,"default"),i("、"),l("code",null,"acceptEdits"),i("、"),l("code",null,"auto"),i(")都可能停下来等待批准,"),l("code",null,"plan"),i(" 不能改文件,都不适合流水线。")]),l("li",null,[l("strong",null,"OpenCode"),i(":模型 ID 带上游前缀,如 "),l("code",null,"anthropic/..."),i("、"),l("code",null,"openai/..."),i("。模式就是 OpenCode 中定义的 primary agent,默认 "),l("code",null,"build"),i(" 可以改文件和执行命令。不开 "),l("code",null,"auto_accept"),i(" 的话,执行命令时会停下来等待批准。")]),l("li",null,[l("strong",null,"Pi"),i(":写了 "),l("code",null,"modeId"),i(" 会被 daemon 拒绝。只有装了会弹出确认的 Pi 扩展时,才可能停下来等待。")])]),l("p",null,"混用示例:"),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"agents"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": {")]),i(`
27
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "builder"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"provider"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"claude/<模型 ID>"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"modeId"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"bypassPermissions"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," },")]),i(`
28
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "reviewer"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"provider"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"opencode/openai/<模型 ID>"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"modeId"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"build"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"featureValues"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"auto_accept"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"true"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")]),i(`
29
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"}")])])])]),l("h3",{id:"作为聊天-agent-使用者对话的那一个",tabindex:"-1"},[i("作为聊天 agent(使用者对话的那一个) "),l("a",{class:"header-anchor",href:"#作为聊天-agent-使用者对话的那一个","aria-label":'Permalink to "作为聊天 agent(使用者对话的那一个)"'},"​")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"agent"),l("th",null,"读取 skill 的位置"),l("th",null,"如何触发")])]),l("tbody",null,[l("tr",null,[l("td",null,"Claude Code"),l("td",null,[l("code",null,"~/.claude/skills")]),l("td",null,[l("code",null,"/req 我想……")])]),l("tr",null,[l("td",null,"OpenCode"),l("td",null,[l("code",null,"~/.agents/skills"),i("(也读 "),l("code",null,"~/.claude/skills"),i(")")]),l("td",null,[l("code",null,"/req 我想……"),i(';命令列表中没有时直接说"用 req 帮我……"')])]),l("tr",null,[l("td",null,"Pi"),l("td",null,[l("code",null,"~/.agents/skills")]),l("td",null,[l("code",null,"/skill:req 我想……")])]),l("tr",null,[l("td",null,"Codex"),l("td",null,[l("code",null,"~/.agents/skills")]),l("td",null,'直接说"用 req 帮我……",或用 Codex 点名 skill 的方式')])])]),l("p",null,[i("聊天 agent 需要能执行命令和访问本机网络(流水线要连接 daemon)。用 Codex 做聊天 agent 时请用 "),l("code",null,"full-access"),i(" 模式。新开的对话立即可用,已经打开的对话需要新开一个。")]),l("h2",{id:"_5-冒烟测试",tabindex:"-1"},[i("5. 冒烟测试 "),l("a",{class:"header-anchor",href:"#_5-冒烟测试","aria-label":'Permalink to "5. 冒烟测试"'},"​")]),l("p",null,"编排逻辑已在模拟环境中测试过,下面四项确认的是你的真实环境。第一次安装、更换 agent、升级 Paseo 后都建议做一遍。命令在当前版本目录中运行。"),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"#"),l("th",null,"测什么"),l("th",null,"怎么测"),l("th",null,"预期")])]),l("tbody",null,[l("tr",null,[l("td",null,"1"),l("td",null,"daemon、模型和模式"),l("td",null,[i("终端运行 "),l("code",null,"npm run smoke -- check")]),l("td",null,"两个角色各启动一个小 agent,能写文件、能执行命令、不停下等权限")]),l("tr",null,[l("td",null,"2"),l("td",null,"通知回发、子 agent 挂载"),l("td",null,[i("在 Paseo 对话中让聊天 agent 执行 "),l("code",null,"npm run smoke -- notify"),i("(先 "),l("code",null,"cd"),i(" 到版本目录)")]),l("td",null,'对话中出现"通知通道工作正常";子 agent 列表出现"[冒烟测试] 子 agent"')]),l("tr",null,[l("td",null,"3"),l("td",null,"回合结束后后台进程是否存活"),l("td",null,[i("让聊天 agent 执行 "),l("code",null,"npm run smoke -- detach-start"),i(" 并结束本轮;一分钟后再让它执行 "),l("code",null,"npm run smoke -- detach-check")]),l("td",null,"显示 ✓。显示 ✗ 说明环境会终止后台进程,需要改用插件方式启动")]),l("tr",null,[l("td",null,"4"),l("td",null,"完整跑一遍"),l("td",null,[i("在一个测试项目的 worktree 对话中输入 "),l("code",null,"/req 在 README 末尾加一行版权声明")]),l("td",null,"走快速档,收到进展和完成通知;功能目录中各产物齐全;工作分支上有本地提交")])])]),l("p",null,[i("第 2、3 项依赖对话提供的 "),l("code",null,"PASEO_AGENT_ID"),i("、"),l("code",null,"PASEO_AGENT_CWD"),i(",必须在 Paseo 对话中由聊天 agent 执行。")]),l("h2",{id:"_6-升级",tabindex:"-1"},[i("6. 升级 "),l("a",{class:"header-anchor",href:"#_6-升级","aria-label":'Permalink to "6. 升级"'},"​")]),l("p",null,[l("strong",null,"一键升级。")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --check"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 只看有没有新版本")]),i(`
30
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 升级到最新版本(能支持本机 Paseo 的)")]),i(`
31
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.9.1"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 升级到指定版本")]),i(`
32
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --beta"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 当前是正式版时,也考虑 beta 版")]),i(`
33
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," versions"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 已安装的版本和 npm 上的版本")])])])]),l("ul",null,[l("li",null,[l("strong",null,"用 npm 安装的"),i("(1.7.0 起):从 npm 仓库读取已发布的版本,先读本机 Paseo daemon 的版本,跳过不支持它的 req-kit(每个版本都声明了支持的 Paseo 范围),装进 "),l("code",null,"versions/<版本>"),i(' 后切换。被跳过的版本会说明原因,例如"1.10.0 需要 Paseo >=0.12.0 <0.13.0,本机是 0.11.2"。读不到 daemon 版本时不筛选,升级后请运行 '),l("code",null,"req doctor"),i("。")]),l("li",null,[l("strong",null,"用 git 安装的"),i(":读取 git 标签,下载到 "),l("code",null,"versions/<版本>"),i(",执行 "),l("code",null,"npm install"),i(",再切换。公司网络只能访问内网镜像时,用 "),l("code",null,"--from <镜像地址>"),i(" 或环境变量 "),l("code",null,"REQ_KIT_REPO_URL"),i(" 指定。想改用 npm 升级时加 "),l("code",null,"--from npm"),i("。")]),l("li",null,"当前是正式版时只升级到正式版;当前是 beta 时也会升级到更新的 beta。任何一步失败,当前版本不受影响。"),l("li",null,[i("也可以按 Paseo 版本直接安装管理器:"),l("code",null,"npm i -g paseo-req-kit@paseo-0.11"),i("(每个支持的 Paseo 小版本有一个这样的标签)。")])]),l("p",null,"升级前后建议:"),l("ol",null,[l("li",null,[i("阅读 "),l("code",null,"CHANGELOG.md"),i(' 中两个版本之间的"升级须知"(升级完成时会给出新版本的 CHANGELOG 位置)。')]),l("li",null,[i("运行 "),l("code",null,"req doctor --no-project"),i(",确认当前状态正常。正在运行的流水线不用停,见下表。")]),l("li",null,"升级后至少跑冒烟测试第 1 项;升级须知提到通知、后台进程或启动方式有变化时,再跑第 2、3 项;主版本升级跑全部四项。"),l("li",null,'把"使用者会看到的变化"转给使用者,提醒新需求请开新对话。')]),l("p",null,[l("strong",null,"手工升级"),i("(1.2 及更早的版本还没有 "),l("code",null,"--upgrade"),i(",从它们升级时用这种方式;或者不方便访问 GitHub 时)。以从 1.0.0 升到 1.1.0 为例,先完成上面的第 1、2 项,然后把新版本放进新的版本目录,安装依赖并启用:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"git"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," clone"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --branch"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.1.0"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --depth"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," https://github.com/yiyisf/paseo-req-kit"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.1.0")]),i(`
34
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"cd"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.1.0")]),i(`
35
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npm"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")]),i(`
36
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs")])])])]),l("p",null,"PowerShell:"),l("div",{class:"language-powershell vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"powershell"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"git clone "),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"--"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"branch "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1.1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"."),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"0"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}}," --"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"depth "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," https:"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"//"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"github.com"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"yiyisf"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"paseo"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"req"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"kit "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"$"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"env:"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"USERPROFILE"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'\\tools\\req-kit\\versions\\1.1.0"')]),i(`
37
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"cd "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"$"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"env:"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"USERPROFILE"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'\\tools\\req-kit\\versions\\1.1.0"')]),i(`
38
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"npm install")]),i(`
39
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"node install.mjs")])])])]),l("p",null,"之后同样完成上面的第 3、4 项。"),l("p",null,[i("安装器替换各 agent 目录中带标记的 skill,把路径指向新版本,删除新版本不再包含的旧 skill,并更新启用记录。不会动:"),l("code",null,"~/.req-kit/"),i(" 下的配置和提示词覆盖、各项目仓库中的文件、不是 req-kit 安装的 skill。")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"升级时的状态"),l("th",null,"会发生什么")])]),l("tbody",null,[l("tr",null,[l("td",null,"还在聊天对齐阶段"),l("td",null,"对话已加载的是旧版 skill,继续使用即可;启动的是新版引擎")]),l("tr",null,[l("td",null,"流水线正在运行"),l("td",null,"进程已载入旧版代码,旧版本目录仍在,按旧版跑完")]),l("tr",null,[l("td",null,"已暂停、失败或等待需求方决定"),l("td",null,[i("继续时由新版引擎读取;状态格式有变化时自动迁移,原文件备份为 "),l("code",null,"state.json.bak-v<旧版本>")])]),l("tr",null,[l("td",null,"已完成"),l("td",null,"不受影响")])])]),l("h2",{id:"_7-回滚",tabindex:"-1"},[i("7. 回滚 "),l("a",{class:"header-anchor",href:"#_7-回滚","aria-label":'Permalink to "7. 回滚"'},"​")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," use"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.6.0"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 切换到已安装的旧版本")])])])]),l("p",null,[i("不用 "),l("code",null,"req"),i(" 时,在旧版本目录中重新运行安装器也一样(npm 安装的版本在 "),l("code",null,"versions/<版本>/node_modules/paseo-req-kit"),i(" 中):")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"cd"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.0.0")]),i(`
40
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs")])])])]),l("p",null,[i("这会把 skill 和引擎路径改回 1.0.0,配置不变。如果某个功能目录的状态文件已被新版迁移,旧版引擎会拒绝继续并提示:把 "),l("code",null,"state.json.bak-v<旧版本>"),i(" 恢复为 "),l("code",null,"state.json"),i(",或者用 "),l("code",null,"--restart"),i(" 从头开始。")]),l("p",null,[i("旧版本目录建议保留到新版本稳定运行一周以上、且没有由它启动的流水线仍在运行。"),l("code",null,"node install.mjs --prune"),i(" 会列出可以删除的旧版本。")]),l("h2",{id:"_8-从脚本版-paseo-requirement-workflow-迁移",tabindex:"-1"},[i("8. 从脚本版(paseo-requirement-workflow)迁移 "),l("a",{class:"header-anchor",href:"#_8-从脚本版-paseo-requirement-workflow-迁移","aria-label":'Permalink to "8. 从脚本版(paseo-requirement-workflow)迁移"'},"​")]),l("p",null,[i("适用于已经装了 "),l("code",null,"~/tools/requirement-pipeline"),i(" 和 "),l("code",null,"/requirement-kickoff"),i(" 的机器。")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"对象"),l("th",null,"脚本版"),l("th",null,"req-kit"),l("th",null,"迁移方式")])]),l("tbody",null,[l("tr",null,[l("td",null,"入口"),l("td",null,[l("code",null,"/requirement-kickoff")]),l("td",null,[l("code",null,"/req")]),l("td",null,[i("安装器替换旧的 skill;1.x 期间保留同名的引导入口,提示改用 "),l("code",null,"/req"),i(" 并转交")])]),l("tr",null,[l("td",null,"本机配置"),l("td",null,[l("code",null,"~/tools/requirement-pipeline/pipeline.config.json")]),l("td",null,[l("code",null,"~/.req-kit/config.json")]),l("td",null,[l("code",null,"node install.mjs --import-legacy ~/tools/requirement-pipeline"),i(",同时导入 "),l("code",null,"prompts.local/"),i(";顶层 "),l("code",null,"rounds"),i(" 继续有效")])]),l("tr",null,[l("td",null,"项目配置"),l("td",null,[l("code",null,".requirement-pipeline.json"),i("、"),l("code",null,".requirement-pipeline/")]),l("td",null,"同名同位置"),l("td",null,"无需迁移")]),l("tr",null,[l("td",null,"功能目录"),l("td",null,[l("code",null,"docs/features/<日期>-<名称>/")]),l("td",null,"同左"),l("td",null,[i("无需迁移;没有 "),l("code",null,"version"),i(" 字段的状态文件按第 1 版读取")])]),l("tr",null,[l("td",null,"术语文件"),l("td",null,[l("code",null,"CONTEXT.md")]),l("td",null,[l("code",null,"GLOSSARY.md")]),l("td",null,[i("继续读取 "),l("code",null,"CONTEXT.md"),i(",新术语写入 "),l("code",null,"GLOSSARY.md")])]),l("tr",null,[l("td",null,"依赖的外部 skill"),l("td",null,[l("code",null,"grilling"),i("、"),l("code",null,"domain-modeling")]),l("td",null,"不再需要"),l("td",null,"可以保留,也可以自行卸载")])])]),l("p",null,"建议顺序:"),l("ol",null,[l("li",null,"等脚本版启动的流水线跑完(或记下它们,迁移后用新版续跑)。"),l("li",null,[i("按第 3 节取得程序并 "),l("code",null,"npm install"),i(",然后运行 "),l("code",null,"node install.mjs --import-legacy ~/tools/requirement-pipeline"),i("。")]),l("li",null,"跑冒烟测试第 1–3 项。"),l("li",null,[i("告诉使用者入口改为 "),l("code",null,"/req"),i("。")]),l("li",null,[i("一周后删除 "),l("code",null,"~/tools/requirement-pipeline"),i("。")])]),l("h2",{id:"_9-paseo-或-agent-升级之后",tabindex:"-1"},[i("9. Paseo 或 agent 升级之后 "),l("a",{class:"header-anchor",href:"#_9-paseo-或-agent-升级之后","aria-label":'Permalink to "9. Paseo 或 agent 升级之后"'},"​")]),l("p",null,[i("运行 "),l("code",null,"/req-doctor"),i("(或 "),l("code",null,"node bin/req-doctor.mjs"),i("),确认 SDK 版本在支持范围内、配置中的模型和模式仍然存在;然后跑冒烟测试第 1–3 项。有失败时,先看 req-kit 是否已有适配的新版本;没有的话,把输出反馈给维护者,并暂时回退 Paseo 或 agent 的版本。")]),l("h2",{id:"_10-卸载",tabindex:"-1"},[i("10. 卸载 "),l("a",{class:"header-anchor",href:"#_10-卸载","aria-label":'Permalink to "10. 卸载"'},"​")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"<"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},"当前版"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"本"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},">"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},"/install.mjs"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --uninstall")])])])]),l("p",null,[i("这会删除 req-kit 安装的 skill 和 "),l("code",null,"req"),i(" 命令。确认不再使用后,再手工删除 "),l("code",null,"~/tools/req-kit"),i(" 和 "),l("code",null,"~/.req-kit"),i("。各项目中的配置文件和功能目录保留,它们本身就是文档。")]),l("h2",{id:"_11-安全提示",tabindex:"-1"},[i("11. 安全提示 "),l("a",{class:"header-anchor",href:"#_11-安全提示","aria-label":'Permalink to "11. 安全提示"'},"​")]),l("ul",null,[l("li",null,"步骤 agent 以免确认模式运行,可以在本机执行命令。仓库和本机环境变量中不要放生产凭据;最好用专门的开发机或虚拟机运行 daemon。"),l("li",null,"流水线只做本地提交,合并和上线始终由人决定。")]),l("h2",{id:"_12-接入企业内部-im-可选",tabindex:"-1"},[i("12. 接入企业内部 IM(可选) "),l("a",{class:"header-anchor",href:"#_12-接入企业内部-im-可选","aria-label":'Permalink to "12. 接入企业内部 IM(可选)"'},"​")]),l("p",null,'流水线默认只把消息发回发起的对话。希望"需要你决定""开发中断""已完成"等时刻在企业 IM 中也收到时,需要自己实现一个通知模块(req-kit 不内置任何 IM):'),l("ol",null,[l("li",null,[l("p",null,[i("把安装目录中的 "),l("code",null,"notifiers/im-template.mjs"),i(" 复制到 "),l("code",null,"~/.req-kit/notifiers/im.mjs"),i(",按其中的 TODO 实现发送(通常是向 IM 的机器人 webhook 发一个 HTTP 请求)。口令放在环境变量中,不要写进文件。")])]),l("li",null,[l("p",null,[i("在 "),l("code",null,"~/.req-kit/config.json"),i("(或团队配置)中加上:")]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"notifiers"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": [")]),i(`
41
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"module"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"~/.req-kit/notifiers/im.mjs"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"events"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": ["),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"blocked"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"failed"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"completed"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"], "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"options"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"webhook"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"https://…"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")]),i(`
42
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"]")])])])])]),l("li",null,[l("p",null,[i("运行 "),l("code",null,"req notify-test"),i("(可加 "),l("code",null,"--type blocked"),i(" 等)发一条测试消息。")])])]),l("p",null,[i("事件的类型和字段见 "),l("a",{href:"./../reference/contracts/notifier-event"},"contracts/notifier-event.md"),i("。通知失败只记日志,不影响流水线。项目配置("),l("code",null,".requirement-pipeline.json"),i(")中的 "),l("code",null,"notifiers"),i(" 会被忽略。")]),l("h2",{id:"_13-paseo-插件-可选",tabindex:"-1"},[i("13. Paseo 插件(可选) "),l("a",{class:"header-anchor",href:"#_13-paseo-插件-可选","aria-label":'Permalink to "13. Paseo 插件(可选)"'},"​")]),l("p",null,"1.9 起,req-kit 附带一个 Paseo 插件,把需求搬进 Paseo 的界面(网页端、桌面版、手机都能用):"),l("ul",null,[l("li",null,'侧边栏的"需求":本机所有项目的需求,按"需要你处理、进行中、待测试验证、最近完成"分组,带待处理的数量。'),l("li",null,"需求详情:每一步的状态、用时和结论(点开即进入那个步骤的 agent)、质量门、联合需求的各仓库、用量;可以读需求说明、方案、确认预览、提测说明、完成报告等文档。"),l("li",null,[i("管理操作:确认方案、停止、继续、开始测试验证。每个操作都要再确认一次,做的事和终端里的 "),l("code",null,"req approve"),i("、"),l("code",null,"req stop"),i("、"),l("code",null,"req resume"),i("、"),l("code",null,"req verify"),i(" 完全一样,流水线本身不受插件影响。")]),l("li",null,[i('每个工作区头部的"需求"按钮和面板、步骤 agent 输入框旁的"需求"按钮、使用统计(同 '),l("code",null,"req stats"),i('),以及 Ctrl+K(macOS 为 ⌘K)中的"需求总览"。')])]),l("p",null,[l("strong",null,"安装"),i(":在运行 Paseo daemon 的机器上运行")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," plugin"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")])])])]),l("p",null,[i("它把当前版本的插件复制到 "),l("code",null,"~/.req-kit/paseo-plugin"),i(",再用 Paseo 的命令行安装。Paseo 的插件总开关("),l("code",null,"pluginsEnabled"),i(")默认是关着的:插件是不受沙箱限制的代码,后台部分可以访问这台机器上的文件和进程,所以打开前会先问你("),l("code",null,"--yes"),i(" 表示同意)。req-kit 插件只运行本机的 "),l("code",null,"req api"),i(",不连接任何外部服务。一键安装脚本在最后也会问一次是否安装("),l("code",null,"--with-plugin"),i(" 直接安装,"),l("code",null,"--no-plugin"),i(" 不问)。")]),l("p",null,[i("没有 "),l("code",null,"paseo"),i(" 命令时(例如只用桌面版 Paseo),在 Paseo 的 设置 → Plugins 中打开 Enable plugins,再在 Plugin source 中填 "),l("code",null,"~/.req-kit/paseo-plugin"),i(" 的完整路径(运行 "),l("code",null,"req plugin install"),i(" 会准备好这个目录并显示路径)。")]),l("p",null,[l("strong",null,"更新"),i(":不用单独做。"),l("code",null,"req setup"),i("、"),l("code",null,"req upgrade"),i("、"),l("code",null,"req use"),i(" 启用一个版本时,如果装过插件,会把插件文件换成这个版本的并让 Paseo 重新加载,插件总是和启用的 req-kit 版本一致。")]),l("p",null,[l("strong",null,"只读"),i(':网页端会给只看不操作的人用时,在 Paseo 的 设置 → Plugins → req-kit 中打开"只读":不再显示管理操作,插件的后台也会拒绝它们。能连上这台 daemon 的人都能看到插件,Paseo 的插件没有按用户区分的权限。')]),l("p",null,[l("strong",null,"其他"),i(":"),l("code",null,"req plugin status"),i(" 看插件是否在运行;"),l("code",null,"req plugin remove"),i(" 从 Paseo 移除(不改插件总开关)。插件需要 req-kit 1.9 和 Paseo 0.11。1.9 之前运行过的需求要先在项目目录运行一次 "),l("code",null,"req index --rebuild"),i(" 才会出现在插件里。插件出问题时:"),l("code",null,"paseo plugin logs req-kit"),i("。")])],-1),l("p",{class:"source-note"},[i("本页由仓库中的 "),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/docs/guide/安装与升级.md"},"docs/guide/安装与升级.md"),i(" 生成。"),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/edit/main/docs/guide/安装与升级.md"},"在 GitHub 上编辑")],-1)])])}const g=e(a,[["render",d]]);export{c as __pageData,g as default};
@@ -0,0 +1,42 @@
1
+ import{_ as e,o as n,c as t,j as l,a as i}from"./chunks/framework.B9qR_F1m.js";const c=JSON.parse('{"title":"安装与升级","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"guide/install.md","filePath":"guide/install.md","lastUpdated":null}'),a={name:"guide/install.md"};function d(h,s,u,o,k,r){return n(),t("div",null,[...s[0]||(s[0]=[l("div",null,[l("h1",{id:"安装与升级",tabindex:"-1"},[i("安装与升级 "),l("a",{class:"header-anchor",href:"#安装与升级","aria-label":'Permalink to "安装与升级"'},"​")]),l("p",null,[i("本文面向负责安装的人:通常是开发同事,有经验的测试或产品同事也可以按步骤完成。安装在"),l("strong",null,"运行 Paseo daemon 的那台机器"),i("上做一次,之后这台机器上所有项目的 Paseo 对话都能使用 "),l("code",null,"/req"),i("。")]),l("h2",{id:"_1-安装布局",tabindex:"-1"},[i("1. 安装布局 "),l("a",{class:"header-anchor",href:"#_1-安装布局","aria-label":'Permalink to "1. 安装布局"'},"​")]),l("p",null,"程序和本机配置分开存放。升级时只替换程序,配置不动;旧版本目录保留,可以随时回滚。"),l("div",{class:"language-text vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"text"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",null,"<npm 全局目录>/paseo-req-kit/ 版本管理器(npm i -g 安装,提供 req 命令)")]),i(`
2
+ `),l("span",{class:"line"},[l("span",null,"~/tools/req-kit/versions/")]),i(`
3
+ `),l("span",{class:"line"},[l("span",null,"├── 1.7.0/node_modules/paseo-req-kit/ 一个版本的程序(npm 安装;依赖在 1.7.0/node_modules 下)")]),i(`
4
+ `),l("span",{class:"line"},[l("span",null,"├── 1.6.0/ git 方式安装的版本(含 node_modules),继续可用")]),i(`
5
+ `),l("span",{class:"line"},[l("span",null,"└── … 各版本并存,随时切换")]),i(`
6
+ `),l("span",{class:"line"},[l("span",null,"~/.req-kit/")]),i(`
7
+ `),l("span",{class:"line"},[l("span",null,"├── config.json 本机配置")]),i(`
8
+ `),l("span",{class:"line"},[l("span",null,"├── prompts.local/ 本机提示词覆盖(可选)")]),i(`
9
+ `),l("span",{class:"line"},[l("span",null,"├── active.json 当前启用的版本")]),i(`
10
+ `),l("span",{class:"line"},[l("span",null,"├── bin/req、req.cmd req 命令,指向当前启用的版本")]),i(`
11
+ `),l("span",{class:"line"},[l("span",null,"├── notifiers/ 外部通知模块(可选,自己实现,见第 12 节)")]),i(`
12
+ `),l("span",{class:"line"},[l("span",null,"└── install-log/ 安装、升级、回滚记录")]),i(`
13
+ `),l("span",{class:"line"},[l("span",null,"~/.agents/skills/… 安装器复制的 skill(Codex、Pi、OpenCode 等读取)")]),i(`
14
+ `),l("span",{class:"line"},[l("span",null,"~/.claude/skills/… 同上(Claude Code;~/.claude 存在时)")])])])]),l("p",null,[i("Windows 上 "),l("code",null,"~"),i(" 即 "),l("code",null,"%USERPROFILE%"),i("(如 "),l("code",null,"D:\\Users\\<用户名>"),i(")。安装器不使用符号链接,不需要管理员权限。环境变量 "),l("code",null,"REQ_KIT_HOME"),i(" 可以把 "),l("code",null,"~/.req-kit"),i(" 换到别的位置。")]),l("h2",{id:"_2-前置条件",tabindex:"-1"},[i("2. 前置条件 "),l("a",{class:"header-anchor",href:"#_2-前置条件","aria-label":'Permalink to "2. 前置条件"'},"​")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"项目"),l("th",null,"要求"),l("th",null,"如何确认")])]),l("tbody",null,[l("tr",null,[l("td",null,"Paseo"),l("td",null,"0.11,daemon 在运行(一键安装会在没有时安装 Paseo 命令行并启动)"),l("td",null,[i("Paseo 桌面端能正常对话,或浏览器打开 "),l("code",null,"http://localhost:6767/"),i(";默认地址 "),l("code",null,"ws://127.0.0.1:6767/ws")])]),l("tr",null,[l("td",null,"Node.js"),l("td",null,"22 或更新"),l("td",null,[l("code",null,"node -v")])]),l("tr",null,[l("td",null,"npm"),l("td",null,[i("Node.js 自带;公司网络需配置镜像("),l("code",null,"npm config get registry"),i(")")]),l("td",null,[l("code",null,"npm -v")])]),l("tr",null,[l("td",null,"git"),l("td",null,"近期版本(只有 git 方式安装时需要)"),l("td",null,[l("code",null,"git --version")])]),l("tr",null,[l("td",null,"agent"),l("td",null,"Claude Code、Codex、OpenCode、Pi 至少一种,已在 Paseo 中登录"),l("td",null,"在 Paseo 中用它开一个对话")]),l("tr",null,[l("td",null,"网络"),l("td",null,'能访问 npm 源(公共的,或公司镜像;内网见第 3 节"公司内网")'),l("td",null,[l("code",null,"npm ping")])]),l("tr",null,[l("td",null,"daemon 密码"),l("td",null,[i("daemon 设了密码时,放在环境变量中(默认 "),l("code",null,"PASEO_DAEMON_PASSWORD"),i(")")]),l("td",null,"未设密码可跳过")]),l("tr",null,[l("td",null,"Paseo 工具和浏览器(可选)"),l("td",null,[i("设置 → 本机 → Agents 打开 "),l("strong",null,"Enable Paseo tools"),i(",并开启浏览器工具:步骤 agent 可以重启 Paseo 管理的服务、用内置浏览器验证网页(需要桌面端在线)")]),l("td",null,[l("code",null,"/req-doctor"),i(' 的"Paseo daemon"一节')])]),l("tr",null,[l("td",null,"Agent profiles(推荐)"),l("td",null,'设置 → 本机 → Agents → Agent profiles 中建好"实现""评审"等 profile,配置中引用,见第 4 节'),l("td",null,[l("code",null,"/req-doctor")])])])]),l("h2",{id:"_3-首次安装",tabindex:"-1"},[i("3. 首次安装 "),l("a",{class:"header-anchor",href:"#_3-首次安装","aria-label":'Permalink to "3. 首次安装"'},"​")]),l("p",null,[l("strong",null,"推荐:一键安装。"),i(" 一条命令完成检查环境、安装、启用、安装 skill 和配置 agent,再次运行即升级:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# 任何系统(1.13 起;只需要 Node.js 22+ 和能访问的 npm 源)")]),i(`
15
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npx"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -y"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," paseo-req-kit@latest"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")])])])]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# macOS、Linux、Windows 的 Git Bash 或 WSL")]),i(`
16
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"curl"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -fsSL"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," https://paseo-req-kit.vercel.app/install.sh"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}}," |"),l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}}," sh")])])])]),l("div",{class:"language-powershell vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"powershell"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# Windows PowerShell(不受脚本执行策略限制)")]),i(`
17
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"irm https:"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"//"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"paseo"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"req"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"kit.vercel.app"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"install.ps1 "),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"|"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," iex")])])])]),l("p",null,[i("几种写法做的事情一样:1.13 起安装脚本只是选好版本(npm 上有就用 npm 的,没有时用 GitHub Release 的安装包),再运行那个版本自带的安装命令 "),l("code",null,"req install"),i("("),l("code",null,"bin/bootstrap.mjs"),i("),也就是 "),l("code",null,"npx … install"),i(" 运行的那一个。指定版本或 beta 版:"),l("code",null,"npx -y paseo-req-kit@1.13.0 install"),i("、"),l("code",null,"npx -y paseo-req-kit@beta install"),i("。")]),l("p",null,[i('依次:检查 Node.js 22+、npm、git;确定 npm 源(见下面的"公司内网");从 npm 安装 '),l("code",null,"paseo-req-kit"),i(",npm 上没有时改用 GitHub Release 的安装包;npm 全局目录不可写时装到 "),l("code",null,"~/.req-kit/npm"),i("(不需要 sudo);"),l("strong",null,"检查 Paseo"),i("(见下);运行 "),l("code",null,"req setup"),i(";本机配置还没填时运行 "),l("code",null,"req configure --auto"),i("(1.12:不提问,按推荐选好已登录的 agent:两个不同厂商的分别做 builder 和 reviewer,再选一个做备用模型,都用免确认模式;自动选不了时改为逐项选择);最后提示把 "),l("code",null,"req"),i(" 加入 PATH(如需要)。选项:"),l("code",null,"req install"),i(" / "),l("code",null,"npx … install"),i(" 后面写 "),l("code",null,"--registry <地址>"),i("、"),l("code",null,"--no-save-registry"),i("、"),l("code",null,"--no-configure"),i("、"),l("code",null,"--skip-paseo"),i("、"),l("code",null,"--with-plugin"),i("、"),l("code",null,"--no-plugin"),i(";"),l("code",null,"install.sh"),i(" 写在 "),l("code",null,"sh -s --"),i(" 之后(另有 "),l("code",null,"--beta"),i("、"),l("code",null,"--version <版本>"),i("、"),l("code",null,"--from npm|release"),i(");"),l("code",null,"install.ps1"),i(" 用变量("),l("code",null,"$ReqKitBeta = $true; irm … | iex"),i(",还有 "),l("code",null,"$ReqKitVersion"),i("、"),l("code",null,"$ReqKitFrom"),i("、"),l("code",null,"$ReqKitRegistry"),i("、"),l("code",null,"$ReqKitNoSaveRegistry"),i("、"),l("code",null,"$ReqKitNoConfigure"),i("、"),l("code",null,"$ReqKitSkipPaseo"),i("、"),l("code",null,"$ReqKitPlugin"),i(")。")]),l("p",null,[l("strong",null,"公司内网(只有 npm 镜像,打不开 GitHub 和文档站点)。"),i(" 不需要任何站点,用 npx 加上镜像地址:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npx"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -y"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --registry=https://npm.example.internal/"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," paseo-req-kit@latest"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")])])])]),l("ul",null,[l("li",null,[i("镜像地址会"),l("strong",null,"保存为本机的 npm 源"),i("("),l("code",null,"npm config set registry"),i(",屏幕上会写出原来的值),以后 "),l("code",null,"req upgrade"),i("、"),l("code",null,"req versions"),i(" 和安装 Paseo 命令行都从镜像取。只想这一次用镜像时加 "),l("code",null,"--no-save-registry"),i("。本机原本就配好了镜像时不用写 "),l("code",null,"--registry"),i("。")]),l("li",null,[i("镜像上还没有这个版本(镜像同步有延迟)时会直接说明,不会去访问 GitHub;稍后再运行,或请管理镜像的同事手动同步 "),l("code",null,"paseo-req-kit"),i("。")]),l("li",null,[i("文档:装好后运行 "),l("code",null,"req docs"),i(",在本机打开和这个版本一致的文档站点(发布时构建进 npm 包,不需要外网)。")]),l("li",null,'只支持 npm 方式安装和升级;git 方式(下面的"用 git 安装")要能访问 GitHub。'),l("li",null,[i("第一次在内网机器上安装 Paseo 命令行时请留意输出:它依赖的个别组件(例如 "),l("code",null,"node-pty"),i(")在镜像里没有对应平台的预编译包时会尝试现场编译,需要能下载 Node.js 头文件(可以在 "),l("code",null,".npmrc"),i(" 中设置 "),l("code",null,"disturl"),i(" 指向公司镜像)。桌面版 Paseo 的自动更新走 GitHub,内网需另行分发安装包。")])]),l("p",null,"检查 Paseo 这一步:"),l("ul",null,[l("li",null,[l("strong",null,[i("有 "),l("code",null,"paseo"),i(" 命令")]),i(":核对它的版本是否在这个 req-kit 支持的范围内(不在时提醒,不替换);开启 daemon 自带的网页界面("),l("code",null,"paseo daemon config set features.webUi.enabled true"),i(");daemon 没在运行就 "),l("code",null,"paseo daemon start"),i("。daemon 已在运行而网页界面是刚开启的,只提示 "),l("code",null,"paseo daemon restart"),i(",不自动重启——重启会中断正在运行的 agent。")]),l("li",null,[l("strong",null,[i("没有 "),l("code",null,"paseo"),i(" 命令,但 daemon 在运行")]),i(":通常是桌面版 Paseo 管理的 daemon,什么都不装;需要网页界面时在桌面版中开启。")]),l("li",null,[l("strong",null,"都没有(新机器)"),i(":用 npm 安装与 req-kit 匹配的 Paseo 命令行(例如 "),l("code",null,"@getpaseo/cli@~0.11.0"),i("),开启网页界面,启动 daemon。之后在浏览器打开 "),l("code",null,"http://localhost:6767/"),i(" 就能用 Paseo 对话。")]),l("li",null,[i("最后检查有没有 agent 命令行(Claude Code、Codex、OpenCode、Pi、Copilot),一个都没有时提醒:至少装一个并登录,再运行 "),l("code",null,"req configure"),i("。")])]),l("p",null,[i("不想让脚本动 Paseo(例如由别人统一管理)时加 "),l("code",null,"--skip-paseo"),i("。完成后接着做下面的"),l("strong",null,"第四步"),i("到"),l("strong",null,"第六步"),i("。")]),l("p",null,[l("strong",null,"也可以用 npm 安装(1.7.0 起)。"),i(" 一键安装做的就是这几条命令,Windows 上 "),l("code",null,"req"),i(" 命令由 npm 放进 PATH,不用自己设置:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npm"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," i"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," -g"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," paseo-req-kit"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # beta 版:npm i -g paseo-req-kit@beta")]),i(`
18
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," setup"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 装进 ~/tools/req-kit/versions/<版本>,安装 skill,生成本机配置")]),i(`
19
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," configure"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 配置向导:选 builder、reviewer 和备用模型用的 agent")]),i(`
20
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," configure"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --auto"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 不提问,按推荐选好(也可以在 Paseo 的 设置 → 插件 → req-kit → 模型 中修改)")]),i(`
21
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," doctor"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --no-project"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 体检")])])])]),l("p",null,[i("全局安装的包是版本管理器:"),l("code",null,"req setup"),i(" 把这个版本装进 "),l("code",null,"versions/<版本>"),i(",之后 "),l("code",null,"req upgrade"),i(" 安装新版本、"),l("code",null,"req use <版本>"),i(" 切换,各版本并存,正在运行的流水线不受影响。其他 "),l("code",null,"req"),i(" 命令都转交给当前启用的版本。公司网络使用 npm 镜像或私有仓库时,按平常的方式配置 "),l("code",null,".npmrc"),i(" 即可。")]),l("p",null,[i("完全离线时,用 GitHub Release 上附带的安装包:"),l("code",null,"npm i -g ./paseo-req-kit-<版本>.tgz"),i(",再 "),l("code",null,"req setup"),i("(依赖需要能从本机 npm 缓存或镜像取得)。")]),l("p",null,[i("还没有发布到 npm 的版本(或 npm 上取不到时),也可以直接用 Release 上安装包的地址:"),l("code",null,"npm i -g https://github.com/yiyisf/paseo-req-kit/releases/download/<版本>/paseo-req-kit-<版本>.tgz"),i(",再 "),l("code",null,"req setup"),i("。")]),l("p",null,[i("之后接着做下面的"),l("strong",null,"第三步"),i("到"),l("strong",null,"第六步"),i("(配置 agent、体检和冒烟测试、接入项目、使用者上手)。")]),l("p",null,[l("strong",null,"其他方式:用 git 安装。"),i(" 不方便用 npm 全局安装时,可以把版本放进它自己的目录:")]),l("p",null,[l("strong",null,"第一步:取得程序。"),i(" 把要安装的版本放进它自己的版本目录:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"git"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," clone"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --branch"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.9.1"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --depth"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," https://github.com/yiyisf/paseo-req-kit"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.9.1")])])])]),l("p",null,"Windows PowerShell:"),l("div",{class:"language-powershell vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"powershell"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"git clone "),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"--"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"branch "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1.9"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"."),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}}," --"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"depth "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," https:"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"//"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"github.com"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"yiyisf"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"paseo"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"req"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"kit "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"$"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"env:"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"USERPROFILE"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'\\tools\\req-kit\\versions\\1.9.1"')])])])]),l("p",null,[l("strong",null,"第二步:安装依赖并启用。")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"cd"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.9.1")]),i(`
22
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npm"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")]),i(`
23
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs")])])])]),l("p",null,[l("code",null,"install.mjs"),i(" 会:检查 Node.js 和依赖;"),l("code",null,"~/.req-kit/config.json"),i(" 不存在时从示例生成一份;把 "),l("code",null,"skills/"),i(" 下的全部 skill 复制到各 agent 的 skill 目录,并把其中的路径替换为这个版本目录的绝对路径;在每个 skill 目录写入标记文件 "),l("code",null,".req-kit-install.json"),i(";记录当前启用的版本;在 "),l("code",null,"~/.req-kit/bin"),i(" 写入 "),l("code",null,"req"),i(" 命令。同名目录已存在但不是 req-kit 装的,不会覆盖,除非加 "),l("code",null,"--force"),i("。")]),l("p",null,[l("strong",null,"第三步:配置 agent。"),i(" 为 "),l("code",null,"builder"),i("(方案设计、实现、修复、报告)和 "),l("code",null,"reviewer"),i("(方案审核、代码评审、功能验证)各选一个 agent。推荐用配置向导(Paseo 需要在运行):")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --configure")])])])]),l("p",null,[i("它会列出 daemon 上已登录可用的 agent 和模型,自动选择不会停下来等待批准的模式,问几个选择题(直接回车选推荐项),确认后写入 "),l("code",null,"~/.req-kit/config.json"),i("(原文件备份),其他设置保持不变。也可以手工编辑,写法见第 4 节;不确定模型 ID 时运行 "),l("code",null,"npm run smoke -- check"),i(" 查看可用的值。配好后再运行一次 "),l("code",null,"node install.mjs"),i(",全部 ✓ 即完成。")]),l("p",null,[l("strong",null,[l("code",null,"req"),i(" 命令(可选)。")]),i(" 安装输出会给出把 "),l("code",null,"~/.req-kit/bin"),i(" 加入 PATH 的命令,执行一次后,新开的终端中可以直接用 "),l("code",null,"req"),i(":")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"命令"),l("th",null,"作用")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"req list")]),l("td",null,"列出当前项目的所有需求和阶段")]),l("tr",null,[l("td",null,[l("code",null,"req status [需求]")]),l("td",null,"查看进度;只有一个需求运行过时可以不写")]),l("tr",null,[l("td",null,[l("code",null,"req stop <需求>"),i(" / "),l("code",null,"req resume <需求>")]),l("td",null,"停止 / 继续")]),l("tr",null,[l("td",null,[l("code",null,"req doctor")]),l("td",null,"体检")]),l("tr",null,[l("td",null,[l("code",null,"req docs")]),l("td",null,"在本机打开这个版本的文档站点(1.13 起,不需要外网)")]),l("tr",null,[l("td",null,[l("code",null,"req configure")]),l("td",null,"配置向导")]),l("tr",null,[l("td",null,[l("code",null,"req upgrade")]),l("td",null,"升级到最新版本")]),l("tr",null,[l("td",null,[l("code",null,"req notify-test")]),l("td",null,"给外部通知发测试消息")]),l("tr",null,[l("td",null,[l("code",null,"req digest")]),l("td",null,[i("项目的需求总览;"),l("code",null,"--notify"),i(" 发到外部通知,"),l("code",null,'--schedule "0 9 * * 1"'),i(" 每周一 9 点自动发送")])]),l("tr",null,[l("td",null,[l("code",null,"req stats")]),l("td",null,[i("本机的使用统计;"),l("code",null,"--report --month 2026-10"),i(" 生成汇报用的文件,"),l("code",null,"--export"),i(" / "),l("code",null,"--merge"),i(" 汇总多台机器")])]),l("tr",null,[l("td",null,[l("code",null,"req sync <需求>"),i(" / "),l("code",null,"req integration test [需求]")]),l("td",null,[i("外部系统对接:补发和试运行(见 "),l("a",{href:"./project"},"项目定制与运行规则"),i(' 的"外部系统对接")')])]),l("tr",null,[l("td",null,[l("code",null,"req index --rebuild")]),l("td",null,"把 1.9 之前运行过的需求登记进本机的需求索引(Paseo 插件据此列出所有需求)")])])]),l("p",null,[l("code",null,"<需求>"),i(" 可以只写名称中能唯一确定的一部分,如 "),l("code",null,"sms-login"),i("。"),l("code",null,"req help"),i(" 查看全部。不加 PATH 也可以用完整路径 "),l("code",null,"~/.req-kit/bin/req"),i("(Windows 为 "),l("code",null,"%USERPROFILE%\\.req-kit\\bin\\req.cmd"),i(")。")]),l("p",null,[i("团队有统一配置时(统一的模型、评审小组、超时、要求的 req-kit 版本),把团队配置仓库克隆到本机,在本机配置中加上 "),l("code",null,'"teamConfig": "<团队配置文件的路径>"'),i("(绝对路径,或相对 "),l("code",null,"~/.req-kit/"),i(" 的路径)。团队配置不能设置 daemon 地址和密码。详见 "),l("a",{href:"./project"},"项目定制与运行规则"),i(' 的"团队配置"。')]),l("p",null,[l("strong",null,"第四步:体检和冒烟测试。"),i(" 先运行:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," bin/req-doctor.mjs"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --no-project")])])])]),l("p",null,"然后按第 5 节做冒烟测试。"),l("p",null,[l("strong",null,"第五步:接入项目(每个项目一次,推荐)。"),i(" 在项目主目录、主分支上开一个 Paseo 对话,输入 "),l("code",null,"/req-setup"),i("。它会读项目、只问读不出来的事、实际运行验证命令,生成 "),l("code",null,".requirement-pipeline/project-notes.md"),i("(项目约定)和 "),l("code",null,".requirement-pipeline/verify.md"),i("(验证方法),确认后提交。详见 "),l("a",{href:"./project"},"项目定制与运行规则"),i("。")]),l("p",null,[l("strong",null,"第六步:使用者上手。"),i(" 把 "),l("a",{href:"./user"},"使用者指南"),i(" 发给使用者,陪他们完成第一个小需求。")]),l("h3",{id:"安装器参数",tabindex:"-1"},[i("安装器参数 "),l("a",{class:"header-anchor",href:"#安装器参数","aria-label":'Permalink to "安装器参数"'},"​")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"参数"),l("th",null,"作用")])]),l("tbody",null,[l("tr",null,[l("td",null,"(无)"),l("td",null,"安装或切换到这个版本")]),l("tr",null,[l("td",null,[l("code",null,"--check")]),l("td",null,"只检查,不修改任何文件")]),l("tr",null,[l("td",null,[l("code",null,"--import-legacy <目录>")]),l("td",null,[i("先从旧脚本版导入配置和 "),l("code",null,"prompts.local/")])]),l("tr",null,[l("td",null,[l("code",null,"--target <目录>")]),l("td",null,"额外安装到另一个 skill 目录(可重复,会被记住,之后的升级也会更新它)")]),l("tr",null,[l("td",null,[l("code",null,"--force")]),l("td",null,"覆盖不是 req-kit 安装的同名 skill")]),l("tr",null,[l("td",null,[l("code",null,"--prune")]),l("td",null,"列出可以删除的旧版本目录(保留当前和上一个版本)")]),l("tr",null,[l("td",null,[l("code",null,"--uninstall")]),l("td",null,[i("删除 req-kit 安装的 skill 和 "),l("code",null,"req"),i(" 命令,保留 "),l("code",null,"~/.req-kit"),i(" 中的配置")])]),l("tr",null,[l("td",null,[l("code",null,"--configure")]),l("td",null,"配置向导")]),l("tr",null,[l("td",null,[l("code",null,"--upgrade [版本]")]),l("td",null,"下载并切换到最新版本或指定版本,见第 6 节")]),l("tr",null,[l("td",null,[l("code",null,"--latest")]),l("td",null,"查看最新发布的版本")]),l("tr",null,[l("td",null,[l("code",null,"--from npm|git|<git 地址>")]),l("td",null,[i("配合 "),l("code",null,"--upgrade"),i("、"),l("code",null,"--latest"),i(":指定升级来源")])]),l("tr",null,[l("td",null,[l("code",null,"--beta")]),l("td",null,[i("配合 "),l("code",null,"--upgrade"),i("、"),l("code",null,"--latest"),i(":正式版也考虑 beta 版")])]),l("tr",null,[l("td",null,[l("code",null,"--setup"),i(" / "),l("code",null,"--use <版本>"),i(" / "),l("code",null,"--versions")]),l("td",null,[i("版本管理(即 "),l("code",null,"req setup"),i("、"),l("code",null,"req use"),i("、"),l("code",null,"req versions"),i(")")])])])]),l("h2",{id:"_4-不同-agent-的配置",tabindex:"-1"},[i("4. 不同 agent 的配置 "),l("a",{class:"header-anchor",href:"#_4-不同-agent-的配置","aria-label":'Permalink to "4. 不同 agent 的配置"'},"​")]),l("p",null,[l("strong",null,"推荐:引用 Paseo 的 agent profile。"),i(' 在 Paseo 的 设置 → 本机 → Agents → Agent profiles 中为"实现"和"评审"各建一个 profile(选好 provider、模型、免确认的模式),然后在配置中只写名称:')]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"agents"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": {")]),i(`
24
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "builder"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"paseoProfile"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"实现"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," },")]),i(`
25
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "reviewer"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"paseoProfile"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"评审"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," }")]),i(`
26
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"}")])])])]),l("p",null,[i("每次运行开始时从 Paseo 读取 profile 的设置,之后换模型只需在 Paseo 中修改 profile。写在 "),l("code",null,"paseoProfile"),i(" 旁边的字段(如 "),l("code",null,"modeId"),i("、"),l("code",null,"thinkingOptionId"),i(")优先于 profile 中的设置。名称写错时流水线不会启动,并列出现有的 profile;"),l("code",null,"/req-doctor"),i(" 也会检查。配置向导在 Paseo 中有 profile 时会先列出它们。")]),l("p",null,"也可以直接写各项设置:"),l("p",null,"每个角色的配置项:"),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"provider")]),l("td",null,[l("code",null,"<Paseo 中的 provider ID>/<模型 ID>"),i(",只在第一个 "),l("code",null,"/"),i(" 处拆分")])]),l("tr",null,[l("td",null,[l("code",null,"modeId")]),l("td",null,"agent 的模式。必须选不会停下来等待批准的模式;没有模式的 agent 不写")]),l("tr",null,[l("td",null,[l("code",null,"featureValues")]),l("td",null,"agent 的功能开关,目前只有 OpenCode 需要")]),l("tr",null,[l("td",null,[l("code",null,"thinkingOptionId")]),l("td",null,"可选,思考强度,可用值取决于 agent 和模型")])])]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"agent"),l("th",null,[l("code",null,"provider"),i(" 写法")]),l("th",null,"无人值守的设置"),l("th",null,"思考强度")])]),l("tbody",null,[l("tr",null,[l("td",null,"Claude Code"),l("td",null,[l("code",null,"claude/<模型 ID>")]),l("td",null,[l("code",null,'"modeId": "bypassPermissions"')]),l("td",null,"取决于模型")]),l("tr",null,[l("td",null,"Codex"),l("td",null,[l("code",null,"codex/<模型 ID>")]),l("td",null,[l("code",null,'"modeId": "full-access"')]),l("td",null,"取决于模型")]),l("tr",null,[l("td",null,"OpenCode"),l("td",null,[l("code",null,"opencode/<上游>/<模型 ID>")]),l("td",null,[l("code",null,'"modeId": "build"'),i(" 加 "),l("code",null,'"featureValues": { "auto_accept": true }')]),l("td",null,"取决于模型(variant)")]),l("tr",null,[l("td",null,"Pi"),l("td",null,[l("code",null,"pi/<上游>/<模型 ID>")]),l("td",null,[i("不写 "),l("code",null,"modeId"),i("(Pi 没有模式,也不请求批准)")]),l("td",null,[l("code",null,"off"),i("、"),l("code",null,"minimal"),i("、"),l("code",null,"low"),i("、"),l("code",null,"medium"),i("、"),l("code",null,"high"),i("、"),l("code",null,"xhigh"),i("、"),l("code",null,"max")])])])]),l("p",null,[i("以上来自 Paseo 0.11.2 源码,以你的 daemon 实际返回为准("),l("code",null,"npm run smoke -- check"),i(" 或 "),l("code",null,"/req-doctor"),i(")。")]),l("ul",null,[l("li",null,[l("strong",null,"Claude Code"),i(":其他模式("),l("code",null,"default"),i("、"),l("code",null,"acceptEdits"),i("、"),l("code",null,"auto"),i(")都可能停下来等待批准,"),l("code",null,"plan"),i(" 不能改文件,都不适合流水线。")]),l("li",null,[l("strong",null,"OpenCode"),i(":模型 ID 带上游前缀,如 "),l("code",null,"anthropic/..."),i("、"),l("code",null,"openai/..."),i("。模式就是 OpenCode 中定义的 primary agent,默认 "),l("code",null,"build"),i(" 可以改文件和执行命令。不开 "),l("code",null,"auto_accept"),i(" 的话,执行命令时会停下来等待批准。")]),l("li",null,[l("strong",null,"Pi"),i(":写了 "),l("code",null,"modeId"),i(" 会被 daemon 拒绝。只有装了会弹出确认的 Pi 扩展时,才可能停下来等待。")])]),l("p",null,"混用示例:"),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"agents"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": {")]),i(`
27
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "builder"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"provider"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"claude/<模型 ID>"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"modeId"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"bypassPermissions"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," },")]),i(`
28
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "reviewer"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"provider"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"opencode/openai/<模型 ID>"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"modeId"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"build"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"featureValues"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"auto_accept"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"true"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")]),i(`
29
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"}")])])])]),l("h3",{id:"作为聊天-agent-使用者对话的那一个",tabindex:"-1"},[i("作为聊天 agent(使用者对话的那一个) "),l("a",{class:"header-anchor",href:"#作为聊天-agent-使用者对话的那一个","aria-label":'Permalink to "作为聊天 agent(使用者对话的那一个)"'},"​")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"agent"),l("th",null,"读取 skill 的位置"),l("th",null,"如何触发")])]),l("tbody",null,[l("tr",null,[l("td",null,"Claude Code"),l("td",null,[l("code",null,"~/.claude/skills")]),l("td",null,[l("code",null,"/req 我想……")])]),l("tr",null,[l("td",null,"OpenCode"),l("td",null,[l("code",null,"~/.agents/skills"),i("(也读 "),l("code",null,"~/.claude/skills"),i(")")]),l("td",null,[l("code",null,"/req 我想……"),i(';命令列表中没有时直接说"用 req 帮我……"')])]),l("tr",null,[l("td",null,"Pi"),l("td",null,[l("code",null,"~/.agents/skills")]),l("td",null,[l("code",null,"/skill:req 我想……")])]),l("tr",null,[l("td",null,"Codex"),l("td",null,[l("code",null,"~/.agents/skills")]),l("td",null,'直接说"用 req 帮我……",或用 Codex 点名 skill 的方式')])])]),l("p",null,[i("聊天 agent 需要能执行命令和访问本机网络(流水线要连接 daemon)。用 Codex 做聊天 agent 时请用 "),l("code",null,"full-access"),i(" 模式。新开的对话立即可用,已经打开的对话需要新开一个。")]),l("h2",{id:"_5-冒烟测试",tabindex:"-1"},[i("5. 冒烟测试 "),l("a",{class:"header-anchor",href:"#_5-冒烟测试","aria-label":'Permalink to "5. 冒烟测试"'},"​")]),l("p",null,"编排逻辑已在模拟环境中测试过,下面四项确认的是你的真实环境。第一次安装、更换 agent、升级 Paseo 后都建议做一遍。命令在当前版本目录中运行。"),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"#"),l("th",null,"测什么"),l("th",null,"怎么测"),l("th",null,"预期")])]),l("tbody",null,[l("tr",null,[l("td",null,"1"),l("td",null,"daemon、模型和模式"),l("td",null,[i("终端运行 "),l("code",null,"npm run smoke -- check")]),l("td",null,"两个角色各启动一个小 agent,能写文件、能执行命令、不停下等权限")]),l("tr",null,[l("td",null,"2"),l("td",null,"通知回发、子 agent 挂载"),l("td",null,[i("在 Paseo 对话中让聊天 agent 执行 "),l("code",null,"npm run smoke -- notify"),i("(先 "),l("code",null,"cd"),i(" 到版本目录)")]),l("td",null,'对话中出现"通知通道工作正常";子 agent 列表出现"[冒烟测试] 子 agent"')]),l("tr",null,[l("td",null,"3"),l("td",null,"回合结束后后台进程是否存活"),l("td",null,[i("让聊天 agent 执行 "),l("code",null,"npm run smoke -- detach-start"),i(" 并结束本轮;一分钟后再让它执行 "),l("code",null,"npm run smoke -- detach-check")]),l("td",null,"显示 ✓。显示 ✗ 说明环境会终止后台进程,需要改用插件方式启动")]),l("tr",null,[l("td",null,"4"),l("td",null,"完整跑一遍"),l("td",null,[i("在一个测试项目的 worktree 对话中输入 "),l("code",null,"/req 在 README 末尾加一行版权声明")]),l("td",null,"走快速档,收到进展和完成通知;功能目录中各产物齐全;工作分支上有本地提交")])])]),l("p",null,[i("第 2、3 项依赖对话提供的 "),l("code",null,"PASEO_AGENT_ID"),i("、"),l("code",null,"PASEO_AGENT_CWD"),i(",必须在 Paseo 对话中由聊天 agent 执行。")]),l("h2",{id:"_6-升级",tabindex:"-1"},[i("6. 升级 "),l("a",{class:"header-anchor",href:"#_6-升级","aria-label":'Permalink to "6. 升级"'},"​")]),l("p",null,[l("strong",null,"一键升级。")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --check"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 只看有没有新版本")]),i(`
30
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 升级到最新版本(能支持本机 Paseo 的)")]),i(`
31
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.9.1"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 升级到指定版本")]),i(`
32
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," upgrade"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --beta"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 当前是正式版时,也考虑 beta 版")]),i(`
33
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," versions"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 已安装的版本和 npm 上的版本")])])])]),l("ul",null,[l("li",null,[l("strong",null,"用 npm 安装的"),i("(1.7.0 起):从 npm 仓库读取已发布的版本,先读本机 Paseo daemon 的版本,跳过不支持它的 req-kit(每个版本都声明了支持的 Paseo 范围),装进 "),l("code",null,"versions/<版本>"),i(' 后切换。被跳过的版本会说明原因,例如"1.10.0 需要 Paseo >=0.12.0 <0.13.0,本机是 0.11.2"。读不到 daemon 版本时不筛选,升级后请运行 '),l("code",null,"req doctor"),i("。")]),l("li",null,[l("strong",null,"用 git 安装的"),i(":读取 git 标签,下载到 "),l("code",null,"versions/<版本>"),i(",执行 "),l("code",null,"npm install"),i(",再切换。公司网络只能访问内网镜像时,用 "),l("code",null,"--from <镜像地址>"),i(" 或环境变量 "),l("code",null,"REQ_KIT_REPO_URL"),i(" 指定。想改用 npm 升级时加 "),l("code",null,"--from npm"),i("。")]),l("li",null,"当前是正式版时只升级到正式版;当前是 beta 时也会升级到更新的 beta。任何一步失败,当前版本不受影响。"),l("li",null,[i("也可以按 Paseo 版本直接安装管理器:"),l("code",null,"npm i -g paseo-req-kit@paseo-0.11"),i("(每个支持的 Paseo 小版本有一个这样的标签)。")])]),l("p",null,"升级前后建议:"),l("ol",null,[l("li",null,[i("阅读 "),l("code",null,"CHANGELOG.md"),i(' 中两个版本之间的"升级须知"(升级完成时会给出新版本的 CHANGELOG 位置)。')]),l("li",null,[i("运行 "),l("code",null,"req doctor --no-project"),i(",确认当前状态正常。正在运行的流水线不用停,见下表。")]),l("li",null,"升级后至少跑冒烟测试第 1 项;升级须知提到通知、后台进程或启动方式有变化时,再跑第 2、3 项;主版本升级跑全部四项。"),l("li",null,'把"使用者会看到的变化"转给使用者,提醒新需求请开新对话。')]),l("p",null,[l("strong",null,"手工升级"),i("(1.2 及更早的版本还没有 "),l("code",null,"--upgrade"),i(",从它们升级时用这种方式;或者不方便访问 GitHub 时)。以从 1.0.0 升到 1.1.0 为例,先完成上面的第 1、2 项,然后把新版本放进新的版本目录,安装依赖并启用:")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"git"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," clone"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --branch"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.1.0"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --depth"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," https://github.com/yiyisf/paseo-req-kit"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.1.0")]),i(`
34
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"cd"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.1.0")]),i(`
35
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"npm"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")]),i(`
36
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs")])])])]),l("p",null,"PowerShell:"),l("div",{class:"language-powershell vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"powershell"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"git clone "),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"--"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"branch "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1.1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"."),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"0"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}}," --"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"depth "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," https:"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"//"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"github.com"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"yiyisf"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"/"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"paseo"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"req"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"kit "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"$"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"env:"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"USERPROFILE"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'\\tools\\req-kit\\versions\\1.1.0"')]),i(`
37
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"cd "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"$"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"env:"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"USERPROFILE"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'\\tools\\req-kit\\versions\\1.1.0"')]),i(`
38
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"npm install")]),i(`
39
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"node install.mjs")])])])]),l("p",null,"之后同样完成上面的第 3、4 项。"),l("p",null,[i("安装器替换各 agent 目录中带标记的 skill,把路径指向新版本,删除新版本不再包含的旧 skill,并更新启用记录。不会动:"),l("code",null,"~/.req-kit/"),i(" 下的配置和提示词覆盖、各项目仓库中的文件、不是 req-kit 安装的 skill。")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"升级时的状态"),l("th",null,"会发生什么")])]),l("tbody",null,[l("tr",null,[l("td",null,"还在聊天对齐阶段"),l("td",null,"对话已加载的是旧版 skill,继续使用即可;启动的是新版引擎")]),l("tr",null,[l("td",null,"流水线正在运行"),l("td",null,"进程已载入旧版代码,旧版本目录仍在,按旧版跑完")]),l("tr",null,[l("td",null,"已暂停、失败或等待需求方决定"),l("td",null,[i("继续时由新版引擎读取;状态格式有变化时自动迁移,原文件备份为 "),l("code",null,"state.json.bak-v<旧版本>")])]),l("tr",null,[l("td",null,"已完成"),l("td",null,"不受影响")])])]),l("h2",{id:"_7-回滚",tabindex:"-1"},[i("7. 回滚 "),l("a",{class:"header-anchor",href:"#_7-回滚","aria-label":'Permalink to "7. 回滚"'},"​")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," use"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," 1.6.0"),l("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}}," # 切换到已安装的旧版本")])])])]),l("p",null,[i("不用 "),l("code",null,"req"),i(" 时,在旧版本目录中重新运行安装器也一样(npm 安装的版本在 "),l("code",null,"versions/<版本>/node_modules/paseo-req-kit"),i(" 中):")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"cd"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/1.0.0")]),i(`
40
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install.mjs")])])])]),l("p",null,[i("这会把 skill 和引擎路径改回 1.0.0,配置不变。如果某个功能目录的状态文件已被新版迁移,旧版引擎会拒绝继续并提示:把 "),l("code",null,"state.json.bak-v<旧版本>"),i(" 恢复为 "),l("code",null,"state.json"),i(",或者用 "),l("code",null,"--restart"),i(" 从头开始。")]),l("p",null,[i("旧版本目录建议保留到新版本稳定运行一周以上、且没有由它启动的流水线仍在运行。"),l("code",null,"node install.mjs --prune"),i(" 会列出可以删除的旧版本。")]),l("h2",{id:"_8-从脚本版-paseo-requirement-workflow-迁移",tabindex:"-1"},[i("8. 从脚本版(paseo-requirement-workflow)迁移 "),l("a",{class:"header-anchor",href:"#_8-从脚本版-paseo-requirement-workflow-迁移","aria-label":'Permalink to "8. 从脚本版(paseo-requirement-workflow)迁移"'},"​")]),l("p",null,[i("适用于已经装了 "),l("code",null,"~/tools/requirement-pipeline"),i(" 和 "),l("code",null,"/requirement-kickoff"),i(" 的机器。")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"对象"),l("th",null,"脚本版"),l("th",null,"req-kit"),l("th",null,"迁移方式")])]),l("tbody",null,[l("tr",null,[l("td",null,"入口"),l("td",null,[l("code",null,"/requirement-kickoff")]),l("td",null,[l("code",null,"/req")]),l("td",null,[i("安装器替换旧的 skill;1.x 期间保留同名的引导入口,提示改用 "),l("code",null,"/req"),i(" 并转交")])]),l("tr",null,[l("td",null,"本机配置"),l("td",null,[l("code",null,"~/tools/requirement-pipeline/pipeline.config.json")]),l("td",null,[l("code",null,"~/.req-kit/config.json")]),l("td",null,[l("code",null,"node install.mjs --import-legacy ~/tools/requirement-pipeline"),i(",同时导入 "),l("code",null,"prompts.local/"),i(";顶层 "),l("code",null,"rounds"),i(" 继续有效")])]),l("tr",null,[l("td",null,"项目配置"),l("td",null,[l("code",null,".requirement-pipeline.json"),i("、"),l("code",null,".requirement-pipeline/")]),l("td",null,"同名同位置"),l("td",null,"无需迁移")]),l("tr",null,[l("td",null,"功能目录"),l("td",null,[l("code",null,"docs/features/<日期>-<名称>/")]),l("td",null,"同左"),l("td",null,[i("无需迁移;没有 "),l("code",null,"version"),i(" 字段的状态文件按第 1 版读取")])]),l("tr",null,[l("td",null,"术语文件"),l("td",null,[l("code",null,"CONTEXT.md")]),l("td",null,[l("code",null,"GLOSSARY.md")]),l("td",null,[i("继续读取 "),l("code",null,"CONTEXT.md"),i(",新术语写入 "),l("code",null,"GLOSSARY.md")])]),l("tr",null,[l("td",null,"依赖的外部 skill"),l("td",null,[l("code",null,"grilling"),i("、"),l("code",null,"domain-modeling")]),l("td",null,"不再需要"),l("td",null,"可以保留,也可以自行卸载")])])]),l("p",null,"建议顺序:"),l("ol",null,[l("li",null,"等脚本版启动的流水线跑完(或记下它们,迁移后用新版续跑)。"),l("li",null,[i("按第 3 节取得程序并 "),l("code",null,"npm install"),i(",然后运行 "),l("code",null,"node install.mjs --import-legacy ~/tools/requirement-pipeline"),i("。")]),l("li",null,"跑冒烟测试第 1–3 项。"),l("li",null,[i("告诉使用者入口改为 "),l("code",null,"/req"),i("。")]),l("li",null,[i("一周后删除 "),l("code",null,"~/tools/requirement-pipeline"),i("。")])]),l("h2",{id:"_9-paseo-或-agent-升级之后",tabindex:"-1"},[i("9. Paseo 或 agent 升级之后 "),l("a",{class:"header-anchor",href:"#_9-paseo-或-agent-升级之后","aria-label":'Permalink to "9. Paseo 或 agent 升级之后"'},"​")]),l("p",null,[i("运行 "),l("code",null,"/req-doctor"),i("(或 "),l("code",null,"node bin/req-doctor.mjs"),i("),确认 SDK 版本在支持范围内、配置中的模型和模式仍然存在;然后跑冒烟测试第 1–3 项。有失败时,先看 req-kit 是否已有适配的新版本;没有的话,把输出反馈给维护者,并暂时回退 Paseo 或 agent 的版本。")]),l("h2",{id:"_10-卸载",tabindex:"-1"},[i("10. 卸载 "),l("a",{class:"header-anchor",href:"#_10-卸载","aria-label":'Permalink to "10. 卸载"'},"​")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"node"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," ~/tools/req-kit/versions/"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"<"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},"当前版"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"本"),l("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},">"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},"/install.mjs"),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," --uninstall")])])])]),l("p",null,[i("这会删除 req-kit 安装的 skill 和 "),l("code",null,"req"),i(" 命令。确认不再使用后,再手工删除 "),l("code",null,"~/tools/req-kit"),i(" 和 "),l("code",null,"~/.req-kit"),i("。各项目中的配置文件和功能目录保留,它们本身就是文档。")]),l("h2",{id:"_11-安全提示",tabindex:"-1"},[i("11. 安全提示 "),l("a",{class:"header-anchor",href:"#_11-安全提示","aria-label":'Permalink to "11. 安全提示"'},"​")]),l("ul",null,[l("li",null,"步骤 agent 以免确认模式运行,可以在本机执行命令。仓库和本机环境变量中不要放生产凭据;最好用专门的开发机或虚拟机运行 daemon。"),l("li",null,"流水线只做本地提交,合并和上线始终由人决定。")]),l("h2",{id:"_12-接入企业内部-im-可选",tabindex:"-1"},[i("12. 接入企业内部 IM(可选) "),l("a",{class:"header-anchor",href:"#_12-接入企业内部-im-可选","aria-label":'Permalink to "12. 接入企业内部 IM(可选)"'},"​")]),l("p",null,'流水线默认只把消息发回发起的对话。希望"需要你决定""开发中断""已完成"等时刻在企业 IM 中也收到时,需要自己实现一个通知模块(req-kit 不内置任何 IM):'),l("ol",null,[l("li",null,[l("p",null,[i("把安装目录中的 "),l("code",null,"notifiers/im-template.mjs"),i(" 复制到 "),l("code",null,"~/.req-kit/notifiers/im.mjs"),i(",按其中的 TODO 实现发送(通常是向 IM 的机器人 webhook 发一个 HTTP 请求)。口令放在环境变量中,不要写进文件。")])]),l("li",null,[l("p",null,[i("在 "),l("code",null,"~/.req-kit/config.json"),i("(或团队配置)中加上:")]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"notifiers"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": [")]),i(`
41
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"module"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"~/.req-kit/notifiers/im.mjs"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"events"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": ["),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"blocked"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"failed"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"completed"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"], "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"options"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"webhook"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"https://…"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")]),i(`
42
+ `),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"]")])])])])]),l("li",null,[l("p",null,[i("运行 "),l("code",null,"req notify-test"),i("(可加 "),l("code",null,"--type blocked"),i(" 等)发一条测试消息。")])])]),l("p",null,[i("事件的类型和字段见 "),l("a",{href:"./../reference/contracts/notifier-event"},"contracts/notifier-event.md"),i("。通知失败只记日志,不影响流水线。项目配置("),l("code",null,".requirement-pipeline.json"),i(")中的 "),l("code",null,"notifiers"),i(" 会被忽略。")]),l("h2",{id:"_13-paseo-插件-可选",tabindex:"-1"},[i("13. Paseo 插件(可选) "),l("a",{class:"header-anchor",href:"#_13-paseo-插件-可选","aria-label":'Permalink to "13. Paseo 插件(可选)"'},"​")]),l("p",null,"1.9 起,req-kit 附带一个 Paseo 插件,把需求搬进 Paseo 的界面(网页端、桌面版、手机都能用):"),l("ul",null,[l("li",null,'侧边栏的"需求":本机所有项目的需求,按"需要你处理、进行中、待测试验证、最近完成"分组,带待处理的数量。'),l("li",null,"需求详情:每一步的状态、用时和结论(点开即进入那个步骤的 agent)、质量门、联合需求的各仓库、用量;可以读需求说明、方案、确认预览、提测说明、完成报告等文档。"),l("li",null,[i("管理操作:确认方案、停止、继续、开始测试验证。每个操作都要再确认一次,做的事和终端里的 "),l("code",null,"req approve"),i("、"),l("code",null,"req stop"),i("、"),l("code",null,"req resume"),i("、"),l("code",null,"req verify"),i(" 完全一样,流水线本身不受插件影响。")]),l("li",null,[i('每个工作区头部的"需求"按钮和面板、步骤 agent 输入框旁的"需求"按钮、使用统计(同 '),l("code",null,"req stats"),i('),以及 Ctrl+K(macOS 为 ⌘K)中的"需求总览"。')])]),l("p",null,[l("strong",null,"安装"),i(":在运行 Paseo daemon 的机器上运行")]),l("div",{class:"language-bash vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"bash"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"}},"req"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," plugin"),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}}," install")])])])]),l("p",null,[i("它把当前版本的插件复制到 "),l("code",null,"~/.req-kit/paseo-plugin"),i(",再用 Paseo 的命令行安装。Paseo 的插件总开关("),l("code",null,"pluginsEnabled"),i(")默认是关着的:插件是不受沙箱限制的代码,后台部分可以访问这台机器上的文件和进程,所以打开前会先问你("),l("code",null,"--yes"),i(" 表示同意)。req-kit 插件只运行本机的 "),l("code",null,"req api"),i(",不连接任何外部服务。一键安装脚本在最后也会问一次是否安装("),l("code",null,"--with-plugin"),i(" 直接安装,"),l("code",null,"--no-plugin"),i(" 不问)。")]),l("p",null,[i("没有 "),l("code",null,"paseo"),i(" 命令时(例如只用桌面版 Paseo),在 Paseo 的 设置 → Plugins 中打开 Enable plugins,再在 Plugin source 中填 "),l("code",null,"~/.req-kit/paseo-plugin"),i(" 的完整路径(运行 "),l("code",null,"req plugin install"),i(" 会准备好这个目录并显示路径)。")]),l("p",null,[l("strong",null,"更新"),i(":不用单独做。"),l("code",null,"req setup"),i("、"),l("code",null,"req upgrade"),i("、"),l("code",null,"req use"),i(" 启用一个版本时,如果装过插件,会把插件文件换成这个版本的并让 Paseo 重新加载,插件总是和启用的 req-kit 版本一致。")]),l("p",null,[l("strong",null,"只读"),i(':网页端会给只看不操作的人用时,在 Paseo 的 设置 → Plugins → req-kit 中打开"只读":不再显示管理操作,插件的后台也会拒绝它们。能连上这台 daemon 的人都能看到插件,Paseo 的插件没有按用户区分的权限。')]),l("p",null,[l("strong",null,"其他"),i(":"),l("code",null,"req plugin status"),i(" 看插件是否在运行;"),l("code",null,"req plugin remove"),i(" 从 Paseo 移除(不改插件总开关)。插件需要 req-kit 1.9 和 Paseo 0.11。1.9 之前运行过的需求要先在项目目录运行一次 "),l("code",null,"req index --rebuild"),i(" 才会出现在插件里。插件出问题时:"),l("code",null,"paseo plugin logs req-kit"),i("。")])],-1),l("p",{class:"source-note"},[i("本页由仓库中的 "),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/docs/guide/安装与升级.md"},"docs/guide/安装与升级.md"),i(" 生成。"),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/edit/main/docs/guide/安装与升级.md"},"在 GitHub 上编辑")],-1)])])}const g=e(a,[["render",d]]);export{c as __pageData,g as default};