Skip to main content

Getting Started

This guide walks through installing asrpm, configuring it for your chain of choice, and running your first commands.

Prerequisites

  • macOS or Linux (Windows builds are not currently published)
  • For build-from-source: Go 1.24 or later
  • For authoring commands (register, publish): a Foundry keystore at ~/.foundry/keystores/<name> or an ASRPM_PRIVATE_KEY environment variable

Installation

Homebrew (macOS, Linux)

brew install vorpalengineering/tap/asrpm

Prebuilt binary

Download a tarball for your platform from the GitHub releases page and place the extracted asrpm binary somewhere on your PATH.

Go install

go install github.com/vorpalengineering/asrpm/cmd/asrpm@latest

Build from source

git clone https://github.com/vorpalengineering/asrpm
cd asrpm
go build -o asrpm ./cmd/asrpm

Quick Start

asrpm ships with defaults pointing at the canonical Sepolia deployment of the ASR contracts, so read-only commands work out of the box.

Inspect a skill

resolve is read-only and requires no signer. It fetches the manifest, verifies the manifestHash commitment, and prints the result.

asrpm resolve 0

Add --json to emit the raw manifest, or --verbose for full URIs and integrity values.

Install a skill

install resolves the skill, verifies every integrity hash along the way, and writes the matching target's body to ~/.claude/skills/<sanitized-name>/SKILL.md:

asrpm install 0
# Restart Claude Code to load the new skill.

The default install target is claude-code (v1 supports this target only). Add --scope project to install under the current project's .claude/skills/ directory instead of the user-level location.

List installed skills

asrpm list
asrpm list --json

Refresh a skill

update re-resolves a previously-installed skill and rewrites its body if the onchain version has changed.

asrpm update 0

Re-running update when already at the latest version is a no-op.

Uninstall

asrpm uninstall <name|skillId>

The CLI looks up the install in the local index. Pass --force to remove a directory not managed by asrpm.

Configuration

The configuration file lives at ~/.asrpm/config.json and is created on the first asrpm config set … call (mode 0600). Environment variables always override file values. Multiple fields can be set in a single call.

Configuration keys

KeyEnv varDefaultPurpose
rpc_urlASRPM_RPC_URLhttps://ethereum-sepolia-rpc.publicnode.comJSON-RPC endpoint for the target chain
skill_registryASRPM_SKILL_REGISTRY0x8239AAbaa1A44338bEeFAAf4C3a373d2a18D5DC4 (Sepolia)SkillRegistry contract address

Inspecting current configuration

asrpm config
asrpm config --json
asrpm config get rpc_url

Updating configuration

asrpm config set \
--rpc-url <RPC_URL> \
--skill-registry <SKILL_REGISTRY_ADDRESS>

Pass --registry <addr> on any read or write command to override the configured registry for a single invocation.

The config file never stores private keys or other secrets.

Wallet Handling

asrpm deliberately does not manage its own keystore. Write commands (register, publish) accept signing material from one of two sources, both of which keep plaintext keys off disk under the CLI's control.

Pass --account <name> to load and decrypt ~/.foundry/keystores/<name> after prompting for the password on stdin:

asrpm register \
--manifest path/to/manifest.json \
--uri https://gateway.pinata.cloud/ipfs/<cid> \
--account my-keystore

Foundry (cast, forge) is the keystore custodian; asrpm only borrows the decrypted key for the duration of signing a transaction.

Environment variable (CI and local development)

Set ASRPM_PRIVATE_KEY to a raw hex private key. A warning is printed on use.

export ASRPM_PRIVATE_KEY=0x1234567890abcdef...
asrpm register --manifest path/to/manifest.json --uri https://example.com/manifest.json

--account always takes precedence over ASRPM_PRIVATE_KEY when both are present.

Read-only commands (resolve, verify, list) never require a signer.

URI Schemes

Manifests and target bodies must use one of the supported URI schemes:

SchemeNotes
https://Recommended for hosted content.
http://Supported but discouraged.
data:Inline content (base64 or URL-encoded). Recommended for small bodies; lets the manifest be fully self-contained.

The ipfs:// scheme is not supported. Use the HTTPS gateway URL your pinning provider serves (e.g. https://gateway.pinata.cloud/ipfs/<cid> or https://ipfs.io/ipfs/<cid>). Integrity is verified against the manifest's manifestHash and per-target integrity regardless of gateway choice.

Next Steps