paseo-req-kit 1.14.0 → 1.15.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +2 -0
- package/engine/src/review-assets/app.css +153 -234
- package/engine/src/review-assets/app.html +44 -32
- package/engine/src/review-assets/app.js +11 -7
- package/engine/src/review-assets/check.css +11 -56
- package/engine/src/review-assets/check.html +48 -22
- package/engine/src/review-assets/check.js +169 -86
- package/engine/src/review-assets/code.css +15 -92
- package/engine/src/review-assets/code.html +41 -26
- package/engine/src/review-assets/code.js +196 -101
- package/engine/src/review-assets/rk-icons.js +98 -0
- package/engine/src/review-assets/rk-tokens.css +252 -0
- package/engine/src/review-assets/rk.css +252 -0
- package/engine/src/review.ts +6 -4
- package/package.json +1 -1
- package/paseo-plugin/client/detail.tsx +31 -11
- package/paseo-plugin/client/format.ts +56 -0
- package/paseo-plugin/client/inbox.tsx +26 -20
- package/paseo-plugin/client/markdown.tsx +2 -1
- package/paseo-plugin/client/overview.tsx +21 -11
- package/paseo-plugin/client/review.tsx +3 -3
- package/paseo-plugin/client/row.tsx +38 -15
- package/paseo-plugin/client/stats.tsx +5 -4
- package/paseo-plugin/client/ui.tsx +196 -29
- package/paseo-plugin/package.json +1 -1
- package/paseo-plugin/shared/rk-colors.ts +35 -0
- package/site-dist/404.html +5 -5
- package/site-dist/assets/{app.VQ-QxRPH.js → app.Ny0BZHeG.js} +1 -1
- package/site-dist/assets/changelog.md.CUwudFS5.js +1 -0
- package/site-dist/assets/{changelog.md.CIKYJXpF.lean.js → changelog.md.CUwudFS5.lean.js} +1 -1
- package/site-dist/assets/chunks/@localSearchIndexroot.BmFA3hqY.js +1 -0
- package/site-dist/assets/chunks/{VPLocalSearchBox.CT4Vlj76.js → VPLocalSearchBox.BCWGSI0L.js} +1 -1
- package/site-dist/assets/chunks/{framework.B9qR_F1m.js → framework.BetZR81g.js} +1 -1
- package/site-dist/assets/chunks/theme.BeEUWcJI.js +2 -0
- package/site-dist/assets/{guide_getting-started.md.CZM53rO_.js → guide_getting-started.md.DBJ0aMgy.js} +1 -1
- package/site-dist/assets/{guide_getting-started.md.CZM53rO_.lean.js → guide_getting-started.md.DBJ0aMgy.lean.js} +1 -1
- package/site-dist/assets/{guide_how-it-works.md.D-kQsF1t.js → guide_how-it-works.md.Rn-g0Um8.js} +1 -1
- package/site-dist/assets/{guide_how-it-works.md.D-kQsF1t.lean.js → guide_how-it-works.md.Rn-g0Um8.lean.js} +1 -1
- package/site-dist/assets/{guide_index.md.CLnGCmGW.js → guide_index.md.BIF6VPBE.js} +1 -1
- package/site-dist/assets/{guide_index.md.CLnGCmGW.lean.js → guide_index.md.BIF6VPBE.lean.js} +1 -1
- package/site-dist/assets/{guide_install.md.DkCyZsOU.js → guide_install.md.kIsj5oWc.js} +1 -1
- package/site-dist/assets/{guide_install.md.DkCyZsOU.lean.js → guide_install.md.kIsj5oWc.lean.js} +1 -1
- package/site-dist/assets/guide_maintainer.md.SWALpGR5.js +1 -0
- package/site-dist/assets/guide_maintainer.md.SWALpGR5.lean.js +1 -0
- package/site-dist/assets/{guide_phases.md.BpGAb1re.js → guide_phases.md.Bnd9FQ27.js} +1 -1
- package/site-dist/assets/{guide_phases.md.BpGAb1re.lean.js → guide_phases.md.Bnd9FQ27.lean.js} +1 -1
- package/site-dist/assets/{guide_project.md.DIjDRoAq.js → guide_project.md.CzS92KTI.js} +1 -1
- package/site-dist/assets/{guide_project.md.DIjDRoAq.lean.js → guide_project.md.CzS92KTI.lean.js} +1 -1
- package/site-dist/assets/{guide_user.md.UV0WxdJa.js → guide_user.md.REc1nK8f.js} +1 -1
- package/site-dist/assets/{guide_user.md.UV0WxdJa.lean.js → guide_user.md.REc1nK8f.lean.js} +1 -1
- package/site-dist/assets/index.md.CpaGRB2c.js +1 -0
- package/site-dist/assets/index.md.CpaGRB2c.lean.js +1 -0
- package/site-dist/assets/{reference_adr_0001-step-agents-under-origin-chat.md.RtRTq7oi.js → reference_adr_0001-step-agents-under-origin-chat.md.CPq0ZVSs.js} +1 -1
- package/site-dist/assets/{reference_adr_0001-step-agents-under-origin-chat.md.RtRTq7oi.lean.js → reference_adr_0001-step-agents-under-origin-chat.md.CPq0ZVSs.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0002-no-directory-switch-in-chat.md.BxtN-Aa2.js → reference_adr_0002-no-directory-switch-in-chat.md.BZD1j8xZ.js} +1 -1
- package/site-dist/assets/{reference_adr_0002-no-directory-switch-in-chat.md.BxtN-Aa2.lean.js → reference_adr_0002-no-directory-switch-in-chat.md.BZD1j8xZ.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0003-script-engine-not-hub.md.66EgZtqx.js → reference_adr_0003-script-engine-not-hub.md.Bi4uZZaE.js} +1 -1
- package/site-dist/assets/{reference_adr_0003-script-engine-not-hub.md.66EgZtqx.lean.js → reference_adr_0003-script-engine-not-hub.md.Bi4uZZaE.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0004-result-files.md.DbqcCozI.js → reference_adr_0004-result-files.md.CNQMSs4R.js} +1 -1
- package/site-dist/assets/{reference_adr_0004-result-files.md.DbqcCozI.lean.js → reference_adr_0004-result-files.md.CNQMSs4R.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.js → reference_adr_0005-no-default-branch-local-commits-only.md.DeXnMAyg.js} +1 -1
- package/site-dist/assets/{reference_adr_0005-no-default-branch-local-commits-only.md.CkImA4s6.lean.js → reference_adr_0005-no-default-branch-local-commits-only.md.DeXnMAyg.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0006-skill-install-targets.md.CwY8YepV.js → reference_adr_0006-skill-install-targets.md.CwqvB8NW.js} +1 -1
- package/site-dist/assets/{reference_adr_0006-skill-install-targets.md.CwY8YepV.lean.js → reference_adr_0006-skill-install-targets.md.CwqvB8NW.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0007-own-interview-skill.md.CryhxRyG.js → reference_adr_0007-own-interview-skill.md.HlLp78db.js} +1 -1
- package/site-dist/assets/{reference_adr_0007-own-interview-skill.md.CryhxRyG.lean.js → reference_adr_0007-own-interview-skill.md.HlLp78db.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0008-entries-do-not-call-entries.md.DsRWAgeA.js → reference_adr_0008-entries-do-not-call-entries.md.D2VH2uQV.js} +1 -1
- package/site-dist/assets/{reference_adr_0008-entries-do-not-call-entries.md.DsRWAgeA.lean.js → reference_adr_0008-entries-do-not-call-entries.md.D2VH2uQV.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0009-versioned-install-layout.md.CSg1VqlW.js → reference_adr_0009-versioned-install-layout.md.D9g3dWr-.js} +1 -1
- package/site-dist/assets/{reference_adr_0009-versioned-install-layout.md.CSg1VqlW.lean.js → reference_adr_0009-versioned-install-layout.md.D9g3dWr-.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0010-generated-feature-overview.md.D8F3MK-h.js → reference_adr_0010-generated-feature-overview.md.CHOwcV4c.js} +1 -1
- package/site-dist/assets/{reference_adr_0010-generated-feature-overview.md.D8F3MK-h.lean.js → reference_adr_0010-generated-feature-overview.md.CHOwcV4c.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0011-resume-after-completion.md.BCrZrKjf.js → reference_adr_0011-resume-after-completion.md.CqdSPi49.js} +1 -1
- package/site-dist/assets/{reference_adr_0011-resume-after-completion.md.BCrZrKjf.lean.js → reference_adr_0011-resume-after-completion.md.CqdSPi49.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0012-review-panel.md.k9rrHFFc.js → reference_adr_0012-review-panel.md.d4wmLrNF.js} +1 -1
- package/site-dist/assets/{reference_adr_0012-review-panel.md.k9rrHFFc.lean.js → reference_adr_0012-review-panel.md.d4wmLrNF.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0013-no-release-tooling.md.BQeJ8dEI.js → reference_adr_0013-no-release-tooling.md.BOROmwvq.js} +1 -1
- package/site-dist/assets/{reference_adr_0013-no-release-tooling.md.BQeJ8dEI.lean.js → reference_adr_0013-no-release-tooling.md.BOROmwvq.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0014-notifier-slot.md.C23QR1xO.js → reference_adr_0014-notifier-slot.md.BAqt1Xj1.js} +1 -1
- package/site-dist/assets/{reference_adr_0014-notifier-slot.md.C23QR1xO.lean.js → reference_adr_0014-notifier-slot.md.BAqt1Xj1.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0015-incremental-continue.md.Buy7wwO8.js → reference_adr_0015-incremental-continue.md.BiUdpeq5.js} +1 -1
- package/site-dist/assets/{reference_adr_0015-incremental-continue.md.Buy7wwO8.lean.js → reference_adr_0015-incremental-continue.md.BiUdpeq5.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0016-upgrade-from-tags.md.qfIW-tqJ.js → reference_adr_0016-upgrade-from-tags.md.D48PfEFP.js} +1 -1
- package/site-dist/assets/{reference_adr_0016-upgrade-from-tags.md.qfIW-tqJ.lean.js → reference_adr_0016-upgrade-from-tags.md.D48PfEFP.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0017-use-paseo-capabilities.md.CjcGli87.js → reference_adr_0017-use-paseo-capabilities.md.CAMkamzJ.js} +1 -1
- package/site-dist/assets/{reference_adr_0017-use-paseo-capabilities.md.CjcGli87.lean.js → reference_adr_0017-use-paseo-capabilities.md.CAMkamzJ.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0018-own-worktree-option.md.fVDpgGSE.js → reference_adr_0018-own-worktree-option.md.DgkWjYL-.js} +1 -1
- package/site-dist/assets/{reference_adr_0018-own-worktree-option.md.fVDpgGSE.lean.js → reference_adr_0018-own-worktree-option.md.DgkWjYL-.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0019-parallel-orchestration.md.DrfrV0To.js → reference_adr_0019-parallel-orchestration.md.B9xqQidw.js} +1 -1
- package/site-dist/assets/{reference_adr_0019-parallel-orchestration.md.DrfrV0To.lean.js → reference_adr_0019-parallel-orchestration.md.B9xqQidw.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0020-scheduling-through-the-chat.md.BqSemGFG.js → reference_adr_0020-scheduling-through-the-chat.md.Dh81be7G.js} +1 -1
- package/site-dist/assets/{reference_adr_0020-scheduling-through-the-chat.md.BqSemGFG.lean.js → reference_adr_0020-scheduling-through-the-chat.md.Dh81be7G.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0021-npm-version-manager.md.CU3PG6y5.js → reference_adr_0021-npm-version-manager.md.Pz4vZbkE.js} +1 -1
- package/site-dist/assets/{reference_adr_0021-npm-version-manager.md.CU3PG6y5.lean.js → reference_adr_0021-npm-version-manager.md.Pz4vZbkE.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0022-develop-and-verify-phases.md.C6fQDLq4.js → reference_adr_0022-develop-and-verify-phases.md.35MxNOuj.js} +1 -1
- package/site-dist/assets/{reference_adr_0022-develop-and-verify-phases.md.C6fQDLq4.lean.js → reference_adr_0022-develop-and-verify-phases.md.35MxNOuj.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0023-types-gate-slices.md.D2E6yyYQ.js → reference_adr_0023-types-gate-slices.md.Bjufr5EK.js} +1 -1
- package/site-dist/assets/{reference_adr_0023-types-gate-slices.md.D2E6yyYQ.lean.js → reference_adr_0023-types-gate-slices.md.Bjufr5EK.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0024-confirm-early-review-axes.md.FmK_ke0x.js → reference_adr_0024-confirm-early-review-axes.md.BRxVXJa4.js} +1 -1
- package/site-dist/assets/{reference_adr_0024-confirm-early-review-axes.md.FmK_ke0x.lean.js → reference_adr_0024-confirm-early-review-axes.md.BRxVXJa4.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0025-joint-requirements.md.ChoKvMUx.js → reference_adr_0025-joint-requirements.md.ClCFyIiN.js} +1 -1
- package/site-dist/assets/{reference_adr_0025-joint-requirements.md.ChoKvMUx.lean.js → reference_adr_0025-joint-requirements.md.ClCFyIiN.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0026-machine-records-and-api.md.veybjBPq.js → reference_adr_0026-machine-records-and-api.md.Bv1k_WjT.js} +1 -1
- package/site-dist/assets/{reference_adr_0026-machine-records-and-api.md.veybjBPq.lean.js → reference_adr_0026-machine-records-and-api.md.Bv1k_WjT.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0027-paseo-plugin.md.BMX33ZNU.js → reference_adr_0027-paseo-plugin.md.CcpaKksi.js} +1 -1
- package/site-dist/assets/{reference_adr_0027-paseo-plugin.md.BMX33ZNU.lean.js → reference_adr_0027-paseo-plugin.md.CcpaKksi.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0028-external-integrations.md.DtdMe8RK.js → reference_adr_0028-external-integrations.md.CrGqXJux.js} +1 -1
- package/site-dist/assets/{reference_adr_0028-external-integrations.md.DtdMe8RK.lean.js → reference_adr_0028-external-integrations.md.CrGqXJux.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0029-requirements-from-cards.md.BHd1SQPe.js → reference_adr_0029-requirements-from-cards.md.BUVah9hV.js} +1 -1
- package/site-dist/assets/{reference_adr_0029-requirements-from-cards.md.BHd1SQPe.lean.js → reference_adr_0029-requirements-from-cards.md.BUVah9hV.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0030-card-intake-process.md.kLc-DG9_.js → reference_adr_0030-card-intake-process.md.DKMkIFXw.js} +1 -1
- package/site-dist/assets/{reference_adr_0030-card-intake-process.md.kLc-DG9_.lean.js → reference_adr_0030-card-intake-process.md.DKMkIFXw.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0031-fewer-interventions.md.BDnQcz8g.js → reference_adr_0031-fewer-interventions.md.C8e2jpbC.js} +1 -1
- package/site-dist/assets/{reference_adr_0031-fewer-interventions.md.BDnQcz8g.lean.js → reference_adr_0031-fewer-interventions.md.C8e2jpbC.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0032-npm-only-install.md.C-3L1FkX.js → reference_adr_0032-npm-only-install.md.5tFsGLKz.js} +1 -1
- package/site-dist/assets/{reference_adr_0032-npm-only-install.md.C-3L1FkX.lean.js → reference_adr_0032-npm-only-install.md.5tFsGLKz.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_0033-prototype-review-and-ui-check.md.hFcQzmaa.js → reference_adr_0033-prototype-review-and-ui-check.md.CW5Soqvp.js} +1 -1
- package/site-dist/assets/{reference_adr_0033-prototype-review-and-ui-check.md.hFcQzmaa.lean.js → reference_adr_0033-prototype-review-and-ui-check.md.CW5Soqvp.lean.js} +1 -1
- package/site-dist/assets/{reference_adr_index.md.BYF-Ofor.js → reference_adr_index.md.DgUVrHoO.js} +1 -1
- package/site-dist/assets/{reference_adr_index.md.BYF-Ofor.lean.js → reference_adr_index.md.DgUVrHoO.lean.js} +1 -1
- package/site-dist/assets/{reference_commands.md.ClKbS-t8.js → reference_commands.md.BAQ8FugP.js} +1 -1
- package/site-dist/assets/{reference_commands.md.ClKbS-t8.lean.js → reference_commands.md.BAQ8FugP.lean.js} +1 -1
- package/site-dist/assets/{reference_config.md.CRe27LaA.js → reference_config.md.DoQUxHQ2.js} +1 -1
- package/site-dist/assets/{reference_config.md.CRe27LaA.lean.js → reference_config.md.DoQUxHQ2.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_cli-json.md.CCvKLasM.js → reference_contracts_cli-json.md.nRuTayON.js} +1 -1
- package/site-dist/assets/{reference_contracts_cli-json.md.CCvKLasM.lean.js → reference_contracts_cli-json.md.nRuTayON.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_feature-files.md.DSiA8OEH.lean.js → reference_contracts_feature-files.md.CgiSHFpq.js} +1 -1
- package/site-dist/assets/{reference_contracts_feature-files.md.DSiA8OEH.js → reference_contracts_feature-files.md.CgiSHFpq.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_index.md.Bkznz4px.js → reference_contracts_index.md.3h253qSo.js} +1 -1
- package/site-dist/assets/{reference_contracts_index.md.Bkznz4px.lean.js → reference_contracts_index.md.3h253qSo.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_notifier-event.md.B9WqeZdO.js → reference_contracts_notifier-event.md.DVrifpjH.js} +1 -1
- package/site-dist/assets/{reference_contracts_notifier-event.md.B9WqeZdO.lean.js → reference_contracts_notifier-event.md.DVrifpjH.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_result-file.md.DmR4fjB-.js → reference_contracts_result-file.md.CiZCk_r-.js} +1 -1
- package/site-dist/assets/{reference_contracts_result-file.md.DmR4fjB-.lean.js → reference_contracts_result-file.md.CiZCk_r-.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_spec.md.Dh5XczZL.js → reference_contracts_spec.md.B04OndF4.js} +1 -1
- package/site-dist/assets/{reference_contracts_spec.md.Dh5XczZL.lean.js → reference_contracts_spec.md.B04OndF4.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_state.md.STlqkPPS.js → reference_contracts_state.md.Xu63sMWH.js} +1 -1
- package/site-dist/assets/{reference_contracts_state.md.STlqkPPS.lean.js → reference_contracts_state.md.Xu63sMWH.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_usage-record.md.MjVps4CA.js → reference_contracts_usage-record.md.gd7f8fyb.js} +1 -1
- package/site-dist/assets/{reference_contracts_usage-record.md.MjVps4CA.lean.js → reference_contracts_usage-record.md.gd7f8fyb.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_verify.md.CbA88u6S.js → reference_contracts_verify.md.D_bAWUcP.js} +1 -1
- package/site-dist/assets/{reference_contracts_verify.md.CbA88u6S.lean.js → reference_contracts_verify.md.D_bAWUcP.lean.js} +1 -1
- package/site-dist/assets/{reference_scope.md.Kzqw8U_f.js → reference_scope.md.B7JBceSf.js} +1 -1
- package/site-dist/assets/{reference_scope.md.Kzqw8U_f.lean.js → reference_scope.md.B7JBceSf.lean.js} +1 -1
- package/site-dist/assets/{style.Dwsa4SMe.css → style.2G3zLS3c.css} +1 -1
- package/site-dist/changelog.html +9 -9
- package/site-dist/favicon.svg +10 -0
- package/site-dist/guide/getting-started.html +9 -9
- package/site-dist/guide/how-it-works.html +9 -9
- package/site-dist/guide/index.html +9 -9
- package/site-dist/guide/install.html +9 -9
- package/site-dist/guide/maintainer.html +9 -9
- package/site-dist/guide/phases.html +9 -9
- package/site-dist/guide/project.html +9 -9
- package/site-dist/guide/user.html +9 -9
- package/site-dist/hashmap.json +1 -1
- package/site-dist/index.html +9 -9
- package/site-dist/logo-light.svg +6 -0
- package/site-dist/logo.svg +5 -10
- package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +9 -9
- package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +9 -9
- package/site-dist/reference/adr/0003-script-engine-not-hub.html +9 -9
- package/site-dist/reference/adr/0004-result-files.html +9 -9
- package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +9 -9
- package/site-dist/reference/adr/0006-skill-install-targets.html +9 -9
- package/site-dist/reference/adr/0007-own-interview-skill.html +9 -9
- package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +9 -9
- package/site-dist/reference/adr/0009-versioned-install-layout.html +9 -9
- package/site-dist/reference/adr/0010-generated-feature-overview.html +9 -9
- package/site-dist/reference/adr/0011-resume-after-completion.html +9 -9
- package/site-dist/reference/adr/0012-review-panel.html +9 -9
- package/site-dist/reference/adr/0013-no-release-tooling.html +9 -9
- package/site-dist/reference/adr/0014-notifier-slot.html +9 -9
- package/site-dist/reference/adr/0015-incremental-continue.html +9 -9
- package/site-dist/reference/adr/0016-upgrade-from-tags.html +9 -9
- package/site-dist/reference/adr/0017-use-paseo-capabilities.html +9 -9
- package/site-dist/reference/adr/0018-own-worktree-option.html +9 -9
- package/site-dist/reference/adr/0019-parallel-orchestration.html +9 -9
- package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +9 -9
- package/site-dist/reference/adr/0021-npm-version-manager.html +9 -9
- package/site-dist/reference/adr/0022-develop-and-verify-phases.html +9 -9
- package/site-dist/reference/adr/0023-types-gate-slices.html +9 -9
- package/site-dist/reference/adr/0024-confirm-early-review-axes.html +9 -9
- package/site-dist/reference/adr/0025-joint-requirements.html +9 -9
- package/site-dist/reference/adr/0026-machine-records-and-api.html +9 -9
- package/site-dist/reference/adr/0027-paseo-plugin.html +9 -9
- package/site-dist/reference/adr/0028-external-integrations.html +9 -9
- package/site-dist/reference/adr/0029-requirements-from-cards.html +9 -9
- package/site-dist/reference/adr/0030-card-intake-process.html +9 -9
- package/site-dist/reference/adr/0031-fewer-interventions.html +9 -9
- package/site-dist/reference/adr/0032-npm-only-install.html +9 -9
- package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +9 -9
- package/site-dist/reference/adr/index.html +9 -9
- package/site-dist/reference/commands.html +9 -9
- package/site-dist/reference/config.html +9 -9
- package/site-dist/reference/contracts/cli-json.html +9 -9
- package/site-dist/reference/contracts/feature-files.html +9 -9
- package/site-dist/reference/contracts/index.html +9 -9
- package/site-dist/reference/contracts/notifier-event.html +9 -9
- package/site-dist/reference/contracts/result-file.html +9 -9
- package/site-dist/reference/contracts/spec.html +9 -9
- package/site-dist/reference/contracts/state.html +9 -9
- package/site-dist/reference/contracts/usage-record.html +9 -9
- package/site-dist/reference/contracts/verify.html +9 -9
- package/site-dist/reference/scope.html +9 -9
- package/site-dist/assets/changelog.md.CIKYJXpF.js +0 -1
- package/site-dist/assets/chunks/@localSearchIndexroot.h7oQE_np.js +0 -1
- package/site-dist/assets/chunks/theme.B_UmHHou.js +0 -2
- package/site-dist/assets/guide_maintainer.md.C1v7EpSY.js +0 -1
- package/site-dist/assets/guide_maintainer.md.C1v7EpSY.lean.js +0 -1
- package/site-dist/assets/index.md.Cf_sSf_f.js +0 -1
- package/site-dist/assets/index.md.Cf_sSf_f.lean.js +0 -1
- package/site-dist/icons/agents.svg +0 -1
- package/site-dist/icons/chat.svg +0 -1
- package/site-dist/icons/paseo.svg +0 -1
- package/site-dist/icons/phases.svg +0 -1
- package/site-dist/icons/review.svg +0 -1
- package/site-dist/icons/safe.svg +0 -1
package/site-dist/assets/{reference_commands.md.ClKbS-t8.js → reference_commands.md.BAQ8FugP.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,o as d,c as o,a3 as r}from"./chunks/framework.B9qR_F1m.js";const p=JSON.parse('{"title":"命令","description":"","frontmatter":{},"headers":[],"relativePath":"reference/commands.md","filePath":"reference/commands.md","lastUpdated":1792362729000}'),c={name:"reference/commands.md"};function a(s,t,l,i,n,q){return d(),o("div",null,[...t[0]||(t[0]=[r('<h1 id="命令" tabindex="-1">命令 <a class="header-anchor" href="#命令" aria-label="Permalink to "命令""></a></h1><p>req-kit 有三类入口:在 Paseo 对话中使用的 <strong>skill</strong>,终端中的 <strong><code>req</code> 命令</strong>,以及 skill 在背后调用的<strong>流水线启动器</strong>。日常使用只需要第一类。</p><h2 id="对话中的-skill" tabindex="-1">对话中的 skill <a class="header-anchor" href="#对话中的-skill" aria-label="Permalink to "对话中的 skill""></a></h2><table tabindex="0"><thead><tr><th>输入</th><th>作用</th><th>通常谁用</th></tr></thead><tbody><tr><td><code>/req <一句话></code></td><td>需求开发入口:新需求、小改动、查看进度、暂停或继续、修改需求、开始测试验证、验收、上线后问题、接手。由它判断走哪本手册</td><td>使用者</td></tr><tr><td><code>/req-setup</code></td><td>项目接入:生成项目说明、验证方法、<code>paseo.json</code>,确认后提交</td><td>开发或熟悉项目的测试同事</td></tr><tr><td><code>/req-doctor</code></td><td>体检:安装、配置、daemon、当前项目</td><td>任何人</td></tr><tr><td><code>/req-retro</code></td><td>复盘:需求做完后回顾返工、中断和变更,把改进落到 CI、配置、项目说明或提示词</td><td>开发同事</td></tr></tbody></table><p>Pi 中写作 <code>/skill:req</code>。同一个对话里,之后的"做到哪了""先停一下""继续开发""开始测试验证""我要验收"不需要再带 <code>/req</code>。</p><h2 id="req-命令" tabindex="-1">req 命令 <a class="header-anchor" href="#req-命令" aria-label="Permalink to "req 命令""></a></h2><p>安装后提供 <code>req</code>(同名命令 <code>req-kit</code>,避免和其他工具冲突)。Windows PowerShell 受执行策略限制时用 <code>req.cmd</code>。</p><h3 id="在项目目录中" tabindex="-1">在项目目录中 <a class="header-anchor" href="#在项目目录中" aria-label="Permalink to "在项目目录中""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req list</code></td><td>列出这个项目所有工作区中的需求和阶段</td></tr><tr><td><code>req status [需求]</code></td><td>查看进度;只有一个需求运行过时可以不写</td></tr><tr><td><code>req stop <需求></code></td><td>停止流水线(之后可以继续);同时取消预约的开始、提醒、自动继续</td></tr><tr><td><code>req resume <需求></code></td><td>从上次中断处继续;需求改过时只处理变化的部分</td></tr><tr><td><code>req approve <需求></code></td><td>需求方看过 <code>preview.md</code> 并确认后,从方案确认点继续开发</td></tr><tr><td><code>req verify <需求> [--verify-env local|deployed] [--defects fix|handback|report]</code></td><td>研发完成后开始测试验证(分阶段执行时)</td></tr><tr><td><code>req start <需求> [--profile quick|standard] [--phases gated] [--at 22:00]</code></td><td>启动流水线(通常由 <code>/req</code> 在对话中启动)</td></tr><tr><td><code>req digest [--notify]</code></td><td>项目的需求总览;<code>--notify</code> 同时发到外部通知</td></tr><tr><td><code>req digest --schedule "0 9 * * 1"</code></td><td>让 Paseo 按时间表发送需求总览;取消:<code>req digest --cancel <ID></code></td></tr><tr><td><code>req sync <需求></code></td><td>把需求同步到对接的外部系统:补发没有成功的调用、补建卡片、更新状态</td></tr><tr><td><code>req integration test [需求]</code></td><td>显示对接外部系统时每个事件会执行的命令,不真正调用</td></tr><tr><td><code>req start --from <系统>:<卡号> [--repo <仓库>]</code></td><td>从需求管理系统中的一张卡片开始需求:建功能目录和需求会话,问题和确认通过卡片描述;不写 <code>--repo</code> 时按子系统选仓库</td></tr><tr><td><code>req card check [<卡号> | --all]</code></td><td>读取需求方在卡片中的回复,把新内容转给需求会话</td></tr><tr><td><code>req card publish <卡号></code></td><td>需求会话使用:把 <code>card-ai.md</code> 写进卡片的 AI 区</td></tr><tr><td><code>req card list</code></td><td>本机从卡片开始的需求和各自的进展</td></tr><tr><td><code>req card route [--add <仓库> | --remove <仓库>]</code></td><td>本机接收卡片的仓库和各自的子系统;<code>req start --from</code> 不写 <code>--repo</code> 时按它选仓库</td></tr><tr><td><code>req factory once | run | start | stop | status | service</code></td><td>接单器:定时为标题带 <code>[AI]</code> 的新卡片开始需求、转达需求方的回复;<code>once</code> 检查一次,<code>start</code>/<code>stop</code> 后台运行,<code>service</code> 给出作为系统服务运行的写法</td></tr><tr><td><code>req index --rebuild [目录…]</code></td><td>把这些仓库中运行过的需求登记进本机的需求索引(1.9 之前运行过的需求用)</td></tr></tbody></table><h3 id="使用统计-任何目录" tabindex="-1">使用统计(任何目录) <a class="header-anchor" href="#使用统计-任何目录" aria-label="Permalink to "使用统计(任何目录)""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req stats [--since 30d] [--month 2026-10]</code></td><td>本机的使用统计:需求数、交付周期、返工、等待、各步骤用时、用量;<code>--json</code>、<code>--csv</code></td></tr><tr><td><code>req stats --report [--out 目录]</code></td><td>生成汇报用的 <code>.md</code> 汇总和 <code>.csv</code> 明细</td></tr><tr><td><code>req stats --export [文件]</code></td><td>导出本机的运行记录</td></tr><tr><td><code>req stats --merge <文件…> --report</code></td><td>汇总几台机器的导出</td></tr><tr><td><code>req index [--prune]</code></td><td>本机记录的需求;<code>--prune</code> 移除目录已不在的</td></tr><tr><td><code>req api <命令> …</code></td><td>给程序用的 JSON 输出,见 <a href="./contracts/cli-json">req api</a></td></tr></tbody></table><h3 id="paseo-插件" tabindex="-1">Paseo 插件 <a class="header-anchor" href="#paseo-插件" aria-label="Permalink to "Paseo 插件""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req plugin install [--yes]</code></td><td>安装或更新 req-kit 的 Paseo 插件;需要时询问是否打开 Paseo 的插件总开关</td></tr><tr><td><code>req plugin status</code></td><td>插件是否在运行</td></tr><tr><td><code>req plugin remove</code></td><td>从 Paseo 移除插件</td></tr></tbody></table><p><code><需求></code> 可以写功能目录(<code>docs/features/20261012-sms-login</code>)、目录名,或名称中能唯一确定的一部分(<code>sms-login</code>)。</p><h3 id="本机维护" tabindex="-1">本机维护 <a class="header-anchor" href="#本机维护" aria-label="Permalink to "本机维护""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req install [--registry <地址>]</code></td><td>安装或升级(与 <code>npx -y paseo-req-kit@latest install</code> 相同),见下面的"安装脚本"</td></tr><tr><td><code>req docs [--port <端口>] [--no-open]</code></td><td>在本机打开这个版本的文档站点(不需要外网)</td></tr><tr><td><code>req doctor [--no-project]</code></td><td>体检:安装、配置、daemon、当前项目</td></tr><tr><td><code>req configure</code></td><td>配置向导:为 builder、reviewer 和备用模型选择 agent</td></tr><tr><td><code>req configure --auto</code></td><td>不提问,按推荐选好(1.12;安装时自动运行)</td></tr><tr><td><code>req reply <需求> <回复></code></td><td>把回答或方案意见转给需求的对话(1.12;插件"等你处理"用它)</td></tr><tr><td><code>req setup</code></td><td>启用 npm 安装的这个版本、安装 skill(安装脚本会自动运行)</td></tr><tr><td><code>req upgrade [版本] [--beta]</code></td><td>升级到最新版本(或指定版本),自动选能支持本机 Paseo 的版本;<code>--check</code> 只看有没有新版本</td></tr><tr><td><code>req versions</code></td><td>已安装的版本和可用的版本</td></tr><tr><td><code>req use <版本></code></td><td>切换到已安装的另一个版本(回滚)</td></tr><tr><td><code>req check</code></td><td>检查安装状态</td></tr><tr><td><code>req notify-test [--type …]</code></td><td>给配置的外部通知(如企业 IM)发一条测试消息</td></tr><tr><td><code>req version</code></td><td>显示版本和安装位置</td></tr></tbody></table><h2 id="流水线启动器" tabindex="-1">流水线启动器 <a class="header-anchor" href="#流水线启动器" aria-label="Permalink to "流水线启动器""></a></h2><p><code>/req</code> 在对话中执行的是 <code>node <安装目录>/bin/start-pipeline.mjs</code>,在 bash、PowerShell、cmd 中写法相同。在 Paseo 对话中运行时,它自动识别当前对话(<code>PASEO_AGENT_ID</code>)和工作目录(<code>PASEO_AGENT_CWD</code>)。</p><table tabindex="0"><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td><code>--feature <功能目录></code></td><td>要操作的需求;可以只写名称的一部分</td></tr><tr><td><code>--status</code> / <code>--stop</code> / <code>--list</code></td><td>查看进度 / 停止 / 列出需求</td></tr><tr><td><code>--resume</code> / <code>--restart</code></td><td>从中断处继续 / 丢弃结果从零开始</td></tr><tr><td><code>--profile quick|standard</code></td><td>档位;不传时读需求说明中的"档位",再用配置的 <code>defaultProfile</code></td></tr><tr><td><code>--phases continuous|gated|develop-only</code></td><td>执行方式;不传时读需求说明中的"执行方式",再用配置的 <code>phases.mode</code></td></tr><tr><td><code>--approve</code></td><td>方案确认点:需求方确认了方案,继续开发(等待确认时单独的 <code>--resume</code> 会被拒绝;要修改就先更新需求说明再 <code>--resume</code>)</td></tr><tr><td><code>--phase verify</code></td><td>开始(或继续)测试验证阶段;研发完成、待测试时单独的 <code>--resume</code> 效果相同</td></tr><tr><td><code>--verify-env local|deployed</code>、<code>--defects fix|handback|report</code></td><td>开始测试验证时临时指定环境和缺陷处理方式</td></tr><tr><td><code>--verify-at <时间></code></td><td>分阶段时,研发完成后在这个时间自动开始测试验证</td></tr><tr><td><code>--at <时间></code></td><td>预约开始:<code>22:00</code>、<code>明天 8:30</code>、<code>2026-10-14 08:30</code>、<code>+2h</code></td></tr><tr><td><code>--worktree</code></td><td>为这个需求新建 Paseo worktree 工作区并在那里开发(对话目录不变)</td></tr><tr><td><code>--spec-review</code></td><td>确认前请另一个模型独立审阅需求说明草稿</td></tr><tr><td><code>--repo</code>、<code>--origin-agent</code>、<code>--config</code></td><td>仓库目录、发起对话、配置文件(通常不需要写)</td></tr></tbody></table><h2 id="安装脚本" tabindex="-1">安装脚本 <a class="header-anchor" href="#安装脚本" aria-label="Permalink to "安装脚本""></a></h2><table tabindex="0"><thead><tr><th>系统</th><th>命令</th></tr></thead><tbody><tr><td>任何系统(1.13 起)</td><td><code>npx -y paseo-req-kit@latest install</code>;公司内网:<code>npx -y --registry=<镜像地址> paseo-req-kit@latest install</code></td></tr><tr><td>macOS、Linux、Git Bash、WSL</td><td><code>curl -fsSL https://paseo-req-kit.vercel.app/install.sh | sh</code></td></tr><tr><td>Windows PowerShell</td><td><code>irm https://paseo-req-kit.vercel.app/install.ps1 | iex</code></td></tr></tbody></table><p><code>req install</code>(即 <code>npx … install</code>)的选项:<code>--registry <地址></code>(使用并保存这个 npm 源)、<code>--no-save-registry</code>、<code>--no-configure</code>、<code>--skip-paseo</code>、<code>--with-plugin</code>、<code>--no-plugin</code>;版本写在包名后(<code>paseo-req-kit@beta</code>、<code>paseo-req-kit@1.13.0</code>)。</p><p><code>install.sh</code> 的选项写在 <code>sh -s --</code> 之后:<code>--beta</code>、<code>--version <版本></code>、<code>--from npm|release</code>、<code>--registry <地址></code>、<code>--no-save-registry</code>、<code>--no-configure</code>、<code>--skip-paseo</code>(不检查、不安装 Paseo)、<code>--with-plugin</code>(直接安装 Paseo 插件)、<code>--no-plugin</code>。<code>install.ps1</code> 的选项用变量:<code>$ReqKitBeta = $true</code>、<code>$ReqKitVersion = "1.9.1"</code>、<code>$ReqKitFrom = "release"</code>、<code>$ReqKitRegistry = "<地址>"</code>、<code>$ReqKitNoSaveRegistry = $true</code>、<code>$ReqKitNoConfigure = $true</code>、<code>$ReqKitSkipPaseo = $true</code>、<code>$ReqKitPlugin = "yes"</code>(或 <code>"no"</code>)。没有 Paseo 时脚本会安装 Paseo 命令行、开启它的网页界面并启动 daemon。</p>',23)])])}const u=e(c,[["render",a]]);export{p as __pageData,u as default};
|
|
1
|
+
import{_ as e,o as d,c as o,a2 as r}from"./chunks/framework.BetZR81g.js";const p=JSON.parse('{"title":"命令","description":"","frontmatter":{},"headers":[],"relativePath":"reference/commands.md","filePath":"reference/commands.md","lastUpdated":1792362729000}'),c={name:"reference/commands.md"};function a(s,t,l,i,n,q){return d(),o("div",null,[...t[0]||(t[0]=[r('<h1 id="命令" tabindex="-1">命令 <a class="header-anchor" href="#命令" aria-label="Permalink to "命令""></a></h1><p>req-kit 有三类入口:在 Paseo 对话中使用的 <strong>skill</strong>,终端中的 <strong><code>req</code> 命令</strong>,以及 skill 在背后调用的<strong>流水线启动器</strong>。日常使用只需要第一类。</p><h2 id="对话中的-skill" tabindex="-1">对话中的 skill <a class="header-anchor" href="#对话中的-skill" aria-label="Permalink to "对话中的 skill""></a></h2><table tabindex="0"><thead><tr><th>输入</th><th>作用</th><th>通常谁用</th></tr></thead><tbody><tr><td><code>/req <一句话></code></td><td>需求开发入口:新需求、小改动、查看进度、暂停或继续、修改需求、开始测试验证、验收、上线后问题、接手。由它判断走哪本手册</td><td>使用者</td></tr><tr><td><code>/req-setup</code></td><td>项目接入:生成项目说明、验证方法、<code>paseo.json</code>,确认后提交</td><td>开发或熟悉项目的测试同事</td></tr><tr><td><code>/req-doctor</code></td><td>体检:安装、配置、daemon、当前项目</td><td>任何人</td></tr><tr><td><code>/req-retro</code></td><td>复盘:需求做完后回顾返工、中断和变更,把改进落到 CI、配置、项目说明或提示词</td><td>开发同事</td></tr></tbody></table><p>Pi 中写作 <code>/skill:req</code>。同一个对话里,之后的"做到哪了""先停一下""继续开发""开始测试验证""我要验收"不需要再带 <code>/req</code>。</p><h2 id="req-命令" tabindex="-1">req 命令 <a class="header-anchor" href="#req-命令" aria-label="Permalink to "req 命令""></a></h2><p>安装后提供 <code>req</code>(同名命令 <code>req-kit</code>,避免和其他工具冲突)。Windows PowerShell 受执行策略限制时用 <code>req.cmd</code>。</p><h3 id="在项目目录中" tabindex="-1">在项目目录中 <a class="header-anchor" href="#在项目目录中" aria-label="Permalink to "在项目目录中""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req list</code></td><td>列出这个项目所有工作区中的需求和阶段</td></tr><tr><td><code>req status [需求]</code></td><td>查看进度;只有一个需求运行过时可以不写</td></tr><tr><td><code>req stop <需求></code></td><td>停止流水线(之后可以继续);同时取消预约的开始、提醒、自动继续</td></tr><tr><td><code>req resume <需求></code></td><td>从上次中断处继续;需求改过时只处理变化的部分</td></tr><tr><td><code>req approve <需求></code></td><td>需求方看过 <code>preview.md</code> 并确认后,从方案确认点继续开发</td></tr><tr><td><code>req verify <需求> [--verify-env local|deployed] [--defects fix|handback|report]</code></td><td>研发完成后开始测试验证(分阶段执行时)</td></tr><tr><td><code>req start <需求> [--profile quick|standard] [--phases gated] [--at 22:00]</code></td><td>启动流水线(通常由 <code>/req</code> 在对话中启动)</td></tr><tr><td><code>req digest [--notify]</code></td><td>项目的需求总览;<code>--notify</code> 同时发到外部通知</td></tr><tr><td><code>req digest --schedule "0 9 * * 1"</code></td><td>让 Paseo 按时间表发送需求总览;取消:<code>req digest --cancel <ID></code></td></tr><tr><td><code>req sync <需求></code></td><td>把需求同步到对接的外部系统:补发没有成功的调用、补建卡片、更新状态</td></tr><tr><td><code>req integration test [需求]</code></td><td>显示对接外部系统时每个事件会执行的命令,不真正调用</td></tr><tr><td><code>req start --from <系统>:<卡号> [--repo <仓库>]</code></td><td>从需求管理系统中的一张卡片开始需求:建功能目录和需求会话,问题和确认通过卡片描述;不写 <code>--repo</code> 时按子系统选仓库</td></tr><tr><td><code>req card check [<卡号> | --all]</code></td><td>读取需求方在卡片中的回复,把新内容转给需求会话</td></tr><tr><td><code>req card publish <卡号></code></td><td>需求会话使用:把 <code>card-ai.md</code> 写进卡片的 AI 区</td></tr><tr><td><code>req card list</code></td><td>本机从卡片开始的需求和各自的进展</td></tr><tr><td><code>req card route [--add <仓库> | --remove <仓库>]</code></td><td>本机接收卡片的仓库和各自的子系统;<code>req start --from</code> 不写 <code>--repo</code> 时按它选仓库</td></tr><tr><td><code>req factory once | run | start | stop | status | service</code></td><td>接单器:定时为标题带 <code>[AI]</code> 的新卡片开始需求、转达需求方的回复;<code>once</code> 检查一次,<code>start</code>/<code>stop</code> 后台运行,<code>service</code> 给出作为系统服务运行的写法</td></tr><tr><td><code>req index --rebuild [目录…]</code></td><td>把这些仓库中运行过的需求登记进本机的需求索引(1.9 之前运行过的需求用)</td></tr></tbody></table><h3 id="使用统计-任何目录" tabindex="-1">使用统计(任何目录) <a class="header-anchor" href="#使用统计-任何目录" aria-label="Permalink to "使用统计(任何目录)""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req stats [--since 30d] [--month 2026-10]</code></td><td>本机的使用统计:需求数、交付周期、返工、等待、各步骤用时、用量;<code>--json</code>、<code>--csv</code></td></tr><tr><td><code>req stats --report [--out 目录]</code></td><td>生成汇报用的 <code>.md</code> 汇总和 <code>.csv</code> 明细</td></tr><tr><td><code>req stats --export [文件]</code></td><td>导出本机的运行记录</td></tr><tr><td><code>req stats --merge <文件…> --report</code></td><td>汇总几台机器的导出</td></tr><tr><td><code>req index [--prune]</code></td><td>本机记录的需求;<code>--prune</code> 移除目录已不在的</td></tr><tr><td><code>req api <命令> …</code></td><td>给程序用的 JSON 输出,见 <a href="./contracts/cli-json">req api</a></td></tr></tbody></table><h3 id="paseo-插件" tabindex="-1">Paseo 插件 <a class="header-anchor" href="#paseo-插件" aria-label="Permalink to "Paseo 插件""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req plugin install [--yes]</code></td><td>安装或更新 req-kit 的 Paseo 插件;需要时询问是否打开 Paseo 的插件总开关</td></tr><tr><td><code>req plugin status</code></td><td>插件是否在运行</td></tr><tr><td><code>req plugin remove</code></td><td>从 Paseo 移除插件</td></tr></tbody></table><p><code><需求></code> 可以写功能目录(<code>docs/features/20261012-sms-login</code>)、目录名,或名称中能唯一确定的一部分(<code>sms-login</code>)。</p><h3 id="本机维护" tabindex="-1">本机维护 <a class="header-anchor" href="#本机维护" aria-label="Permalink to "本机维护""></a></h3><table tabindex="0"><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>req install [--registry <地址>]</code></td><td>安装或升级(与 <code>npx -y paseo-req-kit@latest install</code> 相同),见下面的"安装脚本"</td></tr><tr><td><code>req docs [--port <端口>] [--no-open]</code></td><td>在本机打开这个版本的文档站点(不需要外网)</td></tr><tr><td><code>req doctor [--no-project]</code></td><td>体检:安装、配置、daemon、当前项目</td></tr><tr><td><code>req configure</code></td><td>配置向导:为 builder、reviewer 和备用模型选择 agent</td></tr><tr><td><code>req configure --auto</code></td><td>不提问,按推荐选好(1.12;安装时自动运行)</td></tr><tr><td><code>req reply <需求> <回复></code></td><td>把回答或方案意见转给需求的对话(1.12;插件"等你处理"用它)</td></tr><tr><td><code>req setup</code></td><td>启用 npm 安装的这个版本、安装 skill(安装脚本会自动运行)</td></tr><tr><td><code>req upgrade [版本] [--beta]</code></td><td>升级到最新版本(或指定版本),自动选能支持本机 Paseo 的版本;<code>--check</code> 只看有没有新版本</td></tr><tr><td><code>req versions</code></td><td>已安装的版本和可用的版本</td></tr><tr><td><code>req use <版本></code></td><td>切换到已安装的另一个版本(回滚)</td></tr><tr><td><code>req check</code></td><td>检查安装状态</td></tr><tr><td><code>req notify-test [--type …]</code></td><td>给配置的外部通知(如企业 IM)发一条测试消息</td></tr><tr><td><code>req version</code></td><td>显示版本和安装位置</td></tr></tbody></table><h2 id="流水线启动器" tabindex="-1">流水线启动器 <a class="header-anchor" href="#流水线启动器" aria-label="Permalink to "流水线启动器""></a></h2><p><code>/req</code> 在对话中执行的是 <code>node <安装目录>/bin/start-pipeline.mjs</code>,在 bash、PowerShell、cmd 中写法相同。在 Paseo 对话中运行时,它自动识别当前对话(<code>PASEO_AGENT_ID</code>)和工作目录(<code>PASEO_AGENT_CWD</code>)。</p><table tabindex="0"><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td><code>--feature <功能目录></code></td><td>要操作的需求;可以只写名称的一部分</td></tr><tr><td><code>--status</code> / <code>--stop</code> / <code>--list</code></td><td>查看进度 / 停止 / 列出需求</td></tr><tr><td><code>--resume</code> / <code>--restart</code></td><td>从中断处继续 / 丢弃结果从零开始</td></tr><tr><td><code>--profile quick|standard</code></td><td>档位;不传时读需求说明中的"档位",再用配置的 <code>defaultProfile</code></td></tr><tr><td><code>--phases continuous|gated|develop-only</code></td><td>执行方式;不传时读需求说明中的"执行方式",再用配置的 <code>phases.mode</code></td></tr><tr><td><code>--approve</code></td><td>方案确认点:需求方确认了方案,继续开发(等待确认时单独的 <code>--resume</code> 会被拒绝;要修改就先更新需求说明再 <code>--resume</code>)</td></tr><tr><td><code>--phase verify</code></td><td>开始(或继续)测试验证阶段;研发完成、待测试时单独的 <code>--resume</code> 效果相同</td></tr><tr><td><code>--verify-env local|deployed</code>、<code>--defects fix|handback|report</code></td><td>开始测试验证时临时指定环境和缺陷处理方式</td></tr><tr><td><code>--verify-at <时间></code></td><td>分阶段时,研发完成后在这个时间自动开始测试验证</td></tr><tr><td><code>--at <时间></code></td><td>预约开始:<code>22:00</code>、<code>明天 8:30</code>、<code>2026-10-14 08:30</code>、<code>+2h</code></td></tr><tr><td><code>--worktree</code></td><td>为这个需求新建 Paseo worktree 工作区并在那里开发(对话目录不变)</td></tr><tr><td><code>--spec-review</code></td><td>确认前请另一个模型独立审阅需求说明草稿</td></tr><tr><td><code>--repo</code>、<code>--origin-agent</code>、<code>--config</code></td><td>仓库目录、发起对话、配置文件(通常不需要写)</td></tr></tbody></table><h2 id="安装脚本" tabindex="-1">安装脚本 <a class="header-anchor" href="#安装脚本" aria-label="Permalink to "安装脚本""></a></h2><table tabindex="0"><thead><tr><th>系统</th><th>命令</th></tr></thead><tbody><tr><td>任何系统(1.13 起)</td><td><code>npx -y paseo-req-kit@latest install</code>;公司内网:<code>npx -y --registry=<镜像地址> paseo-req-kit@latest install</code></td></tr><tr><td>macOS、Linux、Git Bash、WSL</td><td><code>curl -fsSL https://paseo-req-kit.vercel.app/install.sh | sh</code></td></tr><tr><td>Windows PowerShell</td><td><code>irm https://paseo-req-kit.vercel.app/install.ps1 | iex</code></td></tr></tbody></table><p><code>req install</code>(即 <code>npx … install</code>)的选项:<code>--registry <地址></code>(使用并保存这个 npm 源)、<code>--no-save-registry</code>、<code>--no-configure</code>、<code>--skip-paseo</code>、<code>--with-plugin</code>、<code>--no-plugin</code>;版本写在包名后(<code>paseo-req-kit@beta</code>、<code>paseo-req-kit@1.13.0</code>)。</p><p><code>install.sh</code> 的选项写在 <code>sh -s --</code> 之后:<code>--beta</code>、<code>--version <版本></code>、<code>--from npm|release</code>、<code>--registry <地址></code>、<code>--no-save-registry</code>、<code>--no-configure</code>、<code>--skip-paseo</code>(不检查、不安装 Paseo)、<code>--with-plugin</code>(直接安装 Paseo 插件)、<code>--no-plugin</code>。<code>install.ps1</code> 的选项用变量:<code>$ReqKitBeta = $true</code>、<code>$ReqKitVersion = "1.9.1"</code>、<code>$ReqKitFrom = "release"</code>、<code>$ReqKitRegistry = "<地址>"</code>、<code>$ReqKitNoSaveRegistry = $true</code>、<code>$ReqKitNoConfigure = $true</code>、<code>$ReqKitSkipPaseo = $true</code>、<code>$ReqKitPlugin = "yes"</code>(或 <code>"no"</code>)。没有 Paseo 时脚本会安装 Paseo 命令行、开启它的网页界面并启动 daemon。</p>',23)])])}const u=e(c,[["render",a]]);export{p as __pageData,u as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,o as d,c as o,
|
|
1
|
+
import{_ as e,o as d,c as o,a2 as r}from"./chunks/framework.BetZR81g.js";const p=JSON.parse('{"title":"命令","description":"","frontmatter":{},"headers":[],"relativePath":"reference/commands.md","filePath":"reference/commands.md","lastUpdated":1792362729000}'),c={name:"reference/commands.md"};function a(s,t,l,i,n,q){return d(),o("div",null,[...t[0]||(t[0]=[r("",23)])])}const u=e(c,[["render",a]]);export{p as __pageData,u as default};
|
package/site-dist/assets/{reference_config.md.CRe27LaA.js → reference_config.md.DoQUxHQ2.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as d,o as e,c as o,
|
|
1
|
+
import{_ as d,o as e,c as o,a2 as a}from"./chunks/framework.BetZR81g.js";const u=JSON.parse('{"title":"配置项","description":"","frontmatter":{},"headers":[],"relativePath":"reference/config.md","filePath":"reference/config.md","lastUpdated":1792212140000}'),c={name:"reference/config.md"};function r(s,t,i,n,l,h){return e(),o("div",null,[...t[0]||(t[0]=[a(`<h1 id="配置项" tabindex="-1">配置项 <a class="header-anchor" href="#配置项" aria-label="Permalink to "配置项""></a></h1><p>配置分三层,后者覆盖前者:</p><ol><li><strong>本机配置</strong> <code>~/.req-kit/config.json</code>(<code>REQ_KIT_HOME</code> 可以改变目录)——<code>req configure</code> 生成;</li><li><strong>团队配置</strong>:本机配置的 <code>teamConfig</code> 指向的文件,适合放进团队共用的仓库;</li><li><strong>项目配置</strong>:仓库根目录的 <code>.requirement-pipeline.json</code>,只写和本机不同的部分。</li></ol><p><code>daemonUrl</code>、<code>daemonPasswordEnv</code>、<code>teamConfig</code> 只能写在本机配置中;<code>notifiers</code>、<code>integrations</code>、<code>push</code>、<code>factory</code>、<code>people</code> 不能写在项目配置中(会运行命令、推送或发消息)。在 Paseo 插件首页的"配置"中可以看到每一项现在的值和来自哪个文件。写错时,流水线启动前会说明哪一项、为什么。完整的示例见仓库的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/config.example.json" target="_blank" rel="noreferrer">config.example.json</a>。</p><h2 id="agent" tabindex="-1">agent <a class="header-anchor" href="#agent" aria-label="Permalink to "agent""></a></h2><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
|
|
2
2
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "agents"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
|
|
3
3
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "builder"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"paseoProfile"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"实现"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|
4
4
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "reviewer"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"provider"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"codex/<模型 ID>"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"modeId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"full-access"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as d,o as e,c as o,
|
|
1
|
+
import{_ as d,o as e,c as o,a2 as a}from"./chunks/framework.BetZR81g.js";const u=JSON.parse('{"title":"配置项","description":"","frontmatter":{},"headers":[],"relativePath":"reference/config.md","filePath":"reference/config.md","lastUpdated":1792212140000}'),c={name:"reference/config.md"};function r(s,t,i,n,l,h){return e(),o("div",null,[...t[0]||(t[0]=[a("",18)])])}const k=d(c,[["render",r]]);export{u as __pageData,k as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,o as d,c as u,j as l,a as e}from"./chunks/framework.B9qR_F1m.js";const k=JSON.parse('{"title":"给程序用的 JSON 输出:req api","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/cli-json.md","filePath":"reference/contracts/cli-json.md","lastUpdated":null}'),s={name:"reference/contracts/cli-json.md"};function i(o,n,a,r,c,p){return d(),u("div",null,[...n[0]||(n[0]=[l("div",null,[l("h1",{id:"给程序用的-json-输出-req-api",tabindex:"-1"},[e("给程序用的 JSON 输出:"),l("code",null,"req api"),e(),l("a",{class:"header-anchor",href:"#给程序用的-json-输出-req-api","aria-label":'Permalink to "给程序用的 JSON 输出:`req api`"'},"")]),l("p",null,[e("1.9.0 起。Paseo 插件和其他程序通过 "),l("code",null,"req api"),e(" 读取需求、执行管理操作,不直接读写状态文件。每个命令输出一行 JSON:")]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"data"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#B31D28","--shiki-light-font-style":"italic","--shiki-dark":"#FDAEB7","--shiki-dark-font-style":"italic"}},"…"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," }")])])])]),l("p",null,"出错时退出码为 1:"),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"error"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"code"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"not_found"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"message"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"没有找到需求……"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")])])])]),l("p",null,[l("code",null,"code"),e(":"),l("code",null,"bad_arguments"),e("(参数不对)、"),l("code",null,"not_found"),e("(目录或需求不存在)、"),l("code",null,"not_allowed"),e("(不允许的文件或命令)、"),l("code",null,"failed"),e("(其他错误)。")]),l("p",null,[l("code",null,"schema"),e(" 只在不兼容的修改时增加;新增字段不改变 "),l("code",null,"schema"),e(",读取方应忽略不认识的字段。")]),l("h2",{id:"命令",tabindex:"-1"},[e("命令 "),l("a",{class:"header-anchor",href:"#命令","aria-label":'Permalink to "命令"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"命令"),l("th",null,[l("code",null,"data")])])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"req api version")]),l("td",null,[l("code",null,"{ kitVersion, kitRoot, apiSchema, paseo, featuresDir }"),e(":"),l("code",null,"paseo"),e(" 是这个版本支持的 Paseo 范围")])]),l("tr",null,[l("td",null,[l("code",null,"req api list [--repo <目录>]")]),l("td",null,'这个仓库所有工作区中的需求,数组,每项见下面的"需求"')]),l("tr",null,[l("td",null,[l("code",null,"req api list --all")]),l("td",null,[e("本机记录过的所有需求("),l("a",{href:"./usage-record"},"需求索引"),e("),同上;目录已不在的 "),l("code",null,"present: false"),e("。1.14 起还包括:用 "),l("code",null,"--track"),e(" 登记、还在对齐中的需求("),l("code",null,"stage"),e(' 为"对齐中",没有 '),l("code",null,"spec.md"),e(" 时 "),l("code",null,"title"),e(" 取自 "),l("code",null,"alignment.md"),e("),以及索引里出现过的项目中没登记的需求")])]),l("tr",null,[l("td",null,[l("code",null,"req api status <需求> [--repo <目录>]")]),l("td",null,'一个需求的详情,见下面的"详情"')]),l("tr",null,[l("td",null,[l("code",null,"req api file <需求> <文件> [--repo <目录>]")]),l("td",null,[l("code",null,"{ featureDir, file, size, truncated, content }"),e(";只能读取功能目录中的文档(见下),最多 512 KB")])]),l("tr",null,[l("td",null,[l("code",null,"req api stats [--since 30d] [--month 2026-10]")]),l("td",null,[l("code",null,"req stats --json"),e(" 的内容,见 "),l("a",{href:"./usage-record"},"使用记录")])]),l("tr",null,[l("td",null,[l("code",null,"req api index [--rebuild <目录>…] [--prune]")]),l("td",null,[e("不带选项:索引的全部条目;"),l("code",null,"--rebuild"),e(":"),l("code",null,"{ scanned, registered, pruned, total }")])]),l("tr",null,[l("td",null,[l("code",null,"req api run <approve|stop|resume|verify|sync|reply|start> <需求> [--repo <目录>] [选项]")]),l("td",null,[l("code",null,"{ command, featureDir, ok, exitCode, message }"),e("。在 "),l("code",null,"--repo"),e("(默认当前目录)中执行与 "),l("code",null,"req <命令> <需求>"),e(" 完全相同的操作;"),l("code",null,"ok"),e(" 为 false 时退出码为 1。"),l("code",null,"start"),e("(1.14):在项目主目录中自动加 "),l("code",null,"--worktree"),e("(上次已建好工作区的接着用),并把进展发回登记时的对话")])]),l("tr",null,[l("td",null,[l("code",null,"req api models")]),l("td",null,[e("1.12 起。"),l("code",null,"{ current, choices, recommended }"),e(":本机配置中现在的 "),l("code",null,"agents"),e(";daemon 上能无人值守运行的选择("),l("code",null,"{ id, label, provider, profile }"),e(",Paseo profile 在前);按推荐的 "),l("code",null,"agents"),e("。连不上 daemon 时报错")])]),l("tr",null,[l("td",null,[l("code",null,"req api config [--repo <目录>] [--machine]")]),l("td",null,[e("1.12 起。"),l("code",null,"{ sources, ignored, error, repo, groups }"),e(":"),l("code",null,"sources"),e(" 是生效的配置文件("),l("code",null,"layer"),e(" 为 "),l("code",null,"machine"),e(" / "),l("code",null,"team"),e(" / "),l("code",null,"project"),e(",按叠加顺序);"),l("code",null,"groups"),e(" 按主题分组,每项 "),l("code",null,"{ key, label, description, display, value, setBy, scope, changed }"),e(":"),l("code",null,"display"),e(" 是用大白话写的值,"),l("code",null,"value"),e(" 中看起来像密钥的值和个人账号替换为 "),l("code",null,"••••"),e(","),l("code",null,"setBy"),e(" 是写了它的文件,"),l("code",null,"changed"),e(" 表示与默认值不同。配置有错误时 "),l("code",null,"error"),e(" 写明原因,值按各文件所写。"),l("code",null,"--machine"),e(" 不看项目配置")])]),l("tr",null,[l("td",null,[l("code",null,"req api set-agents --json <设置>")]),l("td",null,[e("1.12 起。"),l("code",null,"{ ok, message }"),e("。"),l("code",null,"<设置>"),e(" 是 "),l("code",null,"{ builder, reviewer, fallback }"),e("("),l("code",null,"fallback"),e(" 可以为 null),检查后写入本机配置的 "),l("code",null,"agents"),e(",原文件备份")])]),l("tr",null,[l("td",null,[l("code",null,"req api watchdog [--by plugin|factory] [--dry-run]")]),l("td",null,[e("1.13 起。"),l("code",null,"{ checked, resumed, failed, skipped }"),e(':把本机"运行中但后台进程已不在"的需求直接继续('),l("code",null,"req resume"),e(")。每个进程只继续一次,每个需求 24 小时内最多 3 次;"),l("code",null,"--by plugin"),e(" 同时记下插件在检查(流水线据此不再预约对话的定时检查)")])]),l("tr",null,[l("td",null,[l("code",null,"req api review-url <需求> [--repo <目录>] [--read-only] [--page check]")]),l("td",null,[e("1.13 起;"),l("code",null,"--page check"),e("(1.14)给出同一服务上的验收清单页地址(需要 "),l("code",null,"spec.md"),e("),"),l("code",null,"--page code"),e("(1.14)给出代码审查页地址(需要已经写过代码)。"),l("code",null,"{ url, readOnly }"),e(":这个需求的原型审查页地址(需要时在后台启动审查页的服务)。"),l("code",null,"--read-only"),e(" 的地址只能看,不能提交意见或确认方案。需求不在本机的需求索引中或还没有 "),l("code",null,"prototype/"),e(" 时报 "),l("code",null,"not_found")])])])]),l("p",null,[l("code",null,"<需求>"),e(" 的写法与 "),l("code",null,"req status"),e(" 相同:功能目录、目录名或名称中能唯一确定的一部分。需求在为它新建的工作区中开发时,"),l("code",null,"--repo"),e(" 写对话所在的目录或那个工作区都可以。")]),l("p",null,[l("code",null,"req api file"),e(" 能读取的文件:"),l("code",null,"spec.md"),e("、"),l("code",null,"alignment.md"),e("、"),l("code",null,"spec-review.md"),e("、"),l("code",null,"changes.md"),e("、"),l("code",null,"decisions.tsv"),e("、"),l("code",null,"design.md"),e("、"),l("code",null,"design-review.md"),e("、"),l("code",null,"preview.md"),e("、"),l("code",null,"contract.md"),e("、"),l("code",null,"diagnosis.md"),e("、"),l("code",null,"assessment.md"),e("、"),l("code",null,"implementation.md"),e("、"),l("code",null,"progress.md"),e("、"),l("code",null,"code-review.md"),e("、"),l("code",null,"handoff.md"),e("、"),l("code",null,"service-start.md"),e("、"),l("code",null,"verification.md"),e("、"),l("code",null,"report.md"),e("、"),l("code",null,"acceptance.md"),e("、"),l("code",null,"lessons.tsv"),e("。")]),l("h2",{id:"需求-list-的每一项",tabindex:"-1"},[e("需求("),l("code",null,"list"),e(" 的每一项) "),l("a",{class:"header-anchor",href:"#需求-list-的每一项","aria-label":'Permalink to "需求(`list` 的每一项)"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"key")]),l("td",null,"需求在本机的标识(对话所在目录 + 功能目录)")]),l("tr",null,[l("td",null,[l("code",null,"project")]),l("td",null,"项目名:对话所在目录的目录名")]),l("tr",null,[l("td",null,[l("code",null,"repo")]),l("td",null,"需求所在的目录(有自己的工作区时是那个工作区)")]),l("tr",null,[l("td",null,[l("code",null,"sourceRepo"),e(" / "),l("code",null,"workspaceId")]),l("td",null,"有自己的工作区时:对话所在的目录、Paseo 工作区 ID;否则 null")]),l("tr",null,[l("td",null,[l("code",null,"featureDir"),e(" / "),l("code",null,"name"),e(" / "),l("code",null,"title")]),l("td",null,"功能目录、目录名、需求标题")]),l("tr",null,[l("td",null,[l("code",null,"type"),e(" / "),l("code",null,"profile"),e(" / "),l("code",null,"branch")]),l("td",null,[e("需求类型("),l("code",null,"defect"),e("、"),l("code",null,"refactor"),e("、"),l("code",null,"assessment"),e(" 或 null)、档位、分支")])]),l("tr",null,[l("td",null,[l("code",null,"stage")]),l("td",null,[e("与 "),l("code",null,"req list"),e(' 相同的阶段说明,如"开发中""等待确认方案""待验收"')])]),l("tr",null,[l("td",null,[l("code",null,"status")]),l("td",null,[e("状态文件的 "),l("code",null,"status"),e(";还没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"running")]),l("td",null,"后台进程是否在运行")]),l("tr",null,[l("td",null,[l("code",null,"phase")]),l("td",null,[l("code",null,"develop"),e(" / "),l("code",null,"verify")])]),l("tr",null,[l("td",null,[l("code",null,"attention")]),l("td",null,[e("需要人处理的事:"),l("code",null,"approval"),e("(确认方案)、"),l("code",null,"business"),e("(需求方决定)、"),l("code",null,"permission"),e("(1.13,步骤在等权限批准;"),l("code",null,"waiting.questions"),e(" 是要批准的操作,"),l("code",null,"waiting.agentId"),e(" 是那个 agent)、"),l("code",null,"interrupted"),e("(中断,可以继续)、"),l("code",null,"not_completed"),e("(结束但未完成)、"),l("code",null,"not_started"),e("(1.14,需求说明已确认超过 30 分钟、或已为它建好工作区,但流水线没有运行过);没有为 null")])]),l("tr",null,[l("td",null,[l("code",null,"waiting")]),l("td",null,[e("1.12 起。"),l("code",null,"attention"),e(" 不为 null 时:"),l("code",null,"since"),e("(从什么时候开始等)、"),l("code",null,"questions"),e("(需求方要回答的问题)、"),l("code",null,"reason"),e("(停止原因)、"),l("code",null,"card"),e("("),l("code",null,"{ system, id, url, requester }"),e(",从卡片开始的需求)、"),l("code",null,"canReply"),e("(能否用 "),l("code",null,"req api run reply <需求> <回复>"),e(" 把回复转给需求的对话)、"),l("code",null,"canStart"),e("(1.14,"),l("code",null,"not_started"),e(" 时为 true:可以用 "),l("code",null,"req api run start <需求>"),e(" 开始开发);否则为 null")])]),l("tr",null,[l("td",null,[l("code",null,"current")]),l("td",null,[e("正在运行的步骤 "),l("code",null,"[{ key, title, agentId }]")])]),l("tr",null,[l("td",null,[l("code",null,"updatedAt")]),l("td",null,"最近一次变化的时间")]),l("tr",null,[l("td",null,[l("code",null,"usage")]),l("td",null,[l("code",null,"{ steps, agentMinutes, inputTokens, outputTokens, costUsd }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"present")]),l("td",null,"目录是否还在")]),l("tr",null,[l("td",null,[l("code",null,"hasPrototype")]),l("td",null,[e("1.13 起。功能目录中有界面原型("),l("code",null,"prototype/"),e("),可以用原型审查页查看")])])])]),l("h2",{id:"详情-status",tabindex:"-1"},[e("详情("),l("code",null,"status"),e(") "),l("a",{class:"header-anchor",href:"#详情-status","aria-label":'Permalink to "详情(`status`)"'},"")]),l("p",null,'"需求"的全部字段,另加:'),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"files")]),l("td",null,[e("功能目录中存在的、可以用 "),l("code",null,"req api file"),e(" 读取的文件")])]),l("tr",null,[l("td",null,[l("code",null,"run")]),l("td",null,[l("code",null,"{ attempt, startedAt, updatedAt, pid, phaseMode, stopReason, outcome, queuedSince, verifyAt, approval, originAgentId }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"steps")]),l("td",null,[e("每个步骤一项:"),l("code",null,"{ key, stepId, title, phase, attempt, round, agentId, startedAt, endedAt, minutes, outcome, result, error, usage }"),e(";"),l("code",null,"title"),e(' 是给人看的名称(如"代码评审(第 2 轮)"),'),l("code",null,"result"),e(' 是结论的文字(如"需要修改")')])]),l("tr",null,[l("td",null,[l("code",null,"gate")]),l("td",null,[e("质量门:状态文件中的 "),l("code",null,"gate")])]),l("tr",null,[l("td",null,[l("code",null,"estimate")]),l("td",null,[e("1.13 起。"),l("code",null,"{ basis, profile, typicalAgentMinutes, typicalTokens, usedAgentMinutes, usedTokens, leftMinutes, over }"),e(":按本机已完成的同档位需求(至少 3 个)的中位数估算;数据不够或已完成时为 null")])]),l("tr",null,[l("td",null,[l("code",null,"joint")]),l("td",null,[e("联合需求的其他仓库:"),l("code",null,"[{ name, slug, repo, sourceRepo, branch, workspaceId, gate }]")])]),l("tr",null,[l("td",null,[l("code",null,"external")]),l("td",null,[e("外部系统中的卡片(1.9.0 起):"),l("code",null,"[{ name, id, url, status, syncedAt, pending, lastError }]"),e(";"),l("code",null,"pending"),e(" 是等待补发的调用数")])])])])],-1),l("p",{class:"source-note"},[e("本页由仓库中的 "),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/contracts/cli-json.md"},"contracts/cli-json.md"),e(" 生成。"),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/edit/main/contracts/cli-json.md"},"在 GitHub 上编辑")],-1)])])}const g=t(s,[["render",i]]);export{k as __pageData,g as default};
|
|
1
|
+
import{_ as t,o as d,c as u,j as l,a as e}from"./chunks/framework.BetZR81g.js";const k=JSON.parse('{"title":"给程序用的 JSON 输出:req api","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/cli-json.md","filePath":"reference/contracts/cli-json.md","lastUpdated":null}'),s={name:"reference/contracts/cli-json.md"};function i(o,n,a,r,c,p){return d(),u("div",null,[...n[0]||(n[0]=[l("div",null,[l("h1",{id:"给程序用的-json-输出-req-api",tabindex:"-1"},[e("给程序用的 JSON 输出:"),l("code",null,"req api"),e(),l("a",{class:"header-anchor",href:"#给程序用的-json-输出-req-api","aria-label":'Permalink to "给程序用的 JSON 输出:`req api`"'},"")]),l("p",null,[e("1.9.0 起。Paseo 插件和其他程序通过 "),l("code",null,"req api"),e(" 读取需求、执行管理操作,不直接读写状态文件。每个命令输出一行 JSON:")]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"data"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#B31D28","--shiki-light-font-style":"italic","--shiki-dark":"#FDAEB7","--shiki-dark-font-style":"italic"}},"…"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," }")])])])]),l("p",null,"出错时退出码为 1:"),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"error"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"code"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"not_found"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"message"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"没有找到需求……"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")])])])]),l("p",null,[l("code",null,"code"),e(":"),l("code",null,"bad_arguments"),e("(参数不对)、"),l("code",null,"not_found"),e("(目录或需求不存在)、"),l("code",null,"not_allowed"),e("(不允许的文件或命令)、"),l("code",null,"failed"),e("(其他错误)。")]),l("p",null,[l("code",null,"schema"),e(" 只在不兼容的修改时增加;新增字段不改变 "),l("code",null,"schema"),e(",读取方应忽略不认识的字段。")]),l("h2",{id:"命令",tabindex:"-1"},[e("命令 "),l("a",{class:"header-anchor",href:"#命令","aria-label":'Permalink to "命令"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"命令"),l("th",null,[l("code",null,"data")])])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"req api version")]),l("td",null,[l("code",null,"{ kitVersion, kitRoot, apiSchema, paseo, featuresDir }"),e(":"),l("code",null,"paseo"),e(" 是这个版本支持的 Paseo 范围")])]),l("tr",null,[l("td",null,[l("code",null,"req api list [--repo <目录>]")]),l("td",null,'这个仓库所有工作区中的需求,数组,每项见下面的"需求"')]),l("tr",null,[l("td",null,[l("code",null,"req api list --all")]),l("td",null,[e("本机记录过的所有需求("),l("a",{href:"./usage-record"},"需求索引"),e("),同上;目录已不在的 "),l("code",null,"present: false"),e("。1.14 起还包括:用 "),l("code",null,"--track"),e(" 登记、还在对齐中的需求("),l("code",null,"stage"),e(' 为"对齐中",没有 '),l("code",null,"spec.md"),e(" 时 "),l("code",null,"title"),e(" 取自 "),l("code",null,"alignment.md"),e("),以及索引里出现过的项目中没登记的需求")])]),l("tr",null,[l("td",null,[l("code",null,"req api status <需求> [--repo <目录>]")]),l("td",null,'一个需求的详情,见下面的"详情"')]),l("tr",null,[l("td",null,[l("code",null,"req api file <需求> <文件> [--repo <目录>]")]),l("td",null,[l("code",null,"{ featureDir, file, size, truncated, content }"),e(";只能读取功能目录中的文档(见下),最多 512 KB")])]),l("tr",null,[l("td",null,[l("code",null,"req api stats [--since 30d] [--month 2026-10]")]),l("td",null,[l("code",null,"req stats --json"),e(" 的内容,见 "),l("a",{href:"./usage-record"},"使用记录")])]),l("tr",null,[l("td",null,[l("code",null,"req api index [--rebuild <目录>…] [--prune]")]),l("td",null,[e("不带选项:索引的全部条目;"),l("code",null,"--rebuild"),e(":"),l("code",null,"{ scanned, registered, pruned, total }")])]),l("tr",null,[l("td",null,[l("code",null,"req api run <approve|stop|resume|verify|sync|reply|start> <需求> [--repo <目录>] [选项]")]),l("td",null,[l("code",null,"{ command, featureDir, ok, exitCode, message }"),e("。在 "),l("code",null,"--repo"),e("(默认当前目录)中执行与 "),l("code",null,"req <命令> <需求>"),e(" 完全相同的操作;"),l("code",null,"ok"),e(" 为 false 时退出码为 1。"),l("code",null,"start"),e("(1.14):在项目主目录中自动加 "),l("code",null,"--worktree"),e("(上次已建好工作区的接着用),并把进展发回登记时的对话")])]),l("tr",null,[l("td",null,[l("code",null,"req api models")]),l("td",null,[e("1.12 起。"),l("code",null,"{ current, choices, recommended }"),e(":本机配置中现在的 "),l("code",null,"agents"),e(";daemon 上能无人值守运行的选择("),l("code",null,"{ id, label, provider, profile }"),e(",Paseo profile 在前);按推荐的 "),l("code",null,"agents"),e("。连不上 daemon 时报错")])]),l("tr",null,[l("td",null,[l("code",null,"req api config [--repo <目录>] [--machine]")]),l("td",null,[e("1.12 起。"),l("code",null,"{ sources, ignored, error, repo, groups }"),e(":"),l("code",null,"sources"),e(" 是生效的配置文件("),l("code",null,"layer"),e(" 为 "),l("code",null,"machine"),e(" / "),l("code",null,"team"),e(" / "),l("code",null,"project"),e(",按叠加顺序);"),l("code",null,"groups"),e(" 按主题分组,每项 "),l("code",null,"{ key, label, description, display, value, setBy, scope, changed }"),e(":"),l("code",null,"display"),e(" 是用大白话写的值,"),l("code",null,"value"),e(" 中看起来像密钥的值和个人账号替换为 "),l("code",null,"••••"),e(","),l("code",null,"setBy"),e(" 是写了它的文件,"),l("code",null,"changed"),e(" 表示与默认值不同。配置有错误时 "),l("code",null,"error"),e(" 写明原因,值按各文件所写。"),l("code",null,"--machine"),e(" 不看项目配置")])]),l("tr",null,[l("td",null,[l("code",null,"req api set-agents --json <设置>")]),l("td",null,[e("1.12 起。"),l("code",null,"{ ok, message }"),e("。"),l("code",null,"<设置>"),e(" 是 "),l("code",null,"{ builder, reviewer, fallback }"),e("("),l("code",null,"fallback"),e(" 可以为 null),检查后写入本机配置的 "),l("code",null,"agents"),e(",原文件备份")])]),l("tr",null,[l("td",null,[l("code",null,"req api watchdog [--by plugin|factory] [--dry-run]")]),l("td",null,[e("1.13 起。"),l("code",null,"{ checked, resumed, failed, skipped }"),e(':把本机"运行中但后台进程已不在"的需求直接继续('),l("code",null,"req resume"),e(")。每个进程只继续一次,每个需求 24 小时内最多 3 次;"),l("code",null,"--by plugin"),e(" 同时记下插件在检查(流水线据此不再预约对话的定时检查)")])]),l("tr",null,[l("td",null,[l("code",null,"req api review-url <需求> [--repo <目录>] [--read-only] [--page check]")]),l("td",null,[e("1.13 起;"),l("code",null,"--page check"),e("(1.14)给出同一服务上的验收清单页地址(需要 "),l("code",null,"spec.md"),e("),"),l("code",null,"--page code"),e("(1.14)给出代码审查页地址(需要已经写过代码)。"),l("code",null,"{ url, readOnly }"),e(":这个需求的原型审查页地址(需要时在后台启动审查页的服务)。"),l("code",null,"--read-only"),e(" 的地址只能看,不能提交意见或确认方案。需求不在本机的需求索引中或还没有 "),l("code",null,"prototype/"),e(" 时报 "),l("code",null,"not_found")])])])]),l("p",null,[l("code",null,"<需求>"),e(" 的写法与 "),l("code",null,"req status"),e(" 相同:功能目录、目录名或名称中能唯一确定的一部分。需求在为它新建的工作区中开发时,"),l("code",null,"--repo"),e(" 写对话所在的目录或那个工作区都可以。")]),l("p",null,[l("code",null,"req api file"),e(" 能读取的文件:"),l("code",null,"spec.md"),e("、"),l("code",null,"alignment.md"),e("、"),l("code",null,"spec-review.md"),e("、"),l("code",null,"changes.md"),e("、"),l("code",null,"decisions.tsv"),e("、"),l("code",null,"design.md"),e("、"),l("code",null,"design-review.md"),e("、"),l("code",null,"preview.md"),e("、"),l("code",null,"contract.md"),e("、"),l("code",null,"diagnosis.md"),e("、"),l("code",null,"assessment.md"),e("、"),l("code",null,"implementation.md"),e("、"),l("code",null,"progress.md"),e("、"),l("code",null,"code-review.md"),e("、"),l("code",null,"handoff.md"),e("、"),l("code",null,"service-start.md"),e("、"),l("code",null,"verification.md"),e("、"),l("code",null,"report.md"),e("、"),l("code",null,"acceptance.md"),e("、"),l("code",null,"lessons.tsv"),e("。")]),l("h2",{id:"需求-list-的每一项",tabindex:"-1"},[e("需求("),l("code",null,"list"),e(" 的每一项) "),l("a",{class:"header-anchor",href:"#需求-list-的每一项","aria-label":'Permalink to "需求(`list` 的每一项)"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"key")]),l("td",null,"需求在本机的标识(对话所在目录 + 功能目录)")]),l("tr",null,[l("td",null,[l("code",null,"project")]),l("td",null,"项目名:对话所在目录的目录名")]),l("tr",null,[l("td",null,[l("code",null,"repo")]),l("td",null,"需求所在的目录(有自己的工作区时是那个工作区)")]),l("tr",null,[l("td",null,[l("code",null,"sourceRepo"),e(" / "),l("code",null,"workspaceId")]),l("td",null,"有自己的工作区时:对话所在的目录、Paseo 工作区 ID;否则 null")]),l("tr",null,[l("td",null,[l("code",null,"featureDir"),e(" / "),l("code",null,"name"),e(" / "),l("code",null,"title")]),l("td",null,"功能目录、目录名、需求标题")]),l("tr",null,[l("td",null,[l("code",null,"type"),e(" / "),l("code",null,"profile"),e(" / "),l("code",null,"branch")]),l("td",null,[e("需求类型("),l("code",null,"defect"),e("、"),l("code",null,"refactor"),e("、"),l("code",null,"assessment"),e(" 或 null)、档位、分支")])]),l("tr",null,[l("td",null,[l("code",null,"stage")]),l("td",null,[e("与 "),l("code",null,"req list"),e(' 相同的阶段说明,如"开发中""等待确认方案""待验收"')])]),l("tr",null,[l("td",null,[l("code",null,"status")]),l("td",null,[e("状态文件的 "),l("code",null,"status"),e(";还没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"running")]),l("td",null,"后台进程是否在运行")]),l("tr",null,[l("td",null,[l("code",null,"phase")]),l("td",null,[l("code",null,"develop"),e(" / "),l("code",null,"verify")])]),l("tr",null,[l("td",null,[l("code",null,"attention")]),l("td",null,[e("需要人处理的事:"),l("code",null,"approval"),e("(确认方案)、"),l("code",null,"business"),e("(需求方决定)、"),l("code",null,"permission"),e("(1.13,步骤在等权限批准;"),l("code",null,"waiting.questions"),e(" 是要批准的操作,"),l("code",null,"waiting.agentId"),e(" 是那个 agent)、"),l("code",null,"interrupted"),e("(中断,可以继续)、"),l("code",null,"not_completed"),e("(结束但未完成)、"),l("code",null,"not_started"),e("(1.14,需求说明已确认超过 30 分钟、或已为它建好工作区,但流水线没有运行过);没有为 null")])]),l("tr",null,[l("td",null,[l("code",null,"waiting")]),l("td",null,[e("1.12 起。"),l("code",null,"attention"),e(" 不为 null 时:"),l("code",null,"since"),e("(从什么时候开始等)、"),l("code",null,"questions"),e("(需求方要回答的问题)、"),l("code",null,"reason"),e("(停止原因)、"),l("code",null,"card"),e("("),l("code",null,"{ system, id, url, requester }"),e(",从卡片开始的需求)、"),l("code",null,"canReply"),e("(能否用 "),l("code",null,"req api run reply <需求> <回复>"),e(" 把回复转给需求的对话)、"),l("code",null,"canStart"),e("(1.14,"),l("code",null,"not_started"),e(" 时为 true:可以用 "),l("code",null,"req api run start <需求>"),e(" 开始开发);否则为 null")])]),l("tr",null,[l("td",null,[l("code",null,"current")]),l("td",null,[e("正在运行的步骤 "),l("code",null,"[{ key, title, agentId }]")])]),l("tr",null,[l("td",null,[l("code",null,"updatedAt")]),l("td",null,"最近一次变化的时间")]),l("tr",null,[l("td",null,[l("code",null,"usage")]),l("td",null,[l("code",null,"{ steps, agentMinutes, inputTokens, outputTokens, costUsd }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"present")]),l("td",null,"目录是否还在")]),l("tr",null,[l("td",null,[l("code",null,"hasPrototype")]),l("td",null,[e("1.13 起。功能目录中有界面原型("),l("code",null,"prototype/"),e("),可以用原型审查页查看")])])])]),l("h2",{id:"详情-status",tabindex:"-1"},[e("详情("),l("code",null,"status"),e(") "),l("a",{class:"header-anchor",href:"#详情-status","aria-label":'Permalink to "详情(`status`)"'},"")]),l("p",null,'"需求"的全部字段,另加:'),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"files")]),l("td",null,[e("功能目录中存在的、可以用 "),l("code",null,"req api file"),e(" 读取的文件")])]),l("tr",null,[l("td",null,[l("code",null,"run")]),l("td",null,[l("code",null,"{ attempt, startedAt, updatedAt, pid, phaseMode, stopReason, outcome, queuedSince, verifyAt, approval, originAgentId }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"steps")]),l("td",null,[e("每个步骤一项:"),l("code",null,"{ key, stepId, title, phase, attempt, round, agentId, startedAt, endedAt, minutes, outcome, result, error, usage }"),e(";"),l("code",null,"title"),e(' 是给人看的名称(如"代码评审(第 2 轮)"),'),l("code",null,"result"),e(' 是结论的文字(如"需要修改")')])]),l("tr",null,[l("td",null,[l("code",null,"gate")]),l("td",null,[e("质量门:状态文件中的 "),l("code",null,"gate")])]),l("tr",null,[l("td",null,[l("code",null,"estimate")]),l("td",null,[e("1.13 起。"),l("code",null,"{ basis, profile, typicalAgentMinutes, typicalTokens, usedAgentMinutes, usedTokens, leftMinutes, over }"),e(":按本机已完成的同档位需求(至少 3 个)的中位数估算;数据不够或已完成时为 null")])]),l("tr",null,[l("td",null,[l("code",null,"joint")]),l("td",null,[e("联合需求的其他仓库:"),l("code",null,"[{ name, slug, repo, sourceRepo, branch, workspaceId, gate }]")])]),l("tr",null,[l("td",null,[l("code",null,"external")]),l("td",null,[e("外部系统中的卡片(1.9.0 起):"),l("code",null,"[{ name, id, url, status, syncedAt, pending, lastError }]"),e(";"),l("code",null,"pending"),e(" 是等待补发的调用数")])])])])],-1),l("p",{class:"source-note"},[e("本页由仓库中的 "),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/contracts/cli-json.md"},"contracts/cli-json.md"),e(" 生成。"),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/edit/main/contracts/cli-json.md"},"在 GitHub 上编辑")],-1)])])}const g=t(s,[["render",i]]);export{k as __pageData,g as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,o as d,c as u,j as l,a as e}from"./chunks/framework.B9qR_F1m.js";const k=JSON.parse('{"title":"给程序用的 JSON 输出:req api","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/cli-json.md","filePath":"reference/contracts/cli-json.md","lastUpdated":null}'),s={name:"reference/contracts/cli-json.md"};function i(o,n,a,r,c,p){return d(),u("div",null,[...n[0]||(n[0]=[l("div",null,[l("h1",{id:"给程序用的-json-输出-req-api",tabindex:"-1"},[e("给程序用的 JSON 输出:"),l("code",null,"req api"),e(),l("a",{class:"header-anchor",href:"#给程序用的-json-输出-req-api","aria-label":'Permalink to "给程序用的 JSON 输出:`req api`"'},"")]),l("p",null,[e("1.9.0 起。Paseo 插件和其他程序通过 "),l("code",null,"req api"),e(" 读取需求、执行管理操作,不直接读写状态文件。每个命令输出一行 JSON:")]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"data"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#B31D28","--shiki-light-font-style":"italic","--shiki-dark":"#FDAEB7","--shiki-dark-font-style":"italic"}},"…"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," }")])])])]),l("p",null,"出错时退出码为 1:"),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"error"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"code"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"not_found"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"message"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"没有找到需求……"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")])])])]),l("p",null,[l("code",null,"code"),e(":"),l("code",null,"bad_arguments"),e("(参数不对)、"),l("code",null,"not_found"),e("(目录或需求不存在)、"),l("code",null,"not_allowed"),e("(不允许的文件或命令)、"),l("code",null,"failed"),e("(其他错误)。")]),l("p",null,[l("code",null,"schema"),e(" 只在不兼容的修改时增加;新增字段不改变 "),l("code",null,"schema"),e(",读取方应忽略不认识的字段。")]),l("h2",{id:"命令",tabindex:"-1"},[e("命令 "),l("a",{class:"header-anchor",href:"#命令","aria-label":'Permalink to "命令"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"命令"),l("th",null,[l("code",null,"data")])])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"req api version")]),l("td",null,[l("code",null,"{ kitVersion, kitRoot, apiSchema, paseo, featuresDir }"),e(":"),l("code",null,"paseo"),e(" 是这个版本支持的 Paseo 范围")])]),l("tr",null,[l("td",null,[l("code",null,"req api list [--repo <目录>]")]),l("td",null,'这个仓库所有工作区中的需求,数组,每项见下面的"需求"')]),l("tr",null,[l("td",null,[l("code",null,"req api list --all")]),l("td",null,[e("本机记录过的所有需求("),l("a",{href:"./usage-record"},"需求索引"),e("),同上;目录已不在的 "),l("code",null,"present: false"),e("。1.14 起还包括:用 "),l("code",null,"--track"),e(" 登记、还在对齐中的需求("),l("code",null,"stage"),e(' 为"对齐中",没有 '),l("code",null,"spec.md"),e(" 时 "),l("code",null,"title"),e(" 取自 "),l("code",null,"alignment.md"),e("),以及索引里出现过的项目中没登记的需求")])]),l("tr",null,[l("td",null,[l("code",null,"req api status <需求> [--repo <目录>]")]),l("td",null,'一个需求的详情,见下面的"详情"')]),l("tr",null,[l("td",null,[l("code",null,"req api file <需求> <文件> [--repo <目录>]")]),l("td",null,[l("code",null,"{ featureDir, file, size, truncated, content }"),e(";只能读取功能目录中的文档(见下),最多 512 KB")])]),l("tr",null,[l("td",null,[l("code",null,"req api stats [--since 30d] [--month 2026-10]")]),l("td",null,[l("code",null,"req stats --json"),e(" 的内容,见 "),l("a",{href:"./usage-record"},"使用记录")])]),l("tr",null,[l("td",null,[l("code",null,"req api index [--rebuild <目录>…] [--prune]")]),l("td",null,[e("不带选项:索引的全部条目;"),l("code",null,"--rebuild"),e(":"),l("code",null,"{ scanned, registered, pruned, total }")])]),l("tr",null,[l("td",null,[l("code",null,"req api run <approve|stop|resume|verify|sync|reply|start> <需求> [--repo <目录>] [选项]")]),l("td",null,[l("code",null,"{ command, featureDir, ok, exitCode, message }"),e("。在 "),l("code",null,"--repo"),e("(默认当前目录)中执行与 "),l("code",null,"req <命令> <需求>"),e(" 完全相同的操作;"),l("code",null,"ok"),e(" 为 false 时退出码为 1。"),l("code",null,"start"),e("(1.14):在项目主目录中自动加 "),l("code",null,"--worktree"),e("(上次已建好工作区的接着用),并把进展发回登记时的对话")])]),l("tr",null,[l("td",null,[l("code",null,"req api models")]),l("td",null,[e("1.12 起。"),l("code",null,"{ current, choices, recommended }"),e(":本机配置中现在的 "),l("code",null,"agents"),e(";daemon 上能无人值守运行的选择("),l("code",null,"{ id, label, provider, profile }"),e(",Paseo profile 在前);按推荐的 "),l("code",null,"agents"),e("。连不上 daemon 时报错")])]),l("tr",null,[l("td",null,[l("code",null,"req api config [--repo <目录>] [--machine]")]),l("td",null,[e("1.12 起。"),l("code",null,"{ sources, ignored, error, repo, groups }"),e(":"),l("code",null,"sources"),e(" 是生效的配置文件("),l("code",null,"layer"),e(" 为 "),l("code",null,"machine"),e(" / "),l("code",null,"team"),e(" / "),l("code",null,"project"),e(",按叠加顺序);"),l("code",null,"groups"),e(" 按主题分组,每项 "),l("code",null,"{ key, label, description, display, value, setBy, scope, changed }"),e(":"),l("code",null,"display"),e(" 是用大白话写的值,"),l("code",null,"value"),e(" 中看起来像密钥的值和个人账号替换为 "),l("code",null,"••••"),e(","),l("code",null,"setBy"),e(" 是写了它的文件,"),l("code",null,"changed"),e(" 表示与默认值不同。配置有错误时 "),l("code",null,"error"),e(" 写明原因,值按各文件所写。"),l("code",null,"--machine"),e(" 不看项目配置")])]),l("tr",null,[l("td",null,[l("code",null,"req api set-agents --json <设置>")]),l("td",null,[e("1.12 起。"),l("code",null,"{ ok, message }"),e("。"),l("code",null,"<设置>"),e(" 是 "),l("code",null,"{ builder, reviewer, fallback }"),e("("),l("code",null,"fallback"),e(" 可以为 null),检查后写入本机配置的 "),l("code",null,"agents"),e(",原文件备份")])]),l("tr",null,[l("td",null,[l("code",null,"req api watchdog [--by plugin|factory] [--dry-run]")]),l("td",null,[e("1.13 起。"),l("code",null,"{ checked, resumed, failed, skipped }"),e(':把本机"运行中但后台进程已不在"的需求直接继续('),l("code",null,"req resume"),e(")。每个进程只继续一次,每个需求 24 小时内最多 3 次;"),l("code",null,"--by plugin"),e(" 同时记下插件在检查(流水线据此不再预约对话的定时检查)")])]),l("tr",null,[l("td",null,[l("code",null,"req api review-url <需求> [--repo <目录>] [--read-only] [--page check]")]),l("td",null,[e("1.13 起;"),l("code",null,"--page check"),e("(1.14)给出同一服务上的验收清单页地址(需要 "),l("code",null,"spec.md"),e("),"),l("code",null,"--page code"),e("(1.14)给出代码审查页地址(需要已经写过代码)。"),l("code",null,"{ url, readOnly }"),e(":这个需求的原型审查页地址(需要时在后台启动审查页的服务)。"),l("code",null,"--read-only"),e(" 的地址只能看,不能提交意见或确认方案。需求不在本机的需求索引中或还没有 "),l("code",null,"prototype/"),e(" 时报 "),l("code",null,"not_found")])])])]),l("p",null,[l("code",null,"<需求>"),e(" 的写法与 "),l("code",null,"req status"),e(" 相同:功能目录、目录名或名称中能唯一确定的一部分。需求在为它新建的工作区中开发时,"),l("code",null,"--repo"),e(" 写对话所在的目录或那个工作区都可以。")]),l("p",null,[l("code",null,"req api file"),e(" 能读取的文件:"),l("code",null,"spec.md"),e("、"),l("code",null,"alignment.md"),e("、"),l("code",null,"spec-review.md"),e("、"),l("code",null,"changes.md"),e("、"),l("code",null,"decisions.tsv"),e("、"),l("code",null,"design.md"),e("、"),l("code",null,"design-review.md"),e("、"),l("code",null,"preview.md"),e("、"),l("code",null,"contract.md"),e("、"),l("code",null,"diagnosis.md"),e("、"),l("code",null,"assessment.md"),e("、"),l("code",null,"implementation.md"),e("、"),l("code",null,"progress.md"),e("、"),l("code",null,"code-review.md"),e("、"),l("code",null,"handoff.md"),e("、"),l("code",null,"service-start.md"),e("、"),l("code",null,"verification.md"),e("、"),l("code",null,"report.md"),e("、"),l("code",null,"acceptance.md"),e("、"),l("code",null,"lessons.tsv"),e("。")]),l("h2",{id:"需求-list-的每一项",tabindex:"-1"},[e("需求("),l("code",null,"list"),e(" 的每一项) "),l("a",{class:"header-anchor",href:"#需求-list-的每一项","aria-label":'Permalink to "需求(`list` 的每一项)"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"key")]),l("td",null,"需求在本机的标识(对话所在目录 + 功能目录)")]),l("tr",null,[l("td",null,[l("code",null,"project")]),l("td",null,"项目名:对话所在目录的目录名")]),l("tr",null,[l("td",null,[l("code",null,"repo")]),l("td",null,"需求所在的目录(有自己的工作区时是那个工作区)")]),l("tr",null,[l("td",null,[l("code",null,"sourceRepo"),e(" / "),l("code",null,"workspaceId")]),l("td",null,"有自己的工作区时:对话所在的目录、Paseo 工作区 ID;否则 null")]),l("tr",null,[l("td",null,[l("code",null,"featureDir"),e(" / "),l("code",null,"name"),e(" / "),l("code",null,"title")]),l("td",null,"功能目录、目录名、需求标题")]),l("tr",null,[l("td",null,[l("code",null,"type"),e(" / "),l("code",null,"profile"),e(" / "),l("code",null,"branch")]),l("td",null,[e("需求类型("),l("code",null,"defect"),e("、"),l("code",null,"refactor"),e("、"),l("code",null,"assessment"),e(" 或 null)、档位、分支")])]),l("tr",null,[l("td",null,[l("code",null,"stage")]),l("td",null,[e("与 "),l("code",null,"req list"),e(' 相同的阶段说明,如"开发中""等待确认方案""待验收"')])]),l("tr",null,[l("td",null,[l("code",null,"status")]),l("td",null,[e("状态文件的 "),l("code",null,"status"),e(";还没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"running")]),l("td",null,"后台进程是否在运行")]),l("tr",null,[l("td",null,[l("code",null,"phase")]),l("td",null,[l("code",null,"develop"),e(" / "),l("code",null,"verify")])]),l("tr",null,[l("td",null,[l("code",null,"attention")]),l("td",null,[e("需要人处理的事:"),l("code",null,"approval"),e("(确认方案)、"),l("code",null,"business"),e("(需求方决定)、"),l("code",null,"permission"),e("(1.13,步骤在等权限批准;"),l("code",null,"waiting.questions"),e(" 是要批准的操作,"),l("code",null,"waiting.agentId"),e(" 是那个 agent)、"),l("code",null,"interrupted"),e("(中断,可以继续)、"),l("code",null,"not_completed"),e("(结束但未完成)、"),l("code",null,"not_started"),e("(1.14,需求说明已确认超过 30 分钟、或已为它建好工作区,但流水线没有运行过);没有为 null")])]),l("tr",null,[l("td",null,[l("code",null,"waiting")]),l("td",null,[e("1.12 起。"),l("code",null,"attention"),e(" 不为 null 时:"),l("code",null,"since"),e("(从什么时候开始等)、"),l("code",null,"questions"),e("(需求方要回答的问题)、"),l("code",null,"reason"),e("(停止原因)、"),l("code",null,"card"),e("("),l("code",null,"{ system, id, url, requester }"),e(",从卡片开始的需求)、"),l("code",null,"canReply"),e("(能否用 "),l("code",null,"req api run reply <需求> <回复>"),e(" 把回复转给需求的对话)、"),l("code",null,"canStart"),e("(1.14,"),l("code",null,"not_started"),e(" 时为 true:可以用 "),l("code",null,"req api run start <需求>"),e(" 开始开发);否则为 null")])]),l("tr",null,[l("td",null,[l("code",null,"current")]),l("td",null,[e("正在运行的步骤 "),l("code",null,"[{ key, title, agentId }]")])]),l("tr",null,[l("td",null,[l("code",null,"updatedAt")]),l("td",null,"最近一次变化的时间")]),l("tr",null,[l("td",null,[l("code",null,"usage")]),l("td",null,[l("code",null,"{ steps, agentMinutes, inputTokens, outputTokens, costUsd }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"present")]),l("td",null,"目录是否还在")]),l("tr",null,[l("td",null,[l("code",null,"hasPrototype")]),l("td",null,[e("1.13 起。功能目录中有界面原型("),l("code",null,"prototype/"),e("),可以用原型审查页查看")])])])]),l("h2",{id:"详情-status",tabindex:"-1"},[e("详情("),l("code",null,"status"),e(") "),l("a",{class:"header-anchor",href:"#详情-status","aria-label":'Permalink to "详情(`status`)"'},"")]),l("p",null,'"需求"的全部字段,另加:'),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"files")]),l("td",null,[e("功能目录中存在的、可以用 "),l("code",null,"req api file"),e(" 读取的文件")])]),l("tr",null,[l("td",null,[l("code",null,"run")]),l("td",null,[l("code",null,"{ attempt, startedAt, updatedAt, pid, phaseMode, stopReason, outcome, queuedSince, verifyAt, approval, originAgentId }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"steps")]),l("td",null,[e("每个步骤一项:"),l("code",null,"{ key, stepId, title, phase, attempt, round, agentId, startedAt, endedAt, minutes, outcome, result, error, usage }"),e(";"),l("code",null,"title"),e(' 是给人看的名称(如"代码评审(第 2 轮)"),'),l("code",null,"result"),e(' 是结论的文字(如"需要修改")')])]),l("tr",null,[l("td",null,[l("code",null,"gate")]),l("td",null,[e("质量门:状态文件中的 "),l("code",null,"gate")])]),l("tr",null,[l("td",null,[l("code",null,"estimate")]),l("td",null,[e("1.13 起。"),l("code",null,"{ basis, profile, typicalAgentMinutes, typicalTokens, usedAgentMinutes, usedTokens, leftMinutes, over }"),e(":按本机已完成的同档位需求(至少 3 个)的中位数估算;数据不够或已完成时为 null")])]),l("tr",null,[l("td",null,[l("code",null,"joint")]),l("td",null,[e("联合需求的其他仓库:"),l("code",null,"[{ name, slug, repo, sourceRepo, branch, workspaceId, gate }]")])]),l("tr",null,[l("td",null,[l("code",null,"external")]),l("td",null,[e("外部系统中的卡片(1.9.0 起):"),l("code",null,"[{ name, id, url, status, syncedAt, pending, lastError }]"),e(";"),l("code",null,"pending"),e(" 是等待补发的调用数")])])])])],-1),l("p",{class:"source-note"},[e("本页由仓库中的 "),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/contracts/cli-json.md"},"contracts/cli-json.md"),e(" 生成。"),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/edit/main/contracts/cli-json.md"},"在 GitHub 上编辑")],-1)])])}const g=t(s,[["render",i]]);export{k as __pageData,g as default};
|
|
1
|
+
import{_ as t,o as d,c as u,j as l,a as e}from"./chunks/framework.BetZR81g.js";const k=JSON.parse('{"title":"给程序用的 JSON 输出:req api","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/cli-json.md","filePath":"reference/contracts/cli-json.md","lastUpdated":null}'),s={name:"reference/contracts/cli-json.md"};function i(o,n,a,r,c,p){return d(),u("div",null,[...n[0]||(n[0]=[l("div",null,[l("h1",{id:"给程序用的-json-输出-req-api",tabindex:"-1"},[e("给程序用的 JSON 输出:"),l("code",null,"req api"),e(),l("a",{class:"header-anchor",href:"#给程序用的-json-输出-req-api","aria-label":'Permalink to "给程序用的 JSON 输出:`req api`"'},"")]),l("p",null,[e("1.9.0 起。Paseo 插件和其他程序通过 "),l("code",null,"req api"),e(" 读取需求、执行管理操作,不直接读写状态文件。每个命令输出一行 JSON:")]),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"data"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#B31D28","--shiki-light-font-style":"italic","--shiki-dark":"#FDAEB7","--shiki-dark-font-style":"italic"}},"…"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," }")])])])]),l("p",null,"出错时退出码为 1:"),l("div",{class:"language-json vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"json"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"{ "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"schema"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"1"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"kitVersion"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"1.9.0"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"error"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": { "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"code"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"not_found"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),l("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},'"message"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),l("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"没有找到需求……"'),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," } }")])])])]),l("p",null,[l("code",null,"code"),e(":"),l("code",null,"bad_arguments"),e("(参数不对)、"),l("code",null,"not_found"),e("(目录或需求不存在)、"),l("code",null,"not_allowed"),e("(不允许的文件或命令)、"),l("code",null,"failed"),e("(其他错误)。")]),l("p",null,[l("code",null,"schema"),e(" 只在不兼容的修改时增加;新增字段不改变 "),l("code",null,"schema"),e(",读取方应忽略不认识的字段。")]),l("h2",{id:"命令",tabindex:"-1"},[e("命令 "),l("a",{class:"header-anchor",href:"#命令","aria-label":'Permalink to "命令"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"命令"),l("th",null,[l("code",null,"data")])])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"req api version")]),l("td",null,[l("code",null,"{ kitVersion, kitRoot, apiSchema, paseo, featuresDir }"),e(":"),l("code",null,"paseo"),e(" 是这个版本支持的 Paseo 范围")])]),l("tr",null,[l("td",null,[l("code",null,"req api list [--repo <目录>]")]),l("td",null,'这个仓库所有工作区中的需求,数组,每项见下面的"需求"')]),l("tr",null,[l("td",null,[l("code",null,"req api list --all")]),l("td",null,[e("本机记录过的所有需求("),l("a",{href:"./usage-record"},"需求索引"),e("),同上;目录已不在的 "),l("code",null,"present: false"),e("。1.14 起还包括:用 "),l("code",null,"--track"),e(" 登记、还在对齐中的需求("),l("code",null,"stage"),e(' 为"对齐中",没有 '),l("code",null,"spec.md"),e(" 时 "),l("code",null,"title"),e(" 取自 "),l("code",null,"alignment.md"),e("),以及索引里出现过的项目中没登记的需求")])]),l("tr",null,[l("td",null,[l("code",null,"req api status <需求> [--repo <目录>]")]),l("td",null,'一个需求的详情,见下面的"详情"')]),l("tr",null,[l("td",null,[l("code",null,"req api file <需求> <文件> [--repo <目录>]")]),l("td",null,[l("code",null,"{ featureDir, file, size, truncated, content }"),e(";只能读取功能目录中的文档(见下),最多 512 KB")])]),l("tr",null,[l("td",null,[l("code",null,"req api stats [--since 30d] [--month 2026-10]")]),l("td",null,[l("code",null,"req stats --json"),e(" 的内容,见 "),l("a",{href:"./usage-record"},"使用记录")])]),l("tr",null,[l("td",null,[l("code",null,"req api index [--rebuild <目录>…] [--prune]")]),l("td",null,[e("不带选项:索引的全部条目;"),l("code",null,"--rebuild"),e(":"),l("code",null,"{ scanned, registered, pruned, total }")])]),l("tr",null,[l("td",null,[l("code",null,"req api run <approve|stop|resume|verify|sync|reply|start> <需求> [--repo <目录>] [选项]")]),l("td",null,[l("code",null,"{ command, featureDir, ok, exitCode, message }"),e("。在 "),l("code",null,"--repo"),e("(默认当前目录)中执行与 "),l("code",null,"req <命令> <需求>"),e(" 完全相同的操作;"),l("code",null,"ok"),e(" 为 false 时退出码为 1。"),l("code",null,"start"),e("(1.14):在项目主目录中自动加 "),l("code",null,"--worktree"),e("(上次已建好工作区的接着用),并把进展发回登记时的对话")])]),l("tr",null,[l("td",null,[l("code",null,"req api models")]),l("td",null,[e("1.12 起。"),l("code",null,"{ current, choices, recommended }"),e(":本机配置中现在的 "),l("code",null,"agents"),e(";daemon 上能无人值守运行的选择("),l("code",null,"{ id, label, provider, profile }"),e(",Paseo profile 在前);按推荐的 "),l("code",null,"agents"),e("。连不上 daemon 时报错")])]),l("tr",null,[l("td",null,[l("code",null,"req api config [--repo <目录>] [--machine]")]),l("td",null,[e("1.12 起。"),l("code",null,"{ sources, ignored, error, repo, groups }"),e(":"),l("code",null,"sources"),e(" 是生效的配置文件("),l("code",null,"layer"),e(" 为 "),l("code",null,"machine"),e(" / "),l("code",null,"team"),e(" / "),l("code",null,"project"),e(",按叠加顺序);"),l("code",null,"groups"),e(" 按主题分组,每项 "),l("code",null,"{ key, label, description, display, value, setBy, scope, changed }"),e(":"),l("code",null,"display"),e(" 是用大白话写的值,"),l("code",null,"value"),e(" 中看起来像密钥的值和个人账号替换为 "),l("code",null,"••••"),e(","),l("code",null,"setBy"),e(" 是写了它的文件,"),l("code",null,"changed"),e(" 表示与默认值不同。配置有错误时 "),l("code",null,"error"),e(" 写明原因,值按各文件所写。"),l("code",null,"--machine"),e(" 不看项目配置")])]),l("tr",null,[l("td",null,[l("code",null,"req api set-agents --json <设置>")]),l("td",null,[e("1.12 起。"),l("code",null,"{ ok, message }"),e("。"),l("code",null,"<设置>"),e(" 是 "),l("code",null,"{ builder, reviewer, fallback }"),e("("),l("code",null,"fallback"),e(" 可以为 null),检查后写入本机配置的 "),l("code",null,"agents"),e(",原文件备份")])]),l("tr",null,[l("td",null,[l("code",null,"req api watchdog [--by plugin|factory] [--dry-run]")]),l("td",null,[e("1.13 起。"),l("code",null,"{ checked, resumed, failed, skipped }"),e(':把本机"运行中但后台进程已不在"的需求直接继续('),l("code",null,"req resume"),e(")。每个进程只继续一次,每个需求 24 小时内最多 3 次;"),l("code",null,"--by plugin"),e(" 同时记下插件在检查(流水线据此不再预约对话的定时检查)")])]),l("tr",null,[l("td",null,[l("code",null,"req api review-url <需求> [--repo <目录>] [--read-only] [--page check]")]),l("td",null,[e("1.13 起;"),l("code",null,"--page check"),e("(1.14)给出同一服务上的验收清单页地址(需要 "),l("code",null,"spec.md"),e("),"),l("code",null,"--page code"),e("(1.14)给出代码审查页地址(需要已经写过代码)。"),l("code",null,"{ url, readOnly }"),e(":这个需求的原型审查页地址(需要时在后台启动审查页的服务)。"),l("code",null,"--read-only"),e(" 的地址只能看,不能提交意见或确认方案。需求不在本机的需求索引中或还没有 "),l("code",null,"prototype/"),e(" 时报 "),l("code",null,"not_found")])])])]),l("p",null,[l("code",null,"<需求>"),e(" 的写法与 "),l("code",null,"req status"),e(" 相同:功能目录、目录名或名称中能唯一确定的一部分。需求在为它新建的工作区中开发时,"),l("code",null,"--repo"),e(" 写对话所在的目录或那个工作区都可以。")]),l("p",null,[l("code",null,"req api file"),e(" 能读取的文件:"),l("code",null,"spec.md"),e("、"),l("code",null,"alignment.md"),e("、"),l("code",null,"spec-review.md"),e("、"),l("code",null,"changes.md"),e("、"),l("code",null,"decisions.tsv"),e("、"),l("code",null,"design.md"),e("、"),l("code",null,"design-review.md"),e("、"),l("code",null,"preview.md"),e("、"),l("code",null,"contract.md"),e("、"),l("code",null,"diagnosis.md"),e("、"),l("code",null,"assessment.md"),e("、"),l("code",null,"implementation.md"),e("、"),l("code",null,"progress.md"),e("、"),l("code",null,"code-review.md"),e("、"),l("code",null,"handoff.md"),e("、"),l("code",null,"service-start.md"),e("、"),l("code",null,"verification.md"),e("、"),l("code",null,"report.md"),e("、"),l("code",null,"acceptance.md"),e("、"),l("code",null,"lessons.tsv"),e("。")]),l("h2",{id:"需求-list-的每一项",tabindex:"-1"},[e("需求("),l("code",null,"list"),e(" 的每一项) "),l("a",{class:"header-anchor",href:"#需求-list-的每一项","aria-label":'Permalink to "需求(`list` 的每一项)"'},"")]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"key")]),l("td",null,"需求在本机的标识(对话所在目录 + 功能目录)")]),l("tr",null,[l("td",null,[l("code",null,"project")]),l("td",null,"项目名:对话所在目录的目录名")]),l("tr",null,[l("td",null,[l("code",null,"repo")]),l("td",null,"需求所在的目录(有自己的工作区时是那个工作区)")]),l("tr",null,[l("td",null,[l("code",null,"sourceRepo"),e(" / "),l("code",null,"workspaceId")]),l("td",null,"有自己的工作区时:对话所在的目录、Paseo 工作区 ID;否则 null")]),l("tr",null,[l("td",null,[l("code",null,"featureDir"),e(" / "),l("code",null,"name"),e(" / "),l("code",null,"title")]),l("td",null,"功能目录、目录名、需求标题")]),l("tr",null,[l("td",null,[l("code",null,"type"),e(" / "),l("code",null,"profile"),e(" / "),l("code",null,"branch")]),l("td",null,[e("需求类型("),l("code",null,"defect"),e("、"),l("code",null,"refactor"),e("、"),l("code",null,"assessment"),e(" 或 null)、档位、分支")])]),l("tr",null,[l("td",null,[l("code",null,"stage")]),l("td",null,[e("与 "),l("code",null,"req list"),e(' 相同的阶段说明,如"开发中""等待确认方案""待验收"')])]),l("tr",null,[l("td",null,[l("code",null,"status")]),l("td",null,[e("状态文件的 "),l("code",null,"status"),e(";还没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"running")]),l("td",null,"后台进程是否在运行")]),l("tr",null,[l("td",null,[l("code",null,"phase")]),l("td",null,[l("code",null,"develop"),e(" / "),l("code",null,"verify")])]),l("tr",null,[l("td",null,[l("code",null,"attention")]),l("td",null,[e("需要人处理的事:"),l("code",null,"approval"),e("(确认方案)、"),l("code",null,"business"),e("(需求方决定)、"),l("code",null,"permission"),e("(1.13,步骤在等权限批准;"),l("code",null,"waiting.questions"),e(" 是要批准的操作,"),l("code",null,"waiting.agentId"),e(" 是那个 agent)、"),l("code",null,"interrupted"),e("(中断,可以继续)、"),l("code",null,"not_completed"),e("(结束但未完成)、"),l("code",null,"not_started"),e("(1.14,需求说明已确认超过 30 分钟、或已为它建好工作区,但流水线没有运行过);没有为 null")])]),l("tr",null,[l("td",null,[l("code",null,"waiting")]),l("td",null,[e("1.12 起。"),l("code",null,"attention"),e(" 不为 null 时:"),l("code",null,"since"),e("(从什么时候开始等)、"),l("code",null,"questions"),e("(需求方要回答的问题)、"),l("code",null,"reason"),e("(停止原因)、"),l("code",null,"card"),e("("),l("code",null,"{ system, id, url, requester }"),e(",从卡片开始的需求)、"),l("code",null,"canReply"),e("(能否用 "),l("code",null,"req api run reply <需求> <回复>"),e(" 把回复转给需求的对话)、"),l("code",null,"canStart"),e("(1.14,"),l("code",null,"not_started"),e(" 时为 true:可以用 "),l("code",null,"req api run start <需求>"),e(" 开始开发);否则为 null")])]),l("tr",null,[l("td",null,[l("code",null,"current")]),l("td",null,[e("正在运行的步骤 "),l("code",null,"[{ key, title, agentId }]")])]),l("tr",null,[l("td",null,[l("code",null,"updatedAt")]),l("td",null,"最近一次变化的时间")]),l("tr",null,[l("td",null,[l("code",null,"usage")]),l("td",null,[l("code",null,"{ steps, agentMinutes, inputTokens, outputTokens, costUsd }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"present")]),l("td",null,"目录是否还在")]),l("tr",null,[l("td",null,[l("code",null,"hasPrototype")]),l("td",null,[e("1.13 起。功能目录中有界面原型("),l("code",null,"prototype/"),e("),可以用原型审查页查看")])])])]),l("h2",{id:"详情-status",tabindex:"-1"},[e("详情("),l("code",null,"status"),e(") "),l("a",{class:"header-anchor",href:"#详情-status","aria-label":'Permalink to "详情(`status`)"'},"")]),l("p",null,'"需求"的全部字段,另加:'),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"字段"),l("th",null,"含义")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"files")]),l("td",null,[e("功能目录中存在的、可以用 "),l("code",null,"req api file"),e(" 读取的文件")])]),l("tr",null,[l("td",null,[l("code",null,"run")]),l("td",null,[l("code",null,"{ attempt, startedAt, updatedAt, pid, phaseMode, stopReason, outcome, queuedSince, verifyAt, approval, originAgentId }"),e(";没运行过为 null")])]),l("tr",null,[l("td",null,[l("code",null,"steps")]),l("td",null,[e("每个步骤一项:"),l("code",null,"{ key, stepId, title, phase, attempt, round, agentId, startedAt, endedAt, minutes, outcome, result, error, usage }"),e(";"),l("code",null,"title"),e(' 是给人看的名称(如"代码评审(第 2 轮)"),'),l("code",null,"result"),e(' 是结论的文字(如"需要修改")')])]),l("tr",null,[l("td",null,[l("code",null,"gate")]),l("td",null,[e("质量门:状态文件中的 "),l("code",null,"gate")])]),l("tr",null,[l("td",null,[l("code",null,"estimate")]),l("td",null,[e("1.13 起。"),l("code",null,"{ basis, profile, typicalAgentMinutes, typicalTokens, usedAgentMinutes, usedTokens, leftMinutes, over }"),e(":按本机已完成的同档位需求(至少 3 个)的中位数估算;数据不够或已完成时为 null")])]),l("tr",null,[l("td",null,[l("code",null,"joint")]),l("td",null,[e("联合需求的其他仓库:"),l("code",null,"[{ name, slug, repo, sourceRepo, branch, workspaceId, gate }]")])]),l("tr",null,[l("td",null,[l("code",null,"external")]),l("td",null,[e("外部系统中的卡片(1.9.0 起):"),l("code",null,"[{ name, id, url, status, syncedAt, pending, lastError }]"),e(";"),l("code",null,"pending"),e(" 是等待补发的调用数")])])])])],-1),l("p",{class:"source-note"},[e("本页由仓库中的 "),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/contracts/cli-json.md"},"contracts/cli-json.md"),e(" 生成。"),l("a",{href:"https://github.com/yiyisf/paseo-req-kit/edit/main/contracts/cli-json.md"},"在 GitHub 上编辑")],-1)])])}const g=t(s,[["render",i]]);export{k as __pageData,g as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as i,o as n,c as a,j as l,a as s}from"./chunks/framework.
|
|
1
|
+
import{_ as i,o as n,c as a,j as l,a as s}from"./chunks/framework.BetZR81g.js";const k=JSON.parse('{"title":"功能目录中由人和 /req 维护的文件","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/feature-files.md","filePath":"reference/contracts/feature-files.md","lastUpdated":null}'),t={name:"reference/contracts/feature-files.md"};function d(r,e,h,c,o,u){return n(),a("div",null,[...e[0]||(e[0]=[l("div",null,[l("h1",{id:"功能目录中由人和-req-维护的文件",tabindex:"-1"},[s("功能目录中由人和 /req 维护的文件 "),l("a",{class:"header-anchor",href:"#功能目录中由人和-req-维护的文件","aria-label":'Permalink to "功能目录中由人和 /req 维护的文件"'},"")]),l("p",null,[s("除 spec.md(见 "),l("a",{href:"./spec"},"spec.md"),s(")外,功能目录 "),l("code",null,"docs/features/<日期>-<名称>/"),s(" 中还有以下约定格式的文件。")]),l("h2",{id:"decisions-tsv",tabindex:"-1"},[s("decisions.tsv "),l("a",{class:"header-anchor",href:"#decisions-tsv","aria-label":'Permalink to "decisions.tsv"'},"")]),l("p",null,"决策记录,由流水线各步骤追加。制表符分隔,UTF-8,第一行为表头:"),l("div",{class:"language-text vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"text"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",null,"time step ref decision alternatives reason kind needs_human")])])])]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"列"),l("th",null,"内容")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"time")]),l("td",null,[l("code",null,"YYYY-MM-DD HH:MM")])]),l("tr",null,[l("td",null,[l("code",null,"step")]),l("td",null,[s("步骤名和轮次,如 "),l("code",null,"代码评审 第2轮")])]),l("tr",null,[l("td",null,[l("code",null,"ref")]),l("td",null,[s("相关的 FR / AC / CR 编号或文件,没有写 "),l("code",null,"-")])]),l("tr",null,[l("td",null,[l("code",null,"decision"),s(" / "),l("code",null,"alternatives"),s(" / "),l("code",null,"reason")]),l("td",null,"各一句话,不含换行和制表符")]),l("tr",null,[l("td",null,[l("code",null,"kind")]),l("td",null,[l("code",null,"假设"),s(" / "),l("code",null,"取舍"),s(" / "),l("code",null,"偏离方案"),s(" / "),l("code",null,"驳回意见"),s(" / "),l("code",null,"不修复")])]),l("tr",null,[l("td",null,[l("code",null,"needs_human")]),l("td",null,[l("code",null,"yes"),s(" / "),l("code",null,"no"),s("。"),l("code",null,"yes"),s(' 的行会被完成报告列入"需要你确认的决定"')])])])]),l("h2",{id:"changes-md",tabindex:"-1"},[s("changes.md "),l("a",{class:"header-anchor",href:"#changes-md","aria-label":'Permalink to "changes.md"'},"")]),l("p",null,[s("需求变更记录,由 "),l("code",null,"/req"),s(' 的"修改需求"手册追加,每次修改一节,新的在后:')]),l("div",{class:"language-markdown vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"markdown"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-light-font-weight":"bold","--shiki-dark":"#79B8FF","--shiki-dark-font-weight":"bold"}},"## 第 2 版(2026-10-14)")]),s(`
|
|
2
2
|
`),l("span",{class:"line"}),s(`
|
|
3
3
|
`),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#E36209","--shiki-dark":"#FFAB70"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," 变更内容:<改了哪些 FR / AC,新增或删除了什么>")]),s(`
|
|
4
4
|
`),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#E36209","--shiki-dark":"#FFAB70"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," 原因:<需求方给出的原因>")]),s(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as i,o as n,c as a,j as l,a as s}from"./chunks/framework.
|
|
1
|
+
import{_ as i,o as n,c as a,j as l,a as s}from"./chunks/framework.BetZR81g.js";const k=JSON.parse('{"title":"功能目录中由人和 /req 维护的文件","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/feature-files.md","filePath":"reference/contracts/feature-files.md","lastUpdated":null}'),t={name:"reference/contracts/feature-files.md"};function d(r,e,h,c,o,u){return n(),a("div",null,[...e[0]||(e[0]=[l("div",null,[l("h1",{id:"功能目录中由人和-req-维护的文件",tabindex:"-1"},[s("功能目录中由人和 /req 维护的文件 "),l("a",{class:"header-anchor",href:"#功能目录中由人和-req-维护的文件","aria-label":'Permalink to "功能目录中由人和 /req 维护的文件"'},"")]),l("p",null,[s("除 spec.md(见 "),l("a",{href:"./spec"},"spec.md"),s(")外,功能目录 "),l("code",null,"docs/features/<日期>-<名称>/"),s(" 中还有以下约定格式的文件。")]),l("h2",{id:"decisions-tsv",tabindex:"-1"},[s("decisions.tsv "),l("a",{class:"header-anchor",href:"#decisions-tsv","aria-label":'Permalink to "decisions.tsv"'},"")]),l("p",null,"决策记录,由流水线各步骤追加。制表符分隔,UTF-8,第一行为表头:"),l("div",{class:"language-text vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"text"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",null,"time step ref decision alternatives reason kind needs_human")])])])]),l("table",{tabindex:"0"},[l("thead",null,[l("tr",null,[l("th",null,"列"),l("th",null,"内容")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"time")]),l("td",null,[l("code",null,"YYYY-MM-DD HH:MM")])]),l("tr",null,[l("td",null,[l("code",null,"step")]),l("td",null,[s("步骤名和轮次,如 "),l("code",null,"代码评审 第2轮")])]),l("tr",null,[l("td",null,[l("code",null,"ref")]),l("td",null,[s("相关的 FR / AC / CR 编号或文件,没有写 "),l("code",null,"-")])]),l("tr",null,[l("td",null,[l("code",null,"decision"),s(" / "),l("code",null,"alternatives"),s(" / "),l("code",null,"reason")]),l("td",null,"各一句话,不含换行和制表符")]),l("tr",null,[l("td",null,[l("code",null,"kind")]),l("td",null,[l("code",null,"假设"),s(" / "),l("code",null,"取舍"),s(" / "),l("code",null,"偏离方案"),s(" / "),l("code",null,"驳回意见"),s(" / "),l("code",null,"不修复")])]),l("tr",null,[l("td",null,[l("code",null,"needs_human")]),l("td",null,[l("code",null,"yes"),s(" / "),l("code",null,"no"),s("。"),l("code",null,"yes"),s(' 的行会被完成报告列入"需要你确认的决定"')])])])]),l("h2",{id:"changes-md",tabindex:"-1"},[s("changes.md "),l("a",{class:"header-anchor",href:"#changes-md","aria-label":'Permalink to "changes.md"'},"")]),l("p",null,[s("需求变更记录,由 "),l("code",null,"/req"),s(' 的"修改需求"手册追加,每次修改一节,新的在后:')]),l("div",{class:"language-markdown vp-adaptive-theme"},[l("button",{title:"Copy Code",class:"copy"}),l("span",{class:"lang"},"markdown"),l("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[l("code",null,[l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#005CC5","--shiki-light-font-weight":"bold","--shiki-dark":"#79B8FF","--shiki-dark-font-weight":"bold"}},"## 第 2 版(2026-10-14)")]),s(`
|
|
2
2
|
`),l("span",{class:"line"}),s(`
|
|
3
3
|
`),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#E36209","--shiki-dark":"#FFAB70"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," 变更内容:<改了哪些 FR / AC,新增或删除了什么>")]),s(`
|
|
4
4
|
`),l("span",{class:"line"},[l("span",{style:{"--shiki-light":"#E36209","--shiki-dark":"#FFAB70"}},"-"),l("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," 原因:<需求方给出的原因>")]),s(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,o as d,c as a,
|
|
1
|
+
import{_ as e,o as d,c as a,a2 as r}from"./chunks/framework.BetZR81g.js";const p=JSON.parse('{"title":"文件格式约定","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/index.md","filePath":"reference/contracts/index.md","lastUpdated":null}'),o={name:"reference/contracts/index.md"};function c(s,t,i,n,l,f){return d(),a("div",null,[...t[0]||(t[0]=[r('<div><h1 id="文件格式约定" tabindex="-1">文件格式约定 <a class="header-anchor" href="#文件格式约定" aria-label="Permalink to "文件格式约定""></a></h1><p>这些文件同时被聊天中的 skill、流水线引擎和步骤 agent 读写。改动格式时,同时更新这里、相关代码和测试,并在 <code>CHANGELOG.md</code> 的"升级须知"中说明。</p><table tabindex="0"><thead><tr><th>文件</th><th>约定</th><th>格式版本</th></tr></thead><tbody><tr><td><code>docs/features/<目录>/spec.md</code></td><td><a href="./spec">spec.md</a></td><td><code>req-kit/spec@1</code></td></tr><tr><td><code>docs/features/<目录>/.pipeline/state.json</code></td><td><a href="./state">state.md</a></td><td><code>version: 1</code></td></tr><tr><td><code>docs/features/<目录>/.pipeline/results/<步骤>.json</code></td><td><a href="./result-file">result-file.md</a></td><td>按步骤固定字段</td></tr><tr><td><code>decisions.tsv</code>、<code>changes.md</code>、<code>acceptance.md</code> 与需求总览</td><td><a href="./feature-files">feature-files.md</a></td><td>见各文件说明</td></tr><tr><td><code>.requirement-pipeline/verify.md</code></td><td><a href="./verify">verify.md</a></td><td>自由格式,建议结构见文件</td></tr><tr><td>外部通知(企业 IM 等)收到的事件</td><td><a href="./notifier-event">notifier-event.md</a></td><td><code>schema: 1</code></td></tr><tr><td><code>req api</code> 的输出(Paseo 插件等程序读取)</td><td><a href="./cli-json">cli-json.md</a></td><td><code>schema: 1</code></td></tr><tr><td><code>~/.req-kit/index/</code>、<code>~/.req-kit/usage/runs.jsonl</code></td><td><a href="./usage-record">usage-record.md</a></td><td><code>schema: 1</code></td></tr></tbody></table><p>格式版本的规则:</p><ul><li>同一主版本内只做可以自动迁移的变更。</li><li>引擎读到旧版本的状态文件时自动迁移,原文件保留为 <code>state.json.bak-v<旧版本></code>。</li><li>读到比自己新的版本时拒绝运行,提示升级 req-kit 或恢复备份。</li></ul></div><p class="source-note">本页由仓库中的 <a href="https://github.com/yiyisf/paseo-req-kit/blob/main/contracts/README.md">contracts/README.md</a> 生成。<a href="https://github.com/yiyisf/paseo-req-kit/edit/main/contracts/README.md">在 GitHub 上编辑</a></p>',2)])])}const h=e(o,[["render",c]]);export{p as __pageData,h as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,o as d,c as a,
|
|
1
|
+
import{_ as e,o as d,c as a,a2 as r}from"./chunks/framework.BetZR81g.js";const p=JSON.parse('{"title":"文件格式约定","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/index.md","filePath":"reference/contracts/index.md","lastUpdated":null}'),o={name:"reference/contracts/index.md"};function c(s,t,i,n,l,f){return d(),a("div",null,[...t[0]||(t[0]=[r("",2)])])}const h=e(o,[["render",c]]);export{p as __pageData,h as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as e,o as t,c as n,j as i,a as s}from"./chunks/framework.
|
|
1
|
+
import{_ as e,o as t,c as n,j as i,a as s}from"./chunks/framework.BetZR81g.js";const u=JSON.parse('{"title":"外部通知事件(notifier)","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/notifier-event.md","filePath":"reference/contracts/notifier-event.md","lastUpdated":null}'),a={name:"reference/contracts/notifier-event.md"};function h(k,l,d,r,E,o){return t(),n("div",null,[...l[0]||(l[0]=[i("div",null,[i("h1",{id:"外部通知事件-notifier",tabindex:"-1"},[s("外部通知事件(notifier) "),i("a",{class:"header-anchor",href:"#外部通知事件-notifier","aria-label":'Permalink to "外部通知事件(notifier)"'},"")]),i("p",null,[s("流水线除了把消息发回发起的对话,还可以在关键时刻调用本机的通知模块,例如把消息转发到企业内部 IM。req-kit 只定义调用方式和事件格式,不包含任何 IM 的实现;模板见 "),i("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/notifiers/im-template.mjs",target:"_blank",rel:"noreferrer"},"notifiers/im-template.mjs"),s("。")]),i("h2",{id:"配置",tabindex:"-1"},[s("配置 "),i("a",{class:"header-anchor",href:"#配置","aria-label":'Permalink to "配置"'},"")]),i("p",null,[s("只能写在本机配置("),i("code",null,"~/.req-kit/config.json"),s(")或团队配置中,项目配置中的 "),i("code",null,"notifiers"),s(" 会被忽略(项目仓库里的代码不应该决定往哪里发消息)。")]),i("div",{class:"language-json vp-adaptive-theme"},[i("button",{title:"Copy Code",class:"copy"}),i("span",{class:"lang"},"json"),i("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[i("code",null,[i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"notifiers"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": [")]),s(`
|
|
2
2
|
`),i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," {")]),s(`
|
|
3
3
|
`),i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "module"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"~/.req-kit/notifiers/im.mjs"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},",")]),s(`
|
|
4
4
|
`),i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "events"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": ["),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"blocked"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"failed"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"completed"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"],")]),s(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as e,o as t,c as n,j as i,a as s}from"./chunks/framework.
|
|
1
|
+
import{_ as e,o as t,c as n,j as i,a as s}from"./chunks/framework.BetZR81g.js";const u=JSON.parse('{"title":"外部通知事件(notifier)","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"reference/contracts/notifier-event.md","filePath":"reference/contracts/notifier-event.md","lastUpdated":null}'),a={name:"reference/contracts/notifier-event.md"};function h(k,l,d,r,E,o){return t(),n("div",null,[...l[0]||(l[0]=[i("div",null,[i("h1",{id:"外部通知事件-notifier",tabindex:"-1"},[s("外部通知事件(notifier) "),i("a",{class:"header-anchor",href:"#外部通知事件-notifier","aria-label":'Permalink to "外部通知事件(notifier)"'},"")]),i("p",null,[s("流水线除了把消息发回发起的对话,还可以在关键时刻调用本机的通知模块,例如把消息转发到企业内部 IM。req-kit 只定义调用方式和事件格式,不包含任何 IM 的实现;模板见 "),i("a",{href:"https://github.com/yiyisf/paseo-req-kit/blob/main/notifiers/im-template.mjs",target:"_blank",rel:"noreferrer"},"notifiers/im-template.mjs"),s("。")]),i("h2",{id:"配置",tabindex:"-1"},[s("配置 "),i("a",{class:"header-anchor",href:"#配置","aria-label":'Permalink to "配置"'},"")]),i("p",null,[s("只能写在本机配置("),i("code",null,"~/.req-kit/config.json"),s(")或团队配置中,项目配置中的 "),i("code",null,"notifiers"),s(" 会被忽略(项目仓库里的代码不应该决定往哪里发消息)。")]),i("div",{class:"language-json vp-adaptive-theme"},[i("button",{title:"Copy Code",class:"copy"}),i("span",{class:"lang"},"json"),i("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0","v-pre":""},[i("code",null,[i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"notifiers"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": [")]),s(`
|
|
2
2
|
`),i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}}," {")]),s(`
|
|
3
3
|
`),i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "module"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": "),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"~/.req-kit/notifiers/im.mjs"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},",")]),s(`
|
|
4
4
|
`),i("span",{class:"line"},[i("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},' "events"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},": ["),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"blocked"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"failed"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},", "),i("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"completed"'),i("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"],")]),s(`
|