
Skill Installer
Install curated agent skills from a manifest into Claude Code, Cursor, Goose, OpenCode, and similar harnesses with a repeatable Python installer.
Overview
Skill Installer is an agent skill most often used in Build (also Validate scope, Operate iterate) that copies manifest-verified skills into multiple AI coding agent harnesses via a Python installer.
Install
npx skills add https://github.com/skillscatalog/registry --skill skill-installerWhat is this skill?
- Python install_skill.py script with argparse-driven harness targets
- agentskills.io manifest.v1 with per-file SHA-256 integrity entries
- Supports Claude Code, Goose, OpenCode, Cursor, and related agents
- 2-file skill package (SKILL.md + scripts) documented in generated manifest structure
- 2 total files in documented manifest structure (SKILL.md + scripts/install_skill.py)
- Manifest lists per-file SHA-256 integrity for the skill bundle
Adoption & trust: 1 installs on skills.sh; 1 GitHub stars; 0/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
You found a skill you want in Claude Code or Cursor but manual copy steps break paths, hashes, and harness-specific conventions.
Who is it for?
Indie builders maintaining a personal or team skills catalog who switch between Claude Code, Cursor, and other harnesses.
Skip if: Builders who only use one-off pasted prompts with no skills directory or manifest discipline.
When should I use this skill?
You need to install or refresh an agent skill from a manifest into Claude Code, Goose, OpenCode, Cursor, or compatible harnesses.
What do I get? / Deliverables
The target skill is installed where your harness expects it, with manifest integrity checks applied before files are written.
- Skill files copied into the harness-specific skills path
- Install run aligned to agentskills manifest integrity fields
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
First shelf is Build agent-tooling because you invoke it when wiring your coding agent’s skill directory—not during launch SEO or grow analytics. Agent-tooling subphase is where skill paths, manifests, and harness-specific dirs get configured for daily dev.
Where it fits
After cloning a skills registry, run the installer so Claude Code picks up new SKILL.md files in one command.
Before committing to a workflow stack, install candidate skills locally to trial them on a prototype branch.
Rebuild your laptop skills directory from manifest-verified packages without drift.
How it compares
Filesystem installer for skill packages—not an in-chat skill generator or MCP server.
Common Questions / FAQ
Who is skill-installer for?
Solo and indie developers who install third-party or registry skills into Claude Code, Cursor, Goose, OpenCode, and similar agents.
When should I use skill-installer?
During Build when onboarding agent-tooling, after pulling a new skill repo, or during Operate iterate when rebuilding a dev machine’s skill set.
Is skill-installer safe to install?
It runs install scripts with filesystem access—review Prism Security Audits, read install_skill.py, and verify manifest hashes before executing.
SKILL.md
READMESKILL.md - Skill Installer
{ "$schema": "https://agentskills.io/schemas/manifest.v1.json", "manifestVersion": "1.0", "generatedAt": "2026-01-03T03:39:19.983543Z", "generator": "skill-manifest-generator/1.0.0", "skill": { "name": "skill-installer", "version": "1.0.0" }, "integrity": { "algorithm": "sha256", "hash": "01594ce386bce1e97fe05669cd7f2d270f2735c6bb3f3a4e51ad9db6b237d46b" }, "files": [ { "path": "SKILL.md", "size": 2554, "sha256": "3fbfb9a95020fad87ad3cf929362413f0c4c12bf157a83e3c5a576e0aaed4eb4", "type": "manifest" }, { "path": "scripts/install_skill.py", "size": 14632, "sha256": "2df5a4271aa874269c865f4a311ac410276cd9e5f61d3ef92146569f721fe393", "type": "script" } ], "externalReferences": [], "structure": { "maxDepth": 1, "totalFiles": 2, "totalBytes": 17186, "folders": [ "scripts" ] }, "license": { "spdxId": "MIT" } } #!/usr/bin/env python3 """ Agent Skills Installer Install skills to AI coding agent harnesses. Supports Claude Code, Goose, OpenCode, Cursor, and others. """ import argparse import json import os import shutil import sys from pathlib import Path from typing import Optional # Add parent directory to path for shared imports SCRIPT_DIR = Path(__file__).parent SKILLS_DIR = SCRIPT_DIR.parent.parent SHARED_DIR = SKILLS_DIR / "_shared" sys.path.insert(0, str(SHARED_DIR)) # Optional imports try: from agentskills_config import get_skill_key, get_api_url, get_auth_header HAS_CONFIG = True except ImportError: HAS_CONFIG = False try: import requests HAS_REQUESTS = True except ImportError: HAS_REQUESTS = False # ============================================================================ # Harness Definitions # ============================================================================ HARNESSES = { "claude-code": { "name": "Claude Code", "path": Path.home() / ".claude" / "skills", "type": "global", "detect": lambda: (Path.home() / ".claude").exists(), }, "goose": { "name": "Goose", "path": Path.home() / ".config" / "goose" / "skills", "type": "global", "detect": lambda: shutil.which("goose") is not None or (Path.home() / ".config" / "goose").exists(), }, "opencode": { "name": "OpenCode", "path": Path.cwd() / ".opencode" / "skill", "type": "project", "detect": lambda: (Path.cwd() / ".opencode").exists() or shutil.which("opencode") is not None, }, "cursor": { "name": "Cursor", "path": Path.cwd() / ".cursor" / "skills", "type": "project", "detect": lambda: (Path.cwd() / ".cursor").exists(), }, } # ============================================================================ # Skill Parsing # ============================================================================ def get_skill_name(skill_path: Path) -> str: """Extract skill name from SKILL.md or directory name.""" skill_md = skill_path / "SKILL.md" if skill_md.exists(): try: content = skill_md.read_text() if content.startswith("---"): end = content.find("---", 3) if end > 0: frontmatter = content[3:end] for line in frontmatter.split("\n"): if line.startswith("name:"): return line.split(":", 1)[1].strip().strip("\"'") except Exception: pass return skill_path.name def validate_skill(skill_path: Path) -> tuple[bool, str]: """Check if path contains a valid skill.""" if not skill_path.exists(): return False, f"Path does not exist: {skill_path}" if not skill_path.is_dir(): return False, f"Path is not a directory: {skill_path}" skill_md = skill_path / "SKILL.md" if not skill_md.exists(): return False, f"Missing SKILL.md in {skill_