Skip to content

catalog ​

Declarative package manager for the pi coding agent. Manage your skills and extensions from a single cat.yaml file, sync across machines via GitHub Gist.

Installation ​

bash
pi install npm:@pi-stef/catalog

Quick Start ​

bash
/ct login          # Authenticate with GitHub (requires gh CLI)
/ct init           # Initialize catalog from installed packages
/ct add npm:@pi-stef/flow   # Add a package
/ct sync           # Install + push to gist

Hot-Reload ​

Commands that install, update, or remove packages (add, update, remove, disable, sync, pull) automatically reload extensions after a successful operation. New or updated tools are available immediately without restarting pi.

If the reload fails or is not available (e.g., when invoked via an LLM tool), you'll see a message asking you to restart pi for changes to take effect.

Command Reference ​

SubcommandDescriptionFlags
syncFull sync cycle: pull → reconcile → execute → push--dry-run, --force, --no-push, --profile=<name>
initInitialize catalog from installed packages or a gist--from-gist=<id>
addAdd a package to the catalog and install it--type=<t>, --scope=@pi-stef
removeRemove a package from the catalog--yes, --scope=@pi-stef
toggleToggle a package's enabled state—
enableEnable a disabled package—
disableDisable a package and uninstall it—
updateUpdate packages to latest versions--all
pushPush local catalog + lock to GitHub Gist--dry-run, --profile=<name>
pullPull remote catalog from gist and reconcile--dry-run, --profile=<name>
loginAuthenticate with GitHub via gh CLI—
statusShow catalog status with package listing—
diffShow diff between local and remote catalog—
verifyVerify catalog integrity—
profilesList all profiles with active indicator—
profileShow or switch active profile—
resetUninstall all @pi-stef packages and delete config--yes

cat.yaml Format ​

yaml
meta:
  pi_version: "0.70.0"
  activeProfile: default

packages:
  flow:
    source: "npm:@pi-stef/flow"
    type: skill
  atlassian:
    source: "npm:@pi-stef/atlassian"
    type: skill
    enabled: false

Package Fields ​

FieldRequiredDescription
source✓Package source URL (npm:… or git:…)
type—skill or pi-native
profile—Profile name this package belongs to
enabled—true (default) or false
companions—Array of companion source strings to auto-install

Companions ​

A package can declare required companion packages in its own package.json:

json
{
  "pi": {
    "companions": ["git:github.com/obra/superpowers"]
  }
}

When ct add installs such a package, it also installs each companion that isn't already installed. Companions resolve transitively (a companion may declare its own companions) up to a depth of 3, with de-duplication so each source installs at most once.

Setup Detection ​

Packages can include a .pi-setup.json file declaring requirements (environment variables, config files, CLI tools). After install or update, the catalog checks these requirements and warns if anything is missing.

Profiles ​

Profiles let you maintain different package sets for different machines or contexts. See Profiles & Sharing for details.

Configuration ​

FilePathPurpose
Catalog~/.pi/sf/catalog/cat.yamlDeclarative package manifest
Lock file~/.pi/sf/catalog/catalog.lock.jsonInstalled versions and hashes
Gist cache~/.pi/sf/catalog/Cached gist ID for sync

Development ​

bash
pnpm install
pnpm -F @pi-stef/catalog test
pnpm -F @pi-stef/catalog typecheck