skills/curate/SKILL.md
Acquires a skill from a local directory or GitHub URL into this repo's skills/, or merges features from an external skill version into an existing local skill. Analyzes the source for security concerns, preferential bias, and destructive operations before writing anything. Also optimizes acquired skills to meet create-skill quality standards. Use when the user asks to "curate a skill", "import a skill from GitHub", "add a skill from a URL", "install a skill", "merge skill features", or "bring in an external skill". Do NOT use for creating new skills from scratch (use create-skill) or for enabling already-local skills.
npx skillsauth add armandli/get-skilled curateInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Parse $ARGUMENTS by splitting on whitespace:
Usage:
/curate <source> # acquire a skill from a local path or URL
/curate <local-skill-name> <source> # merge remote skill features into a local skill
SOURCE=$1.LOCAL_SKILL_NAME=$1, SOURCE=$2.Determine source type: SOURCE is a URL if it contains :// or starts with github.com/.
Normalize to a fetchable form — see references/github-url-formats.md for full conversion rules:
/tree/) → GitHub Contents API URL/blob/) → raw.githubusercontent.com URLgithub.com/ shorthand (no scheme) → prepend https://If the normalized URL is a GitHub Contents API URL (directory): Use WebFetch to fetch it. Parse the JSON array response:
"name": "SKILL.md" — use its "download_url" to WebFetch the raw SKILL.md text."type": "dir" and "name": "references" — store its "url" as REFS_DIR_URL for later.If the normalized URL points directly to a SKILL.md file (raw or blob): WebFetch the content directly.
Gate: If the fetch fails (error, 404, empty response, or no SKILL.md found in listing), report the error clearly and stop.
Expand ~ to the home directory. Then:
SKILL.md inside. If not found, stop with: "No SKILL.md found in <path>. Is this a skill directory?"Read the file content.
Store as SKILL_CONTENT. Extract skill name from the name: frontmatter field, or fall back to the last path segment of SOURCE normalized to kebab-case. Store as SKILL_NAME.
Check that $LOCAL_SKILL_NAME exists in this repo:
test -f "${PWD}/skills/${LOCAL_SKILL_NAME}/SKILL.md" && echo "exists" || echo "missing"
If missing: "No skill named '${LOCAL_SKILL_NAME}' found in skills/. Check the name and try again." — stop.
Read SKILL_CONTENT and produce an analysis report. Do NOT write any files yet.
Scan for each category. For each finding, record: flag type, the exact text, and a one-line reason it is concerning. See references/security-flags.md for patterns and examples.
| Flag | What to look for |
|------|-----------------|
| Preferential bias | Forced vendor/tool/editor choices without rationale; opinionated style rules presented as the only option |
| Security concern | Reading .env, ~/.ssh/*, ~/.aws/credentials, *.pem, *.key; eval/exec with user input; HTTP POST to external non-GitHub domains with local file content |
| Permission breach | sudo; writing to /etc/, /usr/, /System/, ~/.bashrc, ~/.zshrc; chmod 777 |
| Invalid operation | Tools not in: Bash, Read, Write, Edit, Glob, Grep, WebFetch, WebSearch, Task, mcp__*; incorrect API shapes |
| Destructive operation | rm -rf, git push --force, git reset --hard, overwriting files without prior read/backup — when NOT already behind a ### Gate: or confirmation prompt |
## Skill Analysis: <SKILL_NAME>
### Summary
<bullets>
### Security & Quality Flags
<findings table, or "No concerns found.">
Present the analysis and ask:
Proceed with acquiring this skill? [yes / no]
If no: stop.
If yes AND flags were found: for each flagged item, present:
Flag: <type> — <brief description>
[1] Include as-is
[2] Leave this section/line out
[3] Suggest a safe replacement (Claude will propose one)
Record the user's choice for each flag. These will be applied in Step 6.
Merge mode: Skip this step — the diff presentation in Step 5 is the gate instead.
Parse both SKILL.md files into sections by splitting on ## header lines. Treat the frontmatter block (between the --- delimiters) as a special section named _frontmatter.
Build a classification table:
| Section | In local? | In source? | Notes | |---------|-----------|------------|-------| | _frontmatter | Yes | Yes | differs / same | | Step N — ... | Yes/No | Yes/No | differs / same |
Mark each section:
Present the table, then ask:
How would you like to merge?
[1] Merge all — add all Source-only sections to the local skill
[2] Select features — choose section by section
[3] Cancel — make no changes
If [3]: stop.
If [2]: for each Source-only section, show header + first 5 lines of content, ask Include? [yes / no]. For "Both (differs)" sections also offer: [1] Keep local / [2] Use source / [3] Skip.
Record selections. Proceed to Step 6.
Before writing to disk, apply create-skill quality guidelines (see skills/create-skill/SKILL.md and skills/create-skill/references/checklist.md) to the content being saved. Key checks:
Frontmatter:
name: kebab-case, max 64 chars, no "claude"/"anthropic"description: includes what it does AND when to use it; 2–4 trigger phrases in quotes; at least one negative trigger; under 1024 chars; no < or >argument-hint: present if the skill accepts argumentsBody:
## headers### Final Step — Record Usage block calling skill-stat (add if missing)In merge mode: apply these checks only to the sections being added, not the entire existing local skill.
If issues are found, present a table:
| Issue | Existing value | Recommended fix | |-------|---------------|-----------------| | ... | ... | ... |
Ask: Apply these improvements before saving? [yes / no]
Apply if yes; save as-is with a noted caveat if no.
Set DEST="${PWD}/skills/${SKILL_NAME}".
Check for conflict:
test -d "${DEST}" && echo "exists" || echo "new"
If exists, warn: "A skill named '${SKILL_NAME}' already exists. Overwriting." — then proceed.
mkdir -p "${DEST}"SKILL_CONTENT (remove flagged lines for [2]; substitute for [3]).${DEST}/SKILL.md.references/ if present:
REFS_DIR_URL was set, WebFetch it to get the file listing. For each file entry, WebFetch its "download_url" and write to ${DEST}/references/<filename>.${SOURCE_DIR}/references/ exists, Glob its files and copy each to ${DEST}/references/.ln -sfn "../../skills/${SKILL_NAME}" "${PWD}/.claude/skills/${SKILL_NAME}"
test -L "${PWD}/.claude/skills/${SKILL_NAME}" && echo "symlink ok" || echo "symlink failed"
### Final Step / ### Step N — Record Usage block if present, so that block stays last.${PWD}/skills/${LOCAL_SKILL_NAME}/SKILL.md.## Curate Report — Acquired: <SKILL_NAME>
- Written to: skills/<SKILL_NAME>/SKILL.md
- References: <N files copied, or "none">
- Symlink created: .claude/skills/<SKILL_NAME>
- Flags resolved: <list of resolutions, or "none">
- Skill-form fixes: <list of applied improvements, or "none">
Invoke with: /<SKILL_NAME>
## Curate Report — Merged into: <LOCAL_SKILL_NAME>
- Sections added: <list>
- Sections updated: <list>
- Sections kept as-is: <list>
- Sections skipped: <list>
- Skill-form fixes: <list or "none">
python3 ${PWD}/.claude/skills/skill-stat/scripts/record-stat.py "curate"
tools
--- name: update-readme description: Updates a project README.md with build instructions, unit test instructions, and a mermaid architecture diagram. Use when a project README needs to be created or refreshed. Trigger phrases: "update readme", "generate readme", "create readme", "refresh readme docs". Emphasizes project interfaces, extension points, and customization hooks in the diagram — not concrete implementations. Do NOT use for documentation sites, wikis, or non-project READMEs. argument-h
business
--- name: skill-stat description: Records skill usage statistics and issue reports into .claude/skill-stats.md. Increments the Uses count for a skill name, and optionally logs an issue report that increments the Issues count and appends a row to the Issue Reports table. Use when tracking how often a skill is invoked, when a user reports a problem with a skill, or when another skill needs to log its own usage. Trigger phrases: "record skill stat", "log skill usage", "report skill issue". Do NOT u
testing
--- name: revert description: Reverts ALL git changes in the working directory: staged changes, unstaged modifications, and new untracked files. Use when user asks to "revert all changes", "undo all changes", "discard all changes", "reset all git changes", or "clean working directory". Do NOT use for reverting a specific file or a specific commit — those need targeted git commands. disable-model-invocation: true --- Revert all git changes in the working directory. This is destructive and cannot
tools
Scans a Python codebase for duplicate or near-duplicate logic patterns across functions, classes, and files, then extracts those patterns into typed utility classes in a shared module. Use when the user asks to "refactor this Python code", "find duplicate logic", "extract shared utilities", "apply DRY to Python", "deduplicate Python code", or "find repeated patterns in Python". Groups extracted helpers by the object type they operate on (strings, numbers, dates, collections, etc.). Do NOT use for performance optimization (use optimize-python), for debugging logic errors, or for explaining code. Do NOT extract code that appears only once. Run this skill before optimize-python.