paseo-req-kit 1.12.1 → 1.13.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +8 -3
- package/bin/bootstrap.d.mts +13 -0
- package/bin/bootstrap.mjs +444 -0
- package/bin/req-docs.d.mts +5 -0
- package/bin/req-docs.mjs +169 -0
- package/bin/req.mjs +21 -1
- package/contracts/cli-json.md +2 -0
- package/docs/adr/0032-npm-only-install.md +27 -0
- package/docs/adr/0033-prototype-review-and-ui-check.md +28 -0
- package/docs/adr/README.md +2 -0
- package/docs/guide//344/275/277/347/224/250/350/200/205/346/214/207/345/215/227.md +8 -0
- package/docs/guide//345/256/211/350/243/205/344/270/216/345/215/207/347/272/247.md +22 -2
- package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +1 -1
- 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 +7 -1
- package/engine/prompts/03-design.md +5 -1
- package/engine/prompts/04b-design-revise.md +1 -1
- package/engine/prompts/browser-verify.md +2 -2
- package/engine/prompts/ui-check.md +15 -0
- package/engine/src/api.ts +17 -2
- package/engine/src/config-view.ts +1 -1
- package/engine/src/pipeline.ts +15 -7
- package/engine/src/review-assets/app.css +420 -0
- package/engine/src/review-assets/app.html +95 -0
- package/engine/src/review-assets/app.js +954 -0
- package/engine/src/review.ts +570 -0
- package/engine/src/ui-check-page.js +208 -0
- package/engine/src/ui-check.ts +366 -0
- package/package.json +3 -1
- package/paseo-plugin/client/data.ts +12 -1
- package/paseo-plugin/client/detail.tsx +3 -0
- package/paseo-plugin/client/inbox.tsx +2 -0
- package/paseo-plugin/client/review-link.tsx +29 -0
- package/paseo-plugin/index.server.ts +2 -1
- package/paseo-plugin/package.json +1 -1
- package/paseo-plugin/server/handlers.ts +7 -1
- package/paseo-plugin/shared/contracts.ts +9 -0
- package/site-dist/404.html +27 -0
- package/site-dist/assets/app.DWPPPhFm.js +1 -0
- package/site-dist/assets/changelog.md.CoelFFCL.js +1 -0
- package/site-dist/assets/changelog.md.CoelFFCL.lean.js +1 -0
- package/site-dist/assets/chunks/@localSearchIndexroot.Hdq0-4L3.js +1 -0
- package/site-dist/assets/chunks/VPLocalSearchBox.D3_9dRGY.js +9 -0
- package/site-dist/assets/chunks/framework.B9qR_F1m.js +20 -0
- package/site-dist/assets/chunks/theme.Bm8aLiLN.js +2 -0
- package/site-dist/assets/guide_getting-started.md.B4GJeoPz.js +6 -0
- package/site-dist/assets/guide_getting-started.md.B4GJeoPz.lean.js +1 -0
- package/site-dist/assets/guide_how-it-works.md.D-kQsF1t.js +25 -0
- package/site-dist/assets/guide_how-it-works.md.D-kQsF1t.lean.js +1 -0
- package/site-dist/assets/guide_index.md.CLnGCmGW.js +1 -0
- package/site-dist/assets/guide_index.md.CLnGCmGW.lean.js +1 -0
- package/site-dist/assets/guide_install.md.DkCyZsOU.js +42 -0
- package/site-dist/assets/guide_install.md.DkCyZsOU.lean.js +42 -0
- package/site-dist/assets/guide_maintainer.md.RZIzyCTV.js +1 -0
- package/site-dist/assets/guide_maintainer.md.RZIzyCTV.lean.js +1 -0
- package/site-dist/assets/guide_phases.md.BpGAb1re.js +1 -0
- package/site-dist/assets/guide_phases.md.BpGAb1re.lean.js +1 -0
- package/site-dist/assets/guide_project.md.nGlTCo4D.js +77 -0
- package/site-dist/assets/guide_project.md.nGlTCo4D.lean.js +77 -0
- package/site-dist/assets/guide_user.md.tiHFxIsQ.js +1 -0
- package/site-dist/assets/guide_user.md.tiHFxIsQ.lean.js +1 -0
- package/site-dist/assets/index.md.Cf_sSf_f.js +1 -0
- package/site-dist/assets/index.md.Cf_sSf_f.lean.js +1 -0
- package/site-dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/site-dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/site-dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/site-dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/site-dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/site-dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/site-dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/site-dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/site-dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/site-dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/site-dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/site-dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/site-dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/site-dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/site-dist/assets/reference_adr_0001-step-agents-under-origin-chat.md.RtRTq7oi.js +1 -0
- package/site-dist/assets/reference_adr_0001-step-agents-under-origin-chat.md.RtRTq7oi.lean.js +1 -0
- package/site-dist/assets/reference_adr_0002-no-directory-switch-in-chat.md.BxtN-Aa2.js +1 -0
- package/site-dist/assets/reference_adr_0002-no-directory-switch-in-chat.md.BxtN-Aa2.lean.js +1 -0
- package/site-dist/assets/reference_adr_0003-script-engine-not-hub.md.66EgZtqx.js +1 -0
- package/site-dist/assets/reference_adr_0003-script-engine-not-hub.md.66EgZtqx.lean.js +1 -0
- package/site-dist/assets/reference_adr_0004-result-files.md.DbqcCozI.js +1 -0
- package/site-dist/assets/reference_adr_0004-result-files.md.DbqcCozI.lean.js +1 -0
- package/site-dist/assets/reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.js +1 -0
- package/site-dist/assets/reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.lean.js +1 -0
- package/site-dist/assets/reference_adr_0006-skill-install-targets.md.CwY8YepV.js +1 -0
- package/site-dist/assets/reference_adr_0006-skill-install-targets.md.CwY8YepV.lean.js +1 -0
- package/site-dist/assets/reference_adr_0007-own-interview-skill.md.CryhxRyG.js +1 -0
- package/site-dist/assets/reference_adr_0007-own-interview-skill.md.CryhxRyG.lean.js +1 -0
- package/site-dist/assets/reference_adr_0008-entries-do-not-call-entries.md.DsRWAgeA.js +1 -0
- package/site-dist/assets/reference_adr_0008-entries-do-not-call-entries.md.DsRWAgeA.lean.js +1 -0
- package/site-dist/assets/reference_adr_0009-versioned-install-layout.md.CSg1VqlW.js +1 -0
- package/site-dist/assets/reference_adr_0009-versioned-install-layout.md.CSg1VqlW.lean.js +1 -0
- package/site-dist/assets/reference_adr_0010-generated-feature-overview.md.D8F3MK-h.js +1 -0
- package/site-dist/assets/reference_adr_0010-generated-feature-overview.md.D8F3MK-h.lean.js +1 -0
- package/site-dist/assets/reference_adr_0011-resume-after-completion.md.BCrZrKjf.js +1 -0
- package/site-dist/assets/reference_adr_0011-resume-after-completion.md.BCrZrKjf.lean.js +1 -0
- package/site-dist/assets/reference_adr_0012-review-panel.md.k9rrHFFc.js +1 -0
- package/site-dist/assets/reference_adr_0012-review-panel.md.k9rrHFFc.lean.js +1 -0
- package/site-dist/assets/reference_adr_0013-no-release-tooling.md.BQeJ8dEI.js +1 -0
- package/site-dist/assets/reference_adr_0013-no-release-tooling.md.BQeJ8dEI.lean.js +1 -0
- package/site-dist/assets/reference_adr_0014-notifier-slot.md.C23QR1xO.js +1 -0
- package/site-dist/assets/reference_adr_0014-notifier-slot.md.C23QR1xO.lean.js +1 -0
- package/site-dist/assets/reference_adr_0015-incremental-continue.md.Buy7wwO8.js +1 -0
- package/site-dist/assets/reference_adr_0015-incremental-continue.md.Buy7wwO8.lean.js +1 -0
- package/site-dist/assets/reference_adr_0016-upgrade-from-tags.md.qfIW-tqJ.js +1 -0
- package/site-dist/assets/reference_adr_0016-upgrade-from-tags.md.qfIW-tqJ.lean.js +1 -0
- package/site-dist/assets/reference_adr_0017-use-paseo-capabilities.md.CjcGli87.js +1 -0
- package/site-dist/assets/reference_adr_0017-use-paseo-capabilities.md.CjcGli87.lean.js +1 -0
- package/site-dist/assets/reference_adr_0018-own-worktree-option.md.fVDpgGSE.js +1 -0
- package/site-dist/assets/reference_adr_0018-own-worktree-option.md.fVDpgGSE.lean.js +1 -0
- package/site-dist/assets/reference_adr_0019-parallel-orchestration.md.DrfrV0To.js +1 -0
- package/site-dist/assets/reference_adr_0019-parallel-orchestration.md.DrfrV0To.lean.js +1 -0
- package/site-dist/assets/reference_adr_0020-scheduling-through-the-chat.md.BqSemGFG.js +1 -0
- package/site-dist/assets/reference_adr_0020-scheduling-through-the-chat.md.BqSemGFG.lean.js +1 -0
- package/site-dist/assets/reference_adr_0021-npm-version-manager.md.CU3PG6y5.js +1 -0
- package/site-dist/assets/reference_adr_0021-npm-version-manager.md.CU3PG6y5.lean.js +1 -0
- package/site-dist/assets/reference_adr_0022-develop-and-verify-phases.md.C6fQDLq4.js +1 -0
- package/site-dist/assets/reference_adr_0022-develop-and-verify-phases.md.C6fQDLq4.lean.js +1 -0
- package/site-dist/assets/reference_adr_0023-types-gate-slices.md.D2E6yyYQ.js +1 -0
- package/site-dist/assets/reference_adr_0023-types-gate-slices.md.D2E6yyYQ.lean.js +1 -0
- package/site-dist/assets/reference_adr_0024-confirm-early-review-axes.md.FmK_ke0x.js +1 -0
- package/site-dist/assets/reference_adr_0024-confirm-early-review-axes.md.FmK_ke0x.lean.js +1 -0
- package/site-dist/assets/reference_adr_0025-joint-requirements.md.ChoKvMUx.js +1 -0
- package/site-dist/assets/reference_adr_0025-joint-requirements.md.ChoKvMUx.lean.js +1 -0
- package/site-dist/assets/reference_adr_0026-machine-records-and-api.md.veybjBPq.js +1 -0
- package/site-dist/assets/reference_adr_0026-machine-records-and-api.md.veybjBPq.lean.js +1 -0
- package/site-dist/assets/reference_adr_0027-paseo-plugin.md.BMX33ZNU.js +1 -0
- package/site-dist/assets/reference_adr_0027-paseo-plugin.md.BMX33ZNU.lean.js +1 -0
- package/site-dist/assets/reference_adr_0028-external-integrations.md.DtdMe8RK.js +1 -0
- package/site-dist/assets/reference_adr_0028-external-integrations.md.DtdMe8RK.lean.js +1 -0
- package/site-dist/assets/reference_adr_0029-requirements-from-cards.md.BHd1SQPe.js +1 -0
- package/site-dist/assets/reference_adr_0029-requirements-from-cards.md.BHd1SQPe.lean.js +1 -0
- package/site-dist/assets/reference_adr_0030-card-intake-process.md.kLc-DG9_.js +1 -0
- package/site-dist/assets/reference_adr_0030-card-intake-process.md.kLc-DG9_.lean.js +1 -0
- package/site-dist/assets/reference_adr_0031-fewer-interventions.md.BDnQcz8g.js +1 -0
- package/site-dist/assets/reference_adr_0031-fewer-interventions.md.BDnQcz8g.lean.js +1 -0
- package/site-dist/assets/reference_adr_0032-npm-only-install.md.C-3L1FkX.js +1 -0
- package/site-dist/assets/reference_adr_0032-npm-only-install.md.C-3L1FkX.lean.js +1 -0
- package/site-dist/assets/reference_adr_0033-prototype-review-and-ui-check.md.hFcQzmaa.js +1 -0
- package/site-dist/assets/reference_adr_0033-prototype-review-and-ui-check.md.hFcQzmaa.lean.js +1 -0
- package/site-dist/assets/reference_adr_index.md.BYF-Ofor.js +1 -0
- package/site-dist/assets/reference_adr_index.md.BYF-Ofor.lean.js +1 -0
- package/site-dist/assets/reference_commands.md.ClKbS-t8.js +1 -0
- package/site-dist/assets/reference_commands.md.ClKbS-t8.lean.js +1 -0
- package/site-dist/assets/reference_config.md.CRe27LaA.js +6 -0
- package/site-dist/assets/reference_config.md.CRe27LaA.lean.js +1 -0
- package/site-dist/assets/reference_contracts_cli-json.md.N-v2HNUd.js +1 -0
- package/site-dist/assets/reference_contracts_cli-json.md.N-v2HNUd.lean.js +1 -0
- package/site-dist/assets/reference_contracts_feature-files.md.DSiA8OEH.js +26 -0
- package/site-dist/assets/reference_contracts_feature-files.md.DSiA8OEH.lean.js +26 -0
- package/site-dist/assets/reference_contracts_index.md.Bkznz4px.js +1 -0
- package/site-dist/assets/reference_contracts_index.md.Bkznz4px.lean.js +1 -0
- package/site-dist/assets/reference_contracts_notifier-event.md.CCfrkm_A.js +24 -0
- package/site-dist/assets/reference_contracts_notifier-event.md.CCfrkm_A.lean.js +24 -0
- package/site-dist/assets/reference_contracts_result-file.md.DmR4fjB-.js +1 -0
- package/site-dist/assets/reference_contracts_result-file.md.DmR4fjB-.lean.js +1 -0
- package/site-dist/assets/reference_contracts_spec.md.BwwS0L_j.js +8 -0
- package/site-dist/assets/reference_contracts_spec.md.BwwS0L_j.lean.js +8 -0
- package/site-dist/assets/reference_contracts_state.md.5bNTC3ow.js +1 -0
- package/site-dist/assets/reference_contracts_state.md.5bNTC3ow.lean.js +1 -0
- package/site-dist/assets/reference_contracts_usage-record.md._C0OXWeq.js +10 -0
- package/site-dist/assets/reference_contracts_usage-record.md._C0OXWeq.lean.js +10 -0
- package/site-dist/assets/reference_contracts_verify.md.CbA88u6S.js +29 -0
- package/site-dist/assets/reference_contracts_verify.md.CbA88u6S.lean.js +29 -0
- package/site-dist/assets/reference_scope.md.Kzqw8U_f.js +1 -0
- package/site-dist/assets/reference_scope.md.Kzqw8U_f.lean.js +1 -0
- package/site-dist/assets/style.Dwsa4SMe.css +1 -0
- package/site-dist/changelog.html +30 -0
- package/site-dist/guide/getting-started.html +35 -0
- package/site-dist/guide/how-it-works.html +54 -0
- package/site-dist/guide/index.html +30 -0
- package/site-dist/guide/install.html +71 -0
- package/site-dist/guide/maintainer.html +30 -0
- package/site-dist/guide/phases.html +30 -0
- package/site-dist/guide/project.html +106 -0
- package/site-dist/guide/user.html +30 -0
- package/site-dist/hashmap.json +1 -0
- package/site-dist/icons/agents.svg +1 -0
- package/site-dist/icons/chat.svg +1 -0
- package/site-dist/icons/paseo.svg +1 -0
- package/site-dist/icons/phases.svg +1 -0
- package/site-dist/icons/review.svg +1 -0
- package/site-dist/icons/safe.svg +1 -0
- package/site-dist/index.html +30 -0
- package/site-dist/install.ps1 +118 -0
- package/site-dist/install.sh +198 -0
- package/site-dist/logo.svg +11 -0
- package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +30 -0
- package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +30 -0
- package/site-dist/reference/adr/0003-script-engine-not-hub.html +30 -0
- package/site-dist/reference/adr/0004-result-files.html +30 -0
- package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +30 -0
- package/site-dist/reference/adr/0006-skill-install-targets.html +30 -0
- package/site-dist/reference/adr/0007-own-interview-skill.html +30 -0
- package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +30 -0
- package/site-dist/reference/adr/0009-versioned-install-layout.html +30 -0
- package/site-dist/reference/adr/0010-generated-feature-overview.html +30 -0
- package/site-dist/reference/adr/0011-resume-after-completion.html +30 -0
- package/site-dist/reference/adr/0012-review-panel.html +30 -0
- package/site-dist/reference/adr/0013-no-release-tooling.html +30 -0
- package/site-dist/reference/adr/0014-notifier-slot.html +30 -0
- package/site-dist/reference/adr/0015-incremental-continue.html +30 -0
- package/site-dist/reference/adr/0016-upgrade-from-tags.html +30 -0
- package/site-dist/reference/adr/0017-use-paseo-capabilities.html +30 -0
- package/site-dist/reference/adr/0018-own-worktree-option.html +30 -0
- package/site-dist/reference/adr/0019-parallel-orchestration.html +30 -0
- package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +30 -0
- package/site-dist/reference/adr/0021-npm-version-manager.html +30 -0
- package/site-dist/reference/adr/0022-develop-and-verify-phases.html +30 -0
- package/site-dist/reference/adr/0023-types-gate-slices.html +30 -0
- package/site-dist/reference/adr/0024-confirm-early-review-axes.html +30 -0
- package/site-dist/reference/adr/0025-joint-requirements.html +30 -0
- package/site-dist/reference/adr/0026-machine-records-and-api.html +30 -0
- package/site-dist/reference/adr/0027-paseo-plugin.html +30 -0
- package/site-dist/reference/adr/0028-external-integrations.html +30 -0
- package/site-dist/reference/adr/0029-requirements-from-cards.html +30 -0
- package/site-dist/reference/adr/0030-card-intake-process.html +30 -0
- package/site-dist/reference/adr/0031-fewer-interventions.html +30 -0
- package/site-dist/reference/adr/0032-npm-only-install.html +30 -0
- package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +30 -0
- package/site-dist/reference/adr/index.html +30 -0
- package/site-dist/reference/commands.html +30 -0
- package/site-dist/reference/config.html +35 -0
- package/site-dist/reference/contracts/cli-json.html +30 -0
- package/site-dist/reference/contracts/feature-files.html +55 -0
- package/site-dist/reference/contracts/index.html +30 -0
- package/site-dist/reference/contracts/notifier-event.html +53 -0
- package/site-dist/reference/contracts/result-file.html +30 -0
- package/site-dist/reference/contracts/spec.html +37 -0
- package/site-dist/reference/contracts/state.html +30 -0
- package/site-dist/reference/contracts/usage-record.html +39 -0
- package/site-dist/reference/contracts/verify.html +58 -0
- package/site-dist/reference/scope.html +30 -0
- package/site-dist/vp-icons.css +1 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as n}from"./chunks/framework.B9qR_F1m.js";const g=JSON.parse('{"title":"0001 步骤 agent 挂在发起的对话下","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0001-step-agents-under-origin-chat.md","filePath":"reference/adr/0001-step-agents-under-origin-chat.md","lastUpdated":null}'),i={name:"reference/adr/0001-step-agents-under-origin-chat.md"};function o(s,e,d,c,h,l){return t(),r("div",null,[...e[0]||(e[0]=[n('<div><h1 id="_0001-步骤-agent-挂在发起的对话下" tabindex="-1">0001 步骤 agent 挂在发起的对话下 <a class="header-anchor" href="#_0001-步骤-agent-挂在发起的对话下" aria-label="Permalink to "0001 步骤 agent 挂在发起的对话下""></a></h1><ul><li>状态:已采纳(<a href="./0018-own-worktree-option">0018</a> 增加了一种可选方式:步骤放在为需求新建的工作区中,仍挂在对话下,对话目录不变)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>Paseo 在创建子 agent 时,如果传了 parent,会使用 parent 的工作目录而不是传入的 cwd。早期版本在两者不一致时改为创建独立 agent,结果步骤的产物写到了别处。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>步骤 agent 一律作为子 agent 挂在发起的对话下;仓库目录就是这个对话的工作目录。启动前核对两者,不一致时拒绝启动;创建后再核对 agent 的工作目录,不对就归档并报错。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>使用者在对话的子 agent 列表里就能看到每一步;不会出现产物写错目录的情况。代价是必须在需求所在项目的对话中发起。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0001-step-agents-under-origin-chat.md">docs/adr/0001-step-agents-under-origin-chat.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0001-step-agents-under-origin-chat.md">在 GitHub 上编辑</a></p>',2)])])}const u=a(i,[["render",o]]);export{g as __pageData,u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as n}from"./chunks/framework.B9qR_F1m.js";const g=JSON.parse('{"title":"0001 步骤 agent 挂在发起的对话下","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0001-step-agents-under-origin-chat.md","filePath":"reference/adr/0001-step-agents-under-origin-chat.md","lastUpdated":null}'),i={name:"reference/adr/0001-step-agents-under-origin-chat.md"};function o(s,e,d,c,h,l){return t(),r("div",null,[...e[0]||(e[0]=[n("",2)])])}const u=a(i,[["render",o]]);export{g as __pageData,u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const _=JSON.parse('{"title":"0002 对话过程中不切换工作目录","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0002-no-directory-switch-in-chat.md","filePath":"reference/adr/0002-no-directory-switch-in-chat.md","lastUpdated":null}'),o={name:"reference/adr/0002-no-directory-switch-in-chat.md"};function c(n,a,d,s,h,l){return t(),r("div",null,[...a[0]||(a[0]=[i('<div><h1 id="_0002-对话过程中不切换工作目录" tabindex="-1">0002 对话过程中不切换工作目录 <a class="header-anchor" href="#_0002-对话过程中不切换工作目录" aria-label="Permalink to "0002 对话过程中不切换工作目录""></a></h1><ul><li>状态:已采纳(<a href="./0018-own-worktree-option">0018</a> 增加了一种可选方式:步骤放在为需求新建的工作区中,仍挂在对话下,对话目录不变)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>一个对话对应一个需求的工作现场。中途切换目录会让功能目录、分支和流水线的仓库目录对不上。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>skill 明确要求不 cd 到别的目录执行命令,功能目录必须建在当前工作目录之内;需求属于其他项目时,到那个项目新开对话。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>规则简单、可检查。跨项目的需求需要分别发起。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0002-no-directory-switch-in-chat.md">docs/adr/0002-no-directory-switch-in-chat.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0002-no-directory-switch-in-chat.md">在 GitHub 上编辑</a></p>',2)])])}const f=e(o,[["render",c]]);export{_ as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const _=JSON.parse('{"title":"0002 对话过程中不切换工作目录","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0002-no-directory-switch-in-chat.md","filePath":"reference/adr/0002-no-directory-switch-in-chat.md","lastUpdated":null}'),o={name:"reference/adr/0002-no-directory-switch-in-chat.md"};function c(n,a,d,s,h,l){return t(),r("div",null,[...a[0]||(a[0]=[i("",2)])])}const f=e(o,[["render",c]]);export{_ as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0003-script-engine-not-hub.md","filePath":"reference/adr/0003-script-engine-not-hub.md","lastUpdated":null}'),n={name:"reference/adr/0003-script-engine-not-hub.md"};function o(s,e,d,c,h,l){return t(),r("div",null,[...e[0]||(e[0]=[i('<div><h1 id="_0003-第-3–11-步由脚本引擎驱动-不用-hub-多步骤工作流" tabindex="-1">0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流 <a class="header-anchor" href="#_0003-第-3–11-步由脚本引擎驱动-不用-hub-多步骤工作流" aria-label="Permalink to "0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>Paseo Hub 的多步骤格式在文档中属于旧格式,不支持循环(审核 ⇄ 修订)、断点续跑,也不能把进展发回发起的对话。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>用 Node/TypeScript 编写确定性的引擎,通过 SDK 创建步骤 agent、等待结果、发通知。Hub 版本移到 legacy/,不再维护。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>流程顺序、轮数、续跑由程序保证,可测试。需要在本机安装 Node.js 和依赖。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0003-script-engine-not-hub.md">docs/adr/0003-script-engine-not-hub.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0003-script-engine-not-hub.md">在 GitHub 上编辑</a></p>',2)])])}const b=a(n,[["render",o]]);export{p as __pageData,b as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0003-script-engine-not-hub.md","filePath":"reference/adr/0003-script-engine-not-hub.md","lastUpdated":null}'),n={name:"reference/adr/0003-script-engine-not-hub.md"};function o(s,e,d,c,h,l){return t(),r("div",null,[...e[0]||(e[0]=[i("",2)])])}const b=a(n,[["render",o]]);export{p as __pageData,b as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as s}from"./chunks/framework.B9qR_F1m.js";const f=JSON.parse('{"title":"0004 步骤结论只看结果文件","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0004-result-files.md","filePath":"reference/adr/0004-result-files.md","lastUpdated":null}'),i={name:"reference/adr/0004-result-files.md"};function l(o,e,d,n,c,h){return t(),r("div",null,[...e[0]||(e[0]=[s('<div><h1 id="_0004-步骤结论只看结果文件" tabindex="-1">0004 步骤结论只看结果文件 <a class="header-anchor" href="#_0004-步骤结论只看结果文件" aria-label="Permalink to "0004 步骤结论只看结果文件""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>模型最后一条回复的格式不稳定,无法可靠解析。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>每个步骤写一个 JSON 结果文件,字段由引擎校验;缺失或无效时在同一会话中追问,次数有上限。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>引擎的分支判断可靠、可测试。提示词需要说明结果文件的写法。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0004-result-files.md">docs/adr/0004-result-files.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0004-result-files.md">在 GitHub 上编辑</a></p>',2)])])}const p=a(i,[["render",l]]);export{f as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as s}from"./chunks/framework.B9qR_F1m.js";const f=JSON.parse('{"title":"0004 步骤结论只看结果文件","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0004-result-files.md","filePath":"reference/adr/0004-result-files.md","lastUpdated":null}'),i={name:"reference/adr/0004-result-files.md"};function l(o,e,d,n,c,h){return t(),r("div",null,[...e[0]||(e[0]=[s("",2)])])}const p=a(i,[["render",l]]);export{f as __pageData,p as default};
|
package/site-dist/assets/reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0005 不在默认分支上运行,只做本地提交","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0005-no-default-branch-local-commits-only.md","filePath":"reference/adr/0005-no-default-branch-local-commits-only.md","lastUpdated":null}'),l={name:"reference/adr/0005-no-default-branch-local-commits-only.md"};function n(i,a,c,d,s,h){return t(),o("div",null,[...a[0]||(a[0]=[r('<div><h1 id="_0005-不在默认分支上运行-只做本地提交" tabindex="-1">0005 不在默认分支上运行,只做本地提交 <a class="header-anchor" href="#_0005-不在默认分支上运行-只做本地提交" aria-label="Permalink to "0005 不在默认分支上运行,只做本地提交""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>流水线无人值守地修改和提交代码,合并上线必须由人决定。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>拒绝在默认分支(main、master、origin/HEAD 指向的分支)和 detached HEAD 上启动;续跑时分支必须与上次一致;步骤只做本地提交,不 push、不合并。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>推荐每个需求一个 worktree 工作区。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0005-no-default-branch-local-commits-only.md">docs/adr/0005-no-default-branch-local-commits-only.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0005-no-default-branch-local-commits-only.md">在 GitHub 上编辑</a></p>',2)])])}const f=e(l,[["render",n]]);export{u as __pageData,f as default};
|
package/site-dist/assets/reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.lean.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0005 不在默认分支上运行,只做本地提交","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0005-no-default-branch-local-commits-only.md","filePath":"reference/adr/0005-no-default-branch-local-commits-only.md","lastUpdated":null}'),l={name:"reference/adr/0005-no-default-branch-local-commits-only.md"};function n(i,a,c,d,s,h){return t(),o("div",null,[...a[0]||(a[0]=[r("",2)])])}const f=e(l,[["render",n]]);export{u as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as l,c as s,a3 as t}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0006 只安装到 ~/.agents/skills 和 ~/.claude/skills","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0006-skill-install-targets.md","filePath":"reference/adr/0006-skill-install-targets.md","lastUpdated":null}'),i={name:"reference/adr/0006-skill-install-targets.md"};function r(d,a,n,o,c,k){return l(),s("div",null,[...a[0]||(a[0]=[t('<div><h1 id="_0006-只安装到-agents-skills-和-claude-skills" tabindex="-1">0006 只安装到 ~/.agents/skills 和 ~/.claude/skills <a class="header-anchor" href="#_0006-只安装到-agents-skills-和-claude-skills" aria-label="Permalink to "0006 只安装到 ~/.agents/skills 和 ~/.claude/skills""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>Paseo 运行各 agent 自己的命令行工具。~/.agents/skills 被 Codex、Pi、OpenCode 读取;Claude Code 读 ~/.claude/skills。同时装到更多目录会让同一个 skill 出现多份。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>默认安装到 ~/.agents/skills,以及存在时的 ~/.claude/skills;其他目录用 --target 追加并被记住。暂不安装到 ~/.codex/skills。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>覆盖四种 agent。Codex 的触发方式需要在真实环境中确认。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0006-skill-install-targets.md">docs/adr/0006-skill-install-targets.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0006-skill-install-targets.md">在 GitHub 上编辑</a></p>',2)])])}const p=e(i,[["render",r]]);export{u as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as l,c as s,a3 as t}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0006 只安装到 ~/.agents/skills 和 ~/.claude/skills","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0006-skill-install-targets.md","filePath":"reference/adr/0006-skill-install-targets.md","lastUpdated":null}'),i={name:"reference/adr/0006-skill-install-targets.md"};function r(d,a,n,o,c,k){return l(),s("div",null,[...a[0]||(a[0]=[t("",2)])])}const p=e(i,[["render",r]]);export{u as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as i,o as a,c as l,a3 as t}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0007 自带需求访谈 skill,不依赖外部 skill 包","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0007-own-interview-skill.md","filePath":"reference/adr/0007-own-interview-skill.md","lastUpdated":null}'),r={name:"reference/adr/0007-own-interview-skill.md"};function n(s,e,o,d,c,k){return a(),l("div",null,[...e[0]||(e[0]=[t('<div><h1 id="_0007-自带需求访谈-skill-不依赖外部-skill-包" tabindex="-1">0007 自带需求访谈 skill,不依赖外部 skill 包 <a class="header-anchor" href="#_0007-自带需求访谈-skill-不依赖外部-skill-包" aria-label="Permalink to "0007 自带需求访谈 skill,不依赖外部 skill 包""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>脚本版依赖 Matt Pocock 的 grilling 和 domain-modeling。后者已把术语文件从 CONTEXT.md 改为 GLOSSARY.md,说明外部依赖的文件约定会漂移。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>req-kit 自带 requirement-interview,术语写入 GLOSSARY.md,读取时兼容 CONTEXT.md。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>安装少一步,行为由 req-kit 自己掌控和评估。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0007-own-interview-skill.md">docs/adr/0007-own-interview-skill.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0007-own-interview-skill.md">在 GitHub 上编辑</a></p>',2)])])}const p=i(r,[["render",n]]);export{m as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as i,o as a,c as l,a3 as t}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0007 自带需求访谈 skill,不依赖外部 skill 包","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0007-own-interview-skill.md","filePath":"reference/adr/0007-own-interview-skill.md","lastUpdated":null}'),r={name:"reference/adr/0007-own-interview-skill.md"};function n(s,e,o,d,c,k){return a(),l("div",null,[...e[0]||(e[0]=[t("",2)])])}const p=i(r,[["render",n]]);export{m as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const _=JSON.parse('{"title":"0008 入口 skill 之间不互相调用","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0008-entries-do-not-call-entries.md","filePath":"reference/adr/0008-entries-do-not-call-entries.md","lastUpdated":null}'),l={name:"reference/adr/0008-entries-do-not-call-entries.md"};function o(s,e,n,d,c,h){return t(),r("div",null,[...e[0]||(e[0]=[i('<div><h1 id="_0008-入口-skill-之间不互相调用" tabindex="-1">0008 入口 skill 之间不互相调用 <a class="header-anchor" href="#_0008-入口-skill-之间不互相调用" aria-label="Permalink to "0008 入口 skill 之间不互相调用""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>入口(/req、/req-doctor 等)由用户触发。一个入口调用另一个入口,会让行为难以预期,也难以单独评估。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>入口可以调用方法 skill、引用原则、执行引擎命令;需要另一个入口时,告诉用户去运行它。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>每个入口的行为可以独立预期和测试。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0008-entries-do-not-call-entries.md">docs/adr/0008-entries-do-not-call-entries.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0008-entries-do-not-call-entries.md">在 GitHub 上编辑</a></p>',2)])])}const f=a(l,[["render",o]]);export{_ as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const _=JSON.parse('{"title":"0008 入口 skill 之间不互相调用","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0008-entries-do-not-call-entries.md","filePath":"reference/adr/0008-entries-do-not-call-entries.md","lastUpdated":null}'),l={name:"reference/adr/0008-entries-do-not-call-entries.md"};function o(s,e,n,d,c,h){return t(),r("div",null,[...e[0]||(e[0]=[i("",2)])])}const f=a(l,[["render",o]]);export{_ as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0009 程序与本机配置分开存放,按版本目录并存","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0009-versioned-install-layout.md","filePath":"reference/adr/0009-versioned-install-layout.md","lastUpdated":null}'),l={name:"reference/adr/0009-versioned-install-layout.md"};function o(s,a,n,d,c,h){return t(),r("div",null,[...a[0]||(a[0]=[i('<div><h1 id="_0009-程序与本机配置分开存放-按版本目录并存" tabindex="-1">0009 程序与本机配置分开存放,按版本目录并存 <a class="header-anchor" href="#_0009-程序与本机配置分开存放-按版本目录并存" aria-label="Permalink to "0009 程序与本机配置分开存放,按版本目录并存""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>脚本版的配置放在程序目录里,升级要手工保留配置;运行中的流水线依赖程序文件,直接覆盖有风险;也无法快速回滚。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>程序放在 ~/tools/req-kit/versions/<版本>/,本机配置放在 ~/.req-kit/。在哪个版本目录运行 install.mjs,就启用哪个版本。状态文件带格式版本,可迁移。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>升级不动配置;运行中的流水线按旧版本跑完;回滚是一条命令。旧版本目录需要定期清理(install.mjs --prune 会列出)。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0009-versioned-install-layout.md">docs/adr/0009-versioned-install-layout.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0009-versioned-install-layout.md">在 GitHub 上编辑</a></p>',2)])])}const _=e(l,[["render",o]]);export{p as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,o as t,c as r,a3 as i}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0009 程序与本机配置分开存放,按版本目录并存","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0009-versioned-install-layout.md","filePath":"reference/adr/0009-versioned-install-layout.md","lastUpdated":null}'),l={name:"reference/adr/0009-versioned-install-layout.md"};function o(s,a,n,d,c,h){return t(),r("div",null,[...a[0]||(a[0]=[i("",2)])])}const _=e(l,[["render",o]]);export{p as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as r,c as t,a3 as d}from"./chunks/framework.B9qR_F1m.js";const h=JSON.parse('{"title":"0010 需求总览现场生成,不维护 INDEX.md","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0010-generated-feature-overview.md","filePath":"reference/adr/0010-generated-feature-overview.md","lastUpdated":null}'),o={name:"reference/adr/0010-generated-feature-overview.md"};function i(n,e,s,c,l,u){return r(),t("div",null,[...e[0]||(e[0]=[d('<div><h1 id="_0010-需求总览现场生成-不维护-index-md" tabindex="-1">0010 需求总览现场生成,不维护 INDEX.md <a class="header-anchor" href="#_0010-需求总览现场生成-不维护-index-md" aria-label="Permalink to "0010 需求总览现场生成,不维护 INDEX.md""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>设计方案计划在 <code>docs/features/INDEX.md</code> 中维护所有需求的一览。但每个需求在自己的 worktree 和分支上进行,如果每个分支都修改同一个提交进仓库的文件,合并时会反复冲突;而且一个工作区里看不到其他工作区尚未合并的需求。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>不提交 <code>INDEX.md</code>。<code>start-pipeline --list</code> 现场扫描这个仓库所有 worktree 中的 <code>docs/features/*/spec.md</code>、状态文件和验收记录,生成总览;同一需求出现在多个工作区时取最近更新的一份。<code>/req</code> 在路由、查看进度和接手时使用它。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>没有合并冲突,能看到所有工作区中的需求。代价是总览只在本机生成;不在这台机器上的工作区看不到。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0010-generated-feature-overview.md">docs/adr/0010-generated-feature-overview.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0010-generated-feature-overview.md">在 GitHub 上编辑</a></p>',2)])])}const m=a(o,[["render",i]]);export{h as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as r,c as t,a3 as d}from"./chunks/framework.B9qR_F1m.js";const h=JSON.parse('{"title":"0010 需求总览现场生成,不维护 INDEX.md","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0010-generated-feature-overview.md","filePath":"reference/adr/0010-generated-feature-overview.md","lastUpdated":null}'),o={name:"reference/adr/0010-generated-feature-overview.md"};function i(n,e,s,c,l,u){return r(),t("div",null,[...e[0]||(e[0]=[d("",2)])])}const m=a(o,[["render",i]]);export{h as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as o}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0011 完成后修改 spec 可以继续开发","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0011-resume-after-completion.md","filePath":"reference/adr/0011-resume-after-completion.md","lastUpdated":null}'),s={name:"reference/adr/0011-resume-after-completion.md"};function i(c,e,d,n,l,p){return t(),r("div",null,[...e[0]||(e[0]=[o('<div><h1 id="_0011-完成后修改-spec-可以继续开发" tabindex="-1">0011 完成后修改 spec 可以继续开发 <a class="header-anchor" href="#_0011-完成后修改-spec-可以继续开发" aria-label="Permalink to "0011 完成后修改 spec 可以继续开发""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>修改需求、验收发现问题时,流水线往往已经完成。原来的规则是"已完成的流水线不能 --resume,只能 --restart",而 --restart 会丢掉运行记录,也不是使用者想表达的意思。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>流水线已完成、且 spec.md 在完成后被修改过时,<code>--resume</code> 从方案设计重新开始(第 N+1 次尝试),沿用原来的发起对话和分支;spec 没有改过时仍然拒绝,并说明先更新 spec。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>"修改需求"和"验收"手册可以统一用"继续"命令;每次重开都有 changes.md 中的记录可查。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0011-resume-after-completion.md">docs/adr/0011-resume-after-completion.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0011-resume-after-completion.md">在 GitHub 上编辑</a></p>',2)])])}const h=a(s,[["render",i]]);export{u as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as o}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0011 完成后修改 spec 可以继续开发","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0011-resume-after-completion.md","filePath":"reference/adr/0011-resume-after-completion.md","lastUpdated":null}'),s={name:"reference/adr/0011-resume-after-completion.md"};function i(c,e,d,n,l,p){return t(),r("div",null,[...e[0]||(e[0]=[o("",2)])])}const h=a(s,[["render",i]]);export{u as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as r,c as t,a3 as i}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0012 评审小组:首轮并行评审,评审者核实汇总","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0012-review-panel.md","filePath":"reference/adr/0012-review-panel.md","lastUpdated":null}'),o={name:"reference/adr/0012-review-panel.md"};function d(l,e,n,c,s,p){return r(),t("div",null,[...e[0]||(e[0]=[i('<div><h1 id="_0012-评审小组-首轮并行评审-评审者核实汇总" tabindex="-1">0012 评审小组:首轮并行评审,评审者核实汇总 <a class="header-anchor" href="#_0012-评审小组-首轮并行评审-评审者核实汇总" aria-label="Permalink to "0012 评审小组:首轮并行评审,评审者核实汇总""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>单一模型评审容易有固定的盲区;参考 pstack 的 <code>/interrogate</code>,多个模型独立评审能发现更多问题。但成员意见直接投票会放大误报,而且并行的成员在同一个目录里提交代码会互相冲突。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li>配置 <code>reviewPanel</code> 开启,默认关闭;默认只用于标准档、方案审核和代码评审的第一轮。后续轮次只核对修复,用单个评审者。</li><li>成员并行运行,只读代码,各写一份意见文件到 <code><功能目录>/review-panel/</code>,不提交、不写 <code>progress.md</code> 和 <code>decisions.tsv</code>。</li><li>配置的 <code>reviewer</code> 作为汇总者,逐条核实并归入"必须修改 / 建议修改 / 留给人决定 / 已驳回"四类;结论只依据核实后的"必须修改",不按成员数量投票。被驳回和留给人决定的意见记入 <code>decisions.tsv</code>,最终报告展示。</li><li>部分成员失败时只汇总完成的成员;全部失败时该步骤失败。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>开启后每次评审多出 N 个 agent 的用量。汇总者的核实质量决定了效果,需要通过评估观察误报和漏报。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0012-review-panel.md">docs/adr/0012-review-panel.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0012-review-panel.md">在 GitHub 上编辑</a></p>',2)])])}const _=a(o,[["render",d]]);export{u as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as r,c as t,a3 as i}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0012 评审小组:首轮并行评审,评审者核实汇总","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0012-review-panel.md","filePath":"reference/adr/0012-review-panel.md","lastUpdated":null}'),o={name:"reference/adr/0012-review-panel.md"};function d(l,e,n,c,s,p){return r(),t("div",null,[...e[0]||(e[0]=[i("",2)])])}const _=a(o,[["render",d]]);export{u as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0013 发布不使用 changesets 等工具","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0013-no-release-tooling.md","filePath":"reference/adr/0013-no-release-tooling.md","lastUpdated":null}'),s={name:"reference/adr/0013-no-release-tooling.md"};function n(i,e,l,d,c,h){return t(),o("div",null,[...e[0]||(e[0]=[r('<div><h1 id="_0013-发布不使用-changesets-等工具" tabindex="-1">0013 发布不使用 changesets 等工具 <a class="header-anchor" href="#_0013-发布不使用-changesets-等工具" aria-label="Permalink to "0013 发布不使用 changesets 等工具""></a></h1><ul><li>状态:已采纳(取代设计方案中"由 changesets 维护 CHANGELOG"的计划)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>设计方案计划用 changesets 维护版本号和 CHANGELOG。req-kit 是单一包、发布频率低,CHANGELOG 的主要读者是使用者和安装者,需要"使用者会看到的变化"和"升级须知"这样的结构,工具生成的条目还要人工改写。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>版本号和 CHANGELOG 由维护者按 <a href="./../../guide/maintainer">维护者指南</a> 的发布流程手工维护;标签不带 <code>v</code> 前缀。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>少一个开发依赖。需要维护者在每次发布时认真写 CHANGELOG;发布流程中的验证步骤由指南约束。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0013-no-release-tooling.md">docs/adr/0013-no-release-tooling.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0013-no-release-tooling.md">在 GitHub 上编辑</a></p>',2)])])}const _=a(s,[["render",n]]);export{p as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0013 发布不使用 changesets 等工具","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0013-no-release-tooling.md","filePath":"reference/adr/0013-no-release-tooling.md","lastUpdated":null}'),s={name:"reference/adr/0013-no-release-tooling.md"};function n(i,e,l,d,c,h){return t(),o("div",null,[...e[0]||(e[0]=[r("",2)])])}const _=a(s,[["render",n]]);export{p as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t,o as a,c as i,a3 as o}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0014 外部通知只留接口,不内置任何 IM","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0014-notifier-slot.md","filePath":"reference/adr/0014-notifier-slot.md","lastUpdated":null}'),r={name:"reference/adr/0014-notifier-slot.md"};function l(s,e,d,n,c,f){return a(),i("div",null,[...e[0]||(e[0]=[o('<div><h1 id="_0014-外部通知只留接口-不内置任何-im" tabindex="-1">0014 外部通知只留接口,不内置任何 IM <a class="header-anchor" href="#_0014-外部通知只留接口-不内置任何-im" aria-label="Permalink to "0014 外部通知只留接口,不内置任何 IM""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>需求方往往不一直盯着 Paseo 对话,"需要你决定""开发中断""已完成"这几个时刻希望在企业内部 IM 中收到。各企业的 IM 不同,鉴权和接口多是内部的,req-kit 无法也不应该内置。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li>引擎在 milestone、blocked、permission、failed、completed 五个时刻,除发回发起的对话外,调用配置中 <code>notifiers</code> 列出的本机模块,事件格式见 <a href="./../contracts/notifier-event">contracts/notifier-event.md</a>(<code>schema: 1</code>)。</li><li>模块由使用方实现(从 <code>notifiers/im-template.mjs</code> 复制),req-kit 不为它安装依赖。</li><li><code>notifiers</code> 只能写在本机或团队配置中,项目配置中的会被忽略:项目仓库里的内容不应决定在本机执行哪段代码、往哪里发消息。</li><li>通知失败或超过 15 秒只记日志,不影响流水线。</li><li><code>req notify-test</code> 发示例事件,接入时不需要真的运行流水线。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>接入 IM 只需写一个函数。事件格式成为对外约定,同一 <code>schema</code> 内只增加字段。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0014-notifier-slot.md">docs/adr/0014-notifier-slot.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0014-notifier-slot.md">在 GitHub 上编辑</a></p>',2)])])}const u=t(r,[["render",l]]);export{m as __pageData,u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t,o as a,c as i,a3 as o}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0014 外部通知只留接口,不内置任何 IM","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0014-notifier-slot.md","filePath":"reference/adr/0014-notifier-slot.md","lastUpdated":null}'),r={name:"reference/adr/0014-notifier-slot.md"};function l(s,e,d,n,c,f){return a(),i("div",null,[...e[0]||(e[0]=[o("",2)])])}const u=t(r,[["render",l]]);export{m as __pageData,u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as n}from"./chunks/framework.B9qR_F1m.js";const h=JSON.parse('{"title":"0015 需求变更后增量继续,而不是从零重做","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0015-incremental-continue.md","filePath":"reference/adr/0015-incremental-continue.md","lastUpdated":null}'),o={name:"reference/adr/0015-incremental-continue.md"};function i(c,e,l,d,s,u){return t(),r("div",null,[...e[0]||(e[0]=[n('<div><h1 id="_0015-需求变更后增量继续-而不是从零重做" tabindex="-1">0015 需求变更后增量继续,而不是从零重做 <a class="header-anchor" href="#_0015-需求变更后增量继续-而不是从零重做" aria-label="Permalink to "0015 需求变更后增量继续,而不是从零重做""></a></h1><ul><li>状态:已采纳(细化 <a href="./0011-resume-after-completion">0011</a>:0011 决定"可以继续",本条决定"怎么继续")</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>1.2 中 spec 改动或回答了需求方的问题后继续,是"从方案设计重新开始":步骤 agent 拿到的提示与第一次相同,往往重新写一遍方案、重新审核全部代码,耗时接近第一次,还可能改掉已经验收过的部分。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li>从方案设计继续时,状态中记录 <code>incremental</code>:接着第几次尝试、原因、本次开始时的提交、上一次是否已写过代码。</li><li>各步骤的提示附加 <code>engine/prompts/incremental.md</code>:方案在原文末尾追加"第 N 次尝试:需求变更"一节,只设计变化的部分;实现只改需要改的;代码评审只看本次开始以来的改动;验证重点验变化的验收标准,并回归其余的;报告说明这是第几次。</li><li><code>--restart</code> 仍是完全从零开始,不参考上次的方案和代码。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>变更后的继续通常比第一次快很多。增量的前提是上次的方案和提交还在分支上;如果分支被重置过,应使用 <code>--restart</code>。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0015-incremental-continue.md">docs/adr/0015-incremental-continue.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0015-incremental-continue.md">在 GitHub 上编辑</a></p>',2)])])}const p=a(o,[["render",i]]);export{h as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as r,a3 as n}from"./chunks/framework.B9qR_F1m.js";const h=JSON.parse('{"title":"0015 需求变更后增量继续,而不是从零重做","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0015-incremental-continue.md","filePath":"reference/adr/0015-incremental-continue.md","lastUpdated":null}'),o={name:"reference/adr/0015-incremental-continue.md"};function i(c,e,l,d,s,u){return t(),r("div",null,[...e[0]||(e[0]=[n("",2)])])}const p=a(o,[["render",i]]);export{h as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as t,a3 as r}from"./chunks/framework.B9qR_F1m.js";const g=JSON.parse('{"title":"0016 一键升级:从 git 标签下载到 versions/ 再切换","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0016-upgrade-from-tags.md","filePath":"reference/adr/0016-upgrade-from-tags.md","lastUpdated":null}'),d={name:"reference/adr/0016-upgrade-from-tags.md"};function i(s,e,l,c,n,m){return o(),t("div",null,[...e[0]||(e[0]=[r('<div><h1 id="_0016-一键升级-从-git-标签下载到-versions-再切换" tabindex="-1">0016 一键升级:从 git 标签下载到 versions/ 再切换 <a class="header-anchor" href="#_0016-一键升级-从-git-标签下载到-versions-再切换" aria-label="Permalink to "0016 一键升级:从 git 标签下载到 versions/ 再切换""></a></h1><ul><li>状态:已采纳(在 <a href="./0009-versioned-install-layout">0009</a> 的目录结构上增加自动化)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>手工升级要 clone、npm install、运行 install.mjs 三步,非专业开发的使用者容易漏掉 npm install 或在错误的目录运行。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><code>node install.mjs --upgrade [版本]</code>(<code>req upgrade</code>):用 <code>git ls-remote --tags</code> 读取已发布版本,<code>git clone --depth 1 --branch <标签></code> 到 <code>versions/<版本></code>,<code>npm install --omit=dev</code>,再运行新版本的 <code>install.mjs</code> 切换。</li><li>不写版本时取最新版本;当前是正式版时只升级到正式版,当前是预发布版(beta)时也考虑预发布版。</li><li>下载地址取 <code>package.json</code> 的 <code>repository</code>,可用环境变量 <code>REQ_KIT_REPO_URL</code> 或 <code>--from</code> 改为内网镜像。</li><li>任何一步失败,当前版本不受影响;下载先写到临时目录,完整后才改名为版本目录。</li><li>安装时在 <code>~/.req-kit/bin</code> 写入 <code>req</code>(和 Windows 的 <code>req.cmd</code>),指向当前启用的版本。是否加入 PATH 由使用者决定,安装程序只给出命令,不修改系统设置。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>升级只需要 git 和 npm 可用;回滚仍是在旧版本目录运行 <code>node install.mjs</code>。体检会提示有新版本(离线时跳过)。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0016-upgrade-from-tags.md">docs/adr/0016-upgrade-from-tags.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0016-upgrade-from-tags.md">在 GitHub 上编辑</a></p>',2)])])}const h=a(d,[["render",i]]);export{g as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as t,a3 as r}from"./chunks/framework.B9qR_F1m.js";const g=JSON.parse('{"title":"0016 一键升级:从 git 标签下载到 versions/ 再切换","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0016-upgrade-from-tags.md","filePath":"reference/adr/0016-upgrade-from-tags.md","lastUpdated":null}'),d={name:"reference/adr/0016-upgrade-from-tags.md"};function i(s,e,l,c,n,m){return o(),t("div",null,[...e[0]||(e[0]=[r("",2)])])}const h=a(d,[["render",i]]);export{g as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as i,a3 as t}from"./chunks/framework.B9qR_F1m.js";const f=JSON.parse('{"title":"0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0017-use-paseo-capabilities.md","filePath":"reference/adr/0017-use-paseo-capabilities.md","lastUpdated":null}'),s={name:"reference/adr/0017-use-paseo-capabilities.md"};function r(l,e,d,n,c,p){return o(),i("div",null,[...e[0]||(e[0]=[t('<div><h1 id="_0017-用好-paseo-自身的能力-profile、工作区脚本、用量和时间线" tabindex="-1">0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线 <a class="header-anchor" href="#_0017-用好-paseo-自身的能力-profile、工作区脚本、用量和时间线" aria-label="Permalink to "0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>1.3 及以前,req-kit 只用到 Paseo 的"创建 agent 并挂在对话下"和"等待结束"。Paseo 0.11 已经提供了 agent profile(带使用说明的启动配置)、<code>paseo.json</code>(worktree 准备脚本和受监管的服务,每个工作区独立端口)、provider 用量、agent 时间线等能力。req-kit 自己再实现一遍既重复,又和使用者在 Paseo 界面里看到的不一致。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>agent 配置可以引用 Paseo profile</strong>(<code>paseoProfile</code>),在每次运行开始时从 daemon 读取并解析;找不到时拒绝启动并列出现有的 profile。</li><li><strong>服务交给 Paseo</strong>:对话所在工作区的 <code>paseo.json</code> 定义了服务时,流水线在需要服务的步骤前通过 Paseo 重启它们,结束后停止;步骤 agent 只拿到地址和状态。<code>paseoServices: "off"</code> 或没有发起对话时,仍由步骤 agent 自己启动。</li><li><strong>用量和时间线只用于提示</strong>:额度紧张时提醒一次,不阻止运行;查看进度时附上 agent 最近的活动,读不到就省略。</li><li>工作区脚本在 <code>@getpaseo/client</code> 0.11 的公开 API 中还没有,暂时通过它导出的 <code>internal/daemon-client</code> 调用,并且每一处都在不可用时退回原来的做法。req-kit 已经把 Paseo 版本限定在 0.11.x(<code>reqKit.paseo</code>),升级 Paseo 支持范围时必须复查这一处。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>使用者在 Paseo 里改 profile、写 <code>paseo.json</code> 就能影响流水线,不必再改 req-kit 的配置。依赖了一个内部接口,升级 Paseo 时有额外的检查项(维护者指南的发布流程中已列出)。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0017-use-paseo-capabilities.md">docs/adr/0017-use-paseo-capabilities.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0017-use-paseo-capabilities.md">在 GitHub 上编辑</a></p>',2)])])}const h=a(s,[["render",r]]);export{f as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as i,a3 as t}from"./chunks/framework.B9qR_F1m.js";const f=JSON.parse('{"title":"0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0017-use-paseo-capabilities.md","filePath":"reference/adr/0017-use-paseo-capabilities.md","lastUpdated":null}'),s={name:"reference/adr/0017-use-paseo-capabilities.md"};function r(l,e,d,n,c,p){return o(),i("div",null,[...e[0]||(e[0]=[t("",2)])])}const h=a(s,[["render",r]]);export{f as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as r,c as t,a3 as a}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0018 可选:流水线为需求新建 worktree 工作区","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0018-own-worktree-option.md","filePath":"reference/adr/0018-own-worktree-option.md","lastUpdated":null}'),i={name:"reference/adr/0018-own-worktree-option.md"};function n(d,e,s,l,c,p){return r(),t("div",null,[...e[0]||(e[0]=[a('<div><h1 id="_0018-可选-流水线为需求新建-worktree-工作区" tabindex="-1">0018 可选:流水线为需求新建 worktree 工作区 <a class="header-anchor" href="#_0018-可选-流水线为需求新建-worktree-工作区" aria-label="Permalink to "0018 可选:流水线为需求新建 worktree 工作区""></a></h1><ul><li>状态:已采纳(补充 <a href="./0001-step-agents-under-origin-chat">0001</a>、<a href="./0002-no-directory-switch-in-chat">0002</a>:两条的规则不变,增加一种由流水线放置步骤的方式)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>在项目主目录、主分支上发起的需求,原来只能请使用者自己在 Paseo 中新建 worktree 工作区、换到那里的对话重新开始,或者在主目录新建分支(主目录被占用几个小时)。对不熟悉 worktree 的使用者来说,第一种多了一次切换,第三种影响主目录。</p><p>Paseo 0.11 支持在指定的工作区中创建 agent,同时保持它是发起对话的子 agent("放置不改变归属"),也能由 SDK 新建 worktree 工作区并执行 <code>paseo.json</code> 的准备脚本。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li>启动时加 <code>--worktree</code>(<code>/req</code> 中的"启动(自动新建工作区)"):流水线用 Paseo 从当前分支切出 <code>feature/<功能目录名></code>,新建 worktree 工作区;把需求说明等文件移过去并在新分支上提交(原处未提交的副本删除,已提交的保留);之后各步骤 agent 放在这个工作区中运行,仍然挂在发起的对话下。</li><li><strong>对话的工作目录不变</strong>(0002 不变)。对话里的查看进度、暂停、继续、验收命令照常在原目录执行,启动器会按状态文件中记录的来源目录找到新工作区;只允许从这个来源目录的对话操作。</li><li>发给对话的通知中,功能目录和报告写完整路径,因为它们不在对话的目录里。</li><li>只用于第一次启动;已经在原处运行过的需求不能中途改为新工作区。</li><li>默认仍然是原来的方式,这是一个可选项。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>主分支上发起的需求不再需要使用者手动建工作区;<code>paseo.json</code> 的准备脚本自动执行。对话 agent 需要用完整路径读写需求文件,<code>/req</code> 中已写明。新工作区的归档和清理仍由使用者在 Paseo 中决定。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0018-own-worktree-option.md">docs/adr/0018-own-worktree-option.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0018-own-worktree-option.md">在 GitHub 上编辑</a></p>',2)])])}const k=o(i,[["render",n]]);export{u as __pageData,k as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as r,c as t,a3 as a}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0018 可选:流水线为需求新建 worktree 工作区","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0018-own-worktree-option.md","filePath":"reference/adr/0018-own-worktree-option.md","lastUpdated":null}'),i={name:"reference/adr/0018-own-worktree-option.md"};function n(d,e,s,l,c,p){return r(),t("div",null,[...e[0]||(e[0]=[a("",2)])])}const k=o(i,[["render",n]]);export{u as __pageData,k as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as r,a3 as t}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0019-parallel-orchestration.md","filePath":"reference/adr/0019-parallel-orchestration.md","lastUpdated":null}'),s={name:"reference/adr/0019-parallel-orchestration.md"};function i(l,e,d,c,n,p){return o(),r("div",null,[...e[0]||(e[0]=[t('<div><h1 id="_0019-用-paseo-的并行子-agent-确认前独立审阅、方案提案" tabindex="-1">0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案 <a class="header-anchor" href="#_0019-用-paseo-的并行子-agent-确认前独立审阅、方案提案" aria-label="Permalink to "0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>Paseo 自带 <code>/paseo-advisor</code>(第二意见)、<code>/paseo-committee</code>(两个模型独立分析)等编排 skill。它们由聊天 agent 自由发挥,结果没有固定的去处,也不会稳定地写回需求文件;直接让 <code>/req</code> 调用它们还违反"入口不调用入口"(ADR 0008)。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><p>同样的思路由 req-kit 的引擎以固定的步骤实现,产物写进功能目录:</p><ul><li><strong>需求说明审阅</strong>(<code>--spec-review</code>):在需求方确认之前,由 reviewer(通常与对话用的不是同一个模型)在后台独立审阅草稿,写 <code>spec-review.md</code>,把问题写成带推荐的选择题;完成后通知对话,由对话 agent 核对后逐个问用户。不改 spec、不提交。默认只用于标准档(<code>specReview</code>)。</li><li><strong>方案提案</strong>(<code>designProposals</code>,默认关闭):标准档的方案设计之前,几个 agent(默认 builder 和 reviewer)并行各提一份方案,方案设计步骤比较后决定,并在 <code>design.md</code> 中写"方案比较"。增量继续时不做。</li><li><strong>浏览器验证</strong>(<code>browserVerify</code>):步骤 agent 有 Paseo 浏览器工具时,验证类步骤按验收标准在浏览器中实际操作。</li></ul><p>Paseo 的编排 skill 仍然推荐使用者单独使用(例如对一个疑难问题请 <code>/paseo-committee</code>),文档中说明。</p><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>确认前多一次几分钟的审阅,能在开发之前发现遗漏和歧义;方案提案以多一份方案的用量换取复杂需求的方案质量,所以默认关闭。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0019-parallel-orchestration.md">docs/adr/0019-parallel-orchestration.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0019-parallel-orchestration.md">在 GitHub 上编辑</a></p>',2)])])}const m=a(s,[["render",i]]);export{u as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as r,a3 as t}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0019-parallel-orchestration.md","filePath":"reference/adr/0019-parallel-orchestration.md","lastUpdated":null}'),s={name:"reference/adr/0019-parallel-orchestration.md"};function i(l,e,d,c,n,p){return o(),r("div",null,[...e[0]||(e[0]=[t("",2)])])}const m=a(s,[["render",i]]);export{u as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const g=JSON.parse('{"title":"0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0020-scheduling-through-the-chat.md","filePath":"reference/adr/0020-scheduling-through-the-chat.md","lastUpdated":null}'),d={name:"reference/adr/0020-scheduling-through-the-chat.md"};function s(i,e,c,h,n,l){return t(),o("div",null,[...e[0]||(e[0]=[r('<div><h1 id="_0020-调度-用-paseo-定时任务把消息发回对话-排队在本机进行" tabindex="-1">0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行 <a class="header-anchor" href="#_0020-调度-用-paseo-定时任务把消息发回对话-排队在本机进行" aria-label="Permalink to "0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行""></a></h1><ul><li>状态:已采纳</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>需求开发要几个小时,使用者常常不在电脑前:希望晚上或明天早上再开始;限流中断后能自己接着做;等自己回答问题太久时有人提醒;同一台机器同时跑太多条流水线会抢资源和额度。</p><p>流水线进程是后台脚本,进程结束后就没有谁来做"过一会儿再做某事"。Paseo 的定时任务(schedules)由 daemon 保存,机器重启后仍然有效,可以在指定时间把一段话发进某个 agent 的对话,也可以按时间表启动新 agent。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>需要"以后再做"的事,都用 Paseo 定时任务把一条写明步骤的消息发回发起的对话</strong>,由对话 agent 执行 req-kit 的命令:预约开始(<code>--at</code>)、等待回答的提醒(<code>waitingReminderHours</code>)、临时错误后的自动继续(<code>autoResumeMinutes</code>,每次尝试最多 <code>autoResumeMax</code> 次)、可选的定时检查(<code>watchdogMinutes</code>,默认关闭)。消息先让对话 agent 查看进度,状态不符就什么也不做,所以重复或过期的消息无害。</li><li>这些定时任务记在状态文件中,下一次运行和暂停命令会取消它们;预约开始记在 <code>.pipeline/scheduled-start.json</code>。</li><li><strong>并发上限在本机实现</strong>(<code>maxConcurrentPipelines</code>,<code>~/.req-kit/slots/</code>):排队的流水线进程自己等待名额,不需要 Paseo 参与。</li><li><strong>需求总览</strong>(<code>req digest</code>)发给外部通知;<code>--schedule</code> 用 Paseo 定时任务按时间表启动一个短暂的 agent 执行这条命令(会产生少量用量)。</li><li>Paseo 定时任务在 0.11 的公开 SDK 中还没有,和工作区脚本一样经由内部客户端调用(见 ADR 0017),不可用时这些功能自动关闭,并在输出中说明。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>使用者不在时,开发可以按时开始、出错后自己继续、等待太久会被提醒。每条定时消息会让对话 agent 运行一个回合,有少量用量;定时检查的回合最多,所以默认关闭。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0020-scheduling-through-the-chat.md">docs/adr/0020-scheduling-through-the-chat.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0020-scheduling-through-the-chat.md">在 GitHub 上编辑</a></p>',2)])])}const p=a(d,[["render",s]]);export{g as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const g=JSON.parse('{"title":"0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0020-scheduling-through-the-chat.md","filePath":"reference/adr/0020-scheduling-through-the-chat.md","lastUpdated":null}'),d={name:"reference/adr/0020-scheduling-through-the-chat.md"};function s(i,e,c,h,n,l){return t(),o("div",null,[...e[0]||(e[0]=[r("",2)])])}const p=a(d,[["render",s]]);export{g as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as a,c as r,a3 as n}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0021-npm-version-manager.md","filePath":"reference/adr/0021-npm-version-manager.md","lastUpdated":null}'),i={name:"reference/adr/0021-npm-version-manager.md"};function t(d,e,s,c,l,p){return a(),r("div",null,[...e[0]||(e[0]=[n('<div><h1 id="_0021-npm-分发-全局包是版本管理器-各版本仍装在-versions-下" tabindex="-1">0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下 <a class="header-anchor" href="#_0021-npm-分发-全局包是版本管理器-各版本仍装在-versions-下" aria-label="Permalink to "0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下""></a></h1><ul><li>状态:已采纳(在 <a href="./0009-versioned-install-layout">0009</a>、<a href="./0016-upgrade-from-tags">0016</a> 的基础上增加 npm 来源)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>git 安装要 clone、npm install、运行安装器三步,Windows 上还要自己把 <code>~/.req-kit/bin</code> 加进 PATH。npm 全局安装能解决这两点,但 <code>npm i -g</code> 升级时原地覆盖:正在运行的流水线每个步骤都从磁盘读提示词,会混用新旧版本,也失去了"旧版本目录保留、随时回滚"的保证(0009)。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li>只发布一个包 <code>paseo-req-kit</code>。用 <code>npm i -g</code> 安装的那一份是<strong>版本管理器</strong>:<code>req setup</code>、<code>req upgrade</code>、<code>req use</code>、<code>req versions</code> 由它处理,其他命令转交给 <code>~/.req-kit/active.json</code> 指向的版本。</li><li>版本仍装在 <code>~/tools/req-kit/versions/<版本></code>,用 <code>npm install --prefix versions/<版本> paseo-req-kit@<版本></code> 安装,程序在其中的 <code>node_modules/paseo-req-kit</code>。<code>req setup</code> 用 <code>npm pack</code> 把管理器自己装进去,不必再从仓库下载一次。</li><li><code>req upgrade</code> 从 npm 读版本列表,用本机 daemon 报告的版本和每个版本声明的 <code>reqKit.paseo</code> 范围筛选,只升级到能支持本机 Paseo 的版本。正式版另设 <code>paseo-<小版本></code> dist-tag,供手工安装。</li><li>git 方式安装继续支持,默认来源按安装方式决定,<code>--from</code> 可以改。</li><li>发布由 GitHub Actions 在标签推送时完成,使用 npm 可信发布(OIDC),不保存 npm 口令;Release 附带 <code>npm pack</code> 的安装包供离线和内网仓库使用。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><p>安装变成两条命令,PATH 由 npm 处理。管理器自身很少需要升级(<code>npm i -g paseo-req-kit</code> 即可),版本切换不受影响。读不到 daemon 版本时不能按 Paseo 版本筛选,会提示并在升级后建议体检。</p></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0021-npm-version-manager.md">docs/adr/0021-npm-version-manager.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0021-npm-version-manager.md">在 GitHub 上编辑</a></p>',2)])])}const h=o(i,[["render",t]]);export{u as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as a,c as r,a3 as n}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0021-npm-version-manager.md","filePath":"reference/adr/0021-npm-version-manager.md","lastUpdated":null}'),i={name:"reference/adr/0021-npm-version-manager.md"};function t(d,e,s,c,l,p){return a(),r("div",null,[...e[0]||(e[0]=[n("",2)])])}const h=o(i,[["render",t]]);export{u as __pageData,h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as d,c as a,a3 as c}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0022 分阶段执行:研发阶段、闸口、测试验证阶段","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0022-develop-and-verify-phases.md","filePath":"reference/adr/0022-develop-and-verify-phases.md","lastUpdated":null}'),i={name:"reference/adr/0022-develop-and-verify-phases.md"};function t(r,e,l,s,n,h){return d(),a("div",null,[...e[0]||(e[0]=[c('<div><h1 id="_0022-分阶段执行-研发阶段、闸口、测试验证阶段" tabindex="-1">0022 分阶段执行:研发阶段、闸口、测试验证阶段 <a class="header-anchor" href="#_0022-分阶段执行-研发阶段、闸口、测试验证阶段" aria-label="Permalink to "0022 分阶段执行:研发阶段、闸口、测试验证阶段""></a></h1><ul><li>状态:已采纳(补充 <a href="./0015-incremental-continue">0015</a>、<a href="./0018-own-worktree-option">0018</a>:测试阶段可以由同一仓库另一个工作区的对话接手)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>原来第 3–11 步一口气跑完,只在方案审核需要需求方决定时停下。很多团队的研发和测试是两拨人、两个节奏:研发完成要"提测",测试同事先部署测试环境、准备数据,再验证,或者干脆人工测试;验证也可能想用另一个模型,在另一个时间进行。</p><p>代码评审通过之后、服务启动和功能验证之前,是天然的分界。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li>分成固定的两个阶段:<strong>研发</strong>(方案设计 → 方案审核 ⇄ 修订 → 实现 → 代码评审 ⇄ 修复 → 提测说明)和<strong>测试验证</strong>(服务启动 → 功能验证 → 缺陷处理),中间一个闸口。不做任意切分、可配置的阶段:常见的交接点只有"提测"一处,任意切分会让状态、继续规则和手册都变复杂。阶段名在状态里用字符串(<code>develop</code>、<code>verify</code>),以后增加阶段不用改格式。</li><li>研发阶段最后新增一步"提测说明"(builder,<code>handoff.md</code>)。三种执行方式都写:连续时它是功能验证的输入,分阶段时是交给测试的单据,只做研发时是人工测试的依据。</li><li>闸口怎么走由<strong>执行方式</strong>决定,来源后者覆盖前者:配置 <code>phases.mode</code> → spec 头部 <code>- 执行方式:</code> → 启动参数 <code>--phases</code>。 <ul><li><code>continuous</code>(连续,默认):直接进入测试验证,与之前的行为一致。</li><li><code>gated</code>(分阶段):状态变为 <code>phase_done</code>,进程正常退出、不占排队名额;通知对话"研发完成,可以提测",外部通知新事件 <code>phase_done</code>;等待提醒(<code>waitingReminderHours</code>)也覆盖这个状态。<code>--resume --phase verify</code>(或在闸口单独的 <code>--resume</code>)开始测试验证,沿用研发阶段的结果。<code>--verify-at</code> 在研发完成时预约开始时间(复用 <a href="./0020-scheduling-through-the-chat">0020</a> 的定时任务);研发完成时时间已过就直接继续。</li><li><code>develop-only</code>(只做研发):写完提测说明后写一份研发报告并结束,状态为 <code>completed</code>;之后仍可用 <code>--phase verify</code> 让流水线做测试验证。</li></ul></li><li>测试验证阶段的选项写在 <code>phases.verify</code>,开始测试时也可以用参数临时指定: <ul><li><code>environment</code>:<code>local</code>(本地启动服务)或 <code>deployed</code>(对已部署的测试环境验证,需要功能目录中的 <code>test-env.md</code>,没有就拒绝开始;不在本地启动服务)。</li><li><code>agents</code>:测试阶段的步骤(服务启动、功能验证、缺陷修复、复验)可以用单独的 agent,格式同顶层 <code>agents</code>,可用 <code>paseoProfile</code>。完成报告仍用顶层的 builder。</li><li><code>defects</code>:<code>fix</code>(当场修复并复验,原来的做法)、<code>handback</code>(只记录,退回研发阶段:在 <code>changes.md</code> 追加"测试验证退回"一节,开始新的一次尝试,按 <a href="./0015-incremental-continue">0015</a> 从方案设计增量处理,修复经过代码评审、重新写提测说明后再提测;次数上限为档位的缺陷修复轮数)、<code>report</code>(只记录,直接出报告)。</li></ul></li><li>测试阶段开始前需求说明改过:按增量继续的规则回到研发阶段的方案设计。</li><li><strong>测试同事接手</strong>:需求在自动新建的工作区中开发(0018)且研发已完成(或已在测试验证阶段)时,同一仓库任何工作区中的对话都可以开始或继续测试验证;通知转到那个对话,步骤仍放在需求的工作区、挂在那个对话下。研发阶段仍然只能从来源目录的对话操作。不在自动新建工作区中的需求,测试同事需要在同一目录的对话中接手(步骤 agent 使用对话的目录,见 <a href="./0001-step-agents-under-origin-chat">0001</a>)。</li><li>安全边界不变:测试环境只能是测试用途的环境;<code>test-env.md</code> 只写口令在哪里取,不写口令本身;提示词继续禁止连接生产环境、使用生产凭据。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>状态文件只增加可选字段(<code>phases</code>、<code>phase</code>、<code>verifyAt</code>、<code>handbacks</code>、步骤记录的 <code>phase</code>)和状态值 <code>phase_done</code>,格式版本仍为 1。回滚到 1.6 后,旧引擎把 <code>phase_done</code> 当作可以继续的中断,继续时沿用研发结果、直接做验证,可以接受。</li><li>所有运行(包括连续方式)多一个"提测说明"步骤,通常几分钟。</li><li>外部通知按约定只增加了事件类型 <code>phase_done</code> 和字段。</li><li>用时与用量可以按阶段统计(状态、完成报告)。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0022-develop-and-verify-phases.md">docs/adr/0022-develop-and-verify-phases.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0022-develop-and-verify-phases.md">在 GitHub 上编辑</a></p>',2)])])}const f=o(i,[["render",t]]);export{u as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as d,c as a,a3 as c}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0022 分阶段执行:研发阶段、闸口、测试验证阶段","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0022-develop-and-verify-phases.md","filePath":"reference/adr/0022-develop-and-verify-phases.md","lastUpdated":null}'),i={name:"reference/adr/0022-develop-and-verify-phases.md"};function t(r,e,l,s,n,h){return d(),a("div",null,[...e[0]||(e[0]=[c("",2)])])}const f=o(i,[["render",t]]);export{u as __pageData,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as t,c as a,a3 as l}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0023 需求类型、质量门、按切片实现","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0023-types-gate-slices.md","filePath":"reference/adr/0023-types-gate-slices.md","lastUpdated":null}'),i={name:"reference/adr/0023-types-gate-slices.md"};function s(r,e,d,c,n,u){return t(),a("div",null,[...e[0]||(e[0]=[l('<div><h1 id="_0023-需求类型、质量门、按切片实现" tabindex="-1">0023 需求类型、质量门、按切片实现 <a class="header-anchor" href="#_0023-需求类型、质量门、按切片实现" aria-label="Permalink to "0023 需求类型、质量门、按切片实现""></a></h1><ul><li>状态:已采纳(补充 <a href="./0004-result-files">0004</a>:结果文件可以带计划字段;<a href="./0022-develop-and-verify-phases">0022</a>:评估类需求没有测试验证阶段)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>到 1.7 为止,所有需求走同一条路:方案设计 → 审核 → 一个 agent 实现全部任务 → 评审 → 验证。三个问题反复出现:</p><ol><li><strong>不同类型的需求要不同的做法。</strong> 修缺陷要先复现、找到原因;重构要先锁住现有行为;"能不能做"的评估根本不该写代码。用新功能的做法处理它们,结果常常"做了,但不是要的":缺陷改的是现象,重构顺手改了行为,评估做成了半成品。</li><li><strong>"规范"只是提示词里的建议。</strong> lint、测试、构建是否通过,靠实现 agent 自己说,评审 agent 再跑一遍;中间没有任何确定性的检查,改坏了也可能写成"通过"。</li><li><strong>大需求一个 agent 做不完。</strong> 上下文被填满、时限 4 小时、中断后整步重做。</li></ol><p>业界的做法(Matt Pocock 的 skills、pstack、Claude Code 和 Cursor 的最佳实践)在这几点上相同:按任务类型走不同的剧本;能用工具判定的交给确定性的检查,不靠模型自评;把工作切成可以单独验证的纵向切片。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><h3 id="需求类型" tabindex="-1">需求类型 <a class="header-anchor" href="#需求类型" aria-label="Permalink to "需求类型""></a></h3><ul><li>spec 头部的 <code>- 类型:</code> 由引擎读取。缺陷、重构、评估三种有自己的<strong>剧本</strong>;新需求、小改动和其他写法走原来的流程。配置 <code>requirementTypes</code> 可以关掉某个剧本(该类型改走原来的流程)。</li><li>剧本<strong>不新增步骤</strong>,而是改变已有步骤做什么:每种类型一个提示词文件 <code>engine/prompts/types/<类型>.md</code>,按"## 步骤名(步骤 ID)"分节,引擎把"所有步骤"一节和当前步骤的一节接在本步骤任务之后,并在 <code><pipeline-context></code> 中写明类型。步骤 ID、结果文件和状态都不变,续跑、增量继续、分阶段执行照常适用;<code>prompts.local/types/</code> 可以覆盖。剧本可以改步骤的显示名称(缺陷的方案设计叫"复现与定位")。</li><li><strong>缺陷</strong>:方案设计改为复现与定位,先提交一个修复前失败的复现测试或脚本,写 <code>diagnosis.md</code>(根因、影响面)。复现不了时结果文件写 <code>reproduced: false</code> 和要问的问题,流水线像方案审核阻塞一样暂停,把问题发回对话。修复必须让复现转绿,评审要实际确认它修复前失败。</li><li><strong>重构</strong>:先补特征测试锁住现有行为,单独提交;之后小步改动,每步全绿;评审的首要问题是"行为有没有变",特征测试的断言被改要说明理由。</li><li><strong>评估</strong>:只读。调研评估写 <code>assessment.md</code> → 评估审阅 ⇄ 修订 → 评估报告;没有实现、代码评审、提测和验证,执行方式一律按连续。功能目录之外有文件被改动时,引擎把它写进报告的上下文。报告最后给出需求草稿,对话可以接着提一个新需求。</li><li>类型由 <code>/req</code> 在访谈时判断并请用户确认;访谈的重点随类型变化(复现步骤、必须不变的行为、要回答的问题)。</li></ul><h3 id="质量门" tabindex="-1">质量门 <a class="header-anchor" href="#质量门" aria-label="Permalink to "质量门""></a></h3><ul><li>项目配置 <code>checks</code> 列出流水线<strong>自己运行</strong>的检查(格式、lint、类型检查、单元测试、构建),由 <code>/req-setup</code> 从实际跑通的命令写入。端到端测试和需要启动服务的检查不放这里,它们属于功能验证。</li><li>每次尝试开始时(方案设计之前,任何提交之前)运行全部检查,记录<strong>基线</strong>。放在方案设计之前,是因为缺陷的复现测试在复现与定位时就提交了,基线晚了会把整个测试检查记成"原本就失败"。</li><li>代码实现(每一片)、评审问题修复、缺陷修复结束后运行与改动相关的检查。只有<strong>改动前通过、现在失败</strong>的检查拦下:把命令和输出的最后部分作为追问发回<strong>同一个 agent</strong>(它还记得自己改了什么),最多 <code>qualityGate.fixAttempts</code> 次(默认 2)。仍然失败时<strong>照常继续</strong>,结果写进状态文件,交给代码评审(要求按阻塞或重要提出)和报告(结论最高为"有遗留问题")。不让一个 lint 问题卡住整个需求,也不会无声地放过。</li><li>比较以"一项检查"为单位,不细到测试用例:粗,但与项目的测试框架无关。原本就失败的检查不拦,但会在报告中列出。</li><li>检查通过系统 shell 运行(Windows 上是 cmd.exe),命令要写成各系统通用的形式,与 <code>paseo.json</code> 的约定相同。没有配置检查时一切照旧,报告注明"未配置"。</li></ul><h3 id="多模块与关联仓库" tabindex="-1">多模块与关联仓库 <a class="header-anchor" href="#多模块与关联仓库" aria-label="Permalink to "多模块与关联仓库""></a></h3><ul><li>检查可以带 <code>cwd</code> 或 <code>paths</code>:只有改动碰到这些路径时才运行,单仓库多模块的项目只检查改动的模块。</li><li>项目配置 <code>relatedRepos</code> 登记其他仓库(例如前端项目的后端)。步骤在 <code><pipeline-context></code> 中看到它们的位置、分支和提交,按 <code>related-repos.md</code> <strong>只读</strong>参考:不修改、不提交;验证需要对方服务时优先用已部署的测试环境。</li><li>两边都要改的"联合需求"(父子运行、接口约定、联合验证)不在这个版本,单独设计。</li></ul><h3 id="按切片实现" tabindex="-1">按切片实现 <a class="header-anchor" href="#按切片实现" aria-label="Permalink to "按切片实现""></a></h3><ul><li>方案的实施计划分成<strong>纵向切片</strong>(每片能单独演示和验证),设计步骤在结果文件的可选字段 <code>slices</code> 中列出;方案修订可以给出新列表。</li><li>档位在 <code>slices.profiles</code> 中(默认只有标准档)、且有两片以上时,代码实现按片逐个启动新的 agent(步骤键 <code>implement-s<序号></code>),每片各自提交、各自过一次质量门;中断后只重做当前片。超过 <code>slices.max</code>(默认 6)时最后几片合并。只有一片、快速档时与原来相同。</li><li>子需求(把大需求拆成几个各有 spec 的需求)不在这个版本:切片已经解决上下文和中断的问题。</li></ul><h3 id="范围检查" tabindex="-1">范围检查 <a class="header-anchor" href="#范围检查" aria-label="Permalink to "范围检查""></a></h3><ul><li>设计结果的可选字段 <code>files</code> 列出预计改动的文件和目录。代码评审前,引擎比对这次尝试实际改动的文件(不含功能目录),把清单之外的交给评审逐一判断:必需的写理由,无关的要求撤回。评审同时增加"影响面"一节,并明确只把影响正确性、安全、数据和验收的问题提为阻塞或重要,避免评审意见把代码越改越复杂。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>状态文件只增加可选字段(<code>type</code>、<code>codeBase</code>、<code>gate</code>),格式版本仍为 1;结果文件增加可选字段。回滚到 1.7 后,旧引擎忽略这些字段;按切片实现中断的需求,旧引擎会把整个实现重做一遍。</li><li>有检查的项目,每次尝试多一次基线运行,写代码的步骤之后各多一次检查运行。检查要能在几分钟内跑完。</li><li>不同的需求类型复用同一套步骤和状态:以后增加类型(界面改动、数据变更、性能优化)只需要一个剧本文件和少量引擎分支。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0023-types-gate-slices.md">docs/adr/0023-types-gate-slices.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0023-types-gate-slices.md">在 GitHub 上编辑</a></p>',2)])])}const g=o(i,[["render",s]]);export{p as __pageData,g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as t,c as a,a3 as l}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0023 需求类型、质量门、按切片实现","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0023-types-gate-slices.md","filePath":"reference/adr/0023-types-gate-slices.md","lastUpdated":null}'),i={name:"reference/adr/0023-types-gate-slices.md"};function s(r,e,d,c,n,u){return t(),a("div",null,[...e[0]||(e[0]=[l("",2)])])}const g=o(i,[["render",s]]);export{p as __pageData,g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as a,c,a3 as t}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0024-confirm-early-review-axes.md","filePath":"reference/adr/0024-confirm-early-review-axes.md","lastUpdated":null}'),r={name:"reference/adr/0024-confirm-early-review-axes.md"};function d(i,e,s,l,n,u){return a(),c("div",null,[...e[0]||(e[0]=[t('<div><h1 id="_0024-让分歧更早暴露-验收例子、方案确认点、两个方向的评审、反复的问题变成规则" tabindex="-1">0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则 <a class="header-anchor" href="#_0024-让分歧更早暴露-验收例子、方案确认点、两个方向的评审、反复的问题变成规则" aria-label="Permalink to "0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则""></a></h1><ul><li>状态:已采纳(补充 <a href="./0012-review-panel">0012</a>:评审的两个方向复用评审小组的机制;<a href="./0022-develop-and-verify-phases">0022</a>:方案确认点与闸口一样停下来等人,但在写代码之前)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>需求做出来"不符合预期",多半不是代码写错,而是需求方和 agent 对"做成什么样"理解不同,并且直到验收才发现。到 1.8.0-beta.1 为止,需求方在确认需求说明之后,要等到报告才再看到结果;验收标准常常是抽象的描述("在限制时间内重复发送会被拒绝"),测试的期望值由实现者自己定;代码评审一位评审者同时看"做没做对"和"做得规不规范",后者常被挤掉;同一类规范问题在不同需求里反复被提出、反复修。</p><p>Matt Pocock 的 skills(<code>grill-with-docs</code> 的术语表、<code>tdd</code> 先写测试、<code>code-review</code> 分 Standards 和 Spec 两个方向、<code>retro</code>)、pstack 的 <code>correct</code>(把纠正变成规则)和 Specification by Example 的思路一致:把分歧放到最便宜的时候暴露,用具体的例子而不是抽象的描述对齐,把反复出现的问题交给机器挡住。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>验收标准带例子</strong>:<code>acceptance-criteria</code> 要求每条 AC 至少一组具体的输入和期望输出,按规则计算的给出覆盖边界的几组;确认前的独立审阅检查这一点,缺的替需求方拟好例子请其确认。方案的测试直接用这些例子作为期望值,不另编。</li><li><strong>验收测试先提交</strong>:适合测试先行时,实现先把从例子写出的测试单独提交(失败的),在结果文件中写明文件和提交(<code>acceptance_tests</code>、<code>acceptance_tests_commit</code>)。代码评审前引擎用 git 核对它们之后有没有被改,改过的交给评审逐个确认依据。只核对、不阻止:测试本身写错是常见的合理修改。</li><li><strong>方案确认点</strong>(<code>designApproval</code>):方案审核通过、写代码之前,引擎可以停下来(状态 <code>waiting_for_approval</code>),请需求方看 <code>preview.md</code>(做完后会看到什么、需要确认的假设、不会变的)和界面原型(<code>prototype/</code> 中的静态 HTML)。<code>--approve</code> 继续;要修改的走需求变更(更新 spec 后 <code>--resume</code>,从方案设计增量处理,再确认一次)。等待单独的 <code>--resume</code> 会被拒绝,避免对话误把"继续"当作确认。 <ul><li>默认只对标准档的界面改动开启(<code>mode: "ui"</code>,由方案在结果文件中判断 <code>ui_change</code>):界面最容易"做对了但不是想要的",其他需求不增加等待。<code>always</code> 每次都停,<code>off</code> 关闭。</li><li>无人值守的代价:等待提醒复用 <code>waitingReminderHours</code>;<code>autoContinueHours</code> 大于 0 时通过 Paseo 定时任务让对话在超时后按方案继续(默认 0,一直等待)。</li><li>方案中的假设标明对使用者可见的影响(界面、数据、权限)。影响这些、猜错会做错的转为阻塞问题;其余在确认点请需求方过目,没有确认点时由报告交给需求方。</li></ul></li><li><strong>代码评审分两个方向</strong>(<code>reviewAxes</code>,默认标准档开启):第一轮由规格评审(每条 AC 是否实现、测试期望值是否与例子一致、范围、与预览是否一致)和规范评审(项目惯例与范例文件、术语、测试质量、安全、简单性)并行,reviewer 核实汇总成一份结论。复用评审小组的并行和汇总,两位都用配置的 reviewer;配置了评审小组时以小组为准;后续轮次仍由一位评审核对修复。代价是每个标准档需求多两次评审。</li><li><strong>术语表和范例文件</strong>:沿用仓库根目录的 <code>GLOSSARY.md</code>(不另建文件),增加"代码中的名字";<code>/req-setup</code> 第一次整理并在项目说明中列出各类代码的范例文件;方案的每个任务写明参照的文件,新概念补进术语表。</li><li><strong>反复出现的问题变成规则</strong>:完成报告把一条项目规则就能挡住的问题写进功能目录的 <code>lessons.tsv</code>。放在各自的功能目录,而不是一个共用文件,避免各需求分支合并时冲突。<code>req digest</code> 汇总所有工作区中的需求,同一类别出现在两个以上需求时提示;<code>/req-retro</code> 据此建议规则,落地后把类别写进 <code>.requirement-pipeline/lessons-handled.txt</code>。规则仍由人批准。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>状态文件新增可选字段 <code>approval</code> 和状态值 <code>waiting_for_approval</code>,格式版本仍为 1。回滚到更早的版本后,旧引擎把它当作可以继续的中断,继续时不经确认直接写代码,可以接受。</li><li>结果文件新增可选字段(<code>ui_change</code>、<code>acceptance_tests</code>、<code>acceptance_tests_commit</code>)。外部通知新增事件 <code>approval</code>。</li><li>标准档的界面改动多一次等待;每个标准档需求的第一轮代码评审多两次 agent 运行。都可以在配置中关闭。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0024-confirm-early-review-axes.md">docs/adr/0024-confirm-early-review-axes.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0024-confirm-early-review-axes.md">在 GitHub 上编辑</a></p>',2)])])}const _=o(r,[["render",d]]);export{m as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as a,c,a3 as t}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0024-confirm-early-review-axes.md","filePath":"reference/adr/0024-confirm-early-review-axes.md","lastUpdated":null}'),r={name:"reference/adr/0024-confirm-early-review-axes.md"};function d(i,e,s,l,n,u){return a(),c("div",null,[...e[0]||(e[0]=[t("",2)])])}const _=o(r,[["render",d]]);export{m as __pageData,_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t,o,c as a,a3 as i}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0025 联合需求:一个需求同时改几个仓库","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0025-joint-requirements.md","filePath":"reference/adr/0025-joint-requirements.md","lastUpdated":null}'),r={name:"reference/adr/0025-joint-requirements.md"};function n(s,e,d,l,c,u){return o(),a("div",null,[...e[0]||(e[0]=[i('<div><h1 id="_0025-联合需求-一个需求同时改几个仓库" tabindex="-1">0025 联合需求:一个需求同时改几个仓库 <a class="header-anchor" href="#_0025-联合需求-一个需求同时改几个仓库" aria-label="Permalink to "0025 联合需求:一个需求同时改几个仓库""></a></h1><ul><li>状态:已采纳(扩展 <a href="./0018-own-worktree-option">0018</a>:为其他仓库新建工作区;<a href="./0023-types-gate-slices">0023</a>:质量门按仓库进行;落实 1.8 设计中"多代码库需求"的第三种形态)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>前后端分在两个仓库的需求很常见:后端加接口,前端加页面。1.8.0-beta.1 起其他仓库可以作为只读参考,但两边都要改时只能拆成两个互不知道的需求:接口由两边各自理解,联调问题要到人工测试时才暴露,两份报告也凑不成"这个需求做完了没有"的答案。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>主仓库协调,复用单仓库的步骤</strong>:发起需求的仓库是主仓库,它的运行就是协调者,状态只有一份(主仓库的 <code>state.json</code>)。不另起子流水线进程:同一套步骤、结果文件、续跑和用量统计都直接适用,只是某些步骤换一个仓库运行。</li><li>spec 头部 <code>- 联合开发:<名称></code> 指定还要改的仓库,名称来自 <code>relatedRepos</code>,最多两个(一共三个仓库)。启动前检查名称已登记、本机存在、是 git 仓库,否则不启动、不留运行记录。</li><li><strong>工作区</strong>:每个联合仓库由 Paseo 新建一个工作区,分支 <code>feature/<需求></code>,从那个仓库当前检出的分支切出;那份检出本身不切换分支、不提交(同 0018 的理由)。同名分支已存在时停下来请人处理,不覆盖。</li><li><strong>步骤怎么分</strong>: <ul><li>方案设计、方案审核与修订、方案确认点、提测说明、功能验证、复验、完成报告都在主仓库。方案按仓库分开写,并写出接口约定 <code>contract.md</code>,方案审核通过后冻结。</li><li>实现、代码评审 ⇄ 修复在<strong>每个仓库各自进行、同时进行</strong>:步骤 agent 的工作目录和 Paseo 工作区是那个仓库的,仍挂在发起的对话下;步骤键加仓库后缀(<code>implement@backend</code>),结果文件写在那个仓库的功能目录。联合需求不按切片实现(每个仓库一个实现步骤),避免切片与仓库交错。</li><li>实现前,主仓库的需求说明、访谈记录、方案、接口约定、预览同步到各仓库的功能目录并提交,合并那个仓库的人能在代码旁边读到。</li><li>功能验证前,各仓库 <code>paseo.json</code> 中的服务都由 Paseo 用当前代码启动。验证和复验的结果用 <code>defect_repos</code> 写明缺陷在哪个仓库,缺陷修复只在那些仓库进行;没写时每个仓库都看一遍。</li></ul></li><li><strong>质量门按仓库</strong>:每个仓库用它自己项目配置中的 <code>checks</code>、自己的基线和记录(<code>joint[].codeBase</code>、<code>joint[].gate</code>);它自己的项目说明、验证方法和按步骤的说明用在它的步骤里。</li><li><strong>失败与继续</strong>:同时进行的步骤中一个失败时,等其他的做完再中断,不让 agent 在没人看着的情况下继续改代码;继续时沿用已建的工作区和已完成的步骤。</li><li><strong>安全边界不变</strong>:只做本地提交,不合并、不推送;各仓库的合并顺序写进提测说明和报告,由人决定。不克隆本机没有的仓库,不自动部署。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>状态文件新增可选字段 <code>joint</code>,结果文件新增可选字段 <code>defect_repos</code>,格式版本仍为 1。回滚到旧版本后,旧引擎忽略 <code>joint</code>,只在主仓库继续,已经在其他仓库做的改动留在它们的工作区里。</li><li>每个联合仓库多一次实现和一轮以上的代码评审,用量大约按仓库数增加;三个步骤同时运行时,本机同时运行的 agent 也更多。</li><li>一个需求的改动分散在几个分支上,合并需要人按顺序进行。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0025-joint-requirements.md">docs/adr/0025-joint-requirements.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0025-joint-requirements.md">在 GitHub 上编辑</a></p>',2)])])}const p=t(r,[["render",n]]);export{m as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t,o,c as a,a3 as i}from"./chunks/framework.B9qR_F1m.js";const m=JSON.parse('{"title":"0025 联合需求:一个需求同时改几个仓库","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0025-joint-requirements.md","filePath":"reference/adr/0025-joint-requirements.md","lastUpdated":null}'),r={name:"reference/adr/0025-joint-requirements.md"};function n(s,e,d,l,c,u){return o(),a("div",null,[...e[0]||(e[0]=[i("",2)])])}const p=t(r,[["render",n]]);export{m as __pageData,p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as r,a3 as t}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0026 本机的需求索引、使用记录和 req api","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0026-machine-records-and-api.md","filePath":"reference/adr/0026-machine-records-and-api.md","lastUpdated":null}'),i={name:"reference/adr/0026-machine-records-and-api.md"};function d(c,e,s,n,l,p){return o(),r("div",null,[...e[0]||(e[0]=[t('<div><h1 id="_0026-本机的需求索引、使用记录和-req-api" tabindex="-1">0026 本机的需求索引、使用记录和 req api <a class="header-anchor" href="#_0026-本机的需求索引、使用记录和-req-api" aria-label="Permalink to "0026 本机的需求索引、使用记录和 req api""></a></h1><ul><li>状态:已采纳(补充 <a href="./0010-generated-feature-overview">0010</a>:仓库内的总览仍现场生成;<a href="./0014-notifier-slot">0014</a>:通知槽不变)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>1.9 要做两件依赖同一份数据的事:Paseo 插件在网页端列出本机所有项目的需求、做确认和停止这类管理操作;管理方要定期看到 req-kit 的使用情况(多少需求、多快、返工多少、花了多少)。在此之前,需求的状态分散在各仓库各工作区的功能目录里,<code>req list</code> 只看得到当前仓库;用时和用量只在每个需求的状态文件中,没有跨需求的汇总;<code>req list</code>、<code>req status</code> 只输出给人看的文字,程序要用只能解析文字或直接读状态文件,后者把状态文件的内部格式变成了对外约定。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>需求索引</strong>:引擎每次写状态文件时,确认本机配置目录下的 <code>index/<key>.json</code> 记着这个需求在哪里(目录、功能目录、对话所在目录、工作区),一个需求一个文件,几个流水线同时运行也不会互相覆盖。索引只记位置,阶段和进度仍然现场从功能目录读取,所以不会和实际情况不一致。</li><li><strong>使用记录</strong>:每次运行(后台进程从开始到结束)结束时向 <code>usage/runs.jsonl</code> 追加一行:步骤、用时、用量、质量门、结束时的状态。按运行而不是按需求记,追加即可,不用改写旧记录;需求层面的数字(交付周期、评审轮数、等待时长)在统计时从同一需求的各次运行算出。</li><li><strong>只在本机,不自动上报</strong>:两样都不提交进仓库,也不发往任何地方;不记需求内容和代码。汇总给管理方时由人导出(<code>req stats --export</code>)再合并(<code>--merge</code>);之后定下汇总通道时,用 1.9 的集成模块订阅"运行结束",数据格式不变。</li><li><strong><code>req stats</code></strong>:Markdown 汇总、JSON、每个需求一行的 CSV,<code>--report</code> 生成汇报用的两份文件。</li><li><strong><code>req api</code></strong>:给程序的稳定接口,一行 JSON,带 <code>schema</code>。读操作(list、status、file、stats、index)不改变任何东西;管理操作 <code>req api run <approve|stop|resume|verify></code> 就是在相应目录执行 <code>req <命令></code>,引擎仍是唯一修改状态的一方。<code>file</code> 只能读功能目录中的文档白名单。</li><li><strong>评估和测试不进记录</strong>:<code>REQ_KIT_NO_RECORD=1</code> 关闭记录,评估运行设置它;测试把本机配置目录指向临时目录。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>插件和脚本只依赖 <code>contracts/cli-json.md</code>,状态文件的内部格式可以继续演进。</li><li>1.9 之前运行过的需求不在索引里,需要 <code>req index --rebuild</code> 补登;删掉的目录在索引里显示为"已移除",<code>--prune</code> 清理。</li><li>记录是尽力而为的:写失败不影响流水线,被强制结束(kill -9、断电)的运行没有记录,统计会少算这次运行。</li><li>主机名写进每条记录,用于合并多台机器的数据时区分来源。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0026-machine-records-and-api.md">docs/adr/0026-machine-records-and-api.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0026-machine-records-and-api.md">在 GitHub 上编辑</a></p>',2)])])}const m=a(i,[["render",d]]);export{u as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o,c as r,a3 as t}from"./chunks/framework.B9qR_F1m.js";const u=JSON.parse('{"title":"0026 本机的需求索引、使用记录和 req api","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0026-machine-records-and-api.md","filePath":"reference/adr/0026-machine-records-and-api.md","lastUpdated":null}'),i={name:"reference/adr/0026-machine-records-and-api.md"};function d(c,e,s,n,l,p){return o(),r("div",null,[...e[0]||(e[0]=[t("",2)])])}const m=a(i,[["render",d]]);export{u as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as a,c as i,a3 as t}from"./chunks/framework.B9qR_F1m.js";const q=JSON.parse('{"title":"0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0027-paseo-plugin.md","filePath":"reference/adr/0027-paseo-plugin.md","lastUpdated":null}'),r={name:"reference/adr/0027-paseo-plugin.md"};function d(s,e,l,n,c,p){return a(),i("div",null,[...e[0]||(e[0]=[t('<div><h1 id="_0027-paseo-插件-随-req-kit-一起发布-只通过-req-api-工作" tabindex="-1">0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作 <a class="header-anchor" href="#_0027-paseo-插件-随-req-kit-一起发布-只通过-req-api-工作" aria-label="Permalink to "0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作""></a></h1><ul><li>状态:已采纳(建立在 <a href="./0026-machine-records-and-api">0026</a> 的需求索引和 <code>req api</code> 之上;不改变 <a href="./0003-script-engine-not-hub">0003</a>:流程仍由脚本引擎驱动)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>需求方和项目经理想在 Paseo 的网页端或手机上看到所有需求在哪一步、卡在哪里,并做确认方案、停止、继续这类操作,而不是在对话里问或在终端敲 <code>req</code>。Paseo 0.11 有完整的插件机制:界面(侧边栏、页面、工作区面板、按钮、命令中心)、daemon 侧的 RPC 和生命周期事件,同一份界面代码在桌面版、网页端和手机上运行。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>插件只做展示和管理,不参与流程</strong>:每个读取是一次 <code>req api</code>,每个管理操作是 <code>req api run <approve|stop|resume|verify></code>,与在终端执行 <code>req <命令></code> 完全相同。插件不读写状态文件,引擎仍是唯一修改需求状态的一方。不提供发起需求(需要在对话中对齐)、编辑需求说明或方案、修改配置、删除。</li><li><strong>随 req-kit 一起发布,从固定目录安装</strong>:插件源码在仓库的 <code>paseo-plugin/</code>,打进 <code>paseo-req-kit</code> 包。<code>req plugin install</code> 把当前版本的插件复制到 <code>~/.req-kit/paseo-plugin</code>,用 <code>paseo plugin install <目录></code> 安装;之后每次启用版本(setup、upgrade、use)都刷新这个目录并 <code>paseo plugin reload</code>。这样插件版本总是和启用的 req-kit 一致,也不需要单独的 npm 包、网络或第二套发布配置。设计时曾考虑第二个 npm 包,Paseo 的目录安装让它变得不必要。</li><li><strong>插件总开关要人同意</strong>:Paseo 的 <code>pluginsEnabled</code> 默认关闭,插件是不受沙箱限制的代码。<code>req plugin install</code> 和安装脚本都先说明再询问,<code>--yes</code> / <code>--with-plugin</code> 表示同意;移除插件不改动总开关。</li><li><strong>只读模式</strong>:Paseo 的插件没有按用户区分的权限,能连上 daemon 的人都能操作。插件设置中的"只读"隐藏管理操作,daemon 侧也拒绝它们。</li><li><strong>只依赖 <code>req api</code> 的格式</strong>:插件通过本机配置目录的 <code>active.json</code> 找到启用的版本并运行它的 <code>req api</code>,不引用 req-kit 的内部代码;req-kit 太旧时插件给出升级提示。</li><li><strong>界面按 Paseo 的跨平台规则写</strong>:只用 React Native 组件和主题颜色,不用 DOM。插件的界面部分由 CI 用 Paseo 的 SDK 做类型检查(<code>paseo-plugin/</code> 的开发依赖),daemon 侧和 <code>req plugin</code> 有单元测试;界面效果需要在真实的 Paseo 中检查。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>新增 <code>req plugin install|status|remove</code>,安装脚本最后可选安装插件。</li><li>列表靠轮询刷新(默认 10 秒,可设置);daemon 侧把短时间内的多个列表请求合并成一次 <code>req api list</code>。</li><li>步骤 agent 的"需求"按钮靠 req-kit 给步骤 agent 打的标签(<code>requirement-pipeline</code>)找到需求;工作区的"需求"按钮按目录匹配需求。</li><li><code>paseo-plugin/package.json</code> 的版本必须与 req-kit 相同(测试检查),<code>paseo-plugin.json</code> 的 Paseo 范围与 <code>reqKit.paseo</code> 相同。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0027-paseo-plugin.md">docs/adr/0027-paseo-plugin.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0027-paseo-plugin.md">在 GitHub 上编辑</a></p>',2)])])}const g=o(r,[["render",d]]);export{q as __pageData,g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as a,c as i,a3 as t}from"./chunks/framework.B9qR_F1m.js";const q=JSON.parse('{"title":"0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0027-paseo-plugin.md","filePath":"reference/adr/0027-paseo-plugin.md","lastUpdated":null}'),r={name:"reference/adr/0027-paseo-plugin.md"};function d(s,e,l,n,c,p){return a(),i("div",null,[...e[0]||(e[0]=[t("",2)])])}const g=o(r,[["render",d]]);export{q as __pageData,g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0028-external-integrations.md","filePath":"reference/adr/0028-external-integrations.md","lastUpdated":null}'),i={name:"reference/adr/0028-external-integrations.md"};function n(d,e,l,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[r('<div><h1 id="_0028-外部系统对接-命令写法在配置里-内容由-ai-整理-调用是确定的" tabindex="-1">0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的 <a class="header-anchor" href="#_0028-外部系统对接-命令写法在配置里-内容由-ai-整理-调用是确定的" aria-label="Permalink to "0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的""></a></h1><ul><li>状态:已采纳(与 <a href="./0014-notifier-slot">0014</a> 的通知槽并存:通知只发消息,集成会回写)</li></ul><h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to "背景""></a></h2><p>团队希望需求同时出现在自己的需求管理系统中:需求开始时建卡,阶段变化时改卡片状态,卡片编号能在需求、报告和插件里看到。对接的系统各不相同,通常提供本机命令行工具(例如需求管理系统的 CLI),参数会随系统升级变化。</p><h2 id="决定" tabindex="-1">决定 <a class="header-anchor" href="#决定" aria-label="Permalink to "决定""></a></h2><ul><li><strong>命令写法写在本机或团队配置里,不写进 req-kit 的代码</strong>:<code>integrations</code> 中每项写明工具、建卡和改状态的参数(带占位符)、从输出取卡片编号和链接的正则、各个流水线事件对应的卡片状态。换系统或系统改参数只改配置。项目配置不能写 <code>integrations</code>(它会运行命令),只能用 <code>integrationDefaults</code> 提供自己的取值,例如项目编号。</li><li><strong>AI 整理内容,不决定怎么调用</strong>:卡片的业务字段(<code>cardFields</code>,如优先级、需求类型、子系统)由 <code>/req</code> 在需求说明确认时从需求说明中整理,和需求方一起确认后写进 <code>card.json</code>。运行时引擎按配置把这些值填进参数并执行,每次行为一致、可以补发、不会重复建卡;不在每次调用时让 AI 读帮助、拼命令,避免结果不确定、在真实系统上做错操作和难以复现。配置本身可以请 AI 读工具的帮助起草,由人确认。</li><li><strong>不经过 shell</strong>:参数数组直接传给进程,标题和 Markdown 描述中的空格、换行、引号都原样传递。Windows 上 npm 安装的工具是 <code>.cmd</code> 包装,只有 cmd.exe 能运行,而 cmd.exe 会破坏这类参数,所以改用 node 直接运行包装里指向的脚本。</li><li><strong>外部系统出错不影响流水线</strong>:失败或超时的调用记在状态文件的 <code>external.<名称>.pending</code>,下一个事件时先按顺序补发;卡片没建好时状态排在后面;等待中的状态只留最新的一个。流水线没在运行时可以 <code>req sync</code>。</li><li><strong>先试再用</strong>:<code>req integration test</code> 打印每个事件会执行的完整命令而不调用。</li><li>录入测试用例暂不做,等对接系统提供能力后,作为新的动作和事件加入(例如功能验证结束时把验收标准和结果录入)。</li></ul><h2 id="影响" tabindex="-1">影响 <a class="header-anchor" href="#影响" aria-label="Permalink to "影响""></a></h2><ul><li>新的状态文件字段 <code>external</code>(可选,格式版本仍为 1)、功能目录文件 <code>card.json</code>、<code>req api status</code> 的 <code>external</code>。</li><li><code>/req</code> 在确认需求说明前运行"卡片字段"命令;没有配置对接时它输出"跳过"。</li><li>事件:started、approval、blocked、phase_done、verify、completed(可按结论细分)、failed。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/docs/adr/0028-external-integrations.md">docs/adr/0028-external-integrations.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/docs/adr/0028-external-integrations.md">在 GitHub 上编辑</a></p>',2)])])}const g=a(i,[["render",n]]);export{p as __pageData,g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as a,o as t,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/adr/0028-external-integrations.md","filePath":"reference/adr/0028-external-integrations.md","lastUpdated":null}'),i={name:"reference/adr/0028-external-integrations.md"};function n(d,e,l,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[r("",2)])])}const g=a(i,[["render",n]]);export{p as __pageData,g as default};
|