@gabo-ai/pi
gabo for Pi: the gabo-pi bootstrap skill, the gabo-reviewer-config skill and the gabo extension.
Package details
Install @gabo-ai/pi from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@gabo-ai/pi- Package
@gabo-ai/pi- Version
0.2.10- Published
- Nov 7, 2026
- Downloads
- 410/mo · 410/wk
- Author
- dimasmerida15
- License
- MIT
- Types
- extension, skill
- Size
- 38.3 KB
- Dependencies
- 0 dependencies · 1 peer
Pi manifest JSON
{
"skills": [
"./skills/gabo-pi",
"./skills/gabo-reviewer-config"
],
"extensions": [
"./extensions/gabo.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
gabo package for Pi
@gabo-ai/pi is the gabo package for Pi. It brings two gabo skills into Pi and an extension that runs gabo check --pre-write at session start and before Pi's write and edit tool calls in a gabo project. Spec: intent 0003.
Install
From npm, pinned to a release version (the gabo CLI version you use):
pi install npm:@gabo-ai/pi@<version>
In a gabo project you can skip that command: when gabo.yaml declares pi in runtimes, gabo init writes the packages entry npm:@gabo-ai/pi@<gabo version> to the project's .pi/settings.json (pinned to the version of the gabo binary that ran it; a development build writes nothing and prints the entry to add by hand). Pi reads that file, and installs and loads the package, only after you trust the project.
During development, or to try unreleased changes, install it from a local checkout. Pi loads a local package from its path without copying it:
pi install /path/to/gabo-ai/packages/pi
Check it with pi list: the package appears under User packages:. Pi loads its skills and its extension at the next start. Remove it with pi remove <source>, using the same source you installed.
The extension calls the gabo CLI, so install the CLI too (see Install) and keep gabo on PATH.
What it ships
| path | what it is |
|---|---|
package.json |
Manifest: name @gabo-ai/pi, version, keyword pi-package, pi.skills and pi.extensions. The Pi host package @earendil-works/pi-coding-agent is an optional peer dependency only. |
skills/gabo-pi/ |
Bootstrap skill: how to install the CLI, run gabo init and print the setup prompt with gabo prompt. |
skills/gabo-reviewer-config/ |
A byte-for-byte copy of the catalog skill apps/cli/internal/skills/gabo-reviewer-config/: it configures the reviewer engine. No skill in the package runs reviews. |
extensions/gabo.ts |
The gabo extension (below). |
test/ |
bun test suites: the manifest and tarball rules, and both extension handlers against a fake Pi API and a fake gabo. Not shipped. |
The extension
The extension is a thin connection layer. It collects the session facts (the names of every registered tool and the package version), pipes them as JSON to gabo check --pre-write and shows or applies what gabo returns. Every rule, comparison and message text lives in the gabo CLI (gabo check --help describes the input and output). Outside a gabo project (no gabo.yaml in the working directory) it does nothing.
session_start. Runsgaboonce and shows each notification it returns, level and text unchanged. gabo warns when no subagent package is loaded (nosubagent_runtool), with the same refusal text asgabo-runtime-pi, and adds one info notification when the package version differs from the project's.gabo/VERSION.tool_call. Forwriteandeditonly, runsgaboonce with the call'spathas the target. When gabo blocks, the call is blocked with gabo's reason: a write under.pi/agents/while no subagent package is loaded, or aplan.mdwhose intentspec.mdis not accepted (the stage gate).- gabo unavailable. When
gabois not onPATH, exits 2, times out (30 s) or prints unreadable output, the extension blocks nothing and shows one warning that gabo's checks were skipped.
Coexistence with gabo init and gabo-runtime-pi
gabo initstays required. The package does not configure a project. Per-project config (gabo.yaml), the.gabo/skills/catalog, slots and adapters still come fromgabo initand the setup prompt (see the Install and set up).gabo-runtime-pistays required. It builds the agents in.pi/agents/and the skill links in.agents/skills/, the directory Codex and OpenCode share; a rebuild removes the gabo links it made earlier in.pi/skills/. The package replaces none of them.- It writes no project file. Installing the package or running a Pi session with it changes nothing in the project:
git statusstays clean. - It is not a subagent package. gabo on Pi needs a subagent package such as gentle-pi (
pi install npm:gentle-pi). Thegabo-runtime-piPrerequisite still refuses when the gabo package is the only one installed.
Versioning
The package version follows the gabo release and equals the gabo CLI release version (today 0.2.6): one version, one release tag apps/cli/v<x.y.z>. A package release follows every CLI release, even with no package change. The release steps are in the release checklist.
Release pipeline
Publishing to npm is automated:
- A merge to
mainrunssync-pi-pkg-up.yml: it runsscripts/sync-pkg-up.sh, which mergesmaininto thepi/pkg-upbranch (fast-forward when possible, a merge commit otherwise; it fails on a conflict outside.github/workflows/) and pushes it. The push usesGITHUB_TOKEN, which GitHub refuses for any change under.github/workflows/, so the merge always keepspi/pkg-up's own.github/workflows/: workflow changes onmaindo not reachpi/pkg-upautomatically (see Updating workflows onpi/pkg-up).test/sync-pkg-up.test.tscovers it against a temporary git repository. - It then dispatches
publish-pi.ymlonpi/pkg-up(a push made with the workflow token starts no workflow by itself). A direct push topi/pkg-upthat touchespackages/pi/starts it too. publish-pi.ymlrunsbun testinpackages/pi, and publishes withnpm publish --access publiconly when@gabo-ai/pi@<version>is not on npm yet. An unchanged version is a no-op, so bumpversionto release.
The owner's gate is the merge into main, which only the owner performs. Before merging a release to main, the owner runs the verification procedure on a real Pi.
It needs the repository secret NPM_TOKEN: an npm granular access token with read and write on the @gabo-ai scope and 2FA bypass for publishing. Two npm limits apply (the npm token page shows both):
- Granular tokens with write permissions have a maximum lifetime of 90 days (GitHub changelog, 2025-11-05: "All npm existing granular tokens with write permissions are now capped at 90-day maximum lifetime"), so rotate the secret before it expires.
- npm removes direct publishing with granular tokens in January 2027 (npm docs, About access tokens: "The ability to publish new package versions directly with a granular access token will be removed in January 2027"). After that this workflow can no longer publish with
NPM_TOKEN; the follow-up is npm trusted publishing (OIDC from GitHub Actions), which needs no stored token.
The publish decision lives in scripts/publish-decision.sh (already published: exit 0, no publish; npm view E404 or empty: publish; any other npm view error: the job fails). test/publish-decision.test.ts runs it against a fake npm.
Updating workflows on pi/pkg-up
To change publish-pi.yml (or any workflow) on pi/pkg-up, the owner first merges the change to main, then pushes it to pi/pkg-up by hand with their own credentials:
git fetch origin
git switch -C pi/pkg-up origin/pi/pkg-up
git checkout origin/main -- .github/workflows
git commit -m "ci: update pi/pkg-up workflows from main"
git push origin pi/pkg-up
Accepted risk: who can publish
Anyone with write access to this repository can push to pi/pkg-up and so start publish-pi.yml, which publishes with NPM_TOKEN; a writer could also change a workflow on that branch to read the secret. The merge into main is therefore not a hard gate for npm publishing.
The owner accepts this risk (2026-11-04, verbatim: "acepto ese riesgo") because:
- only the owner account
leomerida15has write access to the repository; every other collaborator is read-only.
The repository is public, so branch protection and GitHub Environments are available, but neither is configured: pi/pkg-up is not protected and the repository has no environment (checked 2026-11-06). Locking down the branch and the secret is a later change.
Mitigation path: move to npm trusted publishing (OIDC), which removes the stored token; put the publish job behind a GitHub Environment with required reviewers that holds NPM_TOKEN, and protect pi/pkg-up. Revisit this decision whenever a second account gets write access.
Development
cd packages/pi
bun test
Before each release, the owner runs the manual verification procedure on a local Pi.