@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.
- package/README.md +68 -78
- package/dist/src/cli.js +57 -34
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +1 -3
- package/dist/src/index.js +128 -168
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrate.d.ts +38 -0
- package/dist/src/migrate.js +646 -0
- package/dist/src/migrate.js.map +1 -0
- package/dist/src/workflows.d.ts +7 -37
- package/dist/src/workflows.js +49 -123
- package/dist/src/workflows.js.map +1 -1
- package/package.json +6 -4
- package/template/.speculo/README.md +20 -0
- package/template/.speculo/workspace.json +12 -0
- package/template/commands/docs-sync.md +28 -0
- package/template/commands/finalize.md +37 -0
- package/template/commands/knowledge-prune.md +20 -0
- package/template/commands/retro.md +15 -8
- package/template/commands/status.md +8 -51
- package/template/skills/agents-md-builder/SKILL.md +14 -101
- package/template/skills/change-lifecycle/SKILL.md +25 -0
- package/template/{workflows/dev/_templates → skills/change-lifecycle/assets}/completion-summary-template.md +2 -2
- package/template/{workflows/dev/_templates → skills/change-lifecycle/assets}/completion-verification-template.md +1 -1
- package/template/skills/change-lifecycle/references/completion-gate.md +19 -0
- package/template/skills/change-lifecycle/references/finalize-archive.md +32 -0
- package/template/skills/docs-sync/SKILL.md +22 -0
- package/template/skills/docs-sync/assets/report-template.md +45 -0
- package/template/skills/docs-sync/assets/state-template.json +20 -0
- package/template/skills/docs-sync/assets/workflow-scope-template.json +9 -0
- package/template/skills/docs-sync/references/agents-contract.md +43 -0
- package/template/skills/docs-sync/references/changelog-contract.md +39 -0
- package/template/skills/docs-sync/references/document-lifecycle-contract.md +38 -0
- package/template/skills/docs-sync/references/git-state-contract.md +67 -0
- package/template/skills/docs-sync/references/readme-contract.md +44 -0
- package/template/skills/docs-sync/references/workflow-scope-contract.md +50 -0
- package/template/skills/github-npm-ops/SKILL.md +14 -39
- package/template/skills/github-npm-ops/references/failure-recovery.md +1 -1
- package/template/skills/github-npm-ops/references/preflight-checklist.md +1 -1
- package/template/skills/github-npm-ops/references/release-notes-injection.md +1 -1
- package/template/skills/github-npm-ops/references/release-pipeline.md +13 -13
- package/template/skills/github-npm-ops/references/version-bump-flow.md +3 -3
- package/template/skills/knowledge-prune/SKILL.md +29 -0
- package/template/skills/knowledge-prune/references/audit-rules.md +24 -0
- package/template/skills/runtime-context/SKILL.md +43 -0
- package/template/skills/runtime-context/references/path-resolution.md +32 -0
- package/template/skills/speculo-retro/SKILL.md +13 -37
- package/template/skills/speculo-retro/references/friction-taxonomy.md +3 -3
- package/template/skills/speculo-retro/references/issue-drafting-sop.md +3 -3
- package/template/skills/worktree-isolation/SKILL.md +10 -46
- package/template/skills/worktree-isolation/references/audit-branch-tree.md +2 -2
- package/template/skills/worktree-isolation/references/create-worktree.md +6 -6
- package/template/skills/worktree-isolation/references/merge-and-cleanup.md +5 -5
- package/template/vendor/README.md +11 -10
- package/template/vendor/matt-pocock/README.md +41 -0
- package/template/vendor/matt-pocock/engineering/README.md +28 -0
- package/template/vendor/matt-pocock/engineering/ask-matt/SKILL.md +76 -0
- package/template/vendor/matt-pocock/engineering/code-review/SKILL.md +89 -0
- package/template/vendor/matt-pocock/engineering/codebase-design/DEEPENING.md +37 -0
- package/template/vendor/matt-pocock/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/template/vendor/matt-pocock/engineering/codebase-design/SKILL.md +114 -0
- package/template/vendor/matt-pocock/engineering/diagnosing-bugs/SKILL.md +134 -0
- package/template/vendor/matt-pocock/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/template/vendor/matt-pocock/engineering/domain-modeling/ADR-FORMAT.md +47 -0
- package/template/vendor/matt-pocock/engineering/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/template/vendor/matt-pocock/engineering/domain-modeling/SKILL.md +74 -0
- package/template/vendor/matt-pocock/engineering/grill-with-docs/SKILL.md +7 -0
- package/template/vendor/matt-pocock/engineering/implement/SKILL.md +15 -0
- package/template/vendor/matt-pocock/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/template/vendor/matt-pocock/engineering/improve-codebase-architecture/SKILL.md +66 -0
- package/template/vendor/matt-pocock/engineering/prototype/LOGIC.md +79 -0
- package/template/vendor/matt-pocock/engineering/prototype/SKILL.md +30 -0
- package/template/vendor/matt-pocock/engineering/prototype/UI.md +112 -0
- package/template/vendor/matt-pocock/engineering/research/SKILL.md +12 -0
- package/template/vendor/matt-pocock/engineering/resolving-merge-conflicts/SKILL.md +14 -0
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/SKILL.md +127 -0
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/domain.md +51 -0
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-github.md +45 -0
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
- package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/template/vendor/matt-pocock/engineering/tdd/SKILL.md +36 -0
- package/template/vendor/matt-pocock/engineering/tdd/mocking.md +59 -0
- package/template/vendor/matt-pocock/engineering/tdd/tests.md +77 -0
- package/template/vendor/matt-pocock/engineering/to-spec/SKILL.md +75 -0
- package/template/vendor/matt-pocock/engineering/to-tickets/SKILL.md +113 -0
- package/template/vendor/matt-pocock/engineering/triage/AGENT-BRIEF.md +204 -0
- package/template/vendor/matt-pocock/engineering/triage/OUT-OF-SCOPE.md +104 -0
- package/template/vendor/matt-pocock/engineering/triage/SKILL.md +112 -0
- package/template/vendor/matt-pocock/engineering/wayfinder/SKILL.md +127 -0
- package/template/vendor/matt-pocock/in-progress/README.md +10 -0
- package/template/vendor/matt-pocock/in-progress/claude-handoff/SKILL.md +18 -0
- package/template/vendor/matt-pocock/in-progress/loop-me/SKILL.md +32 -0
- package/template/vendor/matt-pocock/in-progress/wizard/SKILL.md +45 -0
- package/template/vendor/matt-pocock/in-progress/wizard/template.sh +211 -0
- package/template/vendor/matt-pocock/in-progress/writing-beats/SKILL.md +67 -0
- package/template/vendor/matt-pocock/in-progress/writing-fragments/SKILL.md +78 -0
- package/template/vendor/matt-pocock/in-progress/writing-shape/SKILL.md +79 -0
- package/template/vendor/matt-pocock/productivity/README.md +18 -0
- package/template/vendor/matt-pocock/productivity/grill-me/SKILL.md +7 -0
- package/template/vendor/matt-pocock/productivity/grilling/SKILL.md +12 -0
- package/template/vendor/matt-pocock/productivity/handoff/SKILL.md +16 -0
- package/template/vendor/matt-pocock/productivity/teach/GLOSSARY-FORMAT.md +35 -0
- package/template/vendor/matt-pocock/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/template/vendor/matt-pocock/productivity/teach/MISSION-FORMAT.md +31 -0
- package/template/vendor/matt-pocock/productivity/teach/RESOURCES-FORMAT.md +32 -0
- package/template/vendor/matt-pocock/productivity/teach/SKILL.md +140 -0
- package/template/vendor/matt-pocock/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/template/vendor/matt-pocock/productivity/writing-great-skills/SKILL.md +83 -0
- package/template/workflows/matt-pocock/WORKFLOW.md +145 -0
- package/template/workflows/matt-pocock/_state/status.json +5 -0
- package/template/workflows/matt-pocock/routes/architecture.md +24 -0
- package/template/workflows/matt-pocock/routes/diagnose.md +22 -0
- package/template/workflows/matt-pocock/routes/experimental.md +18 -0
- package/template/workflows/matt-pocock/routes/idea-to-delivery.md +63 -0
- package/template/workflows/matt-pocock/routes/merge-conflicts.md +19 -0
- package/template/workflows/matt-pocock/routes/productivity.md +25 -0
- package/template/workflows/matt-pocock/routes/research-prototype.md +20 -0
- package/template/workflows/matt-pocock/routes/review.md +19 -0
- package/template/workflows/matt-pocock/routes/setup.md +42 -0
- package/template/workflows/matt-pocock/routes/triage.md +25 -0
- package/template/workflows/matt-pocock/routes/wayfinder.md +27 -0
- package/template/workflows/person/M-mao-zedong-cognitive-os/M-mao-zedong-cognitive-os.md +74 -59
- package/template/workflows/person/M-mao-zedong-cognitive-os/activate.md +2 -2
- package/template/workflows/person/M-mao-zedong-cognitive-os/deliver.md +5 -5
- package/template/workflows/person/M-mao-zedong-cognitive-os/diagnose.md +2 -2
- package/template/workflows/person/M-mao-zedong-cognitive-os/mobilize.md +4 -4
- package/template/workflows/person/M-mao-zedong-cognitive-os/strategize.md +3 -3
- package/template/workflows/person/WORKFLOW.md +68 -0
- package/template/workflows/person/_state/.config/LESSONS.md +3 -0
- package/template/workflows/person/_state/.config/RULES.md +3 -0
- package/template/workflows/person/_state/changes/.gitkeep +1 -0
- package/template/workflows/person/_state/status.json +5 -0
- package/template/.speculo/.config/LESSONS.md +0 -9
- package/template/.speculo/.config/RULES.md +0 -11
- package/template/.speculo/AGENTS.md +0 -30
- package/template/.speculo/archive/AGENTS.md +0 -28
- package/template/.speculo/archive/dev/.gitkeep +0 -0
- package/template/.speculo/archive/person/.gitkeep +0 -0
- package/template/.speculo/dev/.gitkeep +0 -0
- package/template/.speculo/dev/docs-sync-state.json +0 -14
- package/template/.speculo/dev-status.json +0 -3
- package/template/.speculo/doc-status.json +0 -3
- package/template/.speculo/person/.gitkeep +0 -0
- package/template/.speculo/person-status.json +0 -1
- package/template/commands/archive.md +0 -68
- package/template/commands/caveman.md +0 -50
- package/template/commands/config-prune.md +0 -59
- package/template/commands/grill-me.md +0 -48
- package/template/commands/handoff.md +0 -59
- package/template/commands/scaffold-exercises.md +0 -56
- package/template/commands/write-a-skill.md +0 -52
- package/template/skills/caveman/SKILL.md +0 -38
- package/template/skills/caveman/references/compression-rules.md +0 -102
- package/template/skills/config-prune/SKILL.md +0 -44
- package/template/skills/config-prune/references/audit-rules.md +0 -38
- package/template/skills/grill-me/SKILL.md +0 -40
- package/template/skills/handoff/SKILL.md +0 -73
- package/template/skills/scaffold-exercises/SKILL.md +0 -41
- package/template/skills/scaffold-exercises/references/exercise-structure.md +0 -85
- package/template/skills/scaffold-exercises/references/lint-and-git.md +0 -54
- package/template/skills/speculo-write/SKILL.md +0 -56
- package/template/skills/speculo-write/references/asset-selection-sop.md +0 -67
- package/template/skills/speculo-write/references/authoring-quality-levers.md +0 -61
- package/template/skills/speculo-write/references/command-authoring-sop.md +0 -98
- package/template/skills/speculo-write/references/migration-sop.md +0 -101
- package/template/skills/speculo-write/references/persistence-contract-sop.md +0 -271
- package/template/skills/speculo-write/references/skill-authoring-sop.md +0 -212
- package/template/skills/speculo-write/references/validation-checklist.md +0 -85
- package/template/skills/speculo-write/references/workflow-authoring-sop.md +0 -165
- package/template/vendor/codebase-design/DEEPENING.md +0 -37
- package/template/vendor/codebase-design/DESIGN-IT-TWICE.md +0 -44
- package/template/vendor/codebase-design/SKILL.md +0 -114
- package/template/vendor/officecli/SKILL.md +0 -415
- package/template/vendor/resolving-merge-conflicts/SKILL.md +0 -14
- package/template/workflows/dev/01-grill-with-docs/01-grill-with-docs.md +0 -107
- package/template/workflows/dev/01-grill-with-docs/grill-context-scan.md +0 -30
- package/template/workflows/dev/01-grill-with-docs/grill-decision.md +0 -38
- package/template/workflows/dev/02-prd/02-prd.md +0 -70
- package/template/workflows/dev/02-prd/prd-synthesis.md +0 -30
- package/template/workflows/dev/02-prd/prd-zoom-out.md +0 -29
- package/template/workflows/dev/03-tdd/03-tdd.md +0 -55
- package/template/workflows/dev/03-tdd/agents/tdd-finish-agent.md +0 -34
- package/template/workflows/dev/03-tdd/agents/tdd-implement-agent.md +0 -34
- package/template/workflows/dev/03-tdd/agents/tdd-plan-agent.md +0 -34
- package/template/workflows/dev/03-tdd/mocking.md +0 -43
- package/template/workflows/dev/03-tdd/refactoring.md +0 -10
- package/template/workflows/dev/03-tdd/tdd-finish.md +0 -34
- package/template/workflows/dev/03-tdd/tdd-loop.md +0 -36
- package/template/workflows/dev/03-tdd/tdd-plan.md +0 -37
- package/template/workflows/dev/03-tdd/tests.md +0 -61
- package/template/workflows/dev/04-finalize/04-finalize.md +0 -57
- package/template/workflows/dev/04-finalize/agents/completion-gate-agent.md +0 -35
- package/template/workflows/dev/04-finalize/completion-gate.md +0 -41
- package/template/workflows/dev/04-finalize/finalize-archive.md +0 -55
- package/template/workflows/dev/A-improve-architecture/A-improve-architecture.md +0 -60
- package/template/workflows/dev/A-improve-architecture/HTML-REPORT.md +0 -123
- package/template/workflows/dev/A-improve-architecture/architecture-grill.md +0 -30
- package/template/workflows/dev/A-improve-architecture/architecture-review.md +0 -29
- package/template/workflows/dev/A-improve-architecture/architecture-scan.md +0 -37
- package/template/workflows/dev/AGENTS.md +0 -95
- package/template/workflows/dev/D-docs-sync/D-docs-sync.md +0 -140
- package/template/workflows/dev/D-docs-sync/agents/docs-diff-agent.md +0 -34
- package/template/workflows/dev/D-docs-sync/agents/docs-update-agent.md +0 -34
- package/template/workflows/dev/D-docs-sync/agents-contract.md +0 -95
- package/template/workflows/dev/D-docs-sync/changelog-contract.md +0 -155
- package/template/workflows/dev/D-docs-sync/config-contract.md +0 -75
- package/template/workflows/dev/D-docs-sync/docs-sync-diff.md +0 -86
- package/template/workflows/dev/D-docs-sync/docs-sync-finish.md +0 -37
- package/template/workflows/dev/D-docs-sync/docs-sync-state.md +0 -47
- package/template/workflows/dev/D-docs-sync/docs-sync-update.md +0 -44
- package/template/workflows/dev/D-docs-sync/knowledge-extract.md +0 -66
- package/template/workflows/dev/D-docs-sync/readme-contract.md +0 -124
- package/template/workflows/dev/D-docs-sync/state-json-schema.md +0 -172
- package/template/workflows/dev/H-diagnose/H-diagnose.md +0 -108
- package/template/workflows/dev/H-diagnose/agents/diagnose-agent.md +0 -33
- package/template/workflows/dev/H-diagnose/agents/fix-agent.md +0 -34
- package/template/workflows/dev/H-diagnose/diagnose-fix.md +0 -34
- package/template/workflows/dev/H-diagnose/diagnose-guide.md +0 -144
- package/template/workflows/dev/H-diagnose/diagnose-loop.md +0 -41
- package/template/workflows/dev/H-diagnose/scripts/hitl-loop.template.sh +0 -41
- package/template/workflows/dev/I-to-issues/I-to-issues.md +0 -79
- package/template/workflows/dev/I-to-issues/issues-slices.md +0 -211
- package/template/workflows/dev/M-domain-modeling/ADR-FORMAT.md +0 -74
- package/template/workflows/dev/M-domain-modeling/CONTEXT-FORMAT.md +0 -67
- package/template/workflows/dev/M-domain-modeling/M-domain-modeling.md +0 -102
- package/template/workflows/dev/R-review/R-review.md +0 -75
- package/template/workflows/dev/R-review/agents/engineering-review-agent.md +0 -33
- package/template/workflows/dev/R-review/agents/spec-review-agent.md +0 -34
- package/template/workflows/dev/R-review/agents/standards-review-agent.md +0 -34
- package/template/workflows/dev/R-review/code-quality-checklist.md +0 -118
- package/template/workflows/dev/R-review/removal-checklist.md +0 -53
- package/template/workflows/dev/R-review/review-axes.md +0 -61
- package/template/workflows/dev/R-review/review-setup.md +0 -111
- package/template/workflows/dev/R-review/review-verdict.md +0 -43
- package/template/workflows/dev/R-review/security-checklist.md +0 -126
- package/template/workflows/dev/R-review/solid-checklist.md +0 -73
- package/template/workflows/dev/_templates/diagnosis-template.md +0 -20
- package/template/workflows/dev/_templates/docs-sync-report-template.md +0 -45
- package/template/workflows/dev/_templates/docs-sync-state-template.json +0 -14
- package/template/workflows/dev/_templates/domain-model-log-template.md +0 -20
- package/template/workflows/dev/_templates/grill-context-map-template.md +0 -20
- package/template/workflows/dev/_templates/grill-decision-log-template.md +0 -20
- package/template/workflows/dev/_templates/issues-slices-template.md +0 -106
- package/template/workflows/dev/_templates/overview-template.md +0 -19
- package/template/workflows/dev/_templates/prd-template.md +0 -26
- package/template/workflows/dev/_templates/regression-template.md +0 -20
- package/template/workflows/dev/_templates/review-report-template.md +0 -30
- package/template/workflows/dev/_templates/review-sources-template.md +0 -33
- package/template/workflows/dev/_templates/review-verdict-template.md +0 -33
- package/template/workflows/dev/_templates/tdd-log-template.md +0 -23
- package/template/workflows/dev/_templates/tdd-plan-template.md +0 -35
- package/template/workflows/dev/_templates/tdd-verification-template.md +0 -26
- package/template/workflows/doc/AGENTS.md +0 -80
- package/template/workflows/doc/B-writing-beats/B-writing-beats.md +0 -79
- package/template/workflows/doc/B-writing-beats/writing-beats-append.md +0 -31
- package/template/workflows/doc/B-writing-beats/writing-beats-options.md +0 -29
- package/template/workflows/doc/E-edit-article/E-edit-article.md +0 -79
- package/template/workflows/doc/E-edit-article/edit-article-plan.md +0 -30
- package/template/workflows/doc/E-edit-article/edit-article-rewrite.md +0 -31
- package/template/workflows/doc/F-writing-fragments/F-writing-fragments.md +0 -80
- package/template/workflows/doc/F-writing-fragments/writing-fragments-interview.md +0 -32
- package/template/workflows/doc/F-writing-fragments/writing-fragments-log.md +0 -29
- package/template/workflows/doc/S-writing-shape/S-writing-shape.md +0 -81
- package/template/workflows/doc/S-writing-shape/writing-shape-block.md +0 -32
- package/template/workflows/doc/S-writing-shape/writing-shape-opening.md +0 -27
- package/template/workflows/doc/T-teach/T-teach.md +0 -64
- package/template/workflows/doc/T-teach/teach-lesson-wrap.md +0 -63
- package/template/workflows/doc/T-teach/teach-lesson.md +0 -53
- package/template/workflows/doc/T-teach/teach-mission.md +0 -33
- package/template/workflows/doc/T-teach/teach-resources.md +0 -36
- package/template/workflows/doc/_templates/edit-article-plan-template.md +0 -25
- package/template/workflows/doc/_templates/edit-article-template.md +0 -7
- package/template/workflows/doc/_templates/teach-glossary-template.md +0 -26
- package/template/workflows/doc/_templates/teach-learning-record-template.md +0 -38
- package/template/workflows/doc/_templates/teach-lesson-html-template.md +0 -24
- package/template/workflows/doc/_templates/teach-mission-template.md +0 -19
- package/template/workflows/doc/_templates/teach-resources-template.md +0 -18
- package/template/workflows/doc/_templates/writing-article-template.md +0 -7
- package/template/workflows/doc/_templates/writing-beat-options-template.md +0 -21
- package/template/workflows/doc/_templates/writing-fragments-template.md +0 -7
- package/template/workflows/doc/_templates/writing-interview-log-template.md +0 -21
- package/template/workflows/doc/_templates/writing-shape-log-template.md +0 -25
- package/template/workflows/person/AGENTS.md +0 -72
- /package/template/{.speculo/.config/adr → workflows/matt-pocock/_state/archive}/.gitkeep +0 -0
- /package/template/{.speculo/.config/context → workflows/matt-pocock/_state/changes}/.gitkeep +0 -0
- /package/template/{.speculo/archive/doc → workflows/person/_state/.config/context}/.gitkeep +0 -0
- /package/template/{.speculo/doc → workflows/person/_state/archive}/.gitkeep +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prototype
|
|
3
|
+
description: 构建一次性原型来回答设计问题。当用户想要快速验证状态模型或逻辑是否感觉正确,或探索 UI 应该长什么样时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 原型
|
|
7
|
+
|
|
8
|
+
原型是**回答问题的一次性代码**。问题决定形态。
|
|
9
|
+
|
|
10
|
+
## 选择分支
|
|
11
|
+
|
|
12
|
+
识别正在回答哪个问题 — 从用户提示、周围代码或用户在线时通过询问来判断:
|
|
13
|
+
|
|
14
|
+
- **"这个逻辑 / 状态模型感觉对吗?"** → [LOGIC.md](LOGIC.md)。构建一个微型交互式终端应用,将状态机推向难以在纸面上推理的用例。
|
|
15
|
+
- **"这个应该长什么样?"** → [UI.md](UI.md)。在单一路由上生成几个截然不同的 UI 变体,通过 URL 搜索参数和浮动底栏切换。
|
|
16
|
+
|
|
17
|
+
两个分支产生截然不同的产物 — 选错会浪费整个原型。如果问题确实模棱两可且用户不在线,默认选择更能匹配周围代码的分支(后端模块 → 逻辑;页面或组件 → UI),并在原型顶部陈述假设。
|
|
18
|
+
|
|
19
|
+
## 适用于两者的规则
|
|
20
|
+
|
|
21
|
+
1. **从一开始就是一次性的,并清楚标记。** 将原型代码放在它实际将被使用的位置附近(靠近它正在原型化的模块或页面旁边),这样上下文是明确的 — 但命名时让随意读者能看出它是原型,而非生产代码。对于一次性 UI 路由,遵循项目已有的任何路由约定;不要发明新的顶层结构。
|
|
22
|
+
2. **一条命令运行。** 无论项目现有任务运行器支持什么 — `pnpm <名称>`、`python <路径>`、`bun <路径>` 等。用户必须能毫不费力地启动它。
|
|
23
|
+
3. **默认不持久化。** 状态驻留在内存中。持久化是原型正在_检验_的东西,而非它应该依赖的东西。如果问题明确涉及数据库,用一个标记着"PROTOTYPE — 请清除我"的临时数据库或本地文件。
|
|
24
|
+
4. **跳过润色。** 没有测试,没有超出使原型_可运行_的错误处理,没有抽象。重点是快速学到东西然后删除它。
|
|
25
|
+
5. **呈现状态。** 每次操作后(逻辑)或每次变体切换时(UI),打印或渲染完整的相关状态,让用户看到什么发生了变化。
|
|
26
|
+
6. **完成后删除或吸收。** 当原型回答了它的问题时,要么删除它,要么将已验证的决策整合到真实代码中 — 不要让它烂在仓库里。
|
|
27
|
+
|
|
28
|
+
## 完成后
|
|
29
|
+
|
|
30
|
+
_答案_是原型中唯一值得保留的东西。将其捕获到某个持久的地方(commit 消息、ADR、issue,或原型旁边的 `NOTES.md`),连同它所回答的问题。如果用户在线,这只是一个快速对话;如果不,留下占位符以便他们(或你,在下一轮)能在删除原型之前填上结论。
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# UI 原型
|
|
2
|
+
|
|
3
|
+
在单个路由上生成**多个截然不同的 UI 变体**,通过一个浮动底栏切换。用户在浏览器中翻看各个变体,选择一个(或从每个变体中各取一些),然后丢弃其余。
|
|
4
|
+
|
|
5
|
+
如果问题关乎逻辑/状态而非外观 — 走错分支了。请使用 [LOGIC.md](LOGIC.md)。
|
|
6
|
+
|
|
7
|
+
## 何时适合使用这种形式
|
|
8
|
+
|
|
9
|
+
- "这个页面应该长什么样?"
|
|
10
|
+
- "我想在提交之前看看这个仪表盘的几种选项。"
|
|
11
|
+
- "试试设置页面的不同布局。"
|
|
12
|
+
- 任何用户本来会花一天时间在脑子里犹豫三种模糊草图的场景。
|
|
13
|
+
|
|
14
|
+
## 两种子形式 — 强烈偏好子形式 A
|
|
15
|
+
|
|
16
|
+
当 UI 原型**和应用的其余部分放在一起**时,判断起来要容易得多 — 真实的页头、真实的侧边栏、真实的数据、真实的密度。一个单独的临时路由是在真空中:每个变体在隔离状态下看起来都没问题。只要存在合理的既有页面来承载变体,就默认使用子形式 A。只有当原型确实没有附近的归宿时才使用子形式 B。
|
|
17
|
+
|
|
18
|
+
### 子形式 A — 对现有页面的调整(首选)
|
|
19
|
+
|
|
20
|
+
路由已经存在。变体在**同一路由**上渲染,通过 `?variant=` URL 搜索参数来控制。现有的数据获取、参数和认证全部保留 — 只有渲染部分切换。这是默认选择;除非有特定理由不这样做。
|
|
21
|
+
|
|
22
|
+
如果原型是给某个还没有页面但*自然会放在某个页面内*的东西(仪表盘的新增部分、设置页面上的新卡片、现有流程中的新步骤)— 这仍然是子形式 A。在宿主页面中挂载变体。
|
|
23
|
+
|
|
24
|
+
### 子形式 B — 新建页面(最后手段)
|
|
25
|
+
|
|
26
|
+
仅适用于被原型化的东西确实没有可放入的现有页面时 — 例如一个全新的顶层界面,或一个无法合理嵌入任何地方的流程。
|
|
27
|
+
|
|
28
|
+
按照项目已有的路由约定创建一个**临时路由** — 不要发明新的顶层结构。命名时要明显表明它是原型(例如在路径或文件名中包含 `prototype` 一词)。使用同样的 `?variant=` 模式。
|
|
29
|
+
|
|
30
|
+
在采取子形式 B 之前,做一个合理性检查:是否确实没有可嵌入的现有页面?一个空路由会隐藏设计问题,而填充了内容的路由会暴露出来。
|
|
31
|
+
|
|
32
|
+
两种子形式中,浮动底栏是相同的。
|
|
33
|
+
|
|
34
|
+
## 流程
|
|
35
|
+
|
|
36
|
+
### 1. 明确问题并确定 N 值
|
|
37
|
+
|
|
38
|
+
默认为 **3 个变体**。超过 5 个就不再是截然不同而是变成噪音 — 以此为上限。
|
|
39
|
+
|
|
40
|
+
在原型的存放位置或文件顶部注释中,用一行写下计划:
|
|
41
|
+
|
|
42
|
+
> "Three variants of the settings page, switchable via `?variant=`, on the existing `/settings` route."
|
|
43
|
+
|
|
44
|
+
这无论用户在还是不在都能用。
|
|
45
|
+
|
|
46
|
+
### 2. 生成截然不同的变体
|
|
47
|
+
|
|
48
|
+
起草每个变体。对每个变体检查:
|
|
49
|
+
|
|
50
|
+
- 页面的目的及其可访问的数据。
|
|
51
|
+
- 项目的组件库 / 样式系统(TailwindCSS、shadcn、MUI、plain CSS 等)。
|
|
52
|
+
- 清晰的导出组件名,例如 `VariantA`、`VariantB`、`VariantC`。
|
|
53
|
+
|
|
54
|
+
变体必须是**结构上不同**的 — 不同的布局、不同的信息层级、不同的主要操作入口,而不仅仅是不同的颜色。三个略微调整的卡片网格不是 UI 原型,是壁纸。如果两个草稿太相似,用明确的"不要使用卡片网格"指导重新做一个。
|
|
55
|
+
|
|
56
|
+
### 3. 将它们连接起来
|
|
57
|
+
|
|
58
|
+
在路由上创建一个单一的切换器组件:
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
// 伪代码 — 根据项目的框架进行调整
|
|
62
|
+
const variant = searchParams.get('variant') ?? 'A';
|
|
63
|
+
return (
|
|
64
|
+
<>
|
|
65
|
+
{variant === 'A' && <VariantA {...data} />}
|
|
66
|
+
{variant === 'B' && <VariantB {...data} />}
|
|
67
|
+
{variant === 'C' && <VariantC {...data} />}
|
|
68
|
+
<PrototypeSwitcher variants={['A','B','C']} current={variant} />
|
|
69
|
+
</>
|
|
70
|
+
);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
对于子形式 A(现有页面):将所有现有的数据获取保留在切换器之上;只有渲染的子树按变体变化。
|
|
74
|
+
|
|
75
|
+
对于子形式 B(新页面):`/prototype/<name>` 下的临时路由挂载相同的切换器。
|
|
76
|
+
|
|
77
|
+
### 4. 构建浮动切换器
|
|
78
|
+
|
|
79
|
+
屏幕底部居中的小型固定位置栏,包含三部分:
|
|
80
|
+
|
|
81
|
+
- **左箭头** — 切换到上一个变体(循环)。
|
|
82
|
+
- **变体标签** — 显示当前变体键,如果变体导出了名称,也显示该名称。例如 `B — Sidebar layout`。
|
|
83
|
+
- **右箭头** — 向前切换(循环)。
|
|
84
|
+
|
|
85
|
+
行为:
|
|
86
|
+
|
|
87
|
+
- 点击箭头更新 URL 搜索参数(使用框架的路由器 — Next 上用 `router.replace`,React Router 上用 `navigate` 等),使变体可分享且在刷新后保持。
|
|
88
|
+
- 键盘:`←` 和 `→` 方向键也可切换。当 `<input>`、`<textarea>` 或 `[contenteditable]` 获得焦点时不要截获方向键。
|
|
89
|
+
- 视觉上与页面区分开(例如高对比度的胶囊形状、微妙的阴影),使其明显不是正在评估的设计的一部分。
|
|
90
|
+
- 在生产构建中隐藏 — 通过 `process.env.NODE_ENV !== 'production'` 或等价检查来控制,这样意外合并的原型不会将切换器发布给用户。
|
|
91
|
+
|
|
92
|
+
将切换器放在单个共享组件中,以便两种子形式都能复用。将其放在项目中共享 UI 的存放位置。
|
|
93
|
+
|
|
94
|
+
### 5. 交付
|
|
95
|
+
|
|
96
|
+
展示 URL(以及 `?variant=` 键值)。用户有空时会翻看。有趣的反馈通常是**"我想要 B 的页头加上 C 的侧边栏"** — 那才是他们真正想要的设计。
|
|
97
|
+
|
|
98
|
+
### 6. 捕获答案并清理
|
|
99
|
+
|
|
100
|
+
一旦有变体胜出,写下是哪一个以及为什么(commit message、ADR、issue,或者如果离线运行且用户尚未回应,则在原型的旁边写一个 `NOTES.md`)。然后:
|
|
101
|
+
|
|
102
|
+
- **子形式 A** — 删除落选的变体和切换器;将胜出者融合到现有页面中。
|
|
103
|
+
- **子形式 B** — 将胜出的变体提升为真正的路由,删除临时路由和切换器。
|
|
104
|
+
|
|
105
|
+
不要将变体组件或切换器遗留在代码中。它们腐烂很快,会困惑下一个阅读者。
|
|
106
|
+
|
|
107
|
+
## 反模式
|
|
108
|
+
|
|
109
|
+
- **仅在颜色或文案上有差异的变体。** 那是微调,不是原型。真正的变体在结构上有分歧。
|
|
110
|
+
- **变体之间共享太多代码。** 共享的 `<Header>` 没问题;共享的 `<Layout>` 违背了目的。每个变体应能自由地抛弃布局。
|
|
111
|
+
- **将变体连接到真实的变更操作。** 只读原型是可以的。如果一个变体需要变更操作,让它指向一个桩 — 问题是"这应该长什么样",而不是"后端是否工作"。
|
|
112
|
+
- **直接将原型提升到生产环境。** 变体代码是在原型约束下编写的(无测试、最小错误处理)。在融合时要正确地重写它。
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research
|
|
3
|
+
description: "针对高可信度一手来源调查问题,并将发现结果以 Markdown 文件记录到仓库中。适用于需要研究某个主题、收集文档或 API 信息、或委托阅读工作给后台 Agent 的场景。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
启动一个**后台 Agent** 来进行研究,这样你可以在它阅读时继续工作。
|
|
7
|
+
|
|
8
|
+
其工作内容:
|
|
9
|
+
|
|
10
|
+
1. 针对**一手来源**调查问题 —— 官方文档、源代码、规范、第一方 API —— 而不是基于这些来源的二次编写材料。将每个声明追溯到拥有该声明的来源。
|
|
11
|
+
2. 将发现结果写入单个 Markdown 文件,为每个声明标注来源。
|
|
12
|
+
3. 将文件保存到仓库已有的笔记存放位置;遵循现有约定,如果没有则放到合适的位置并说明存放位置。
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: resolving-merge-conflicts
|
|
3
|
+
description: "用于解决进行中的 git merge/rebase 冲突。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
1. **查看 merge/rebase 的当前状态**。检查 git 历史记录和冲突文件。
|
|
7
|
+
|
|
8
|
+
2. **查找每个冲突的一手来源**。深入理解每个更改的原因以及原始意图。阅读 commit 消息、检查 PR、查看原始 issue/ticket。
|
|
9
|
+
|
|
10
|
+
3. **解决每个冲突块。** 尽可能保留双方的意图。当不兼容时,选择与合并既定目标一致的一方,并注明权衡。**不要**发明新行为。务必解决;绝不执行 `--abort`。
|
|
11
|
+
|
|
12
|
+
4. 查找项目的**自动化检查**并运行它们 —— 通常按类型检查、测试、格式化的顺序。修复合并破坏的任何内容。
|
|
13
|
+
|
|
14
|
+
5. **完成 merge/rebase。** 暂存所有内容并提交。如果是 rebase,继续 rebase 过程直到所有 commits 都已 rebase。
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-matt-pocock-skills
|
|
3
|
+
description: "为本仓库配置工程化技能 —— 设置 issue tracker、triage 标签词汇表以及领域文档布局。在首次使用其他工程化技能之前运行一次。"
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 配置 Matt Pocock 技能
|
|
8
|
+
|
|
9
|
+
搭建工程化技能所依赖的每仓库配置:
|
|
10
|
+
|
|
11
|
+
- **Issue tracker** —— issue 的存放位置(默认使用 GitHub;也支持本地 markdown)
|
|
12
|
+
- **Triage 标签** —— 五个标准 triage 角色使用的字符串
|
|
13
|
+
- **领域文档** —— `CONTEXT.md` 和 ADR 的存放位置,以及读取它们的消费方规则
|
|
14
|
+
|
|
15
|
+
这是一个提示驱动的技能,不是确定性脚本。先探索,展示发现结果,与用户确认,然后写入。
|
|
16
|
+
|
|
17
|
+
## 流程
|
|
18
|
+
|
|
19
|
+
### 1. 探索
|
|
20
|
+
|
|
21
|
+
查看当前仓库以了解其初始状态。读取已有内容;不要假设:
|
|
22
|
+
|
|
23
|
+
- `git remote -v` 和 `.git/config` —— 这是 GitHub 仓库吗?是哪一个?
|
|
24
|
+
- 仓库根目录下的 `AGENTS.md` 和 `CLAUDE.md` —— 是否存在?其中是否已有 `## Agent skills` 章节?
|
|
25
|
+
- 仓库根目录下的 `CONTEXT.md` 和 `CONTEXT-MAP.md`
|
|
26
|
+
- `docs/adr/` 和所有 `src/*/docs/adr/` 目录
|
|
27
|
+
- `docs/agents/` —— 此技能之前的输出是否已存在?
|
|
28
|
+
- `.scratch/` —— 表示本地 markdown issue tracker 约定已在使用中的标志
|
|
29
|
+
|
|
30
|
+
### 2. 展示发现结果并询问
|
|
31
|
+
|
|
32
|
+
总结已存在的和缺失的内容。然后**逐项**引导用户完成三项决策 —— 展示一节,获得用户回答,然后进入下一节。不要一次抛出全部三项。
|
|
33
|
+
|
|
34
|
+
假设用户不了解这些术语的含义。每节以简短解释开头(它是什么、这些技能为什么需要它、选择不同会有什么变化)。然后展示选项和默认值。
|
|
35
|
+
|
|
36
|
+
**A 节 —— Issue tracker。**
|
|
37
|
+
|
|
38
|
+
> 解释:"Issue tracker" 是本仓库 issue 的存放位置。`to-tickets`、`triage`、`to-spec`、`qa` 等技能会从中读取和写入 —— 它们需要知道是调用 `gh issue create`、在 `.scratch/` 下写入 markdown 文件,还是遵循你描述的其他工作流。请选择你实际跟踪本仓库工作的地方。
|
|
39
|
+
|
|
40
|
+
默认倾向:这些技能是为 GitHub 设计的。如果 `git remote` 指向 GitHub,则建议使用 GitHub。如果 `git remote` 指向 GitLab(`gitlab.com` 或自托管主机),则建议使用 GitLab。否则(或用户偏好其他方式),提供:
|
|
41
|
+
|
|
42
|
+
- **GitHub** —— issue 存放在仓库的 GitHub Issues 中(使用 `gh` CLI)
|
|
43
|
+
- **GitLab** —— issue 存放在仓库的 GitLab Issues 中(使用 [`glab`](https://gitlab.com/gitlab-org/cli) CLI)
|
|
44
|
+
- **本地 markdown** —— issue 以文件形式存放在本仓库的 `.scratch/<feature>/` 下(适合个人项目或无远程仓库的场景)
|
|
45
|
+
- **其他**(Jira、Linear 等)—— 请用户用一段话描述工作流;技能将记录为自由文本
|
|
46
|
+
|
|
47
|
+
仅当用户选择了 **GitHub** 或 **GitLab** 时,才追问一个问题:
|
|
48
|
+
|
|
49
|
+
> 解释:开源仓库经常以 Pull Request 形式收到功能请求,而不仅仅是 issue —— PR 是附带代码的 issue。如果开启此选项,`/triage` 会将*外部* PR 拉入同一队列,并对其应用与 issue 相同的标签和状态(协作者进行中的 PR 不受影响)。如果 PR 不是你接收请求的渠道,请关闭此选项。
|
|
50
|
+
|
|
51
|
+
- **PR 作为请求渠道** —— 是 / 否(默认:否)。将答案记录到 `docs/agents/issue-tracker.md`。对于本地 markdown 和其他 tracker,跳过此问题 —— 没有 PR。
|
|
52
|
+
|
|
53
|
+
**B 节 —— Triage 标签词汇表。**
|
|
54
|
+
|
|
55
|
+
> 解释:当 `triage` 技能处理一个收到的 issue 时,它会将其移过一个状态机 —— 需要评估、等待报告者回复、可供 AFK agent 领取、可供人工处理、或不予处理。为此,它需要应用与你在 issue tracker 中*实际配置*的字符串相匹配的标签。如果你的仓库已使用不同的标签名称(例如 `bug:triage` 而不是 `needs-triage`),请在此处映射,以便技能应用正确的标签,而不是创建重复标签。
|
|
56
|
+
|
|
57
|
+
五个标准角色:
|
|
58
|
+
|
|
59
|
+
- `needs-triage` —— 维护者需要评估
|
|
60
|
+
- `needs-info` —— 等待报告者回复
|
|
61
|
+
- `ready-for-agent` —— 已完全明确,AFK 可用(agent 无需人工上下文即可领取)
|
|
62
|
+
- `ready-for-human` —— 需要人工实现
|
|
63
|
+
- `wontfix` —— 不予处理
|
|
64
|
+
|
|
65
|
+
默认值:每个角色的字符串等于其名称。询问用户是否需要覆盖。如果他们的 issue tracker 没有现有标签,默认值即可。
|
|
66
|
+
|
|
67
|
+
**C 节 —— 领域文档。**
|
|
68
|
+
|
|
69
|
+
> 解释:一些技能(`improve-codebase-architecture`、`diagnosing-bugs`、`tdd`)会读取 `CONTEXT.md` 文件以了解项目的领域语言,以及 `docs/adr/` 以了解过去的架构决策。它们需要知道仓库是有一个全局上下文还是有多个(例如 mono repo 中前端/后端各有独立上下文),以便在正确的位置查找。
|
|
70
|
+
|
|
71
|
+
确认布局:
|
|
72
|
+
|
|
73
|
+
- **单上下文** —— 仓库根目录下一个 `CONTEXT.md` + `docs/adr/`。大多数仓库属于此类。
|
|
74
|
+
- **多上下文** —— 根目录下 `CONTEXT-MAP.md` 指向各上下文的 `CONTEXT.md` 文件(通常为 mono repo)。
|
|
75
|
+
|
|
76
|
+
### 3. 确认并编辑
|
|
77
|
+
|
|
78
|
+
向用户展示以下内容的草稿:
|
|
79
|
+
|
|
80
|
+
- 要添加到 `CLAUDE.md` / `AGENTS.md`(根据第 4 步的选择规则决定编辑哪个文件)的 `## Agent skills` 块
|
|
81
|
+
- `docs/agents/issue-tracker.md`、`docs/agents/triage-labels.md`、`docs/agents/domain.md` 的内容
|
|
82
|
+
|
|
83
|
+
让他们在写入之前编辑。
|
|
84
|
+
|
|
85
|
+
### 4. 写入
|
|
86
|
+
|
|
87
|
+
**选择要编辑的文件:**
|
|
88
|
+
|
|
89
|
+
- 如果 `CLAUDE.md` 存在,编辑它。
|
|
90
|
+
- 否则如果 `AGENTS.md` 存在,编辑它。
|
|
91
|
+
- 如果两者都不存在,询问用户要创建哪一个 —— 不要替他们选择。
|
|
92
|
+
|
|
93
|
+
当 `CLAUDE.md` 已存在时绝不创建 `AGENTS.md`(反之亦然)—— 始终编辑已存在的那个。
|
|
94
|
+
|
|
95
|
+
如果所选文件中已有 `## Agent skills` 块,原地更新其内容,而不是追加重复块。不要覆盖用户对周围章节的编辑。
|
|
96
|
+
|
|
97
|
+
该块的内容:
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
## Agent skills
|
|
101
|
+
|
|
102
|
+
### Issue tracker
|
|
103
|
+
|
|
104
|
+
[关于 issue 跟踪位置的一句话总结,以及外部 PR 是否作为 triage 渠道]。参见 `docs/agents/issue-tracker.md`。
|
|
105
|
+
|
|
106
|
+
### Triage labels
|
|
107
|
+
|
|
108
|
+
[关于标签词汇表的一句话总结]。参见 `docs/agents/triage-labels.md`。
|
|
109
|
+
|
|
110
|
+
### Domain docs
|
|
111
|
+
|
|
112
|
+
[关于布局的一句话总结 —— "单上下文"或"多上下文"]。参见 `docs/agents/domain.md`。
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
然后使用此技能文件夹中的种子模板作为起点,写入三个文档文件:
|
|
116
|
+
|
|
117
|
+
- [issue-tracker-github.md](./issue-tracker-github.md) —— GitHub issue tracker
|
|
118
|
+
- [issue-tracker-gitlab.md](./issue-tracker-gitlab.md) —— GitLab issue tracker
|
|
119
|
+
- [issue-tracker-local.md](./issue-tracker-local.md) —— 本地 markdown issue tracker
|
|
120
|
+
- [triage-labels.md](./triage-labels.md) —— 标签映射
|
|
121
|
+
- [domain.md](./domain.md) —— 领域文档消费方规则 + 布局
|
|
122
|
+
|
|
123
|
+
对于"其他"issue tracker,根据用户的描述从头编写 `docs/agents/issue-tracker.md`。
|
|
124
|
+
|
|
125
|
+
### 5. 完成
|
|
126
|
+
|
|
127
|
+
告诉用户配置已完成,以及哪些工程化技能现在将读取这些文件。提醒他们之后可以直接编辑 `docs/agents/*.md` —— 只有在需要切换 issue tracker 或从头重新配置时才需要重新运行此技能。
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 领域文档
|
|
2
|
+
|
|
3
|
+
工程 skills 在探索代码库时应如何使用该仓库的领域文档。
|
|
4
|
+
|
|
5
|
+
## 在探索之前,阅读这些
|
|
6
|
+
|
|
7
|
+
- **`CONTEXT.md`**(位于仓库根目录),或
|
|
8
|
+
- **`CONTEXT-MAP.md`**(位于仓库根目录,如果存在的话)— 它指向每个上下文的一个 `CONTEXT.md`。阅读与主题相关的每一个。
|
|
9
|
+
- **`docs/adr/`** — 阅读涉及你要工作区域的 ADR。在多上下文仓库中,还要检查 `src/<context>/docs/adr/` 以获取上下文范围的决策。
|
|
10
|
+
|
|
11
|
+
如果这些文件都不存在,**静默继续**。不要标记它们的缺失;不要预先建议创建它们。`/domain-modeling` skill(通过 `/grill-with-docs` 和 `/improve-codebase-architecture` 到达)在术语或决策实际被确定时延迟创建它们。
|
|
12
|
+
|
|
13
|
+
## 文件结构
|
|
14
|
+
|
|
15
|
+
单上下文仓库(大多数仓库):
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/
|
|
19
|
+
├── CONTEXT.md
|
|
20
|
+
├── docs/adr/
|
|
21
|
+
│ ├── 0001-event-sourced-orders.md
|
|
22
|
+
│ └── 0002-postgres-for-write-model.md
|
|
23
|
+
└── src/
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
多上下文仓库(根目录存在 `CONTEXT-MAP.md`):
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/
|
|
30
|
+
├── CONTEXT-MAP.md
|
|
31
|
+
├── docs/adr/ ← 系统级决策
|
|
32
|
+
└── src/
|
|
33
|
+
├── ordering/
|
|
34
|
+
│ ├── CONTEXT.md
|
|
35
|
+
│ └── docs/adr/ ← 上下文特定决策
|
|
36
|
+
└── billing/
|
|
37
|
+
├── CONTEXT.md
|
|
38
|
+
└── docs/adr/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 使用术语表的词汇
|
|
42
|
+
|
|
43
|
+
当你的输出中命名了一个领域概念(在 issue 标题、重构提案、假设、测试名称中),使用 `CONTEXT.md` 中定义的术语。不要偏离到术语表明确避免的同义词。
|
|
44
|
+
|
|
45
|
+
如果你需要的概念尚未在术语表中,这是一个信号 — 要么你在发明项目不使用的语言(重新考虑),要么确实存在缺口(记录给 `/domain-modeling`)。
|
|
46
|
+
|
|
47
|
+
## 标记 ADR 冲突
|
|
48
|
+
|
|
49
|
+
如果你的输出与现有 ADR 矛盾,明确提出而不是默默覆盖:
|
|
50
|
+
|
|
51
|
+
> _与 ADR-0007(事件溯源订单)矛盾 — 但值得重新讨论,因为……_
|
package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-github.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 问题跟踪器:GitHub
|
|
2
|
+
|
|
3
|
+
该仓库的 Issues 和 PRD 以 GitHub issues 形式存在。所有操作使用 `gh` CLI。
|
|
4
|
+
|
|
5
|
+
## 约定
|
|
6
|
+
|
|
7
|
+
- **创建 issue**:`gh issue create --title "..." --body "..."`。多行正文使用 heredoc。
|
|
8
|
+
- **阅读 issue**:`gh issue view <number> --comments`,通过 `jq` 过滤评论并获取标签。
|
|
9
|
+
- **列出 issues**:`gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'`,配合适当的 `--label` 和 `--state` 过滤器。
|
|
10
|
+
- **评论 issue**:`gh issue comment <number> --body "..."`
|
|
11
|
+
- **应用 / 移除标签**:`gh issue edit <number> --add-label "..."` / `--remove-label "..."`
|
|
12
|
+
- **关闭**:`gh issue close <number> --comment "..."`
|
|
13
|
+
|
|
14
|
+
从 `git remote -v` 推断仓库 — 在 clone 仓库内运行时 `gh` 会自动推断。
|
|
15
|
+
|
|
16
|
+
## 将 Pull requests 作为分类处理面
|
|
17
|
+
|
|
18
|
+
**PR 作为请求处理面:否。** _(如果该仓库将外部 PR 视为功能请求,则设为 `yes`;`/triage` 读取此标志。)_
|
|
19
|
+
|
|
20
|
+
当设为 `yes` 时,PR 与 issue 一样经过相同的标签和状态处理,使用 `gh pr` 等价命令:
|
|
21
|
+
|
|
22
|
+
- **阅读 PR**:`gh pr view <number> --comments`,以及 `gh pr diff <number>` 查看 diff。
|
|
23
|
+
- **列出待分类的外部 PR**:`gh pr list --state open --json number,title,body,labels,author,authorAssociation,comments`,然后仅保留 `authorAssociation` 为 `CONTRIBUTOR`、`FIRST_TIME_CONTRIBUTOR` 或 `NONE` 的(排除 `OWNER`/`MEMBER`/`COLLABORATOR`)。
|
|
24
|
+
- **评论 / 标签 / 关闭**:`gh pr comment`、`gh pr edit --add-label`/`--remove-label`、`gh pr close`。
|
|
25
|
+
|
|
26
|
+
GitHub 在 issue 和 PR 之间共享同一个编号空间,因此一个裸的 `#42` 可能是两者之一 — 通过 `gh pr view 42` 解析,并回退到 `gh issue view 42`。
|
|
27
|
+
|
|
28
|
+
## 当 skill 说"发布到问题跟踪器"时
|
|
29
|
+
|
|
30
|
+
创建一个 GitHub issue。
|
|
31
|
+
|
|
32
|
+
## 当 skill 说"获取相关工单"时
|
|
33
|
+
|
|
34
|
+
运行 `gh issue view <number> --comments`。
|
|
35
|
+
|
|
36
|
+
## Wayfinding 操作
|
|
37
|
+
|
|
38
|
+
供 `/wayfinder` 使用。**地图**是一个包含**子** issue 作为工单的单个 issue。
|
|
39
|
+
|
|
40
|
+
- **地图**:一个标记为 `wayfinder:map` 的单个 issue,包含 Notes / Decisions-so-far / Fog 正文。`gh issue create --label wayfinder:map`。
|
|
41
|
+
- **子工单**:作为 GitHub 子 issue 链接到地图的 issue(在子 issue 端点上使用 `gh api`)。在子 issue 不可用的地方,将子工单添加到地图正文的任务列表中,并在子工单正文顶部放置 `Part of #<map>`。标签:`wayfinder:<type>`(`research`/`prototype`/`grilling`/`task`)。一旦认领,工单分配给驱动开发者。
|
|
42
|
+
- **阻塞**:GitHub 的**原生 issue 依赖** — 规范的、UI 可见的表示。通过 `gh api --method POST repos/<owner>/<repo>/issues/<child>/dependencies/blocked_by -F issue_id=<blocker-db-id>` 添加边,其中 `<blocker-db-id>` 是阻塞者的数字**数据库 id**(`gh api repos/<owner>/<repo>/issues/<n> --jq .id`,_不是_ `#number` 或 `node_id`)。GitHub 报告 `issue_dependencies_summary.blocked_by`(仅开放阻塞者 — 实时关卡)。在依赖不可用的地方,回退到子工单正文顶部的 `Blocked by: #<n>, #<n>` 行。当每个阻塞者都已关闭时,工单解除阻塞。
|
|
43
|
+
- **前沿查询**:列出地图的开放子工单(`gh issue list --state open`,限定在地图的子 issue / 任务列表范围内),排除任何有开放阻塞者(`issue_dependencies_summary.blocked_by > 0`,或 `Blocked by` 行中的开放 issue)或被分配的;按地图顺序取第一个。
|
|
44
|
+
- **认领**:`gh issue edit <n> --add-assignee @me` — 会话的首次写入。
|
|
45
|
+
- **解决**:`gh issue comment <n> --body "<answer>"`,然后 `gh issue close <n>`,然后将上下文指针(gist + 链接)追加到地图的 Decisions-so-far 中。
|
package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 问题跟踪器:GitLab
|
|
2
|
+
|
|
3
|
+
该仓库的 Issues 和 PRD 以 GitLab issues 形式存在。所有操作使用 [`glab`](https://gitlab.com/gitlab-org/cli) CLI。
|
|
4
|
+
|
|
5
|
+
## 约定
|
|
6
|
+
|
|
7
|
+
- **创建 issue**:`glab issue create --title "..." --description "..."`。多行描述使用 heredoc。传递 `--description -` 以打开编辑器。
|
|
8
|
+
- **阅读 issue**:`glab issue view <number> --comments`。使用 `-F json` 获取机器可读输出。
|
|
9
|
+
- **列出 issues**:`glab issue list -F json`,配合适当的 `--label` 过滤器。
|
|
10
|
+
- **评论 issue**:`glab issue note <number> --message "..."`。GitLab 将评论称为"notes"。
|
|
11
|
+
- **应用 / 移除标签**:`glab issue update <number> --label "..."` / `--unlabel "..."`。多个标签可以用逗号分隔或重复标志。
|
|
12
|
+
- **关闭**:`glab issue close <number>`。`glab issue close` 不接受关闭评论,因此先用 `glab issue note <number> --message "..."` 发布说明,然后关闭。
|
|
13
|
+
- **合并请求**:GitLab 将 PR 称为"merge requests"。使用 `glab mr create`、`glab mr view`、`glab mr note` 等 — 与 `gh pr ...` 形态相同,用 `mr` 替换 `pr`,用 `note`/`--message` 替换 `comment`/`--body`。
|
|
14
|
+
|
|
15
|
+
从 `git remote -v` 推断仓库 — 在 clone 仓库内运行时 `glab` 会自动推断。
|
|
16
|
+
|
|
17
|
+
## 将合并请求作为分类处理面
|
|
18
|
+
|
|
19
|
+
**MR 作为请求处理面:否。** _(如果该仓库将外部合并请求视为功能请求,则设为 `yes`;`/triage` 读取此标志。)_
|
|
20
|
+
|
|
21
|
+
当设为 `yes` 时,MR 与 issue 一样经过相同的标签和状态处理,使用 `glab mr` 等价命令:
|
|
22
|
+
|
|
23
|
+
- **阅读 MR**:`glab mr view <number> --comments`,以及 `glab mr diff <number>` 查看 diff。
|
|
24
|
+
- **列出待分类的外部 MR**:`glab mr list -F json`,然后仅保留作者不是项目成员/所有者的 MR(贡献者的 MR,而非维护者的进行中工作)。
|
|
25
|
+
- **评论 / 标签 / 关闭**:`glab mr note`、`glab mr update --label`/`--unlabel`、`glab mr close`。
|
|
26
|
+
|
|
27
|
+
与 GitHub 不同,GitLab 的 issue 和 MR 编号是分开的,因此一旦你知道维护者指的是哪个处理面,`#42` 就没有歧义。
|
|
28
|
+
|
|
29
|
+
## 当 skill 说"发布到问题跟踪器"时
|
|
30
|
+
|
|
31
|
+
创建一个 GitLab issue。
|
|
32
|
+
|
|
33
|
+
## 当 skill 说"获取相关工单"时
|
|
34
|
+
|
|
35
|
+
运行 `glab issue view <number> --comments`。
|
|
36
|
+
|
|
37
|
+
## Wayfinding 操作
|
|
38
|
+
|
|
39
|
+
供 `/wayfinder` 使用。**地图**是一个包含**子** issue 作为工单的单个 issue。
|
|
40
|
+
|
|
41
|
+
- **地图**:一个标记为 `wayfinder:map` 的单个 issue,包含 Notes / Decisions-so-far / Fog 正文。`glab issue create --label wayfinder:map`。(在支持原生 epic 的 GitLab 层级上,epic 可以承载地图;标记的 issue 在任何地方都通用。)
|
|
42
|
+
- **子工单**:一个 issue,在其描述顶部放置 `Part of #<map>`,标签为 `wayfinder:<type>`(`research`/`prototype`/`grilling`/`task`)。一旦认领,工单分配给驱动开发者。
|
|
43
|
+
- **阻塞**:GitLab 的**原生阻塞链接** — 规范的、UI 可见的表示。通过 `/blocked_by #<n>` 快速操作添加,以 note 形式发布(`glab issue note <child> --message "/blocked_by #<blocker>"`)。原生阻塞链接是 Premium/Ultimate 功能;在免费层级(或不可用的地方),回退到描述顶部的 `Blocked by: #<n>, #<n>` 行。当每个阻塞者都已关闭时,工单解除阻塞。
|
|
44
|
+
- **前沿查询**:`glab issue list -F json`,限定在地图的子工单范围内,排除任何有开放阻塞者的 — 指向开放 issue 的原生 `blocked_by` 链接(`glab api projects/:id/issues/:iid/links`),或 `Blocked by` 行中的开放 issue — 或被分配的;按地图顺序取第一个。
|
|
45
|
+
- **认领**:`glab issue update <n> --assignee @me` — 会话的首次写入。
|
|
46
|
+
- **解决**:`glab issue note <n> --message "<answer>"`,然后 `glab issue close <n>`,然后将上下文指针(gist + 链接)追加到地图的 Decisions-so-far 中。
|
package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-local.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# 问题跟踪器:本地 Markdown
|
|
2
|
+
|
|
3
|
+
该仓库的 Issues 和 PRD 以 markdown 文件形式存储在 `.scratch/` 中。
|
|
4
|
+
|
|
5
|
+
## 约定
|
|
6
|
+
|
|
7
|
+
- 每个功能一个目录:`.scratch/<feature-slug>/`
|
|
8
|
+
- PRD 为 `.scratch/<feature-slug>/PRD.md`
|
|
9
|
+
- 实现 issue 为 `.scratch/<feature-slug>/issues/<NN>-<slug>.md`,从 `01` 开始编号
|
|
10
|
+
- 分类状态记录为每个 issue 文件顶部附近的 `Status:` 行(参见 `triage-labels.md` 中的角色字符串)
|
|
11
|
+
- 评论和对话历史追加到文件底部 `## Comments` 标题下
|
|
12
|
+
|
|
13
|
+
## 当 skill 说"发布到问题跟踪器"时
|
|
14
|
+
|
|
15
|
+
在 `.scratch/<feature-slug>/` 下创建一个新文件(如有需要则创建目录)。
|
|
16
|
+
|
|
17
|
+
## 当 skill 说"获取相关工单"时
|
|
18
|
+
|
|
19
|
+
读取引用路径处的文件。用户通常会直接传递路径或 issue 编号。
|
|
20
|
+
|
|
21
|
+
## Wayfinding 操作
|
|
22
|
+
|
|
23
|
+
供 `/wayfinder` 使用。**地图**是一个文件,每个工单有一个**子**文件。
|
|
24
|
+
|
|
25
|
+
- **地图**:`.scratch/<effort>/map.md` — Notes / Decisions-so-far / Fog 正文。
|
|
26
|
+
- **子工单**:`.scratch/<effort>/issues/NN-<slug>.md`,从 `01` 开始编号,正文中包含问题。`Type:` 行记录工单类型(`research`/`prototype`/`grilling`/`task`);`Status:` 行记录 `claimed`/`resolved`。
|
|
27
|
+
- **阻塞**:顶部附近的 `Blocked by: NN, NN` 行。当其列出的每个文件都处于 `resolved` 状态时,工单解除阻塞。
|
|
28
|
+
- **前沿**:扫描 `.scratch/<effort>/issues/` 中处于开放、未阻塞且未认领状态的文件;按编号取第一个。
|
|
29
|
+
- **认领**:设置 `Status: claimed` 并在任何工作开始前保存。
|
|
30
|
+
- **解决**:在 `## Answer` 标题下追加答案,设置 `Status: resolved`,然后将上下文指针(gist + 链接)追加到 `map.md` 中地图的 Decisions-so-far 中。
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 分类标签
|
|
2
|
+
|
|
3
|
+
各 skills 使用五种规范的分类角色。本文件将这些角色映射到该仓库问题跟踪器中使用的实际标签字符串。
|
|
4
|
+
|
|
5
|
+
| 在 mattpocock/skills 中的标签 | 在我们跟踪器中的标签 | 含义 |
|
|
6
|
+
| -------------------------- | -------------------- | ---------------------------------------- |
|
|
7
|
+
| `needs-triage` | `needs-triage` | 维护者需要评估此 issue |
|
|
8
|
+
| `needs-info` | `needs-info` | 等待报告者提供更多信息 |
|
|
9
|
+
| `ready-for-agent` | `ready-for-agent` | 已完整定义,可供离线 Agent 执行 |
|
|
10
|
+
| `ready-for-human` | `ready-for-human` | 需要人工实现 |
|
|
11
|
+
| `wontfix` | `wontfix` | 不会采取行动 |
|
|
12
|
+
|
|
13
|
+
当 skill 提及某个角色(例如"应用 AFK-ready 分类标签")时,使用此表中对应的标签字符串。
|
|
14
|
+
|
|
15
|
+
编辑右侧列以匹配你实际使用的词汇。
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tdd
|
|
3
|
+
description: "测试驱动开发。适用于需要以测试先行方式构建功能或修复 bug、提及"红-绿-重构"循环、或需要集成测试的场景。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 测试驱动开发
|
|
7
|
+
|
|
8
|
+
TDD 是红 → 绿循环。此技能是该循环的参考指南,确保该循环产出的测试值得保留:什么是一个好的测试、测试放在哪里、反模式、以及循环的规则。每个章节在每次循环中都适用 —— 在循环之前和循环期间查阅,而不是之后。
|
|
9
|
+
|
|
10
|
+
在探索代码库时,读取 `CONTEXT.md`(如果存在),使测试名称和接口词汇与项目的领域语言保持一致,并尊重所涉及区域的 ADR。
|
|
11
|
+
|
|
12
|
+
## 什么是好的测试
|
|
13
|
+
|
|
14
|
+
测试通过公共接口验证行为,而不是实现细节。代码可以完全改变;测试不应该。一个好的测试读起来像规范 —— "用户可以使用有效购物车结账" 准确地告诉你存在什么能力 —— 并且在重构后能够存活,因为它不关心内部结构。
|
|
15
|
+
|
|
16
|
+
参见 [tests.md](tests.md) 了解示例,[mocking.md](mocking.md) 了解 Mock 指南。
|
|
17
|
+
|
|
18
|
+
## 接缝 —— 测试放置的位置
|
|
19
|
+
|
|
20
|
+
**接缝(seam)** 是你进行测试的公共边界:你在该接口处观察行为而不触及内部。测试位于接缝处,绝不针对内部细节。
|
|
21
|
+
|
|
22
|
+
**仅在预先约定的接缝处进行测试。** 在编写任何测试之前,写下要测试的接缝并与用户确认。没有在未确认的接缝处编写测试。你无法测试一切 —— 提前约定接缝可以确保测试工作集中在关键路径和复杂逻辑上,而不是每个边缘情况。
|
|
23
|
+
|
|
24
|
+
问:"公共接口是什么,我们应该在哪些接缝处进行测试?"
|
|
25
|
+
|
|
26
|
+
## 反模式
|
|
27
|
+
|
|
28
|
+
- **与实现耦合** —— mock 内部协作者、测试私有方法、或通过旁路通道验证(查询数据库而不是使用接口)。特征:当重构时代码行为未变但测试却失败了。
|
|
29
|
+
- **同义反复** —— 断言以与代码相同的方式重新计算预期值(`expect(add(a, b)).toBe(a + b)`、以相同方式手动推导的快照、将常量断言为等于自身),因此它在构造上就必然通过,永远不可能与代码产生分歧。预期值必须来自独立的真相来源 —— 已知正确的字面量、手工计算示例、规范。
|
|
30
|
+
- **水平切片** —— 先写所有测试,再写所有实现。批量测试验证的是*想象中*的行为:你测试的是事物的*形态*而非面向用户的行为,测试变得对真实变更不敏感,并且你在理解实现之前就锁定了测试结构。应采用**垂直切片** —— 一个测试 → 一个实现 → 重复,每个测试都是一颗**曳光弹**,响应上一个循环的反馈。
|
|
31
|
+
|
|
32
|
+
## 循环的规则
|
|
33
|
+
|
|
34
|
+
- **先红后绿。** 先写失败的测试,然后只写足以通过测试的代码。不要预测未来的测试或添加推测性功能。
|
|
35
|
+
- **一次一个切片。** 每个循环一个接缝、一个测试、一个最小实现。
|
|
36
|
+
- **重构不属于循环。** 它属于审查阶段(参见 `code-review` 技能),而不是红 → 绿实现循环的一部分。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 何时使用 Mock
|
|
2
|
+
|
|
3
|
+
仅在**系统边界**处使用 Mock:
|
|
4
|
+
|
|
5
|
+
- 外部 API(支付、邮件等)
|
|
6
|
+
- 数据库(有时 — 优先使用测试数据库)
|
|
7
|
+
- 时间/随机性
|
|
8
|
+
- 文件系统(有时)
|
|
9
|
+
|
|
10
|
+
不要 Mock:
|
|
11
|
+
|
|
12
|
+
- 你自己的类/模块
|
|
13
|
+
- 内部协作者
|
|
14
|
+
- 任何你控制的东西
|
|
15
|
+
|
|
16
|
+
## 为可 Mock 性设计
|
|
17
|
+
|
|
18
|
+
在系统边界处,设计易于 mock 的接口:
|
|
19
|
+
|
|
20
|
+
**1. 使用依赖注入**
|
|
21
|
+
|
|
22
|
+
将外部依赖从外部传入,而不是在内部创建:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// 易于 mock
|
|
26
|
+
function processPayment(order, paymentClient) {
|
|
27
|
+
return paymentClient.charge(order.total);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 难以 mock
|
|
31
|
+
function processPayment(order) {
|
|
32
|
+
const client = new StripeClient(process.env.STRIPE_KEY);
|
|
33
|
+
return client.charge(order.total);
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**2. 偏好 SDK 风格接口而非通用获取器**
|
|
38
|
+
|
|
39
|
+
为每个外部操作创建特定的函数,而不是带有条件逻辑的通用函数:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// 好:每个函数可以独立 mock
|
|
43
|
+
const api = {
|
|
44
|
+
getUser: (id) => fetch(`/users/${id}`),
|
|
45
|
+
getOrders: (userId) => fetch(`/users/${userId}/orders`),
|
|
46
|
+
createOrder: (data) => fetch('/orders', { method: 'POST', body: data }),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// 坏:mock 需要在 mock 内部编写条件逻辑
|
|
50
|
+
const api = {
|
|
51
|
+
fetch: (endpoint, options) => fetch(endpoint, options),
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
SDK 方式的优点:
|
|
56
|
+
- 每个 mock 返回一个特定的形态
|
|
57
|
+
- 测试设置中无需条件逻辑
|
|
58
|
+
- 更容易看出测试涉及哪些端点
|
|
59
|
+
- 每个端点的类型安全
|