@jaybeeuu/agent-cortex
Personal PI package with custom agents, skills, and extensions
Package details
Install @jaybeeuu/agent-cortex from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@jaybeeuu/agent-cortex- Package
@jaybeeuu/agent-cortex- Version
1.40.0- Published
- Sep 13, 2026
- Downloads
- 390/mo · 133/wk
- Author
- jaybeeuu
- License
- MIT
- Types
- extension, skill
- Size
- 1,018.2 KB
- Dependencies
- 0 dependencies · 0 peers
Pi manifest JSON
{
"extensions": [
"./extensions"
],
"skills": [
"./skills"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
agent-cortex
A personal collection of custom agents and skills, shipped to three harnesses from one source: the GitHub Copilot CLI, pi, and Claude Code (as a plugin).
Structure
agent-cortex/
├── plugin.json # Copilot plugin manifest
├── agents/ # Canonical agents — composable <name>/ dirs (see agents/README.md)
│ ├── *.agent.md # ralph, ralph-plan, plan, strategy — GENERATED from <name>/ by scripts/build-copilot-agents.mjs
│ ├── ralph/ # composable form (shared agent.md + per-harness pi/, copilot/, claude/)
│ ├── plan/ # "
│ ├── ralph-plan/ # "
│ └── strategy/ # "
├── agents-native/ # Claude-only agents with no Copilot equivalent
│ └── ralph.md # the lean Claude Ralph
├── skills/ # Skills (grouped by domain) — shared by all harnesses
│ ├── engineering/ # tdd, improve-codebase-architecture, …
│ ├── planning/ # write-a-prd, prd-to-tasks, design-an-interface, …
│ ├── productivity/ # bd-tool, write-a-skill, grill-me, …
│ ├── review/ # review-security, refactor-skill, maintain-agent-docs
│ ├── style/ # style-code, style-tests, style-comms, style-documentation
│ └── workflow/ # ralph, run-pipeline-stage, create-task, …
├── extensions/ # pi extensions (pi only)
│ ├── agent-modes/ # switchable agent modes (reads composable agents/)
│ ├── skill-stats/
│ └── notify/
├── pi/ # Global pi configuration (see below)
│ └── settings.json
├── token-map.json # canonical tool/path/agent names per harness (install-time token substitution)
├── token-map.README.md # design decisions behind token-map.json
├── bin/
│ ├── agent-cortex.mjs # CLI entrypoint
│ └── installers/
│ ├── copilot.mjs # shared generator: agent-cortex install copilot + scripts/build-copilot-agents.mjs
│ └── claude.mjs # materialises ~/.agent-cortex/claude + registers with Claude Code (--output <dir> = generate-only form)
├── scripts/
│ └── build-copilot-agents.mjs # thin wrapper over bin/installers/copilot.mjs (regenerates agents/*.agent.md)
└── claude-extras/ # Hand-authored Claude plugin extras (no committed claude/ output)
├── .mcp.json # MCP servers (context7, github) — copied into installs
└── scripts/ # statusline-command.sh — copied into installs (executable)
The same agents/ and skills/ power three harnesses (Copilot, pi, Claude Code).
The composable agents/<name>/ directories are the single source of truth; the flat
agents/*.agent.md files are generated by the shared copilot installer
(agent-cortex install copilot, or scripts/build-copilot-agents.mjs via
pnpm build:copilot — both run the same bin/installers/copilot.mjs code path, so
install-time and build-time output can never diverge) and committed so Copilot CLI
(plugin.json agents: "agents/") and pi keep loading the agents — don't hand-edit them.
The {{TOOL:...}} / {{PATH:...}} tokens written in agent and skill files are resolved
per harness at install time from token-map.json, the single source of truth for
canonical tool/path/agent names (see token-map.README.md and the contract section).
The Claude plugin is materialised at install time by bin/installers/claude.mjs. A
plain agent-cortex install claude copies the plugin into the home install root
(~/.agent-cortex/claude), writes a marketplace manifest at
~/.agent-cortex/.claude-plugin/marketplace.json exposing it, and registers it with
Claude Code by driving the claude plugin CLI — state-checked and idempotent (a fresh
install adds the marketplace + installs the plugin; a re-run updates what state says is
out of date; a repeat install at the same version is a no-op; a missing or pre-v2 CLI
warns and prints the manual registration commands instead of failing). The repo commits
no claude/ output (hand-authored extras live in claude-extras/), so CI validates the
materialiser itself — a temp-dir install plus structural checks:
- Skills stay single-source — the installer copies each
skills/<group>/<name>/dir flat intoskills/<name>/(Claude discovers skills only one level deep) with{{TOOL:...}}/{{PATH:...}}tokens substituted against token-map.json's claude column — no symlinks, so literal tokens never reach Claude. - Agents can't be shared files (the frontmatter formats differ), so the materialised
plugin's
agents/*.mdare composed from the canonicalagents/<name>/directories'claude/harness dirs (frontmatter.json + section files), exactly like the Copilot flats are composed from theircopilot/dirs. Claude only loads agents from a plugin's defaultagents/dir, so the plugin ships them at its own root (default~/.agent-cortex/claude/agents/) — isolating them from the Copilot.agent.mdfiles. - Claude-native agents that have no Copilot equivalent live in
agents-native/*.mdand are copied verbatim into the materialised plugin'sagents/.ralphis one: it is reimplemented for Claude around background workers + an independent review gate (the Copilot Ralph'stask/read_agentpoll loop has no Claude equivalent), so it can't be mechanically converted. - Manifests are generated too: the plugin's
.claude-plugin/plugin.json(itsversiontrackspackage.json, so it never goes stale) andhooks.json(copied from the canonicalhooks/claude/hooks.jsonsource), plus any support files underhooks/claude/bundled into the plugin'shooks/so hook commands can reach them via$CLAUDE_PLUGIN_ROOT. Hand-authored extras —.mcp.jsonandscripts/— are copied into every install from theclaude-extras/dir, which is their canonical store. Seedocs/claude-hooks.mdfor the extension→hook mapping and the rejections (auto-name, skill-stats, subagent, agent-modes).
Edit the sources (agents/<name>/ composable dirs, agents-native/*.md, skills/**,
hooks/claude/, claude-extras/, package.json), never the generated
agents/*.agent.md files or anything under the materialised ~/.agent-cortex/claude.
CI
The CI pipeline runs lint, test, and claude-plugin-check as three parallel jobs
(lint, test, claude-plugin-check), each gated on needs: setup. Each job
does its own checkout and pnpm install rather than sharing build artifacts from
the setup job — pnpm workspace symlinks don't survive artifact upload/download,
so artifact sharing would break the workspace resolution that the build depends on.
The repo commits no generated claude/ output, so the claude-plugin-check job
validates the Claude plugin materialiser instead of diffing a committed mirror:
it runs node bin/agent-cortex.mjs install claude --output <tmp dir> and checks the
result structurally — plugin.json version tracks package.json, every generated and
hand-authored piece is present, no literal {{TOOL:...}}/{{PATH:...}} tokens survive,
and no symlinks leak into the copied tree. The Copilot drift check
(pnpm build:copilot + git diff --exit-code -- 'agents/*.agent.md') still guards the
committed flat agent files.
A separate changeset-check job runs only on pull requests and fails any PR that
touches a versioned path (extensions/, skills/, agents/, package.json, or
plugin.json) without a changeset in .changeset/. Add one with pnpm changeset —
the style-versioning skill documents the format.
On pushes to main, a release job (gated on lint, test, and
claude-plugin-check) runs changesets to open a chore: version packages PR when
changesets are pending, then publishes to npm once it lands. The version step runs
pnpm version-packages — bumping package.json, syncing plugin.json, and
regenerating the committed Copilot agent files (the Claude plugin is materialised at
install time with the package version, so it has no committed output to regenerate)
so the drift gates stay green; the
publish step runs pnpm publish-package (pack + provenance publish). Publish
authenticates via npm Trusted Publishing (OIDC) — no npm token or GitHub
secret is needed, only the one-time npm-side setup on npmjs.com (package →
Access → Trusted Publishing for the jaybeeuu/agent-cortex repo). Releases
are sourced entirely from main.
Installation
Symlink as global pi config
This repo's pi/settings.json is symlinked to ~/.pi/agent/settings.json,
making it the canonical store for personal pi agent configuration:
~/.pi/agent/settings.json -> /path/to/agent-cortex/pi/settings.json
All pi install / pi remove commands write to this file, and changes are
committed to git. On a fresh machine:
git clone https://github.com/jaybeeuu/agent-cortex
ln -sf "$PWD/agent-cortex/pi/settings.json" ~/.pi/agent/settings.json
Pi package dependencies
These packages are declared in pi/settings.json and auto-installed by pi:
| Package | Version | Purpose |
|---|---|---|
pi-web-access |
0.10.7 | Web search, URL fetching, GitHub repo access, PDF/YouTube/video analysis |
Desktop notifications are handled by the local extensions/notify/ extension
(replaces the former pi-notify dependency). It sends an OSC desktop
notification on multi-turn tasks, labelled with the tmux session:window.pane
if available, or the project directory name otherwise.
Pi harness agents & skills (agent-cortex install pi)
The agents are already available to pi through the package (pi.skills + the
agent-modes extension compose them at runtime), but the raw package files carry
literal {{TOOL:...}} / {{PATH:...}} tokens. Run the pi installer to materialise
composed agents and token-substituted skills into pi's user scope:
agent-cortex install pi
# → ~/.pi/agent/agents/<name>.agent.md (ralph, plan, ralph-plan, strategy)
# → ~/.pi/agent/skills/ (token-substituted skill tree)
Flags:
| Flag | Meaning |
|---|---|
--dry-run |
Show what would be installed without writing anything |
--output <dir> |
Install into <dir>/agents and <dir>/skills (default ~/.pi/agent) |
--plugin-root <dir> |
Override the plugin root used for {{PATH:...}} tokens (default: token-map.json's pi value — use it for checkout or symlinked installs) |
Re-run whenever you pull changes (git pull + reinstall, or after pnpm build:copilot).
Copilot plugin (separate)
copilot plugin install jaybeeuu/agent-cortex
Or install a local checkout:
copilot plugin install ./agent-cortex
Claude Code plugin (separate)
A plain agent-cortex install claude materialises the plugin into the home install
root ~/.agent-cortex/claude — 4 agents (strategy, plan, ralph-plan, ralph),
29 skills (copied flat per skill, {{TOOL:...}} / {{PATH:...}} token-substituted — no
symlinks), SessionStart + Notification hooks, and 2 MCP servers — writes a marketplace
manifest at ~/.agent-cortex/.claude-plugin/marketplace.json exposing ./claude, and
registers it with Claude Code. The repo commits no claude/ output: hand-authored extras
(.mcp.json, scripts/) are served from claude-extras/, and everything else is generated
at install time — there is nothing to drift.
The generate-only --output <dir> form is for previewing and CI validation; the
documented path is the plain install to ~/.agent-cortex/claude:
pnpm build:copilot # or: node scripts/build-copilot-agents.mjs (regenerates agents/*.agent.md)
node bin/agent-cortex.mjs install copilot # regenerates agents/*.agent.md in place
node bin/agent-cortex.mjs install copilot --dry-run # plan only, no writes
node bin/agent-cortex.mjs install copilot --output /tmp/x # preview the flat files elsewhere
node bin/agent-cortex.mjs install claude # materialises ~/.agent-cortex/claude + marketplace manifest AND registers it with Claude Code (user scope, idempotent)
node bin/agent-cortex.mjs install claude --dry-run # plan generation + registration, no writes/spawns
node bin/agent-cortex.mjs install claude --require-register # fail (non-zero exit) when the claude CLI can't drive registration
node bin/agent-cortex.mjs install claude --output /tmp/x # generate only (preview/CI) — no marketplace manifest, no registration
Try it for one session
Generate a throwaway plugin and point Claude Code at it — no install or registration needed:
node bin/agent-cortex.mjs install claude --output /tmp/agent-cortex-claude
claude --plugin-dir /tmp/agent-cortex-claude
# verify what loaded:
claude --plugin-dir /tmp/agent-cortex-claude plugin details agent-cortex
SKILL.md edits are picked up live in that session; agent, hook, and MCP changes need
/reload-plugins.
Install persistently (recommended)
The plain install does both halves in one step: it materialises the plugin into
~/.agent-cortex/claude, writes ~/.agent-cortex/.claude-plugin/marketplace.json (the
home install root doubles as the marketplace root — the manifest exposes ./claude), and
registers it with Claude Code by driving the claude plugin CLI against that root at
user scope (the claude plugin install default, so the plugin is available in every
session — the recommended persistent flow). Registration is idempotent by state, not by
exit code: claude plugin marketplace list --json picks add-vs-update and
claude plugin list --json picks install-vs-update against the materialised version. A
fresh install adds the marketplace and installs the plugin; a re-run is the update path
(marketplace update, plus plugin update only when a newer version is materialised); a
repeat install at the same version is a true no-op. It requires the claude plugin CLI
(Claude Code v2+): with a missing or pre-v2 CLI the installer warns and prints the manual
commands below, exiting 0 — --require-register makes registration mandatory and fails
non-zero when it can't run:
agent-cortex install claude # materialise + register (user scope, idempotent)
agent-cortex install claude --require-register # register or fail the install
--dry-run prints the full plan without spawning the claude CLI or writing anything;
--output <dir> generates only, with no marketplace manifest and no registration. The
equivalent manual registration adds a marketplace root by absolute path (a bare . is
rejected) — the home install root (~/.agent-cortex) is the marketplace root written by
the plain install; the repo checkout ships no manifest:
claude plugin marketplace add ~/.agent-cortex # after a plain install
claude plugin install agent-cortex@jaybeeuu # every session (user scope)
# or, for this project only:
claude plugin install agent-cortex@jaybeeuu --scope local
After installing, the agents and skills are available in every session with no --plugin-dir
flag, and Ralph is just claude --agent agent-cortex:ralph.
Update
The plain install re-materialises from the current sources, so after pulling changes
re-run it — it refreshes the materialised plugin and re-registers whatever the installed
state says is out of date (marketplace update, plus plugin update only when a newer
version is materialised; a repeat install at the same version is a no-op) in one step:
git pull
agent-cortex install claude # re-materialise + refresh (restart Claude Code to apply)
Registration matches the marketplace by name, not path: a marketplace previously added
from a different root is refreshed in place rather than re-pointed at the fresh home
install. Re-point it with
claude plugin marketplace remove jaybeeuu and re-run the install.
The plain install IS the update — there is no separate build step. (--output <dir> only
generates a preview and never refreshes an installed plugin.)
Uninstall
claude plugin uninstall agent-cortex
claude plugin marketplace remove jaybeeuu
Using the agents
| Agent | How to invoke | Purpose |
|---|---|---|
strategy |
delegate: "use the strategy agent…" | Vision brief / PRD / technical-direction docs |
ralph-plan |
delegate: "use the ralph-plan agent…" | Explore, grill, and file beads for a change |
plan |
delegate: "use the plan agent…" | End-to-end planning (PRD → classified beads) |
ralph |
run as the main agent: claude --agent agent-cortex:ralph |
Parallel backlog orchestrator (below) |
Skills auto-trigger from their descriptions, or invoke one explicitly as
/agent-cortex:<skill> (e.g. /agent-cortex:tdd).
The lean Ralph runs as the interactive main agent (not delegated — it must stay alive to receive its workers' completions):
claude --agent agent-cortex:ralph # (omitted once installed via agent-cortex install claude; else --plugin-dir ~/.agent-cortex/claude)
It finds ready beads, spawns parallel background workers (implement → independent review →
fix), opens a PR per feature, and pauses at each human merge gate. After you merge, re-invoke
it and it resumes from bd ready.
Hooks
SessionStart injects a per-session policy nudging Claude to prefer the shipped skills over
ad-hoc choices: the "style policy" (invoke style-code / style-tests /
style-documentation / style-comms before the corresponding work — their descriptions also
auto-trigger proactively) and the "skill policy" (using-agent-skills for routing, bd-tool
for beads context, git-workflow for branch/PR discipline). A Notification hook matched on
agent_completed|agent_needs_input|permission_prompt raises a desktop notification when a
task finishes, waits on input, or needs approval. See docs/claude-hooks.md for the full
extension→hook audit.
Not ported / follow-ups
- Only
session-startandnotifyhad Claude equivalents (both ported to hooks); the other piextensions/(auto-name, skill-stats, subagent, agent-modes) have none — the audit and rejection rationale live indocs/claude-hooks.md. - Ralph follow-ups: multi-feature epic branches, and a GitHub-trigger routine to auto-resume after a PR merge (instead of manual re-invocation).
- The Copilot/pi Ralph (the 4-stage
run-pipeline-stagepipeline) is unchanged; those two ralph-coupled skills (ralph,run-pipeline-stage) are intentionally not shipped to Claude.
Contributing to the Claude plugin
Edit the sources — the composable agents/<name>/ directories (shared agent.md +
per-harness frontmatter/sections, auto-composed by scripts/build-copilot-agents.mjs and
bin/installers/claude.mjs), agents-native/*.md (Claude-only
agents like ralph — the canonical bodies the installer copies verbatim), skills/**,
hooks/claude/hooks.json (hook config), claude-extras/ (hand-authored .mcp.json and
scripts/), and package.json (plugin
version — picked up at install time) — then run
agent-cortex install claude (re-materialises the home plugin and re-registers it;
--output <dir> generates a preview only). There is no committed
claude/ output to hand-edit or regenerate: ~/.agent-cortex/claude is generated in full
(.claude-plugin/plugin.json, agents/, skills/, hooks.json, .mcp.json, scripts/)
so never edit anything under it. The generated agents/*.agent.md files are still
drift-checked by CI (git diff --exit-code -- 'agents/*.agent.md'), and CI validates the
Claude materialiser (structural checks on a temp-dir install) so sources and installer can
never silently diverge.