harveyz-skill 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/package.json +18 -18
  3. package/skills/coding/capture-vocab/SKILL.md +94 -0
  4. package/skills/coding/init-workflow/SKILL.md +22 -4
  5. package/skills/coding/init-workflow/references/conflict-analysis.md +47 -1
  6. package/skills/coding/init-workflow/references/lock-file-format.md +6 -1
  7. package/skills/coding/question-me/SKILL.md +205 -0
  8. package/skills/coding/question-me/scripts/__pycache__/render_tree.cpython-314.pyc +0 -0
  9. package/skills/coding/question-me/scripts/__pycache__/test_render_tree.cpython-314.pyc +0 -0
  10. package/skills/coding/question-me/scripts/render_tree.py +287 -0
  11. package/skills/coding/question-me/scripts/test_render_tree.py +97 -0
  12. package/skills/creative/capture-todo/SKILL.md +6 -2
  13. package/skills/design/sync-design/SKILL.md +294 -177
  14. package/skills/meta/sync-hotfix/SKILL.md +188 -0
  15. package/skills/{meta → mint}/fix-skill/SKILL.md +29 -1
  16. package/skills/{meta → mint}/publish-skill/SKILL.md +2 -2
  17. package/skills/{meta → mint}/scout-philosophy/SKILL.md +21 -3
  18. package/skills/{experiment → research}/extract-cognition/SKILL.md +1 -1
  19. package/skills/research/extract-url/SKILL.md +116 -66
  20. package/skills/research/extract-url/experiment/two-phase-tagging/INSTRUCTIONS.md +55 -0
  21. package/skills/research/extract-url/experiment/two-phase-tagging/expected-output.yaml +30 -0
  22. package/skills/research/extract-url/experiment/two-phase-tagging/fixture-article.txt +66 -0
  23. package/skills/research/extract-url/experiment/two-phase-tagging/fixture-fixed-tags.txt +23 -0
  24. package/skills/research/extract-url/experiment/two-phase-tagging/v1-prompt.txt +102 -0
  25. package/skills/research/extract-url/references/__pycache__/article_utils.cpython-314.pyc +0 -0
  26. package/skills/research/extract-url/references/article_utils.py +91 -1
  27. package/skills/research/extract-url/references/file-format.md +27 -1
  28. package/skills/research/extract-url/scripts/__pycache__/config.cpython-314.pyc +0 -0
  29. package/skills/research/extract-url/scripts/count_article_stats.py +35 -0
  30. package/skills/research/extract-url/scripts/playwright_xcom.py +9 -5
  31. package/skills/research/extract-url/scripts/validate_article.py +10 -2
  32. package/skills/research/extract-url/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  33. package/skills/research/extract-url/tests/__pycache__/test_count_article_stats.cpython-314-pytest-9.0.2.pyc +0 -0
  34. package/skills/research/extract-url/tests/__pycache__/test_playwright_xcom.cpython-314-pytest-9.0.2.pyc +0 -0
  35. package/skills/research/extract-url/tests/test_article_utils_tags.py +139 -0
  36. package/skills/research/extract-url/tests/test_count_article_stats.py +91 -0
  37. package/skills/research/extract-url/tests/test_playwright_xcom.py +28 -0
  38. package/skills/research/extract-url/tests/test_validate_article.py +58 -1
  39. package/skills-index.json +102 -97
  40. package/tools/hub/docs/cli-reference.md +209 -0
  41. package/tools/hub/hub/cli/__pycache__/projects.cpython-314.pyc +0 -0
  42. package/tools/hub/hub/core/__pycache__/projects.cpython-314.pyc +0 -0
  43. package/tools/hub/hub/core/__pycache__/todo_sync.cpython-314.pyc +0 -0
  44. package/skills/coding/close-task/SKILL.md +0 -150
  45. package/skills/coding/close-task/references/output-templates.md +0 -76
  46. package/skills/coding/dispatch-task/SKILL.md +0 -167
  47. package/skills/coding/dispatch-task/references/agent-mapping.md +0 -59
  48. package/skills/coding/dispatch-task/references/task-template.md +0 -145
  49. package/skills/writing/manage-docs/SKILL.md +0 -130
  50. package/skills/writing/manage-docs/references/custom-categories.md +0 -32
  51. package/skills/writing/manage-docs/references/index-template.md +0 -29
  52. /package/skills/{meta → coding}/init-goal/SKILL.md +0 -0
  53. /package/skills/{meta → coding}/init-goal/references/templates.md +0 -0
  54. /package/skills/{meta → coding}/init-goal/tests/init-goal.bats +0 -0
  55. /package/skills/{meta → mint}/archive-skill/SKILL.md +0 -0
  56. /package/skills/{meta → mint}/contribute-skill/SKILL.md +0 -0
  57. /package/skills/{meta → mint}/dedup-skill/SKILL.md +0 -0
  58. /package/skills/{meta → mint}/dedup-skill/references/auto-scan.md +0 -0
  59. /package/skills/{meta → mint}/fix-skill/references/caller-integration-template.md +0 -0
  60. /package/skills/{meta → mint}/fix-skill/references/fix-record-template.md +0 -0
  61. /package/skills/{experiment → mint}/init-skill/SKILL.md +0 -0
  62. /package/skills/{experiment → mint}/init-skill/references/skill-authoring-guide.md +0 -0
  63. /package/skills/{experiment → mint}/init-skill/references/skill-standard.md +0 -0
  64. /package/skills/{research → mint}/learn-skill/SKILL.md +0 -0
  65. /package/skills/{research → mint}/learn-skill/evals/evals.json +0 -0
  66. /package/skills/{meta → mint}/runby-opencode/SKILL.md +0 -0
  67. /package/skills/{experiment → research}/extract-cognition/evals/evals.json +0 -0
  68. /package/skills/{experiment → research}/extract-cognition/references/article-analysis-methods.md +0 -0
  69. /package/skills/{experiment → research}/learn-paper/SKILL.md +0 -0
  70. /package/skills/{experiment → research}/probe-session/SKILL.md +0 -0
  71. /package/skills/{experiment → research}/probe-session/data/strategies.json +0 -0
  72. /package/skills/{experiment → research}/probe-session/scripts/list_profiles.py +0 -0
  73. /package/skills/{experiment → research}/probe-session/scripts/probe.py +0 -0
  74. /package/skills/{experiment → research}/probe-session/vars.json +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.22.0] - 2026-07-06
11
+
12
+ ### Added
13
+ - `capture-vocab`:项目级领域术语字典 skill,支持 add/query/update/remove,上下文自动推断字段
14
+
15
+ ### Changed
16
+ - `sync-design` v5.0.0:模式路由(sync/design),设计阶段流程(新建/修改草稿),三检查点草稿删除,`linkedEntryId` 自动回填
17
+ - `question-me` v3.0.0:重构为 section-structure 标准;v2.0.0 动态树 + 遍历顺序漏洞修复
18
+ - `extract-url` v2.3.0:章节结构重组,新增 `count_article_stats.py` 完成回报卡片
19
+ - `scout-philosophy`:新增阶段八——产出可直接复制的起始模板(`standard.md`)
20
+ - `init-goal`:移至 `coding/` bundle,`installScope` 改为 global
21
+ - `learn-skill`:移至 `mint` bundle
22
+
23
+ ### Removed
24
+ - `dispatch-task`、`close-task`:归档
25
+
26
+ ## [0.21.0] - 2026-07-01
27
+
28
+ ### Added
29
+ - `init-workflow` v4.1.x:Step 4e git config 健康检查(`core.hooksPath` + `merge.ff`),类型 E 冲突检测与自动修复;lock 文件新增 `git_config` 节
30
+ - `sync-hotfix` v1.1.x:Step 5 全文件差异扫描安全网,Step 1 不再退出确保 Step 5 始终执行
31
+ - `extract-url` v2.2.0:X Notes 内容根节点修复、嵌套 tweet 过滤;tag 固定集(`fixed_tags.txt`)与候选集分离,两阶段打标流程
32
+ - `fix-skill` v2.1.0:多轮 AI 修复 + per-skill session doc(含 HOTFIXES.md 写入)
33
+ - `extract-cognition` v0.2.0:学习导向重设计——五阶段 evidence/audit layer + 学习层(Stage 5-6)
34
+ - `skill-map.html`:全景参考页面,Grid 布局按 bundle 分组展示所有 35 个 skill
35
+ - `sync-design` v3.1.0:`.hskill/` outputDir 默认路径 + legacy path 迁移
36
+
37
+ ### Changed
38
+ - Bundle 重组:`meta` 拆分为 `mint`(skill 生命周期)和 `devops`(项目运维);`experiment` 解散,各 skill 回归领域 bundle
39
+ - `publish-skill` v1.3.1:F7 动词词表新增 `survey`
40
+ - `capture-todo` v4.5.1:修复 merge dual-hook 兼容性(`--no-commit` 解耦 MERGE_MSG 与 commit-msg)
41
+ - Pre-commit hook:允许 remote staging sync merge 不被拦截
42
+
43
+ ### Removed
44
+ - `manage-docs`:归档(功能已由 `manage-dir` + `references/built-in/diataxis.md` 覆盖)
45
+
10
46
  ## [0.20.0] - 2026-06-25
11
47
 
12
48
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harveyz-skill",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "description": "Skill manager for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,40 +16,40 @@
16
16
  "bundles.json",
17
17
  "skills-index.json",
18
18
  "CHANGELOG.md",
19
- "skills/research/learn-skill/",
19
+ "skills/mint/learn-skill/",
20
20
  "skills/research/extract-url/",
21
21
  "skills/research/extract-vision/",
22
22
  "skills/research/learn-video/",
23
+ "skills/research/survey-skillrepo/",
24
+ "skills/research/learn-paper/",
25
+ "skills/research/extract-cognition/",
26
+ "skills/research/probe-session/",
23
27
  "skills/creative/capture-todo/",
24
28
  "skills/creative/capture-insight/",
25
29
  "skills/coding/init-workflow/",
26
30
  "skills/coding/setup-debug/",
27
- "skills/coding/dispatch-task/",
28
- "skills/coding/close-task/",
31
+ "skills/coding/init-goal/",
32
+ "skills/coding/question-me/",
33
+ "skills/coding/capture-vocab/",
29
34
  "skills/writing/forge-doc/",
30
35
  "skills/writing/draw-diagram/",
31
- "skills/writing/manage-docs/",
32
36
  "skills/writing/manage-dir/",
33
37
  "skills/writing/migrate-spec/",
34
38
  "skills/design/scout-brand/",
35
39
  "skills/design/build-style/",
36
40
  "skills/design/sync-design/",
37
- "skills/experiment/init-skill/",
38
- "skills/research/survey-skillrepo/",
41
+ "skills/mint/init-skill/",
42
+ "skills/mint/publish-skill/",
43
+ "skills/mint/archive-skill/",
44
+ "skills/mint/dedup-skill/",
45
+ "skills/mint/contribute-skill/",
46
+ "skills/mint/fix-skill/",
47
+ "skills/mint/runby-opencode/",
48
+ "skills/mint/scout-philosophy/",
39
49
  "skills/meta/clean-git/",
40
- "skills/meta/archive-skill/",
41
- "skills/meta/dedup-skill/",
42
- "skills/meta/contribute-skill/",
43
- "skills/meta/publish-skill/",
44
- "skills/meta/runby-opencode/",
45
50
  "skills/meta/release-project/",
51
+ "skills/meta/sync-hotfix/",
46
52
  "skills/meta/sync-agent/",
47
- "skills/experiment/probe-session/",
48
- "skills/experiment/learn-paper/",
49
- "skills/meta/scout-philosophy/",
50
- "skills/meta/fix-skill/",
51
- "skills/meta/init-goal/",
52
- "skills/experiment/extract-cognition/",
53
53
  "tools/hub/",
54
54
  "tools/sync-agent/",
55
55
  "hooks/check-similar-branch/"
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: capture-vocab
3
+ version: "1.1.1"
4
+ description: Use when you need to add, query, update, or remove project-specific domain terms — invoke with /capture-vocab add|query|update|remove <term> to manage a shared vocabulary file at hskill/capture-vocab/vocab.md
5
+ user_invocable: true
6
+ ---
7
+
8
+ # Domain Vocabulary
9
+
10
+ ## 概述
11
+
12
+ 管理项目级领域术语字典。词汇表存于 `hskill/capture-vocab/vocab.md`,供用户和 agent 定义、查询业务专有名词。每个术语包含:规范名称、定义、Avoid 列表、Reference(可选)。
13
+
14
+ 词汇表只存业务领域概念(跨前后端、跨 AI/人类对话都会出现的词)。函数名、变量名等技术命名不进词汇表。
15
+
16
+ ## 用法
17
+
18
+ ```
19
+ /capture-vocab add <term>
20
+ /capture-vocab query <term>
21
+ /capture-vocab update <term>
22
+ /capture-vocab remove <term>
23
+ ```
24
+
25
+ ## 词汇文件
26
+
27
+ `<project-root>/hskill/capture-vocab/vocab.md`
28
+
29
+ ```markdown
30
+ # Domain Vocabulary
31
+
32
+ ## 术语名
33
+ 定义文本(一到两句话,说清楚概念是什么)。
34
+ _Avoid_: 旧叫法, 混用词
35
+ _Reference_: src/models/order.ts:42, docs/business/order-flow.md
36
+ ```
37
+
38
+ `_Avoid_:` 和 `_Reference_:` 均为可选,不填时省略该行。`_Reference_:` 为自由文本,可写代码文件路径+行号、文档位置、任意引用。
39
+
40
+ ## 操作
41
+
42
+ ### add `<term>`
43
+
44
+ 1. 检查 `hskill/capture-vocab/vocab.md` 是否存在 `## <term>` section(大小写不敏感匹配)
45
+ 2. 若已存在:输出"术语 '<term>' 已存在,请用 `update` 修改"并退出
46
+ 3. 若不存在,**先从当前对话上下文推断**各字段:
47
+ - **定义**:从对话中该词的使用方式推断一到两句话的定义;无法推断则留空
48
+ - **Avoid**:从对话中出现过的同义词或混用叫法推断;无法推断则留空
49
+ - **Reference**:从对话中提到的代码文件/文档位置推断;无法推断则留空
50
+ 4. 展示推断结果,格式如下,请用户确认或修改:
51
+ ```
52
+ 准备添加以下条目,请确认或直接修改:
53
+
54
+ ## <term>
55
+ <推断的定义,或"(请输入)"若无法推断>
56
+ _Avoid_: <推断的 avoid,或省略>
57
+ _Reference_: <推断的 reference,或省略>
58
+
59
+ 确认添加?(y / 直接输入修改内容)
60
+ ```
61
+ 5. 用户确认后(输入 `y` 或不输入内容直接回车)写入;若用户输入了修改内容,用修改后的值写入
62
+ 6. 若目录 `hskill/capture-vocab/` 不存在,创建它;若 `vocab.md` 不存在,创建并写入 `# Domain Vocabulary\n`
63
+ 7. 在文件末尾追加新 section,Avoid/Reference 为空时省略对应行
64
+
65
+ ### query `<term>`
66
+
67
+ 1. 检查 `hskill/capture-vocab/vocab.md` 是否存在;若不存在,输出"词汇表尚未初始化,请先用 `add` 添加术语"并退出
68
+ 2. 按 `## <term>` 标题匹配(大小写不敏感),读取该 section 直到下一个 `##` 或文件末尾
69
+ 3. 返回该 section 的完整内容(定义 + Avoid + Reference)
70
+ 4. 若未找到,输出"未找到术语 '<term>'",然后列出 vocab.md 中所有 `##` 标题作为已有术语名
71
+
72
+ ### update `<term>`
73
+
74
+ 1. 检查词汇表存在且包含该术语;若文件不存在或术语不存在,输出对应错误后退出
75
+ 2. 展示当前条目的完整内容
76
+ 3. **从当前对话上下文推断**需要更新的字段(定义/Avoid/Reference);若无新信息可推断,各字段显示为原值
77
+ 4. 展示推断后的新条目,请用户确认或修改(格式同 add 步骤 4)
78
+ 5. 用最终值替换该 section 内容,写回文件;未修改的字段保持原值不变
79
+
80
+ ### remove `<term>`
81
+
82
+ 1. 检查词汇表存在且包含该术语;若不存在,输出对应错误后退出
83
+ 2. 展示该术语的当前条目
84
+ 3. 提示"确认删除 '<term>'?(y/N)",等待用户输入
85
+ 4. 若输入 `y`:删除该 section(含前后空行),写回文件
86
+ 5. 若输入其他:输出"已取消"并退出
87
+
88
+ ## Agent 加载约定
89
+
90
+ 本 Skill 不自动注入词汇表到 session 上下文。如需在每次 session 开始时加载术语,在项目 `CLAUDE.md` 中加入:
91
+
92
+ ```markdown
93
+ 每次 session 开始,读取 `hskill/capture-vocab/vocab.md`(如存在)。
94
+ ```
@@ -2,7 +2,7 @@
2
2
  name: init-workflow
3
3
  description: "Initialize or update git branch management standards: reads .hskill/init-workflow/workflow-config.yml, audits config, incrementally generates and deploys git hooks (pre-commit, commit-msg, pre-push, post-checkout), and generates workflow docs. Triggers: initializing a new git repo, first-time git setup, user asks to set/update branch protection or naming rules, reinstalling git hooks, or syncing after skill/template updates."
4
4
  user_invocable: true
5
- version: "4.1.0"
5
+ version: "4.1.2"
6
6
  ---
7
7
 
8
8
  # Git 工作流初始化
@@ -79,7 +79,22 @@ echo "" | grep -E "<pattern>" > /dev/null 2>&1; echo $?
79
79
  提取每个 hook 中 MANAGED 块外的用户手写代码,识别其中引用的分支名、提交类型、pattern、外部脚本调用。
80
80
 
81
81
  #### 4d. 冲突检测
82
- 综合 4a/4b/4c,识别四种冲突类型(A 条件重叠、B 引用断裂、C 手改冲突、D 新增重叠)。类型定义与选项见 `references/conflict-analysis.md`。
82
+ 综合 4a/4b/4c,识别四种冲突类型(A 条件重叠、B 引用断裂、C 手改冲突、D 新增重叠);第五种类型 E(git config 漂移)由 Step 4e 另行检测。类型定义与选项见 `references/conflict-analysis.md`。
83
+
84
+ #### 4e. git config 健康检查
85
+
86
+ 检查以下两项本地 git config:
87
+
88
+ ```bash
89
+ git config --local core.hooksPath # 期望:.githooks
90
+ git config --local merge.ff # 期望:false
91
+ ```
92
+
93
+ 1. 读取 lock 文件的 `git_config` 节(不存在则跳过对比,直接检测实际值)
94
+ 2. 执行上述命令,获取实际值
95
+ 3. 实际值与期望不符,或实际值缺失 → 类型 E 冲突
96
+
97
+ 类型 E 冲突在 Step 5 列出(附期望值 vs 实际值),默认选项为"自动修复(A)"。Step 6 写入 hooks 后立即执行修复命令。类型 E 完整定义见 `references/conflict-analysis.md`。
83
98
 
84
99
  ---
85
100
 
@@ -212,7 +227,8 @@ python3 <skill-path>/references/render_docs.py \
212
227
  .githooks/commit-msg UNCHANGED
213
228
  .githooks/pre-push UNCHANGED
214
229
  .githooks/post-checkout NEW
215
- core.hooksPath = .githooks
230
+ core.hooksPath = .githooks ✅(或 ❌ 已修复 / ❌ 未修复)
231
+ merge.ff = false ✅(或 ❌ 已修复 / ❌ 未修复)
216
232
  docs/reference/git-workflow.md UPDATED
217
233
  CLAUDE.md 已有引用,跳过
218
234
  ─────────────────────────────────────────────────────
@@ -222,6 +238,8 @@ CLAUDE.md 已有引用,跳过
222
238
  [3/3] wip 类型引用断裂 → 用户选择保留用户代码
223
239
  ```
224
240
 
241
+ 首次安装时 Step 4 整体跳过,Step 6 直接设置两项配置;Step 9 对应行均显示 `✅`。
242
+
225
243
  若有保留的无法映射规则,附注提示。
226
244
 
227
245
  ---
@@ -231,7 +249,7 @@ CLAUDE.md 已有引用,跳过
231
249
  | 文件 | 说明 | 读取时机 |
232
250
  |------|------|---------|
233
251
  | `references/workflow-config.yml` | 配置文件模板 | Step 2:用户无配置时复制 |
234
- | `references/conflict-analysis.md` | 4a–4d 实现脚本、冲突类型 A/B/C/D 完整定义与选项、Step 5 呈现格式 | Step 4/5:执行分析前读取 |
252
+ | `references/conflict-analysis.md` | 4a–4e 实现脚本、冲突类型 A/B/C/D/E 完整定义与选项、Step 5 呈现格式 | Step 4/5:执行分析前读取 |
235
253
  | `references/hook-templates.md` | 4 个 hook 的代码模板、块 ID 规范、hash 计算、多行写入技巧 | Step 6:生成 hooks 前 |
236
254
  | `references/acceptance-test.md` | 验收场景 bash 脚本、期望结果、结果表格格式 | Step 6.5:用户选 Y 时读取 |
237
255
  | `references/lock-file-format.md` | lock 文件 YAML 格式 | Step 9:写入 lock 文件前 |
@@ -1,6 +1,6 @@
1
1
  # 冲突分析实现细节
2
2
 
3
- Step 4(4a–4d)的具体实现方法,Step 5 冲突类型的完整定义。
3
+ Step 4(4a–4e)的具体实现方法,Step 5 冲突类型的完整定义。
4
4
 
5
5
  ---
6
6
 
@@ -124,3 +124,49 @@ actual_hash=$(printf '%s' "<block_content>" | git hash-object --stdin | cut -c1-
124
124
  ```
125
125
 
126
126
  其他冲突类型按同样格式呈现,选项见上方类型定义。
127
+
128
+ ---
129
+
130
+ ## 类型 E — git config 漂移
131
+
132
+ **触发条件:** `core.hooksPath` 或 `merge.ff` 与期望值不符,或在本地 git config 中缺失。
133
+
134
+ **严重程度:** 高(hooks 已部署但完全失效)
135
+
136
+ **检测方式(Step 4e):**
137
+
138
+ ```bash
139
+ git config --local core.hooksPath # 期望:.githooks
140
+ git config --local merge.ff # 期望:false
141
+ ```
142
+
143
+ 判定规则:
144
+ - 值正确 → 无问题
145
+ - 值存在但不正确 → 类型 E 冲突(配置漂移)
146
+ - 值缺失(命令返回空 / exit 1) → 类型 E 冲突(配置丢失)
147
+
148
+ lock 文件含 `git_config` 节时,优先与 lock 中记录的值对比;lock 缺失该节时直接检测实际值。
149
+
150
+ **Step 5 呈现格式(每项独立列出,最多两条):**
151
+
152
+ ```
153
+ ─────────────────────────────────────────────────────────
154
+ [N/M] git config 漂移(类型 E)
155
+ 问题:core.hooksPath 未配置,.githooks/ 中的 hooks 不会被 git 加载
156
+ 期望:core.hooksPath = .githooks
157
+ 实际:(未设置)
158
+ 影响:所有分支保护、提交信息校验、push 限制均失效
159
+
160
+ 选项:
161
+ A) 自动修复(推荐):运行 git config core.hooksPath .githooks
162
+ B) 跳过(保持当前状态,hooks 继续失效)
163
+ ─────────────────────────────────────────────────────────
164
+ ```
165
+
166
+ `merge.ff` 缺失时替换对应字段:`问题` 改为"merge.ff 未配置,fast-forward 合并未被禁止",`期望` 改为 `merge.ff = false`,`影响` 改为"所有合并均将 fast-forward,pre-commit hook 无法检查合并来源分支"。
167
+
168
+ **默认选项:A(自动修复)。**
169
+
170
+ **Step 6 修复执行时机:** 写入 hooks 后,对用户选择 A 的每一条类型 E 冲突立即执行对应的 `git config` 命令,无需用户手动操作。
171
+
172
+ **用户选 B(跳过)时:** Step 9 对应行显示 `❌ 未修复`,并附注"hooks 当前不生效"。
@@ -29,6 +29,11 @@ tags:
29
29
  push_rules:
30
30
  enforce: true
31
31
  block_force_push: [main, staging]
32
+ git_config:
33
+ core_hooks_path: ".githooks" # 上次运行时设置的值
34
+ merge_ff: "false" # 上次运行时设置的值
32
35
  ```
33
36
 
34
- 只记录影响 hook 生成的字段,不需要照搬 `workflow-config.yml` 的完整结构。
37
+ 只记录影响 hook 生成的字段,不需要照搬 `workflow-config.yml` 的完整结构。`git_config` 节与其他字段同属一个 YAML 文档,追加在末尾。
38
+
39
+ **4e 读取逻辑(仅在 skill 重新运行时执行,首次安装时 Step 4 整体跳过):** lock 文件缺少 `git_config` 节时(即 skill 在本功能加入前已运行过),跳过与 lock 的对比,直接检测当前实际值;若实际值不符或缺失,仍报类型 E 冲突。
@@ -0,0 +1,205 @@
1
+ ---
2
+ name: question-me
3
+ description: "Pre-task clarification skill — clarifies ambiguous or complex tasks before execution through structured Q&A with a live decision tree. One question at a time, each with at least 3 options + custom, in decision-dependency order. Triggers: '/question-me', 'help me clarify this', 'question me before starting', 'let's define this first'. Claude auto-triggers when detecting ambiguous or complex requests (multiple conflicting goals, vague keywords like 'optimize/refactor/clean up', missing success criteria, unstated context assumptions)."
4
+ user_invocable: true
5
+ version: "3.0.0"
6
+ ---
7
+
8
+ # question-me — 执行前指令澄清
9
+
10
+ 在开始执行前,通过结构化问答帮助用户澄清指令、对齐预期。一次一问、每问附至少 3 个选项 + 自定义、按决策依赖顺序推进。
11
+
12
+ ---
13
+
14
+ ## 触发条件
15
+
16
+ **主动调用:** 用户输入 `/question-me [任务描述]`,直接进入流程。
17
+
18
+ **自动提议(等用户确认 y/n):**
19
+ - 请求涉及多个可能互相矛盾的目标
20
+ - 关键词模糊:"优化一下"、"整理"、"重构"、"改改"
21
+ - 缺少明确的成功标准或截止范围
22
+ - 任务依赖未指明的上下文假设
23
+
24
+ **不触发:** 简单明确的指令("运行测试"、"读这个文件"、"git status")。
25
+
26
+ **不在范围内(边界):**
27
+ - 跨会话保存问答历史(每次会话独立)
28
+ - 强制跑完全部 open 节点(用户可随时打断)
29
+ - 问答结果写入文件(只在会话内输出摘要)
30
+ - 自动交棒特定 skill(执行方式由 Claude 自行判断)
31
+ - 子节点超过 1 层的预生成(孙节点等父节点答完再评估)
32
+ - 跨分支远端节点的自动扫描(只扫同级兄弟)
33
+
34
+ ---
35
+
36
+ ## 初始化(run first)
37
+
38
+ 在问用户之前,先:
39
+ 1. 读取任务中提到的文件/目录,推断上下文
40
+ 2. 查 `git status`、近期 commit,了解当前进展
41
+ 3. 对能从代码/文档直接确认的问题,自行解答——不占用用户的问答配额
42
+
43
+ 自查结束后简短说明:
44
+
45
+ ```
46
+ 已了解:[X、Y、Z]
47
+ 仍不确定:[A、B]
48
+ 开始澄清...
49
+ ```
50
+
51
+ ---
52
+
53
+ ## 流程(STRICT)
54
+
55
+ ### 阶段 1 — 意图校准(固定 3 问)
56
+
57
+ 三个固定问题按顺序问,**每答完一问立即评估子节点**,不等三问全部答完。
58
+
59
+ **Q1 — 目标:** 这件事做完,最核心的变化是什么?
60
+ **Q2 — 成功标准:** 怎么判断做对了?(可测量的验收条件)
61
+ **Q3 — 范围边界:** 明确不做什么,或哪些东西不能动?
62
+
63
+ **每问的格式(至少 3 个选项 + 自定义):**
64
+
65
+ ```
66
+ [问题]?
67
+
68
+ A. [选项1] ← 推荐
69
+ B. [选项2]
70
+ C. [选项3]
71
+ D. 自定义...
72
+
73
+ 选项须互相排他、覆盖常见分支
74
+ ```
75
+
76
+ **每问的处理流程:**
77
+
78
+ ```
79
+ 问 Qn(附至少 3 个选项 + 自定义,推荐选项标 ← 推荐)→ 等用户回答
80
+ → [必须] 子节点评估:这个答案是否引出需要追问的不确定性?
81
+ 是 → 生成子节点追加到树(BFS:一次生成所有潜在子节点)
82
+ 否 → 不生成(Qn 为叶子节点)
83
+ → 渲染树(首次调用加 --open)
84
+ → 问 Q(n+1)
85
+ ```
86
+
87
+ Q3 答完并评估子节点后,进入阶段 2。
88
+
89
+ **首次渲染(Q1 答完后):**
90
+ ```bash
91
+ echo '<当前树文本>' | python3 SKILL_DIR/scripts/render_tree.py /tmp/question-me-tree.html --open
92
+ ```
93
+
94
+ ---
95
+
96
+ ### 阶段 2 — 动态深挖
97
+
98
+ 按选题逻辑逐一追问(选题逻辑见「决策树格式」查阅区),每轮处理流程:
99
+
100
+ ```
101
+ 1. 选影响面最大的 open 节点
102
+ 2. 提问(附至少 3 个选项 + 自定义):
103
+ [当前节点文本]?
104
+
105
+ A. [选项1] ← 推荐
106
+ B. [选项2]
107
+ C. [选项3]
108
+ D. 自定义...
109
+
110
+ 3. 等用户回答 → 标记为 done
111
+ 4. [必须] 子节点评估:
112
+ 这个答案下有需要追问的不确定性且影响执行方向?
113
+ 是 → 一次生成所有潜在子节点(dep 指向当前节点)
114
+ 否 → 不生成(当前节点为叶子)
115
+ 子问题 Claude 可合理默认的 → 标 infer,填入假设,不追问
116
+ 5. [必须] 兄弟扫描:
117
+ 此答案是否让同级兄弟节点变无关或矛盾?
118
+ 是 → 标 skip
119
+ 否 → 继续
120
+ 6. 更新树文本 → 重新渲染
121
+ 7. 还有 open 节点?→ 是:回到 1 / 否:进入阶段 3
122
+ ```
123
+
124
+ **分支切换是自动的。** 某分支 open 节点耗尽后,选题逻辑自动切到影响面最大的其他 open 节点。
125
+
126
+ **重大方向修正(例外情况):** 若用户答案与已答祖先节点根本矛盾,不走兄弟扫描,而是:
127
+ 1. 显式指出冲突
128
+ 2. 询问用户是否需要修改已答节点
129
+ 3. 用户确认后重标受影响节点为 `open`,重新提问
130
+
131
+ **停止条件:**
132
+ - 所有 `open` 节点已变为 `done` / `infer` / `skip`
133
+ - 用户说"够了"、"开始"、"可以了"、"stop"等打断信号
134
+
135
+ ---
136
+
137
+ ### 阶段 3 — 输出精炼指令摘要
138
+
139
+ ```
140
+ ## 任务摘要
141
+
142
+ **目标:** ...
143
+ **成功标准:** ...
144
+ **范围:** 包含 ... / 不包含 ...
145
+ **关键决策:** ...
146
+ **假设:** (infer 节点的默认处理,透明列出)
147
+
148
+ 确认后开始执行。
149
+ ```
150
+
151
+ 等用户确认,然后执行任务。
152
+
153
+ ---
154
+
155
+ ## 决策树格式(按需查阅)
156
+
157
+ > 在阶段 1 / 阶段 2 中构建或更新决策树时查阅本节。
158
+
159
+ **内部格式(每节点一行,平铺列出):**
160
+
161
+ ```
162
+ [label:status] id=XX [dep=YY] 节点文本
163
+ ```
164
+
165
+ 字段规则:
166
+ - `status`: `done` / `open` / `infer` / `skip`
167
+ - `id`: 全树唯一短 ID(2–3 字母),更新时引用稳定
168
+ - `dep=YY`: 可选,指向另一节点 id,表示"YY 答完后此节点才可问";渲染器用它重建树结构
169
+ - 无 `dep` 的节点为根节点
170
+
171
+ 状态含义:
172
+
173
+ | status | 含义 | 子节点 |
174
+ |--------|------|--------|
175
+ | `done` | 已答 | 可有可无;无子节点即为叶子 |
176
+ | `open` | 待问(dep 已满足或无 dep) | 答完后评估 |
177
+ | `infer` | Claude 填默认值,不追问 | 无;在摘要中透明列出 |
178
+ | `skip` | 兄弟答案使其无关,跳过 | 无 |
179
+
180
+ **叶子节点不是状态**,是结构属性——`done` 且无子节点即为叶子,分支自然结束。
181
+
182
+ **更新规则:**
183
+ - 每次用户回答后,只修改变化的行,不重写全树
184
+ - 新生成的子节点追加在父节点行之后
185
+ - `infer` 节点直接填入推断内容,不追问用户
186
+
187
+ **选题逻辑(阶段 2 每轮使用):**
188
+ > 从所有 `dep` 已满足(或无 `dep`)的 `open` 节点中,选被其他节点依赖次数最多的(影响面最大);并列时按树中出现顺序选最早的
189
+
190
+ **每次树更新后**立即重新渲染(不加 `--open`):
191
+ ```bash
192
+ echo '<更新后的决策树文本>' | python3 SKILL_DIR/scripts/render_tree.py /tmp/question-me-tree.html
193
+ ```
194
+
195
+ ---
196
+
197
+ ## 反模式
198
+
199
+ | 错误行为 | 正确做法 |
200
+ |----------|----------|
201
+ | 顺序操纵:先问节点 Y,再以"Y 的答案已覆盖 X"为由跳过 X | 节点 X 的 dep 已满足且处于 open,必须问答或当场评估 infer |
202
+ | 阶段 3 摘要输出后直接执行 | 必须等用户明确确认后才开始执行 |
203
+ | 一次提多个问题 | 严格一次一问,一轮只问一个节点 |
204
+ | 提前生成孙节点 | 子节点只在父节点答完后评估,不预生成 |
205
+ | 把 infer 节点假设对用户隐藏 | infer 节点的假设必须在阶段 3 摘要中透明列出 |