paseo-req-kit 1.15.0-beta.1 → 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.
Files changed (204) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/engine/src/review-assets/rk.css +2 -2
  3. package/package.json +1 -1
  4. package/paseo-plugin/client/detail.tsx +31 -11
  5. package/paseo-plugin/client/format.ts +56 -0
  6. package/paseo-plugin/client/inbox.tsx +26 -20
  7. package/paseo-plugin/client/markdown.tsx +2 -1
  8. package/paseo-plugin/client/overview.tsx +21 -11
  9. package/paseo-plugin/client/review.tsx +3 -3
  10. package/paseo-plugin/client/row.tsx +38 -15
  11. package/paseo-plugin/client/stats.tsx +5 -4
  12. package/paseo-plugin/client/ui.tsx +196 -29
  13. package/paseo-plugin/package.json +1 -1
  14. package/paseo-plugin/shared/rk-colors.ts +35 -0
  15. package/site-dist/404.html +5 -5
  16. package/site-dist/assets/{app.D5s_yGHZ.js → app.Ny0BZHeG.js} +1 -1
  17. package/site-dist/assets/changelog.md.CUwudFS5.js +1 -0
  18. package/site-dist/assets/{changelog.md.RJaBnmnw.lean.js → changelog.md.CUwudFS5.lean.js} +1 -1
  19. package/site-dist/assets/chunks/@localSearchIndexroot.BmFA3hqY.js +1 -0
  20. package/site-dist/assets/chunks/{VPLocalSearchBox.B4CyDsTr.js → VPLocalSearchBox.BCWGSI0L.js} +1 -1
  21. package/site-dist/assets/chunks/{framework.B9qR_F1m.js → framework.BetZR81g.js} +1 -1
  22. package/site-dist/assets/chunks/theme.BeEUWcJI.js +2 -0
  23. package/site-dist/assets/{guide_getting-started.md.wFOkpMSx.js → guide_getting-started.md.DBJ0aMgy.js} +1 -1
  24. package/site-dist/assets/{guide_getting-started.md.wFOkpMSx.lean.js → guide_getting-started.md.DBJ0aMgy.lean.js} +1 -1
  25. package/site-dist/assets/{guide_how-it-works.md.D-kQsF1t.js → guide_how-it-works.md.Rn-g0Um8.js} +1 -1
  26. package/site-dist/assets/{guide_how-it-works.md.D-kQsF1t.lean.js → guide_how-it-works.md.Rn-g0Um8.lean.js} +1 -1
  27. package/site-dist/assets/{guide_index.md.CLnGCmGW.js → guide_index.md.BIF6VPBE.js} +1 -1
  28. package/site-dist/assets/{guide_index.md.CLnGCmGW.lean.js → guide_index.md.BIF6VPBE.lean.js} +1 -1
  29. package/site-dist/assets/{guide_install.md.DkCyZsOU.js → guide_install.md.kIsj5oWc.js} +1 -1
  30. package/site-dist/assets/{guide_install.md.DkCyZsOU.lean.js → guide_install.md.kIsj5oWc.lean.js} +1 -1
  31. package/site-dist/assets/{guide_maintainer.md.mFZprBj1.js → guide_maintainer.md.SWALpGR5.js} +1 -1
  32. package/site-dist/assets/{guide_maintainer.md.mFZprBj1.lean.js → guide_maintainer.md.SWALpGR5.lean.js} +1 -1
  33. package/site-dist/assets/{guide_phases.md.BpGAb1re.js → guide_phases.md.Bnd9FQ27.js} +1 -1
  34. package/site-dist/assets/{guide_phases.md.BpGAb1re.lean.js → guide_phases.md.Bnd9FQ27.lean.js} +1 -1
  35. package/site-dist/assets/{guide_project.md.DIjDRoAq.js → guide_project.md.CzS92KTI.js} +1 -1
  36. package/site-dist/assets/{guide_project.md.DIjDRoAq.lean.js → guide_project.md.CzS92KTI.lean.js} +1 -1
  37. package/site-dist/assets/{guide_user.md.UV0WxdJa.js → guide_user.md.REc1nK8f.js} +1 -1
  38. package/site-dist/assets/{guide_user.md.UV0WxdJa.lean.js → guide_user.md.REc1nK8f.lean.js} +1 -1
  39. package/site-dist/assets/index.md.CpaGRB2c.js +1 -0
  40. package/site-dist/assets/index.md.CpaGRB2c.lean.js +1 -0
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. package/site-dist/assets/{reference_adr_0004-result-files.md.DbqcCozI.js → reference_adr_0004-result-files.md.CNQMSs4R.js} +1 -1
  48. package/site-dist/assets/{reference_adr_0004-result-files.md.DbqcCozI.lean.js → reference_adr_0004-result-files.md.CNQMSs4R.lean.js} +1 -1
  49. 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
  50. 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
  51. package/site-dist/assets/{reference_adr_0006-skill-install-targets.md.CwY8YepV.js → reference_adr_0006-skill-install-targets.md.CwqvB8NW.js} +1 -1
  52. 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
  53. package/site-dist/assets/{reference_adr_0007-own-interview-skill.md.CryhxRyG.js → reference_adr_0007-own-interview-skill.md.HlLp78db.js} +1 -1
  54. 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
  55. 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
  56. 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
  57. package/site-dist/assets/{reference_adr_0009-versioned-install-layout.md.CSg1VqlW.js → reference_adr_0009-versioned-install-layout.md.D9g3dWr-.js} +1 -1
  58. 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
  59. 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
  60. 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
  61. package/site-dist/assets/{reference_adr_0011-resume-after-completion.md.BCrZrKjf.js → reference_adr_0011-resume-after-completion.md.CqdSPi49.js} +1 -1
  62. 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
  63. package/site-dist/assets/{reference_adr_0012-review-panel.md.k9rrHFFc.js → reference_adr_0012-review-panel.md.d4wmLrNF.js} +1 -1
  64. package/site-dist/assets/{reference_adr_0012-review-panel.md.k9rrHFFc.lean.js → reference_adr_0012-review-panel.md.d4wmLrNF.lean.js} +1 -1
  65. package/site-dist/assets/{reference_adr_0013-no-release-tooling.md.BQeJ8dEI.js → reference_adr_0013-no-release-tooling.md.BOROmwvq.js} +1 -1
  66. 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
  67. package/site-dist/assets/{reference_adr_0014-notifier-slot.md.C23QR1xO.js → reference_adr_0014-notifier-slot.md.BAqt1Xj1.js} +1 -1
  68. package/site-dist/assets/{reference_adr_0014-notifier-slot.md.C23QR1xO.lean.js → reference_adr_0014-notifier-slot.md.BAqt1Xj1.lean.js} +1 -1
  69. package/site-dist/assets/{reference_adr_0015-incremental-continue.md.Buy7wwO8.js → reference_adr_0015-incremental-continue.md.BiUdpeq5.js} +1 -1
  70. package/site-dist/assets/{reference_adr_0015-incremental-continue.md.Buy7wwO8.lean.js → reference_adr_0015-incremental-continue.md.BiUdpeq5.lean.js} +1 -1
  71. 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
  72. 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
  73. package/site-dist/assets/{reference_adr_0017-use-paseo-capabilities.md.CjcGli87.js → reference_adr_0017-use-paseo-capabilities.md.CAMkamzJ.js} +1 -1
  74. 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
  75. package/site-dist/assets/{reference_adr_0018-own-worktree-option.md.fVDpgGSE.js → reference_adr_0018-own-worktree-option.md.DgkWjYL-.js} +1 -1
  76. 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
  77. package/site-dist/assets/{reference_adr_0019-parallel-orchestration.md.DrfrV0To.js → reference_adr_0019-parallel-orchestration.md.B9xqQidw.js} +1 -1
  78. package/site-dist/assets/{reference_adr_0019-parallel-orchestration.md.DrfrV0To.lean.js → reference_adr_0019-parallel-orchestration.md.B9xqQidw.lean.js} +1 -1
  79. 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
  80. 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
  81. package/site-dist/assets/{reference_adr_0021-npm-version-manager.md.CU3PG6y5.js → reference_adr_0021-npm-version-manager.md.Pz4vZbkE.js} +1 -1
  82. 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
  83. 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
  84. 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
  85. package/site-dist/assets/{reference_adr_0023-types-gate-slices.md.D2E6yyYQ.js → reference_adr_0023-types-gate-slices.md.Bjufr5EK.js} +1 -1
  86. 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
  87. 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
  88. 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
  89. package/site-dist/assets/{reference_adr_0025-joint-requirements.md.ChoKvMUx.js → reference_adr_0025-joint-requirements.md.ClCFyIiN.js} +1 -1
  90. package/site-dist/assets/{reference_adr_0025-joint-requirements.md.ChoKvMUx.lean.js → reference_adr_0025-joint-requirements.md.ClCFyIiN.lean.js} +1 -1
  91. 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
  92. 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
  93. package/site-dist/assets/{reference_adr_0027-paseo-plugin.md.BMX33ZNU.js → reference_adr_0027-paseo-plugin.md.CcpaKksi.js} +1 -1
  94. package/site-dist/assets/{reference_adr_0027-paseo-plugin.md.BMX33ZNU.lean.js → reference_adr_0027-paseo-plugin.md.CcpaKksi.lean.js} +1 -1
  95. package/site-dist/assets/{reference_adr_0028-external-integrations.md.DtdMe8RK.js → reference_adr_0028-external-integrations.md.CrGqXJux.js} +1 -1
  96. package/site-dist/assets/{reference_adr_0028-external-integrations.md.DtdMe8RK.lean.js → reference_adr_0028-external-integrations.md.CrGqXJux.lean.js} +1 -1
  97. package/site-dist/assets/{reference_adr_0029-requirements-from-cards.md.BHd1SQPe.js → reference_adr_0029-requirements-from-cards.md.BUVah9hV.js} +1 -1
  98. 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
  99. 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
  100. 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
  101. package/site-dist/assets/{reference_adr_0031-fewer-interventions.md.BDnQcz8g.js → reference_adr_0031-fewer-interventions.md.C8e2jpbC.js} +1 -1
  102. package/site-dist/assets/{reference_adr_0031-fewer-interventions.md.BDnQcz8g.lean.js → reference_adr_0031-fewer-interventions.md.C8e2jpbC.lean.js} +1 -1
  103. 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
  104. 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
  105. 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
  106. 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
  107. package/site-dist/assets/{reference_adr_index.md.BYF-Ofor.js → reference_adr_index.md.DgUVrHoO.js} +1 -1
  108. package/site-dist/assets/{reference_adr_index.md.BYF-Ofor.lean.js → reference_adr_index.md.DgUVrHoO.lean.js} +1 -1
  109. package/site-dist/assets/{reference_commands.md.ClKbS-t8.js → reference_commands.md.BAQ8FugP.js} +1 -1
  110. package/site-dist/assets/{reference_commands.md.ClKbS-t8.lean.js → reference_commands.md.BAQ8FugP.lean.js} +1 -1
  111. package/site-dist/assets/{reference_config.md.CRe27LaA.js → reference_config.md.DoQUxHQ2.js} +1 -1
  112. package/site-dist/assets/{reference_config.md.CRe27LaA.lean.js → reference_config.md.DoQUxHQ2.lean.js} +1 -1
  113. package/site-dist/assets/{reference_contracts_cli-json.md.CCvKLasM.js → reference_contracts_cli-json.md.nRuTayON.js} +1 -1
  114. package/site-dist/assets/{reference_contracts_cli-json.md.CCvKLasM.lean.js → reference_contracts_cli-json.md.nRuTayON.lean.js} +1 -1
  115. package/site-dist/assets/{reference_contracts_feature-files.md.DSiA8OEH.js → reference_contracts_feature-files.md.CgiSHFpq.js} +1 -1
  116. package/site-dist/assets/{reference_contracts_feature-files.md.DSiA8OEH.lean.js → reference_contracts_feature-files.md.CgiSHFpq.lean.js} +1 -1
  117. package/site-dist/assets/{reference_contracts_index.md.Bkznz4px.js → reference_contracts_index.md.3h253qSo.js} +1 -1
  118. package/site-dist/assets/{reference_contracts_index.md.Bkznz4px.lean.js → reference_contracts_index.md.3h253qSo.lean.js} +1 -1
  119. package/site-dist/assets/{reference_contracts_notifier-event.md.B9WqeZdO.js → reference_contracts_notifier-event.md.DVrifpjH.js} +1 -1
  120. package/site-dist/assets/{reference_contracts_notifier-event.md.B9WqeZdO.lean.js → reference_contracts_notifier-event.md.DVrifpjH.lean.js} +1 -1
  121. package/site-dist/assets/{reference_contracts_result-file.md.DmR4fjB-.js → reference_contracts_result-file.md.CiZCk_r-.js} +1 -1
  122. package/site-dist/assets/{reference_contracts_result-file.md.DmR4fjB-.lean.js → reference_contracts_result-file.md.CiZCk_r-.lean.js} +1 -1
  123. package/site-dist/assets/{reference_contracts_spec.md.Dh5XczZL.js → reference_contracts_spec.md.B04OndF4.js} +1 -1
  124. package/site-dist/assets/{reference_contracts_spec.md.Dh5XczZL.lean.js → reference_contracts_spec.md.B04OndF4.lean.js} +1 -1
  125. package/site-dist/assets/{reference_contracts_state.md.STlqkPPS.js → reference_contracts_state.md.Xu63sMWH.js} +1 -1
  126. package/site-dist/assets/{reference_contracts_state.md.STlqkPPS.lean.js → reference_contracts_state.md.Xu63sMWH.lean.js} +1 -1
  127. package/site-dist/assets/{reference_contracts_usage-record.md.MjVps4CA.js → reference_contracts_usage-record.md.gd7f8fyb.js} +1 -1
  128. package/site-dist/assets/{reference_contracts_usage-record.md.MjVps4CA.lean.js → reference_contracts_usage-record.md.gd7f8fyb.lean.js} +1 -1
  129. package/site-dist/assets/{reference_contracts_verify.md.CbA88u6S.js → reference_contracts_verify.md.D_bAWUcP.js} +1 -1
  130. package/site-dist/assets/{reference_contracts_verify.md.CbA88u6S.lean.js → reference_contracts_verify.md.D_bAWUcP.lean.js} +1 -1
  131. package/site-dist/assets/{reference_scope.md.Kzqw8U_f.js → reference_scope.md.B7JBceSf.js} +1 -1
  132. package/site-dist/assets/{reference_scope.md.Kzqw8U_f.lean.js → reference_scope.md.B7JBceSf.lean.js} +1 -1
  133. package/site-dist/assets/{style.Dwsa4SMe.css → style.2G3zLS3c.css} +1 -1
  134. package/site-dist/changelog.html +9 -9
  135. package/site-dist/favicon.svg +10 -0
  136. package/site-dist/guide/getting-started.html +9 -9
  137. package/site-dist/guide/how-it-works.html +9 -9
  138. package/site-dist/guide/index.html +9 -9
  139. package/site-dist/guide/install.html +9 -9
  140. package/site-dist/guide/maintainer.html +9 -9
  141. package/site-dist/guide/phases.html +9 -9
  142. package/site-dist/guide/project.html +9 -9
  143. package/site-dist/guide/user.html +9 -9
  144. package/site-dist/hashmap.json +1 -1
  145. package/site-dist/index.html +9 -9
  146. package/site-dist/logo-light.svg +6 -0
  147. package/site-dist/logo.svg +5 -10
  148. package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +9 -9
  149. package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +9 -9
  150. package/site-dist/reference/adr/0003-script-engine-not-hub.html +9 -9
  151. package/site-dist/reference/adr/0004-result-files.html +9 -9
  152. package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +9 -9
  153. package/site-dist/reference/adr/0006-skill-install-targets.html +9 -9
  154. package/site-dist/reference/adr/0007-own-interview-skill.html +9 -9
  155. package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +9 -9
  156. package/site-dist/reference/adr/0009-versioned-install-layout.html +9 -9
  157. package/site-dist/reference/adr/0010-generated-feature-overview.html +9 -9
  158. package/site-dist/reference/adr/0011-resume-after-completion.html +9 -9
  159. package/site-dist/reference/adr/0012-review-panel.html +9 -9
  160. package/site-dist/reference/adr/0013-no-release-tooling.html +9 -9
  161. package/site-dist/reference/adr/0014-notifier-slot.html +9 -9
  162. package/site-dist/reference/adr/0015-incremental-continue.html +9 -9
  163. package/site-dist/reference/adr/0016-upgrade-from-tags.html +9 -9
  164. package/site-dist/reference/adr/0017-use-paseo-capabilities.html +9 -9
  165. package/site-dist/reference/adr/0018-own-worktree-option.html +9 -9
  166. package/site-dist/reference/adr/0019-parallel-orchestration.html +9 -9
  167. package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +9 -9
  168. package/site-dist/reference/adr/0021-npm-version-manager.html +9 -9
  169. package/site-dist/reference/adr/0022-develop-and-verify-phases.html +9 -9
  170. package/site-dist/reference/adr/0023-types-gate-slices.html +9 -9
  171. package/site-dist/reference/adr/0024-confirm-early-review-axes.html +9 -9
  172. package/site-dist/reference/adr/0025-joint-requirements.html +9 -9
  173. package/site-dist/reference/adr/0026-machine-records-and-api.html +9 -9
  174. package/site-dist/reference/adr/0027-paseo-plugin.html +9 -9
  175. package/site-dist/reference/adr/0028-external-integrations.html +9 -9
  176. package/site-dist/reference/adr/0029-requirements-from-cards.html +9 -9
  177. package/site-dist/reference/adr/0030-card-intake-process.html +9 -9
  178. package/site-dist/reference/adr/0031-fewer-interventions.html +9 -9
  179. package/site-dist/reference/adr/0032-npm-only-install.html +9 -9
  180. package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +9 -9
  181. package/site-dist/reference/adr/index.html +9 -9
  182. package/site-dist/reference/commands.html +9 -9
  183. package/site-dist/reference/config.html +9 -9
  184. package/site-dist/reference/contracts/cli-json.html +9 -9
  185. package/site-dist/reference/contracts/feature-files.html +9 -9
  186. package/site-dist/reference/contracts/index.html +9 -9
  187. package/site-dist/reference/contracts/notifier-event.html +9 -9
  188. package/site-dist/reference/contracts/result-file.html +9 -9
  189. package/site-dist/reference/contracts/spec.html +9 -9
  190. package/site-dist/reference/contracts/state.html +9 -9
  191. package/site-dist/reference/contracts/usage-record.html +9 -9
  192. package/site-dist/reference/contracts/verify.html +9 -9
  193. package/site-dist/reference/scope.html +9 -9
  194. package/site-dist/assets/changelog.md.RJaBnmnw.js +0 -1
  195. package/site-dist/assets/chunks/@localSearchIndexroot.Dric-MbI.js +0 -1
  196. package/site-dist/assets/chunks/theme.CCocenmB.js +0 -2
  197. package/site-dist/assets/index.md.Cf_sSf_f.js +0 -1
  198. package/site-dist/assets/index.md.Cf_sSf_f.lean.js +0 -1
  199. package/site-dist/icons/agents.svg +0 -1
  200. package/site-dist/icons/chat.svg +0 -1
  201. package/site-dist/icons/paseo.svg +0 -1
  202. package/site-dist/icons/phases.svg +0 -1
  203. package/site-dist/icons/review.svg +0 -1
  204. package/site-dist/icons/safe.svg +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,36 @@
2
2
 
3
3
  每个版本分为"使用者会看到的变化"和"升级须知"。升级步骤见 [docs/guide/安装与升级.md](docs/guide/安装与升级.md)。
4
4
 
5
+ ## 1.15.0-beta.3
6
+
7
+ ### 使用者会看到的变化
8
+
9
+ - **文档站和首页换上了 req-kit 的新设计**(`req docs` 打开的本机文档站、GitHub Pages 和内网托管的副本都一样):
10
+ - 首页:极光背景上的版本胶囊、标题和安装命令(npx / macOS·Linux / Windows 三个标签,一键复制);下面是"对齐 → 方案 → 实现 → 评审 → 验证 → 验收"的步骤轨(要你拍板的两步是青柠色),Bento 卡片介绍对齐需求、审查原型、质量门、代码审查、验收清单和危险命令拦截,数字条里的版本数和设计决定记录数从仓库读取。
11
+ - 正文页:底色、文字、链接、按钮换成设计系统的颜色;侧边栏分组标题用等宽小字,当前页青柠底色;提示、注意、危险、说明四种提示框带图标、不用彩色左边框;代码块圆角带边框。
12
+ - 默认跟随系统深浅色,右上角可切换;标志和网页图标换成 req-kit 的新标志。
13
+
14
+ ### 升级须知
15
+
16
+ - 文档站的颜色由 `scripts/tokens-build.mjs` 生成到 `site/.vitepress/theme/`(`rk-tokens.css`、`rk.css`、`rk-icons.ts`),标志复制到 `site/public/`;测试会检查它们和 `design/` 一致、主题样式里没有写死的颜色。
17
+ - 非 main 分支和合并请求构建的文档站会作为 `site-dist` 保留 7 天,方便预览。
18
+
19
+ ## 1.15.0-beta.2
20
+
21
+ ### 使用者会看到的变化
22
+
23
+ - **Paseo 插件换上了 req-kit 的新设计**:底色、文字、边框仍跟随 Paseo 的主题,req-kit 的样子靠青柠色的"要你做"、靛色的"AI 写的"、青色的"正在跑"带出来。
24
+ - 首页和统计页顶部有 req-kit 标志;需求分组用等宽小标题(NEEDS YOU / IN PROGRESS / READY TO TEST / DONE)。
25
+ - 需求列表每行前面有图标表示状态,下面一行等宽字体写"项目 · 功能目录",右边是状态徽章和更新时间。
26
+ - "等你处理"的卡片用图标块代替彩色左边框;需求页顶部有放行轨,一眼看出走到了哪一步;每页只有一个青柠色主按钮(审查方案、代码审查、验收或第一个动作)。
27
+ - 按钮、徽章带图标;统计页的柱子用数据色。
28
+
29
+ ### 升级须知
30
+
31
+ - 插件的颜色由 `scripts/tokens-build.mjs` 生成到 `paseo-plugin/shared/rk-colors.ts`,测试会检查插件代码里没有写死的颜色。
32
+ - 插件随 npm 包发布;升级后照常运行 `req plugin install` 更新到 Paseo 里。
33
+ - 文档站的新设计在下一个 beta 里做。
34
+
5
35
  ## 1.15.0-beta.1
6
36
 
7
37
  ### 使用者会看到的变化
@@ -113,8 +113,8 @@ a:not(.rk-btn){color:var(--rk-brand-text)}
113
113
  /* Terminal */
114
114
  .rk-term{box-sizing:border-box;width:100%;max-width:600px;border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-card);overflow:hidden;text-align:left}
115
115
  .rk-term__tabs{display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--rk-border-subtle)}
116
- .rk-term__tabs span{padding:6px 12px 8px;font:500 12px/1 var(--rk-font-mono);color:var(--rk-text-muted);border-bottom:2px solid transparent}
117
- .rk-term__tabs span.is-on{color:var(--rk-text-primary);border-color:var(--rk-brand-500)}
116
+ .rk-term__tabs span,.rk-term__tabs button{padding:6px 12px 8px;background:none;border:0;border-bottom:2px solid transparent;cursor:pointer;font:500 12px/1 var(--rk-font-mono);color:var(--rk-text-muted)}
117
+ .rk-term__tabs span.is-on,.rk-term__tabs button.is-on{color:var(--rk-text-primary);border-color:var(--rk-brand-500)}
118
118
  .rk-term__body{display:flex;align-items:center;gap:var(--rk-space-3);padding:14px var(--rk-space-4);font:13px/22px var(--rk-font-mono)}
119
119
  .rk-term__body i{font-style:normal;color:var(--rk-brand-text)}
120
120
  .rk-term__body code{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:inherit}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paseo-req-kit",
3
- "version": "1.15.0-beta.1",
3
+ "version": "1.15.0-beta.3",
4
4
  "description": "req-kit: a requirement-development workflow for Paseo. /req aligns a requirement in chat; the engine runs design, implementation, review and verification as Paseo agents.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -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" ? "accent" : "muted";
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: 4 }}>
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 === "approval" || d.attention === "business" || d.attention === "permission" ? "warning" : "danger"}>
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={!!hr && hr.stale} /> : null}
206
- {canAccept ? <ChecklistButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} primary={d.stage.startsWith("待验收") || d.stage === "验收未通过"} /> : null}
207
- {d.hasPrototype ? <ReviewButton theme={theme} repo={d.sourceRepo ?? d.repo} featureDir={d.featureDir} title={d.title} waiting={d.attention === "approval"} /> : null}
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={a !== "stop" && !(a === "approve" && d.hasPrototype)} label={ACTION_TEXT[a].label} onPress={() => setAction(a)} />
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.colors.accent, fontSize: 13 }}>打开这个需求的工作区</Text>
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: "warning" | "danger" | "muted"; todo: string }> = {
18
- approval: { label: "确认方案", tone: "warning", todo: "方案已通过审核。看一下“做完后会看到什么”,没问题就确认,开始写代码;要改就写下来。" },
19
- business: { label: "回答问题", tone: "warning", todo: "方案审核有问题只有你能决定,回答后开发会接着进行。" },
20
- permission: { label: "批准权限", tone: "warning", todo: "有一个步骤在等你允许它做一项操作,批准前会一直停在这里。打开这个 agent,在它的对话里选择允许或拒绝;拿不准时请开发同事看一下。" },
21
- interrupted: { label: "已中断", tone: "danger", todo: "开发中断了,自动处理没能解决。看一下原因,能继续就继续。" },
22
- not_completed: { label: "没有完成", tone: "muted", todo: "流水线结束了,但有部分没有做完。完成报告里写了原因和建议。" },
23
- not_started: { label: "还没开始开发", tone: "warning", todo: "需求说明已经确认,但开发没有开始。确认无误就点“开始开发”,进展会发回谈需求的那个对话。" },
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, borderLeftWidth: 3, borderLeftColor: kind.tone === "danger" ? theme.colors.statusDanger : kind.tone === "warning" ? theme.colors.statusWarning : theme.colors.border }]}>
67
- <View style={[s.row, { justifyContent: "space-between" }]}>
68
- <View style={[s.row, { flexShrink: 1 }]}>
69
- <Badge theme={theme} tone={kind.tone}>
70
- {kind.label}
71
- </Badge>
72
- <Text style={[s.text, { fontWeight: "600", flexShrink: 1 }]}>{item.title}</Text>
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 style={[s.row, { justifyContent: "space-between" }]}>
169
- <Text style={[s.title, { fontSize: 16 }]}>等你处理{waiting.length > 0 ? `(${waiting.length})` : ""}</Text>
170
- {waiting.length > 0 ? <Text style={s.muted}>等得最久的在前</Text> : null}
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.colors.accent }}>
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
- <View style={s.row}>
37
- <Text style={s.heading}>
38
- {GROUP_LABELS[g]}({groups.get(g)!.length})
39
- </Text>
40
- {g === "other" ? <Button theme={theme} label={showOther ? "收起" : "展开"} onPress={() => setShowOther((v) => !v)} /> : null}
41
- </View>
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
- <View style={s.row}>
71
- <Button theme={theme} label="使用统计" onPress={() => props.openScreen({ screenId: "stats" })} />
72
- <Button theme={theme} label="配置" onPress={() => props.openScreen({ screenId: "config" })} />
73
- </View>
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, facts, stage, what is running, what needs a person.
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, facts } from "./format";
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 accessibilityRole="button" accessibilityLabel={item.title} onPress={onPress} style={s.card}>
17
- <View style={s.row}>
18
- <Text style={[s.text, { fontWeight: "600", flexShrink: 1 }]}>{item.title}</Text>
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 === "approval" || item.attention === "business" ? "warning" : "danger"}>
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="accent">
25
- 运行中
51
+ <Badge theme={theme} tone="running" icon="LoaderCircle">
52
+ 进行中
26
53
  </Badge>
27
- ) : null}
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.colors.accent }} />
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.heading}>token 花在哪</Text>
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.heading}>人工把关和合并后</Text>
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>