harveyz-skill 0.16.0 → 0.17.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.
- package/CHANGELOG.md +2 -0
- package/bin/cli.js +29 -9
- package/lib/bundles.js +3 -0
- package/package.json +2 -1
- package/skills/research/learn-skill/SKILL.md +91 -0
- package/skills/research/learn-skill/evals/evals.json +44 -0
- package/skills-index.json +31 -39
- package/tools/hub/docs/design-previews/git-textual-tui-design.html +359 -0
- package/tools/hub/docs/design-previews/tasks-textual-tui-design.html +371 -0
- package/tools/hub/hub/cli/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tools/hub/hub/cli/__pycache__/git.cpython-314.pyc +0 -0
- package/tools/hub/hub/cli/git.py +82 -0
- package/tools/hub/hub/tui/__pycache__/app.cpython-314.pyc +0 -0
- package/tools/hub/hub/tui/app.py +126 -3
- package/tools/hub/hub/tui/panels/__pycache__/git.cpython-314.pyc +0 -0
- package/tools/hub/hub/tui/panels/__pycache__/projects.cpython-314.pyc +0 -0
- package/tools/hub/hub/tui/panels/__pycache__/tasks.cpython-314.pyc +0 -0
- package/tools/hub/hub/tui/panels/git.py +213 -67
- package/tools/hub/hub/tui/panels/tasks.py +4 -2
- package/tools/hub/pyproject.toml +1 -1
- package/tools/hub/tests/__pycache__/test_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_cli.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_db.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_migrate.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_projects.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_scan.cpython-314-pytest-9.0.2.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_scan.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tasks.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_app.cpython-314-pytest-9.0.2.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_app.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_git.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_git_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_git_panel.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_projects_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_projects_panel.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_tasks_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/tools/hub/tests/__pycache__/test_tui_tasks_panel.cpython-314-pytest-9.1.0.pyc +0 -0
- package/tools/hub/tests/test_cli.py +107 -0
- package/tools/hub/tests/test_tui_app.py +59 -0
- package/tools/hub/tests/test_tui_git_panel.py +356 -22
package/CHANGELOG.md
CHANGED
package/bin/cli.js
CHANGED
|
@@ -184,7 +184,7 @@ if (subcommand === 'list') {
|
|
|
184
184
|
const sorted = [...skills].sort((a, b) => a.bundle.localeCompare(b.bundle) || a.path.split('/').pop().localeCompare(b.path.split('/').pop()))
|
|
185
185
|
if (jsonFlag) {
|
|
186
186
|
console.log(JSON.stringify({
|
|
187
|
-
skills: sorted.map(s => ({ name: s.path.split('/').pop(), path: s.path, bundle: s.bundle })),
|
|
187
|
+
skills: sorted.map(s => ({ name: s.path.split('/').pop(), path: s.path, bundle: s.bundle, global: s.global ?? false })),
|
|
188
188
|
tools: tools.map(t => t.name),
|
|
189
189
|
}, null, 2))
|
|
190
190
|
process.exit(0)
|
|
@@ -225,7 +225,22 @@ if (subcommand === 'status' || subcommand === 'outdated') {
|
|
|
225
225
|
|
|
226
226
|
function icon(status) {
|
|
227
227
|
if (status === 'up-to-date') return chalk.green('✓')
|
|
228
|
-
if (status === 'update') return chalk.
|
|
228
|
+
if (status === 'update') return chalk.red('↑')
|
|
229
|
+
return chalk.dim('—')
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function userIcon(status, installScope) {
|
|
233
|
+
if (status === 'up-to-date') return chalk.green('✓')
|
|
234
|
+
if (status === 'update') return chalk.red('↑')
|
|
235
|
+
if (installScope === 'essential') return chalk.yellow('»')
|
|
236
|
+
if (installScope === 'global') return chalk.cyan('▸')
|
|
237
|
+
return chalk.dim('—')
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function projectIcon(status, installScope) {
|
|
241
|
+
if (status === 'up-to-date') return chalk.green('✓')
|
|
242
|
+
if (status === 'update') return chalk.red('↑')
|
|
243
|
+
if (installScope === 'project') return chalk.cyan('▸')
|
|
229
244
|
return chalk.dim('—')
|
|
230
245
|
}
|
|
231
246
|
|
|
@@ -233,13 +248,14 @@ if (subcommand === 'status' || subcommand === 'outdated') {
|
|
|
233
248
|
const inst = checkInstalled(s.skillName, s.version ?? '—')
|
|
234
249
|
return {
|
|
235
250
|
name: s.skillName, bundle: s.bundle ?? '—', version: s.version ?? '—',
|
|
251
|
+
installScope: s.installScope ?? null,
|
|
236
252
|
userStatus: scopeSummary(inst.user), projectStatus: scopeSummary(inst.project),
|
|
237
253
|
userDetail: inst.user, projectDetail: inst.project,
|
|
238
254
|
}
|
|
239
255
|
}).sort((a, b) => a.bundle.localeCompare(b.bundle) || a.name.localeCompare(b.name))
|
|
240
256
|
const toolRows = toolItems.map(t => {
|
|
241
257
|
const inst = checkToolInstalled(t.toolName, t.srcPath)
|
|
242
|
-
return { name: t.toolName, version: t.version ?? '—', ...inst }
|
|
258
|
+
return { name: t.toolName, version: t.version ?? '—', installScope: t.installScope ?? null, ...inst }
|
|
243
259
|
})
|
|
244
260
|
|
|
245
261
|
if (jsonFlag) {
|
|
@@ -317,7 +333,8 @@ if (subcommand === 'status' || subcommand === 'outdated') {
|
|
|
317
333
|
console.log(sep)
|
|
318
334
|
console.log(' ' + ''.padEnd(nw + vw + bw + 5) + chalk.dim('user project'))
|
|
319
335
|
for (const r of skillRows) {
|
|
320
|
-
const u =
|
|
336
|
+
const u = userIcon(r.userStatus, r.installScope)
|
|
337
|
+
const p = projectIcon(r.projectStatus, r.installScope)
|
|
321
338
|
console.log(' ' + r.name.padEnd(nw) + ' ' + chalk.dim(r.version.padEnd(vw)) + ' ' + chalk.dim(r.bundle.padEnd(bw)) + ' ' + u + ' ' + p)
|
|
322
339
|
}
|
|
323
340
|
|
|
@@ -325,7 +342,7 @@ if (subcommand === 'status' || subcommand === 'outdated') {
|
|
|
325
342
|
console.log(' ' + chalk.bold('TOOLS') + chalk.dim(` — ${toolRows.length} available`))
|
|
326
343
|
console.log(sep)
|
|
327
344
|
for (const r of toolRows) {
|
|
328
|
-
console.log(' ' + r.name.padEnd(nw) + ' ' + chalk.dim(r.version.padEnd(vw)) + ' ' +
|
|
345
|
+
console.log(' ' + r.name.padEnd(nw) + ' ' + chalk.dim(r.version.padEnd(vw)) + ' ' + userIcon(r.status, r.installScope))
|
|
329
346
|
}
|
|
330
347
|
|
|
331
348
|
// ── hooks ──
|
|
@@ -333,15 +350,17 @@ if (subcommand === 'status' || subcommand === 'outdated') {
|
|
|
333
350
|
console.log('')
|
|
334
351
|
console.log(' ' + chalk.bold('HOOKS') + chalk.dim(` — ${hookItems.length} available`))
|
|
335
352
|
console.log(sep)
|
|
336
|
-
function hIcon(s) {
|
|
337
|
-
if (s === 'installed')
|
|
338
|
-
if (s === 'partial')
|
|
353
|
+
function hIcon(s, installScope) {
|
|
354
|
+
if (s === 'installed') return chalk.green('✓')
|
|
355
|
+
if (s === 'partial') return chalk.yellow('~')
|
|
356
|
+
if (installScope === 'essential') return chalk.yellow('»')
|
|
357
|
+
if (installScope === 'global') return chalk.cyan('›')
|
|
339
358
|
return chalk.dim('—')
|
|
340
359
|
}
|
|
341
360
|
for (const h of hookItems) {
|
|
342
361
|
const inst = checkHookInstalled(h.name)
|
|
343
362
|
const ver = resolveHookDisplayVersion(inst, h.version)
|
|
344
|
-
console.log(' ' + h.name.padEnd(nw) + ' ' + chalk.dim(ver.padEnd(vw)) + ' ' + hIcon(inst.user.status) + ' ' + hIcon(inst.project.status) + ' ' + chalk.dim(h.description))
|
|
363
|
+
console.log(' ' + h.name.padEnd(nw) + ' ' + chalk.dim(ver.padEnd(vw)) + ' ' + hIcon(inst.user.status, h.installScope) + ' ' + hIcon(inst.project.status, h.installScope) + ' ' + chalk.dim(h.description))
|
|
345
364
|
}
|
|
346
365
|
}
|
|
347
366
|
|
|
@@ -352,6 +371,7 @@ if (subcommand === 'status' || subcommand === 'outdated') {
|
|
|
352
371
|
const outdatedNote = outdatedCount ? ' · ' + chalk.yellow(outdatedCount + ' outdated') : ''
|
|
353
372
|
console.log('')
|
|
354
373
|
console.log(chalk.dim(` ${installedSkills} of ${skillRows.length} skills installed · ${installedTools} of ${toolRows.length} tools installed${outdatedNote}`))
|
|
374
|
+
console.log(chalk.dim(` ${chalk.green('✓')} installed ${chalk.red('↑')} update ${chalk.yellow('»')} essential ${chalk.cyan('▸')} global/project — other`))
|
|
355
375
|
console.log('')
|
|
356
376
|
process.exit(0)
|
|
357
377
|
}
|
package/lib/bundles.js
CHANGED
|
@@ -109,6 +109,7 @@ export function getAllSkillItems() {
|
|
|
109
109
|
kind: 'skill',
|
|
110
110
|
skillName: skill.path.split('/').pop(),
|
|
111
111
|
bundle: skill.bundle,
|
|
112
|
+
installScope: skill.installScope ?? null,
|
|
112
113
|
srcPath,
|
|
113
114
|
version: readVersion(srcPath),
|
|
114
115
|
}
|
|
@@ -122,6 +123,7 @@ export function getAllToolItems() {
|
|
|
122
123
|
return {
|
|
123
124
|
kind: 'tool',
|
|
124
125
|
toolName: tool.name,
|
|
126
|
+
installScope: tool.installScope ?? null,
|
|
125
127
|
srcPath,
|
|
126
128
|
version: readToolMeta(path.join(srcPath, 'tool.json')),
|
|
127
129
|
}
|
|
@@ -184,6 +186,7 @@ export function getAllHookItems() {
|
|
|
184
186
|
const srcPath = path.join(repoRoot, hook.path, `${hook.name}.sh`)
|
|
185
187
|
return {
|
|
186
188
|
...hook,
|
|
189
|
+
installScope: hook.installScope ?? null,
|
|
187
190
|
srcPath,
|
|
188
191
|
version: readHookVersion(srcPath),
|
|
189
192
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harveyz-skill",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Skill manager for Claude Code, Cursor, and Codex",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"bundles.json",
|
|
17
17
|
"skills-index.json",
|
|
18
18
|
"CHANGELOG.md",
|
|
19
|
+
"skills/research/learn-skill/",
|
|
19
20
|
"skills/research/extract-url/",
|
|
20
21
|
"skills/research/extract-vision/",
|
|
21
22
|
"skills/research/learn-video/",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: learn-skill
|
|
3
|
+
description: "Deep-reads a single skill's SKILL.md to help you understand its internal logic. Analyzes across four dimensions: Design Philosophy (why it was designed this way), Execution Flow (how it runs), Standards (what conventions it follows), and Editing Conditions (when to modify it). Use when you want to understand a skill's design intent, how a skill works, its workflow, or the reasoning behind its design. Trigger phrases: 'help me understand this skill', 'how does this skill work', 'explain this skill', 'what is this skill doing', 'walk me through this skill', 'what's the design philosophy of this skill'."
|
|
4
|
+
user_invocable: true
|
|
5
|
+
version: "1.4.0"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# inspect-skill
|
|
9
|
+
|
|
10
|
+
深度解读单个 skill 的 SKILL.md,帮助用户理解它的设计意图、运作方式、规范约定和维护逻辑。输出的是解读,不是评审。
|
|
11
|
+
|
|
12
|
+
如果用户的 prompt 含有评估意图(「有什么问题」、「可以发布了吗」、「quality report」等),不要顺着评估——这个 skill 的定位是帮用户理解 skill,不是审查它。完成解读后,在结尾询问用户是否需要另外做评审。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Step 1 — 定位目标 skill
|
|
17
|
+
|
|
18
|
+
从上下文判断要分析哪个 skill:
|
|
19
|
+
|
|
20
|
+
1. **直接路径**:用户提供了路径(如 `skills/meta/analyze-skill/`)→ 直接使用
|
|
21
|
+
2. **名称推断**:用户提到了 skill 名称 → 在 `~/.claude/skills/` 和当前 repo 的 `skills/` 目录中搜索
|
|
22
|
+
3. **当前上下文**:对话中刚刚在讨论某个 skill → 直接分析该 skill
|
|
23
|
+
4. **不明确**:列出候选,请用户选择
|
|
24
|
+
|
|
25
|
+
读取目标 `SKILL.md`。若存在 `references/` 子目录,读取其中每个不超过 200 行的文件(逐个判断,不合并计算)。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Step 2 — 四维解读
|
|
30
|
+
|
|
31
|
+
从以下四个维度解读 skill。每个维度的目标是让读者理解,而不是评判好坏。具体引用 skill 中的实际段落或步骤来说明,不要泛泛而谈。
|
|
32
|
+
|
|
33
|
+
### 维度 1:设计哲学(Design Philosophy)
|
|
34
|
+
|
|
35
|
+
解释这个 skill 背后的设计意图和取舍逻辑。大多数 SKILL.md 不会直接写「我的设计哲学是…」,需要从它做了什么、省略了什么、在哪里明确约束而在哪里信任模型来推断:
|
|
36
|
+
|
|
37
|
+
- 这个 skill 做了哪些有意识的取舍?为什么选择这种方式而不是另一种?
|
|
38
|
+
- 它在哪些地方信任模型自己判断,在哪些地方选择了明确约束?
|
|
39
|
+
- 它的「lean」体现在哪里——哪些东西被刻意省略了?
|
|
40
|
+
- 如果有一个核心设计原则贯穿整个 skill,那是什么?
|
|
41
|
+
|
|
42
|
+
### 维度 2:流程执行(Execution Flow)
|
|
43
|
+
|
|
44
|
+
解释这个 skill 实际上是怎么跑的:
|
|
45
|
+
|
|
46
|
+
- 它的入口在哪里?什么触发条件会启动它?
|
|
47
|
+
- 执行路径是什么?主流程的步骤顺序是什么?
|
|
48
|
+
- 有哪些分支或条件判断?不同情况下走哪条路?
|
|
49
|
+
- 它在什么时候「结束」?输出或退出条件是什么?
|
|
50
|
+
- 步骤之间有哪些依赖关系——前一步的产物被后一步怎么用?
|
|
51
|
+
|
|
52
|
+
### 维度 3:规范标准(Standards)
|
|
53
|
+
|
|
54
|
+
解释这个 skill 遵循了哪些约定和规范:
|
|
55
|
+
|
|
56
|
+
- Frontmatter 字段的设置方式(name、description、version 各写了什么、为什么这样写)
|
|
57
|
+
- Description 的触发策略(覆盖了哪些使用场景,用了什么语言)
|
|
58
|
+
- 篇幅和结构的组织方式(是否使用了 bundled resources,如何分层)
|
|
59
|
+
- 输出格式的约定(期望产出什么,格式如何定义)
|
|
60
|
+
- 写作风格的选择(祈使句、中英文混用、注释方式等)
|
|
61
|
+
|
|
62
|
+
### 维度 4:编辑条件(Editing Conditions)
|
|
63
|
+
|
|
64
|
+
解释在什么情况下应该修改这个 skill:
|
|
65
|
+
|
|
66
|
+
- 哪些外部变化会让这个 skill 失效或过时?(依赖的工具、路径、API 变了怎么办)
|
|
67
|
+
- 哪些使用场景目前没有被覆盖——如果用户遇到这些情况,skill 会怎么处理?
|
|
68
|
+
- skill 里有没有硬编码的内容?它们在什么条件下需要更新?
|
|
69
|
+
- 如果要扩展这个 skill 的能力,最自然的切入点在哪里?
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Step 3 — 完整性自查(输出前)
|
|
74
|
+
|
|
75
|
+
分析完成后,**先不要输出报告**,对照原始 SKILL.md 检查一遍:
|
|
76
|
+
|
|
77
|
+
- **遗漏**:skill 里的关键步骤、分支、约定,分析里有没有覆盖?
|
|
78
|
+
- **准确性**:描述是否和原文一致,有没有误读?
|
|
79
|
+
- **心理模型**:读完报告的人,能不能不翻原文就理解这个 skill 是怎么工作的?
|
|
80
|
+
|
|
81
|
+
发现问题就补进分析,然后进入 Step 4 输出。
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Step 4 — 输出解读报告
|
|
86
|
+
|
|
87
|
+
**语言:全部中文。** 保留英文的只有:维度标题括号内的英文名、代码/命令/字段名。
|
|
88
|
+
|
|
89
|
+
报告覆盖四个维度,顺序和格式灵活,不要加评分、verdict,或建议修改的段落。
|
|
90
|
+
|
|
91
|
+
报告结尾询问用户:「还有哪个部分想深入了解?」
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "inspect-skill",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "帮我分析一下 contribute-skill 这个 skill,它有什么问题,有没有什么需要改进的地方?目录在 /Users/harveyzhang96/Projects/harveyz-skill/skills/meta/contribute-skill/",
|
|
7
|
+
"expected_output": "中文解读报告,以设计哲学为第一个维度,涵盖四维,不含额外评估段落,结尾以收尾问句收口。",
|
|
8
|
+
"files": ["/Users/harveyzhang96/Projects/harveyz-skill/skills/meta/contribute-skill/SKILL.md"],
|
|
9
|
+
"assertions": [
|
|
10
|
+
"报告包含四个维度,且设计哲学(Design Philosophy)是第一个出现的维度标题",
|
|
11
|
+
"报告不包含评分标签(Excellent / Good / Needs Work / Poor 或数字评分)",
|
|
12
|
+
"报告不包含额外评估段落(如 '## 问题与改进建议'、'## 发布评估'、'## 改进建议'、'## 总体结论' 等评审性标题)",
|
|
13
|
+
"报告主体叙述使用中文",
|
|
14
|
+
"报告结尾包含收尾问句(询问用户是否想深入了解某部分),而不是以改进建议或评审内容结束"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "can you inspect the analyze-skill skill and give me a quality report? path is /Users/harveyzhang96/Projects/harveyz-skill/skills/meta/analyze-skill/SKILL.md",
|
|
20
|
+
"expected_output": "中文解读报告,以设计哲学为第一个维度,涵盖四维,不含额外评估段落,结尾以收尾问句收口。",
|
|
21
|
+
"files": ["/Users/harveyzhang96/Projects/harveyz-skill/skills/meta/analyze-skill/SKILL.md"],
|
|
22
|
+
"assertions": [
|
|
23
|
+
"报告包含四个维度,且设计哲学(Design Philosophy)是第一个出现的维度标题",
|
|
24
|
+
"报告不包含评分标签(Excellent / Good / Needs Work / Poor 或数字评分)",
|
|
25
|
+
"报告不包含额外评估段落(如 '## 问题与改进建议'、'## 发布评估'、'## 改进建议'、'## 总体结论' 等评审性标题)",
|
|
26
|
+
"报告主体叙述使用中文",
|
|
27
|
+
"报告结尾包含收尾问句(询问用户是否想深入了解某部分),而不是以改进建议或评审内容结束"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "这个 clean-git skill 可以发布了吗?帮我做个全面的 skill 质量审查。路径:/Users/harveyzhang96/Projects/harveyz-skill/skills/meta/clean-git/SKILL.md",
|
|
33
|
+
"expected_output": "中文解读报告,以设计哲学为第一个维度,涵盖四维,不含额外评估段落,结尾以收尾问句收口。",
|
|
34
|
+
"files": ["/Users/harveyzhang96/Projects/harveyz-skill/skills/meta/clean-git/SKILL.md"],
|
|
35
|
+
"assertions": [
|
|
36
|
+
"报告包含四个维度,且设计哲学(Design Philosophy)是第一个出现的维度标题",
|
|
37
|
+
"报告不包含评分标签(Excellent / Good / Needs Work / Poor 或数字评分)",
|
|
38
|
+
"报告不包含额外评估段落(如 '## 问题与改进建议'、'## 发布评估'、'## 改进建议'、'## 总体结论' 等评审性标题)",
|
|
39
|
+
"报告主体叙述使用中文",
|
|
40
|
+
"报告结尾包含收尾问句(询问用户是否想深入了解某部分),而不是以改进建议或评审内容结束"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
package/skills-index.json
CHANGED
|
@@ -4,22 +4,12 @@
|
|
|
4
4
|
"tools": "开发者 OS 工具(hub — 项目管理 + git 状态 + 任务跟踪)"
|
|
5
5
|
},
|
|
6
6
|
"tools": [
|
|
7
|
-
{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"name": "todo-tool",
|
|
13
|
-
"bundle": "shell-tools"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"name": "hub",
|
|
17
|
-
"path": "tools/hub",
|
|
18
|
-
"bundle": "tools"
|
|
19
|
-
}
|
|
7
|
+
{ "name": "p-launch", "bundle": "shell-tools", "installScope": "global" },
|
|
8
|
+
{ "name": "todo-tool", "bundle": "shell-tools", "installScope": "global" },
|
|
9
|
+
{ "name": "hub", "path": "tools/hub", "bundle": "tools", "installScope": "essential" }
|
|
20
10
|
],
|
|
21
11
|
"bundleMeta": {
|
|
22
|
-
"research": "研究工具(extract-url + learn-video + extract-vision)",
|
|
12
|
+
"research": "研究工具(extract-url + learn-video + extract-vision + learn-skill)",
|
|
23
13
|
"creative": "创意工具(capture-todo + capture-insight)",
|
|
24
14
|
"coding": "程序工具(init-workflow + setup-debug + dispatch-task + close-task)",
|
|
25
15
|
"writing": "写作工具(forge-doc + draw-diagram + manage-docs + manage-dir + migrate-spec)",
|
|
@@ -27,36 +17,38 @@
|
|
|
27
17
|
"meta": "元操作工具(analyze-skill + clean-git + archive-skill + dedup-skill + contribute-skill + publish-skill + release-project + runby-opencode)"
|
|
28
18
|
},
|
|
29
19
|
"skills": [
|
|
30
|
-
{ "path": "research/
|
|
31
|
-
{ "path": "research/extract-
|
|
32
|
-
{ "path": "research/
|
|
33
|
-
{ "path": "
|
|
34
|
-
{ "path": "creative/capture-
|
|
35
|
-
{ "path": "
|
|
36
|
-
{ "path": "coding/
|
|
37
|
-
{ "path": "coding/
|
|
38
|
-
{ "path": "coding/
|
|
39
|
-
{ "path": "
|
|
40
|
-
{ "path": "writing/
|
|
41
|
-
{ "path": "writing/
|
|
42
|
-
{ "path": "writing/manage-
|
|
43
|
-
{ "path": "writing/
|
|
44
|
-
{ "path": "
|
|
45
|
-
{ "path": "design/
|
|
46
|
-
{ "path": "design/
|
|
47
|
-
{ "path": "
|
|
48
|
-
{ "path": "meta/
|
|
49
|
-
{ "path": "meta/
|
|
50
|
-
{ "path": "meta/
|
|
51
|
-
{ "path": "meta/
|
|
52
|
-
{ "path": "meta/
|
|
53
|
-
{ "path": "meta/
|
|
54
|
-
{ "path": "meta/
|
|
20
|
+
{ "path": "research/learn-skill", "bundle": "research", "installScope": "global" },
|
|
21
|
+
{ "path": "research/extract-url", "bundle": "research", "installScope": "global" },
|
|
22
|
+
{ "path": "research/extract-vision", "bundle": "research", "installScope": "global" },
|
|
23
|
+
{ "path": "research/learn-video", "bundle": "research", "installScope": "global" },
|
|
24
|
+
{ "path": "creative/capture-todo", "bundle": "creative", "installScope": "essential" },
|
|
25
|
+
{ "path": "creative/capture-insight","bundle": "creative", "installScope": "essential" },
|
|
26
|
+
{ "path": "coding/init-workflow", "bundle": "coding", "installScope": "essential" },
|
|
27
|
+
{ "path": "coding/setup-debug", "bundle": "coding", "installScope": "project" },
|
|
28
|
+
{ "path": "coding/dispatch-task", "bundle": "coding", "installScope": "global" },
|
|
29
|
+
{ "path": "coding/close-task", "bundle": "coding", "installScope": "global" },
|
|
30
|
+
{ "path": "writing/forge-doc", "bundle": "writing", "installScope": "global" },
|
|
31
|
+
{ "path": "writing/draw-diagram", "bundle": "writing", "installScope": "global" },
|
|
32
|
+
{ "path": "writing/manage-docs", "bundle": "writing", "installScope": "project" },
|
|
33
|
+
{ "path": "writing/manage-dir", "bundle": "writing", "installScope": "project" },
|
|
34
|
+
{ "path": "writing/migrate-spec", "bundle": "writing", "installScope": "project" },
|
|
35
|
+
{ "path": "design/scout-brand", "bundle": "design", "installScope": "project" },
|
|
36
|
+
{ "path": "design/build-style", "bundle": "design", "installScope": "project" },
|
|
37
|
+
{ "path": "design/sync-design", "bundle": "design", "installScope": "project" },
|
|
38
|
+
{ "path": "meta/analyze-skill", "bundle": "meta" },
|
|
39
|
+
{ "path": "meta/clean-git", "bundle": "meta", "installScope": "essential" },
|
|
40
|
+
{ "path": "meta/archive-skill", "bundle": "meta" },
|
|
41
|
+
{ "path": "meta/dedup-skill", "bundle": "meta" },
|
|
42
|
+
{ "path": "meta/contribute-skill", "bundle": "meta" },
|
|
43
|
+
{ "path": "meta/publish-skill", "bundle": "meta" },
|
|
44
|
+
{ "path": "meta/runby-opencode", "bundle": "meta" },
|
|
45
|
+
{ "path": "meta/release-project", "bundle": "meta", "installScope": "essential" }
|
|
55
46
|
],
|
|
56
47
|
"hooks": [
|
|
57
48
|
{
|
|
58
49
|
"name": "check-similar-branch",
|
|
59
50
|
"description": "用 LLM 语义分析检测相似分支",
|
|
51
|
+
"installScope": "essential",
|
|
60
52
|
"path": "hooks/check-similar-branch",
|
|
61
53
|
"event": "PreToolUse",
|
|
62
54
|
"matcher": "Bash",
|