plugin-installer
Dependencies
This skill requires Python 3.8+ and standard library only. No external packages needed.
To install this skill's dependencies:
pip-compile ./requirements.in
pip install -r ./requirements.txt
See ./requirements.txt for the dependency lockfile (currently empty — standard library only).
Agent Bridge
Overview
This skill deploys plugin components to agent environments using the
.agents/ central store + symlink pattern. It is the full-stack installer:
| Installer | Features | Requires Local Clone? | Recommended For |
|---|---|---|---|
uvx ★ default |
Full interactive TUI | No (runs from GitHub) | Everyone using uv |
bootstrap.py |
Full interactive TUI | No (downloads in-memory) | End users without uv |
npx skills add |
Skills only | No (runs from GitHub) | Mac/Linux users wanting only skills |
plugin_add.py |
Full interactive TUI | Yes | Local developers debugging the installer |
Use
uvx(★ recommended default) for an interactive TUI that works exactly likenpx skills addbut installs full plugins without requiring Node.js. Use thebootstrap.pycurl pipeline if you do not haveuvinstalled. Useplugin_add.pydirectly for scripted/CI single-plugin installs from a local clone.
Initial vs Subsequent Installs
There is no difference between an initial install and a subsequent install from the consumer's perspective. Because uvx and bootstrap.py execute ephemerally, they are inherently stateless tooling.
You do not need to "install the installer". Just run the uvx or curl command whenever you need to add or update a plugin. The state is strictly kept inside your .agents/ repository.
Attribution
The plugin_add.py interactive TUI (multiselect, arrow-key navigation, fuzzy search, owner/repo GitHub shorthand, temp-clone-then-install flow) is inspired by the npx skills add command from the Vercel Labs skills CLI:
- GitHub: https://github.com/vercel-labs/skills
- Marketplace: https://skills.sh
This implementation re-creates those UX patterns in pure Python stdlib (no npm, no external packages) so they work on Windows without symlink issues and operate at the plugin level rather than individual SKILL.md files.
Architecture: How Installation Works
plugins/<plugin>/
skills/ → .agents/skills/<skill>/ (canonical copy, all agents read from here)
.claude/skills/<skill> → symlink (Claude Code)
commands/ → .agents/workflows/<plugin>_<cmd>.md (canonical copy)
.claude/commands/<plugin>_<cmd>.md → symlink (Claude Code)
rules/ → .agents/rules/<plugin>_<rule>.md (canonical copy)
CLAUDE.md → appended (Claude Code)
hooks/hooks.json → .agents/hooks/<plugin>-hooks.json (canonical copy)
.claude/hooks/<plugin>-hooks.json → symlink (Claude only)
.mcp.json → ./.mcp.json (merged)
Central store is always .agents/ at project root. Symlinks point from
each agent's own directory back into .agents/. This mirrors exactly how
npx skills manages its canonical store at .agents/skills/.
Component Mapping Matrix
| Component | .agents/ (canonical) |
.claude/ (Claude Code) |
|---|---|---|
skills/ |
.agents/skills/<n>/ full copy |
.claude/skills/<n> → symlink |
commands/*.md |
.agents/workflows/<plugin>_<cmd>.md |
.claude/commands/<plugin>_<cmd>.md → symlink |
rules/ |
.agents/rules/<plugin>_<rule>.md |
Appended → CLAUDE.md |
hooks/hooks.json |
.agents/hooks/<plugin>-hooks.json |
.claude/hooks/<plugin>-hooks.json → symlink |
agents/*.md |
.agents/agents/<plugin>-<agent>.md |
.claude/agents/<plugin>-<agent>.md → symlink |
.mcp.json |
Merged → ./.mcp.json |
Merged → ./.mcp.json |
Antigravity, Gemini, and GitHub Copilot all natively read from
.agents/— no separate symlinks needed. The canonical.agents/copy is sufficient.
Commands naming: Nested command folders are flattened to snake_case.
commands/ops/restart.md→<plugin>_ops_restart.md
commands/vsworkflows/naming: The plugin source folder is always namedcommands/. The installer writes to.agents/workflows/(canonical) and.claude/commands/(symlink). Never rename the source folder.
skills/as slash commands (Claude Code): In Claude Code, anyskills/<name>/SKILL.mdentry in a plugin is deployed to.claude/skills/<name>/and automatically functions as both a proactive skill AND a namespaced slash command (/plugin-name:name). This is the preferred pattern for new commands — usecommands/as thin wrappers that delegate to skills. The installer handles both paths independently; no special flag needed.
npx skills Compatibility
plugin_installer.py writes to the npx skills lock file after installation
so that npx skills list, check, and update remain aware of
bridge-installed skills.
Lock file locations:
| File | Path | Purpose |
|---|---|---|
| Global lock | ~/.agents/.skill-lock.json |
Tracks global installs; enables npx skills check/update |
| Project lock | <project>/skills-lock.json |
Tracks project installs; enables npx skills experimental_install |
Lock file schema (version 3):
{
"version": 3,
"skills": {
"my-skill": {
"source": "richfrem/agent-plugins-skills",
"sourceType": "github",
"sourceUrl": "https://github.com/richfrem/agent-plugins-skills.git",
"skillPath": "plugins/my-plugin/skills/my-skill",
"skillFolderHash": "<git-tree-sha>",
"installedAt": "<iso-timestamp>",
"updatedAt": "<iso-timestamp>"
}
},
"dismissed": {}
}
After running plugin_installer.py, each installed skill must be written to
the appropriate lock file. Skills only — commands, rules, hooks, and MCP are
not tracked by npx skills.
Usage
Bootstrapped (no clone required): uvx ★ Recommended
# Interactive TUI from any GitHub repo
uvx --from git+https://github.com/richfrem/agent-plugins-skills plugin-add richfrem/agent-plugins-skills
# Install from Anthropic official plugins (has plugins/ subdir)
uvx --from git+https://github.com/richfrem/agent-plugins-skills plugin-add anthropics/claude-plugins-official
# Install from flat-layout repo (no plugins/ dir — auto-discovered)
uvx --from git+https://github.com/richfrem/agent-plugins-skills plugin-add anthropics/knowledge-work-plugins
# Install all non-interactively
uvx --from git+https://github.com/richfrem/agent-plugins-skills plugin-add richfrem/agent-plugins-skills --all -y
Full Deployment: plugin_add.py (interactive TUI)
The recommended local invocation. Supports the same GitHub source syntax as uvx.
Source Format
plugin_add.py accepts a flexible owner/repo[/subpath] source:
| Source Format | What Happens |
|---|---|
richfrem/agent-plugins-skills |
Clone repo, auto-detect plugins/ dir |
anthropics/claude-plugins-official/plugins |
Clone repo, use plugins/ subpath directly |
anthropics/knowledge-work-plugins |
Clone repo, no plugins/ dir — scans root for plugin-shaped dirs |
anthropics/knowledge-work-plugins/engineering |
Clone repo, drill into engineering/ as a single plugin |
https://github.com/org/repo/tree/main/plugins |
Full GitHub URL — tree/main/ is stripped automatically |
/local/path/to/repo |
Local clone — same discovery waterfall |
Plugin Discovery Waterfall
When a repo root is resolved, plugins are found via three-tier fallback:
- Classic monorepo —
plugins/subdir exists → scan its children - Flat layout — No
plugins/dir → scan root-level dirs that have.claude-plugin/plugin.jsonorskills/ - Single plugin — The pointed-to directory itself has
.claude-plugin/plugin.json→ treat as one plugin
# Interactive plugin picker — current repo
python plugins/plugin-manager/scripts/plugin_add.py
# Install from remote GitHub repo (any layout)
python plugins/plugin-manager/scripts/plugin_add.py richfrem/agent-plugins-skills
# Install specific subpath
python plugins/plugin-manager/scripts/plugin_add.py anthropics/knowledge-work-plugins/engineering
# Full GitHub URL (tree/main/ stripped automatically)
python plugins/plugin-manager/scripts/plugin_add.py https://github.com/anthropics/claude-plugins-official/tree/main/plugins
# Install all non-interactively
python plugins/plugin-manager/scripts/plugin_add.py richfrem/agent-plugins-skills --all -y
# Dry-run preview
python plugins/plugin-manager/scripts/plugin_add.py --dry-run
Fresh Project: .claude/ Auto-Init
If no .claude/ directory exists in the target project, plugin_add.py will prompt:
No .claude/ directory found in this project.
Initialize .claude/ for Claude Code integration? [Y/n]
Answering Y (default) creates .claude/ so Claude Code symlinks are activated during installation. Answering n skips it — only .agents/ (the canonical store) will be populated.
Single Plugin: bridge_installer.py (scripted / CI)
Install a single plugin:
python ./plugins/plugin-manager/scripts/bridge_installer.py \
--plugin plugins/my-plugin
Dry run (preview only, no writes):
python ./plugins/plugin-manager/scripts/bridge_installer.py \
--plugin plugins/my-plugin --dry-run
Execution Protocol
CRITICAL: Do not run the installer without a Recap-Before-Execute summary. Always propose
--dry-runfirst for any destructive or first-time operation.
Phase 1: Pre-flight Check
Before running the bridge, verify:
- Plugin path exists and has
./plugin.json - At least one of
.agents/,.claude/exists (do NOT create these automatically — if missing, print the exactmkdircommand and wait for user confirmation) - No
--target autois used anywhere in the call chain
Phase 2: Recap-Before-Execute
State exactly what will happen:
### Plugin Installation Plan
- **Plugin**: plugins/my-plugin (v1.2.0)
- **Components**:
- 2 skills → .agents/skills/ (canonical) + .claude/skills/ symlinks
- 3 commands → .agents/workflows/, .claude/commands/
- 1 rules file → .agents/rules/, appended to CLAUDE.md
- hooks.json → .agents/hooks/ + .claude/hooks/
- **Detected environments**: claude (.claude/)
- **Lock file**: will update skills-lock.json
> Proceed? (yes to run live, no to dry-run first)
Phase 3: Execute
Wait for explicit confirmation before running live. Default to dry-run.
Fallback Tree
1. Target directory not found
Do NOT create automatically. Print:
mkdir .claude # for Claude Code
Wait for user confirmation. A missing directory may mean an uninitialised project.
2. Plugin not found
Do NOT scan for similar names. Report the error and list plugins/ contents.
Ask the user to confirm the correct plugin name.
3. Partial bridge (some components failed)
Report each failed component individually with its error. Do NOT claim success. Offer to retry individual components once the user resolves the issue.
4. --target auto attempted
STOP immediately. Ask the user to specify the exact environment name
(antigravity, claude, gemini, github). Never run with --target auto.
5. Symlink failed (Windows)
Log symlinkFailed: true. Fallback chain:
os.symlink()— true symlink (needs Developer Mode)mklink /Jfor dirs /mklink /Hfor files — no Developer Mode neededshutil.copy2()— plain copy (last resort, no live sync)
Warn: "On Windows, enable Developer Mode for true symlink support."
6. Lock file write failed
Log the error but do not abort the install. Warn the user that
installed skills may not be tracked in skills-lock.json.
DETECTABLE_AGENTS Reference
The installer auto-detects agent environments by checking for these directories
at project root. Antigravity, Gemini, and GitHub Copilot now natively read from
.agents/ so no per-agent symlinks are needed for them. Only environments that
require their own directory layout (Claude Code, Azure) are listed here:
DETECTABLE_AGENTS = {
".claude": {
"name": "claude",
"skills": ".claude/skills",
"agents": ".claude/agents",
"commands": ".claude/commands", # Markdown
"rules": None, # Append to CLAUDE.md instead
"rules_append_target": "CLAUDE.md",
"hooks": ".claude/hooks",
"rules_mode": "append",
},
".azure": {
"name": "azure",
"skills": ".azure/skills",
"commands": None,
"rules": None,
"hooks": None,
},
}
When to Use This Skill
- Deploying a new plugin locally — full component installation including
commands, rules, and hooks that
npx skillswon't handle - After modifying a plugin — re-run bridge to push changes to all envs
- Adding a new target environment — existing plugins need re-bridging
- Reconciling with npx skills ecosystem — write lock file entries so
npx skills list/check/updatesees bridge-installed skills - Debugging missing commands or rules —
npx skillsinstalls will be missing these; bridge install completes the picture
When NOT to Use This Skill
- End-user consumption from remote repo — use
plugin_add.py owner/repo(auto-clones + interactive TUI) ornpx skills add(skills only, no Python required) - Auditing plugin structure — use
maintain-plugins
Related Skills
maintain-plugins— structural audits, sync, orphan cleanup, README generation
More from richfrem/agent-plugins-skills
markdown-to-msword-converter
Converts Markdown files to one MS Word document per file using plugin-local scripts. V2 includes L5 Delegated Constraint Verification for strict binary artifact linting.
52excel-to-csv
>
32zip-bundling
Create technical ZIP bundles of code, design, and documentation for external review or context sharing. Use when you need to package multiple project files into a portable `.zip` archive instead of a single Markdown file.
29learning-loop
(Industry standard: Loop Agent / Single Agent) Primary Use Case: Self-contained research, content generation, and exploration where no inner delegation is required. Self-directed research and knowledge capture loop. Use when: starting a session (Orientation), performing research (Synthesis), or closing a session (Seal, Persist, Retrospective). Ensures knowledge survives across isolated agent sessions.
26ollama-launch
Start and verify the local Ollama LLM server. Use when Ollama is needed for RLM distillation, seal snapshots, embeddings, or any local LLM inference — and it's not already running. Checks if Ollama is running, starts it if not, and verifies the health endpoint.
26spec-kitty-checklist
A standard Spec-Kitty workflow routine.
26