Skill creator
Skill jihonghe68/skill-workshop/plugins/skill-workshop/skills/skill-creator
Quality toolchain for Claude Code Skills — stdlib-only linter, ▎ six-dimension audit framework, and save-triggered validation hook
npx -y skills add jihonghe68/skill-workshop --skill skill-creatorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Guided workflow for creating new Claude Code Skills. Works in any project, with or without a launcher.html / clients/ directory. Triggers on: 新建skill, 创建skill, create skill, add skill, 创建技能, 新技能, build a new skill, 做一个新skill, 新增skill, skill创建. Always read this file completely before starting — do not improvise the creation process.
SKILL.md
16.0 KB, as published. Nobody here has run it
Skill Creator — 新 Skill 创建引导
本文件是创建新 Skill 的操作规程。每次新建 Skill 时必须完整执行以下 6 个步骤,禁止跳过任何步骤。
⚠️ Part 0 — Skill Creator 自身反幻觉规则(最高优先级)
必须读取,禁止凭记忆
- 每次创建前必须读取
SKILL-template.md,不得用记忆中的模板内容替代 — 模板可能已更新 - 每次创建前必须读取
html-skeleton.html,不得凭印象生成 HTML 内容 - 若项目根存在
launcher.html,必须读取再追加注册条目 — 禁止凭猜测推断 SKILLS 数组末尾位置。若不存在 launcher.html(纯 plugin 场景),跳过 Step 5 是合规的
禁止超出用户回答范围
- 只根据 Q1–Q8 的答案生成内容 — 不猜测用户意图,不主动扩展功能,不添加用户未要求的字段
- 问卷完成前不生成任何文件 — 必须先完成 Step 1 并获得确认,再进入 Step 2
模板占位符处理
- 所有
{{SKILL_ID}}、{{SKILL_NAME}}、{{SKILL_DESCRIPTION}}占位符必须全部替换 — 完成后自检,不得有残留占位符 - SKILL-template.md 的 Part 0 示例为通用占位格式 — 创建 Skill 后,须在 Step 6 提醒用户将
[参数名]=[值]占位示例替换为本 Skill 领域的实际示例
文件操作安全
- 写入前核查路径 —
skills/{{SKILL_ID}}/路径必须与 Q1 完全一致,不得混用其他 Skill 的路径 - launcher.html 追加后验证语法 — 追加条目后检查数组 JSON 语法(逗号、闭合括号),不得破坏已有数据
- 写入前检查 SKILL_ID 唯一性 — 在 Step 1 收到 Q1 后,用 Glob 工具确认
skills/[Q1值]/目录不存在;若已存在,必须停止并要求用户更换 ID,禁止覆盖已有 Skill
步骤完整性
- 禁止跳过 Step 4-B(evals 目录创建) — 无论 Q3/Q4/Q5 如何,evals 目录必须始终创建
- Step 5(launcher 注册)条件化 — 若项目根有
launcher.html,不得跳过 Step 5;若无 launcher(纯 plugin 或极简项目),跳过是合规的,需在 Step 6 摘要中说明"未检测到 launcher,已跳过卡片注册"
Step 1 — 快速问卷
⚡ 前置环境探测(先于所有提问,静默执行):
用 Glob 探测项目根目录结构,记录两个事实以供后续步骤使用:
HAS_LAUNCHER= Globlauncher.html命中与否(影响 Step 5 是否执行)HAS_CLIENTS= Globclients/*/client-profile.md命中与否(影响 Q5 是否询问)
若两者皆无,本 Skill 运行在"极简/ plugin"模式下,Step 5 整节跳过,Q5 自动为 N。
⚡ 前置验证(先于 Q1-Q8,单独提问):
在发出 Q1-Q8 问卷之前,先向用户提一个问题:
"这个 Skill 解决什么具体问题?预计每月会使用几次?"
判断规则:
- 若描述模糊(如"备用"、"以后可能用")或预计月使用 < 1 次 → 主动提示:"这个 Skill 使用频次较低,是否确认需要创建?",等待用户明确确认后再继续
- 若描述清晰且有合理频次 → 直接进入 Q1-Q8 问卷,无需用户再次确认
自适应问卷(两阶段):
Phase 1 — 必问(所有 skill 都需要)
一次性发出 Q1-Q5 + Q8(共 6 个问题,一条消息):
我需要了解以下信息来创建这个 Skill:
Q1. Skill 英文 ID(小写+连字符,如 pump-reliability、valve-inspection)
Q2. 功能描述(一句话,20字以内)
Q3. 类型:
[A] 纯对话分析(无需 HTML 界面,Claude 直接输出结果)
[B] 含 HTML 界面(需要前端操作界面)
[C] 两者都要(SKILL.md 引导 + HTML 界面)
Q4. 是否需要 KB 知识库文件?(Y = 需要,N = 不需要)
Q5. 是否接入客户上下文(读取 clients/[client]/client-profile.md)?(Y / N)
[若 HAS_CLIENTS=false,此项替换为:"Q5. (本项目未检测到 clients/ 目录,已自动跳过,按 N 处理)",不再等待用户作答]
Q8. 触发关键词(3-5 个,用 · 分隔,如「API-571 · 退化机理 · 检验计划」)
请按上述顺序回答即可。
收到用户回答后,先执行 Q1 三项检查(格式规范化 → 唯一性 → 功能重叠,细节见下方),再决定是否进入 Phase 2。
⚠️ Q1 格式规范化检查(优先执行;规范化后的值传入后续所有步骤,包括唯一性检查、目录创建、launcher 注册):
- 校验 Q1 是否匹配
^[a-z0-9][a-z0-9-]*$- 若匹配 → 使用原值,跳到唯一性检查
- 若不匹配,先判断能否规范化:
- 含非 ASCII 字符(中文、日文等)→ 拒绝:"ID 必须用英文,请重新输入 Q1",等待新值
- 规范化后为空或仅剩 1 字符 → 拒绝:"ID 至少需 2 个有意义字符,请重新输入 Q1"
- 规范化后仍含非法字符(符号、标点)→ 拒绝,说明原因
- 可规范化时,依次应用以下规则:
- 转小写
- 空格、下划线 → 连字符
- 去除版本后缀(正则
[-_ ]?v\d+(\.\d+)*$,如-v0.1、_v1)- 去除点号
- 合并连续连字符,去首尾连字符
- 明示并等待用户确认:"Q1
[原值]不符合命名规范(需小写+连字符+数字)。建议改为[规范化值]。使用此规范化 ID 吗?(Y = 用这个,N = 我重新输入 Q1)"
- Y → 后续所有步骤使用
[规范化值],在 Step 6 摘要中注明"原始输入[原值]已规范化为[规范化值]"- N → 等待用户重新输入 Q1,重新走本检查
⚠️ Q1 唯一性检查:用 Glob 工具查询
skills/[Q1规范化值]/是否已存在。
- 若已存在 → 停止,告知用户 "Skill ID 已被占用,请重新选择",等待用户提供新的 Q1 后重新检查
- 若不存在 → 继续下一步
⚠️ Q1 功能重叠检查:用 Glob 列出
skills/下所有现有子目录名称,与 Q2(功能描述)做语义比对:
- 若发现高度相似的现有 Skill(如用户要创建"设备退化简版"而
equipment-degradation-proforma已存在)→ 提示用户:"已有 [相似 Skill ID] 可能覆盖类似功能,确认仍需新建?",等待用户明确确认后继续- 若无明显重叠 → 直接继续
Q1 三项检查全部通过后,决定是否发 Phase 2:
Phase 2 — 条件问(仅当需要 launcher 卡片视觉定制时)
进入条件:Q3 ≠ A 且 HAS_LAUNCHER=true
-
条件成立 → 发送 Phase 2 问卷:
Phase 1 收到,还需补 2 个视觉问题(launcher 卡片用): Q6. Skill 卡片分类(在 launcher.html 中显示): [1] 静设备 [2] 转动设备 [3] 工艺安全 [4] 热工 [5] 物流 [6] 通用 Q7. 卡片图标 Emoji(从以下选一个,或自定义): 🔬 🔧 ⚙️ 🛢️ 🌡️ 📊 🔩 📋 ⚠️ -
条件不成立(Q3=A 或无 launcher)→ 跳过 Phase 2,自动应用默认值:
Q6=[6]通用、Q7=⚙️。在 Step 6 摘要说明"Q6/Q7 已默认为 通用 / ⚙️,如需定制请在 launcher.html 中手动修改"。
Phase 2 完成(或跳过)后,复述确认一次:"我将创建:ID=[Q1规范化值](若经规范化,补注:规范化自你输入的 [原值]),类型=[Q3],分类=[Q6](默认/你选),继续?",用户确认后进入 Step 2。
Step 2 — 读取模板并生成 SKILL.md
- 读取
skills/skill-creator/templates/SKILL-template.md - 将占位符替换为用户的回答:
{{SKILL_ID}}→ Q1 的值{{SKILL_NAME}}→ Q2 的值(中文或英文均可){{SKILL_DESCRIPTION}}→ Q2 的值
- 根据 Q4 和 Q5 决定保留/删除可选章节(先执行此步,再执行 item 4):
- Q4 = N → 删除 Part III(知识库架构)整节,同时删除 Part V Step 0 中的「0-A. 知识库预读」子节
- Q5 = N → 删除 Part II(客户上下文接入)整节,同时删除 Part V Step 0 中的「0-B. 客户上下文注入」子节
- Q4 = N 且 Q5 = N(双双删除)→ Step 0「预加载」整节也一并删除(含标题行和前言文字,保留「Step 1 — 数据收集与核实」)
- 删除所有剩余 HTML 注释行(
<!-- ... -->格式):这些是模板条件标记,不应出现在最终 SKILL.md 中 - 写入文件:
skills/{{SKILL_ID}}/SKILL.md
Step 3 — 生成 HTML 界面(仅当 Q3 = B 或 C)
- 用 Bash 创建
templates/子目录(必须先建目录,再写文件):mkdir -p "skills/{{SKILL_ID}}/templates" - 读取
skills/skill-creator/templates/html-skeleton.html - 将以下占位符全部替换(文件中多处出现,需全部替换):
{{SKILL_ID}}→ Q1 的值{{SKILL_NAME}}→ Q2 的值
- 写入文件:
skills/{{SKILL_ID}}/templates/{{SKILL_ID}}.html - 可选:若新 Skill 需要把结果交给下游 Skill 处理(如诊断 → 工单),参考
skills/skill-creator/references/cross-skill-messaging-pattern.md实现 localStorage 握手,并在CLAUDE.md的握手协议表追加一行
Step 4 — 创建目录结构
4-A. 业务目录(仅 Q4 = Y 时执行)
Q4 = N → 跳过 4-A,直接进入 4-B。
Q4 = Y 时,用 Bash 创建知识库目录并写入索引占位:
mkdir -p "skills/{{SKILL_ID}}/kb"
mkdir -p "skills/{{SKILL_ID}}/references"
kb/INDEX.md 占位内容:
# {{SKILL_NAME}} 知识库索引
> 此文件是知识库的入口,每次分析前必须首先读取。
## 文件清单
| 文件 | 内容 | 优先级 |
|------|------|-------|
| (待填充) | (待填充) | 高 |
## 设备/场景决策树
(待填充:描述何时读取哪个 KB 文件)
4-B. Evals 目录(始终创建,无论 Q3/Q4/Q5)
mkdir -p "skills/{{SKILL_ID}}/evals"
然后从模板复制三个 stub 文件,将占位符替换为实际 Skill 信息:
复制并替换:
skills/skill-creator/templates/evals-template/evals.json→skills/{{SKILL_ID}}/evals/evals.json- 替换
{{SKILL_ID}}、{{SKILL_NAME}}
- 替换
skills/skill-creator/templates/evals-template/eval_log.md→skills/{{SKILL_ID}}/evals/eval_log.md- 替换
{{SKILL_NAME}}、{{SKILL_ID}},填写创建日期
- 替换
skills/skill-creator/templates/evals-template/OPTIMIZER.md→skills/{{SKILL_ID}}/evals/OPTIMIZER.md- 替换
{{SKILL_ID}}、{{SKILL_NAME}}
- 替换
Step 5 — 注册到 launcher.html(条件执行)
前置判断:
HAS_LAUNCHER=false(Step 1 已探测) → 整节跳过,直接进入 Step 6。在 Step 6 摘要中加一行:"⚠️ 未检测到 launcher.html,已跳过卡片注册。如后续添加 launcher,请参考references/launcher-card-schema.md补注册。"HAS_LAUNCHER=true→ 按以下步骤执行
- 读取
launcher.html,找到const SKILLS = [数组 - 在数组末尾最后一个
}之后,追加新条目(使用 Q6~Q8 的答案):
{ id:'{{SKILL_ID}}',
name:'{{SKILL_NAME}}',
icon:'{{Q7_EMOJI}}',
badge:'{{Q6_BADGE_CLASS}}',
badgeText:'{{Q6_BADGE_TEXT}}',
trigger:'{{Q8_KEYWORDS}}',
path:'skills/{{SKILL_ID}}/templates/{{SKILL_ID}}.html' },
Q6 → badge 类名和 badgeText 映射:
| Q6 回答 | badge | badgeText |
|---|---|---|
| [1] 静设备 | badge-static | 静设备 |
| [2] 转动设备 | badge-rotating | 转动设备 |
| [3] 工艺安全 | badge-process | 工艺安全 |
| [4] 热工 | badge-thermal | 热工 |
| [5] 物流 | badge-logistics | 物流 |
| [6] 通用 | badge-general | 通用 |
注意:
- 若 Q3 = A(纯对话),
path字段填''(空字符串)。launcher 卡片会显示,但点击时不跳转 HTML 界面,用户需通过 Claude Code 对话调用此 Skill。在 Step 6 输出摘要时,须提醒用户该 Skill 为纯对话模式,从 launcher 点击无效果。 - 确保追加位置在数组内、最后一个
}的逗号后,且在闭合]之前 - 追加后验证:JSON 语法正确(无多余逗号,无缺少逗号)
Step 6 — 输出摘要 + 验收清单
创建完成后,向用户输出以下摘要(Markdown 格式),并执行自检:
## ✅ Skill 创建完成:{{SKILL_ID}}
**已创建文件:**
- `skills/{{SKILL_ID}}/SKILL.md` — 操作规程(需补充业务规则)
- `skills/{{SKILL_ID}}/templates/{{SKILL_ID}}.html` — HTML 界面骨架(如适用)
- `skills/{{SKILL_ID}}/kb/INDEX.md` — 知识库索引(如适用)
- `skills/{{SKILL_ID}}/evals/evals.json` — 评估测试用例(需补充实际 test case)
- `skills/{{SKILL_ID}}/evals/eval_log.md` — 优化日志(已初始化)
- `skills/{{SKILL_ID}}/evals/OPTIMIZER.md` — 自动优化循环指南
**launcher.html 已更新:** 新 Skill 卡片已注册(badge=[分类],icon=[emoji])
6-A. 验收清单(自检后汇报)
在摘要之后,逐项检查并输出(每项必须明确 ✅ 或 ⚠️):
验收检查:
✅/⚠️ SKILL.md — 7个Part均已生成,无 {{占位符}} 残留
✅/⚠️ SKILL.md Part 0 — 存在反幻觉规则,且规则1/4的示例表中已提示用户替换为领域专属示例
✅/⚠️ HTML — 所有 {{SKILL_ID}} 和 {{SKILL_NAME}} 占位符已替换(如适用)
✅/⚠️ HTML systemPrompt — 含 【TODO】 标记,提示开发者替换为实际 SKILL.md Part 0 内容
✅/⚠️ launcher.html — 新条目 JSON 语法正确(无多余/缺失逗号)
✅/⚠️ evals/evals.json — 已创建,_meta.skill 字段正确
✅/⚠️ localStorage key = "[新Skill的ID]_records"(与现有Skill不冲突)
✅/⚠️ skill_lint — 执行退出码为 0(命令见下方)
⚠️ 以下项目禁止凭印象直接标 ✅,必须使用工具执行验证:
-
第 1、3 项(占位符残留):用 Grep 工具在
skills/[SKILL_ID]/目录下搜索{{,零结果才能标 ✅ -
第 7 项(localStorage key):Step 1 已确认 SKILL_ID 唯一,故
[SKILL_ID]_records无冲突,标 ✅ 时在括号内注明"Step 1 Glob 已确认 ID 唯一" -
第 8 项(skill_lint):用 Bash 实际执行 lint,退出码为 0 才能标 ✅。若有 ERROR/WARN,逐条报告并修复;修复后重新跑直至通过。按以下顺序尝试:
# 优先:plugin 模式($CLAUDE_PLUGIN_ROOT 由 Claude Code 自动注入) python "$CLAUDE_PLUGIN_ROOT/bin/skill_lint.py" --strict --root "$CLAUDE_PROJECT_DIR" # Fallback:仓库本地模式(仅当 plugin 模式失败/变量未设置) python scripts/skill_lint.py --strict
若任一项为 ⚠️,立即说明原因并修复。
6-B. 下一步建议
下一步建议:
- 打开
SKILL.md,填写 Part I(适用场景)、Part V(具体分析逻辑)、Part VI(输出字段) - ⚠️ 必做 — 替换 Part 0 示例:将 Part 0-A 规则1 和规则4 中的
[参数名]=[值]占位示例,替换为本 Skill 领域的 2-3 个真实参数示例(参考 DMA SKILL.md 中的腐蚀参数示例格式) - ⚠️ 必做 — 替换 HTML system prompt:打开
templates/{{SKILL_ID}}.html,将runAnalysis()中的systemPrompt替换为 SKILL.md Part 0 的完整内容(文件中有【TODO】标记提示) - 填充
evals/evals.json中的实际 test case(至少 3 个,含正常路径、边界拒绝、缺数据场景) - 如有知识库文件,放入
kb/并更新kb/INDEX.md - 打开
launcher.html验证新 Skill 卡片显示正常 - Skill 完善后,使用
evals/OPTIMIZER.md中的提示词启动自动优化循环