@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,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: diagnosing-bugs
|
|
3
|
+
description: 针对疑难 bug 和性能回归的诊断循环。当用户说"诊断"/"调试这个",或报告有东西损坏/抛出异常/失败/变慢时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 诊断 Bug
|
|
7
|
+
|
|
8
|
+
针对疑难 bug 的规程。仅在明确有理由时才跳过阶段。
|
|
9
|
+
|
|
10
|
+
探索代码仓时,阅读 `CONTEXT.md`(如果存在)以获取相关模块的清晰心智模型,并检查你接触区域的 ADR。
|
|
11
|
+
|
|
12
|
+
## 阶段 1 — 构建反馈回路
|
|
13
|
+
|
|
14
|
+
**这就是核心技能。** 其他一切都是机械性的。如果你针对 bug 有一个**紧凑的**通过/失败信号 — 一个在_此_ bug 上会变红的信号 — 你就会找到原因;二分查找、假设检验和插桩都只是消费它。如果你没有一个这样的信号,再盯着代码看也救不了你。
|
|
15
|
+
|
|
16
|
+
在此投入不成比例的精力。**要激进。要有创意。拒绝放弃。**
|
|
17
|
+
|
|
18
|
+
### 构建方式 — 按大致顺序尝试
|
|
19
|
+
|
|
20
|
+
1. **失败测试**,位于能触及 bug 的任意缝合点 — 单元、集成、端到端。
|
|
21
|
+
2. **Curl / HTTP 脚本**,针对正在运行的开发服务器。
|
|
22
|
+
3. **CLI 调用**,带固定输入,将 stdout 与已知良好快照进行 diff。
|
|
23
|
+
4. **无头浏览器脚本**(Playwright / Puppeteer)— 驱动 UI,对 DOM/控制台/网络进行断言。
|
|
24
|
+
5. **回放捕获的追踪数据。** 将真实网络请求 / 负载 / 事件日志保存到磁盘;在隔离环境中通过代码路径回放。
|
|
25
|
+
6. **一次性测试夹具。** 启动系统的最小子集(一个服务、模拟依赖),用单个函数调用来驱动 bug 代码路径。
|
|
26
|
+
7. **属性 / 模糊测试循环。** 如果 bug 是"有时输出错误",运行 1000 次随机输入,寻找故障模式。
|
|
27
|
+
8. **二分查找夹具。** 如果 bug 出现在两个已知状态之间(commit、数据集、版本),自动化"在状态 X 启动、检查、重复"以便 `git bisect run`。
|
|
28
|
+
9. **差分循环。** 通过旧版本 vs 新版本(或两种配置)运行相同输入,对输出进行 diff。
|
|
29
|
+
10. **HITL bash 脚本。** 最后手段。如果必须由人工点击,用 `scripts/hitl-loop.template.sh` 驱动_他们_,使循环仍然结构化。捕获的输出反馈给你。
|
|
30
|
+
|
|
31
|
+
构建了正确的反馈回路,bug 就修复了 90%。
|
|
32
|
+
|
|
33
|
+
### 收紧回路
|
|
34
|
+
|
|
35
|
+
将回路视为产品。一旦你有了_一个_回路,**收紧**它:
|
|
36
|
+
|
|
37
|
+
- 能更快吗?(缓存设置,跳过无关初始化,缩小测试范围。)
|
|
38
|
+
- 信号能更清晰吗?(针对具体症状断言,而非"没崩溃"。)
|
|
39
|
+
- 能更确定性吗?(固定时间、种子随机数、隔离文件系统、冻结网络。)
|
|
40
|
+
|
|
41
|
+
一个 30 秒的抖动回路比没有回路好不了多少;一个 2 秒的确定性回路才是紧凑的 — 这是调试的超能力。
|
|
42
|
+
|
|
43
|
+
### 非确定性 bug
|
|
44
|
+
|
|
45
|
+
目标不是干净的复现,而是**更高的复现率**。循环触发 100 次,并行化,增加压力,缩小时间窗口,注入 sleep。50% 抖动的 bug 是可调试的;1% 则不行 — 持续提高复现率直到可调试。
|
|
46
|
+
|
|
47
|
+
### 当确实无法构建回路时
|
|
48
|
+
|
|
49
|
+
停下来,明确说明。列出你尝试过的方法。向用户请求:(a) 访问能复现的任何环境,(b) 一个捕获的产物(HAR 文件、日志转储、核心转储、带时间戳的屏幕录制),或 (c) 添加临时生产环境插桩的许可。**不要**在没有回路的情况下进入假设阶段。
|
|
50
|
+
|
|
51
|
+
### 完成标准 — 一个会变红的紧凑回路
|
|
52
|
+
|
|
53
|
+
阶段 1 完成的条件是回路**紧凑**且**具备变红能力**:你能说出**一条命令** — 一个脚本路径、一个测试调用、一个 curl — 你**已经至少运行过一次**(粘贴调用及其输出),并且该命令满足:
|
|
54
|
+
|
|
55
|
+
- [ ] **具备变红能力** — 它驱动实际的 bug 代码路径,并断言**用户的确切症状**,因此它能在此 bug 上变红,修复后变绿。不是"运行不出错" — 它必须能够_捕获这个具体的 bug_。
|
|
56
|
+
- [ ] **确定性** — 每次运行结果一致(抖动 bug:固定的、足够高的复现率,如上所述)。
|
|
57
|
+
- [ ] **快速** — 秒级,而非分钟级。
|
|
58
|
+
- [ ] **Agent 可运行** — 你可以无人值守地运行它;只有在通过 `scripts/hitl-loop.template.sh` 时才能有人工参与。
|
|
59
|
+
|
|
60
|
+
如果你发现自己在回路存在之前阅读代码来构建理论,**停下来 — 直接跳到假设正是本技能要防止的确切失败模式。** 没有变红能力的命令,就没有阶段 2。
|
|
61
|
+
|
|
62
|
+
## 阶段 2 — 复现 + 最小化
|
|
63
|
+
|
|
64
|
+
运行回路。看着它变红 — bug 出现。
|
|
65
|
+
|
|
66
|
+
确认:
|
|
67
|
+
|
|
68
|
+
- [ ] 回路产生了**用户**描述的故障模式 — 不是恰好碰巧在附近的另一个故障。错误的 bug = 错误的修复。
|
|
69
|
+
- [ ] 故障可跨多次运行复现(或对于非确定性 bug,以足够高的复现率可调试)。
|
|
70
|
+
- [ ] 你已捕获确切的症状(错误消息、错误输出、缓慢的计时),以便后续阶段验证修复确实解决了它。
|
|
71
|
+
|
|
72
|
+
### 最小化
|
|
73
|
+
|
|
74
|
+
一旦变红,将复现场景缩小到**仍能变红的最小场景**。**逐个**削减输入、调用者、配置、数据和步骤,每次削减后重新运行回路 — 只保留对故障有负载作用的部分。
|
|
75
|
+
|
|
76
|
+
为什么费这个劲:最小复现场景缩小了阶段 3 的假设空间(值得怀疑的移动部件更少),并成为阶段 5 的干净回归测试。
|
|
77
|
+
|
|
78
|
+
完成条件是**每个剩余元素都有负载作用** — 移除其中任何一个都会使回路变绿。
|
|
79
|
+
|
|
80
|
+
在复现**且**最小化之前不要继续。
|
|
81
|
+
|
|
82
|
+
## 阶段 3 — 提出假设
|
|
83
|
+
|
|
84
|
+
在测试任何假设之前生成 **3-5 个排名假设**。单一假设生成会锚定在第一个看似合理的想法上。
|
|
85
|
+
|
|
86
|
+
每个假设必须是**可证伪的**:陈述它的预测。
|
|
87
|
+
|
|
88
|
+
> 格式:"如果 <X> 是原因,那么 <改变 Y> 会使 bug 消失 / <改变 Z> 会使它更糟。"
|
|
89
|
+
|
|
90
|
+
如果你无法陈述预测,这个假设只是感觉 — 丢弃或精炼它。
|
|
91
|
+
|
|
92
|
+
**在测试之前向用户展示排名列表。** 他们通常拥有能立即重新排名的领域知识("我们刚刚部署了对第 3 项的改动"),或知道他们已经排除的假设。低成本检查点,大幅节省时间。如果用户 AFK,不要等待 — 按你的排名继续。
|
|
93
|
+
|
|
94
|
+
## 阶段 4 — 插桩
|
|
95
|
+
|
|
96
|
+
每个探测必须映射到阶段 3 中的一个具体预测。**每次只改变一个变量。**
|
|
97
|
+
|
|
98
|
+
工具偏好:
|
|
99
|
+
|
|
100
|
+
1. **调试器 / REPL 检查**,如果环境支持。一个断点胜过十行日志。
|
|
101
|
+
2. **针对性日志**,在能区分假设的边界处。
|
|
102
|
+
3. 永远不要"记录一切然后 grep"。
|
|
103
|
+
|
|
104
|
+
**用唯一前缀标记每条调试日志**,例如 `[DEBUG-a4f2]`。最后的清理只需一次 grep。未标记的日志保留;已标记的日志删除。
|
|
105
|
+
|
|
106
|
+
**性能分支。** 对于性能回归,日志通常是错误的。替代方案:建立基线测量(计时夹具、`performance.now()`、分析器、查询计划),然后二分查找。先测量,后修复。
|
|
107
|
+
|
|
108
|
+
## 阶段 5 — 修复 + 回归测试
|
|
109
|
+
|
|
110
|
+
在修复**之前**编写回归测试 — 但仅当存在**正确的缝合点**时才这样做。
|
|
111
|
+
|
|
112
|
+
正确的缝合点是指测试能在调用点处驱动**真实的 bug 模式**。如果唯一可用的缝合点太浅(bug 需要多个调用者时却只有单调用者测试,单元测试无法复现触发 bug 的调用链),在那里的回归测试会给出虚假的信心。
|
|
113
|
+
|
|
114
|
+
**如果不存在正确的缝合点,这本身就是发现。** 记录下来。代码仓架构正在阻止锁定此 bug。将此标记给下一阶段。
|
|
115
|
+
|
|
116
|
+
如果存在正确的缝合点:
|
|
117
|
+
|
|
118
|
+
1. 将最小复现转为该缝合点处的失败测试。
|
|
119
|
+
2. 看着它失败。
|
|
120
|
+
3. 应用修复。
|
|
121
|
+
4. 看着它通过。
|
|
122
|
+
5. 对原始(未最小化的)场景重新运行阶段 1 的反馈回路。
|
|
123
|
+
|
|
124
|
+
## 阶段 6 — 清理 + 事后分析
|
|
125
|
+
|
|
126
|
+
宣布完成前必须完成:
|
|
127
|
+
|
|
128
|
+
- [ ] 原始复现不再复现(重新运行阶段 1 的回路)
|
|
129
|
+
- [ ] 回归测试通过(或缝合点的缺失已被记录)
|
|
130
|
+
- [ ] 所有 `[DEBUG-...]` 插桩已移除(grep 该前缀)
|
|
131
|
+
- [ ] 一次性原型已删除(或移至明确标记的调试位置)
|
|
132
|
+
- [ ] 被证明正确的假设在 commit / PR 消息中陈述 — 以便下一个调试者学习
|
|
133
|
+
|
|
134
|
+
**然后问:什么本可以预防这个 bug?** 如果答案涉及架构变更(没有好的测试缝合点、纠缠的调用者、隐藏的耦合),将具体情况移交给 `/improve-codebase-architecture` 技能。在修复**之后**提出建议,而非之前 — 你现在比开始时拥有更多信息。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 人在回路(Human-in-the-loop)重现循环。
|
|
3
|
+
# 复制此文件,编辑下面的步骤,然后运行它。
|
|
4
|
+
# Agent 运行脚本;用户在其终端中按照提示操作。
|
|
5
|
+
#
|
|
6
|
+
# 用法:
|
|
7
|
+
# bash hitl-loop.template.sh
|
|
8
|
+
#
|
|
9
|
+
# 两个辅助函数:
|
|
10
|
+
# step "<指令>" → 显示指令,等待按 Enter
|
|
11
|
+
# capture VAR "<问题>" → 显示问题,读取响应到 VAR
|
|
12
|
+
#
|
|
13
|
+
# 结束时,捕获的值以 KEY=VALUE 格式打印,供 agent 解析。
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
step() {
|
|
18
|
+
printf '\n>>> %s\n' "$1"
|
|
19
|
+
read -r -p " [Enter when done] " _
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
capture() {
|
|
23
|
+
local var="$1" question="$2" answer
|
|
24
|
+
printf '\n>>> %s\n' "$question"
|
|
25
|
+
read -r -p " > " answer
|
|
26
|
+
printf -v "$var" '%s' "$answer"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# --- 在下方编辑 ---------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
step "Open the app at http://localhost:3000 and sign in."
|
|
32
|
+
|
|
33
|
+
capture ERRORED "Click the 'Export' button. Did it throw an error? (y/n)"
|
|
34
|
+
|
|
35
|
+
capture ERROR_MSG "Paste the error message (or 'none'):"
|
|
36
|
+
|
|
37
|
+
# --- 在上方编辑 ---------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
printf '\n--- Captured ---\n'
|
|
40
|
+
printf 'ERRORED=%s\n' "$ERRORED"
|
|
41
|
+
printf 'ERROR_MSG=%s\n' "$ERROR_MSG"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# ADR 格式
|
|
2
|
+
|
|
3
|
+
ADR 存放在 `docs/adr/` 中,使用顺序编号:`0001-slug.md`、`0002-slug.md` 等。
|
|
4
|
+
|
|
5
|
+
延迟创建 `docs/adr/` 目录 — 仅在需要第一个 ADR 时才创建。
|
|
6
|
+
|
|
7
|
+
## 模板
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
# {决策的简短标题}
|
|
11
|
+
|
|
12
|
+
{1-3 句话:背景是什么,我们做了什么决策,以及为什么。}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
就这样。一个 ADR 可以就是一个段落。其价值在于记录*已经*做出了决策以及*为什么* — 而不是填满各个部分。
|
|
16
|
+
|
|
17
|
+
## 可选部分
|
|
18
|
+
|
|
19
|
+
仅当它们真正增加价值时才包含这些。大多数 ADR 不需要它们。
|
|
20
|
+
|
|
21
|
+
- **Status** 前置元数据(`proposed | accepted | deprecated | superseded by ADR-NNNN`)— 当决策被重新审视时有用
|
|
22
|
+
- **Considered Options** — 仅当被拒绝的替代方案值得记住时
|
|
23
|
+
- **Consequences** — 仅当需要指出非显而易见的下游影响时
|
|
24
|
+
|
|
25
|
+
## 编号
|
|
26
|
+
|
|
27
|
+
扫描 `docs/adr/` 中的最高现有编号,然后加 1。
|
|
28
|
+
|
|
29
|
+
## 何时提供 ADR
|
|
30
|
+
|
|
31
|
+
以下三个条件必须同时为真:
|
|
32
|
+
|
|
33
|
+
1. **难以逆转** — 以后改变主意的成本是实质性的
|
|
34
|
+
2. **没有上下文的话令人惊讶** — 未来的读者会看着代码想"他们到底为什么这样做?"
|
|
35
|
+
3. **真实权衡的结果** — 确实存在替代方案,你基于特定原因选择了一个
|
|
36
|
+
|
|
37
|
+
如果决策容易逆转,跳过它 — 你反正会逆转的。如果不令人惊讶,没人会想为什么。如果没有真正的替代方案,那就没有可记录的,除了"我们做了显而易见的事"。
|
|
38
|
+
|
|
39
|
+
### 什么算作
|
|
40
|
+
|
|
41
|
+
- **架构形态。** "我们使用 monorepo。" "写模型采用事件溯源,读模型投影到 Postgres。"
|
|
42
|
+
- **上下文间的集成模式。** "Ordering 和 Billing 通过领域事件通信,而非同步 HTTP。"
|
|
43
|
+
- **带来锁定效应的技术选择。** 数据库、消息总线、认证提供商、部署目标。不是每个库 — 只是那些需要花一个季度才能替换的。
|
|
44
|
+
- **边界和范围决策。** "客户数据由 Customer 上下文拥有;其他上下文仅通过 ID 引用它。"明确的"不做"和"要做"同样有价值。
|
|
45
|
+
- **有意偏离显而易见路径的决策。** "我们使用手动 SQL 而不是 ORM,因为 X。"任何合理读者会假设相反的情况。这些可以阻止下一个工程师"修复"一个刻意为之的东西。
|
|
46
|
+
- **代码中不可见的约束。** "由于合规要求,我们不能使用 AWS。" "由于合作伙伴 API 合同,响应时间必须低于 200ms。"
|
|
47
|
+
- **拒绝的原因不明显的被拒绝替代方案。** 如果你考虑了 GraphQL 而因微妙原因选择了 REST,记录下来 — 否则 6 个月后有人会再次建议 GraphQL。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# CONTEXT.md 格式
|
|
2
|
+
|
|
3
|
+
## 结构
|
|
4
|
+
|
|
5
|
+
```md
|
|
6
|
+
# {上下文名称}
|
|
7
|
+
|
|
8
|
+
{对该上下文是什么以及为什么存在的一两句话描述。}
|
|
9
|
+
|
|
10
|
+
## Language
|
|
11
|
+
|
|
12
|
+
**Order**:
|
|
13
|
+
{对该术语的一两句话描述}
|
|
14
|
+
_Avoid_: Purchase, transaction
|
|
15
|
+
|
|
16
|
+
**Invoice**:
|
|
17
|
+
发货后发送给客户的付款请求。
|
|
18
|
+
_Avoid_: Bill, payment request
|
|
19
|
+
|
|
20
|
+
**Customer**:
|
|
21
|
+
下订单的个人或组织。
|
|
22
|
+
_Avoid_: Client, buyer, account
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 规则
|
|
26
|
+
|
|
27
|
+
- **要有主见。** 当同一概念存在多个词时,选择最好的那个,并将其他的列在 `_Avoid_` 下。
|
|
28
|
+
- **定义保持精炼。** 最多一两句话。定义它是什么,而不是它做什么。
|
|
29
|
+
- **仅包含特定于该项目上下文的术语。** 通用的编程概念(超时、错误类型、工具模式)即使项目广泛使用也不属于这里。添加术语前自问:这是该上下文独有的概念,还是一个通用编程概念?只有前者才属于这里。
|
|
30
|
+
- **当自然形成聚类时,用子标题分组术语。** 如果所有术语属于一个单一的凝聚领域,扁平列表也可以。
|
|
31
|
+
|
|
32
|
+
## 单上下文 vs 多上下文仓库
|
|
33
|
+
|
|
34
|
+
**单上下文(大多数仓库):** 在仓库根目录下一个 `CONTEXT.md`。
|
|
35
|
+
|
|
36
|
+
**多上下文:** 在仓库根目录下一个 `CONTEXT-MAP.md` 列出各个上下文、它们的位置以及它们之间的关系:
|
|
37
|
+
|
|
38
|
+
```md
|
|
39
|
+
# Context Map
|
|
40
|
+
|
|
41
|
+
## Contexts
|
|
42
|
+
|
|
43
|
+
- [Ordering](./src/ordering/CONTEXT.md) — 接收并跟踪客户订单
|
|
44
|
+
- [Billing](./src/billing/CONTEXT.md) — 生成发票并处理付款
|
|
45
|
+
- [Fulfillment](./src/fulfillment/CONTEXT.md) — 管理仓库拣货和发货
|
|
46
|
+
|
|
47
|
+
## Relationships
|
|
48
|
+
|
|
49
|
+
- **Ordering → Fulfillment**:Ordering 发出 `OrderPlaced` 事件;Fulfillment 消费它们以开始拣货
|
|
50
|
+
- **Fulfillment → Billing**:Fulfillment 发出 `ShipmentDispatched` 事件;Billing 消费它们以生成发票
|
|
51
|
+
- **Ordering ↔ Billing**:共享 `CustomerId` 和 `Money` 类型
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
该 skill 会根据存在情况推断适用哪种结构:
|
|
55
|
+
|
|
56
|
+
- 如果存在 `CONTEXT-MAP.md`,读取它以找到各个上下文
|
|
57
|
+
- 如果只存在根目录下的 `CONTEXT.md`,则为单上下文
|
|
58
|
+
- 如果两者都不存在,当第一个术语被确定时延迟创建一个根目录下的 `CONTEXT.md`
|
|
59
|
+
|
|
60
|
+
当存在多个上下文时,推断当前主题与哪个上下文相关。如果不清楚,询问。
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: domain-modeling
|
|
3
|
+
description: 构建和精炼项目的领域模型。当用户想要确定领域术语或通用语言、记录架构决策,或当其他技能需要维护领域模型时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 领域建模
|
|
7
|
+
|
|
8
|
+
在设计过程中积极构建和精炼项目的领域模型。这是*主动*规程 — 挑战术语、发明边界场景、并在决策结晶的那一刻立即写下词汇表和决策。(仅仅_阅读_ `CONTEXT.md` 获取词汇不是本技能 — 那是任何技能都可以做到的一行习惯。本技能用于当你正在_改变_模型,而不仅仅是消费它时。)
|
|
9
|
+
|
|
10
|
+
## 文件结构
|
|
11
|
+
|
|
12
|
+
大多数仓库只有一个上下文:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
/
|
|
16
|
+
├── CONTEXT.md
|
|
17
|
+
├── docs/
|
|
18
|
+
│ └── adr/
|
|
19
|
+
│ ├── 0001-event-sourced-orders.md
|
|
20
|
+
│ └── 0002-postgres-for-write-model.md
|
|
21
|
+
└── src/
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
如果根目录存在 `CONTEXT-MAP.md`,则仓库有多个上下文。该映射指向每个上下文所在的位置:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
/
|
|
28
|
+
├── CONTEXT-MAP.md
|
|
29
|
+
├── docs/
|
|
30
|
+
│ └── adr/ ← 系统级决策
|
|
31
|
+
├── src/
|
|
32
|
+
│ ├── ordering/
|
|
33
|
+
│ │ ├── CONTEXT.md
|
|
34
|
+
│ │ └── docs/adr/ ← 上下文特定的决策
|
|
35
|
+
│ └── billing/
|
|
36
|
+
│ ├── CONTEXT.md
|
|
37
|
+
│ └── docs/adr/
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
延迟创建文件 — 仅当有内容可写时才创建。如果 `CONTEXT.md` 不存在,在第一个术语确定时创建。如果 `docs/adr/` 不存在,在第一个 ADR 需要时创建。
|
|
41
|
+
|
|
42
|
+
## 会话期间
|
|
43
|
+
|
|
44
|
+
### 对照词汇表挑战
|
|
45
|
+
|
|
46
|
+
当用户使用的术语与 `CONTEXT.md` 中的现有语言冲突时,立即指出。"你的词汇表将 'cancellation' 定义为 X,但你似乎指的是 Y — 到底是哪个?"
|
|
47
|
+
|
|
48
|
+
### 精炼模糊语言
|
|
49
|
+
|
|
50
|
+
当用户使用含糊或重载的术语时,提出一个精确的规范术语。"你在说 'account' — 你指的是 Customer 还是 User?它们是不同的东西。"
|
|
51
|
+
|
|
52
|
+
### 讨论具体场景
|
|
53
|
+
|
|
54
|
+
当讨论领域关系时,用具体场景进行压力测试。发明探索边界情况的场景,迫使用户精确界定概念之间的边界。
|
|
55
|
+
|
|
56
|
+
### 与代码交叉引用
|
|
57
|
+
|
|
58
|
+
当用户陈述某事如何工作时,检查代码是否一致。如果发现矛盾,指出来:"你的代码取消的是整个 Order,但你刚才说部分取消是可能的 — 哪个是正确的?"
|
|
59
|
+
|
|
60
|
+
### 及时更新 CONTEXT.md
|
|
61
|
+
|
|
62
|
+
当术语确定时,当场更新 `CONTEXT.md`。不要批量处理 — 发生时立即捕获。使用 [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md) 中的格式。
|
|
63
|
+
|
|
64
|
+
`CONTEXT.md` 应该完全不包含实现细节。不要将 `CONTEXT.md` 当作规范、草稿纸或实现决策的仓库。它只是词汇表,别无其他。
|
|
65
|
+
|
|
66
|
+
### 谨慎创建 ADR
|
|
67
|
+
|
|
68
|
+
仅在以下三个条件全部满足时才提供创建 ADR:
|
|
69
|
+
|
|
70
|
+
1. **难以逆转** — 以后改变主意的成本是有意义的
|
|
71
|
+
2. **没有上下文会令人惊讶** — 未来的读者会疑惑"他们为什么这样做?"
|
|
72
|
+
3. **真实权衡的结果** — 存在真正的替代方案,你出于特定原因选择了一个
|
|
73
|
+
|
|
74
|
+
如果缺少任何一个条件,跳过 ADR。使用 [ADR-FORMAT.md](./ADR-FORMAT.md) 中的格式。
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# HTML 报告格式
|
|
2
|
+
|
|
3
|
+
架构审查渲染为一个独立的 HTML 文件,存放在操作系统临时目录中。Tailwind 和 Mermaid 均来自 CDN。Mermaid 处理图形状的图表;手工构建的 div 和内联 SVG 处理更具编辑性的可视化(质量图、横截面图)。混合使用两者 — 不要所有事情都依赖 Mermaid,否则会变得千篇一律。
|
|
4
|
+
|
|
5
|
+
## 脚手架
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!doctype html>
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8" />
|
|
12
|
+
<title>Architecture review — {{repo name}}</title>
|
|
13
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
14
|
+
<script type="module">
|
|
15
|
+
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
|
|
16
|
+
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
|
|
17
|
+
</script>
|
|
18
|
+
<style>
|
|
19
|
+
/* Tailwind 无法很好覆盖的小型自定义层:
|
|
20
|
+
虚线接缝线、手绘感箭头等。 */
|
|
21
|
+
.seam { stroke-dasharray: 4 4; }
|
|
22
|
+
.leak { stroke: #dc2626; }
|
|
23
|
+
.deep { background: linear-gradient(135deg, #0f172a, #1e293b); }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body class="bg-stone-50 text-slate-900 font-sans">
|
|
27
|
+
<main class="max-w-5xl mx-auto px-6 py-12 space-y-12">
|
|
28
|
+
<header>...</header>
|
|
29
|
+
<section id="candidates" class="space-y-10">...</section>
|
|
30
|
+
<section id="top-recommendation">...</section>
|
|
31
|
+
</main>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 页头
|
|
37
|
+
|
|
38
|
+
仓库名称、日期和一个紧凑的图例:实线框 = 模块,虚线 = 接缝,红色箭头 = 泄漏,粗黑框 = 深模块。无介绍段落 — 直接进入候选。
|
|
39
|
+
|
|
40
|
+
## 候选卡片
|
|
41
|
+
|
|
42
|
+
图表承担主要分量。文字稀疏、平实,并使用来自 `/codebase-design` skill 的术语,不刻意修饰。
|
|
43
|
+
|
|
44
|
+
每个候选是一个 `<article>`:
|
|
45
|
+
|
|
46
|
+
- **标题** — 简短,命名深化方案(例如"Collapse the Order intake pipeline")。
|
|
47
|
+
- **徽章行** — 推荐强度(`Strong` = 翡翠绿,`Worth exploring` = 琥珀色,`Speculative` = 石板灰),外加一个依赖类别标签(`in-process`、`local-substitutable`、`ports & adapters`、`mock`)。
|
|
48
|
+
- **文件** — 等宽字体列表,`font-mono text-sm`。
|
|
49
|
+
- **Before / After 图表** — 核心。两列,并排。参见下方模式。
|
|
50
|
+
- **Problem** — 一句话。痛点是什么。
|
|
51
|
+
- **Solution** — 一句话。改变了什么。
|
|
52
|
+
- **Wins** — 要点,每个不超过 6 个词。例如 "Tests hit one interface"、"Pricing logic stops leaking"、"Delete 4 shallow wrappers"。
|
|
53
|
+
- **ADR 标注**(如适用)— 一行,放在琥珀色调的框中。
|
|
54
|
+
|
|
55
|
+
无需解释段落。如果图表需要一段文字才能理解,重新画图。
|
|
56
|
+
|
|
57
|
+
## 图表模式
|
|
58
|
+
|
|
59
|
+
选择适合候选的模式。混合使用它们。不要让每个图表看起来都一样 — 多样性本身就是目的的一部分。
|
|
60
|
+
|
|
61
|
+
### Mermaid 图表(依赖/调用流的常用工具)
|
|
62
|
+
|
|
63
|
+
当重点是"X 调用 Y 调用 Z,看看这有多混乱"时,使用 Mermaid `flowchart` 或 `graph`。用 Tailwind 风格卡片包裹它,这样不会显得突兀。使用 classDef 将泄漏边缘着红色,深模块着深色。序列图适合展示"before:6 个往返;after:1 个"。
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<div class="rounded-lg border border-slate-200 bg-white p-4">
|
|
67
|
+
<pre class="mermaid">
|
|
68
|
+
flowchart LR
|
|
69
|
+
A[OrderHandler] --> B[OrderValidator]
|
|
70
|
+
B --> C[OrderRepo]
|
|
71
|
+
C -.leak.-> D[PricingClient]
|
|
72
|
+
classDef leak stroke:#dc2626,stroke-width:2px;
|
|
73
|
+
class C,D leak
|
|
74
|
+
</pre>
|
|
75
|
+
</div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 手工绘制的框线图(当 Mermaid 的布局难以驾驭时)
|
|
79
|
+
|
|
80
|
+
模块用带边框和标签的 `<div>` 表示。箭头用绝对定位在相对容器上的内联 SVG `<line>` 或 `<path>` 元素表示。当你希望"after"图表看起来像一个粗边的深模块,内部元素灰显时使用 — Mermaid 不会以合适的权重渲染这种效果。
|
|
81
|
+
|
|
82
|
+
### 横截面图(适合分层浅度)
|
|
83
|
+
|
|
84
|
+
堆叠水平条(`h-12 border-l-4`)来展示调用经过的各层。Before:6 个薄层,每个都不做什么。After:一个厚条,标注合并后的职责。
|
|
85
|
+
|
|
86
|
+
### 质量图(适合"接口与实现一样宽"的场景)
|
|
87
|
+
|
|
88
|
+
每个模块两个矩形 — 一个表示接口表面积,一个表示实现。Before:接口矩形几乎和实现矩形一样高(浅)。After:接口矩形短,实现矩形高(深)。
|
|
89
|
+
|
|
90
|
+
### 调用图坍缩
|
|
91
|
+
|
|
92
|
+
Before:嵌套框呈现的函数调用树。After:同一棵树坍缩成一个框,内部调用在其内部以淡化形式显示。
|
|
93
|
+
|
|
94
|
+
## 样式指导
|
|
95
|
+
|
|
96
|
+
- 偏向编辑风格,而非企业仪表盘风格。宽松的留白。标题可选择衬线字体(`font-serif` 与 stone/slate 搭配效果很好)。
|
|
97
|
+
- 色彩使用克制:一种强调色(翠绿或靛蓝),加上红色用于泄漏,琥珀色用于警告。
|
|
98
|
+
- 保持图表约 320px 高,使 before/after 能够舒适地并排放置而无需滚动。
|
|
99
|
+
- 使用 `text-xs uppercase tracking-wider` 用于图表内的模块标签 — 它们应读起来像示意图,而非 UI。
|
|
100
|
+
- 唯一的脚本是 Tailwind CDN 和 Mermaid ESM 导入。除此之外报告是静态的 — 没有应用代码,除了 Mermaid 自身的渲染之外没有交互。
|
|
101
|
+
|
|
102
|
+
## 顶部推荐部分
|
|
103
|
+
|
|
104
|
+
一张更大的卡片。候选名称,一句话说明为什么,指向其卡片的锚链接。这就够了。
|
|
105
|
+
|
|
106
|
+
## 语气
|
|
107
|
+
|
|
108
|
+
平实的英语,简洁 — 但架构名词和动词直接来自 `/codebase-design` skill。简洁不是偏离的借口。
|
|
109
|
+
|
|
110
|
+
**完全使用:** module、interface、implementation、depth、deep、shallow、seam、adapter、leverage、locality。
|
|
111
|
+
|
|
112
|
+
**绝不替代:** component、service、unit(代替 module)· API、signature(代替 interface)· boundary(代替 seam)· layer、wrapper(代替 module,当你的意思是 module 时)。
|
|
113
|
+
|
|
114
|
+
**符合风格的表达方式:**
|
|
115
|
+
|
|
116
|
+
- "Order intake module is shallow — interface nearly matches the implementation."
|
|
117
|
+
- "Pricing leaks across the seam."
|
|
118
|
+
- "Deepen: one interface, one place to test."
|
|
119
|
+
- "Two adapters justify the seam: HTTP in prod, in-memory in tests."
|
|
120
|
+
|
|
121
|
+
**Wins 要点**用术语表命名收益:*"locality: bugs concentrate in one module"*、*"leverage: one interface, N call sites"*、*"interface shrinks; implementation absorbs the wrappers"*。不要写 *"easier to maintain"* 或 *"cleaner code"* — 这些术语不在术语表中,不值得留下。
|
|
122
|
+
|
|
123
|
+
不模糊其词,不清喉咙,不说"值得注意的是……"。如果一句话可以变成一个要点,就变成要点。如果一个要点可以删除,就删除它。如果一个术语不在 `/codebase-design` 术语表中,在发明新术语之前先用术语表中已有的。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: improve-codebase-architecture
|
|
3
|
+
description: 扫描代码仓寻找深化机会,以可视化 HTML 报告呈现,然后针对你选择的任一方案进行访谈打磨。
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 改善代码仓架构
|
|
8
|
+
|
|
9
|
+
揭示架构摩擦,提出**深化机会** — 将浅层模块转变为深层模块的重构。目标是可测试性和 AI 可导航性。
|
|
10
|
+
|
|
11
|
+
此命令_基于_项目的领域模型,并建立在共享设计词汇之上:
|
|
12
|
+
|
|
13
|
+
- 运行 `/codebase-design` 技能获取架构词汇(**module**、**interface**、**depth**、**seam**、**adapter**、**leverage**、**locality**)及其原则(删除测试、"接口就是测试表面"、"一个适配器 = 假设缝合点,两个 = 真实缝合点")。在每个建议中严格使用这些术语 — 不要滑向 "component"、"service"、"API" 或 "boundary"。
|
|
14
|
+
- `CONTEXT.md` 中的领域语言为好的缝合点提供名称;`docs/adr/` 中的 ADR 记录此命令不应重新争论的决策。
|
|
15
|
+
|
|
16
|
+
## 流程
|
|
17
|
+
|
|
18
|
+
### 1. 探索
|
|
19
|
+
|
|
20
|
+
首先阅读项目的领域词汇表(`CONTEXT.md`)和你接触区域的任何 ADR。
|
|
21
|
+
|
|
22
|
+
然后使用 Agent 工具,以 `subagent_type=Explore` 遍历代码仓。不要遵循僵化的启发式 — 有机地探索,注意你在何处遇到摩擦:
|
|
23
|
+
|
|
24
|
+
- 理解一个概念需要在多个小模块之间反复跳跃?
|
|
25
|
+
- 哪些模块是**浅层的** — 接口几乎和实现一样复杂?
|
|
26
|
+
- 哪些纯函数仅为了可测试性而被提取,但真正的 bug 却隐藏在它们的调用方式中(没有**局部性**)?
|
|
27
|
+
- 哪些紧密耦合的模块在其缝合点处泄漏?
|
|
28
|
+
- 代码仓的哪些部分未经测试,或难以通过其当前接口进行测试?
|
|
29
|
+
|
|
30
|
+
对你怀疑是浅层的任何东西应用**删除测试**:删除它会集中复杂性,还是仅仅移动它?"是的,会集中"就是你想要的信号。
|
|
31
|
+
|
|
32
|
+
### 2. 以 HTML 报告呈现候选方案
|
|
33
|
+
|
|
34
|
+
将自包含的 HTML 文件写入操作系统临时目录,以免任何内容落入仓库。从 `$TMPDIR` 解析临时目录,回退到 `/tmp`(Windows 上用 `%TEMP%`),写入 `<临时目录>/architecture-review-<时间戳>.html`,使每次运行获得全新文件。为用户打开它 — Linux 上用 `xdg-open <路径>`,macOS 上用 `open <路径>`,Windows 上用 `start <路径>` — 并告知绝对路径。
|
|
35
|
+
|
|
36
|
+
报告使用 **Tailwind via CDN** 进行布局和样式设置,使用 **Mermaid via CDN** 绘制图/流程/序列可靠传达结构的图表。混合使用 Mermaid 和手写 CSS/SVG 视觉效果 — 当关系是图形态时(调用图、依赖关系、序列)使用 Mermaid,当想要更偏编辑性时(质量图、横截面、折叠动画)使用手写 div/SVG。每个候选方案包含一个**前后对比可视化**。要注重视觉效果。
|
|
37
|
+
|
|
38
|
+
为每个候选方案渲染一张卡片,包含:
|
|
39
|
+
|
|
40
|
+
- **文件** — 涉及哪些文件/模块
|
|
41
|
+
- **问题** — 为什么当前架构正在造成摩擦
|
|
42
|
+
- **解决方案** — 用简明英语描述将发生什么变化
|
|
43
|
+
- **收益** — 用局部性和杠杆效应解释,以及测试将如何改善
|
|
44
|
+
- **前后对比图** — 并排,自定义绘制,展示浅层性和深化过程
|
|
45
|
+
- **建议强度** — `Strong`、`Worth exploring`、`Speculative` 之一,渲染为徽章
|
|
46
|
+
|
|
47
|
+
以**最佳推荐**部分结束报告:你会首先处理哪个候选方案以及原因。
|
|
48
|
+
|
|
49
|
+
**使用 CONTEXT.md 的词汇处理领域,使用 `/codebase-design` 的词汇处理架构。** 如果 `CONTEXT.md` 定义了 "Order",谈论 "Order 接收模块" — 而非 "FooBarHandler",也非 "Order 服务"。
|
|
50
|
+
|
|
51
|
+
**ADR 冲突**:如果某个候选方案与现有 ADR 矛盾,仅在摩擦足够真实、值得重新审视 ADR 时才提出。在卡片中清晰标记(例如警告标注:_"与 ADR-0007 矛盾 — 但值得重新讨论因为……"_)。不要列出 ADR 禁止的所有理论重构。
|
|
52
|
+
|
|
53
|
+
参见 [HTML-REPORT.md](HTML-REPORT.md) 获取完整的 HTML 脚手架、图表模式和样式指南。
|
|
54
|
+
|
|
55
|
+
此时**不要**提出接口。文件写入后,询问用户:"你想探索其中哪一个?"
|
|
56
|
+
|
|
57
|
+
### 3. 访谈循环
|
|
58
|
+
|
|
59
|
+
一旦用户选择了候选方案,运行 `/grilling` 技能与他们一起遍历设计树 — 约束、依赖、深化模块的形状、缝合点后面的内容、哪些测试存留下来。
|
|
60
|
+
|
|
61
|
+
当决策结晶时,副作用即时发生 — 运行 `/domain-modeling` 技能保持领域模型同步更新:
|
|
62
|
+
|
|
63
|
+
- **为 `CONTEXT.md` 中没有的概念命名深化模块?** 将术语添加到 `CONTEXT.md`。如果文件不存在则延迟创建。
|
|
64
|
+
- **在对话中精炼模糊术语?** 当场更新 `CONTEXT.md`。
|
|
65
|
+
- **用户以具有负载作用的理由拒绝候选方案?** 提供 ADR,框架为:_"要我将其记录为 ADR 吗?这样未来的架构审查不会重新建议它。"_ 仅在未来的探索者确实需要此理由来避免重新建议相同内容时才提供 — 跳过暂时性理由("现在不值得做")和自明性理由。
|
|
66
|
+
- **想要探索深化模块的替代接口?** 运行 `/codebase-design` 技能并使用其"设计两次"并行子 agent 模式。
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# 逻辑原型
|
|
2
|
+
|
|
3
|
+
一个小型交互式终端应用,让用户手动驱动状态模型。当问题与**业务逻辑、状态转换或数据形态**相关时使用 — 这类问题在纸面上看起来合理,但只有在通过真实案例推动时才会感到不对。
|
|
4
|
+
|
|
5
|
+
## 何时适合使用这种形式
|
|
6
|
+
|
|
7
|
+
- "我不确定这个状态机是否处理 X 然后 Y 的边界情况。"
|
|
8
|
+
- "这个数据模型是否真的能让我表示……这种情况?"
|
|
9
|
+
- "我想在写代码之前感受一下 API 应该是什么样子。"
|
|
10
|
+
- 任何用户想要**按下按钮观看状态变化**的场景。
|
|
11
|
+
|
|
12
|
+
如果问题是"这应该长什么样" — 走错分支了。请使用 [UI.md](UI.md)。
|
|
13
|
+
|
|
14
|
+
## 流程
|
|
15
|
+
|
|
16
|
+
### 1. 明确问题
|
|
17
|
+
|
|
18
|
+
在写代码之前,写下你在为哪个状态模型和什么问题做原型。一段话,放在原型的 README 中或文件顶部的注释中。一个回答了错误问题的逻辑原型纯属浪费 — 明确问题以便稍后检查,无论用户是现在看着还是稍后回来离线查看。
|
|
19
|
+
|
|
20
|
+
### 2. 选择语言
|
|
21
|
+
|
|
22
|
+
使用宿主项目使用的任何语言。如果项目没有明显的运行时(例如文档仓库),则询问。
|
|
23
|
+
|
|
24
|
+
匹配项目现有的工具约定 — 不要仅仅为了原型而添加新的包管理器或运行时。
|
|
25
|
+
|
|
26
|
+
### 3. 将逻辑隔离在可移植模块中
|
|
27
|
+
|
|
28
|
+
将实际逻辑 — 回答问题的部分 — 放在一个小的纯接口后面,这个接口可以提取出来稍后放入真实代码库。围绕它的 TUI 是一次性的;逻辑模块不应该是。
|
|
29
|
+
|
|
30
|
+
正确的形态取决于问题:
|
|
31
|
+
|
|
32
|
+
- **纯 reducer** — `(state, action) => state`。适合动作为离散事件且状态是单个值的情况。
|
|
33
|
+
- **状态机** — 明确的状态和转换。适合"哪些动作在当前状态下是合法的"本身就是问题的一部分。
|
|
34
|
+
- **一组在纯数据类型上的小函数。** 适合没有隐式当前状态的情况 — 只是转换。
|
|
35
|
+
- **具有清晰方法面的类或模块**,当逻辑确实拥有持续的内部状态时。
|
|
36
|
+
|
|
37
|
+
选择最适合所问问题的形态,*而不是*最容易连接到 TUI 的形态。保持纯:无 I/O、无终端代码、无用于控制流的 `console.log`。TUI 导入它并调用它;没有任何东西向相反方向流动。
|
|
38
|
+
|
|
39
|
+
这就是让原型在其生命周期之后仍然有用的关键。当问题得到回答后,经过验证的 reducer / 状态机 / 函数集可以被提取到真实模块中 — TUI 外壳则被删除。
|
|
40
|
+
|
|
41
|
+
### 4. 构建最小的 TUI 来暴露状态
|
|
42
|
+
|
|
43
|
+
将其构建为**轻量级 TUI** — 在每个时钟周期,清除屏幕(`console.clear()` / `print("\033[2J\033[H")` / 等价方式)并重新渲染整个帧。用户应始终看到一个稳定的视图,而非不断增长的滚动日志。
|
|
44
|
+
|
|
45
|
+
每帧有两个部分,按此顺序:
|
|
46
|
+
|
|
47
|
+
1. **当前状态**,美化打印且便于 diff(每行一个字段,或格式化的 JSON)。使用**粗体**表示字段名或节标题,**暗色**表示不太重要的上下文(时间戳、ID、派生值)。原生 ANSI 转义码即可 — `\x1b[1m` 粗体,`\x1b[2m` 暗色,`\x1b[0m` 重置。除非项目中已有样式库,否则无需引入。
|
|
48
|
+
2. **键盘快捷键**,列在底部:`[a] add user [d] delete user [t] tick clock [q] quit`。粗体显示按键,暗色显示描述,或反之 — 读起来清晰即可。
|
|
49
|
+
|
|
50
|
+
行为:
|
|
51
|
+
|
|
52
|
+
1. **初始化状态** — 单个内存中的对象/结构体。启动时渲染第一帧。
|
|
53
|
+
2. **一次读取一个按键(或一行)**,分发给变更状态的处理函数。
|
|
54
|
+
3. **在每次操作后重新渲染**完整帧 — 不要追加,替换。
|
|
55
|
+
4. **循环直到退出。**
|
|
56
|
+
|
|
57
|
+
整个帧应能放在一屏内。
|
|
58
|
+
|
|
59
|
+
### 5. 使其通过一条命令即可运行
|
|
60
|
+
|
|
61
|
+
在项目现有的任务运行器(`package.json` scripts、`Makefile`、`justfile`、`pyproject.toml`)中添加一个脚本。用户应该运行 `pnpm run <prototype-name>` 或等价命令 — 永远不需要记忆路径。
|
|
62
|
+
|
|
63
|
+
如果宿主项目没有任务运行器,直接将命令放在原型的 README 顶部。
|
|
64
|
+
|
|
65
|
+
### 6. 交付
|
|
66
|
+
|
|
67
|
+
将运行命令交给用户。他们自己驱动;有趣的时刻是当他们说"等等,这不应该是可能的"或"嗯,我以为 X 会不一样" — 那些是*想法*中的 bug,这正是整个目的。如果他们想要添加新动作,就添加。原型会演化。
|
|
68
|
+
|
|
69
|
+
### 7. 捕获答案
|
|
70
|
+
|
|
71
|
+
当原型完成其使命后,问题的答案就是唯一值得保留的东西。如果用户在旁,询问他们学到了什么。如果不在,在原型的旁边留下一个 `NOTES.md`,以便答案可以在原型被删除之前填写(或由你填写,如果你观察了整个会话)。
|
|
72
|
+
|
|
73
|
+
## 反模式
|
|
74
|
+
|
|
75
|
+
- **不要添加测试。** 需要测试的原型不再是原型。
|
|
76
|
+
- **不要连接到真实数据库。** 使用内存存储,除非问题明确与持久化相关。
|
|
77
|
+
- **不要泛化。** 不要"如果我们以后想支持 X 怎么办"。原型回答一个问题。
|
|
78
|
+
- **不要将逻辑和 TUI 混在一起。** 如果 reducer / 状态机引用了 `console.log`、提示或终端转义码,它就不再可移植。将 TUI 作为纯模块上的一个薄外壳。
|
|
79
|
+
- **不要将 TUI 外壳发布到生产环境。** 外壳是为从终端手动驱动而优化的。其背后的逻辑模块才是值得保留的部分。
|