Install
openclaw skills install @conorbronsdon/agent-skill-builderBuild, review, or migrate an agent skill from a plain-language description — decides invocation control (disable-model-invocation vs user-invocable), arguments (argument-hint, $ARGUMENTS), and context cost, then scaffolds, validates, and tests it.
openclaw skills install @conorbronsdon/agent-skill-builderTakes a plain-language description of a task and produces a ready-to-ship agent skill. The design goal is skills that are cheap in ambient context and current with the skill spec — most skill generators fail on exactly those two axes: they don't know about arguments/argument-hint, never suggest disable-model-invocation, and write bloated descriptions that tax every session.
Parse $ARGUMENTS for a mode; default to new when the input is a description.
new <description> — scaffold a skill from scratch (the flow below).review <path> — audit an existing SKILL.md against steps 1–3's decision points and run the validator (step 4). Report findings; don't rewrite unless asked.migrate <path> — convert a legacy .claude/commands/*.md file into a skill directory: carry the frontmatter over, apply the review checklist, and place supporting content in the directory.Read references/claude-code-frontmatter.md — a pinned, dated snapshot of the skill frontmatter spec, argument substitutions, and context-loading behavior.
Staleness policy: if the snapshot date is more than 3 months old, warn the user and continue with the pinned snapshot. Do not re-fetch or modify the reference mid-generation — updating the spec is a maintenance operation (this repo's spec-drift CI watches for it), not a side effect of building a skill. Only update the snapshot when the user explicitly asks.
Also read the host repo's CLAUDE.md and existing skills — avoid duplicating a skill that already exists, and match local conventions.
Ask (or infer from context):
name + description only; keep Claude-specific fields out or document them as optional extensions)..claude/skills/ is the command you type; frontmatter name is only a display label.disable-model-invocation: true. Bonus: the description is then not loaded into every session — zero ambient context cost.user-invocable: false.argument-hint, and consume $ARGUMENTS (or $0/$1, or named arguments:) in the body. Don't make the model guess what the trailing text means.allowed-tools is a pre-approval grant (no permission prompts while active), not a restriction — scope entries tightly, e.g. Bash(git add *) not Bash. Use disallowed-tools to actually remove tools.context: fork + agent: for isolated, self-contained tasks. Fork only works when the body is an explicit task, not reference guidelines.!`command` at line start) to inline live data (a diff, a status file) before the model reads the skill.model/effort overrides with a specific reason. Use paths: for skills scoped to certain files.disable-model-invocation: true, the model never sees the description — write it for the human scanning the / menu, and keep it short.Frontmatter template — include only the fields this skill needs (all are optional; see the reference for the full table):
---
name: [skill-name]
description: [1-2 sentences, triggers first]
argument-hint: "[expected args, e.g. [issue-number] [format]]" # only if it takes arguments
disable-model-invocation: true # only for user-triggered workflows
allowed-tools: [tightly-scoped grants] # only if prompts would be annoying
---
Body structure: short purpose line, "When to Use" bullets, numbered step-by-step instructions, explicit output format.
Quality checklist:
${CLAUDE_SKILL_DIR} for bundled scriptsRun the bundled validator against the generated skill directory:
python3 ${CLAUDE_SKILL_DIR}/scripts/validate_skill.py <path-to-skill-dir>
It machine-checks what the checklist above describes: frontmatter parses, unknown keys, description budget, $ARGUMENTS/argument-hint pairing, unscoped Bash grants, side-effect commands on model-invocable skills, broken relative links, missing referenced files, body length. Report its output verbatim (PASS/FAIL plus warnings) as part of your deliverable. If Python isn't available, walk the checklist manually and say so.
Before writing anything, check the target path is clear. If <install-dir>/<skill-name>/SKILL.md already exists, stop and show the user the existing file — a skill with that name is already installed. Confirm an overwrite or pick a different name; never clobber an existing SKILL.md silently. (review mode is the right tool for improving one that already exists.)
For Claude Code: .claude/skills/<skill-name>/SKILL.md is the whole installation — the directory name becomes the command, supporting files live alongside, and changes hot-reload within a session. No routing stub or registry edit is needed. (.claude/commands/ files still work, but they're the legacy form — that's what migrate mode is for.)
Then follow whatever conventions the host repo has: a changelog entry, a command table in CLAUDE.md, a routing doc. Check before assuming none exist.
What skills are available? (or check /skills)./name with realistic arguments) and check the output matches the spec./plugin install skill-creator@claude-plugins-official runs with/without-skill benchmarks and description tuning. (That plugin evaluates output quality; this skill designs and validates structure — they compose.)Show the SKILL.md, the validator output, and any wiring changes in labeled fenced code blocks. Ask: "Want me to save these, or make any changes first?"
disable-model-invocation: true so the model can't decide to run it because the code "looks ready."