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
|
@@ -7,10 +7,10 @@ import { useState } from "react";
|
|
|
7
7
|
import { Pressable, Text, View } from "react-native";
|
|
8
8
|
import type { Action, RequirementDetail, Step } from "../shared/contracts";
|
|
9
9
|
import { useAction, useDocument, usePreferences, useRequirement, useRequirements } from "./data";
|
|
10
|
-
import { ACTION_TEXT, actionsFor, ago, ATTENTION_LABELS, facts, FILE_LABELS, minutes, tokens } from "./format";
|
|
10
|
+
import { ACTION_TEXT, actionsFor, ago, ATTENTION_LABELS, facts, FILE_LABELS, minutes, tokens, trackOf } from "./format";
|
|
11
11
|
import { Markdown, tsvToMarkdown } from "./markdown";
|
|
12
12
|
import { ChecklistButton, CodeReviewButton, ReviewButton } from "./review";
|
|
13
|
-
import { Badge, Button, Chip, Status, useStyles } from "./ui";
|
|
13
|
+
import { Badge, Button, Chip, Eyebrow, rk, Status, StepTrack, useStyles } from "./ui";
|
|
14
14
|
|
|
15
15
|
type Theme = PluginHostProps["theme"];
|
|
16
16
|
type Layout = PluginHostProps["layout"];
|
|
@@ -20,7 +20,7 @@ const OUTCOME_LABELS: Record<Step["outcome"], string> = { running: "运行中",
|
|
|
20
20
|
|
|
21
21
|
function StepRow({ theme, layout, step, navigation }: { theme: Theme; layout: Layout; step: Step; navigation: Navigation }) {
|
|
22
22
|
const s = useStyles(theme, layout.compact);
|
|
23
|
-
const tone = step.outcome === "failed" ? "danger" : step.outcome === "running" ? "
|
|
23
|
+
const tone = step.outcome === "failed" ? "danger" : step.outcome === "running" ? "running" : "muted";
|
|
24
24
|
const body = (
|
|
25
25
|
<View style={{ gap: 2, paddingVertical: 6 }}>
|
|
26
26
|
<View style={s.row}>
|
|
@@ -174,19 +174,39 @@ export function RequirementView({
|
|
|
174
174
|
const canReviewCode = (d.files.includes("code-review.md") || d.files.includes("implementation.md")) && !d.running;
|
|
175
175
|
const hr = d.humanReview ?? null;
|
|
176
176
|
const reviewLabel = !hr ? "代码审查" : hr.status === "approved" ? (hr.stale ? "代码审查(有新改动,需重新评审)" : "代码审查(已通过)") : "代码审查(已退回修改)";
|
|
177
|
+
// 1.15: one lime button, the decision this requirement waits for now.
|
|
178
|
+
const waitingAcceptance = d.stage.startsWith("待验收") || d.stage === "验收未通过";
|
|
179
|
+
const codeNeedsReview = canReviewCode && (!hr || hr.stale) && (d.status === "completed" || d.status === "phase_done");
|
|
180
|
+
const primary: "review" | "code" | "check" | Action | null =
|
|
181
|
+
d.attention === "approval" && d.hasPrototype
|
|
182
|
+
? "review"
|
|
183
|
+
: codeNeedsReview
|
|
184
|
+
? "code"
|
|
185
|
+
: canAccept && waitingAcceptance
|
|
186
|
+
? "check"
|
|
187
|
+
: (actions.find((a) => a !== "stop" && !(a === "approve" && d.hasPrototype)) ?? null);
|
|
188
|
+
const c = rk(theme);
|
|
177
189
|
return (
|
|
178
190
|
<View style={{ gap: 16 }}>
|
|
179
|
-
<View style={{ gap:
|
|
191
|
+
<View style={[s.card, { gap: 12 }]}>
|
|
192
|
+
<Eyebrow theme={theme} accent right={<Text style={s.mono} numberOfLines={1}>{d.branch ?? d.name}</Text>}>
|
|
193
|
+
REQUIREMENT
|
|
194
|
+
</Eyebrow>
|
|
180
195
|
<View style={s.row}>
|
|
181
196
|
<Text style={s.title}>{d.title}</Text>
|
|
182
197
|
{d.attention ? (
|
|
183
|
-
<Badge theme={theme} tone={d.attention === "
|
|
198
|
+
<Badge theme={theme} tone={d.attention === "interrupted" ? "danger" : d.attention === "not_completed" ? "warning" : "needs"}>
|
|
184
199
|
{ATTENTION_LABELS[d.attention]}
|
|
185
200
|
</Badge>
|
|
201
|
+
) : d.running ? (
|
|
202
|
+
<Badge theme={theme} tone="running" icon="LoaderCircle">
|
|
203
|
+
进行中
|
|
204
|
+
</Badge>
|
|
186
205
|
) : null}
|
|
187
206
|
</View>
|
|
207
|
+
<StepTrack theme={theme} steps={trackOf(d, hr)} />
|
|
188
208
|
<Text style={s.muted}>{facts(d)}</Text>
|
|
189
|
-
<Text style={s.text}>{d.stage}</Text>
|
|
209
|
+
<Text style={[s.text, { color: d.attention ? c.brandText : theme.colors.foreground }]}>{d.stage}</Text>
|
|
190
210
|
{d.estimate && d.attention !== "approval" ? (
|
|
191
211
|
<Text style={s.muted}>
|
|
192
212
|
{d.estimate.over
|
|
@@ -202,11 +222,11 @@ export function RequirementView({
|
|
|
202
222
|
|
|
203
223
|
{actions.length > 0 || d.hasPrototype || canAccept || canReviewCode ? (
|
|
204
224
|
<View style={s.row}>
|
|
205
|
-
{canReviewCode ? <CodeReviewButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} label={reviewLabel} primary={
|
|
206
|
-
{canAccept ? <ChecklistButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} primary={
|
|
207
|
-
{d.hasPrototype ? <ReviewButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} waiting={
|
|
225
|
+
{canReviewCode ? <CodeReviewButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} label={reviewLabel} primary={primary === "code"} /> : null}
|
|
226
|
+
{canAccept ? <ChecklistButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} primary={primary === "check"} /> : null}
|
|
227
|
+
{d.hasPrototype ? <ReviewButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} waiting={primary === "review"} /> : null}
|
|
208
228
|
{actions.map((a) => (
|
|
209
|
-
<Button key={a} theme={theme} primary={
|
|
229
|
+
<Button key={a} theme={theme} primary={primary === a} label={ACTION_TEXT[a].label} onPress={() => setAction(a)} />
|
|
210
230
|
))}
|
|
211
231
|
</View>
|
|
212
232
|
) : null}
|
|
@@ -230,7 +250,7 @@ export function RequirementView({
|
|
|
230
250
|
{d.branch ? <Text style={s.muted}>分支 {d.branch}</Text> : null}
|
|
231
251
|
{d.workspaceId && navigation ? (
|
|
232
252
|
<Pressable accessibilityRole="button" onPress={() => navigation.openWorkspace({ workspaceId: d.workspaceId! })}>
|
|
233
|
-
<Text style={{ color: theme.
|
|
253
|
+
<Text style={{ color: rk(theme).brandText, fontSize: 13, fontWeight: "600" }}>打开这个需求的工作区</Text>
|
|
234
254
|
</Pressable>
|
|
235
255
|
) : null}
|
|
236
256
|
{d.joint.map((j) => (
|
|
@@ -115,3 +115,59 @@ export const ACTION_TEXT = {
|
|
|
115
115
|
sync: { label: "同步到外部系统", confirm: "把这个需求同步到对接的外部系统:补发没有成功的调用、补建卡片、更新状态。" },
|
|
116
116
|
reply: { label: "发送回复", confirm: "把回复转给这个需求的对话,由它更新需求说明并继续开发。" },
|
|
117
117
|
} as const;
|
|
118
|
+
|
|
119
|
+
/** The six stops of the step track, and who does each (design/components/StepTrack.md). */
|
|
120
|
+
export const TRACK = [
|
|
121
|
+
{ label: "对齐", who: "你" },
|
|
122
|
+
{ label: "方案", who: "AI · 你确认" },
|
|
123
|
+
{ label: "实现", who: "AI" },
|
|
124
|
+
{ label: "评审", who: "AI · 开发同事" },
|
|
125
|
+
{ label: "验证", who: "AI" },
|
|
126
|
+
{ label: "验收", who: "需求方" },
|
|
127
|
+
] as const;
|
|
128
|
+
|
|
129
|
+
const STEP_STOP: Array<[RegExp, number]> = [
|
|
130
|
+
[/^(design|design_review|design_revise|design_proposal|assessment|diagnosis|reproduce)/, 1],
|
|
131
|
+
[/^(implement|acceptance_tests)/, 2],
|
|
132
|
+
[/^(code_review|review_fix)/, 3],
|
|
133
|
+
[/^(verify|defect_fix|reverify|service|handoff|report)/, 4],
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Where the requirement is on the track, and whether that stop waits for a person.
|
|
138
|
+
* `humanReview` (detail only) tells whether the code review is done.
|
|
139
|
+
*/
|
|
140
|
+
export function trackOf(
|
|
141
|
+
r: Pick<Requirement, "stage" | "status" | "attention" | "running" | "current">,
|
|
142
|
+
humanReview?: { status: string; stale: boolean } | null,
|
|
143
|
+
): Array<{ label: string; who: string; state: "done" | "now" | "needs" | "todo" }> {
|
|
144
|
+
let at = 0;
|
|
145
|
+
let needs = false;
|
|
146
|
+
const running = r.current[0]?.key;
|
|
147
|
+
if (r.stage.startsWith("对齐")) at = 0;
|
|
148
|
+
else if (r.attention === "approval" || r.attention === "business" || r.attention === "not_started") [at, needs] = [1, true];
|
|
149
|
+
else if (running) at = STEP_STOP.find(([re]) => re.test(running))?.[1] ?? 2;
|
|
150
|
+
else if (r.status === "phase_done") [at, needs] = [4, true];
|
|
151
|
+
else if (r.status === "completed" || /待验收|已验收|验收/.test(r.stage)) {
|
|
152
|
+
const reviewed = humanReview && humanReview.status === "approved" && !humanReview.stale;
|
|
153
|
+
if (/已验收|验收通过/.test(r.stage)) at = TRACK.length;
|
|
154
|
+
else if (humanReview !== undefined && !reviewed) [at, needs] = [3, true];
|
|
155
|
+
else [at, needs] = [5, true];
|
|
156
|
+
} else if (r.status) at = 2;
|
|
157
|
+
return TRACK.map((t, i) => ({ ...t, state: i < at ? "done" : i === at ? (needs ? "needs" : "now") : "todo" }));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** The icon of a requirement in a list, by what it needs (Lucide names). */
|
|
161
|
+
export function iconOf(r: Pick<Requirement, "attention" | "running" | "status" | "stage">): { name: string; tone: "needs" | "running" | "success" | "warning" | "danger" | "muted" } {
|
|
162
|
+
if (r.attention === "interrupted") return { name: "OctagonAlert", tone: "danger" };
|
|
163
|
+
if (r.attention === "permission") return { name: "ShieldCheck", tone: "needs" };
|
|
164
|
+
if (r.attention === "approval") return { name: "PenTool", tone: "needs" };
|
|
165
|
+
if (r.attention === "business") return { name: "MessagesSquare", tone: "needs" };
|
|
166
|
+
if (r.attention === "not_started") return { name: "Play", tone: "needs" };
|
|
167
|
+
if (r.attention === "not_completed") return { name: "CircleDashed", tone: "warning" };
|
|
168
|
+
if (r.running) return { name: "LoaderCircle", tone: "running" };
|
|
169
|
+
if (r.stage.startsWith("对齐")) return { name: "MessagesSquare", tone: "muted" };
|
|
170
|
+
if (r.status === "phase_done" || /待验收/.test(r.stage)) return { name: "ClipboardCheck", tone: "warning" };
|
|
171
|
+
if (r.status === "completed") return { name: "CircleCheck", tone: "success" };
|
|
172
|
+
return { name: "Circle", tone: "muted" };
|
|
173
|
+
}
|
|
@@ -9,18 +9,18 @@ import type { Attention, Requirement } from "../shared/contracts";
|
|
|
9
9
|
import { useAction, usePreferences } from "./data";
|
|
10
10
|
import { facts } from "./format";
|
|
11
11
|
import { ReviewButton } from "./review";
|
|
12
|
-
import { Badge, Button, useStyles } from "./ui";
|
|
12
|
+
import { AttentionIcon, Badge, Button, Eyebrow, useStyles } from "./ui";
|
|
13
13
|
|
|
14
14
|
type Theme = PluginHostProps["theme"];
|
|
15
15
|
type Layout = PluginHostProps["layout"];
|
|
16
16
|
|
|
17
|
-
const KIND: Record<Exclude<Attention, null>, { label: string; tone: "
|
|
18
|
-
approval: { label: "确认方案", tone: "
|
|
19
|
-
business: { label: "回答问题", tone: "
|
|
20
|
-
permission: { label: "批准权限", tone: "
|
|
21
|
-
interrupted: { label: "已中断", tone: "danger", todo: "开发中断了,自动处理没能解决。看一下原因,能继续就继续。" },
|
|
22
|
-
not_completed: { label: "没有完成", tone: "muted", todo: "流水线结束了,但有部分没有做完。完成报告里写了原因和建议。" },
|
|
23
|
-
not_started: { label: "还没开始开发", tone: "
|
|
17
|
+
const KIND: Record<Exclude<Attention, null>, { label: string; tone: "needs" | "danger" | "muted"; icon: string; todo: string }> = {
|
|
18
|
+
approval: { icon: "PenTool", label: "确认方案", tone: "needs", todo: "方案已通过审核。看一下“做完后会看到什么”,没问题就确认,开始写代码;要改就写下来。" },
|
|
19
|
+
business: { icon: "MessagesSquare", label: "回答问题", tone: "needs", todo: "方案审核有问题只有你能决定,回答后开发会接着进行。" },
|
|
20
|
+
permission: { icon: "ShieldCheck", label: "批准权限", tone: "needs", todo: "有一个步骤在等你允许它做一项操作,批准前会一直停在这里。打开这个 agent,在它的对话里选择允许或拒绝;拿不准时请开发同事看一下。" },
|
|
21
|
+
interrupted: { icon: "OctagonAlert", label: "已中断", tone: "danger", todo: "开发中断了,自动处理没能解决。看一下原因,能继续就继续。" },
|
|
22
|
+
not_completed: { icon: "CircleDashed", label: "没有完成", tone: "muted", todo: "流水线结束了,但有部分没有做完。完成报告里写了原因和建议。" },
|
|
23
|
+
not_started: { icon: "Play", label: "还没开始开发", tone: "needs", todo: "需求说明已经确认,但开发没有开始。确认无误就点“开始开发”,进展会发回谈需求的那个对话。" },
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
/** Plain waiting time: "等了 3 小时". */
|
|
@@ -63,15 +63,20 @@ function InboxCard({ theme, layout, item, open, readOnly, openAgent }: { theme:
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
return (
|
|
66
|
-
<View style={[s.card, { gap: 10
|
|
67
|
-
<View style={
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
<View style={[s.card, { gap: 10 }]}>
|
|
67
|
+
<View style={{ flexDirection: "row", alignItems: "flex-start", gap: 12 }}>
|
|
68
|
+
<AttentionIcon theme={theme} icon={kind.icon} tone={kind.tone} />
|
|
69
|
+
<View style={{ flex: 1, minWidth: 0, gap: 2 }}>
|
|
70
|
+
<View style={[s.row, { justifyContent: "space-between" }]}>
|
|
71
|
+
<Text style={[s.text, { fontWeight: "600", fontSize: 15, flexShrink: 1 }]}>{item.title}</Text>
|
|
72
|
+
<Text style={s.mono}>{waited(w?.since ?? item.updatedAt)}</Text>
|
|
73
|
+
</View>
|
|
74
|
+
<View style={s.row}>
|
|
75
|
+
<Badge theme={theme} tone={kind.tone}>
|
|
76
|
+
{kind.label}
|
|
77
|
+
</Badge>
|
|
78
|
+
</View>
|
|
73
79
|
</View>
|
|
74
|
-
<Text style={s.muted}>{waited(w?.since ?? item.updatedAt)}</Text>
|
|
75
80
|
</View>
|
|
76
81
|
<Text style={s.muted}>
|
|
77
82
|
{facts(item)}
|
|
@@ -165,13 +170,14 @@ export function Inbox({ theme, layout, items, open, openAgent }: { theme: Theme;
|
|
|
165
170
|
const waiting = inboxItems(items);
|
|
166
171
|
return (
|
|
167
172
|
<View style={{ gap: 10 }}>
|
|
168
|
-
<View
|
|
169
|
-
<Text style={
|
|
170
|
-
|
|
173
|
+
<View>
|
|
174
|
+
<Eyebrow theme={theme} accent right={<Text style={s.muted}>{waiting.length > 0 ? "等你处理 · 等得最久的在前" : "等你处理"}</Text>}>
|
|
175
|
+
NEEDS YOU · {waiting.length}
|
|
176
|
+
</Eyebrow>
|
|
171
177
|
</View>
|
|
172
178
|
{waiting.length === 0 ? (
|
|
173
179
|
<View style={[s.card, { flexDirection: "row", alignItems: "center", gap: 8 }]}>
|
|
174
|
-
<Badge theme={theme} tone="success">
|
|
180
|
+
<Badge theme={theme} tone="success" icon="CircleCheck">
|
|
175
181
|
没有
|
|
176
182
|
</Badge>
|
|
177
183
|
<Text style={s.muted}>现在没有需要你处理的事。需要你确认或回答时,会出现在这里。</Text>
|
|
@@ -5,6 +5,7 @@ import type { PluginHostProps } from "@getpaseo/plugin/client";
|
|
|
5
5
|
import { ExternalLink } from "@getpaseo/plugin/client/ui";
|
|
6
6
|
import { type ReactNode, useMemo } from "react";
|
|
7
7
|
import { ScrollView, Text, View } from "react-native";
|
|
8
|
+
import { rk } from "./ui";
|
|
8
9
|
|
|
9
10
|
type Theme = PluginHostProps["theme"];
|
|
10
11
|
|
|
@@ -133,7 +134,7 @@ export function inline(text: string, theme: Theme, key = "i"): ReactNode[] {
|
|
|
133
134
|
} else {
|
|
134
135
|
// A link to another file in the repository: show its text and where it points.
|
|
135
136
|
out.push(
|
|
136
|
-
<Text key={`${key}-${n++}`} style={{ color: theme.
|
|
137
|
+
<Text key={`${key}-${n++}`} style={{ color: rk(theme).brandText }}>
|
|
137
138
|
{m[4]}
|
|
138
139
|
</Text>,
|
|
139
140
|
);
|
|
@@ -8,10 +8,13 @@ import { useRequirements } from "./data";
|
|
|
8
8
|
import { type Group, GROUP_LABELS, groupOf } from "./format";
|
|
9
9
|
import { Inbox } from "./inbox";
|
|
10
10
|
import { RequirementRow } from "./row";
|
|
11
|
-
import { Button, Chip, Status, useStyles } from "./ui";
|
|
11
|
+
import { BrandHeader, Button, Chip, Eyebrow, Status, useStyles } from "./ui";
|
|
12
12
|
|
|
13
13
|
export const ORDER: Group[] = ["attention", "running", "verify", "done", "other"];
|
|
14
14
|
|
|
15
|
+
/** Uppercase mono group names (design/guidelines/plugin.md); the Chinese label follows. */
|
|
16
|
+
const EYEBROW: Record<Group, string> = { attention: "NEEDS YOU", running: "IN PROGRESS", verify: "READY TO TEST", done: "DONE", other: "OTHERS" };
|
|
17
|
+
|
|
15
18
|
/** Opens a requirement's detail screen. */
|
|
16
19
|
export type OpenRequirement = (item: Pick<Requirement, "repo" | "featureDir" | "title">) => void;
|
|
17
20
|
|
|
@@ -33,12 +36,13 @@ export function RequirementGroups({
|
|
|
33
36
|
<View style={{ gap: 20 }}>
|
|
34
37
|
{ORDER.filter((g) => groups.has(g) && !skip.includes(g)).map((g) => (
|
|
35
38
|
<View key={g} style={{ gap: 8 }}>
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
</Text>
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
<Eyebrow
|
|
40
|
+
theme={theme}
|
|
41
|
+
accent={g === "attention"}
|
|
42
|
+
right={g === "other" ? <Button theme={theme} label={showOther ? "收起" : "展开"} onPress={() => setShowOther((v) => !v)} /> : <Text style={s.muted}>{GROUP_LABELS[g]}</Text>}
|
|
43
|
+
>
|
|
44
|
+
{EYEBROW[g]} · {groups.get(g)!.length}
|
|
45
|
+
</Eyebrow>
|
|
42
46
|
{g === "other" && !showOther
|
|
43
47
|
? null
|
|
44
48
|
: groups.get(g)!.map((item) => <RequirementRow key={item.key} theme={theme} layout={layout} item={item} onPress={() => open(item)} />)}
|
|
@@ -67,10 +71,16 @@ export function OverviewScreen(props: PluginScreenProps & { openScreen: ScreenOp
|
|
|
67
71
|
return (
|
|
68
72
|
<View style={s.screen}>
|
|
69
73
|
<ScrollView contentContainerStyle={s.body}>
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
<BrandHeader
|
|
75
|
+
theme={theme}
|
|
76
|
+
page="需求"
|
|
77
|
+
right={
|
|
78
|
+
<View style={s.row}>
|
|
79
|
+
<Button theme={theme} icon="ChartColumn" label="使用统计" onPress={() => props.openScreen({ screenId: "stats" })} />
|
|
80
|
+
<Button theme={theme} icon="Settings2" label="配置" onPress={() => props.openScreen({ screenId: "config" })} />
|
|
81
|
+
</View>
|
|
82
|
+
}
|
|
83
|
+
/>
|
|
74
84
|
{projects.length > 1 ? (
|
|
75
85
|
<View style={s.row}>
|
|
76
86
|
<Chip theme={theme} label="全部项目" active={project === null} onPress={() => setProject(null)} />
|
|
@@ -12,17 +12,17 @@ type Theme = PluginHostProps["theme"];
|
|
|
12
12
|
|
|
13
13
|
/** 1.14: the acceptance checklist, primary while the requirement waits for acceptance. */
|
|
14
14
|
export function ChecklistButton({ theme, repo, featureDir, title, primary }: { theme: Theme; repo: string; featureDir: string; title: string; primary: boolean }) {
|
|
15
|
-
return <Button theme={theme} primary={primary} label="验收清单(可一键试用)" onPress={() => openChecklist({ repo, featureDir, title })} />;
|
|
15
|
+
return <Button theme={theme} primary={primary} icon="ClipboardCheck" label="验收清单(可一键试用)" onPress={() => openChecklist({ repo, featureDir, title })} />;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/** 1.14: the code review page: AI findings next to the code, the person's comments, pass or send back. */
|
|
19
19
|
export function CodeReviewButton({ theme, repo, featureDir, title, primary, label }: { theme: Theme; repo: string; featureDir: string; title: string; primary: boolean; label: string }) {
|
|
20
|
-
return <Button theme={theme} primary={primary} label={label} onPress={() => openCodeReview({ repo, featureDir, title })} />;
|
|
20
|
+
return <Button theme={theme} primary={primary} icon="GitPullRequest" label={label} onPress={() => openCodeReview({ repo, featureDir, title })} />;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/** The button on a requirement with a prototype: primary while the design waits for confirmation. */
|
|
24
24
|
export function ReviewButton({ theme, repo, featureDir, title, waiting }: { theme: Theme; repo: string; featureDir: string; title: string; waiting: boolean }) {
|
|
25
|
-
return <Button theme={theme} primary={waiting} label={waiting ? "审查原型并确认方案" : "审查原型"} onPress={() => openReview({ repo, featureDir, title })} />;
|
|
25
|
+
return <Button theme={theme} primary={waiting} icon="PenTool" label={waiting ? "审查原型并确认方案" : "审查原型"} onPress={() => openReview({ repo, featureDir, title })} />;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export function ReviewScreen({ theme, layout, params }: PluginScreenProps) {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
// One requirement in a list: title,
|
|
1
|
+
// One requirement in a list: icon, title, project and feature directory, stage, what is running.
|
|
2
2
|
import type { PluginHostProps } from "@getpaseo/plugin/client";
|
|
3
|
+
import { Icon } from "@getpaseo/plugin/client/react-native";
|
|
3
4
|
import { Pressable, Text, View } from "react-native";
|
|
4
5
|
import type { Requirement } from "../shared/contracts";
|
|
5
|
-
import { ago, ATTENTION_LABELS,
|
|
6
|
-
import { Badge, useStyles } from "./ui";
|
|
6
|
+
import { ago, ATTENTION_LABELS, iconOf } from "./format";
|
|
7
|
+
import { Badge, rk, useStyles } from "./ui";
|
|
7
8
|
|
|
8
9
|
export function RequirementRow({
|
|
9
10
|
theme,
|
|
@@ -12,29 +13,51 @@ export function RequirementRow({
|
|
|
12
13
|
onPress,
|
|
13
14
|
}: Pick<PluginHostProps, "theme" | "layout"> & { item: Requirement; onPress(): void }) {
|
|
14
15
|
const s = useStyles(theme, layout.compact);
|
|
16
|
+
const c = rk(theme);
|
|
17
|
+
const ic = iconOf(item);
|
|
18
|
+
const iconColor =
|
|
19
|
+
ic.tone === "needs" ? c.brandText : ic.tone === "running" ? c.data : ic.tone === "success" ? theme.colors.statusSuccess : ic.tone === "warning" ? theme.colors.statusWarning : ic.tone === "danger" ? theme.colors.statusDanger : theme.colors.foregroundMuted;
|
|
15
20
|
return (
|
|
16
|
-
<Pressable
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
<Pressable
|
|
22
|
+
accessibilityRole="button"
|
|
23
|
+
accessibilityLabel={item.title}
|
|
24
|
+
onPress={onPress}
|
|
25
|
+
style={({ pressed }: { pressed: boolean }) => [s.card, { flexDirection: "row", alignItems: "center", gap: 12, backgroundColor: pressed ? theme.colors.surface2 : theme.colors.surface1 }]}
|
|
26
|
+
>
|
|
27
|
+
<Icon name={ic.name} size={18} color={iconColor} />
|
|
28
|
+
<View style={{ flex: 1, minWidth: 0, gap: 2 }}>
|
|
29
|
+
<Text style={[s.text, { fontWeight: "600" }]} numberOfLines={1}>
|
|
30
|
+
{item.title}
|
|
31
|
+
</Text>
|
|
32
|
+
<Text style={s.mono} numberOfLines={1}>
|
|
33
|
+
{item.project} · {item.name}
|
|
34
|
+
</Text>
|
|
35
|
+
{item.current.length > 0 ? (
|
|
36
|
+
<Text style={s.muted} numberOfLines={1}>
|
|
37
|
+
正在:{item.current.map((x) => x.title).join("、")}
|
|
38
|
+
</Text>
|
|
39
|
+
) : (
|
|
40
|
+
<Text style={s.muted} numberOfLines={1}>
|
|
41
|
+
{item.stage}
|
|
42
|
+
</Text>
|
|
43
|
+
)}
|
|
44
|
+
</View>
|
|
45
|
+
<View style={{ alignItems: "flex-end", gap: 4 }}>
|
|
19
46
|
{item.attention ? (
|
|
20
|
-
<Badge theme={theme} tone={item.attention === "
|
|
47
|
+
<Badge theme={theme} tone={item.attention === "interrupted" ? "danger" : item.attention === "not_completed" ? "warning" : "needs"}>
|
|
21
48
|
{ATTENTION_LABELS[item.attention]}
|
|
22
49
|
</Badge>
|
|
23
50
|
) : item.running ? (
|
|
24
|
-
<Badge theme={theme} tone="
|
|
25
|
-
|
|
51
|
+
<Badge theme={theme} tone="running" icon="LoaderCircle">
|
|
52
|
+
进行中
|
|
26
53
|
</Badge>
|
|
27
|
-
) :
|
|
28
|
-
{!item.present ? (
|
|
54
|
+
) : !item.present ? (
|
|
29
55
|
<Badge theme={theme} tone="muted">
|
|
30
56
|
目录已不在
|
|
31
57
|
</Badge>
|
|
32
58
|
) : null}
|
|
59
|
+
<Text style={s.mono}>{ago(item.updatedAt)}</Text>
|
|
33
60
|
</View>
|
|
34
|
-
<Text style={s.muted}>{facts(item)}</Text>
|
|
35
|
-
<Text style={s.text}>{item.stage}</Text>
|
|
36
|
-
{item.current.length > 0 ? <Text style={s.muted}>正在:{item.current.map((c) => c.title).join("、")}</Text> : null}
|
|
37
|
-
<Text style={s.muted}>更新于 {ago(item.updatedAt)}</Text>
|
|
38
61
|
</Pressable>
|
|
39
62
|
);
|
|
40
63
|
}
|
|
@@ -5,7 +5,7 @@ import { useState } from "react";
|
|
|
5
5
|
import { Text, View } from "react-native";
|
|
6
6
|
import { useStats } from "./data";
|
|
7
7
|
import { minutes, tokens, TYPE_LABELS } from "./format";
|
|
8
|
-
import { Chip, Status, useStyles } from "./ui";
|
|
8
|
+
import { BrandHeader, Chip, Eyebrow, rk, Status, useStyles } from "./ui";
|
|
9
9
|
|
|
10
10
|
type Tokens = NonNullable<import("../shared/contracts").StatsSummary["tokens"]>;
|
|
11
11
|
|
|
@@ -24,13 +24,13 @@ function TokenShare({ theme, compact, t }: { theme: import("@getpaseo/plugin/cli
|
|
|
24
24
|
</Text>
|
|
25
25
|
</View>
|
|
26
26
|
<View style={{ height: 6, borderRadius: 3, backgroundColor: theme.colors.surface2, overflow: "hidden" }}>
|
|
27
|
-
<View style={{ width: `${Math.max(1, Math.round(share * 100))}%`, height: 6, backgroundColor: theme.
|
|
27
|
+
<View style={{ width: `${Math.max(1, Math.round(share * 100))}%`, height: 6, backgroundColor: rk(theme).data }} />
|
|
28
28
|
</View>
|
|
29
29
|
</View>
|
|
30
30
|
);
|
|
31
31
|
return (
|
|
32
32
|
<View style={[s.card, { gap: 10 }]}>
|
|
33
|
-
<Text style={s.
|
|
33
|
+
<Eyebrow theme={theme} right={<Text style={s.muted}>token 花在哪</Text>}>TOKENS</Eyebrow>
|
|
34
34
|
<Text style={s.text}>
|
|
35
35
|
合计 {tokens(t.total)} tokens
|
|
36
36
|
{t.rework ? `,其中返工(修订、修复、复验和第 2 轮起的评审)占 ${pct(t.rework.share)}` : ""}
|
|
@@ -75,6 +75,7 @@ export function StatsScreen({ theme, layout }: PluginScreenProps) {
|
|
|
75
75
|
return (
|
|
76
76
|
<View style={s.screen}>
|
|
77
77
|
<ScrollView contentContainerStyle={s.body}>
|
|
78
|
+
<BrandHeader theme={theme} page="使用统计" />
|
|
78
79
|
<View style={s.row}>
|
|
79
80
|
{periods.map((p, i) => (
|
|
80
81
|
<Chip key={p.label} theme={theme} label={p.label} active={i === pick} onPress={() => setPick(i)} />
|
|
@@ -93,7 +94,7 @@ export function StatsScreen({ theme, layout }: PluginScreenProps) {
|
|
|
93
94
|
</View>
|
|
94
95
|
{d.oversight && d.oversight.reviews.total + d.oversight.acceptance.total + d.oversight.merged.requirements + d.oversight.issues.total > 0 ? (
|
|
95
96
|
<View style={s.card}>
|
|
96
|
-
<Text style={s.
|
|
97
|
+
<Eyebrow theme={theme} right={<Text style={s.muted}>人工把关和合并后</Text>}>OVERSIGHT</Eyebrow>
|
|
97
98
|
<Text style={s.text}>
|
|
98
99
|
人工代码评审 {d.oversight.reviews.total} 次({d.oversight.reviews.requirements} 个需求),退回修改 {d.oversight.reviews.sentBack} 次;第一次就通过 {d.oversight.reviews.passedFirstTime} 个
|
|
99
100
|
</Text>
|