From boutiques
Generate a Boutiques schema-version 0.5 JSON descriptor for a CLI tool. Invoke when the user asks to create, generate, or write a boutiques descriptor or boutiques .json for any command-line tool or program. Accepts a command name or a command + subcommand pair (e.g. /boutiques bet or /boutiques git commit). Use this skill any time the user mentions "boutiques descriptor", "boutiques json", or wants to describe a CLI tool in the Boutiques format.
How this skill is triggered — by the user, by Claude, or both
Slash command
/boutiques:boutiques <command> [subcommand]<command> [subcommand]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate a Boutiques schema-version 0.5 JSON descriptor for a CLI tool by inspecting
Generate a Boutiques schema-version 0.5 JSON descriptor for a CLI tool by inspecting
its help output. Load references/boutiques-schema.md at the start of Step 5 when the
tool has more than 10 flags or any ambiguous types; otherwise load it when uncertain
about a field's valid values.
Extract the command and optional subcommand from $ARGUMENTS. If $ARGUMENTS is empty, ask the user which command to describe before continuing.
<command> --version 2>&1
If that fails or returns nothing, try -version or --version as a subcommand.
Record the version string. Use "unknown" if it cannot be determined.
<command> [subcommand] --help 2>&1
If that returns an error or empty output, retry with -h. If still unhelpful, try
running with no arguments (<command> [subcommand] 2>&1). If the tool requires a TTY
to display help (output is empty or contains "not a terminal"), inform the user and ask
them to paste the help text manually. Capture the full output — you will parse it in step 5.
Before writing anything, ask the user where to save the descriptor. Suggest a default filename in the current working directory using this pattern:
<command>[-<subcommand>]-<version>.json (e.g. flirt-6.0.json, git-commit-2.43.0.json)<command>[-<subcommand>].jsonConvert the version string to kebab-case (replace spaces, underscores, and other
non-alphanumeric characters except . with -; strip any leading v).
Wait for the user's confirmation or a different path.
If the suggested file already exists (Bash: test -f <path> && echo exists), warn the
user before overwriting.
Extract from the captured help output:
Usage: line(s). Use this to determine the order and names
of positional arguments, which must appear in the command-line template in that order.-f), long flag (e.g. --file), metavar
(e.g. FILE), and description text.For each positional argument and option, determine its type using this table:
| Pattern | Boutiques type | Notes |
|---|---|---|
No value (bare -v, --verbose) | Flag | Boolean; present or absent |
Metavar contains FILE, PATH, DIR, IMAGE, INPUT, OUTPUT | File | |
Metavar is N, NUM, INT, COUNT | Number | Set "integer": true |
Metavar is FLOAT, VALUE, RATE, THRESH, SIZE | Number | |
| Metavar exists but does not match the above | String | Safe default |
When ambiguous, prefer String over Number, and File if the description
mentions file, path, image, or directory.
For each input, build an object containing at minimum:
{
"id": "snake_case_from_long_flag_or_positional_name",
"name": "Human Readable Name",
"type": "File | String | Number | Flag",
"value-key": "[UPPER_CASE_ID]",
"command-line-flag": "--flag-name",
"description": "Copied from help text.",
"optional": true
}
Rules:
id: snake_case of the long flag name (strip leading --). For positional args,
use the metavar or positional name in snake_case. IDs must be unique.value-key: the id in UPPER_CASE wrapped in brackets: [INPUT_FILE]command-line-flag: include for named flags; omit for positional argumentsoptional: false for positional/required arguments, true for optional flagsNumber inputs, add "integer": true when the metavar or description implies integersNumber inputs, add "minimum" / "maximum" if the help text states a valid rangeString inputs with a fixed set of valid values, add "value-choices": [...]-i file1 -i file2), add
"list": true to the input objectIf the help text shows mutually exclusive options (e.g., "use -T or -I but not both"),
add an input-groups entry:
{
"id": "mode_group",
"name": "Mode selection",
"description": "Mutually exclusive mode flags.",
"mutually-exclusive": true,
"members": ["flag_t", "flag_i"]
}
Load references/boutiques-schema.md for exclusive, all-or-none, and
one-is-required group types before writing any input-groups entry — do not
invent the syntax from memory.
Scan the inputs for any whose id, flag name, or metavar suggests output
(e.g. --output, --out, -o, OUTPUT_FILE, OUTPUT_IMAGE).
For each, add an entry to output-files:
{
"id": "output_<name>",
"name": "Output <Name>",
"description": "Output file produced by the tool.",
"path-template": "[OUTPUT_FILE]",
"optional": false
}
Reconstruct the full command as a template string following the usage pattern:
<command> [subcommand]value-key at the position shown in the Usage line--flag [VALUE_KEY][FLAG_KEY] — Boutiques substitutes the flag string
when true and empty string when falseExample: bet [INPUT_IMAGE] [OUTPUT_IMAGE] [FRACTIONAL_INTENSITY] [VERBOSE]
Verify that every value-key in the template has exactly one matching input entry.
Construct the full JSON object. Required fields:
{
"name": "<command>[-<subcommand>]",
"description": "<description from help>",
"tool-version": "<version or unknown>",
"schema-version": "0.5",
"command-line": "<template string>",
"inputs": [...],
"output-files": [...]
}
Omit output-files if none were identified. Omit optional top-level fields
(author, url, tags, etc.) unless you can confidently populate them from
the help text.
Write the JSON to the path confirmed in step 4. Report the path when done and note any arguments that were ambiguous or could not be fully parsed.
After writing, tell the user they can validate the descriptor with:
bosh validate <path>
This requires the boutiques Python package (pip install boutiques). Optional but
recommended — it checks the descriptor against the Boutiques JSON schema.
value-key in command-line must have a corresponding input; every
input must have its value-key appear in command-line.id values unique. If two flags would produce the same id, append _2.disables-inputs / requires-inputs dependency relationships, load
references/boutiques-schema.md — do not invent the syntax from memory.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub bcmcpher/my-skills --plugin boutiques