harveyz-skill 0.18.0 → 0.19.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 (108) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/package.json +5 -3
  3. package/skills/{meta → experiment}/init-skill/SKILL.md +22 -11
  4. package/skills/experiment/init-skill/references/skill-authoring-guide.md +156 -0
  5. package/skills/experiment/init-skill/references/skill-standard.md +219 -0
  6. package/skills/meta/publish-skill/SKILL.md +46 -6
  7. package/skills/meta/scout-philosophy/SKILL.md +121 -0
  8. package/skills/meta/sync-agent/SKILL.md +186 -0
  9. package/skills/research/extract-url/SKILL.md +69 -30
  10. package/skills/research/extract-url/platforms/SKILL.claude.md +12 -7
  11. package/skills/research/extract-url/platforms/SKILL.codex.md +9 -3
  12. package/skills/research/extract-url/platforms/SKILL.hermes.md +9 -3
  13. package/skills/research/extract-url/references/article_utils.py +2 -0
  14. package/skills/research/extract-url/references/core-flow.md +22 -14
  15. package/skills/research/extract-url/scripts/__pycache__/config.cpython-312.pyc +0 -0
  16. package/skills/research/extract-url/scripts/config.py +44 -0
  17. package/skills/research/extract-url/scripts/dedup_check.py +8 -4
  18. package/skills/research/extract-url/scripts/detect_chrome_profile.py +3 -0
  19. package/skills/research/extract-url/scripts/playwright_web.py +109 -50
  20. package/skills/research/extract-url/scripts/playwright_xcom.py +190 -23
  21. package/skills/research/extract-url/scripts/validate_article.py +10 -6
  22. package/skills/research/extract-url/tests/conftest.py +79 -0
  23. package/skills/research/extract-url/tests/test_config.py +69 -0
  24. package/skills/research/extract-url/tests/test_dedup_check.py +75 -0
  25. package/skills/research/extract-url/tests/test_playwright_web.py +122 -0
  26. package/skills/research/extract-url/tests/test_playwright_xcom.py +65 -0
  27. package/skills/research/extract-url/tests/test_validate_article.py +101 -0
  28. package/skills/research/extract-url/vars.json +2 -0
  29. package/skills/research/learn-skill/SKILL.md +114 -37
  30. package/skills/research/learn-video/SKILL.md +3 -2
  31. package/skills/{meta/analyze-skill → research/survey-skillrepo}/CHANGELOG.md +22 -0
  32. package/skills/research/survey-skillrepo/SKILL.md +200 -0
  33. package/skills/{meta/analyze-skill → research/survey-skillrepo}/references/output-template.md +6 -7
  34. package/skills/research/survey-skillrepo/references/prohibitions.md +12 -0
  35. package/skills/writing/forge-doc/scripts/__pycache__/md_to_pdf.cpython-312.pyc +0 -0
  36. package/skills-index.json +47 -19
  37. package/tools/hub/docs/superpowers/plans/2026-06-18-todo-md-sync.md +732 -0
  38. package/tools/hub/docs/superpowers/specs/2026-06-18-todo-md-sync-design.md +112 -0
  39. package/tools/hub/hub/__main__.py +13 -2
  40. package/tools/hub/hub/__pycache__/__init__.cpython-312.pyc +0 -0
  41. package/tools/hub/hub/__pycache__/__main__.cpython-312.pyc +0 -0
  42. package/tools/hub/hub/cli/projects.py +24 -1
  43. package/tools/hub/hub/core/__pycache__/__init__.cpython-312.pyc +0 -0
  44. package/tools/hub/hub/core/__pycache__/db.cpython-312.pyc +0 -0
  45. package/tools/hub/hub/core/__pycache__/migrate.cpython-312.pyc +0 -0
  46. package/tools/hub/hub/core/__pycache__/projects.cpython-312.pyc +0 -0
  47. package/tools/hub/hub/core/__pycache__/tasks.cpython-312.pyc +0 -0
  48. package/tools/hub/hub/core/projects.py +25 -0
  49. package/tools/hub/hub/core/todo_sync.py +146 -0
  50. package/tools/hub/hub/tui/__pycache__/__init__.cpython-312.pyc +0 -0
  51. package/tools/hub/hub/tui/__pycache__/app.cpython-312.pyc +0 -0
  52. package/tools/hub/hub/tui/__pycache__/git.cpython-312.pyc +0 -0
  53. package/tools/hub/hub/tui/app.py +1 -0
  54. package/tools/hub/hub/tui/panels/__pycache__/__init__.cpython-312.pyc +0 -0
  55. package/tools/hub/hub/tui/panels/__pycache__/git.cpython-312.pyc +0 -0
  56. package/tools/hub/hub/tui/panels/__pycache__/projects.cpython-312.pyc +0 -0
  57. package/tools/hub/hub/tui/panels/__pycache__/tasks.cpython-312.pyc +0 -0
  58. package/tools/hub/hub/tui/panels/projects.py +34 -2
  59. package/tools/hub/hub/tui/panels/tasks.py +20 -0
  60. package/tools/hub/tests/test_cli.py +45 -0
  61. package/tools/hub/tests/test_todo_sync.py +274 -0
  62. package/tools/hub/tests/test_tui_tasks_panel.py +75 -0
  63. package/skills/meta/analyze-skill/SKILL.md +0 -161
  64. package/skills/meta/analyze-skill/references/evaluation-template.md +0 -58
  65. package/skills/meta/analyze-skill/references/prohibitions.md +0 -27
  66. package/skills/meta/init-skill/references/skill-authoring-guide.md +0 -298
  67. package/skills/writing/forge-doc/scripts/__pycache__/md_to_pdf.cpython-314.pyc +0 -0
  68. package/tools/hub/hub/__pycache__/__init__.cpython-314.pyc +0 -0
  69. package/tools/hub/hub/__pycache__/__main__.cpython-314.pyc +0 -0
  70. package/tools/hub/hub/cli/__pycache__/__init__.cpython-314.pyc +0 -0
  71. package/tools/hub/hub/cli/__pycache__/git.cpython-314.pyc +0 -0
  72. package/tools/hub/hub/cli/__pycache__/projects.cpython-314.pyc +0 -0
  73. package/tools/hub/hub/cli/__pycache__/tasks.cpython-314.pyc +0 -0
  74. package/tools/hub/hub/core/__pycache__/__init__.cpython-314.pyc +0 -0
  75. package/tools/hub/hub/core/__pycache__/db.cpython-314.pyc +0 -0
  76. package/tools/hub/hub/core/__pycache__/migrate.cpython-314.pyc +0 -0
  77. package/tools/hub/hub/core/__pycache__/projects.cpython-314.pyc +0 -0
  78. package/tools/hub/hub/core/__pycache__/tasks.cpython-314.pyc +0 -0
  79. package/tools/hub/hub/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/tools/hub/hub/tui/__pycache__/app.cpython-314.pyc +0 -0
  81. package/tools/hub/hub/tui/__pycache__/git.cpython-314.pyc +0 -0
  82. package/tools/hub/hub/tui/panels/__pycache__/__init__.cpython-314.pyc +0 -0
  83. package/tools/hub/hub/tui/panels/__pycache__/git.cpython-314.pyc +0 -0
  84. package/tools/hub/hub/tui/panels/__pycache__/projects.cpython-314.pyc +0 -0
  85. package/tools/hub/hub/tui/panels/__pycache__/tasks.cpython-314.pyc +0 -0
  86. package/tools/hub/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  87. package/tools/hub/tests/__pycache__/test_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  88. package/tools/hub/tests/__pycache__/test_cli.cpython-314-pytest-9.1.0.pyc +0 -0
  89. package/tools/hub/tests/__pycache__/test_db.cpython-314-pytest-9.0.2.pyc +0 -0
  90. package/tools/hub/tests/__pycache__/test_db.cpython-314-pytest-9.1.0.pyc +0 -0
  91. package/tools/hub/tests/__pycache__/test_migrate.cpython-314-pytest-9.0.2.pyc +0 -0
  92. package/tools/hub/tests/__pycache__/test_migrate.cpython-314-pytest-9.1.0.pyc +0 -0
  93. package/tools/hub/tests/__pycache__/test_projects.cpython-314-pytest-9.0.2.pyc +0 -0
  94. package/tools/hub/tests/__pycache__/test_projects.cpython-314-pytest-9.1.0.pyc +0 -0
  95. package/tools/hub/tests/__pycache__/test_scan.cpython-314-pytest-9.0.2.pyc +0 -0
  96. package/tools/hub/tests/__pycache__/test_scan.cpython-314-pytest-9.1.0.pyc +0 -0
  97. package/tools/hub/tests/__pycache__/test_tasks.cpython-314-pytest-9.0.2.pyc +0 -0
  98. package/tools/hub/tests/__pycache__/test_tasks.cpython-314-pytest-9.1.0.pyc +0 -0
  99. package/tools/hub/tests/__pycache__/test_tui_app.cpython-314-pytest-9.0.2.pyc +0 -0
  100. package/tools/hub/tests/__pycache__/test_tui_app.cpython-314-pytest-9.1.0.pyc +0 -0
  101. package/tools/hub/tests/__pycache__/test_tui_git.cpython-314-pytest-9.0.2.pyc +0 -0
  102. package/tools/hub/tests/__pycache__/test_tui_git.cpython-314-pytest-9.1.0.pyc +0 -0
  103. package/tools/hub/tests/__pycache__/test_tui_git_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  104. package/tools/hub/tests/__pycache__/test_tui_git_panel.cpython-314-pytest-9.1.0.pyc +0 -0
  105. package/tools/hub/tests/__pycache__/test_tui_projects_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  106. package/tools/hub/tests/__pycache__/test_tui_projects_panel.cpython-314-pytest-9.1.0.pyc +0 -0
  107. package/tools/hub/tests/__pycache__/test_tui_tasks_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  108. package/tools/hub/tests/__pycache__/test_tui_tasks_panel.cpython-314-pytest-9.1.0.pyc +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.19.0] - 2026-06-22
11
+
12
+ ### Added
13
+ - `sync-agent`:Syncthing 多设备同步工具与 skill — REST API 客户端、launchd 安装、CLI(start/stop/status/setup)、运行时管理同步 folder/device、为含 `.gitignore` 的目录自动创建 `.stignore`
14
+ - `hub`:TODO.md → SQLite 同步(启动时同步所有项目,ctrl+r 同步当前项目);`hub git` CLI 子命令(status/fetch/branches)与 TUI 对等;`hub projects remove` 命令 + TUI ctrl+d 快捷键
15
+ - `scout-philosophy`:skill 设计哲学研究 skill(meta bundle)
16
+ - `extract-url`:代码块支持;付费墙站点 cookie 重试;`HSKILL_EXTRACT_URL_CONFIG` 环境变量覆盖配置路径
17
+ - `learn-video`:新增字幕翻译步骤(translate_subs)
18
+
19
+ ### Changed
20
+ - `learn-skill` → v2.0.0:报告持久化到全局 skill 库、四维度归纳式重构、新增 Step 4 跨 skill 索引摘要
21
+ - `analyze-skill` → `survey-skillrepo`:重命名并移至 research bundle,泛化到任意 skill 仓库并集成 learn-skill
22
+ - `extract-url`:重构为从 `~/.hskill/config.json` 读取配置,各脚本不再依赖位置参数
23
+ - `init-skill`:迁移至 experiment bundle;description 移除中文以符合 F3;支持可切换参考标准用于 A/B 实验
24
+ - `publish-skill`:新增 R4 installScope 检查与修复引导
25
+ - 13 篇设计 spec 迁移为正式文档(hub、sync-agent、opencode、init-skill 等)
26
+ - 修正多个 skill 内容哈希与版本号,并为 10 个 skill 补充 `installScope`
27
+
28
+ ### Fixed
29
+ - `extract-url`:playwright_xcom 图片下载 SSL 验证、脚本路径/setup 顺序/超时/权限等修复
30
+ - `hub`:TUI remove 行为与 CLI 对齐、footer category map、remove 快捷键改为 ctrl+d
31
+ - `sync-agent`:平台感知的 Syncthing 配置路径(macOS/Linux)
32
+ - `learn-skill`:audit findings 修复,移除 reference/script 200 行读取上限
33
+ - 测试:survey-skillrepo fixture 版本同步至 2.0.1,修复 test_config.py 导入与 bats meta-bundle 断言
34
+
10
35
  ## [0.18.0] - 2026-06-16
11
36
 
12
37
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harveyz-skill",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "Skill manager for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {
@@ -34,8 +34,8 @@
34
34
  "skills/design/scout-brand/",
35
35
  "skills/design/build-style/",
36
36
  "skills/design/sync-design/",
37
- "skills/meta/init-skill/",
38
- "skills/meta/analyze-skill/",
37
+ "skills/experiment/init-skill/",
38
+ "skills/research/survey-skillrepo/",
39
39
  "skills/meta/clean-git/",
40
40
  "skills/meta/archive-skill/",
41
41
  "skills/meta/dedup-skill/",
@@ -43,8 +43,10 @@
43
43
  "skills/meta/publish-skill/",
44
44
  "skills/meta/runby-opencode/",
45
45
  "skills/meta/release-project/",
46
+ "skills/meta/sync-agent/",
46
47
  "skills/experiment/probe-session/",
47
48
  "skills/experiment/learn-paper/",
49
+ "skills/meta/scout-philosophy/",
48
50
  "tools/hub/",
49
51
  "hooks/check-similar-branch/"
50
52
  ],
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: init-skill
3
- description: "Initialize a new skill from scratch in the harveyz-skill repo — scaffolds SKILL.md, directory structure, and a feature branch from a design spec or free-form notes. Triggers: 'create new skill', 'scaffold a skill', 'init skill', 'bootstrap skill from notes', 'create skill from spec', 'help me start a new skill', 'initialize a skill'."
3
+ description: "Initialize a new skill from scratch in the harveyz-skill repo — scaffolds SKILL.md, directory structure, and a feature branch from a design spec or free-form notes. Applies the condensed skill design standard (16 philosophies + system mechanisms). Triggers: 'create new skill', 'scaffold a skill', 'init skill', 'bootstrap skill from notes', 'create skill from spec', 'help me start a new skill', 'initialize a skill'."
4
4
  user_invocable: true
5
- version: "1.0.1"
5
+ version: "1.2.0"
6
6
  ---
7
7
 
8
8
  # 从设计文档初始化新 Skill
@@ -25,6 +25,12 @@ version: "1.0.1"
25
25
 
26
26
  ---
27
27
 
28
+ ## 参考标准
29
+
30
+ 本 skill 使用 `references/skill-standard.md` 作为单一标准——精简版(约 200 行),含 16 条设计哲学 + 系统机制 + 张力点。Step 2 加载该文件并对照检查。
31
+
32
+ ---
33
+
28
34
  ## 执行流程(6 步)
29
35
 
30
36
  ### Step 0 — 需求澄清
@@ -54,17 +60,17 @@ version: "1.0.1"
54
60
  ```
55
61
  列出候选文件供用户选择。
56
62
 
57
- ### Step 2 — 提炼要素 + 最佳实践检查
63
+ ### Step 2 — 提炼要素 + 标准检查
58
64
 
59
- 用 Read 工具读取 `references/skill-authoring-guide.md`,然后从设计文档中提取以下字段,以表格 + 建议形式展示给用户:
65
+ **2a. 加载标准:** 用 Read 工具读取 `references/skill-standard.md`(精简版,约 200 行)。
60
66
 
61
- **提炼结果:**
67
+ **2b. 提炼要素:** 从设计文档中提取以下字段:
62
68
 
63
69
  | 字段 | 提取值 | 规范约束 |
64
70
  |------|--------|---------|
65
- | `name` | `<verb>-<noun>` 格式 | 动词必须在规范词表中 |
71
+ | `name` | `<verb>-<noun>` 格式 | 动词必须在标准词表中 |
66
72
  | `bundle` | 从现有 bundleMeta 中选 | 可新建 |
67
- | `description` | 英文,含触发短语 | ≥ 10 字符,不含中文 |
73
+ | `description` | 英文,含触发短语 | ≥ 10 字符,仅英文 |
68
74
  | 正文大纲 | 中文,核心步骤列表 | — |
69
75
  | `category` 目录 | 对应 bundle 的目录名 | — |
70
76
 
@@ -73,13 +79,18 @@ version: "1.0.1"
73
79
  node -e "const i=JSON.parse(require('fs').readFileSync('skills-index.json','utf8')); Object.entries(i.bundleMeta).forEach(([k,v])=>console.log(k+': '+v))"
74
80
  ```
75
81
 
76
- **适用的最佳实践提示**(从 authoring guide 逐条检查,只列出适用的):
82
+ **2c. 适用哲学识别:** 对照标准的 16 条哲学,识别本 skill 涉及的(通常 3–10 条)。每条按"触发"条件判断是否成立。
83
+
84
+ **2d. 标准检查:** 逐条核对相关哲学的"必做"和"检查"项,输出:
77
85
 
78
86
  ```
79
- [✓] <规范通过> <说明>
80
- [!] <需要注意> <具体建议>
87
+ [✓] Φ1 可回退 破坏性 step 前有 y/n 确认
88
+ [] Φ5 配置就地 路径 .hskill/<name>/ 正确
89
+ [!] Φ12 输入清洁化 — URL 输入缺少控制字符剥离,建议加 re.sub(...)
81
90
  ```
82
91
 
92
+ 涉及多哲学冲突时查标准末尾"张力点"表消歧。
93
+
83
94
  **等用户明确确认后才进入 Step 3。**
84
95
 
85
96
  ### Step 3 — 生成 SKILL.md
@@ -111,7 +122,7 @@ version: "1.0.0"
111
122
  (2-4 条明确边界)
112
123
  ```
113
124
 
114
- 若 skill 有参考材料(查找表、模板、禁忌清单)且超过 20 行,按 authoring guide 提示提取到 `references/` 子目录,而非全部内联在 SKILL.md 中。
125
+ 若 skill 有参考材料(查找表、模板、禁忌清单)且超过 20 行,按标准 Φ18 提取到 `references/` 子目录,而非全部内联在 SKILL.md 中。
115
126
 
116
127
  将生成内容展示给用户预览。**等用户明确确认后才进入 Step 4。**
117
128
 
@@ -0,0 +1,156 @@
1
+ # Skill Authoring Guide
2
+
3
+ init-skill 使用本文件作为生成新 skill 时的规范检查清单。内容分两类:**显性规范**(硬性要求,不符合则 publish-skill 报错)和**隐性模式**(从现有优质 skill 提炼的最佳实践)。
4
+
5
+ ---
6
+
7
+ ## 显性规范
8
+
9
+ ### 命名
10
+
11
+ - 目录名格式:`<verb>-<noun>`(2 段,连字符分隔,全小写)
12
+ - 动词必须在词表中:
13
+
14
+ ```
15
+ extract learn forge draw manage migrate scout
16
+ build sync publish archive contribute analyze clean
17
+ release validate init dispatch close setup capture
18
+ runby dedup survey
19
+ ```
20
+
21
+ 特殊:以 `runby-` 开头的目录直接视为合规。
22
+
23
+ ### Frontmatter 必填字段
24
+
25
+ | 字段 | 要求 |
26
+ |------|------|
27
+ | `name` | 非空,值 == 目录名 |
28
+ | `description` | 英文,≥ 10 字符,不含中文字符 |
29
+ | `user_invocable` | 显式声明 `true` 或 `false` |
30
+ | `version` | semver 格式 `X.Y.Z`,初始值 `"1.0.0"` |
31
+
32
+ ### description 格式
33
+
34
+ ```
35
+ "<动词短语说明功能>. Triggers when <触发条件>. e.g. '<示例指令1>', '<示例指令2>'."
36
+ ```
37
+
38
+ 触发词宁宽勿窄,但要避免与现有 skill 触发场景重叠。举例比描述更精确。
39
+
40
+ ### 正文语言
41
+
42
+ frontmatter 结束后的正文应为中文(含至少一个中文字符即合规)。
43
+
44
+ ---
45
+
46
+ ## 隐性模式
47
+
48
+ ### 正文结构
49
+
50
+ 推荐节顺序:**触发条件 → 执行步骤(Step N) → 边界说明(不在范围内)**
51
+
52
+ - 每个 Step 对应一个可验证的原子操作,不要把两个动作塞进同一步
53
+ - 边界说明必须有,明确列出 2-4 个常见误用场景,防止 skill 在对话中被过度扩展
54
+
55
+ ### 状态与配置
56
+
57
+ **1. `.hskill/<skill-name>/` 配置缓存**(7 个 skill 使用此模式)
58
+
59
+ 有状态的 skill 将配置持久化到 `$HOME/.hskill/<skill-name>/`,每次运行 Step 1 先读此目录,未找到时落到默认值或询问用户。
60
+
61
+ ```
62
+ clean-git → ~/.hskill/clean-git/branch-cleanup.md
63
+ init-workflow → ~/.hskill/init-workflow/workflow-config.yml
64
+ ```
65
+
66
+ **2. "读取配置"作为第一执行步骤**(6 个 skill 使用此模式)
67
+
68
+ 有状态 skill 的第一个实质步骤总是:检测配置文件存在性 → 不存在则用默认或询问 → 解析校验 → 才进入业务步骤。
69
+
70
+ **3. Lock / snapshot 文件做变更检测**(3 个 skill 使用此模式)
71
+
72
+ 维护 `.lock` 或 manifest 快照,记录"上次运行状态",实现 delta 操作(只处理变化部分)。
73
+
74
+ ```
75
+ init-workflow → .githooks/.workflow-config.lock.yml
76
+ sync-design → manifest.json 含 lastSyncCommit
77
+ publish-skill → skills-index.json 中的 contentHash
78
+ ```
79
+
80
+ **4. 多源配置覆盖链**(3 个 skill 使用此模式)
81
+
82
+ 多个配置源按固定顺序读取,后读优先级更高。明确注明"后读内容优先级更高"。
83
+
84
+ ### 错误处理与边界
85
+
86
+ **5. "边界情况"表格放在步骤末尾**(5 个 skill 使用此模式)
87
+
88
+ 复杂多分支步骤末尾用表格列出所有边界条件和处理方式,便于一眼看全所有路径。
89
+
90
+ ```markdown
91
+ | 情况 | 处理 |
92
+ |------|------|
93
+ | 目标路径已存在 | 停止报错,不覆盖 |
94
+ | generate-npmignore.js 失败 | 报错,不执行 git 操作 |
95
+ ```
96
+
97
+ **6. 冲突解决:批量收集,统一决策**(3 个 skill 使用此模式)
98
+
99
+ 出现冲突时,先收集所有冲突再分组展示,让用户一次性逐条决策。不要边发现边问。
100
+
101
+ ### 扩展与组合
102
+
103
+ **7. references/ 承载平台/技术栈特定文档**(5 个 skill 使用此模式)
104
+
105
+ Skill 顶层逻辑保持技术中立,平台/格式特定内容放进 `references/`,运行时按检测结果动态读取。扩展通过加文件而非改 SKILL.md。
106
+
107
+ ```
108
+ setup-debug → references/tech-stacks/<stack>.md
109
+ extract-url → platforms/SKILL.<platform>.md
110
+ ```
111
+
112
+ 阈值:references/ 内单文件 > 20 行时才提取;小内容直接内联。
113
+
114
+ **8. Subagent 委派 + 变量注入**(2 个 skill 使用此模式)
115
+
116
+ Skill 委派 subagent 时用环境变量注入运行时值(不是字符串拼接),并加载平台特定 patch 文件。
117
+
118
+ ### 输出格式
119
+
120
+ **9. Emoji 与状态标记规范化**(5 个 skill 使用此模式)
121
+
122
+ 统一视觉符号:`✓` / `✅`(通过)、`⚠️`(注意)、`❌`(失败)、`━━━`(分组分隔)。状态标签:`UPDATED` / `UNCHANGED` / `NEW` / `OK` / `FAIL`。
123
+
124
+ **10. 时间戳化 delta 报告**(3 个 skill 使用此模式)
125
+
126
+ 批量操作后每个条目标注状态(NEW / UPDATED / UNCHANGED),用户可跳过未变项。
127
+
128
+ ```markdown
129
+ | 文件 | 状态 |
130
+ |------|------|
131
+ | .githooks/pre-commit | UPDATED |
132
+ | .githooks/commit-msg | UNCHANGED |
133
+ ```
134
+
135
+ **11. "下一步"交棒提示**(4 个 skill 使用此模式)
136
+
137
+ Skill 完成后给出明确的下一步建议:调用下一个 skill,或询问用户是否深入某部分。
138
+
139
+ ```
140
+ scout-brand: "确认后可运行 /build-style"
141
+ init-skill: "下一步:运行 /publish-skill 完成注册"
142
+ ```
143
+
144
+ ### 安全与规范
145
+
146
+ **12. Bash 安全:禁止字符串拼接**(3 个 skill 使用此模式)
147
+
148
+ Skill 中嵌入 bash/Python 时,禁止用 shell 字符串拼接传值。使用 `subprocess` 列表参数或环境变量;URL 净化用正则替换。
149
+
150
+ **13. 版本字段在内容 hash 计算中视为占位**(2 个 skill 使用此模式)
151
+
152
+ 计算 SKILL.md 内容 hash 时,将 `version:` 行替换为固定占位符再计算,避免单纯改版本号触发"内容变更"误报。
153
+
154
+ ```bash
155
+ sed 's/^version:.*$/version: __HASH_PLACEHOLDER__/' SKILL.md | sha256sum | cut -c1-16
156
+ ```
@@ -0,0 +1,219 @@
1
+ # Skill 设计标准
2
+
3
+ init-skill 生成 / 检查 SKILL.md 时遵循。每条哲学按"**触发 → 必做 → 检查 → 不适用**"组织。
4
+
5
+ 强度标注 `[强]` 表示反例不可接受(数据丢失 / 安全事故),`[中]` 表示有累积成本但不致命。
6
+
7
+ ---
8
+
9
+ ## 系统机制(必须满足,无例外)
10
+
11
+ 违反 = skill 加载失败 / 注册失败:
12
+
13
+ - `name` 字段值与所在目录名完全一致
14
+ - frontmatter 含 `name` / `description` / `user_invocable` / `version` 四字段
15
+ - `description` 全英文 ≥ 10 字符(中文触发短语放正文"触发条件"节)
16
+ - `version` 是 semver 三段 `X.Y.Z`,新 skill 从 `1.0.0`
17
+ - `user_invocable` 显式 `true` 或 `false`
18
+ - 注册到 `skills-index.json`,含 `path` / `bundle` / `installScope`
19
+ - 正文至少含一个中文字符(团队约定)
20
+
21
+ ---
22
+
23
+ ## 命名与形式约定(Φ18 [中])
24
+
25
+ `name` 用 `<verb>-<noun>` 格式,2 词全小写连字符。动词必须在词表:
26
+
27
+ ```
28
+ extract learn forge draw manage migrate scout
29
+ build sync publish archive contribute analyze clean
30
+ release validate init dispatch close setup capture
31
+ dedup runby
32
+ ```
33
+
34
+ 特殊:`runby-*` 后 noun 不受词表约束。
35
+
36
+ `description` 格式:`"<动词短语>. Triggers: '<场景1>', '<场景2>'..."`,仅英文。
37
+
38
+ 节顺序:**触发条件 → 执行步骤 → 不在范围内**。Step 命名"动词 + 名词"(`Step 1 — 定位设计文档`)。
39
+
40
+ 参考材料 > 20 行时提取到 `references/` 子目录;平台 / 技术栈特定内容放 `references/<dim>/`。
41
+
42
+ ---
43
+
44
+ ## Φ1 可回退 [强]
45
+
46
+ - **触发:** 破坏性操作(文件删除 / 移动 / 覆盖、git 写入)
47
+ - **必做:** 操作前展示完整摘要 + 等待 y/n 确认;摘要列具体文件路径、分支名、外部脚本名
48
+ - **必做:** 长流程(≥ 4 步)多 checkpoint,禁止"一次确认走到底"
49
+ - **检查:** 破坏性 Step 前含 "(y/n)" 或"等用户确认"字样
50
+ - **不适用:** read-only 操作(查询、列出、读文件)
51
+
52
+ ## Φ2 故障保留 [强]
53
+
54
+ - **触发:** skill 含 ≥ 2 个步骤
55
+ - **必做:** Step 1 先做前置检查(git 状态、文件存在、依赖工具、目标冲突),任一失败立即中止
56
+ - **必做:** API / shell / subprocess 调用必须显式检查退出码或 HTTP 状态码
57
+ - **必做:** 外部脚本失败后不进入 git commit / 文件删除;保留文件供调试
58
+ - **必做:** 错误信息含三项:哪步失败 / 当前状态 / 用户下一步动作
59
+ - **不适用:** 单一原子操作 skill
60
+
61
+ ## Φ3 边界显式 [中]
62
+
63
+ - **触发(任一满足):**
64
+ - skill 与其他 skill 功能可能混淆(触发词或职责可能重叠)
65
+ - skill 含多分支 / 多失败路径
66
+ - skill 易被对话扩展到设计意图外
67
+ - **必做(与触发条件对应):**
68
+ - 触发词与其他 skill 可能冲突 → "触发条件"节含"不触发:X 场景应使用 Y skill"
69
+ - 易被对话扩展 → "不在范围内"节列 2–4 个误用场景
70
+ - 多分支 → 步骤末尾用"边界情况汇总表"列处理方式
71
+ - **检查:** 已识别的边界风险类型都有对应的显式声明
72
+ - **不适用:** 功能单一、流程线性、无与其他 skill 重叠的工具型 skill
73
+
74
+ ## Φ4 信息按需收集 [中]
75
+
76
+ - **触发:** skill 启动时需要参数
77
+ - **必做:** 三级 fallback——上下文推断 → 显式指定 → 扫描列出
78
+ - **必做:** 模糊意图澄清时一次只问一个,禁止堆叠问题列表
79
+ - **必做:** 上下文已含模式信号时跳过询问(不忽略用户已提供的信息)
80
+ - **不适用:** 完全自动化无参数的 skill
81
+
82
+ ## Φ5 配置就地 [强]
83
+
84
+ - **触发:** skill 需要跨会话持久化配置 / 状态
85
+ - **必做:** 存 `~/.hskill/<skill-name>/`(全局)或 `<project-root>/.hskill/<skill-name>/`(项目本地)
86
+ - **判别:** 配置换个项目还有意义吗?有 → 全局;无 → 项目本地
87
+ - **必做:** profile 一旦生成是后续运行的唯一依据,禁止"Execute 时还在改"
88
+ - **检查:** SKILL.md 提到的所有持久化路径在 `.hskill/<skill-name>/` 下
89
+ - **不适用:** 一次性 / 纯计算 skill
90
+
91
+ ## Φ6 单一真理源 [中]
92
+
93
+ - **触发:** skill 引用会变化的列表 / 注册表(bundle 列表、版本、字段映射)
94
+ - **必做:** 运行时用 Read / grep / jq / yaml 解析器读取,禁止在 SKILL.md 硬编码
95
+ - **必做:** 报告数字必须来自实际计数,禁止 "约 N 个" 估算
96
+ - **检查:** SKILL.md 不含可能过时的具体列表内容
97
+ - **不适用:** 固定的步骤序列、字符串模板
98
+
99
+ ## Φ7 错误分级 [中]
100
+
101
+ - **触发:** skill 输出问题报告
102
+ - **必做:** 区分阻塞错误(必须修复才能通过)vs 建议警告(不影响通过)
103
+ - **必做:** 退出码语义化(`0` 成功 / `1` 失败 / `2` 无内容触发降级)
104
+ - **必做:** 多问题报告按类型分组(格式 / 注册 / 警告 / 通过),不按发现顺序混排
105
+ - **检查:** 报告示例含 "错误 N 个 / 警告 M 个" 类分类
106
+
107
+ ## Φ8 可组合 [中]
108
+
109
+ - **触发:** skill 完成后有自然下游
110
+ - **必做:** 总结后输出独立"下一步"提示行(运行哪个 skill / 命令)
111
+ - **必做:** 与外部生态对接时优先复用原生机制(如 `skills.paths`、`.stignore #include`)
112
+ - **必做:** 与其他 skill 共享配置时在 SKILL.md 明确说明共享路径与读写约定
113
+ - **不适用:** 独立工具型 skill 无明确下游
114
+
115
+ ## Φ9 保守不越权 [强]
116
+
117
+ - **触发:** skill 涉及 git / 文件系统 / 远端 API
118
+ - **必做:** 禁止自动 push、删除远端、发布到 npm;副作用最大的步骤交用户手动
119
+ - **必做:** 禁止自动操作受保护分支(main / master / staging);显式跳过或要求切换
120
+ - **必做:** 目标路径已存在拒绝覆盖;停止报错或询问覆盖 / 重命名 / 中止
121
+ - **必做:** 修改文件只动用户明确指定的字段,其他保持不变
122
+ - **检查:** SKILL.md 不含自动执行的 `git push origin`、`npm publish` 等
123
+
124
+ ## Φ10 输出符号一致 [中]
125
+
126
+ - **触发:** skill 输出含状态 / 进度 / 报告分类
127
+ - **原则:**
128
+ - 同语义同符号——同一状态("通过""失败"等)在 skill 内部和跨 skill 之间保持一致
129
+ - 符号有功能性,不为装饰
130
+ - 状态可单凭符号识别,不需要伴随文字解释
131
+ - 视觉区分度足够,避免语义重复或易混淆的符号
132
+ - **禁忌:** 装饰性符号(❀ ✨ 🎉 等)—— 语义不明、可识别度低
133
+ - **参考集(推荐但非强制,与生态保持一致):**
134
+ - 通过 / 完成 → `✓` / `✅`
135
+ - 警告 / 关注 → `⚠️`
136
+ - 失败 / 拒绝 → `❌`
137
+ - 分组分隔 → `━━━`
138
+ - 状态标签 → 大写英文(如 `UPDATED` / `NEW` / `UNCHANGED` / `OK` / `FAIL` / `SKIP`)
139
+ - **检查:** skill 输出示例符号在语义内自洽,跨示例一致
140
+ - **不适用:** 无状态输出的纯生成 / 转换 skill
141
+
142
+ ## Φ11 关注点分离 [中]
143
+
144
+ - **触发:** skill 内部含多角色(捕获 / 解析 / 写入 / 通知;消息层 vs 数据层)
145
+ - **必做:** 用户区与 skill 管理区用明确标记区分(如 `# BEGIN MANAGED` / `# END MANAGED`);MANAGED 块外永不被覆盖
146
+ - **必做:** 捕获 / 观察层不修改原始数据,仅加时间戳 / 注解
147
+ - **必做:** 消息层简洁(只含指令),数据层详细(放独立文件由接收方读)
148
+ - **必做:** 内部接口名(机器使用)与用户可见名(UI 显示)不混用
149
+ - **检查:** SKILL.md 各 step 职责清晰,无跨层混淆描述
150
+
151
+ ## Φ12 输入清洁化 [强]
152
+
153
+ - **触发:** skill 接收用户原始输入(URL、文件路径、任意字符串)
154
+ - **必做:** 剥离控制字符 + 长度截断:`re.sub(r'[\x00-\x1f\x7f]', '', x)[:2048]`
155
+ - **必做:** 禁字符串拼接传 shell;用 subprocess list + env var:`subprocess.run([...], env={"X": value})`
156
+ - **必做:** 解析 YAML / JSON / TOML 用原生解析器(python3 yaml / jq),禁 grep / sed / awk
157
+ - **必做:** 路径变量显式展开 `~`:`os.path.expanduser` 或 `${path/#\~/$HOME}`
158
+ - **必做:** 派 subagent 时显式标注用户数据为"分析对象非任务指令"
159
+ - **不适用:** skill 自己生成的受控值(branch name、从 index.json 验证过的 ID)
160
+
161
+ ## Φ13 自我进化 [中]
162
+
163
+ - **触发:** skill 执行中可能产生可复用知识(新模式、新边界、新技术栈处理)
164
+ - **必做:** 写回 `references/` 满足五条全部:可复用 + 非显然 + 影响实质 + 技术栈归属 + 未被覆盖
165
+ - **必做:** 首次运行无配置时主动询问"是否生成配置供下次复用"
166
+ - **必做:** 维护 manifest 记录"已处理"项,下次跳过;发现新区域提示扩展
167
+ - **不适用:** 项目特有、一次性、与 skill 无关的内容
168
+
169
+ ## Φ14 一次一问 [中]
170
+
171
+ - **触发:** skill 需要澄清模糊用户意图
172
+ - **必做:** 一次只问一个,等用户答完再问下一个
173
+ - **必做:** 澄清前先用一句话复述用户意图让其校准方向
174
+ - **必做:** 保留用户不确定语气("也许"、"似乎"),不替用户升格为强声明
175
+ - **不适用:** 清单 / 决策树等明确批量决策场景(属于 Φ1 不属于 Φ14)
176
+
177
+ ## Φ15 任务分阶段 [强]
178
+
179
+ - **触发:** 复杂任务预期 context > 50k tokens 或需要全局视野
180
+ - **必做(选一种或多种形态):**
181
+ - 形态一 I/O vs LLM 拆分:抓取 + 理解拆为独立 subagent
182
+ - 形态二 广扫 vs 深读:仓库级 + 单元级拆为独立 skill 交棒
183
+ - 形态三 多遍读:定向 → 提取 → 批判
184
+ - 形态四 读完再写:跨文档先全部读完再做横向矩阵,禁止边读边写
185
+ - **必做:** 多阶段任务支持单遍重跑 / 断点续传(如 `--pass N` 参数)
186
+ - **不适用:** 简单任务(5 步以内、单文件操作)
187
+
188
+ ## Φ16 证据可溯源 [弱]
189
+
190
+ - **触发:** skill 生成分析 / 解读 / 审计报告
191
+ - **必做:** 每条结论标注来源("来自 Step N" / "来自维度 X" / "原文 N 段")
192
+ - **必做:** 含推断的结论用显式标签 `[基于原文]` / `[Agent 推断]` / `[需核实]`
193
+ - **必做:** 输出前完整性自查:找不到证据的结论删除或降级标注
194
+ - **不适用:** 执行 / 工具型 skill,非分析类
195
+
196
+ ---
197
+
198
+ ## 哲学张力点(设计时常遇)
199
+
200
+ | 张力对 | 区分 |
201
+ |--------|------|
202
+ | Φ1 vs Φ14 | Φ1 在输入已明 / 即将执行阶段一次确认;Φ14 在输入未明 / 澄清阶段一次一问 |
203
+ | Φ2 vs Φ9 | Φ2 是"出错时"保留现场;Φ9 是"正常时"不越权 |
204
+ | Φ9 vs Φ11 | Φ9 对外部不越权(远端 / 主干 / 用户已存在);Φ11 对内部不越权(层间 / 块间) |
205
+ | Φ8 vs Φ15 | Φ8 是 skill 间组合(交棒);Φ15 是 skill 内阶段(拆分) |
206
+ | Φ6 vs Φ13 | Φ6 是"读 SoT"(不硬编码);Φ13 是"写回 SoT"(沉淀),方向相反但共生 |
207
+
208
+ ---
209
+
210
+ ## 应用流程
211
+
212
+ 1. **识别**:读 spec,判断涉及哪些哲学(一般 3–10 条)
213
+ 2. **触发检查**:对每条相关哲学,确认"触发"条件是否成立
214
+ 3. **抽取必做**:从命中的哲学"必做"中组装 SKILL.md 步骤
215
+ 4. **自验证**:用"检查"条目对照产物
216
+ 5. **消歧**:涉及多哲学冲突时查"张力点"表
217
+ 6. **核对系统机制**:确保 frontmatter / 命名 / 注册满足"系统机制"节
218
+
219
+ 写 skill 时反复问:**"违反这条会怎样?"** 能给出具体失败 → 必须遵守;不能 → 这条可能不适用当前 skill。
@@ -2,7 +2,7 @@
2
2
  name: publish-skill
3
3
  description: "Validate and publish a skill to the harveyz-skill repository. Checks SKILL.md format compliance (frontmatter fields, semver version, name-directory match, verb-noun naming convention) and registration in skills-index.json. Rules defined in docs/reference/skill-spec.md. Triggers: publish skill, register skill, validate skill format, check skill, add skill to index, is skill ready to publish."
4
4
  user_invocable: true
5
- version: "1.2.1"
5
+ version: "1.3.0"
6
6
  ---
7
7
 
8
8
  # skill-publish
@@ -123,6 +123,7 @@ _fm() {
123
123
  | R1 | `skills[]` 中有对应条目 | `path` 值 == `category/name` |
124
124
  | R2 | 对应条目有 `bundle` 字段且非空 | 必须指定归属 bundle |
125
125
  | R3 | `bundle` 值存在于 `bundleMeta` | bundle key 必须已声明 |
126
+ | R4 | `installScope` 字段存在且值合法 | 值须为 `essential`/`global`/`project` 之一;缺失或值非法时报**警告**(不阻止通过) |
126
127
 
127
128
  ### Step 5 — 输出报告
128
129
 
@@ -146,6 +147,13 @@ skill-publish 检查结果
146
147
  skills/meta/my-skill
147
148
  R1 未在 skills-index.json 中注册
148
149
 
150
+ 注册警告(不阻止通过,建议修复)
151
+ --------
152
+ skills/coding/setup-debug
153
+ R4 installScope 未设置(可选:essential / global / project)
154
+ skills/meta/my-other-skill
155
+ R4 installScope 值 'always' 非法(须为 essential / global / project)
156
+
149
157
  全部通过
150
158
  --------
151
159
  skills/meta/contribute-skill ✓
@@ -153,15 +161,23 @@ skill-publish 检查结果
153
161
  ...
154
162
 
155
163
  ========================
156
- 共发现 3 个问题(2 个格式,1 个注册)
164
+ 共发现 3 个问题(2 个格式,1 个注册),2 个警告
157
165
  ```
158
166
 
159
- 若全部通过:
167
+ 若全部通过(含警告):
160
168
 
161
169
  ```
162
170
  skill-publish 检查结果
163
171
  ========================
164
- 所有 N 个 skill 格式与注册均符合规范。✓
172
+ 所有 N 个 skill 格式与注册均符合规范。✓(2 个 R4 警告,建议填写 installScope)
173
+ ```
174
+
175
+ 若完全无问题无警告:
176
+
177
+ ```
178
+ skill-publish 检查结果
179
+ ========================
180
+ 所有 N 个 skill 格式、注册与推荐级别均符合规范。✓
165
181
  ```
166
182
 
167
183
  ### Step 6 — 修复引导(按需)
@@ -207,9 +223,18 @@ skill-publish 检查结果
207
223
  选择目标 bundle:
208
224
  ```
209
225
 
210
- 选定后,在 `skills[]` 末尾追加:
226
+ 选定 bundle 后,继续询问推荐级别:
227
+ ```
228
+ 选择推荐级别(installScope):
229
+ 1. essential — 所有安装场景默认包含
230
+ 2. global — 推荐安装,跨项目通用
231
+ 3. project — 按项目需要安装
232
+ 4. (不设置,跳过)
233
+ ```
234
+
235
+ 根据选择,在 `skills[]` 末尾追加(选 4 则省略 installScope 字段):
211
236
  ```json
212
- { "path": "meta/my-skill", "bundle": "meta" }
237
+ { "path": "meta/my-skill", "bundle": "meta", "installScope": "global" }
213
238
  ```
214
239
 
215
240
  若新建 bundle,在 `bundleMeta` 中同步添加。
@@ -219,6 +244,21 @@ skill-publish 检查结果
219
244
  cd "${REPO_ROOT}" && node scripts/generate-npmignore.js
220
245
  ```
221
246
 
247
+ **注册警告(R4)** — 为已注册但缺少 installScope 的 skill 补充推荐级别:
248
+ ```
249
+ 修复 R4(installScope 未设置)— skills/coding/setup-debug:
250
+ 选择推荐级别:
251
+ 1. essential — 所有安装场景默认包含
252
+ 2. global — 推荐安装,跨项目通用
253
+ 3. project — 按项目需要安装
254
+ 4. (跳过,保持不设置)
255
+ ```
256
+
257
+ 用户选择后,用 Edit 工具在 `skills-index.json` 对应条目中添加 `installScope` 字段,再暂存:
258
+ ```bash
259
+ git add skills-index.json
260
+ ```
261
+
222
262
  ### Step 7 — 更新 contentHash
223
263
 
224
264
  在以下两种情况下执行,其余情况跳过: