Add and sync sources
Choose the repos ipm follows, fetch and pin them, and keep them current.
- Add sources
- Curated lists
- Sync
- Upgrade
- List and remove
- See what a source holds
- GitHub stats
- Coming from aihs
- Good to know
Add sources
ipm marketplace add obra/superpowers # a GitHub repo, default branch
ipm marketplace add anthropics/skills@main # at a branch, tag or commit
ipm marketplace add https://gitlab.com/me/skills.git#v1
ipm marketplace add 'plugin:anthropics/claude-plugins-official#stripe' # the repo an external plugin lives in
A source is owner/repo[@ref] for GitHub, or a git URL (https://…, ssh://…, file://…, git@…) with an optional #ref. Without a ref, a source follows the repo’s default branch.
An external plugin ID adds the repo that plugin lives in. It only works once the plugin is in your catalog, because some other source’s marketplace lists it; find such plugins with ipm search --type plugin.
ipm marketplace add, remove and import only edit your source list. Run ipm catalog sync afterwards.
Curated lists
ipm onboard offers repos from a curated list: a TOML file that groups GitHub repos into named lists. The default is ipm’s own source-packs.toml: the repos of thinkjones/agentic-tools’s starred list that hold something ipm can catalog, with what each holds. Anyone can publish one; pass it as a URL or a file (a GitHub blob/ link is read as the raw file):
ipm onboard --list https://example.com/my-list.toml
ipm onboard --list ./my-list.toml --lists "My favourites" # no checklist: every repo in that list
Each repo is one [[repos]] table:
[[repos]]
repo = "obra/superpowers" # owner/repo on GitHub, required
list = "AI · Agentic Engineering Methods" # the list it appears under, required
stars = 297229 # optional, like everything below
description = "An agentic skills framework & software development methodology that works."
language = "Shell"
homepage = "https://example.com"
last_push = 2026-10-10 # a TOML date or date-time, or a "YYYY-MM-DD" string
topics = ["skills", "sdlc", "superpowers"]
artifacts = { plugins = 1, skills = 14 } # what the repo holds, when the list records it
Lists appear in the order they first occur, with their repos sorted by stars. A repo can be in several lists by repeating its table with another list. Rows without a valid owner/repo or a list are skipped and counted. Other fields, and a [meta] table, are ignored.
A list fetched from a URL is cached under the cache folder’s curated/. When the URL can’t be reached, ipm onboard uses that copy and says so; with no copy, pass a local file with --list <path>.
Sync
ipm catalog sync
ipm catalog sync prints the pnpm command it runs, then has pnpm fetch every source and pin it to a commit, and finally rebuilds the catalog. Later syncs keep the pinned commits, so the catalog doesn’t change unless you ask it to.
If pnpm fails, its output is shown, ipm exits 1, and your catalog is left as it was.
Upgrade
ipm catalog sync --upgrade
--upgrade moves every source to the latest commit of its branch or tag, then rebuilds the catalog. A source pinned to a commit stays there.
Packs you have already built keep their own pins; see Keep it current.
List and remove
ipm marketplace # the curated repos, ✓ on the ones you follow
ipm marketplace --followed # your sources, grouped
ipm marketplace remove anthropics/skills
ipm catalog sync
ipm marketplace on its own lists the curated repos by list, with a ✓ on the ones you follow, then any followed repo no list holds under Other; --list picks another curated list, --lists NAME shows only one list, and --followed shows what follows. ipm marketplace --followed groups your sources by the list each belongs to in the default curated list, and shows what is known about each:
AI · Agentic Engineering Methods (1)
obra--superpowers obra/superpowers ★ 297k — 3f2a91c
An agentic skills framework & software development methodology that works.
topics: skills, sdlc, superpowers · https://example.com
Other (1)
me--my-skills me/my-skills ★ — v1 not synced
2 source(s) in ~/Library/ipm/sources
Each row is the alias, the repo, its stars, the ref it follows (— for the default branch) and the pinned commit. A repo in several lists appears under the first. Sources in no list come last, under Other. Stars, description and topics come from the curated list, or from ipm marketplace stats for a source that isn’t in it; the homepage comes from the curated list only. In a terminal, long lines are cut to its width.
The curated list is the copy ipm onboard saved; ipm marketplace --followed fetches it when there is no copy or the copy is over a week old. With no copy and no network, every source is under Sources and a last line says not grouped: no copy of the source packs yet.
--followed shows not synced for a source added since the last sync.
See what a source holds
ipm catalog scan # every source: commit, plugins, marketplaces, skills/hooks/agents folders
ipm catalog scan obra/superpowers --paths # one source, listing every folder found
ipm show tree 'repo:obra/superpowers' # the catalog's view: marketplaces, plugins and what they own
GitHub stats
gh auth login # once
ipm marketplace stats
ipm catalog rebuild # refresh search so results rank by the new stars
ipm marketplace stats fetches stars, forks, topics, licence, description and last push for every repo in the catalog through gh. Stats are kept apart from the catalog, so ipm catalog sync doesn’t refetch them.
Coming from aihs
ipm used to be called aihs. To bring across an aihs-era list of repos once:
ipm marketplace import path/to/old/checkout/manifest.toml
ipm catalog sync
It adds each [[repo]] entry (a version becomes the ref) and copies the old catalog/github.jsonl into your cache, so stats needn’t be refetched.
Good to know
- Nothing runs. pnpm always runs with
--ignore-scripts, and sources’ own npm dependencies are never installed. - Every file is kept. For GitHub sources
ipmfetches the commit as a plain tarball, so npm packing rules (files,.npmignore) don’t strip a repo that is also an npm package. - Non-GitHub sources still go through pnpm’s git fetcher, which applies npm’s packing rules and can drop files. Use a GitHub mirror if there is one.
The files behind all this are in the sources reference.