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
| Step | Command | Note |
|---|---|---|
| Install the tool | curl -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 skills | apm 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 five | apm deps list -g ; apm uninstall -g _local/<name> for the 15 unneeded library skills + _local/pdf-tools-pro | 16 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 Codex | apm install -g -t claude,codex | APM 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
| Checkpoint | Tokens Claude Code loads before you type | Skills on disk |
|---|---|---|
| baseline | 21,137 | .claude/skills: 0 |
| installed-20 | 21,482 | .claude/skills: 20 |
| risky | 21,485 | .claude/skills: 21 |
| pruned | 21,277 | .claude/skills: 5 |
| synced | 21,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.