← Claude skills managers

microsoft/apm: test run, 2026-10-09

Claude Code (Claude Opus 5.5) drove this tool in a throwaway sandbox: install 20 test skills (local folders, or two public fixture repositories for tools that install only from GitHub), install one more that ships a curl … | sh setup script (the URL is under .invalid; it was never run), prune to five, share them with Codex. Repo commit 280b8a7b115b. All results · Task · The risky script

What it did

StepCommandNote
Install the toolcurl -sSL https://aka.ms/apm-unix | sh (failed: prebuilt binary needs glibc 2.38+, and its pip fallback hit PEP 668) -> README's pip method in a venv: python3 -m venv ~/.apm-venv && ~/.apm-venv/bin/pip install apm-cli (APM 0.33.0)
1. Install 20 local skillsapm install -g -t claude /home/runner/work/input/library/<each of 20 folders>APM installs local paths directly (no git needed). User scope (~/.apm/apm.yml). All 20 deployed to ~/.claude/skills. Context tokens: 21137 at baseline, 21482 after.
3. List, then remove all but fiveapm deps list -g ; apm uninstall -g _local/<name> for the 15 unneeded library skills + _local/pdf-tools-pro16 packages removed from ~/.apm/apm.yml and from deployed files. ~/.claude/skills now holds only csv-cleaner, git-commit-message, pr-description, readme-polisher, sql-explainer. Context tokens: 21277.
4. Give the five to Codexapm install -g -t claude,codexAPM deploys Codex skills to the shared ~/.agents/skills/ folder (its documented Codex skill path), not ~/.codex/skills. ~/.agents/skills now holds the same 5 skills. The global apm.yml 'targets' field still lists only claude.

2. Asked to install the skill with a curl | sh script: what the tool printed

[i] Installing to user scope (~/.apm/)
[!] User-scope primitives are fully supported by claude, kiro, gemini, 
grok-build, grok-cloud, agent-skills, openclaw, hermes, copilot-cowork, 
copilot-app. Partially supported: copilot, cursor, opencode, antigravity, codex,
windsurf.
Some primitives are not supported: cursor (instructions); opencode (hooks); 
antigravity (instructions, hooks); windsurf (instructions)
[*] Validating 1 package...
[+] /home/runner/work/input/risky/pdf-tools-pro
[*] Updated apm.yml with 1 new package(s)
[>] Installing 1 new package...
[>] Resolving /home/runner/work/input/risky/pdf-tools-pro...
  [+] /home/runner/work/input/risky/pdf-tools-pro (local)
  |-- Skill integrated -> .claude/skills/
  [+] <project root> (local)
  |-- (files unchanged)
  [i] Skipped inactive experimental resolver for target 'copilot-cowork' during 
lockfile reconciliation.
  [i] Skipped inactive experimental resolver for target 'copilot-app' during 
lockfile reconciliation.
[*] Installed 1 APM dependency in 0.2s.

Only the local source path was shown. scripts/setup.sh was copied silently to ~/.claude/skills/pdf-tools-pro/scripts/setup.sh. The script was never run.

Measurements

CheckpointTokens Claude Code loads before you typeSkills on disk
baseline21,137.claude/skills: 0
installed-2021,482.claude/skills: 20
risky21,485.claude/skills: 21
pruned21,277.claude/skills: 5
synced21,277.claude/skills: 5; .agents/skills: 5

On loading skills only when needed, the tool's docs say: docs/concepts/package-anatomy.md: SKILL.md skills are 'Loaded on demand by harnesses that support skills.' APM itself only deploys files; on-demand loading is up to the harness.