# Deployment Modes Skills deploy in two modes. Both resolve relative paths from the skill root — the SKILL.md body works the same in either. Differences only arise when referencing files *outside* the skill directory. ## Cache isolation (plugin mode) When a plugin is installed, its directory is copied to a cache. Only the plugin's own files are copied. **Any path that leaves the skill directory breaks post-install:** ``` ../other-skill/validate.sh # breaks plugins/kyberforge/skills/other-skill/ # breaks ../../shared/utils.sh # breaks ``` Fix: duplicate the file into the skill's own `scripts/` or `assets/`. There is no plugin-level `shared/` mechanism — the spec defines no cross-skill sharing, and `../` paths are broken by construction. ## Env vars (plugin mode only) These variables are injected when the plugin is loaded from an install cache. They are **not available in standalone mode.** | Variable | Value | |----------|-------| | `${CLAUDE_PLUGIN_ROOT}` | Absolute path to the plugin's install directory. Changes on update. | | `${CLAUDE_PLUGIN_DATA}` | Persistent directory that survives updates. Use for `node_modules`, generated state, caches. | Use `${CLAUDE_PLUGIN_ROOT}` only in hook commands and `.mcp.json` configs — not in SKILL.md body text, since standalone deployments won't have it. ## Standalone mode Deployed directly to `~/.agents/skills//`. No plugin context, no env vars injected. All file references must resolve within the skill directory. Skill invocations (e.g. `/skill-audit`) work if the called skill is also installed. ## Cross-tool portability `SKILL.md` is portable — the same file works in Claude Code and Copilot CLI. Agent definitions and manifest files (`plugin.json`, `hooks.json`) are tool-specific and must be authored separately per tool. ## Shared assets between skills If two skills in the same plugin need the same file, duplicate it into each skill's `assets/` or `scripts/`. Add a comment in both copies noting the mirror relationship so they stay in sync when the spec changes.