@namewta/speculo 0.2.6 → 0.2.9

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 (114) hide show
  1. package/README.md +9 -9
  2. package/dist/src/cli.js +1 -1
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.js +0 -32
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/migrate.js +0 -4
  7. package/dist/src/migrate.js.map +1 -1
  8. package/package.json +1 -1
  9. package/template/.speculo/README.md +0 -1
  10. package/template/.speculo/workspace.json +1 -2
  11. package/template/canonical/README.md +44 -70
  12. package/template/canonical/canonical-specdev-grill-with-docs.md +475 -0
  13. package/template/canonical/canonical-specdev-spec.md +82 -0
  14. package/template/canonical/canonical-specdev-tickets.md +232 -0
  15. package/template/canonical/canonical-specdev-wayfinder.md +200 -0
  16. package/template/canonical/canonical-teach.md +70 -65
  17. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +73 -0
  18. package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +49 -0
  19. package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +80 -0
  20. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +120 -0
  21. package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +96 -0
  22. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +51 -0
  23. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +2 -0
  24. package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +1 -1
  25. package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +8 -0
  26. package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +12 -4
  27. package/template/workflows/specdev/G-grill-with-docs/log-format.md +8 -7
  28. package/template/workflows/specdev/I-implement/I-implement.md +9 -4
  29. package/template/workflows/specdev/I-init-setup/domain-layout.md +1 -1
  30. package/template/workflows/specdev/INDEX.md +9 -0
  31. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +84 -0
  32. package/template/workflows/specdev/P-goal-plan/execution-sections.md +103 -0
  33. package/template/workflows/specdev/P-goal-plan/governance-sections.md +103 -0
  34. package/template/workflows/specdev/P-goal-plan/input-validation.md +94 -0
  35. package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +159 -0
  36. package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +60 -0
  37. package/template/workflows/specdev/P-goal-plan/vision-sections.md +80 -0
  38. package/template/workflows/specdev/S-spec/S-spec.md +2 -0
  39. package/template/workflows/specdev/T-tickets/T-tickets.md +20 -53
  40. package/template/workflows/specdev/T-tickets/tickets-map-template.md +70 -0
  41. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +2 -2
  42. package/template/workflows/specdev/_state/research/.gitkeep +0 -0
  43. package/template/workflows/specdev/common/dev-worktree/SKILL.md +138 -0
  44. package/template/workflows/specdev/common/dev-worktree/references/create.md +63 -0
  45. package/template/workflows/specdev/common/dev-worktree/references/finalize.md +102 -0
  46. package/template/workflows/specdev/common/research/SKILL.md +54 -0
  47. package/template/canonical/canonical-domain-modeling.md +0 -289
  48. package/template/canonical/canonical-skill-example.md +0 -608
  49. package/template/skills/worktree-isolation/SKILL.md +0 -23
  50. package/template/skills/worktree-isolation/references/audit-branch-tree.md +0 -32
  51. package/template/skills/worktree-isolation/references/create-worktree.md +0 -39
  52. package/template/skills/worktree-isolation/references/merge-and-cleanup.md +0 -43
  53. package/template/vendor/README.md +0 -35
  54. package/template/vendor/matt-pocock/README.md +0 -41
  55. package/template/vendor/matt-pocock/engineering/README.md +0 -28
  56. package/template/vendor/matt-pocock/engineering/ask-matt/SKILL.md +0 -76
  57. package/template/vendor/matt-pocock/engineering/code-review/SKILL.md +0 -89
  58. package/template/vendor/matt-pocock/engineering/codebase-design/DEEPENING.md +0 -37
  59. package/template/vendor/matt-pocock/engineering/codebase-design/DESIGN-IT-TWICE.md +0 -44
  60. package/template/vendor/matt-pocock/engineering/codebase-design/SKILL.md +0 -114
  61. package/template/vendor/matt-pocock/engineering/diagnosing-bugs/SKILL.md +0 -134
  62. package/template/vendor/matt-pocock/engineering/domain-modeling/ADR-FORMAT.md +0 -47
  63. package/template/vendor/matt-pocock/engineering/domain-modeling/CONTEXT-FORMAT.md +0 -60
  64. package/template/vendor/matt-pocock/engineering/domain-modeling/SKILL.md +0 -74
  65. package/template/vendor/matt-pocock/engineering/grill-with-docs/SKILL.md +0 -7
  66. package/template/vendor/matt-pocock/engineering/implement/SKILL.md +0 -15
  67. package/template/vendor/matt-pocock/engineering/prototype/LOGIC.md +0 -79
  68. package/template/vendor/matt-pocock/engineering/prototype/SKILL.md +0 -30
  69. package/template/vendor/matt-pocock/engineering/prototype/UI.md +0 -112
  70. package/template/vendor/matt-pocock/engineering/research/SKILL.md +0 -12
  71. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/SKILL.md +0 -156
  72. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/domain.md +0 -40
  73. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-github.md +0 -45
  74. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +0 -46
  75. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/issue-tracker-local.md +0 -30
  76. package/template/vendor/matt-pocock/engineering/setup-matt-pocock-skills/triage-labels.md +0 -15
  77. package/template/vendor/matt-pocock/engineering/tdd/SKILL.md +0 -36
  78. package/template/vendor/matt-pocock/engineering/tdd/mocking.md +0 -59
  79. package/template/vendor/matt-pocock/engineering/tdd/tests.md +0 -77
  80. package/template/vendor/matt-pocock/engineering/to-spec/SKILL.md +0 -75
  81. package/template/vendor/matt-pocock/engineering/to-tickets/SKILL.md +0 -113
  82. package/template/vendor/matt-pocock/engineering/wayfinder/SKILL.md +0 -127
  83. package/template/vendor/matt-pocock/in-progress/README.md +0 -10
  84. package/template/vendor/matt-pocock/in-progress/claude-handoff/SKILL.md +0 -18
  85. package/template/vendor/matt-pocock/in-progress/loop-me/SKILL.md +0 -32
  86. package/template/vendor/matt-pocock/in-progress/wizard/SKILL.md +0 -45
  87. package/template/vendor/matt-pocock/in-progress/wizard/template.sh +0 -211
  88. package/template/vendor/matt-pocock/in-progress/writing-beats/SKILL.md +0 -67
  89. package/template/vendor/matt-pocock/in-progress/writing-fragments/SKILL.md +0 -78
  90. package/template/vendor/matt-pocock/in-progress/writing-shape/SKILL.md +0 -79
  91. package/template/vendor/matt-pocock/productivity/README.md +0 -18
  92. package/template/vendor/matt-pocock/productivity/grill-me/SKILL.md +0 -7
  93. package/template/vendor/matt-pocock/productivity/grilling/SKILL.md +0 -12
  94. package/template/vendor/matt-pocock/productivity/teach/GLOSSARY-FORMAT.md +0 -35
  95. package/template/vendor/matt-pocock/productivity/teach/LEARNING-RECORD-FORMAT.md +0 -46
  96. package/template/vendor/matt-pocock/productivity/teach/MISSION-FORMAT.md +0 -31
  97. package/template/vendor/matt-pocock/productivity/teach/RESOURCES-FORMAT.md +0 -32
  98. package/template/vendor/matt-pocock/productivity/teach/SKILL.md +0 -140
  99. /package/template/{vendor/matt-pocock/productivity → skills}/writing-great-skills/GLOSSARY.md +0 -0
  100. /package/template/{vendor/matt-pocock/productivity → skills}/writing-great-skills/SKILL.md +0 -0
  101. /package/template/{vendor/matt-pocock/productivity → workflows/specdev/common}/handoff/SKILL.md +0 -0
  102. /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/improve-codebase-architecture/HTML-REPORT.md +0 -0
  103. /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/improve-codebase-architecture/SKILL.md +0 -0
  104. /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/SKILL.md +0 -0
  105. /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/agent-paths.md +0 -0
  106. /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/governance.md +0 -0
  107. /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/sync-matrix.md +0 -0
  108. /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/references/verification.md +0 -0
  109. /package/template/{vendor/khazix-skills → workflows/specdev/common}/neat-freak/scripts/audit-inventory.sh +0 -0
  110. /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/resolving-merge-conflicts/SKILL.md +0 -0
  111. /package/template/{vendor/matt-pocock/engineering/diagnosing-bugs → workflows/specdev/common}/scripts/hitl-loop.template.sh +0 -0
  112. /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/triage/AGENT-BRIEF.md +0 -0
  113. /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/triage/OUT-OF-SCOPE.md +0 -0
  114. /package/template/{vendor/matt-pocock/engineering → workflows/specdev/common}/triage/SKILL.md +0 -0
@@ -1,156 +0,0 @@
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
- - `speculo/config.json` —— 全局配置文件是否已存在?若存在,读取其内容
30
-
31
- ### 2. 展示发现结果并询问
32
-
33
- 总结已存在的和缺失的内容。然后**逐项**引导用户完成三项决策 —— 展示一节,获得用户回答,然后进入下一节。不要一次抛出全部三项。
34
-
35
- 假设用户不了解这些术语的含义。每节以简短解释开头(它是什么、这些技能为什么需要它、选择不同会有什么变化)。然后展示选项和默认值。
36
-
37
- **A 节 —— Issue tracker。**
38
-
39
- > 解释:"Issue tracker" 是本仓库 issue 的存放位置。`to-tickets`、`triage`、`to-spec`、`qa` 等技能会从中读取和写入 —— 它们需要知道是调用 `gh issue create`、在 `.scratch/` 下写入 markdown 文件,还是遵循你描述的其他工作流。请选择你实际跟踪本仓库工作的地方。
40
-
41
- 默认倾向:这些技能是为 GitHub 设计的。如果 `git remote` 指向 GitHub,则建议使用 GitHub。如果 `git remote` 指向 GitLab(`gitlab.com` 或自托管主机),则建议使用 GitLab。否则(或用户偏好其他方式),提供:
42
-
43
- - **GitHub** —— issue 存放在仓库的 GitHub Issues 中(使用 `gh` CLI)
44
- - **GitLab** —— issue 存放在仓库的 GitLab Issues 中(使用 [`glab`](https://gitlab.com/gitlab-org/cli) CLI)
45
- - **本地 markdown** —— issue 以文件形式存放在本仓库的 `.scratch/<feature>/` 下(适合个人项目或无远程仓库的场景)
46
- - **其他**(Jira、Linear 等)—— 请用户用一段话描述工作流;技能将记录为自由文本
47
-
48
- 仅当用户选择了 **GitHub** 或 **GitLab** 时,才追问一个问题:
49
-
50
- > 解释:开源仓库经常以 Pull Request 形式收到功能请求,而不仅仅是 issue —— PR 是附带代码的 issue。如果开启此选项,`/triage` 会将*外部* PR 拉入同一队列,并对其应用与 issue 相同的标签和状态(协作者进行中的 PR 不受影响)。如果 PR 不是你接收请求的渠道,请关闭此选项。
51
-
52
- - **PR 作为请求渠道** —— 是 / 否(默认:否)。将答案记录到 `docs/agents/issue-tracker.md`。对于本地 markdown 和其他 tracker,跳过此问题 —— 没有 PR。
53
-
54
- **B 节 —— Triage 标签词汇表。**
55
-
56
- > 解释:当 `triage` 技能处理一个收到的 issue 时,它会将其移过一个状态机 —— 需要评估、等待报告者回复、可供 AFK agent 领取、可供人工处理、或不予处理。为此,它需要应用与你在 issue tracker 中*实际配置*的字符串相匹配的标签。如果你的仓库已使用不同的标签名称(例如 `bug:triage` 而不是 `needs-triage`),请在此处映射,以便技能应用正确的标签,而不是创建重复标签。
57
-
58
- 五个标准角色:
59
-
60
- - `needs-triage` —— 维护者需要评估
61
- - `needs-info` —— 等待报告者回复
62
- - `ready-for-agent` —— 已完全明确,AFK 可用(agent 无需人工上下文即可领取)
63
- - `ready-for-human` —— 需要人工实现
64
- - `wontfix` —— 不予处理
65
-
66
- 默认值:每个角色的字符串等于其名称。询问用户是否需要覆盖。如果他们的 issue tracker 没有现有标签,默认值即可。
67
-
68
- **C 节 —— 领域文档。**
69
-
70
- > 解释:一些技能(`improve-codebase-architecture`、`diagnosing-bugs`、`tdd`)会读取 `CONTEXT.md` 文件以了解项目的领域语言,以及 `docs/adr/` 以了解过去的架构决策。它们需要知道仓库是有一个全局上下文还是有多个(例如 mono repo 中前端/后端各有独立上下文),以便在正确的位置查找。
71
-
72
- 确认布局:
73
-
74
- - **单上下文** —— 仓库根目录下一个 `CONTEXT.md` + `docs/adr/`。大多数仓库属于此类。
75
- - **多上下文** —— 根目录下 `CONTEXT-MAP.md` 指向各上下文的 `CONTEXT.md` 文件(通常为 mono repo)。
76
-
77
- **D 节 —— 语言与配置偏好。**
78
-
79
- > 解释:Speculo 使用 `speculo/config.json` 存储全局配置,包括 AI 与用户的交互语言、报告生成语言、以及持久化路径覆盖。其他 commands 和 workflows 在初始化时读取此文件以自动选择语言和确认策略。
80
-
81
- 询问用户:
82
-
83
- - **交互语言** —— Speculo 与用户交互时使用的语言。选项:`zh-CN`(简体中文)、`en`(英文)。默认:`zh-CN`。
84
- - **报告语言** —— AI 生成产物(HTML 报告、Markdown 文档、issue 正文)的默认语言。默认与交互语言相同。
85
-
86
- ### 3. 确认并编辑
87
-
88
- 向用户展示以下内容的草稿:
89
-
90
- - 要添加到 `CLAUDE.md` / `AGENTS.md`(根据第 4 步的选择规则决定编辑哪个文件)的 `## Agent skills` 块
91
- - `docs/agents/issue-tracker.md`、`docs/agents/triage-labels.md`、`docs/agents/domain.md` 的内容
92
- - `speculo/config.json` 的内容(若不存在则新建)
93
-
94
- 让他们在写入之前编辑。
95
-
96
- ### 4. 写入
97
-
98
- **选择要编辑的文件:**
99
-
100
- - 如果 `CLAUDE.md` 存在,编辑它。
101
- - 否则如果 `AGENTS.md` 存在,编辑它。
102
- - 如果两者都不存在,询问用户要创建哪一个 —— 不要替他们选择。
103
-
104
- 当 `CLAUDE.md` 已存在时绝不创建 `AGENTS.md`(反之亦然)—— 始终编辑已存在的那个。
105
-
106
- 如果所选文件中已有 `## Agent skills` 块,原地更新其内容,而不是追加重复块。不要覆盖用户对周围章节的编辑。
107
-
108
- 该块的内容:
109
-
110
- ```markdown
111
- ## Agent skills
112
-
113
- ### Issue tracker
114
-
115
- [关于 issue 跟踪位置的一句话总结,以及外部 PR 是否作为 triage 渠道]。参见 `docs/agents/issue-tracker.md`。
116
-
117
- ### Triage labels
118
-
119
- [关于标签词汇表的一句话总结]。参见 `docs/agents/triage-labels.md`。
120
-
121
- ### Domain docs
122
-
123
- [关于布局的一句话总结 —— "单上下文"或"多上下文"]。参见 `docs/agents/domain.md`。
124
- ```
125
-
126
- 然后使用此技能文件夹中的种子模板作为起点,写入三个文档文件:
127
-
128
- - [issue-tracker-github.md](./issue-tracker-github.md) —— GitHub issue tracker
129
- - [issue-tracker-gitlab.md](./issue-tracker-gitlab.md) —— GitLab issue tracker
130
- - [issue-tracker-local.md](./issue-tracker-local.md) —— 本地 markdown issue tracker
131
- - [triage-labels.md](./triage-labels.md) —— 标签映射
132
- - [domain.md](./domain.md) —— 领域文档消费方规则 + 布局
133
-
134
- 对于"其他"issue tracker,根据用户的描述从头编写 `docs/agents/issue-tracker.md`。
135
-
136
- 如果 `speculo/config.json` 不存在,根据 D 节的用户选择创建:
137
-
138
- ```jsonc
139
- {
140
- "schema_version": 1,
141
- "language": "<用户选择的交互语言>",
142
- "persistence": {
143
- "root_override": null
144
- },
145
- "defaults": {
146
- "confirm_before_external_write": true,
147
- "report_language": "<用户选择的报告语言>"
148
- }
149
- }
150
- ```
151
-
152
- 如果 `speculo/config.json` 已存在,仅更新用户本次修改的字段,保留其他现有值。
153
-
154
- ### 5. 完成
155
-
156
- 告诉用户配置已完成,以及哪些工程化技能现在将读取这些文件。提醒他们之后可以直接编辑 `docs/agents/*.md` —— 只有在需要切换 issue tracker 或从头重新配置时才需要重新运行此技能。
@@ -1,40 +0,0 @@
1
- # 领域文档
2
-
3
- 工程 skills 在探索代码库时应如何使用该仓库的领域文档。
4
-
5
- ## 布局:单上下文
6
-
7
- ```
8
- {state_root}/knowledge/
9
- ├── CONTEXT.md ← 项目领域术语与概念(待 domain-modeling 创建)
10
- ├── adr/ ← 架构决策记录(待 domain-modeling 创建)
11
- │ └── NNNN-slug.md
12
- └── domain.md ← 本文件
13
- ```
14
-
15
- ## 路径解析规则
16
-
17
- **本文件描述的路径均为相对于 `{state_root}/knowledge/` 的逻辑路径。** 实际写入时由 Speculo persistence 层映射到 `{state_root}/knowledge/` 命名空间下。
18
-
19
- - `CONTEXT.md` → `{state_root}/knowledge/CONTEXT.md`
20
- - `adr/` → `{state_root}/knowledge/adr/`
21
- - `{state_root}` 由 runtime-context 解析,默认为 `speculo/.speculo/<workflow>/`
22
-
23
- Vendor skills(如 domain-modeling)描述的是通用项目布局("仓库根目录下的 CONTEXT.md"),这是正确的通用行为。本文件作为 Speculo 适配层,负责将这些通用路径翻译到 Speculo 持久化命名空间内。当 vendor skill 指示"在仓库根目录创建 CONTEXT.md"时,实际写入路径为 `{state_root}/knowledge/CONTEXT.md`。
24
-
25
- ## 在探索之前
26
-
27
- - **`CONTEXT.md`**(位于 knowledge/ 命名空间内,由 domain-modeling skill 创建)—— 项目领域语言
28
- - **`adr/`** —— 涉及工作区域的 ADR
29
-
30
- 如果这些文件都不存在,静默继续。不要标记它们的缺失或预先建议创建。`domain-modeling` skill 在术语或决策实际被确定时延迟创建它们。
31
-
32
- ## 使用术语表的词汇
33
-
34
- 输出中命名领域概念时,使用 `CONTEXT.md` 中定义的术语,不偏离到术语表明确避免的同义词。如果需要的新概念尚未在术语表中,记录给 `domain-modeling`。
35
-
36
- ## 标记 ADR 冲突
37
-
38
- 如果输出与现有 ADR 矛盾,明确提出而不是默默覆盖:
39
-
40
- > _与 ADR-NNNN 矛盾 — 但值得重新讨论,因为……_
@@ -1,45 +0,0 @@
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 中。
@@ -1,46 +0,0 @@
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 中。
@@ -1,30 +0,0 @@
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 中。
@@ -1,15 +0,0 @@
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
- 编辑右侧列以匹配你实际使用的词汇。
@@ -1,36 +0,0 @@
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` 技能),而不是红 → 绿实现循环的一部分。
@@ -1,59 +0,0 @@
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
- - 每个端点的类型安全
@@ -1,77 +0,0 @@
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
- ```
@@ -1,75 +0,0 @@
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>