Skip to main content
AI Platform Monikers (APMs) are hierarchical string identifiers that describe AI platforms and tools that can consume AI•Pkg packages. They serve the same purpose as Target Framework Monikers (TFMs) in NuGet: they allow a single package to ship platform-specific content and allow the installer to select the most appropriate files for the current environment.

Moniker Syntax

APMs are lowercase alphanumeric strings with hyphens. The hierarchy is encoded in the moniker string itself — a parent is a prefix of its child, separated by -:
ai
ai-{platform}
ai-{platform}-{variant}
The root moniker is ai. Every moniker implicitly has ai as its ultimate ancestor.

Canonical Moniker Table

MonikerDisplay NameParentInstall PathVersioning
aiAll AI Platforms(root fallback only)Stable
claudeClaude (all)ai(parent group only)Stable
claude-codeClaude Codeclaude.claude/See Platform Versioning
claude-desktopClaude DesktopclaudeSee belowSee Platform Versioning
copilotGitHub Copilot (all)ai(parent group only)Stable
copilot-vscodeCopilot in VS Codecopilot.github/See Platform Versioning
copilot-githubCopilot on GitHub.comcopilot.github/Stable
cursorCursorai.cursor/Stable
windsurfWindsurfai.windsurf/Stable
continueContinueai.continue/Stable
opencodeOpenCodeai.opencode/Stable
aiderAiderai.aider/Stable
clineClineai.cline/Stable
zedZed AIai.zed/Stable

Claude Desktop Install Paths

Claude Desktop uses OS-specific config directories:
OSPath
macOS~/Library/Application Support/Claude/
Windows%APPDATA%\Claude\
Linux~/.config/claude/

Fallback Graph

The fallback graph defines which platform directories the installer checks, ordered from most specific to most general:
claude-code     →  claude  →  lib/shared
claude-desktop  →  claude  →  lib/shared
copilot-vscode  →  copilot →  lib/shared
copilot-github  →  copilot →  lib/shared
cursor          →  lib/shared
windsurf        →  lib/shared
continue        →  lib/shared
opencode        →  lib/shared
aider           →  lib/shared
cline           →  lib/shared
zed             →  lib/shared
Each step in the chain maps to a directory inside lib/. For example, claude-code maps to lib/claude-code/, claude maps to lib/claude/, and the terminal step always maps to lib/shared/.

Resolution Algorithm

Given a target APM T, build the chain:
1

Start with T

Begin the chain with [T].
2

Walk to parent

Find the parent of T in the canonical table. If a parent exists, append it to the chain and repeat until no parent remains.
3

Append shared

Append lib/shared (always last).
For file resolution, iterate the chain from end to start (least specific first), applying each lib/{entry}/ directory’s files. The last write wins, so most-specific files override less-specific ones.

Package Compatibility

A package is compatible with a target APM if any of the following are true:
  1. The package’s targets array in .aispec includes the target APM exactly, OR
  2. The package’s targets array includes a parent of the target APM (e.g., a package targeting claude is compatible with claude-code), OR
  3. The package’s targets array is empty or contains only ai (universal package).
Compatibility checking is performed by PlatformCompatibilityService in AI•Pkg.Core. See SDK Interface for the API surface.

Moniker Normalization

APMs are always lowercased. During ingestion and search, the server normalizes APM values:
  • Convert to lowercase
  • Strip leading/trailing whitespace
  • Reject any characters outside [a-z0-9-]
  • Reject monikers longer than 64 characters

Unknown Monikers

A package may declare a dependency on or include files for a moniker not in the canonical table. Installers must:
  • Warn (not error) when encountering an unknown moniker in targets[]
  • Silently skip unknown lib/{unknown-moniker}/ directories during installation
  • Not fail validation solely due to an unknown moniker (forward compatibility)
The registry server logs unknown monikers for monitoring purposes.

Moniker Registration

New monikers are added to the canonical table by opening a PR to the AI•Pkg spec repository. Requirements for a new moniker:
  1. Must have a public, documented plugin/extension system
  2. Must have a clearly defined install path
  3. Must be lower-kebab-case
  4. Must not conflict with an existing moniker or be a prefix of one

APM in Search Queries

The search endpoint accepts an apm query parameter that filters results to packages compatible with the specified platform:
GET /v3/search?q=mcp&apm=claude-code
The server expands claude-code to [claude-code, claude] using the fallback graph, then returns packages whose targets array intersects with the expanded set (plus universal packages targeting lib/shared/).

APM Stability Guarantees

MonikerStability
claude, claude-code, claude-desktopStable
copilot, copilot-vscode, copilot-githubStable
cursor, windsurf, continueStable
opencode, aider, cline, zedStable
Any other monikerProvisional until canonical registration
Stable monikers will not be removed or renamed. If a platform is discontinued, its moniker is deprecated (marked in the registry) but not deleted. For how platforms evolve over time and how breaking changes in host platforms are handled, see Platform Versioning.

Example: Multi-Platform Package Layout

A package that ships different skill files for Claude Code vs Copilot but shares a common prompt:
my-tool.1.0.0.aipkg
├── my-tool.aispec
└── lib/
    ├── shared/
    │   └── prompts/
    │       └── base-prompt.md          ← All platforms
    ├── claude-code/
    │   └── skills/
    │       └── my-tool.md              ← Claude Code only
    └── copilot/
        └── instructions/
            └── my-tool.md              ← All Copilot variants
  • base-prompt.md is installed (from lib/shared/)
  • skills/my-tool.md is installed (from lib/claude-code/)
  • instructions/my-tool.md is not installed (wrong platform)