{"_id":"@anfeng1314/skill-linker","_rev":"4-20dc0e8c141651adb41f968c0d9eab9a","name":"@anfeng1314/skill-linker","dist-tags":{"latest":"1.1.4"},"versions":{"1.0.0":{"name":"@anfeng1314/skill-linker","version":"1.0.0","keywords":["skills","symlink","sync","claude","codex","agent"],"author":{"name":"anfeng"},"license":"MIT","_id":"@anfeng1314/skill-linker@1.0.0","maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"bin":{"skill-linker":"bin/skill-linker.mjs"},"dist":{"shasum":"efc19bc1df4c8163a766b52febb639761befb31d","tarball":"https://registry.npmjs.org/@anfeng1314/skill-linker/-/skill-linker-1.0.0.tgz","fileCount":9,"integrity":"sha512-edB9fAb5YKO2vFOvej1p2Fz47V9ZkIZqH9J/JthOzdr2QfXjVcVbHfP5M16tiv3JbSM47SVuYIJHcit1lllQCg==","signatures":[{"sig":"MEUCIEllnjbmN7iro4M8ZlGKCbWqQXxcKxxNwvH1DEf+f1UpAiEAxuSLZFbWZm8qZO8q2cvpzICJBMUjzbSXMaTapy11MIU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43738},"type":"module","gitHead":"32a6ccc6d21b1ab657dd9f9a0bdf90f5a89923cd","_npmUser":{"name":"anfeng087","email":"anfeng87l@gmail.com"},"_npmVersion":"11.9.0","description":"统一管理多 AI 工具的 skills 目录分发","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skill-linker_1.0.0_1778227059054_0.8934842697565417","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@anfeng1314/skill-linker","version":"1.1.0","keywords":["skills","symlink","sync","claude","codex","agent","remove"],"author":{"name":"anfeng"},"license":"MIT","_id":"@anfeng1314/skill-linker@1.1.0","maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"bin":{"skill-linker":"bin/skill-linker.mjs"},"dist":{"shasum":"033ef7e9f7331d256af106088a01c6f7cf373df3","tarball":"https://registry.npmjs.org/@anfeng1314/skill-linker/-/skill-linker-1.1.0.tgz","fileCount":9,"integrity":"sha512-HOlGsTxLrLTR68jZusI7Ph6IKGdkzg1aUjUePA2ZRmi80PJ3beqdgHkmoF8g0lkGnzJ33ehUHlG62vdz8Lhqjg==","signatures":[{"sig":"MEYCIQDoBJTDaYBm2GwzTk1vX0KbD80d0kfwK1yEZPIu3UxVFgIhAPVteHY61T0yhjAAsXxqOMufFUI8H0WiGxd8yx4wmlMl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50293},"type":"module","gitHead":"32a6ccc6d21b1ab657dd9f9a0bdf90f5a89923cd","_npmUser":{"name":"anfeng087","email":"anfeng87l@gmail.com"},"_npmVersion":"11.9.0","description":"统一管理多 AI 工具的 skills 目录分发，支持删除管理","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skill-linker_1.1.0_1778229786797_0.8925127507942199","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@anfeng1314/skill-linker","version":"1.1.1","keywords":["skills","symlink","sync","claude","codex","agent","remove"],"author":{"name":"anfeng"},"license":"MIT","_id":"@anfeng1314/skill-linker@1.1.1","maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"homepage":"https://github.com/anfeng-crystal/ai-workspace#readme","bugs":{"url":"https://github.com/anfeng-crystal/ai-workspace/issues"},"bin":{"skill-linker":"bin/skill-linker.mjs"},"dist":{"shasum":"da71d30945473886de8afc297684381bc163dc73","tarball":"https://registry.npmjs.org/@anfeng1314/skill-linker/-/skill-linker-1.1.1.tgz","fileCount":10,"integrity":"sha512-2b2SxPjxzuvnqpc/62bTnlT70s3qqT6/tozkO7duKRbtsLk23JQ24F7FxmQC6PmD9MhvRnVI6zP51ZAfh24HKg==","signatures":[{"sig":"MEUCIQCseziqKCuvCscUiFj1zJts3pvpXTiMZQpj2dN/hS+YNwIgCu8/PMetd+59SgIciAnzokKGcG7teUGgln5lwkWnHZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63468},"type":"module","gitHead":"3501d2ec515d5a7c878f6dbd0fb59928194a5f4c","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c5bad042-55e3-4f88-81a6-01256864912c"}},"repository":{"url":"git+https://github.com/anfeng-crystal/ai-workspace.git","type":"git","directory":"skills/active/skills/meta/skill-linker"},"_npmVersion":"11.11.0","description":"统一管理多 AI 工具的 skills 目录分发，支持删除管理","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skill-linker_1.1.1_1778239744031_0.44130660728014126","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@anfeng1314/skill-linker","version":"1.1.4","description":"统一管理多 AI 工具的 skills 目录分发，支持删除管理","type":"module","bin":{"skill-linker":"bin/skill-linker.mjs"},"scripts":{"test":"node --test"},"repository":{"type":"git","url":"git+https://github.com/anfeng-crystal/ai-workspace.git","directory":"skills/active/skills/meta/skill-linker"},"publishConfig":{"access":"public"},"keywords":["skills","symlink","sync","claude","codex","agent","remove"],"license":"MIT","author":{"name":"anfeng"},"_id":"@anfeng1314/skill-linker@1.1.4","bugs":{"url":"https://github.com/anfeng-crystal/ai-workspace/issues"},"homepage":"https://github.com/anfeng-crystal/ai-workspace#readme","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-t9AfEW+olbLUDgKb7vIuhSJ9UzkUkqzeW1hR/GHZ/AttLbgFHLgTjmkReMyj4aGVmgl2ra/HHOjCohErTS18Cw==","shasum":"4484a52159a0c99158e9c4a2d09b47509598e883","tarball":"https://registry.npmjs.org/@anfeng1314/skill-linker/-/skill-linker-1.1.4.tgz","fileCount":12,"unpackedSize":78996,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFYepz5b+8Xq5MWE6o3XDl+QVlpJ0mYo15nm7z/yF4GAAiA/zibdCbQx6SkxUtR5W6KT/k+j/qt6UN3thQru9z+LpA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c5bad042-55e3-4f88-81a6-01256864912c"}},"directories":{},"maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/skill-linker_1.1.4_1778241969593_0.8219107383160627"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-08T07:57:38.934Z","modified":"2026-05-08T12:06:09.862Z","1.0.0":"2026-05-08T07:57:39.211Z","1.1.0":"2026-05-08T08:43:06.955Z","1.1.1":"2026-05-08T11:29:04.152Z","1.1.4":"2026-05-08T12:06:09.727Z"},"bugs":{"url":"https://github.com/anfeng-crystal/ai-workspace/issues"},"author":{"name":"anfeng"},"license":"MIT","homepage":"https://github.com/anfeng-crystal/ai-workspace#readme","keywords":["skills","symlink","sync","claude","codex","agent","remove"],"repository":{"type":"git","url":"git+https://github.com/anfeng-crystal/ai-workspace.git","directory":"skills/active/skills/meta/skill-linker"},"description":"统一管理多 AI 工具的 skills 目录分发，支持删除管理","maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"readme":"# Skill Linker\n\nDistribute local AI skills to Codex, Claude Code, Junie, Agents, and Hermes.\n\nSkill Linker audits the source skill tree first, then creates only safe symlinks for supported tools. It refuses real-path conflicts, external symlink conflicts, and duplicate source names that would map to the same target skill.\n\n## Install\n\n```bash\nnpx @anfeng1314/skill-linker --help\n```\n\nOr install globally:\n\n```bash\nnpm install -g @anfeng1314/skill-linker\nskill-linker --help\n```\n\n## Quick Start\n\nRun commands from your active skills root, set `AI_SKILLS_HOME`, or create a config file.\n\n```bash\ncd ~/AI/skills/active\n\n# Preview all link changes.\nnpx @anfeng1314/skill-linker --json\n\n# Apply after reviewing the dry-run output.\nnpx @anfeng1314/skill-linker --apply\n```\n\nSync one skill:\n\n```bash\nnpx @anfeng1314/skill-linker --skill web-access --apply\n```\n\nSync to selected tools:\n\n```bash\nnpx @anfeng1314/skill-linker --skill web-access --tool codex --tool claude --apply\n```\n\n## Install Skills\n\nInstall skills into the active source tree first, then let Skill Linker distribute them. Do not install directly into host tool directories such as `~/.codex/skills` or `%USERPROFILE%\\.codex\\skills`.\n\n```bash\n# Dry-run\nnpx @anfeng1314/skill-linker install ./my-skill --category meta --json\n\n# Apply after reviewing the target path and sync plan\nnpx @anfeng1314/skill-linker install ./my-skill --category meta --apply\n```\n\nAuto-classify a skill:\n\n```bash\nnpx @anfeng1314/skill-linker install ./my-skill --category auto --json\n```\n\nIf auto classification is uncertain, the skill goes to `skills/incoming/<name>` and is not distributed by default.\n\n## Remove and Restore\n\nSoft removal deletes only managed symlinks. The source skill directory stays in the active tree.\n\n```bash\nnpx @anfeng1314/skill-linker remove neat-freak --apply\n```\n\nRestore a soft-removed skill by syncing it again:\n\n```bash\nnpx @anfeng1314/skill-linker --skill neat-freak --apply\n```\n\nRestore only one tool:\n\n```bash\nnpx @anfeng1314/skill-linker --skill neat-freak --tool codex --apply\n```\n\n`remove --purge` deletes the source directory after unlinking. After a purge, restore the source from Git or its upstream repository first, then run sync again.\n\n## Hermes\n\nHermes should discover skills through `skills.external_dirs`. On macOS/Linux this is usually `~/.hermes/config.yaml`:\n\n```yaml\nskills:\n  external_dirs:\n    - /Users/you/AI/skills/active\n```\n\nSkill Linker checks Hermes `external_dirs` and reports local shadow conflicts. It does not create new directory-level symlinks for Hermes.\n\n## Cross-Platform Configuration\n\nConfiguration priority is:\n\n1. CLI flags\n2. Environment variables\n3. Config file\n4. Auto-detection\n\nSupported environment variables:\n\n| Variable | Description |\n| --- | --- |\n| `AI_SKILLS_HOME` | Active skills root. |\n| `AI_HOST_HOME` | Home directory used to derive host tool skill directories. |\n\nConfig file locations:\n\n| Platform | Path |\n| --- | --- |\n| macOS/Linux | `$XDG_CONFIG_HOME/skill-linker/config.json` or `~/.config/skill-linker/config.json` |\n| Windows | `%APPDATA%\\skill-linker\\config.json` |\n\nExample config:\n\n```json\n{\n  \"sourceRoot\": \"/Users/you/AI/skills/active\",\n  \"home\": \"/Users/you\",\n  \"targetDirs\": {\n    \"codex\": \"/Users/you/.codex/skills\"\n  },\n  \"hermesConfigPath\": \"/Users/you/.hermes/config.yaml\"\n}\n```\n\nPowerShell example:\n\n```powershell\n$env:AI_SKILLS_HOME = \"$env:USERPROFILE\\AI\\skills\\active\"\nnpx @anfeng1314/skill-linker install .\\my-skill --category meta --json\n```\n\n## Publishing\n\nThis package is published as `@anfeng1314/skill-linker`.\n\nRelease flow:\n\n```bash\ncd <repo>/skills/active/skills/meta/skill-linker\nnpm version patch\ngit push origin main --tags\n```\n\nTags matching `skill-linker-v*` are published by GitHub Actions from `skills/active/skills/meta/skill-linker`. Configure npm Trusted Publishing once for repository `anfeng-crystal/ai-workspace` and workflow `publish-skill-linker.yml`.\n\n## Commands\n\n```bash\nskill-linker [options]\nskill-linker install <local-path-or-git-url> --category <category> [options]\nskill-linker remove <skill> [options]\nskill-linker diff <skill> [options]\nskill-linker update <skill|--all> [options]\nskill-linker history [options]\n```\n\nKey options:\n\n| Option | Description |\n| --- | --- |\n| `--source-root <path>` | Source skills root. Defaults to `AI_SKILLS_HOME` or the current active tree. |\n| `--home <path>` | Host home. Defaults to `AI_HOST_HOME` or `$HOME`. |\n| `--skill <name>` | Skill name or relative path. Repeat or use comma-separated values. |\n| `--tool <name>` | `codex`, `claude`, `junie`, `agents`, or `hermes`. |\n| `--category <name>` | `core`, `automation`, `kingdee`, `meta`, `incoming`, or `auto`. |\n| `--name <name>` | Override installed skill directory name. |\n| `--path <subdir>` | Use a subdirectory inside a Git source. |\n| `--apply` | Apply planned changes. Default is dry-run. |\n| `--json` | Print JSON output. |\n| `--purge` | Delete source directory after unlinking during `remove`. |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}