@namewta/speculo 0.1.21 → 0.2.0

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 (288) hide show
  1. package/README.md +68 -78
  2. package/dist/src/cli.js +57 -34
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.d.ts +1 -3
  5. package/dist/src/index.js +128 -168
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/migrate.d.ts +38 -0
  8. package/dist/src/migrate.js +646 -0
  9. package/dist/src/migrate.js.map +1 -0
  10. package/dist/src/workflows.d.ts +7 -37
  11. package/dist/src/workflows.js +49 -123
  12. package/dist/src/workflows.js.map +1 -1
  13. package/package.json +6 -4
  14. package/template/.speculo/README.md +20 -0
  15. package/template/.speculo/workspace.json +12 -0
  16. package/template/commands/docs-sync.md +28 -0
  17. package/template/commands/finalize.md +37 -0
  18. package/template/commands/knowledge-prune.md +20 -0
  19. package/template/commands/retro.md +15 -8
  20. package/template/commands/status.md +8 -51
  21. package/template/skills/agents-md-builder/SKILL.md +14 -101
  22. package/template/skills/change-lifecycle/SKILL.md +25 -0
  23. package/template/{workflows/dev/_templates → skills/change-lifecycle/assets}/completion-summary-template.md +2 -2
  24. package/template/{workflows/dev/_templates → skills/change-lifecycle/assets}/completion-verification-template.md +1 -1
  25. package/template/skills/change-lifecycle/references/completion-gate.md +19 -0
  26. package/template/skills/change-lifecycle/references/finalize-archive.md +32 -0
  27. package/template/skills/docs-sync/SKILL.md +22 -0
  28. package/template/skills/docs-sync/assets/report-template.md +45 -0
  29. package/template/skills/docs-sync/assets/state-template.json +20 -0
  30. package/template/skills/docs-sync/assets/workflow-scope-template.json +9 -0
  31. package/template/skills/docs-sync/references/agents-contract.md +43 -0
  32. package/template/skills/docs-sync/references/changelog-contract.md +39 -0
  33. package/template/skills/docs-sync/references/document-lifecycle-contract.md +38 -0
  34. package/template/skills/docs-sync/references/git-state-contract.md +67 -0
  35. package/template/skills/docs-sync/references/readme-contract.md +44 -0
  36. package/template/skills/docs-sync/references/workflow-scope-contract.md +50 -0
  37. package/template/skills/github-npm-ops/SKILL.md +14 -39
  38. package/template/skills/github-npm-ops/references/failure-recovery.md +1 -1
  39. package/template/skills/github-npm-ops/references/preflight-checklist.md +1 -1
  40. package/template/skills/github-npm-ops/references/release-notes-injection.md +1 -1
  41. package/template/skills/github-npm-ops/references/release-pipeline.md +13 -13
  42. package/template/skills/github-npm-ops/references/version-bump-flow.md +3 -3
  43. package/template/skills/knowledge-prune/SKILL.md +29 -0
  44. package/template/skills/knowledge-prune/references/audit-rules.md +24 -0
  45. package/template/skills/runtime-context/SKILL.md +43 -0
  46. package/template/skills/runtime-context/references/path-resolution.md +32 -0
  47. package/template/skills/speculo-retro/SKILL.md +13 -37
  48. package/template/skills/speculo-retro/references/friction-taxonomy.md +3 -3
  49. package/template/skills/speculo-retro/references/issue-drafting-sop.md +3 -3
  50. package/template/skills/worktree-isolation/SKILL.md +10 -46
  51. package/template/skills/worktree-isolation/references/audit-branch-tree.md +2 -2
  52. package/template/skills/worktree-isolation/references/create-worktree.md +6 -6
  53. package/template/skills/worktree-isolation/references/merge-and-cleanup.md +5 -5
  54. package/template/vendor/README.md +11 -10
  55. package/template/vendor/matt-pocock/README.md +41 -0
  56. package/template/vendor/matt-pocock/engineering/README.md +28 -0
  57. package/template/vendor/matt-pocock/engineering/ask-matt/SKILL.md +76 -0
  58. package/template/vendor/matt-pocock/engineering/code-review/SKILL.md +89 -0
  59. package/template/vendor/matt-pocock/engineering/codebase-design/DEEPENING.md +37 -0
  60. package/template/vendor/matt-pocock/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
  61. package/template/vendor/matt-pocock/engineering/codebase-design/SKILL.md +114 -0
  62. package/template/vendor/matt-pocock/engineering/diagnosing-bugs/SKILL.md +134 -0
  63. package/template/vendor/matt-pocock/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  64. package/template/vendor/matt-pocock/engineering/domain-modeling/ADR-FORMAT.md +47 -0
  65. package/template/vendor/matt-pocock/engineering/domain-modeling/CONTEXT-FORMAT.md +60 -0
  66. package/template/vendor/matt-pocock/engineering/domain-modeling/SKILL.md +74 -0
  67. package/template/vendor/matt-pocock/engineering/grill-with-docs/SKILL.md +7 -0
  68. package/template/vendor/matt-pocock/engineering/implement/SKILL.md +15 -0
  69. package/template/vendor/matt-pocock/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
  70. package/template/vendor/matt-pocock/engineering/improve-codebase-architecture/SKILL.md +66 -0
  71. package/template/vendor/matt-pocock/engineering/prototype/LOGIC.md +79 -0
  72. package/template/vendor/matt-pocock/engineering/prototype/SKILL.md +30 -0
  73. package/template/vendor/matt-pocock/engineering/prototype/UI.md +112 -0
  74. package/template/vendor/matt-pocock/engineering/research/SKILL.md +12 -0
  75. package/template/vendor/matt-pocock/engineering/resolving-merge-conflicts/SKILL.md +14 -0
  76. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/SKILL.md +127 -0
  77. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/domain.md +51 -0
  78. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-github.md +45 -0
  79. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
  80. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
  81. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
  82. package/template/vendor/matt-pocock/engineering/tdd/SKILL.md +36 -0
  83. package/template/vendor/matt-pocock/engineering/tdd/mocking.md +59 -0
  84. package/template/vendor/matt-pocock/engineering/tdd/tests.md +77 -0
  85. package/template/vendor/matt-pocock/engineering/to-spec/SKILL.md +75 -0
  86. package/template/vendor/matt-pocock/engineering/to-tickets/SKILL.md +113 -0
  87. package/template/vendor/matt-pocock/engineering/triage/AGENT-BRIEF.md +204 -0
  88. package/template/vendor/matt-pocock/engineering/triage/OUT-OF-SCOPE.md +104 -0
  89. package/template/vendor/matt-pocock/engineering/triage/SKILL.md +112 -0
  90. package/template/vendor/matt-pocock/engineering/wayfinder/SKILL.md +127 -0
  91. package/template/vendor/matt-pocock/in-progress/README.md +10 -0
  92. package/template/vendor/matt-pocock/in-progress/claude-handoff/SKILL.md +18 -0
  93. package/template/vendor/matt-pocock/in-progress/loop-me/SKILL.md +32 -0
  94. package/template/vendor/matt-pocock/in-progress/wizard/SKILL.md +45 -0
  95. package/template/vendor/matt-pocock/in-progress/wizard/template.sh +211 -0
  96. package/template/vendor/matt-pocock/in-progress/writing-beats/SKILL.md +67 -0
  97. package/template/vendor/matt-pocock/in-progress/writing-fragments/SKILL.md +78 -0
  98. package/template/vendor/matt-pocock/in-progress/writing-shape/SKILL.md +79 -0
  99. package/template/vendor/matt-pocock/productivity/README.md +18 -0
  100. package/template/vendor/matt-pocock/productivity/grill-me/SKILL.md +7 -0
  101. package/template/vendor/matt-pocock/productivity/grilling/SKILL.md +12 -0
  102. package/template/vendor/matt-pocock/productivity/handoff/SKILL.md +16 -0
  103. package/template/vendor/matt-pocock/productivity/teach/GLOSSARY-FORMAT.md +35 -0
  104. package/template/vendor/matt-pocock/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
  105. package/template/vendor/matt-pocock/productivity/teach/MISSION-FORMAT.md +31 -0
  106. package/template/vendor/matt-pocock/productivity/teach/RESOURCES-FORMAT.md +32 -0
  107. package/template/vendor/matt-pocock/productivity/teach/SKILL.md +140 -0
  108. package/template/vendor/matt-pocock/productivity/writing-great-skills/GLOSSARY.md +201 -0
  109. package/template/vendor/matt-pocock/productivity/writing-great-skills/SKILL.md +83 -0
  110. package/template/workflows/matt-pocock/WORKFLOW.md +145 -0
  111. package/template/workflows/matt-pocock/_state/status.json +5 -0
  112. package/template/workflows/matt-pocock/routes/architecture.md +24 -0
  113. package/template/workflows/matt-pocock/routes/diagnose.md +22 -0
  114. package/template/workflows/matt-pocock/routes/experimental.md +18 -0
  115. package/template/workflows/matt-pocock/routes/idea-to-delivery.md +63 -0
  116. package/template/workflows/matt-pocock/routes/merge-conflicts.md +19 -0
  117. package/template/workflows/matt-pocock/routes/productivity.md +25 -0
  118. package/template/workflows/matt-pocock/routes/research-prototype.md +20 -0
  119. package/template/workflows/matt-pocock/routes/review.md +19 -0
  120. package/template/workflows/matt-pocock/routes/setup.md +42 -0
  121. package/template/workflows/matt-pocock/routes/triage.md +25 -0
  122. package/template/workflows/matt-pocock/routes/wayfinder.md +27 -0
  123. package/template/workflows/person/M-mao-zedong-cognitive-os/M-mao-zedong-cognitive-os.md +74 -59
  124. package/template/workflows/person/M-mao-zedong-cognitive-os/activate.md +2 -2
  125. package/template/workflows/person/M-mao-zedong-cognitive-os/deliver.md +5 -5
  126. package/template/workflows/person/M-mao-zedong-cognitive-os/diagnose.md +2 -2
  127. package/template/workflows/person/M-mao-zedong-cognitive-os/mobilize.md +4 -4
  128. package/template/workflows/person/M-mao-zedong-cognitive-os/strategize.md +3 -3
  129. package/template/workflows/person/WORKFLOW.md +68 -0
  130. package/template/workflows/person/_state/.config/LESSONS.md +3 -0
  131. package/template/workflows/person/_state/.config/RULES.md +3 -0
  132. package/template/workflows/person/_state/changes/.gitkeep +1 -0
  133. package/template/workflows/person/_state/status.json +5 -0
  134. package/template/.speculo/.config/LESSONS.md +0 -9
  135. package/template/.speculo/.config/RULES.md +0 -11
  136. package/template/.speculo/AGENTS.md +0 -30
  137. package/template/.speculo/archive/AGENTS.md +0 -28
  138. package/template/.speculo/archive/dev/.gitkeep +0 -0
  139. package/template/.speculo/archive/person/.gitkeep +0 -0
  140. package/template/.speculo/dev/.gitkeep +0 -0
  141. package/template/.speculo/dev/docs-sync-state.json +0 -14
  142. package/template/.speculo/dev-status.json +0 -3
  143. package/template/.speculo/doc-status.json +0 -3
  144. package/template/.speculo/person/.gitkeep +0 -0
  145. package/template/.speculo/person-status.json +0 -1
  146. package/template/commands/archive.md +0 -68
  147. package/template/commands/caveman.md +0 -50
  148. package/template/commands/config-prune.md +0 -59
  149. package/template/commands/grill-me.md +0 -48
  150. package/template/commands/handoff.md +0 -59
  151. package/template/commands/scaffold-exercises.md +0 -56
  152. package/template/commands/write-a-skill.md +0 -52
  153. package/template/skills/caveman/SKILL.md +0 -38
  154. package/template/skills/caveman/references/compression-rules.md +0 -102
  155. package/template/skills/config-prune/SKILL.md +0 -44
  156. package/template/skills/config-prune/references/audit-rules.md +0 -38
  157. package/template/skills/grill-me/SKILL.md +0 -40
  158. package/template/skills/handoff/SKILL.md +0 -73
  159. package/template/skills/scaffold-exercises/SKILL.md +0 -41
  160. package/template/skills/scaffold-exercises/references/exercise-structure.md +0 -85
  161. package/template/skills/scaffold-exercises/references/lint-and-git.md +0 -54
  162. package/template/skills/speculo-write/SKILL.md +0 -56
  163. package/template/skills/speculo-write/references/asset-selection-sop.md +0 -67
  164. package/template/skills/speculo-write/references/authoring-quality-levers.md +0 -61
  165. package/template/skills/speculo-write/references/command-authoring-sop.md +0 -98
  166. package/template/skills/speculo-write/references/migration-sop.md +0 -101
  167. package/template/skills/speculo-write/references/persistence-contract-sop.md +0 -271
  168. package/template/skills/speculo-write/references/skill-authoring-sop.md +0 -212
  169. package/template/skills/speculo-write/references/validation-checklist.md +0 -85
  170. package/template/skills/speculo-write/references/workflow-authoring-sop.md +0 -165
  171. package/template/vendor/codebase-design/DEEPENING.md +0 -37
  172. package/template/vendor/codebase-design/DESIGN-IT-TWICE.md +0 -44
  173. package/template/vendor/codebase-design/SKILL.md +0 -114
  174. package/template/vendor/officecli/SKILL.md +0 -415
  175. package/template/vendor/resolving-merge-conflicts/SKILL.md +0 -14
  176. package/template/workflows/dev/01-grill-with-docs/01-grill-with-docs.md +0 -107
  177. package/template/workflows/dev/01-grill-with-docs/grill-context-scan.md +0 -30
  178. package/template/workflows/dev/01-grill-with-docs/grill-decision.md +0 -38
  179. package/template/workflows/dev/02-prd/02-prd.md +0 -70
  180. package/template/workflows/dev/02-prd/prd-synthesis.md +0 -30
  181. package/template/workflows/dev/02-prd/prd-zoom-out.md +0 -29
  182. package/template/workflows/dev/03-tdd/03-tdd.md +0 -55
  183. package/template/workflows/dev/03-tdd/agents/tdd-finish-agent.md +0 -34
  184. package/template/workflows/dev/03-tdd/agents/tdd-implement-agent.md +0 -34
  185. package/template/workflows/dev/03-tdd/agents/tdd-plan-agent.md +0 -34
  186. package/template/workflows/dev/03-tdd/mocking.md +0 -43
  187. package/template/workflows/dev/03-tdd/refactoring.md +0 -10
  188. package/template/workflows/dev/03-tdd/tdd-finish.md +0 -34
  189. package/template/workflows/dev/03-tdd/tdd-loop.md +0 -36
  190. package/template/workflows/dev/03-tdd/tdd-plan.md +0 -37
  191. package/template/workflows/dev/03-tdd/tests.md +0 -61
  192. package/template/workflows/dev/04-finalize/04-finalize.md +0 -57
  193. package/template/workflows/dev/04-finalize/agents/completion-gate-agent.md +0 -35
  194. package/template/workflows/dev/04-finalize/completion-gate.md +0 -41
  195. package/template/workflows/dev/04-finalize/finalize-archive.md +0 -55
  196. package/template/workflows/dev/A-improve-architecture/A-improve-architecture.md +0 -60
  197. package/template/workflows/dev/A-improve-architecture/HTML-REPORT.md +0 -123
  198. package/template/workflows/dev/A-improve-architecture/architecture-grill.md +0 -30
  199. package/template/workflows/dev/A-improve-architecture/architecture-review.md +0 -29
  200. package/template/workflows/dev/A-improve-architecture/architecture-scan.md +0 -37
  201. package/template/workflows/dev/AGENTS.md +0 -95
  202. package/template/workflows/dev/D-docs-sync/D-docs-sync.md +0 -140
  203. package/template/workflows/dev/D-docs-sync/agents/docs-diff-agent.md +0 -34
  204. package/template/workflows/dev/D-docs-sync/agents/docs-update-agent.md +0 -34
  205. package/template/workflows/dev/D-docs-sync/agents-contract.md +0 -95
  206. package/template/workflows/dev/D-docs-sync/changelog-contract.md +0 -155
  207. package/template/workflows/dev/D-docs-sync/config-contract.md +0 -75
  208. package/template/workflows/dev/D-docs-sync/docs-sync-diff.md +0 -86
  209. package/template/workflows/dev/D-docs-sync/docs-sync-finish.md +0 -37
  210. package/template/workflows/dev/D-docs-sync/docs-sync-state.md +0 -47
  211. package/template/workflows/dev/D-docs-sync/docs-sync-update.md +0 -44
  212. package/template/workflows/dev/D-docs-sync/knowledge-extract.md +0 -66
  213. package/template/workflows/dev/D-docs-sync/readme-contract.md +0 -124
  214. package/template/workflows/dev/D-docs-sync/state-json-schema.md +0 -172
  215. package/template/workflows/dev/H-diagnose/H-diagnose.md +0 -108
  216. package/template/workflows/dev/H-diagnose/agents/diagnose-agent.md +0 -33
  217. package/template/workflows/dev/H-diagnose/agents/fix-agent.md +0 -34
  218. package/template/workflows/dev/H-diagnose/diagnose-fix.md +0 -34
  219. package/template/workflows/dev/H-diagnose/diagnose-guide.md +0 -144
  220. package/template/workflows/dev/H-diagnose/diagnose-loop.md +0 -41
  221. package/template/workflows/dev/H-diagnose/scripts/hitl-loop.template.sh +0 -41
  222. package/template/workflows/dev/I-to-issues/I-to-issues.md +0 -79
  223. package/template/workflows/dev/I-to-issues/issues-slices.md +0 -211
  224. package/template/workflows/dev/M-domain-modeling/ADR-FORMAT.md +0 -74
  225. package/template/workflows/dev/M-domain-modeling/CONTEXT-FORMAT.md +0 -67
  226. package/template/workflows/dev/M-domain-modeling/M-domain-modeling.md +0 -102
  227. package/template/workflows/dev/R-review/R-review.md +0 -75
  228. package/template/workflows/dev/R-review/agents/engineering-review-agent.md +0 -33
  229. package/template/workflows/dev/R-review/agents/spec-review-agent.md +0 -34
  230. package/template/workflows/dev/R-review/agents/standards-review-agent.md +0 -34
  231. package/template/workflows/dev/R-review/code-quality-checklist.md +0 -118
  232. package/template/workflows/dev/R-review/removal-checklist.md +0 -53
  233. package/template/workflows/dev/R-review/review-axes.md +0 -61
  234. package/template/workflows/dev/R-review/review-setup.md +0 -111
  235. package/template/workflows/dev/R-review/review-verdict.md +0 -43
  236. package/template/workflows/dev/R-review/security-checklist.md +0 -126
  237. package/template/workflows/dev/R-review/solid-checklist.md +0 -73
  238. package/template/workflows/dev/_templates/diagnosis-template.md +0 -20
  239. package/template/workflows/dev/_templates/docs-sync-report-template.md +0 -45
  240. package/template/workflows/dev/_templates/docs-sync-state-template.json +0 -14
  241. package/template/workflows/dev/_templates/domain-model-log-template.md +0 -20
  242. package/template/workflows/dev/_templates/grill-context-map-template.md +0 -20
  243. package/template/workflows/dev/_templates/grill-decision-log-template.md +0 -20
  244. package/template/workflows/dev/_templates/issues-slices-template.md +0 -106
  245. package/template/workflows/dev/_templates/overview-template.md +0 -19
  246. package/template/workflows/dev/_templates/prd-template.md +0 -26
  247. package/template/workflows/dev/_templates/regression-template.md +0 -20
  248. package/template/workflows/dev/_templates/review-report-template.md +0 -30
  249. package/template/workflows/dev/_templates/review-sources-template.md +0 -33
  250. package/template/workflows/dev/_templates/review-verdict-template.md +0 -33
  251. package/template/workflows/dev/_templates/tdd-log-template.md +0 -23
  252. package/template/workflows/dev/_templates/tdd-plan-template.md +0 -35
  253. package/template/workflows/dev/_templates/tdd-verification-template.md +0 -26
  254. package/template/workflows/doc/AGENTS.md +0 -80
  255. package/template/workflows/doc/B-writing-beats/B-writing-beats.md +0 -79
  256. package/template/workflows/doc/B-writing-beats/writing-beats-append.md +0 -31
  257. package/template/workflows/doc/B-writing-beats/writing-beats-options.md +0 -29
  258. package/template/workflows/doc/E-edit-article/E-edit-article.md +0 -79
  259. package/template/workflows/doc/E-edit-article/edit-article-plan.md +0 -30
  260. package/template/workflows/doc/E-edit-article/edit-article-rewrite.md +0 -31
  261. package/template/workflows/doc/F-writing-fragments/F-writing-fragments.md +0 -80
  262. package/template/workflows/doc/F-writing-fragments/writing-fragments-interview.md +0 -32
  263. package/template/workflows/doc/F-writing-fragments/writing-fragments-log.md +0 -29
  264. package/template/workflows/doc/S-writing-shape/S-writing-shape.md +0 -81
  265. package/template/workflows/doc/S-writing-shape/writing-shape-block.md +0 -32
  266. package/template/workflows/doc/S-writing-shape/writing-shape-opening.md +0 -27
  267. package/template/workflows/doc/T-teach/T-teach.md +0 -64
  268. package/template/workflows/doc/T-teach/teach-lesson-wrap.md +0 -63
  269. package/template/workflows/doc/T-teach/teach-lesson.md +0 -53
  270. package/template/workflows/doc/T-teach/teach-mission.md +0 -33
  271. package/template/workflows/doc/T-teach/teach-resources.md +0 -36
  272. package/template/workflows/doc/_templates/edit-article-plan-template.md +0 -25
  273. package/template/workflows/doc/_templates/edit-article-template.md +0 -7
  274. package/template/workflows/doc/_templates/teach-glossary-template.md +0 -26
  275. package/template/workflows/doc/_templates/teach-learning-record-template.md +0 -38
  276. package/template/workflows/doc/_templates/teach-lesson-html-template.md +0 -24
  277. package/template/workflows/doc/_templates/teach-mission-template.md +0 -19
  278. package/template/workflows/doc/_templates/teach-resources-template.md +0 -18
  279. package/template/workflows/doc/_templates/writing-article-template.md +0 -7
  280. package/template/workflows/doc/_templates/writing-beat-options-template.md +0 -21
  281. package/template/workflows/doc/_templates/writing-fragments-template.md +0 -7
  282. package/template/workflows/doc/_templates/writing-interview-log-template.md +0 -21
  283. package/template/workflows/doc/_templates/writing-shape-log-template.md +0 -25
  284. package/template/workflows/person/AGENTS.md +0 -72
  285. /package/template/{.speculo/.config/adr → workflows/matt-pocock/_state/archive}/.gitkeep +0 -0
  286. /package/template/{.speculo/.config/context → workflows/matt-pocock/_state/changes}/.gitkeep +0 -0
  287. /package/template/{.speculo/archive/doc → workflows/person/_state/.config/context}/.gitkeep +0 -0
  288. /package/template/{.speculo/doc → workflows/person/_state/archive}/.gitkeep +0 -0
@@ -0,0 +1,77 @@
1
+ # 好的测试与坏的测试
2
+
3
+ ## 好的测试
4
+
5
+ **集成风格**:通过真实接口测试,而非 mock 内部部件。
6
+
7
+ ```typescript
8
+ // 好:测试可观察的行为
9
+ test("user can checkout with valid cart", async () => {
10
+ const cart = createCart();
11
+ cart.add(product);
12
+ const result = await checkout(cart, paymentMethod);
13
+ expect(result.status).toBe("confirmed");
14
+ });
15
+ ```
16
+
17
+ 特征:
18
+
19
+ - 测试用户/调用方关心的行为
20
+ - 仅使用公共 API
21
+ - 经受住内部重构
22
+ - 描述 WHAT(做什么),而非 HOW(怎么做)
23
+ - 每个测试一个逻辑断言
24
+
25
+ ## 坏的测试
26
+
27
+ **实现细节测试**:与内部结构耦合。
28
+
29
+ ```typescript
30
+ // 坏:测试实现细节
31
+ test("checkout calls paymentService.process", async () => {
32
+ const mockPayment = jest.mock(paymentService);
33
+ await checkout(cart, payment);
34
+ expect(mockPayment.process).toHaveBeenCalledWith(cart.total);
35
+ });
36
+ ```
37
+
38
+ 危险信号:
39
+
40
+ - Mock 内部协作者
41
+ - 测试私有方法
42
+ - 断言调用次数/顺序
43
+ - 重构时测试失败但没有行为变化
44
+ - 测试名称描述 HOW 而非 WHAT
45
+ - 通过外部手段而非接口进行验证
46
+
47
+ ```typescript
48
+ // 坏:绕过接口进行验证
49
+ test("createUser saves to database", async () => {
50
+ await createUser({ name: "Alice" });
51
+ const row = await db.query("SELECT * FROM users WHERE name = ?", ["Alice"]);
52
+ expect(row).toBeDefined();
53
+ });
54
+
55
+ // 好:通过接口进行验证
56
+ test("createUser makes user retrievable", async () => {
57
+ const user = await createUser({ name: "Alice" });
58
+ const retrieved = await getUser(user.id);
59
+ expect(retrieved.name).toBe("Alice");
60
+ });
61
+ ```
62
+
63
+ **同义反复测试**:预期值重述了实现,因此测试在构造上就通过了。
64
+
65
+ ```typescript
66
+ // 坏:预期值以与代码计算方式相同的方式重新计算
67
+ test("calculateTotal sums line items", () => {
68
+ const items = [{ price: 10 }, { price: 5 }];
69
+ const expected = items.reduce((sum, i) => sum + i.price, 0);
70
+ expect(calculateTotal(items)).toBe(expected);
71
+ });
72
+
73
+ // 好:预期值是独立的、已知的字面量
74
+ test("calculateTotal sums line items", () => {
75
+ expect(calculateTotal([{ price: 10 }, { price: 5 }])).toBe(15);
76
+ });
77
+ ```
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: to-spec
3
+ description: "将当前对话转化为 spec 并发布到项目 issue tracker —— 无需访谈,仅综合你们已讨论过的内容。"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ 此技能读取当前对话上下文和代码库理解,产出一份 spec(你可能也称之为 PRD)。不要访谈用户 —— 仅综合你已经知道的内容。
8
+
9
+ Issue tracker 和 triage 标签词汇表应已提供给你 —— 如果没有,运行 `/setup-matt-pocock-skills`。
10
+
11
+ ## 流程
12
+
13
+ 1. 探索仓库以了解代码库的当前状态(如果尚未这样做)。在整个 spec 中使用项目的领域词汇表,并尊重所涉及区域的任何 ADR。
14
+
15
+ 2. 草拟你将用于测试该功能的接缝(seam)。优先使用现有接缝而不是新建。使用尽可能高层的接缝。如果需要新接缝,在尽可能高的层级提出。代码库中的接缝越少越好 —— 理想数量是 1 个。
16
+
17
+ 与用户确认这些接缝是否符合他们的期望。
18
+
19
+ 3. 使用以下模板编写 spec,然后发布到项目 issue tracker。应用 `ready-for-agent` triage 标签 —— 无需额外 triage。
20
+
21
+ <spec-template>
22
+
23
+ ## 问题陈述
24
+
25
+ 从用户视角描述用户面临的问题。
26
+
27
+ ## 解决方案
28
+
29
+ 从用户视角描述问题的解决方案。
30
+
31
+ ## 用户故事
32
+
33
+ 一个详细的、编号的用户故事列表。每个用户故事格式为:
34
+
35
+ 1. 作为 <角色>,我希望 <功能>,以便 <收益>
36
+
37
+ <user-story-example>
38
+ 1. 作为手机银行客户,我希望查看账户余额,以便做出更明智的消费决策
39
+ </user-story-example>
40
+
41
+ 用户故事列表应极其详尽,涵盖该功能的所有方面。
42
+
43
+ ## 实现决策
44
+
45
+ 已做出的实现决策列表。可包含:
46
+
47
+ - 将构建/修改的模块
48
+ - 这些模块将被修改的接口
49
+ - 开发者的技术澄清
50
+ - 架构决策
51
+ - Schema 变更
52
+ - API 契约
53
+ - 具体交互
54
+
55
+ 不要包含具体文件路径或代码片段。它们可能很快过时。
56
+
57
+ 例外:如果原型产生了一个代码片段,它比文字更精确地编码了一个决策(状态机、reducer、schema、类型结构),将其内联在相关决策中,并简要注明来自原型。精简到富含决策的部分 —— 不是可运行的演示,只是关键部分。
58
+
59
+ ## 测试决策
60
+
61
+ 已做出的测试决策列表。包含:
62
+
63
+ - 什么构成好测试的描述(只测试外部行为,不测试实现细节)
64
+ - 哪些模块将被测试
65
+ - 测试的先例(即代码库中类似类型的测试)
66
+
67
+ ## 超出范围
68
+
69
+ 描述此 spec 超出范围的内容。
70
+
71
+ ## 补充说明
72
+
73
+ 关于该功能的任何补充说明。
74
+
75
+ </spec-template>
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: to-tickets
3
+ description: "将计划、spec 或当前对话拆分为一组曳光弹式 tickets,每个 ticket 声明其阻塞边,发布到已配置的 tracker —— 对于本地文件,边以文本形式呈现;对于真实 tracker,使用原生阻塞链接。"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # 转为 Tickets
8
+
9
+ 将计划、spec 或对话拆分为一组 **tickets** —— 曳光弹式垂直切片,每个 ticket 声明**阻塞**它的那些 tickets。
10
+
11
+ Issue tracker 和 triage 标签词汇表应已提供给你 —— 如果没有,运行 `/setup-matt-pocock-skills`。
12
+
13
+ ## 流程
14
+
15
+ ### 1. 收集上下文
16
+
17
+ 基于对话上下文中已有的内容进行工作。如果用户将某个引用(spec 路径、issue 编号或 URL)作为参数传入,拉取它并读取其完整正文和评论。
18
+
19
+ ### 2. 探索代码库(可选)
20
+
21
+ 如果尚未探索代码库,进行探索以了解代码的当前状态。Ticket 标题和描述应使用项目的领域词汇表,并尊重所涉及区域的 ADR。
22
+
23
+ 寻找预重构(prefactor)的机会,使实现更简单。"让变更变容易,然后做容易的变更。"
24
+
25
+ ### 3. 草拟垂直切片
26
+
27
+ 将工作拆分为**曳光弹** tickets。
28
+
29
+ <vertical-slice-rules>
30
+
31
+ - 每个切片横向切穿每一层(schema、API、UI、测试),是一条窄但**完整**的路径 —— 是垂直切片,不是某一层的水平切片
32
+ - 一个完成的切片可以独立演示或验证
33
+ - 每个切片的大小适配单个全新上下文窗口
34
+ - 任何预重构应最先完成
35
+
36
+ </vertical-slice-rules>
37
+
38
+ 为每个 ticket 标注其**阻塞边** —— 即必须在它开始之前完成的其他 tickets。没有阻塞边的 ticket 可以立即开始。
39
+
40
+ **宽重构是垂直切片的例外。** **宽重构**是指一个机械性变更 —— 重命名字段、修改共享符号的类型 —— 其**影响范围**辐射整个代码库,因此单次编辑会破坏数千个调用点,任何垂直切片都无法以绿色状态落地。不要强行将其塞入曳光弹;应将其排序为**扩展-收缩**序列。首先扩展:在旧形式旁边添加新形式,使一切不中断。然后按影响范围分批迁移调用点(按包、按目录),每批是一个由扩展阶段阻塞的独立 ticket,保持 CI 逐批绿色,因为旧形式仍然存在。最后收缩:当没有调用方残留时删除旧形式,由一个由所有迁移批次阻塞的 ticket 负责。当连批次本身都无法独立保持绿色时,保持排序不变,但让它们共享一个集成分支,所有批次共同阻塞一个最终的集成验证 ticket —— 绿色仅在该处得到承诺。
41
+
42
+ ### 4. 与用户核对
43
+
44
+ 以编号列表形式呈现提议的拆分方案。对于每个 ticket,展示:
45
+
46
+ - **标题**:简短的描述性名称
47
+ - **被阻塞于**:必须首先完成的其他 tickets(如有)
48
+ - **它交付什么**:此 ticket 使哪些端到端行为可用
49
+
50
+ 询问用户:
51
+
52
+ - 粒度是否合适?(太粗 / 太细)
53
+ - 阻塞边是否正确 —— 每个 ticket 是否只依赖于真正阻碍它的 tickets?
54
+ - 是否有 tickets 应合并或进一步拆分?
55
+
56
+ 迭代直到用户批准拆分方案。
57
+
58
+ ### 5. 将 tickets 发布到已配置的 tracker
59
+
60
+ 发布已批准的 tickets。**如何**发布取决于 `/setup-matt-pocock-skills` 配置的 tracker —— 无论哪种方式 tickets 都相同,只有阻塞边的形式不同:
61
+
62
+ - **本地文件** → 在仓库根目录写入一个 `tickets.md`,按依赖顺序排列所有 tickets(阻塞者在前),每个 ticket 的"被阻塞于"列出它所依赖的标题。使用下面的文件模板。
63
+ - **真实 issue tracker(GitHub、Linear 等)** → 按依赖顺序(阻塞者在前)为每个 ticket 发布一个 issue,以便每个 ticket 的阻塞边可以引用真实标识符。使用平台的原生阻塞/子 issue 关系(如果有的话);否则将每个 ticket 的"被阻塞于"设置为阻塞它的 issues。除非另有指示,应用 `ready-for-agent` triage 标签 —— 这些 tickets 在构造上就是 agent 可领取的。
64
+
65
+ 不要关闭或修改任何父 issue。
66
+
67
+ <tickets-file-template>
68
+
69
+ # Tickets:<工作的简短名称>
70
+
71
+ 一句话总结这些 tickets 构建的内容。如果有来源 spec,引用它。
72
+
73
+ 从**前沿**开始工作:找到所有阻塞边已完成的 tickets。对于纯线性链,这意味着从上到下。
74
+
75
+ ## <Ticket 标题>
76
+
77
+ **要构建什么:** 此 ticket 使哪些端到端行为可用,从用户视角 —— 不是逐层实现清单。
78
+
79
+ **被阻塞于:** 阻碍此 ticket 的 tickets 标题,或"无 —— 可立即开始"。
80
+
81
+ - [ ] 验收标准 1
82
+ - [ ] 验收标准 2
83
+
84
+ ## <Ticket 标题>
85
+
86
+ ...
87
+
88
+ </tickets-file-template>
89
+
90
+ <issue-template>
91
+
92
+ ## 父 issue
93
+
94
+ 对 tracker 上父 issue 的引用(如果来源是已有 issue,否则省略此节)。
95
+
96
+ ## 要构建什么
97
+
98
+ 此 ticket 使哪些端到端行为可用,从用户视角 —— 不是逐层实现。
99
+
100
+ ## 验收标准
101
+
102
+ - [ ] 标准 1
103
+ - [ ] 标准 2
104
+
105
+ ## 被阻塞于
106
+
107
+ - 对每个阻塞 ticket 的引用,或"无 —— 可立即开始"。
108
+
109
+ </issue-template>
110
+
111
+ 无论哪种形式,避免具体文件路径或代码片段 —— 它们会很快过时。例外:如果原型产生了一个代码片段,它比文字更精确地编码了一个决策(状态机、reducer、schema、类型结构),将其内联并简要注明来自原型。精简到富含决策的部分 —— 不是可运行的演示,只是关键部分。
112
+
113
+ 使用 `/implement` 逐个处理前沿上的 tickets,ticket 之间清空上下文。
@@ -0,0 +1,204 @@
1
+ # 编写 Agent 简报
2
+
3
+ Agent 简报是一段结构化的评论,在 issue 或 PR 进入 `ready-for-agent` 状态时发布到 GitHub issue 或 PR 上。它是离线 Agent 将依据的权威规范。原始正文和讨论是上下文 — Agent 简报是契约。
4
+
5
+ 简报陈述了 **Agent 应该做什么**,这延伸到两种处理面:对于 issue,是从零开始构建变更;对于 PR,是对*现有 diff* 的剩余工作 — 完成它、填补缺口、处理审查意见。无论哪种处理面,原则相同;下面的 PR 示例展示了差异。
6
+
7
+ ## 原则
8
+
9
+ ### 持久性优先于精确性
10
+
11
+ Issue 可能在 `ready-for-agent` 状态下停留数天或数周。代码库在此期间会发生变化。编写简报时要确保即使在文件被重命名、移动或重构后仍然有用。
12
+
13
+ - **要**描述接口、类型和行为契约
14
+ - **要**命名 Agent 应该查找或修改的特定类型、函数签名或配置形态
15
+ - **不要**引用文件路径 — 它们会过时
16
+ - **不要**引用行号
17
+ - **不要**假设当前实现结构将保持不变
18
+
19
+ ### 行为性,而非过程性
20
+
21
+ 描述系统**应该做什么**,而非**如何**实现。Agent 将重新探索代码库并做出自己的实现决策。
22
+
23
+ - **好的:** "`SkillConfig` 类型应该接受一个可选的 `schedule` 字段,类型为 `CronExpression`"
24
+ - **坏的:** "打开 src/types/skill.ts 并在第 42 行添加一个 schedule 字段"
25
+ - **好的:** "当用户不带参数运行 `/triage` 时,他们应该看到一个需要关注的 issue 摘要"
26
+ - **坏的:** "在主处理函数中添加一个 switch 语句"
27
+
28
+ ### 完整的验收标准
29
+
30
+ Agent 需要知道何时完成。每个 Agent 简报必须有具体的、可测试的验收标准。每个标准应可独立验证。
31
+
32
+ - **好的:** "运行 `gh issue list --label needs-triage` 返回已经过初始分类的 issue"
33
+ - **坏的:** "分类应该正常工作"
34
+
35
+ ### 明确的范围边界
36
+
37
+ 说明哪些内容不在范围内。这可以防止 Agent 画蛇添足或对相邻功能做出假设。
38
+
39
+ ## 模板
40
+
41
+ ```markdown
42
+ ## Agent Brief
43
+
44
+ **Category:** bug / enhancement
45
+ **Summary:** 需要完成的事项的一句话描述
46
+
47
+ **Current behavior:**
48
+ 描述当前发生的情况。对于 bug,这是有问题的行为。
49
+ 对于增强,这是该功能建立在其上的现状。
50
+
51
+ **Desired behavior:**
52
+ 描述 Agent 工作完成后应该发生的情况。
53
+ 具体说明边界情况和错误条件。
54
+
55
+ **Key interfaces:**
56
+ - `TypeName` — 需要改变什么以及为什么
57
+ - `functionName()` 返回类型 — 当前返回什么以及应该返回什么
58
+ - 配置形态 — 任何需要的新配置选项
59
+
60
+ **Acceptance criteria:**
61
+ - [ ] 具体的、可测试的标准 1
62
+ - [ ] 具体的、可测试的标准 2
63
+ - [ ] 具体的、可测试的标准 3
64
+
65
+ **Out of scope:**
66
+ - 不应在此 issue 中改变或处理的事项
67
+ - 看似相关但独立的相邻功能
68
+ ```
69
+
70
+ ## 示例
71
+
72
+ ### 好的 Agent 简报(bug)
73
+
74
+ ```markdown
75
+ ## Agent Brief
76
+
77
+ **Category:** bug
78
+ **Summary:** Skill 描述截断在单词中间断开,产生破碎的输出
79
+
80
+ **Current behavior:**
81
+ 当 skill 描述超过 1024 个字符时,它被精确地在 1024 个字符处截断,
82
+ 不考虑单词边界。这会产生在单词中间断开的描述
83
+ (例如"confi")。
84
+
85
+ **Desired behavior:**
86
+ 截断应在 1024 个字符之前的最后一个单词边界处断行,
87
+ 并追加"..."以指示截断。
88
+
89
+ **Key interfaces:**
90
+ - `SkillMetadata` 类型的 `description` 字段 — 不需要类型变更,
91
+ 但填充它的验证/处理逻辑需要尊重单词边界
92
+ - 任何读取 SKILL.md 前置元数据并提取描述的函数
93
+
94
+ **Acceptance criteria:**
95
+ - [ ] 低于 1024 个字符的描述保持不变
96
+ - [ ] 超过 1024 个字符的描述在 1024 个字符之前的
97
+ 最后一个单词边界处截断
98
+ - [ ] 被截断的描述以"..."结束
99
+ - [ ] 包括"..."的总长度不超过 1024 个字符
100
+
101
+ **Out of scope:**
102
+ - 更改 1024 个字符的限制本身
103
+ - 多行描述支持
104
+ ```
105
+
106
+ ### 好的 Agent 简报(增强)
107
+
108
+ ```markdown
109
+ ## Agent Brief
110
+
111
+ **Category:** enhancement
112
+ **Summary:** 添加 `.out-of-scope/` 目录支持以跟踪被拒绝的功能请求
113
+
114
+ **Current behavior:**
115
+ 当功能请求被拒绝时,issue 以 `wontfix` 标签和一条评论关闭。
116
+ 没有对决策或理由的持久记录。
117
+ 未来类似的请求需要维护者回忆或搜索之前的讨论。
118
+
119
+ **Desired behavior:**
120
+ 被拒绝的功能请求应记录在 `.out-of-scope/<concept>.md`
121
+ 文件中,捕获决策、理由以及所有请求该功能的 issue 链接。
122
+ 在分类新 issue 时,应检查这些文件以查找匹配项。
123
+
124
+ **Key interfaces:**
125
+ - `.out-of-scope/` 中的 Markdown 文件格式 — 每个文件应有
126
+ 一个 `# Concept Name` 标题、一个 `**Decision:**` 行、一个 `**Reason:**` 行
127
+ 以及一个包含 issue 链接的 `**Prior requests:**` 列表
128
+ - 分类工作流应尽早读取所有 `.out-of-scope/*.md` 文件
129
+ 并通过概念相似性将新 issue 与它们匹配
130
+
131
+ **Acceptance criteria:**
132
+ - [ ] 以 wontfix 关闭功能请求会创建/更新 `.out-of-scope/` 中的文件
133
+ - [ ] 文件包含决策、理由以及指向已关闭 issue 的链接
134
+ - [ ] 如果匹配的 `.out-of-scope/` 文件已存在,新 issue 被追加到
135
+ 其"Prior requests"列表中,而非创建重复文件
136
+ - [ ] 分类期间,现有 `.out-of-scope/` 文件被检查并在新 issue
137
+ 匹配之前的拒绝时被呈现出来
138
+
139
+ **Out of scope:**
140
+ - 自动匹配(人工确认匹配)
141
+ - 重新打开之前被拒绝的功能
142
+ - Bug 报告(只有增强的拒绝才进入 `.out-of-scope/`)
143
+ ```
144
+
145
+ ### 好的 Agent 简报(PR)
146
+
147
+ 对于 PR,"Current behavior" 描述 diff 的状态,简报要求 Agent 完成或修复它,而非从零构建。
148
+
149
+ ```markdown
150
+ ## Agent Brief
151
+
152
+ **Category:** enhancement
153
+ **Summary:** 完成贡献者针对 `triage list` 的 `--json` 输出标志
154
+
155
+ **Current behavior:**
156
+ 该 PR 添加了一个 `--json` 标志,将 issue 列表序列化为 JSON。正常
157
+ 路径工作正常,diff 匹配项目的命令结构。还有两个缺口
158
+ 未完成:错误仍然以人类文本(非 JSON)打印,且新标志
159
+ 没有测试覆盖。
160
+
161
+ **Desired behavior:**
162
+ 使用 `--json` 时,所有输出 — 包括错误 — 是 stdout 上的格式良好的 JSON,
163
+ 且命令的退出代码不变。当标志缺失时,现有的人类可读输出
164
+ 不受影响。
165
+
166
+ **Key interfaces:**
167
+ - 命令的错误路径在 `--json` 下应发出 `{ "error": string }`
168
+ 而非纯文本错误
169
+ - 复用 PR 中已添加的现有序列化器;不要引入第二个
170
+
171
+ **Acceptance criteria:**
172
+ - [ ] `triage list --json` 对成功和错误情况都发出有效的 JSON
173
+ - [ ] 退出代码匹配非 JSON 命令
174
+ - [ ] 测试覆盖 `--json` 成功输出和一个错误情况
175
+ - [ ] 默认(非 JSON)输出逐字节不变
176
+
177
+ **Out of scope:**
178
+ - 为任何其他命令添加 `--json`
179
+ - 更改 PR 中已定义的 JSON 成功负载的形状
180
+ ```
181
+
182
+ ### 坏的 Agent 简报
183
+
184
+ ```markdown
185
+ ## Agent Brief
186
+
187
+ **Summary:** 修复分类 bug
188
+
189
+ **What to do:**
190
+ 分类功能坏了。查看主文件并修复它。
191
+ 大约在第 150 行的函数有问题。
192
+
193
+ **Files to change:**
194
+ - src/triage/handler.ts (第 150 行)
195
+ - src/types.ts (第 42 行)
196
+ ```
197
+
198
+ 这之所以坏,是因为:
199
+ - 没有类别
200
+ - 模糊的描述("分类功能坏了")
201
+ - 引用了会过时的文件路径和行号
202
+ - 没有验收标准
203
+ - 没有范围边界
204
+ - 没有当前行为 vs 期望行为的描述
@@ -0,0 +1,104 @@
1
+ # 范围外知识库
2
+
3
+ 仓库中的 `.out-of-scope/` 目录存储被拒绝功能请求的持久记录。它有两个目的:
4
+
5
+ 1. **机构记忆** — 为什么一个功能被拒绝,这样理由不会随 issue 关闭而丢失
6
+ 2. **去重** — 当新 issue 与之前的拒绝匹配时,该 skill 可以呈现之前的决策而非重新讨论
7
+
8
+ ## 目录结构
9
+
10
+ ```
11
+ .out-of-scope/
12
+ ├── dark-mode.md
13
+ ├── plugin-system.md
14
+ └── graphql-api.md
15
+ ```
16
+
17
+ 每个**概念**一个文件,而非每个 issue 一个文件。请求同一功能的多个 issue 归入同一个文件。
18
+
19
+ ## 文件格式
20
+
21
+ 文件应以轻松、可读的风格编写 — 更像一份简短的设计文档,而非数据库条目。使用段落、代码示例和实例让理由清晰并对初次遇到它的人有用。
22
+
23
+ ```markdown
24
+ # Dark Mode
25
+
26
+ 此项目不支持深色模式或面向用户的主题化。
27
+
28
+ ## Why this is out of scope
29
+
30
+ 渲染管线假定在 `ThemeConfig` 中定义单一调色板。
31
+ 支持多主题将需要:
32
+
33
+ - 包装整个组件树的主题上下文提供者
34
+ - 每个组件的主题感知样式解析
35
+ - 用户主题偏好的持久层
36
+
37
+ 这是一个重大的架构变更,不符合项目对内容创作的聚焦。
38
+ 主题化是下游消费者(嵌入或再分发输出的消费者)的关注点。
39
+
40
+ ```ts
41
+ // 当前的 ThemeConfig 接口不是为运行时切换而设计的:
42
+ interface ThemeConfig {
43
+ colors: ColorPalette; // 单一调色板,在构建时解析
44
+ fonts: FontStack;
45
+ }
46
+ ```
47
+
48
+ ## Prior requests
49
+
50
+ - #42 — "添加深色模式支持"
51
+ - #87 — "用于无障碍的夜间主题"
52
+ - #134 — "深色主题选项"
53
+ ```
54
+
55
+ ### 文件命名
56
+
57
+ 使用简短的、描述性的 kebab-case 名称来表示概念:`dark-mode.md`、`plugin-system.md`、`graphql-api.md`。名称应足够可辨识,使浏览目录的人无需打开文件就能理解被拒绝的是什么。
58
+
59
+ ### 编写理由
60
+
61
+ 理由应是实质性的 — 不是"我们不想要这个"而是为什么。好的理由引用:
62
+
63
+ - 项目范围或理念("本项目聚焦于 X;主题化是下游关注点")
64
+ - 技术约束("支持这个将需要 Y,这与我们的 Z 架构冲突")
65
+ - 战略决策("我们选择使用 A 而不是 B,因为……")
66
+
67
+ 理由应是持久的。避免引用临时情况("我们目前太忙了")— 那些不是真正的拒绝,而是推迟。
68
+
69
+ ## 何时检查 `.out-of-scope/`
70
+
71
+ 在分类期间(第 1 步:收集上下文),读取 `.out-of-scope/` 中的所有文件。在评估新 issue 时:
72
+
73
+ - 检查请求是否匹配现有的范围外概念
74
+ - 匹配基于概念相似性,而非关键词 — "night theme" 匹配 `dark-mode.md`
75
+ - 如果存在匹配,将其呈现给维护者:"这与 `.out-of-scope/dark-mode.md` 相似 — 我们之前因为 [理由] 拒绝了这个。你仍然有同样的感觉吗?"
76
+
77
+ 维护者可能:
78
+
79
+ - **确认** — 新 issue 被添加到现有文件的"Prior requests"列表中,然后关闭
80
+ - **重新考虑** — 范围外文件被删除或更新,issue 进入正常分类流程
81
+ - **不同意** — 这些 issue 相关但不同,继续正常分类
82
+
83
+ ## 何时写入 `.out-of-scope/`
84
+
85
+ 仅当**增强**(非 bug)被*拒绝*为 `wontfix` 时。这也适用于增强 PR,就像适用于 issue 一样 — 被拒绝的 PR 被记录在这里,这样相同的请求不会以新代码的形式再次出现。
86
+
87
+ **不要**在某个功能以 `wontfix` 关闭是因为它**已经实现了**的情况下写入这里。那是已构建的功能,不是被拒绝的功能;记录它将用虚假的拒绝污染去重检查。相反,关闭评论指出功能已经存在的位置。
88
+
89
+ 流程:
90
+
91
+ 1. 维护者判断功能请求超出范围
92
+ 2. 检查是否已存在匹配的 `.out-of-scope/` 文件
93
+ 3. 如果是:将新 issue 追加到"Prior requests"列表
94
+ 4. 如果否:创建一个新文件,包含概念名称、决策、理由和第一个先前的请求
95
+ 5. 在 issue 上发布一条评论,说明决策并提及 `.out-of-scope/` 文件
96
+ 6. 用 `wontfix` 标签关闭 issue
97
+
98
+ ## 更新或删除范围外文件
99
+
100
+ 如果维护者改变了关于之前被拒绝概念的想法:
101
+
102
+ - 删除 `.out-of-scope/` 文件
103
+ - 该 skill 不需要重新打开旧的 issue — 它们是历史记录
104
+ - 触发重新考虑的新 issue 进入正常分类流程
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: triage
3
+ description: "将 issues 和外部 PRs 移过 triage 角色状态机 —— 分类、验证、必要时进行质询,并编写 agent 可用的摘要。"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Triage
8
+
9
+ 将项目 issue tracker 上的 issues 移过一个小型的 triage 角色状态机。
10
+
11
+ 如果本仓库将外部 Pull Request 视为请求渠道(参见 issue-tracker 配置),triage 也涵盖它们:**PR 是附带代码的 issue** —— 相同的角色、相同的状态、相同的状态机,仅有少数标记为"对于 PR"的差异。将裸 `#42` 解析为 issue 或 PR,取决于 tracker 配置。
12
+
13
+ Triage 期间发布到 issue tracker 的每条评论或 issue **必须**以此声明开头:
14
+
15
+ ```
16
+ > *This was generated by AI during triage.*
17
+ ```
18
+
19
+ ## 参考文档
20
+
21
+ - [AGENT-BRIEF.md](AGENT-BRIEF.md) —— 如何编写持久的 agent 摘要
22
+ - [OUT-OF-SCOPE.md](OUT-OF-SCOPE.md) —— `.out-of-scope/` 知识库的工作方式
23
+
24
+ ## 角色
25
+
26
+ 两个**类别**角色:
27
+
28
+ - `bug` —— 某功能损坏
29
+ - `enhancement` —— 新功能或改进
30
+
31
+ 五个**状态**角色:
32
+
33
+ - `needs-triage` —— 维护者需要评估
34
+ - `needs-info` —— 等待报告者提供更多信息
35
+ - `ready-for-agent` —— 已完全明确,可供 AFK agent 使用
36
+ - `ready-for-human` —— 需要人工实现
37
+ - `wontfix` —— 不予处理
38
+
39
+ 对于 PR,相同状态针对附带代码进行理解:`ready-for-agent` 表示附有 agent 摘要,agent 应对 diff 采取下一步操作;`ready-for-human` 表示可供人工合并。
40
+
41
+ 每个经 triage 的 issue 应携带恰好一个类别角色和一个状态角色。如果状态角色冲突,标记它并在做任何其他操作之前询问维护者。
42
+
43
+ 这些是标准角色名称 —— issue tracker 中使用的实际标签字符串可能不同。映射关系应已提供给你 —— 如果没有,运行 `/setup-matt-pocock-skills`。
44
+
45
+ 状态转换:未标记的 issue 通常先进入 `needs-triage`;然后移动到 `needs-info`、`ready-for-agent`、`ready-for-human` 或 `wontfix`。当报告者回复后,`needs-info` 返回 `needs-triage`。维护者可随时覆盖 —— 标记看起来不寻常的转换并在继续之前询问。
46
+
47
+ ## 调用方式
48
+
49
+ 维护者调用 `/triage` 并用自然语言描述他们想要什么。解读请求并行动。示例:
50
+
51
+ - "展示需要我关注的内容"
52
+ - "我们看看 #42"(issue 或 PR)
53
+ - "将 #42 移至 ready-for-agent"
54
+ - "有哪些可供 agents 领取的?"
55
+
56
+ ## 展示需要关注的内容
57
+
58
+ 查询 issue tracker 并按以下三个分组展示,最旧的优先:
59
+
60
+ 1. **未标记** —— 从未经过 triage。
61
+ 2. **`needs-triage`** —— 评估进行中。
62
+ 3. **自上次 triage 记录以来有报告者活动的 `needs-info`** —— 需要重新评估。
63
+
64
+ 当 PR 在范围内时,将外部 PR 纳入这些分组,并为每行标记 `[PR]` 或 `[issue]`。发现仅展示*外部* PR(tracker 配置定义了谁算外部)—— 协作者进行中的 PR 不是 triage 工作。此过滤器仅用于发现;明确指定的 PR 无论作者是谁都会被 triage。
65
+
66
+ 显示每个分组的数量和每项的一句话摘要。让维护者选择。
67
+
68
+ ## 对特定 issue 或 PR 进行 Triage
69
+
70
+ 1. **收集上下文。** 读取完整的 issue 或 PR(正文、评论、标签、作者、日期;对于 PR,还包括 diff)。解析之前的 triage 记录,以免重复询问已解决的问题。使用项目的领域词汇表探索代码库,尊重所涉及区域的 ADR。针对代码库运行两项检查:(a) **冗余性** —— 按领域概念搜索所请求行为的现有实现(不仅仅是请求的措辞),并报告你查找的位置。如果找到,它是已实现的情况,按 `wontfix` 处理(第 5 步)。(b) **之前的拒绝** —— 读取 `.out-of-scope/*.md` 并找出与此请求类似的任何内容。
71
+
72
+ 2. **建议。** 告诉维护者你的类别和状态建议及理由,加上与请求相关的简要代码库摘要 —— 包括是否已实现。等待指示。
73
+
74
+ 3. **验证声明。** 在任何质询之前,检查声明是否成立。对于 bug,按报告者的步骤复现。对于 PR,确认 diff 做了它声称做的事情 —— checkout 它,运行相关测试或命令。报告结果:已确认(含代码路径)、未通过、或细节不足(强烈的 `needs-info` 信号)。已确认的验证会产生更强的 agent 摘要。
75
+
76
+ 4. **质询(如需要)。** 如果请求需要充实,同时运行 `/grilling` 和 `/domain-modeling` 技能 —— 逐个问题地进行质询,随着决策落地内联更新 `CONTEXT.md`/ADR。
77
+
78
+ 5. **应用结果:**
79
+ - `ready-for-agent` —— 发布 agent 摘要评论([AGENT-BRIEF.md](AGENT-BRIEF.md))。
80
+ - `ready-for-human` —— 与 agent 摘要结构相同,但注明为何无法委托(判断性决策、外部访问、设计决策、手动测试)。
81
+ - `needs-info` —— 发布 triage 记录(下方模板)。
82
+ - `wontfix` —— 关闭,评论取决于*原因*:
83
+ - **已实现** —— 该变更已存在于代码库中。指出其位置;**不**写入 `.out-of-scope/`(该知识库用于*被拒绝*的请求,而非已构建的请求)。
84
+ - **被拒绝(bug)** —— 礼貌解释,然后关闭。
85
+ - **被拒绝(enhancement)** —— 写入 `.out-of-scope/`,在评论中链接它,然后关闭([OUT-OF-SCOPE.md](OUT-OF-SCOPE.md))。
86
+ - `needs-triage` —— 应用角色。如有部分进展,可选评论。
87
+
88
+ ## 快速状态覆盖
89
+
90
+ 如果维护者说"将 #42 移至 ready-for-agent",信任他们并直接应用角色。确认你即将执行的操作(角色变更、评论、关闭),然后行动。跳过质询。如果在没有质询会话的情况下移至 `ready-for-agent`,询问他们是否需要编写 agent 摘要。
91
+
92
+ ## Needs-info 模板
93
+
94
+ ```markdown
95
+ ## Triage Notes
96
+
97
+ **目前已确认的内容:**
98
+
99
+ - 要点 1
100
+ - 要点 2
101
+
102
+ **仍需您提供的信息(@报告者):**
103
+
104
+ - 问题 1
105
+ - 问题 2
106
+ ```
107
+
108
+ 将质询期间已解决的所有内容记录在"目前已确认"下,以免工作丢失。问题必须具体且可操作,而非"请提供更多信息"。
109
+
110
+ ## 恢复之前的会话
111
+
112
+ 如果 issue 或 PR 上存在之前的 triage 记录,读取它们,检查报告者是否已回答了任何未解决的问题,并在继续之前呈现更新的情况。不要重复询问已解决的问题。