A Git-based package manager designed for AI-assisted development, similar to npm but supporting skills, agents, commands, hooks, and any AI resource types.
- π¦ Two Project Modes: Publish project (
aspub.yaml) and consumer project (aspkg.yaml) - π Distributed Dependency Management: Reference packages directly via Git URL, no central registry needed
- π·οΈ Flexible Version Control: Support for Git tag/branch/commit
- π₯ Simplified Version Rules: Auto-selects the maximum version satisfying all dependencies
- π§ Universal Design: Not limited to skills, supports any AI resource type
- π Multi-Format Support: Install both aspm packages and Claude Code plugin repositories
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/arkylab/aspm/main/scripts/install.sh | shWindows (PowerShell):
irm https://raw.githubusercontent.com/arkylab/aspm/main/scripts/install.ps1 | iexgit clone https://github.com/arkylab/aspm.git
cd aspm
cargo build --releaseThe compiled binary will be at target/release/aspm (or aspm.exe on Windows).
# Initialize a consumer project
aspm init --consumer
# This creates aspkg.yaml# Installation target directory
install_to:
- .claude # Install to Claude Code plugin directory
dependencies:
superpowers:
git: "https://github.com/obra/superpowers.git"
branch: "main"aspm install
# After running `aspm install`, all dependencies are ready. If you are using Claude Code, you can now restart Claude code to load the new skills. Sometimes, you may need to restart it twice.β That's all you need to do as a skill consumer
Publish projects allow you to share your AI resources with others.
Supported Repository Formats:
| Format | Description | Recommended |
|---|---|---|
| aspm Format | Repository with aspub.yaml at root |
β Yes |
| Claude Plugin Format | Repository with skills/, agents/, etc. directories at root |
|
| Single Skill Format | Repository with only SKILL.md at root |
aspm recommends the aspm Format because it provides:
- β Explicit control over what gets published
- β Support for transitive dependencies
- β Automatic dependency resolution
# Initialize a publish project
aspm init my-skill-pack
# This creates aspub.yaml (publish configuration).
# aspub.yaml and aspkg.yaml can coexist in the same project - one for publishing your own resources, one for consuming dependencies.name: my-skill-pack
version: 1.0.0
description: "A pack of useful AI resources"
author: "Your Name"
license: MIT
# Install target for this package's own dependencies (optional)
install_to:
- .claude
# Dependencies (optional)
dependencies:
core-utils:
git: "https://github.com/user/utils.git"
tag: "v1.0.0"
# Resources to publish (paths relative to aspub.yaml location)
publish:
skills:
- skills/brainstorming/
- skills/writing-plans.md
commands:
- commands/code-review.mdThe directory structure is fully customizable via aspub.yaml:
# aspub.yaml
name: my-skill-pack
version: 1.0.0
# Publish specific resources with optional regex patterns
# Paths are relative to aspub.yaml location
publish:
skills:
- skills/brainstorming/ # match directory (trailing /)
- skills/writing-plans.md # match file
- "skills/^test-.*/" # regex: match directories starting with test-
commands:
- commands/code-review.md # match fileCorresponding directory structure:
my-skill-pack/
βββ aspub.yaml
βββ skills/
β βββ brainstorming/
β β βββ SKILL.md
β βββ writing-plans.md
β βββ test-helpers/ # matched by "^skills/test-.*/"
βββ commands/
βββ code-review.md # file (no trailing /)
Publish Path Rules:
| Pattern | Behavior |
|---|---|
skills/brainstorming |
Match skills/brainstorming file only |
skills/brainstorming/ |
Match skills/brainstorming/ directory only (trailing /) |
skills/^test-.*/ |
Regex - match directories under skills/ starting with test- |
commands/^.*\.md$ |
Regex - match all .md files |
Regex is auto-detected when path contains metacharacters: ^ $ . * + ? [ ] ( ) { } | \
aspm supports three repository formats:
Repositories with aspub.yaml at root. This is the recommended format because:
- β Explicit control over what gets published
- β Support for selective publishing (only specified resources)
- β Transitive dependency support
Repositories without aspub.yaml but with resource directories at root:
superpowers/
βββ .claude-plugin/
β βββ marketplace.json
βββ skills/
β βββ brainstorming/
β βββ SKILL.md
βββ agents/
βββ commands/
βββ hooks/
βββ rules/
# aspkg.yaml
dependencies:
superpowers:
git: "https://github.com/obra/superpowers.git"
branch: "main"Repositories with only a SKILL.md file at root (no standard directories). aspm auto-wraps it in a skills/ directory structure during installation.
aspm supports two installation modes:
Copies resources to <target>/<type>/<pkg>/:
.agents/
βββ skills/
β βββ my-pack/
β βββ my-skill/
βββ commands/
Note: Supported directories: skills, agents, commands, hooks, rules
Copies entire repo to <target>/-plugins/<pkg>/ and updates settings.local.json:
.claude/
βββ -plugins/
β βββ my-pack/
β βββ .claude-plugin/
β β βββ marketplace.json
β βββ skills/
βββ settings.local.json
Note: If the source repository lacks .claude-plugin/marketplace.json, aspm auto-generates it with the package name as marketplace name (suffixed with -dev).
# Multiple targets with auto mode: .claude path β Claude mode, others β Plain mode
install_to:
- .claude
- .agents
# Or
# Explicit mode configuration
# install_to:
# - path: .claude
# mode: claude
# - path: .agents
# mode: plain
dependencies:
superpowers:
git: "https://github.com/obra/superpowers.git"
branch: "main"All packages are installed with namespace isolation to prevent conflicts. Example with install_to: [.claude, .agents]:
.claude/ # Claude mode (auto-detected)
βββ -plugins/
β βββ superpowers/ # Package name
β βββ commands/
β βββ skills/
β β βββ brainstorming/
β β β βββ SKILL.md
β β βββ writing-plans/
β β βββ SKILL.md
β βββ .claude-plugin/
β βββ marketplace.json
βββ settings.local.json # Updated with plugin paths
.agents/ # Plain mode (auto-detected)
βββ skills/
β βββ superpowers/ # Package name as subdirectory
β βββ brainstorming/
β β βββ SKILL.md
β βββ writing-plans/
β βββ SKILL.md
βββ commands/
βββ superpowers/
# Initialization
aspm init <name> # Create a publish project
aspm init --consumer # Create a consumer project
# Dependency Management
aspm install # Install all dependencies
aspm install --to <dir> # Install to specific directory
aspm install --extra <file> # Merge extra config
aspm install --aspkg <file> # Use custom aspkg.yaml path
aspm install --extra local.yaml --to .cursor --aspkg ./config/aspkg.yaml # Combined options
aspm add <name> --git <url> # Add dependency (auto-detect default branch)
aspm add <name> --git <url> [--branch | --tag | --commit] <ref> # Add with specific branch or tag or commit
aspm add <name> --git <url> --aspkg <file> # Add to specific aspkg.yaml
aspm add <name> --git <url> --aspub # Add to aspub.yaml
aspm add <name> --git <url> --overwrite # Overwrite existing dependency
aspm remove <name> # Remove dependency
aspm remove <name> --aspkg <file> # Remove from specific aspkg.yaml
aspm remove <name> --aspub # Remove from aspub.yaml
# Cache Management
aspm cache clean # Clear all cached repositories
aspm cache dir # Show cache directory
aspm cache list # List cached repositoriesname: my-skill-pack
version: 1.0.0
description: "A pack of useful AI resources"
author: "Your Name"
license: MIT
# Install target for this package's own dependencies
# Required if you have dependencies defined below
install_to:
- .claude
# Resources to publish (paths relative to aspub.yaml location)
# Supports regex patterns (auto-detected by metacharacters)
publish:
skills:
- skills/brainstorming/ # match directory (trailing /)
- skills/writing-plans.md # match file
- "skills/^test-.*/" # regex: match directories starting with test-
commands:
- commands/code-review.md # match file
# Dependencies (optional)
dependencies:
core-utils:
git: "https://github.com/user/utils.git"
tag: "v1.0.0"# Global install targets (used if dependency has no own install_to)
install_to:
- .claude
dependencies:
my-skill-pack:
git: "https://github.com/user/pack.git"
tag: "v1.0.0"
# Optional: override global install_to for this dependency
install_to:
- .cursorUse --extra to merge additional dependencies (extra file overrides aspkg.yaml):
# extra.yaml
install_to:
- .cursor
dependencies:
my-skill-pack:
git: "https://github.com/user/pack.git"
branch: develop
install_to:
- .cursoraspm install --extra extra.yamlaspm uses simplified version rules:
- Auto-selects the maximum version satisfying all dependencies
- Tags/branches matching version format (e.g.,
v1.0.0) participate in version comparison
dependencies:
skill-a:
git: "https://..."
tag: "v1.2.0" # Exact tag
skill-b:
git: "https://..."
branch: "develop" # Specific branch
skill-c:
git: "https://..."
commit: "a1b2c3d4" # Exact commitMIT