harveyz-skill 0.14.2 → 0.16.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 (142) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/bin/cli.js +14 -2
  3. package/lib/installer.js +64 -0
  4. package/package.json +25 -24
  5. package/skills/coding/{task-close → close-task}/SKILL.md +1 -1
  6. package/skills/coding/{pm-task-dispatch → dispatch-task}/SKILL.md +1 -1
  7. package/skills/coding/{git-workflow-init → init-workflow}/SKILL.md +13 -12
  8. package/skills/coding/{full-stack-debug-env → setup-debug}/SKILL.md +1 -1
  9. package/skills/creative/{insight → capture-insight}/SKILL.md +1 -1
  10. package/skills/creative/{add-todo → capture-todo}/SKILL.md +1 -1
  11. package/skills/design/{style-build → build-style}/SKILL.md +13 -13
  12. package/skills/design/{brand-scout → scout-brand}/SKILL.md +6 -6
  13. package/skills/design/{sync-design-html → sync-design}/SKILL.md +9 -3
  14. package/skills/meta/{skill-analyzer → analyze-skill}/SKILL.md +1 -1
  15. package/skills/meta/archive-skill/SKILL.md +170 -0
  16. package/skills/meta/{git-cleanup → clean-git}/SKILL.md +4 -4
  17. package/skills/meta/dedup-skill/SKILL.md +187 -0
  18. package/skills/meta/dedup-skill/references/auto-scan.md +37 -0
  19. package/skills/meta/{skill-publish → publish-skill}/SKILL.md +31 -3
  20. package/skills/meta/{project-release → release-project}/SKILL.md +10 -10
  21. package/skills/meta/{opencode-runner → runby-opencode}/SKILL.md +1 -1
  22. package/skills/research/{url-extract → extract-url}/SKILL.md +1 -1
  23. package/skills/research/{vision-extract → extract-vision}/SKILL.md +1 -1
  24. package/skills/research/{youtube-learner → learn-video}/SKILL.md +1 -1
  25. package/skills/writing/{diagram → draw-diagram}/SKILL.md +1 -1
  26. package/skills/writing/{doc-forge → forge-doc}/SKILL.md +29 -29
  27. package/skills/writing/{doc-forge → forge-doc}/scripts/__pycache__/md_to_pdf.cpython-314.pyc +0 -0
  28. package/skills/writing/{dir-manage → manage-dir}/SKILL.md +1 -1
  29. package/skills/writing/{diataxis-docs → manage-docs}/SKILL.md +1 -1
  30. package/skills/writing/{migrate-specs → migrate-spec}/SKILL.md +1 -1
  31. package/skills-index.json +120 -29
  32. package/tools/hub/hub/cli/__init__.py +2 -0
  33. package/tools/hub/hub/cli/__pycache__/__init__.cpython-314.pyc +0 -0
  34. package/tools/hub/hub/cli/__pycache__/git.cpython-314.pyc +0 -0
  35. package/tools/hub/hub/cli/__pycache__/projects.cpython-314.pyc +0 -0
  36. package/tools/hub/hub/cli/git.py +120 -0
  37. package/tools/hub/hub/core/__pycache__/projects.cpython-314.pyc +0 -0
  38. package/tools/hub/hub/tui/app.py +20 -4
  39. package/tools/hub/hub/tui/panels/git.py +2 -0
  40. package/tools/hub/hub/tui/panels/projects.py +6 -0
  41. package/tools/hub/hub.sh +12 -2
  42. package/tools/hub/pyproject.toml +1 -1
  43. package/tools/hub/tool.json +1 -1
  44. package/skills/research/article-fetcher/SKILL.md +0 -209
  45. package/skills/research/article-fetcher/references/__pycache__/article_utils.cpython-314.pyc +0 -0
  46. package/skills/research/article-fetcher/references/article_utils.py +0 -252
  47. package/skills/research/article-fetcher/scripts/import_reading.py +0 -75
  48. package/skills/research/article-fetcher/scripts/init_db.py +0 -33
  49. package/skills/research/article-fetcher/scripts/playwright_xcom.py +0 -221
  50. package/skills/research/article-fetcher/scripts/url-index.db +0 -0
  51. package/skills/research/article-fetcher/scripts/url-index.db.bak +0 -0
  52. package/skills/research/article-fetcher/tests/test_security.py +0 -257
  53. package/skills/research/article-fetcher/vars.json +0 -12
  54. package/skills/research/url-extract/references/__pycache__/article_utils.cpython-314.pyc +0 -0
  55. package/skills/research/url-extract/references/file-format.md +0 -73
  56. package/skills/research/url-extract/scripts/playwright_web.py +0 -172
  57. package/skills/research/url-extract/scripts/validate_article.py +0 -36
  58. package/skills/writing/doc-forge/tests/__pycache__/test_md_to_pdf.cpython-314-pytest-9.0.2.pyc +0 -0
  59. /package/skills/coding/{task-close → close-task}/references/output-templates.md +0 -0
  60. /package/skills/coding/{pm-task-dispatch → dispatch-task}/references/agent-mapping.md +0 -0
  61. /package/skills/coding/{pm-task-dispatch → dispatch-task}/references/task-template.md +0 -0
  62. /package/skills/coding/{git-workflow-init → init-workflow}/references/acceptance-test.md +0 -0
  63. /package/skills/coding/{git-workflow-init → init-workflow}/references/conflict-analysis.md +0 -0
  64. /package/skills/coding/{git-workflow-init → init-workflow}/references/git-workflow-template.md +0 -0
  65. /package/skills/coding/{git-workflow-init → init-workflow}/references/hook-templates.md +0 -0
  66. /package/skills/coding/{git-workflow-init → init-workflow}/references/lock-file-format.md +0 -0
  67. /package/skills/coding/{git-workflow-init → init-workflow}/references/render_docs.py +0 -0
  68. /package/skills/coding/{git-workflow-init → init-workflow}/references/workflow-config.yml +0 -0
  69. /package/skills/coding/{full-stack-debug-env → setup-debug}/evals/evals.json +0 -0
  70. /package/skills/coding/{full-stack-debug-env → setup-debug}/references/README.md +0 -0
  71. /package/skills/coding/{full-stack-debug-env → setup-debug}/references/tech-stacks/browser-spa.md +0 -0
  72. /package/skills/coding/{full-stack-debug-env → setup-debug}/references/tech-stacks/docker-compose.md +0 -0
  73. /package/skills/coding/{full-stack-debug-env → setup-debug}/references/tech-stacks/electron.md +0 -0
  74. /package/skills/coding/{full-stack-debug-env → setup-debug}/references/tech-stacks/node-process.md +0 -0
  75. /package/skills/design/{style-build → build-style}/references/FORMAT-MAPPING.md +0 -0
  76. /package/skills/design/{brand-scout → scout-brand}/references/TEMPLATE.md +0 -0
  77. /package/skills/design/{sync-design-html → sync-design}/references/stack-electron.md +0 -0
  78. /package/skills/design/{sync-design-html → sync-design}/references/stack-nextjs.md +0 -0
  79. /package/skills/design/{sync-design-html → sync-design}/references/stack-react.md +0 -0
  80. /package/skills/design/{sync-design-html → sync-design}/references/stack-swiftui.md +0 -0
  81. /package/skills/design/{sync-design-html → sync-design}/references/stack-vue.md +0 -0
  82. /package/skills/design/{sync-design-html → sync-design}/references/stacks.md +0 -0
  83. /package/skills/meta/{skill-analyzer → analyze-skill}/CHANGELOG.md +0 -0
  84. /package/skills/meta/{skill-analyzer → analyze-skill}/references/evaluation-template.md +0 -0
  85. /package/skills/meta/{skill-analyzer → analyze-skill}/references/output-template.md +0 -0
  86. /package/skills/meta/{skill-analyzer → analyze-skill}/references/prohibitions.md +0 -0
  87. /package/skills/meta/{project-release → release-project}/references/release-profile-template.md +0 -0
  88. /package/skills/research/{url-extract → extract-url}/platforms/SKILL.claude.md +0 -0
  89. /package/skills/research/{url-extract → extract-url}/platforms/SKILL.codex.md +0 -0
  90. /package/skills/research/{url-extract → extract-url}/platforms/SKILL.hermes.md +0 -0
  91. /package/skills/research/{url-extract → extract-url}/references/article_utils.py +0 -0
  92. /package/skills/research/{url-extract → extract-url}/references/core-flow.md +0 -0
  93. /package/skills/research/{article-fetcher → extract-url}/references/file-format.md +0 -0
  94. /package/skills/research/{url-extract → extract-url}/scripts/dedup_check.py +0 -0
  95. /package/skills/research/{url-extract → extract-url}/scripts/detect_chrome_profile.py +0 -0
  96. /package/skills/research/{article-fetcher → extract-url}/scripts/playwright_web.py +0 -0
  97. /package/skills/research/{url-extract → extract-url}/scripts/playwright_xcom.py +0 -0
  98. /package/skills/research/{article-fetcher → extract-url}/scripts/validate_article.py +0 -0
  99. /package/skills/research/{url-extract → extract-url}/vars.json +0 -0
  100. /package/skills/writing/{diagram → draw-diagram}/references/color-templates.md +0 -0
  101. /package/skills/writing/{diagram → draw-diagram}/references/flowchart.md +0 -0
  102. /package/skills/writing/{diagram → draw-diagram}/references/gantt-timeline.md +0 -0
  103. /package/skills/writing/{diagram → draw-diagram}/references/other-charts.md +0 -0
  104. /package/skills/writing/{diagram → draw-diagram}/references/sequence.md +0 -0
  105. /package/skills/writing/{diagram → draw-diagram}/references/statediagram.md +0 -0
  106. /package/skills/writing/{diagram → draw-diagram}/scripts/check_mermaid.py +0 -0
  107. /package/skills/writing/{diagram → draw-diagram}/tests/bain-style-test.md +0 -0
  108. /package/skills/writing/{diagram → draw-diagram}/themes/bain.json +0 -0
  109. /package/skills/writing/{diagram → draw-diagram}/themes/bcg.json +0 -0
  110. /package/skills/writing/{diagram → draw-diagram}/themes/rb.json +0 -0
  111. /package/skills/writing/{diagram → draw-diagram}/themes/rolandberger.json +0 -0
  112. /package/skills/writing/{doc-forge → forge-doc}/assets/bain-style.json +0 -0
  113. /package/skills/writing/{doc-forge → forge-doc}/assets/bain.css +0 -0
  114. /package/skills/writing/{doc-forge → forge-doc}/assets/bcg-style.json +0 -0
  115. /package/skills/writing/{doc-forge → forge-doc}/assets/bcg.css +0 -0
  116. /package/skills/writing/{doc-forge → forge-doc}/assets/rolandberger-style.json +0 -0
  117. /package/skills/writing/{doc-forge → forge-doc}/assets/rolandberger.css +0 -0
  118. /package/skills/writing/{doc-forge → forge-doc}/assets/template.html +0 -0
  119. /package/skills/writing/{doc-forge → forge-doc}/assets/thesis-style.json +0 -0
  120. /package/skills/writing/{doc-forge → forge-doc}/assets/thesis.css +0 -0
  121. /package/skills/writing/{doc-forge → forge-doc}/preview/style-preview.html +0 -0
  122. /package/skills/writing/{doc-forge → forge-doc}/scripts/generate_style_preview.py +0 -0
  123. /package/skills/writing/{doc-forge → forge-doc}/scripts/md_to_docx.py +0 -0
  124. /package/skills/writing/{doc-forge → forge-doc}/scripts/md_to_pdf.py +0 -0
  125. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-bain.docx +0 -0
  126. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-bain.pdf +0 -0
  127. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-bcg.docx +0 -0
  128. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-bcg.pdf +0 -0
  129. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-custom.docx +0 -0
  130. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-custom.pdf +0 -0
  131. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-rb.docx +0 -0
  132. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-rb.pdf +0 -0
  133. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-thesis.docx +0 -0
  134. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test-thesis.pdf +0 -0
  135. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/full-test.md +0 -0
  136. /package/skills/writing/{doc-forge → forge-doc}/tests/fixtures/sample.png +0 -0
  137. /package/skills/writing/{doc-forge → forge-doc}/tests/test_md_to_pdf.py +0 -0
  138. /package/skills/writing/{dir-manage → manage-dir}/references/built-in/diataxis.md +0 -0
  139. /package/skills/writing/{dir-manage → manage-dir}/references/built-in/role-based.md +0 -0
  140. /package/skills/writing/{dir-manage → manage-dir}/references/methodology-spec.md +0 -0
  141. /package/skills/writing/{diataxis-docs → manage-docs}/references/custom-categories.md +0 -0
  142. /package/skills/writing/{diataxis-docs → manage-docs}/references/index-template.md +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.16.0] - 2026-06-15
11
+
12
+ ### Added
13
+ - `hub git`:新增 CLI 子命令,与 TUI git 面板功能对等
14
+ - `hub git status [--project <name>]`:显示当前分支、upstream 同步状态、工作区变更、最近提交
15
+ - `hub git fetch [--project <name>]`:fetch 所有 remote
16
+ - `hub git branches [--project <name>]`:列出所有分支及 ahead/behind 状态
17
+
18
+ ### Changed
19
+ - `hub`:版本升至 1.1.0
20
+ - `hub`:安装升级机制改为基于源码文件内容哈希(sha256)检测,不再依赖版本号;npm 更新后下次启动自动重装
21
+
22
+ ## [0.15.0] - 2026-06-15
23
+
24
+ ### Added
25
+ - `dedup-skill`:新增 meta skill,扫描并分析各 skill 间的重复内容,生成去重报告
26
+ - `archive-skill`:新增 meta skill,将废弃 skill 移至 `skills/archived/` 并更新 skills-index.json
27
+ - `article-fetcher`:归档(superseded by `url-extract`)
28
+
29
+ ### Changed
30
+ - **Skill 命名规范**:22 个 skill 目录统一重命名为 verb-noun 格式(如 `skill-analyzer` → `analyze-skill`、`doc-forge` → `forge-doc`、`diagram` → `draw-diagram` 等)
31
+ - `hskill update`:自动执行 skill 目录迁移,将旧名称映射到新 verb-noun 名称
32
+
33
+ ### Fixed
34
+ - `archive-skill`:修复 eval 测试发现的 3 个 bug(v1.1.0)
35
+ - `hub-tui`:修复 GitPanel 无法获得焦点的问题(`can_focus=True`)
36
+ - `hub-tui`:Enter 键在 projects-list 焦点时正确触发打开项目
37
+ - `hub-tui`:新增 ←/→ 键切换列,Tab 保留为辅助导航
38
+ - `installer`:`migrateRenamedSkills` 新增输入校验和一致性日志
39
+
10
40
  ## [0.14.2] - 2026-06-15
11
41
 
12
42
  ### Changed
package/bin/cli.js CHANGED
@@ -13,8 +13,8 @@ import {
13
13
  resolveSkills, resolveSkillsByName, resolveTools, resolveToolsByName,
14
14
  TOOL_BUNDLE_CHOICES,
15
15
  } from '../lib/bundles.js'
16
- import { buildTargetChoices, resolveTargets, TARGETS, USER_ONLY_TARGETS } from '../lib/targets.js'
17
- import { installSkills, installTools, installHooks, installHooksForTarget, uninstallHook, uninstallTool, uninstallSkill } from '../lib/installer.js'
16
+ import { buildTargetChoices, resolveTargets, TARGETS, USER_ONLY_TARGETS, SKILL_TARGETS, userSkillDir } from '../lib/targets.js'
17
+ import { installSkills, installTools, installHooks, installHooksForTarget, uninstallHook, uninstallTool, uninstallSkill, migrateRenamedSkills } from '../lib/installer.js'
18
18
 
19
19
  const __dirname = path.dirname(fileURLToPath(import.meta.url))
20
20
  const require = createRequire(import.meta.url)
@@ -154,6 +154,18 @@ if (subcommand === 'update') {
154
154
  console.error(chalk.red(' ✗ Update failed. Try: npm update -g harveyz-skill'))
155
155
  process.exit(1)
156
156
  }
157
+ // Run skill rename migrations
158
+ const { renames = [], skills: skillDefs = [] } = require('../skills-index.json')
159
+ if (renames.length > 0) {
160
+ console.log(chalk.dim(' · Migrating renamed skills…'))
161
+ const targets = SKILL_TARGETS.map(name => ({ name, dir: userSkillDir(name) }))
162
+ const skillsRoot = path.join(__dirname, '..', 'skills')
163
+ const migrationSummary = await migrateRenamedSkills(renames, targets, skillsRoot, skillDefs)
164
+ const totalMigrated = Object.values(migrationSummary).reduce((n, s) => n + s.migrated.length, 0)
165
+ const totalFailed = Object.values(migrationSummary).reduce((n, s) => n + s.failed.length, 0)
166
+ if (totalMigrated > 0) console.log(chalk.green(` ✔ Migrated ${totalMigrated} skill(s)`))
167
+ if (totalFailed > 0) console.log(chalk.yellow(` ⚠ ${totalFailed} migration(s) failed — check output above`))
168
+ }
157
169
  const legacyDir = path.join(os.homedir(), '.local', 'share', 'hskill')
158
170
  if (existsSync(legacyDir)) {
159
171
  console.log('')
package/lib/installer.js CHANGED
@@ -702,3 +702,67 @@ export async function uninstallHook(hookName, scope, projectDir) {
702
702
 
703
703
  return { removed }
704
704
  }
705
+
706
+ /**
707
+ * Migrate renamed skills across all user-level target platforms.
708
+ * Reads renames[] from skills-index.json and removes old dirs, installs new ones.
709
+ *
710
+ * @param {Array<{from: string, to: string}>} renames
711
+ * @param {Array<{name: string, dir: string}>} targets - from resolveTargets()
712
+ * @param {string} skillsRoot - absolute path to the skills/ source directory
713
+ * @param {Array<{path: string, bundle: string}>} skillDefs - skills[] from skills-index.json
714
+ * @returns {Promise<Object>} summary keyed by target name
715
+ */
716
+ export async function migrateRenamedSkills(renames, targets, skillsRoot, skillDefs) {
717
+ // Fix 1: Guard against null/undefined renames
718
+ if (!renames?.length) return {}
719
+
720
+ const summary = {}
721
+
722
+ for (const { name: targetName, dir: targetDir } of targets) {
723
+ // Fix 2: Improved logging when targetDir doesn't exist
724
+ if (!await fs.pathExists(targetDir)) {
725
+ console.error(chalk.dim(` · ${targetName}: skills dir not found, skipping`))
726
+ continue
727
+ }
728
+
729
+ const migrated = []
730
+ const skipped = []
731
+ const failed = []
732
+
733
+ for (const { from: oldName, to: newName } of renames) {
734
+ const oldPath = path.join(targetDir, oldName)
735
+ if (!await fs.pathExists(oldPath)) {
736
+ // Fix 3: Consistent logging for skipped items
737
+ skipped.push({ from: oldName, to: newName, reason: 'not_installed' })
738
+ console.error(chalk.dim(` · ${targetName}: ${oldName} not installed, skipping`))
739
+ continue
740
+ }
741
+
742
+ // Find source for new name
743
+ const skillDef = skillDefs.find(s => s.path.split('/').pop() === newName)
744
+ if (!skillDef) {
745
+ failed.push({ from: oldName, to: newName, reason: 'source_not_found' })
746
+ console.error(chalk.red(` ✗ No source found for ${newName}`))
747
+ continue
748
+ }
749
+
750
+ const srcPath = path.join(skillsRoot, skillDef.path)
751
+ const newPath = path.join(targetDir, newName)
752
+
753
+ try {
754
+ await fs.remove(oldPath)
755
+ await copyDir(srcPath, newPath, {})
756
+ migrated.push({ from: oldName, to: newName })
757
+ console.error(chalk.green(` ✓ ${targetName}: ${oldName} → ${newName}`))
758
+ } catch (err) {
759
+ failed.push({ from: oldName, to: newName, reason: err.message })
760
+ console.error(chalk.red(` ✗ ${targetName}: ${oldName} → ${newName}: ${err.message}`))
761
+ }
762
+ }
763
+
764
+ summary[targetName] = { migrated, skipped, failed }
765
+ }
766
+
767
+ return summary
768
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harveyz-skill",
3
- "version": "0.14.2",
3
+ "version": "0.16.0",
4
4
  "description": "Skill manager for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,30 +16,31 @@
16
16
  "bundles.json",
17
17
  "skills-index.json",
18
18
  "CHANGELOG.md",
19
- "skills/research/article-fetcher/",
20
- "skills/research/url-extract/",
21
- "skills/research/vision-extract/",
22
- "skills/research/youtube-learner/",
23
- "skills/creative/add-todo/",
24
- "skills/creative/insight/",
25
- "skills/coding/git-workflow-init/",
26
- "skills/coding/full-stack-debug-env/",
27
- "skills/coding/pm-task-dispatch/",
28
- "skills/coding/task-close/",
29
- "skills/writing/doc-forge/",
30
- "skills/writing/diagram/",
31
- "skills/writing/diataxis-docs/",
32
- "skills/writing/dir-manage/",
33
- "skills/writing/migrate-specs/",
34
- "skills/design/brand-scout/",
35
- "skills/design/style-build/",
36
- "skills/design/sync-design-html/",
37
- "skills/meta/skill-analyzer/",
38
- "skills/meta/git-cleanup/",
19
+ "skills/research/extract-url/",
20
+ "skills/research/extract-vision/",
21
+ "skills/research/learn-video/",
22
+ "skills/creative/capture-todo/",
23
+ "skills/creative/capture-insight/",
24
+ "skills/coding/init-workflow/",
25
+ "skills/coding/setup-debug/",
26
+ "skills/coding/dispatch-task/",
27
+ "skills/coding/close-task/",
28
+ "skills/writing/forge-doc/",
29
+ "skills/writing/draw-diagram/",
30
+ "skills/writing/manage-docs/",
31
+ "skills/writing/manage-dir/",
32
+ "skills/writing/migrate-spec/",
33
+ "skills/design/scout-brand/",
34
+ "skills/design/build-style/",
35
+ "skills/design/sync-design/",
36
+ "skills/meta/analyze-skill/",
37
+ "skills/meta/clean-git/",
38
+ "skills/meta/archive-skill/",
39
+ "skills/meta/dedup-skill/",
39
40
  "skills/meta/contribute-skill/",
40
- "skills/meta/skill-publish/",
41
- "skills/meta/opencode-runner/",
42
- "skills/meta/project-release/",
41
+ "skills/meta/publish-skill/",
42
+ "skills/meta/runby-opencode/",
43
+ "skills/meta/release-project/",
43
44
  "tools/p-launch/",
44
45
  "tools/todo-tool/",
45
46
  "tools/hub/",
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: task-close
2
+ name: close-task
3
3
  version: "1.0.0"
4
4
  description: "Task wrap-up skill. Self-triggers after an Agent has completed its assigned task — performs task acceptance, summary, document archiving, and lessons-learned recording. Triggers when an Agent has actually finished a task and needs to carry out closing work."
5
5
  user_invocable: true
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: pm-task-dispatch
2
+ name: dispatch-task
3
3
  version: "1.0.0"
4
4
  description: "PM task dispatch skill. Triggers when a new task needs to be created and dispatched to another Agent. Workflow: understand task → clarify requirements → analyze and refine → create task document → dispatch via sessions_send → track feedback. Trigger scenarios: (1) Harvey proposes a new task, (2) asks to dispatch a task to a specific Agent, (3) asks how to dispatch a task."
5
5
  user_invocable: true
@@ -1,13 +1,13 @@
1
1
  ---
2
- name: git-workflow-init
3
- description: "Initialize or update git branch management standards: reads 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."
2
+ name: init-workflow
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
5
  version: "4.1.0"
6
6
  ---
7
7
 
8
8
  # Git 工作流初始化
9
9
 
10
- 读取 `workflow-config.yml`,审核配置,差量部署 git hooks。
10
+ 读取 `.hskill/init-workflow/workflow-config.yml`,审核配置,差量部署 git hooks。
11
11
  重新运行时自动检测配置变更、用户手改冲突、用户代码与新规则的交叉冲突,一次性汇总让用户决策后再写入。
12
12
 
13
13
  ---
@@ -26,16 +26,17 @@ git rev-parse --show-toplevel
26
26
 
27
27
  ### Step 2 — 读取配置
28
28
 
29
- 按以下顺序查找 `workflow-config.yml`:
29
+ 按以下顺序查找配置文件:
30
30
 
31
- 1. 项目根目录 `workflow-config.yml`
32
- 2. 项目根目录 `.claude/workflow-config.yml`
31
+ 1. `.hskill/init-workflow/workflow-config.yml`
32
+ 2. 项目根目录 `workflow-config.yml`(向后兼容)
33
+ 3. 项目根目录 `.claude/workflow-config.yml`(向后兼容)
33
34
 
34
- 若两处均不存在,询问用户:
35
- - 使用默认配置(从此 skill 的 `references/workflow-config.yml` 复制到项目根目录)
35
+ 若均不存在,询问用户:
36
+ - 使用默认配置(从此 skill 的 `references/workflow-config.yml` 复制到 `.hskill/init-workflow/workflow-config.yml`)
36
37
  - 还是中止并自行创建后重新运行
37
38
 
38
- 找到后读取并解析 YAML
39
+ 找到后读取并解析 YAML。若文件来自向后兼容路径(2 或 3),询问用户是否将其移动到 `.hskill/init-workflow/workflow-config.yml`;用户同意则执行移动,否则继续使用原位置(不影响本次运行)。
39
40
 
40
41
  ---
41
42
 
@@ -154,13 +155,13 @@ git config merge.ff false
154
155
 
155
156
  ### Step 7 — 从配置渲染并写入工作流文档(差量)
156
157
 
157
- 每次运行都根据当前 `workflow-config.yml` 的最终状态重新渲染文档,确保文档与配置始终一致。
158
+ 每次运行都根据当前 `.hskill/init-workflow/workflow-config.yml` 的最终状态重新渲染文档,确保文档与配置始终一致。
158
159
 
159
160
  #### 7a. 渲染文档
160
161
 
161
162
  ```bash
162
163
  python3 <skill-path>/references/render_docs.py \
163
- workflow-config.yml \
164
+ .hskill/init-workflow/workflow-config.yml \
164
165
  <skill-path>/references/git-workflow-template.md \
165
166
  docs/reference/git-workflow.md
166
167
  # 输出 NEW / UPDATED / UNCHANGED
@@ -205,7 +206,7 @@ python3 <skill-path>/references/render_docs.py \
205
206
  ```
206
207
  文件 状态
207
208
  ─────────────────────────────────────────────────────
208
- workflow-config.yml 已读取
209
+ .hskill/init-workflow/workflow-config.yml 已读取
209
210
  .githooks/.workflow-config.lock UPDATED(记录新配置快照)
210
211
  .githooks/pre-commit UPDATED(main 块 hash 更新;develop 块新增)
211
212
  .githooks/commit-msg UNCHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: full-stack-debug-env
2
+ name: setup-debug
3
3
  version: "1.0.0"
4
4
  description: Use when setting up a log monitoring environment before running agents or test scenarios on a multi-component application — captures frontend browser console, backend processes, workers, daemons, and other services as independent log files so agents can query each layer precisely
5
5
  user_invocable: true
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: insight
2
+ name: capture-insight
3
3
  version: "1.1.0"
4
4
  user_invocable: true
5
5
  description: "Capture and record a fleeting insight or observation. Triggers immediately when the user expresses an observation, judgment, or idea — phrases like 'I noticed', 'just an observation', 'record this', 'insight', 'I have a judgment', or tossing out an opinionated thought. Distinct from 'I have an idea to execute' (that's a task). Clarifies the core with 2-3 quick Q&As, then saves to the insights/ folder. Trigger early — insights are fragile."
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: add-todo
2
+ name: capture-todo
3
3
  version: "4.5.0"
4
4
  user_invocable: true
5
5
  description: "Add a new requirement, task, or feature request to any project's TODO.md — from any working directory. Triggers whenever the user wants to capture a new need — even phrased casually like 'we should do X later', 'add this to the backlog', 'note this down', 'remember to build X', 'we need to do Y at some point', or 'record this for later'."
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: style-build
2
+ name: build-style
3
3
  description: "Derive format-specific configs from a brand design knowledge doc. Trigger when the user wants to generate doc-forge JSON/CSS, HTML CSS variables, Mermaid color scheme, or PPT theme from a design system. E.g. 'derive configs for BCG', 'generate doc-forge style for rb', 'create HTML theme from custom-style'."
4
4
  user_invocable: true
5
5
  version: "1.4.0"
@@ -9,9 +9,9 @@ version: "1.4.0"
9
9
 
10
10
  读取 `knowledge/design/<brand>-style.md`,推导各输出格式的具体配置。
11
11
 
12
- **只做推导,不调查官网。** 官网调查由 `/brand-scout` 负责。
12
+ **只做推导,不调查官网。** 官网调查由 `/scout-brand` 负责。
13
13
 
14
- **映射标准:** 格式字段 ↔ Token 的完整映射规则定义在 `skills/writing/style-build/references/FORMAT-MAPPING.md`,推导时以该文件为权威依据。品牌文件提供 Token 值,FORMAT-MAPPING.md 提供映射规则,两者分离。
14
+ **映射标准:** 格式字段 ↔ Token 的完整映射规则定义在 `skills/writing/build-style/references/FORMAT-MAPPING.md`,推导时以该文件为权威依据。品牌文件提供 Token 值,FORMAT-MAPPING.md 提供映射规则,两者分离。
15
15
 
16
16
  支持输出格式:
17
17
  - **DOCX** — `doc-forge/<brand>-style.json`
@@ -49,7 +49,7 @@ BRAND="<brand>"
49
49
  KNOWLEDGE_FILE="knowledge/design/${BRAND}-style.md"
50
50
  ```
51
51
 
52
- 用 Read 工具读取 `$KNOWLEDGE_FILE` 和 `skills/writing/style-build/references/FORMAT-MAPPING.md`。
52
+ 用 Read 工具读取 `$KNOWLEDGE_FILE` 和 `skills/writing/build-style/references/FORMAT-MAPPING.md`。
53
53
 
54
54
  **Token 解析方式(三层引用链):**
55
55
 
@@ -148,9 +148,9 @@ H1_doc = 24
148
148
 
149
149
  ### Step 3 — 推导 DOCX 配置(按需)
150
150
 
151
- 生成 `skills/writing/doc-forge/assets/<brand>-style.json`。
151
+ 生成 `skills/writing/forge-doc/assets/<brand>-style.json`。
152
152
 
153
- **映射规则参考 `skills/writing/style-build/references/FORMAT-MAPPING.md`:**
153
+ **映射规则参考 `skills/writing/build-style/references/FORMAT-MAPPING.md`:**
154
154
  - 颜色字段 → 第二节 2.1(DOCX JSON 路径列)
155
155
  - 字体 → 第三节(CJK 始终为 `PingFang SC`,英文取降级栈第一项)
156
156
  - 尺度 → 第四节 4.1/4.2(JSON 路径列)
@@ -198,9 +198,9 @@ H1_doc = 24
198
198
 
199
199
  ### Step 4 — 推导 PDF CSS(按需)
200
200
 
201
- 生成 `skills/writing/doc-forge/assets/<brand>.css`。
201
+ 生成 `skills/writing/forge-doc/assets/<brand>.css`。
202
202
 
203
- **映射规则参考 `skills/writing/style-build/references/FORMAT-MAPPING.md`:**
203
+ **映射规则参考 `skills/writing/build-style/references/FORMAT-MAPPING.md`:**
204
204
  - 颜色属性 → 第二节 2.1(PDF CSS 属性列)
205
205
  - 字体栈 → 第三节(格式:`"官方字体", FONT_STACK`)
206
206
  - 尺度 → 第四节 4.1/4.2(CSS 属性列)
@@ -228,7 +228,7 @@ H1_doc = 24
228
228
 
229
229
  ### Step 5 — 推导 HTML CSS 变量(按需)
230
230
 
231
- **变量名查阅 `skills/writing/style-build/references/FORMAT-MAPPING.md` 第六节(HTML CSS 变量完整列表)。**
231
+ **变量名查阅 `skills/writing/build-style/references/FORMAT-MAPPING.md` 第六节(HTML CSS 变量完整列表)。**
232
232
 
233
233
  按 Step 2 提取的 Semantic Token 值填入,打印完整 `:root { }` 块输出到对话,供用户粘贴使用。
234
234
 
@@ -236,9 +236,9 @@ H1_doc = 24
236
236
 
237
237
  ### Step 6 — 推导 Mermaid 主题并写入配置文件(按需)
238
238
 
239
- **themeVariables 键名查阅 `skills/writing/style-build/references/FORMAT-MAPPING.md` 第七节。**
239
+ **themeVariables 键名查阅 `skills/writing/build-style/references/FORMAT-MAPPING.md` 第七节。**
240
240
 
241
- 写入 `skills/writing/diagram/themes/<brand>.json`,同时在对话中打印可直接嵌入的 `%%{init}%%` 块。
241
+ 写入 `skills/writing/draw-diagram/themes/<brand>.json`,同时在对话中打印可直接嵌入的 `%%{init}%%` 块。
242
242
 
243
243
  主题文件按图类型分区存储,不同图类型使用不同样式机制。
244
244
 
@@ -419,7 +419,7 @@ semantic 的 `text` 字段:fill 深于 `rules.dark_text_threshold` → `#FFFFF
419
419
 
420
420
  ### Step 7 — 推导 PPT 主题(按需)
421
421
 
422
- **色槽对应查阅 `skills/writing/style-build/references/FORMAT-MAPPING.md` 第八节(PPT 色槽完整映射)。**
422
+ **色槽对应查阅 `skills/writing/build-style/references/FORMAT-MAPPING.md` 第八节(PPT 色槽完整映射)。**
423
423
 
424
424
  以文字形式输出 PPT 主题配置(标题幻灯片 + 内容幻灯片 + 主题色板槽位)。
425
425
 
@@ -439,7 +439,7 @@ semantic 的 `text` 字段:fill 深于 `rules.dark_text_threshold` → `#FFFFF
439
439
  > 3. **表格模式** — `border_mode` 是否与设计文档一致?
440
440
  > 4. **Mermaid 深色节点** — subgraph/node 所有 fill 深于 `#4A4A4A` 的是否都有 `color:#fff`?
441
441
  >
442
- > 确认后可运行 `/doc-forge` 生成测试文档,或用 `/diagram` 测试配色效果。
442
+ > 确认后可运行 `/forge-doc` 生成测试文档,或用 `/draw-diagram` 测试配色效果。
443
443
 
444
444
  ---
445
445
 
@@ -1,6 +1,6 @@
1
1
  ---
2
- name: brand-scout
3
- description: "Survey a brand's visual design style from their official website and output a structured design knowledge document. Trigger when the user wants to analyze a company's design style — e.g. 'analyze McKinsey style', 'survey BCG design', 'extract style from URL'. Outputs to knowledge/design/<brand>-style.md only. Use /style-build to generate format-specific configs from the knowledge doc."
2
+ name: scout-brand
3
+ description: "Survey a brand's visual design style from their official website and output a structured design knowledge document. Trigger when the user wants to analyze a company's design style — e.g. 'analyze McKinsey style', 'survey BCG design', 'extract style from URL'. Outputs to knowledge/design/<brand>-style.md only. Use /build-style to generate format-specific configs from the knowledge doc."
4
4
  user_invocable: true
5
5
  version: "2.1.0"
6
6
  ---
@@ -9,11 +9,11 @@ version: "2.1.0"
9
9
 
10
10
  给定一个公司官网 URL,调查其设计风格,输出 `knowledge/design/<brand>-style.md`。
11
11
 
12
- **只做调查,不生成配置。** 配置生成由 `/style-build` 负责。
12
+ **只做调查,不生成配置。** 配置生成由 `/build-style` 负责。
13
13
 
14
14
  调查分**两个阶段**:先全面调查主页(品牌色、导航、CTA 按钮、Hero 区域),再深入报告/文章正文页(排版、表格、引用块、代码块)。两阶段数据合并后写入知识文档。
15
15
 
16
- 输出文档遵循 `skills/writing/brand-scout/references/TEMPLATE.md` 的完整结构,覆盖:色彩体系(三维分类)、字体体系、间距体系、组件规则、视觉层级、图像处理、数据可视化、各格式推导指南。
16
+ 输出文档遵循 `skills/writing/scout-brand/references/TEMPLATE.md` 的完整结构,覆盖:色彩体系(三维分类)、字体体系、间距体系、组件规则、视觉层级、图像处理、数据可视化、各格式推导指南。
17
17
 
18
18
  > **依赖:** 必须先通过 `/browse` skill 完成 browse 初始化。
19
19
 
@@ -329,7 +329,7 @@ $B screenshot /tmp/scout-quote.png --selector "blockquote,[class*=callout],[clas
329
329
 
330
330
  ### Step 13 — 合并两阶段数据,按三层 Token 模型写入知识文档
331
331
 
332
- 综合主页调查(Step 3–6)和报告页调查(Step 8–12)的结果,按 `skills/writing/brand-scout/references/TEMPLATE.md` 的三层 Token 结构填写,写到 `knowledge/design/<brand>-style.md`。
332
+ 综合主页调查(Step 3–6)和报告页调查(Step 8–12)的结果,按 `skills/writing/scout-brand/references/TEMPLATE.md` 的三层 Token 结构填写,写到 `knowledge/design/<brand>-style.md`。
333
333
 
334
334
  **数据来源优先级:**
335
335
 
@@ -373,7 +373,7 @@ $B screenshot /tmp/scout-quote.png --selector "blockquote,[class*=callout],[clas
373
373
  > 3. **2.2 Text** — `[视觉近黑]` 标注是否准确?这些颜色是否确实在截图中接近黑色?
374
374
  > 4. **2.3 Component** — 若有非默认映射(如 blockquote 颜色),是否已修改对应行?
375
375
  >
376
- > 确认后可运行 `/style-build` 生成具体格式配置。
376
+ > 确认后可运行 `/build-style` 生成具体格式配置。
377
377
 
378
378
  ---
379
379
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: sync-design-html
2
+ name: sync-design
3
3
  description: Use after any UI source file change — detects changed view/component files via git diff and syncs them to high-fidelity HTML design backups. Maintains a manifest as the source-of-truth mapping between source files and HTML previews. Also invocable as a post-step from /ship or /review. Trigger when user says "sync design", "update HTML preview", "design changed", or after UI code edits.
4
4
  version: "3.0.0"
5
5
  user_invocable: true
@@ -15,7 +15,7 @@ user_invocable: true
15
15
 
16
16
  ## 步骤 ①:读取 Manifest
17
17
 
18
- 读取 `docs/reference/design-html-manifest.json`。
18
+ 读取 `.hskill/sync-design/manifest.json`。
19
19
 
20
20
  **如果文件不存在:**
21
21
  执行【附录 A:首次初始化流程】,完成后继续步骤 ②。
@@ -182,7 +182,7 @@ git diff <entry.lastSyncCommit 或 manifest.baseBranch(如无 lastSyncCommit
182
182
  **用户选「是」:**
183
183
  1. `git rev-parse HEAD` 获取当前 commit hash
184
184
  2. 将所有已处理 entry 的 `lastSyncCommit` 更新为该 hash
185
- 3. 写回 `docs/reference/design-html-manifest.json`(含配置演进的 patterns 变更)
185
+ 3. 写回 `.hskill/sync-design/manifest.json`(含配置演进的 patterns 变更)
186
186
  4. 询问是否 `git add` 并给出建议 commit message:
187
187
  `chore: sync HTML design backups — <entry id 列表>`
188
188
 
@@ -304,6 +304,12 @@ find src -name "*.scss" -o -name "variables.css" 2>/dev/null | head -3
304
304
 
305
305
  ### A-5. 创建 Manifest
306
306
 
307
+ ```bash
308
+ mkdir -p .hskill/sync-design
309
+ ```
310
+
311
+ 将以下内容写入 `.hskill/sync-design/manifest.json`:
312
+
307
313
  ```json
308
314
  {
309
315
  "version": 3,
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: skill-analyzer
2
+ name: analyze-skill
3
3
  description: "Performs systematic analysis of the skill repository. Triggers: analyze this skill repo, do a systematic study of the skill repo, output skill repo analysis report, understand the design intent of this skill system."
4
4
  user_invocable: true
5
5
  version: "1.0.0"
@@ -0,0 +1,170 @@
1
+ ---
2
+ name: archive-skill
3
+ description: "Archive, retire, deprecate, or sunset a skill from the active registry. Use this skill whenever someone wants to remove a skill from active use — even if they don't use the word 'archive'. Moves it to skills/archived/, removes it from skills-index.json, regenerates packaging config, and commits on a chore branch merged back to the original branch. Triggers: 'archive X skill', 'retire X', 'deprecate X', '归档 skill', '退役 skill', 'remove X from bundle', 'sunset X skill'."
4
+ user_invocable: true
5
+ version: "1.1.0"
6
+ ---
7
+
8
+ # archive-skill
9
+
10
+ 将一个已退役的 skill 从活跃注册表移入 `skills/archived/`,自动完成文件操作、index 更新、打包配置重新生成,并提交到 git。
11
+
12
+ ---
13
+
14
+ ## Step 1 — 匹配 skill
15
+
16
+ 从用户指令中提取 skill 名关键字,读取 `skills-index.json` 获取所有已注册 skill:
17
+
18
+ ```bash
19
+ REPO_ROOT=$(git rev-parse --show-toplevel)
20
+ node -e "
21
+ const idx = JSON.parse(require('fs').readFileSync('${REPO_ROOT}/skills-index.json','utf8'));
22
+ idx.skills.forEach(s => console.log(s.path));
23
+ "
24
+ ```
25
+
26
+ 在 path 末段(`<category>/<name>` 的 `<name>` 部分)中搜索关键字:
27
+
28
+ | 匹配结果 | 行为 |
29
+ |---------|------|
30
+ | 完全匹配 1 个 | 直接进 Step 2 |
31
+ | 部分匹配 1 个 | 展示候选并问用户:"是否归档 `<name>`?(y/n)" — 确认后进 Step 2 |
32
+ | 部分匹配多个 | 列出所有候选,让用户选择编号后进 Step 2 |
33
+ | 0 匹配 | 报错:`未找到匹配的 skill,请检查名称后重试。` 退出 |
34
+
35
+ ---
36
+
37
+ ## Step 2 — 前置检查
38
+
39
+ 在执行任何操作前,检查三个条件,任一不满足则中止:
40
+
41
+ **1. 不在 detached HEAD 状态**
42
+ ```bash
43
+ ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)
44
+ ```
45
+ 若结果为 `HEAD`(detached),提示:
46
+ `当前处于 detached HEAD 状态,无法确定要 merge 回的目标分支。请先切换到一个具名分支后重试。`
47
+ 然后退出。
48
+
49
+ **2. 无未提交变更**
50
+ ```bash
51
+ git status --short
52
+ ```
53
+ 若有未提交修改,提示:`存在未提交的变更,请先 commit 或 stash 后重试。` 退出。
54
+
55
+ **3. 归档目标不冲突**
56
+ ```bash
57
+ ls "${REPO_ROOT}/skills/archived/<name>" 2>/dev/null
58
+ ```
59
+ 若已存在,提示:`skills/archived/<name>/ 已存在,请手动处理后重试。` 退出。
60
+
61
+ ---
62
+
63
+ ## Step 3 — 确认摘要
64
+
65
+ 展示操作预览,**等待用户明确确认后再执行**:
66
+
67
+ ```
68
+ 即将归档 <name>(bundle: <bundle>):
69
+
70
+ 移动:skills/<category>/<name>/ → skills/archived/<name>/
71
+ 从 skills-index.json 移除该条目
72
+ 更新 bundleMeta.<bundle>:去掉描述中的 "<name>"
73
+ 重新生成:package.json files[] 和 .npmignore
74
+ Git:chore/archive-<name> → merge 回 <ORIGINAL_BRANCH>
75
+
76
+ 确认继续?(y/n)
77
+ ```
78
+
79
+ 用户输入 `n` 则中止,不做任何修改。
80
+
81
+ ---
82
+
83
+ ## Step 4 — 创建分支并移动文件
84
+
85
+ ```bash
86
+ git checkout -b chore/archive-<name>
87
+ mkdir -p "${REPO_ROOT}/skills/archived"
88
+ git mv "skills/<category>/<name>" "skills/archived/<name>"
89
+ ```
90
+
91
+ > 若创建分支时看到 check-similar-branch hook 的相似分支警告,可忽略——archive 分支之间相似是正常现象。
92
+
93
+ ---
94
+
95
+ ## Step 5 — 更新 skills-index.json
96
+
97
+ 读取并修改 `skills-index.json`,写回文件:
98
+
99
+ **移除 skills[] 条目:** 删除 `path` 末段为 `<name>` 的对象。
100
+
101
+ **更新 bundleMeta 描述:** 描述格式为 `"研究工具(a + b + c)"`,从中删除 `<name>`:
102
+ - 若在中间:删除 ` + <name>` 或 `<name> + `
103
+ - 若为最后一项:删除 ` + <name>`
104
+ - 若括号内只剩该项:将整个 `(<name>)` 删除,或保留空括号(均可)
105
+ - 若描述中无该 skill 名:跳过,不报错
106
+
107
+ ---
108
+
109
+ ## Step 6 — 重新生成打包配置
110
+
111
+ ```bash
112
+ node scripts/generate-npmignore.js
113
+ ```
114
+
115
+ 若脚本失败,报错并中止,不执行 git 操作,保留已修改的文件供用户检查。
116
+
117
+ ---
118
+
119
+ ## Step 7 — Git commit
120
+
121
+ `git mv` 已自动 stage 了文件移动,只需 add 配置文件的修改:
122
+
123
+ ```bash
124
+ git add skills-index.json package.json .npmignore
125
+ git commit -m "chore: archive <name> skill"
126
+ ```
127
+
128
+ ---
129
+
130
+ ## Step 8 — 合并回原分支
131
+
132
+ ```bash
133
+ git checkout <ORIGINAL_BRANCH>
134
+ git merge --no-ff chore/archive-<name>
135
+ ```
136
+
137
+ 完成后输出摘要:
138
+
139
+ ```
140
+ ✓ <name> 已归档
141
+
142
+ 归档路径:skills/archived/<name>/
143
+ 已从 skills-index.json 移除
144
+ 已更新 package.json + .npmignore
145
+ 已 merge 回 <ORIGINAL_BRANCH>
146
+
147
+ 分支 chore/archive-<name> 可手动删除:
148
+ git branch -d chore/archive-<name>
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 边界情况汇总
154
+
155
+ | 情况 | 处理 |
156
+ |------|------|
157
+ | Detached HEAD | Step 2 中止,提示切换到具名分支 |
158
+ | 有未提交变更 | Step 2 中止,提示 commit 或 stash |
159
+ | `skills/archived/<name>/` 已存在 | Step 2 中止,提示手动处理 |
160
+ | `generate-npmignore.js` 失败 | Step 6 中止,不执行 git 操作 |
161
+ | skill 在磁盘但不在 index | 提示"仅做文件移动",跳过 Step 5 |
162
+ | bundleMeta 描述无该 skill 名 | 跳过描述更新,继续 |
163
+
164
+ ---
165
+
166
+ ## 不在范围内
167
+
168
+ - 批量归档多个 skill
169
+ - 自动删除归档分支
170
+ - 恢复(un-archive)操作