harveyz-skill 0.3.0 → 0.4.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 (3) hide show
  1. package/README.md +18 -29
  2. package/bin/cli.js +75 -16
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -4,7 +4,7 @@ Harvey 的个人 Claude Code 技能仓库。
4
4
 
5
5
  ## 技能清单
6
6
 
7
- 按 bundle 分组,`npx harveyz-skill --bundle <bundle>` 安装对应分组。
7
+ 按 bundle 分组,`hskill install --bundle <bundle>` 安装对应分组。
8
8
 
9
9
  ### analysis — 分析工具
10
10
 
@@ -63,7 +63,7 @@ Harvey 的个人 Claude Code 技能仓库。
63
63
 
64
64
  ## 工具清单
65
65
 
66
- Shell 工具,通过 `npx harveyz-skill --bundle shell-tools` 安装。
66
+ Shell 工具,通过 `hskill install --tool p-launch` 安装。
67
67
 
68
68
  | 工具 | 说明 |
69
69
  |------|------|
@@ -74,50 +74,39 @@ Shell 工具,通过 `npx harveyz-skill --bundle shell-tools` 安装。
74
74
 
75
75
  ## 安装
76
76
 
77
- ### 推荐:npx 一键安装
78
-
79
77
  ```bash
80
- npx harveyz-skill
78
+ npm install -g harveyz-skill
81
79
  ```
82
80
 
83
- 交互式选择 bundle 和目标工具(Claude Code / Cursor / Codex)。
81
+ 安装后使用 `hskill` 命令管理 skills。
84
82
 
85
- **无交互模式:**
86
- ```bash
87
- npx harveyz-skill --bundle brainstorming --target claude
88
- npx harveyz-skill --bundle brainstorming,dev --target all
89
- ```
83
+ ### 常用命令
90
84
 
91
- **查看可用 bundle:**
92
85
  ```bash
93
- npx harveyz-skill list
86
+ hskill # 交互式选择安装
87
+ hskill install --bundle dev --target claude # 安装指定 bundle
88
+ hskill install --skill git-workflow-init # 安装指定 skill
89
+ hskill install --tool p-launch # 安装 shell 工具
90
+ hskill list # 查看可用 skill
91
+ hskill update # 更新到最新版
92
+ hskill --help # 查看帮助
94
93
  ```
95
94
 
96
- ### 本地源码安装
95
+ Skills 安装到 `~/.claude/skills/`,shell 工具安装到 `~/.local/bin/`。
97
96
 
98
- 克隆仓库后,用 CLI 安装:
97
+ ### 本地源码开发
99
98
 
100
99
  ```bash
101
- # 交互式选择 bundle 和目标工具
102
- node bin/cli.js
103
-
104
100
  # 安装指定 skill
105
- node bin/cli.js --skill mermaid-diagram --target claude
106
- node bin/cli.js --skill brainstorming,writing-plans --target claude
107
-
108
- # 安装整个 skill bundle
109
- node bin/cli.js --bundle dev --target claude
101
+ node bin/cli.js install --skill mermaid-diagram --target claude
110
102
 
111
- # 安装指定 shell 工具(固定安装到 ~/.local/bin)
112
- node bin/cli.js --tool p-launch
103
+ # 安装整个 bundle
104
+ node bin/cli.js install --bundle dev --target claude
113
105
 
114
106
  # 覆盖已有安装
115
- node bin/cli.js --skill mermaid-diagram --target claude --force
116
- node bin/cli.js --tool p-launch --force
107
+ node bin/cli.js install --skill mermaid-diagram --target claude --force
117
108
  ```
118
109
 
119
- Skills 安装到 `~/.claude/skills/`,shell 工具安装到 `~/.local/bin/`。
120
-
121
110
  ## Skill 开发指南
122
111
 
123
112
  ### 命名规范
package/bin/cli.js CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { checkbox } from '@inquirer/prompts'
3
3
  import chalk from 'chalk'
4
+ import { execSync } from 'child_process'
5
+ import { createRequire } from 'module'
4
6
  import {
5
7
  buildAllChoices, getAllSkillItems, getAllToolItems,
6
8
  resolveSkills, resolveSkillsByName, resolveTools, resolveToolsByName,
@@ -9,21 +11,64 @@ import {
9
11
  import { TARGET_CHOICES, resolveTargets, TARGETS } from '../lib/targets.js'
10
12
  import { installSkills, installTools } from '../lib/installer.js'
11
13
 
14
+ const require = createRequire(import.meta.url)
15
+ const { version } = require('../package.json')
16
+
12
17
  const args = process.argv.slice(2)
13
- const forceFlag = args.includes('--force')
14
- const bundleIdx = args.indexOf('--bundle')
15
- const targetIdx = args.indexOf('--target')
16
- const toolIdx = args.indexOf('--tool')
17
- const skillIdx = args.indexOf('--skill')
18
- const bundleArg = bundleIdx !== -1 ? args[bundleIdx + 1] : undefined
19
- const targetArg = targetIdx !== -1 ? args[targetIdx + 1] : undefined
20
- const toolArg = toolIdx !== -1 ? args[toolIdx + 1] : undefined
21
- const skillArg = skillIdx !== -1 ? args[skillIdx + 1] : undefined
22
-
23
- if (args[0] === 'list') {
24
- const { createRequire } = await import('module')
25
- const require = createRequire(import.meta.url)
26
- const { bundleMeta, skills, toolBundleMeta = {}, tools = [] } = require('../skills-index.json')
18
+ const subcommand = args[0]
19
+
20
+ // ── Help ─────────────────────────────────────────────────────────────────────
21
+ function printHelp() {
22
+ console.log(`
23
+ ${chalk.bold('hskill')} skill manager for Claude Code, Cursor, and Codex v${version}
24
+
25
+ ${chalk.cyan('Usage:')}
26
+ hskill interactive install
27
+ hskill install interactive install (explicit)
28
+ hskill install --bundle <b> install a skill bundle
29
+ hskill install --skill <s> install specific skill(s)
30
+ hskill install --tool <t> install shell tool(s)
31
+ hskill install --target <t> set target (claude/cursor/codex/all)
32
+ hskill install --force overwrite existing installs
33
+ hskill list list available skills and bundles
34
+ hskill update update hskill to the latest version
35
+ hskill --version show version
36
+ hskill --help show this help
37
+
38
+ ${chalk.cyan('Examples:')}
39
+ hskill install --bundle dev --target claude
40
+ hskill install --skill git-workflow-init,mermaid-diagram --target claude
41
+ hskill install --tool p-launch
42
+ hskill update
43
+ `)
44
+ }
45
+
46
+ if (args[0] === '--help' || args[0] === '-h') {
47
+ printHelp()
48
+ process.exit(0)
49
+ }
50
+
51
+ if (args[0] === '--version' || args[0] === '-v') {
52
+ console.log(version)
53
+ process.exit(0)
54
+ }
55
+
56
+ // ── Update ───────────────────────────────────────────────────────────────────
57
+ if (subcommand === 'update') {
58
+ console.log(chalk.dim(' · Updating hskill…'))
59
+ try {
60
+ execSync('npm update -g harveyz-skill', { stdio: 'inherit' })
61
+ console.log(chalk.green(' ✔ hskill updated'))
62
+ } catch {
63
+ console.error(chalk.red(' ✗ Update failed. Try: npm update -g harveyz-skill'))
64
+ process.exit(1)
65
+ }
66
+ process.exit(0)
67
+ }
68
+
69
+ // ── List ─────────────────────────────────────────────────────────────────────
70
+ if (subcommand === 'list') {
71
+ const { bundleMeta, skills, tools = [] } = require('../skills-index.json')
27
72
  const byBundle = {}
28
73
  for (const s of skills) {
29
74
  if (!byBundle[s.bundle]) byBundle[s.bundle] = []
@@ -41,6 +86,20 @@ if (args[0] === 'list') {
41
86
  process.exit(0)
42
87
  }
43
88
 
89
+ // ── Install ───────────────────────────────────────────────────────────────────
90
+ // subcommand is 'install' or omitted (default behavior)
91
+ const installArgs = subcommand === 'install' ? args.slice(1) : args
92
+
93
+ const forceFlag = installArgs.includes('--force')
94
+ const bundleIdx = installArgs.indexOf('--bundle')
95
+ const targetIdx = installArgs.indexOf('--target')
96
+ const toolIdx = installArgs.indexOf('--tool')
97
+ const skillIdx = installArgs.indexOf('--skill')
98
+ const bundleArg = bundleIdx !== -1 ? installArgs[bundleIdx + 1] : undefined
99
+ const targetArg = targetIdx !== -1 ? installArgs[targetIdx + 1] : undefined
100
+ const toolArg = toolIdx !== -1 ? installArgs[toolIdx + 1] : undefined
101
+ const skillArg = skillIdx !== -1 ? installArgs[skillIdx + 1] : undefined
102
+
44
103
  const TOOL_BUNDLE_VALUES = new Set(TOOL_BUNDLE_CHOICES.map(c => c.value))
45
104
 
46
105
  function buildInteractiveChoices() {
@@ -103,7 +162,7 @@ try {
103
162
  process.exit(0)
104
163
  }
105
164
 
106
- // ── Install skills ───────────────────────────────────────────────────────────
165
+ // ── Install skills ──────────────────────────────────────────────────────────
107
166
  if (skillItems.length > 0) {
108
167
  let selectedTargets
109
168
  if (targetArg) {
@@ -134,7 +193,7 @@ try {
134
193
  }
135
194
  }
136
195
 
137
- // ── Install shell tools ──────────────────────────────────────────────────────
196
+ // ── Install shell tools ─────────────────────────────────────────────────────
138
197
  if (toolItems.length > 0) {
139
198
  console.log('')
140
199
  const installed = await installTools(
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "harveyz-skill",
3
- "version": "0.3.0",
4
- "description": "One-click skill installer for Claude Code, Cursor, and Codex",
3
+ "version": "0.4.0",
4
+ "description": "Skill manager for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {
7
- "harveyz-skill": "bin/cli.js"
7
+ "hskill": "bin/cli.js"
8
8
  },
9
9
  "scripts": {
10
10
  "prepack": "node scripts/generate-npmignore.js"