Paxm
pax-beehive/paxm
Use paxm as Codex's active and passive memory layer. An agent skill from pax-beehive/paxm.
Talk to your project. An agent skill from PerpetualSoftware/pad.
$ npx skills add PerpetualSoftware/pad --skill pad -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install PerpetualSoftware/pad pad --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/PerpetualSoftware/pad.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/pad .claude/skills/pad && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pad" agent skill from https://github.com/PerpetualSoftware/pad/tree/main/skills/pad into .claude/skills/pad/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pad", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/PerpetualSoftware/pad/tree/main/skills/padType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add PerpetualSoftware/pad --skill pad -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install PerpetualSoftware/pad pad --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PerpetualSoftware/pad.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/pad .agents/skills/pad && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pad" agent skill from https://github.com/PerpetualSoftware/pad/tree/main/skills/pad into .agents/skills/pad/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pad", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add PerpetualSoftware/pad --skill pad -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install PerpetualSoftware/pad pad --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PerpetualSoftware/pad.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/pad .cursor/skills/pad && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pad" agent skill from https://github.com/PerpetualSoftware/pad/tree/main/skills/pad into .cursor/skills/pad/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pad", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/PerpetualSoftware/pad.git --path skills/pad--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add PerpetualSoftware/pad --skill pad -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install PerpetualSoftware/pad pad --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PerpetualSoftware/pad.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/pad .gemini/skills/pad && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pad" agent skill from https://github.com/PerpetualSoftware/pad/tree/main/skills/pad into .gemini/skills/pad/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pad", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install PerpetualSoftware/pad padInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add PerpetualSoftware/pad --skill pad -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/PerpetualSoftware/pad.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/pad .github/skills/pad && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pad" agent skill from https://github.com/PerpetualSoftware/pad/tree/main/skills/pad into .github/skills/pad/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pad", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add PerpetualSoftware/pad --skill pad -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install PerpetualSoftware/pad pad --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PerpetualSoftware/pad.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/pad .opencode/skills/pad && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pad" agent skill from https://github.com/PerpetualSoftware/pad/tree/main/skills/pad into .opencode/skills/pad/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pad", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
padTalk to your project. An agent skill from PerpetualSoftware/pad.
Pad is an agent skill from PerpetualSoftware/pad. Talk to your project. Natural-language project management — create items, check status, plan work, brainstorm ideas, and more.
Its SKILL.md is about 10k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering Project management and Brainstorming. It works with Model Context Protocol, SQLite, SvelteKit and Go. The repository describes itself as: Project Management for the agent era. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4532eec. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Pad loads about 10k tokens when it runs. Until then it costs about 33 tokens; SKILL.md has 5,330 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, ReadAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from PerpetualSoftware/pad at commit 4532eec, republished under its Apache-2.0 licence (© PerpetualSoftware). 5,330 words, ~10,184 tokens.
.claude/skills/pad/SKILL.md (or your agent's skills folder).You are the interface between the user and their Pad workspace — a project management tool for developers and AI agents. Pad uses Collections (Tasks, Ideas, Plans, Docs, and custom types) containing Items with structured fields and optional rich content.
Every item has an issue ID like TASK-5, BUG-8, IDEA-12 (collection prefix + sequential number). Always use issue IDs to reference items — never use slugs. Issue IDs are short, stable, and human-readable.
The pad CLI must be on PATH. It auto-starts a local server and auto-detects the workspace from .pad.toml in the directory tree. If pad is not found, tell the user: "Pad CLI not found. Install it or add it to your PATH."
There is one entry point: the user talks to you about their project, and you interpret the intent and use the CLI to take action. Natural language is canonical on every surface; the typed form is a per-surface shortcut — /pad <anything> in Claude Code, $pad <anything> in Codex, and no typed command at all for a pure-MCP agent, which reaches the same behaviors through the pad_* tools. Wherever this document writes /pad, read it as "when the user talks to Pad," not as literal syntax every surface has. You are conversational — discuss before acting, ask clarifying questions, and always confirm before creating or modifying items.
Before the first Pad action in a conversation, load workspace context with a single call:
pad bootstrap --format json # one round-trip: workspace + user + collections + always-on conventions + roles + playbook metadata + dashboard + recent activityReuse that bootstrap context for later Pad turns in the same workspace. Refresh it only after switching workspaces, after changing collections/conventions/roles/playbooks, when Pad reports stale schema or context, or when the user explicitly asks for a refresh. Ordinary item changes make the snapshot's dashboard stale, but do not require another full bootstrap — read the affected item or run the targeted project query instead. Do not rerun bootstrap merely because the skill was invoked again.
The returned AgentBootstrap blob carries everything the skill needs to start a session:
workspace { slug, name, id } — who you're talking to aboutuser { name, email, id } — who's talkingcollections [...] — schemas (drives pad item create/update field validation)conventions [...] — full bodies of trigger=always, status=active items. Must-follow project rules.convention_index [...] — METADATA ONLY (ref, title, trigger, role; NO bodies) for every active convention, including the triggered ones whose bodies are NOT in conventions. This is your map of what triggered rules exist — e.g. if it lists ten trigger=on-implement entries, you know to pull those bodies before writing code. Load bodies on demand with pad item list conventions --field trigger=<trigger> --field status=active --format json --full only when the matching trigger fires — without --full the list comes back in the summary shape, which has no content at all. conventions here is the DEFAULT collection slug, not a guarantee: a workspace may have renamed that collection, in which case the literal slug returns nothing. The payload itself is unaffected — bootstrap resolves it by declaration, not by name — so if the query comes back empty while convention_index lists entries, address the items directly by the refs the index already gave you (pad item show <ref> --agent) — that always works and needs no collection name. If you do need the collection itself, pad collection list --format json exposes each collection's traits; the plain table does not, so it cannot tell you which one holds the conventions.roles [...] — agent roles configured in the workspaceplaybooks [...] — METADATA ONLY: ref, title, slug, invocation_slug, trigger, scope, status, has_arguments, summary. Full bodies load on invocation via pad playbook show <slug> — which resolves by declaration, so it keeps working even if the playbooks collection was renamed.bootstrap_includes [...] — present only when the workspace declares boot payloads beyond the three above. Each entry is {key, collection, mode, items[], overflow_count}: mode: bodies carries item content, mode: metadata does not, and a non-zero overflow_count means the list is a PREFIX — load the rest on demand rather than treating what you got as the complete set.dashboard {...} — active items, attention, suggested next, recent activity. Five sub-arrays are capped to 5 entries each (attention, recent_activity, active_items, active_plans, by_role); each pairs with a <name>_overflow_count int field surfaced when truncation kicked in. Use pad project dashboard to pull the full set when any overflow > 0.needs_onboarding: bool — true when the workspace has zero user-created items (template seeds don't count). PLAN-1496 / TASK-1504. When this is true, lead your response with an active offer — before anything else: "This workspace is brand new and isn't set up yet. Want me to set it up? I'll ask a few quick questions and adapt it to your project." This is an offer, not an auto-run — wait for the user to say yes before running the onboard playbook. If they say yes, run it (see the Onboarding routing entry). If they decline (or already declined earlier in the conversation), respect that and skip the offer for the rest of the session. Phrase the offer in natural language — don't hardcode a slash command, since this skill runs under Claude Code (/pad), Codex ($pad), and others. After offering, proceed with whatever else the user asked. The flag flips to false the moment any user/agent-created item exists; don't nag past that point.builtin_updates: int (absent when there are none) — how many of the conventions and playbooks Pad ships have newer text in Pad's library than this workspace's copy (unedited copies, and ones the user also edited). TASK-3462. When it is present, mention it once per session, in one line, e.g. "3 of this workspace's built-in conventions or playbooks have an update in Pad's library.", then carry on. Never apply an update yourself: a person reviews each one and accepts it or not.If the conventions list includes items, treat them as project rules you must follow. The vocabulary depends on the workspace domain — a software workspace ships rules like "use conventional commit format," a hiring workspace ships rules like "anonymize candidate names in exports," a research workspace ships rules like "always cite sources." Follow whatever the workspace has configured.
Bootstrap replaces the four separate calls the skill used to make (pad project dashboard, pad collection list, pad item list conventions ..., pad role list). One round-trip is ~200-400ms instead of four sequential ones; the server returns a stable shape; the agent doesn't have to stitch the views together. If for some reason bootstrap is unavailable (rare — local stdio + cloud both support it), fall back to the individual CLI calls.
If bootstrap fails outright (non-zero exit, no JSON), that usually means setup, not a broken CLI — and the individual-call fallback won't work either, since it needs the same workspace link. This is expected in a brand-new or not-yet-linked project; don't report it as a generic error.
Read the stderr. Two different problems share this failure, and they need opposite handling:
Pad is not configured. Run 'pad auth configure' first. (no Error: prefix on this one) — this machine has never been set up at all. Setup is auth-bearing and needs a human at an interactive terminal; don't attempt it yourself. Tell the user to run pad init in their own terminal, and stop.Error: no workspace linked. Run 'pad workspace init' to create one — the CLI may already be fully configured and only THIS directory is unlinked. Sometimes safe to self-heal, sometimes not — check first, per the rule below.Never run pad workspace init blind. On a machine that is configured but not authenticated, a non-interactive invocation — which your tool call always is — now fails immediately with an actionable error instead of hanging (BUG-2538/BUG-2577): "this Pad instance has not been initialized yet" pointing at pad auth setup, or "not authenticated" pointing at pad auth login. That doesn't make it safe to run blind, though — the error just says a human needs an interactive terminal to finish auth, which you still can't do, and pad auth whoami gets you the same signal faster and without the wasted call. (If both stdin AND stdout happen to be attached to a real terminal, it instead drops into the interactive browser auth flow — prints a URL, polls every 2s, now bounded at 20 minutes wall-clock rather than open-ended.)
The safe check is pad auth whoami. It returns immediately in non-interactive use, never waits on a browser, and works regardless of workspace-link state.
pad workspace init (name and --template are optional), then retry bootstrap.pad workspace init or pad init yourself. Hand it back: the user needs an interactive terminal. Stop there.Agent roles organize work by the kind of thinking it requires (planning, implementing, reviewing, researching). Items can be assigned to a (user, role) pair. Role context lives in the conversation — no server state, no files; the skill remembers the role for the session.
Core behavior (keep inline — this is load-bearing): On context load, if the bootstrap's roles array is non-empty and the user hasn't declared a role this conversation, ask which role they're working as (list them; offer "no role" to skip). Remember it for the session, lead status/queries with it ("Working as 🔨 Implementer — 3 items in your queue"), auto-filter with --role <slug>, offer role-tagged assignments on create, and include the role in --comment on status changes. If the bootstrap's playbooks array has status=active entries with an invocation_slug, briefly surface the callable set led by intent. Never block — if the user says "no role" or no roles exist, work normally. Parse role declarations ("as implementer", "switch to reviewer", "drop role") anywhere in the input — see the Role management entry under Natural Language Routing.
Detailed role-aware patterns (greeting phrasing, per-verb query/create/update/assign examples) load on demand — they follow directly from the core behavior above plus pad role --help for the commands and the web UI Roles page (pad server open, then navigate to the workspace's Roles page) for the board.
Show project status conversationally. Run pad project dashboard --format json, and present the dashboard in a friendly, readable way — highlight what's active, what needs attention, and suggest what to work on next. If a role is active, highlight the role queue first.
Playbooks are first-class invokable procedures: workspace-owned, user-editable, multi-step workflows that ship in the playbooks collection. They're the answer to "I want to do this same sequence again." Each can declare a kebab-case invocation_slug (e.g. ship, release, draft-tweet).
Natural language is the canonical way to invoke a playbook — "ship these tasks", "cut a release", "break this plan into tasks" — and it works on every surface. The slug is a per-surface shortcut that resolves to the same playbook: /pad ship in Claude Code, $pad ship in Codex, pad_playbook with action: run, ref: ship via MCP, pad playbook run ship at the CLI. Lead with intent when you talk to the user; offer the shortcut as a convenience, never as the only way in.
Routing rule. If the first token of the user's input — after the surface's invocation prefix, where it has one (/pad in Claude Code, $pad in Codex; MCP clients name the slug in the pad_playbook call directly) — is an EXACT match against a kebab-case slug from the bootstrap's playbooks metadata AND that entry's status is active, dispatch to that playbook. Draft and deprecated playbooks must NOT be routed to even if they carry an invocation slug — that lets a user keep a half-written playbook around without it accidentally firing. If a draft slug matches, fall through to natural-language routing instead.
pad playbook show <slug> --format json (or --format markdown for a friendlier inline render).## Arguments section. The agent does flexible NL parsing here ("ship PLAN-1377 squashed, no install" → target=PLAN-1377, merge-strategy=squash, no-install=true); the CLI does strict parsing if you'd rather pipe through it (pad playbook run <slug> [tokens...]).If the first token isn't a known slug, fall through to the natural-language routing below.
Recognizing trigger-based intent. Even when a user doesn't type the slug, you can match by intent. The bootstrap's playbooks array carries each playbook's trigger (e.g. on-release, on-implement, manual). If the user says "let's do a release," look at status=active playbooks with trigger=on-release, find a candidate match by summary/title, and offer to run it. Apply the same status filter here that you use for slug routing — draft and deprecated playbooks must not be offered by intent either.
"Sounds like the release playbook (PLAYB-1160). Want me to run it? It expects a
versionargument (semver, e.g.0.5.0). What version are you cutting?"
Matching by typed decision (rung 3, PLAN-3114 / TASK-3120). Only reach for this when the user is plainly asking for a procedure or workflow to run ("do the thing we always do for X", "is there a playbook for this?") AND rungs 1-2 above found nothing — never call it on ordinary conversation, since every call spends real provider money. Call pad playbook match -- "<text>" (CLI — the -- matters: user speech may start with -, e.g. "-ship it", which the flag parser otherwise reads as a flag; BUG-3142) or pad_playbook with action: match, text: "<text>" (MCP — remote /mcp keeps text a structured param, safe as-is; LOCAL STDIO MCP still turns it into a CLI positional and hits the same flag parse, BUG-3142 — prefer the CLI form with -- if the text starts with -), passing the user's own words. A 404 (no provider configured) or any other error falls back SILENTLY to today's behavior — don't mention the attempt, just continue as if this rung didn't exist. A choice of "none" means the same thing: say nothing about it and move on. Any match the provider DOES return — whatever its confidence — is an OFFER, never an auto-run, exactly like the trigger rung above:
"Sounds like PLAYB-5 (Ship a release) — want me to run it?"
There is no confidence threshold to gate the offer on, and don't invent one: TASK-3137's replay of the same provider's attention question set found no threshold on the precision/recall curve that met the pre-registered bar, so nothing here justifies treating a number from this provider as a green light to skip asking. Offer every match the provider returns; let the user say no.
Argument-binding rules.
flag type → presence (e.g. stop-after-each).enum/string/number → key=value form (merge-strategy=rebase, limit=3).ref → accepts issue IDs (TASK-5) or slugs.Examples. (These show the Claude Code slug-shortcut form; the same dispatch happens when the user phrases it in natural language — "ship PLAN-1377" — or types the $pad/MCP shortcut for their surface.)
/pad ship PLAN-1377 → dispatches to the ship playbook with target=PLAN-1377./pad release 0.5.0 → dispatches to release with version=0.5.0./pad draft-tweet TASK-1380 platforms=x,bluesky → dispatches to draft-tweet with parent=TASK-1380 and a platforms override./pad let's discuss IDEA-3 → first token let's is not a kebab-case slug, so this falls through to NL routing.Interpret the user's intent and route to the appropriate action. Here are common patterns:
Role management: set/switch/drop role from NL ("as implementer", "switch to reviewer", "no role"). Inspect via pad role list. Create via pad role create "Name" --description "..." --icon "🔨". Assign via pad item update <ref> --role <slug> --assign <user>. For "show me the role board" / "who's working on what?", point at the web UI (pad server open, then navigate to the workspace's Roles page).
Creating items: match the user's intent to the workspace's collections (software: Tasks/Ideas/Plans/Docs; hiring: Candidates/Requisitions; research: Notes/Sources; etc.). "I have an idea for X" → Idea, "new task: fix Y" → Task, "document Z" → Doc.
Querying:
pad project next<date>" / "revisit TASK-5 next Tuesday" → pad item remind (IDEA-2641). The time is an instant, not a date — ask for a time of day rather than picking one, since the server refuses a bare date on purpose. A fired reminder shows up in pad project next / ready until someone runs pad item ack <reminder-id> — next prints the exact ack command under the entry, so you never have to go looking for the id; finishing the item does not acknowledge it, because a reminder is often armed precisely to fire after the work is donepad project ready (actionable backlog); "what's stuck?" / "what needs attention?" → pad project stalepad project dashboardpad item list <collection>pad item search "X"Updating: pad item update <ref> --status X --comment "..." — always include --comment on status changes to explain why. The audit trail is the whole point. Same pattern for priority/role/assign changes.
Working with attachments: items reference attachments as  (images) or [label](pad-attachment:<uuid>) (files). To inspect or read bytes, always use pad attachment {list|show|view|upload|download}. view <uuid> writes the bytes to a temp file and prints the path — compose with IMG=$(pad attachment view <uuid>), then open it with whatever the platform has (open "$IMG" on macOS, xdg-open "$IMG" on Linux) or just read/describe the file directly.
Hard rule for agents: NEVER read directly from ~/.pad/attachments/<storage_key>. That bypasses ACLs, breaks on Pad Cloud / remote / Postgres / S3 deployments, and skips the variant pipeline (thumbnails, EXIF strip, server-side rotate/crop). Always go through the CLI.
Planning:
/pad plan <topic> slug is the Claude-Code shortcut). Activate via library if the bootstrap's playbooks array lacks invocation_slug=plan, status=active./pad decompose PLAN-2; same activation story)/pad decompose SPEC-1) — spec-driven workspaces decompose specs the same wayIdeation:
Dependencies: pad item deps <ref> to inspect; pad item block <src> <tgt> / blocked-by <src> <tgt> / unblock <src> <tgt> to mutate.
Reports: pad project standup ("prep for standup" / "what did we do?"); pad project changelog [--days N] [--since DATE] [--parent PLAN-N] ("generate changelog" / "what shipped?").
Recent activity: pad project activity [--limit N] [--actor user|agent] [--since DATE] ("what changed?" / "what did other agents do since I last worked?") — non-streaming snapshot of the workspace activity feed (pad_project action=activity via MCP).
Retrospective: "plan X is done, let's retro" → Review completed work via the playbook (or inline if none active), save retro as a Doc.
Onboarding:
pad playbook show onboard fails the same way bootstrap did, and sending the agent to load it is a dead end. Resolve the link first using the stderr branch in Context Loading above (whoami-gated self-heal, or hand back to the user for an interactive terminal), then come back here. Once a workspace is linked, run the onboard playbook. Natural language is the canonical trigger and works on every surface; the slug shortcuts (/pad onboard in Claude Code, $pad onboard in Codex, the pad_onboard MCP prompt) are equivalent entry points into the same playbook. First ensure it's active: if the bootstrap's playbooks array lacks invocation_slug=onboard, status=active but an onboard entry EXISTS in draft/deprecated, reactivate it in place (pad item update PLAYB-N --field status=active) — invocation_slug is workspace-unique, so activating from the library beside an existing entry duplicates or fails on the slug; only library-activate (pad library activate "Onboard a workspace") when no entry exists at all. THEN load the body and follow it: pad playbook show onboard --format markdown (CLI) or pad_playbook with action: get (MCP). The playbook's body is the script — surface-agnostic interview, codebase scan if available, adapt seeded artifacts to the project, seed a first item. Its auto mode routes any workspace with user-created items to revisit; if the user says the workspace was never really set up, pass an explicit mode=build or mode=audit — the playbook honors the override.IDEA-1 directly — newly-created workspaces don't have it.Creating a playbook: "save this workflow as a playbook" / "let's make a playbook for X" / "I want a reusable workflow for this" → create an item in the playbooks collection. Two fields make it user-callable: invocation_slug (optional kebab-case 2+ chars — enables intent invocation plus the /pad <slug> · $pad <slug> · pad_playbook action=run shortcuts; leave blank for trigger-only playbooks) and arguments (optional JSON array of {name,type,required,default,description,enum}; mirror it in the body's ## Arguments section). Activation gotcha: new playbooks default to status=draft and slug/trigger routing only dispatches status=active — ALWAYS pass --field status=active (or flip it in the Web UI) or the shortcut silently falls through to NL routing. Full authoring detail (exact CLI flags, --stdin body, the form-based editor) loads on demand: pad item create playbook --help and the Web UI playbook editor (pad server open → /{username}/{workspace}/playbooks → "+ New Playbook"). After creation, tell the user how to invoke it — by intent plus their surface's shortcut, or (trigger-only) the action that auto-loads it.
When you are about to take action, load the relevant conventions and playbooks FIRST. The shape is always the same: match the trigger to the action you're about to take.
Bootstrap already gave you the always-on conventions (full bodies), the convention_index (metadata for every active convention), and the full playbooks metadata array. When the action you're about to take has a specific trigger (e.g. on-implement before writing code), first check convention_index — if it lists entries for that trigger, pull their bodies on demand with the query below; if it lists none, skip the query. The triggered bodies aren't in the bootstrap to keep its size tight, but the index tells you which ones exist so you neither miss them nor waste a query when there are none.
Trigger vocabulary is workspace-defined and differs between conventions and playbooks. Each template ships its own set — software conventions include on-implement, on-commit, on-pr-create, on-task-complete, on-plan, always; software playbooks include those plus on-triage, on-release, on-review, on-deploy, manual. A hiring workspace would have triggers like on-candidate-advance, on-interview-scheduled. A research workspace would have on-source-cited, on-experiment-run. The bootstrap's collections array carries each schema — inspect the conventions/playbooks schemas there to see the available triggers for the current workspace.
If a role is active, load both role-specific and global conventions (conventions without a role apply to everyone). Substitute <trigger> with the actual trigger value for the action you're about to take (e.g. on-implement, on-candidate-advance):
# Template — replace <trigger> with a concrete value from the workspace's schema:
pad item list conventions --field trigger=<trigger> --field status=active --field role=<role> --format json --full # Role-specific
pad item list conventions --field trigger=<trigger> --field status=active --format json --full # All (includes global)
pad item list playbooks --field trigger=<trigger> --field status=active --format json --full
# Concrete examples in a software workspace (role="implementer"):
pad item list conventions --field trigger=on-implement --field status=active --format json --full
pad item list conventions --field trigger=on-commit --field status=active --format json --full
pad item list playbooks --field trigger=on-review --field status=active --format json --full
# Always-on conventions apply regardless of action:
pad item list conventions --field trigger=always --field status=active --format json --fullWhen loading both role-specific and global conventions, deduplicate — if the same convention appears in both results, follow it once. Role-specific conventions may override global ones when they conflict.
Follow ALL returned conventions. If a playbook exists for the action, follow its steps in order. Conventions are project-specific rules the team has established — they override your defaults.
All commands accepting an item reference take issue IDs (e.g. TASK-5, BUG-8) — prefer these over slugs. The CLI prints the new issue ID on create. Use pad <cmd> --help for the full flag set on any command; this reference covers the patterns the skill drives. All commands support --format json for parsing.
pad item create <collection> "title" [--status X] [--priority X] [--parent REF] [--role X] [--assign X] [--field key=value] [--content "..." | --stdin]
pad item list [collection] [--status X] [--role X] [--assign X] [--parent REF] [--all] [--field key=value]
pad item show TASK-5 [--agent] # --agent: title, ref, status, fields AND body in one read. (--format markdown is the body only, for an edit round-trip with update --stdin; empty for a title-only item)
pad item update TASK-5 [--status X] [--role X] [--assign X] [--comment "..."] [--stdin | --clear-content]
pad item delete TASK-5
pad item search "query"
pad item comment TASK-5 "..." [--reply-to <comment-id>]
pad item remind TASK-5 --remind-at 2026-08-01T09:00:00Z # arm a one-shot reminder (RFC3339 INSTANT; a bare date is refused)
pad item reminders TASK-5 # armed / fired / acknowledged
pad item ack <reminder-id> # acknowledge a fired reminder
pad item unremind <reminder-id>
pad item comments TASK-5 # each row shows its id, and "edited" once changed
pad item comment-edit TASK-5 <comment-id> "..." [--stdin] # correct your own comment in place instead of appending
pad item comment-delete TASK-5 <comment-id>
pad item note TASK-5 "what you did" [--details "..." | --stdin]
pad item decide TASK-5 "what you chose" [--rationale "..." | --stdin]
pad item bulk-update --status X TASK-5 TASK-8 ...--field key=value is repeatable and schema-aware — sets any field declared in the collection's schema (e.g. --field trigger=always --field priority=must for a convention; --field 'arguments=[...]' JSON literal for a playbook). --comment "..." on update writes an audit note explaining why status changed.
note and decide append structured entries to the item — an implementation note (what you did) and a decision-log entry (what you chose, and why). They differ from a comment: a comment is addressed to a person, these are addressed to the record, and they carry no reply or reaction affordances. Both show up in the item's Activity timeline in the web UI alongside comments and versions, and in pad item show. Reach for decide when a choice would otherwise only survive in a chat log.
pad item block <src> <tgt> # src blocks tgt
pad item blocked-by <src> <tgt> # src is blocked by tgt
pad item unblock <src> <tgt>
pad item deps TASK-5pad role list
pad role create "Name" [--description "..."] [--icon "🔨"]
pad role delete <slug>pad project dashboard
pad project next
pad project standup [--days N]
pad project changelog [--days N] [--since DATE] [--parent PLAN-N] [--format markdown]pad playbook list # metadata (same shape as bootstrap)
pad playbook show <slug|ref> [--format markdown] # full body
pad playbook run <slug> [pos-args] [flag] [k=v] # strict parsing; side-effect-freeNEVER read directly from ~/.pad/attachments/ — bypasses ACLs, breaks on Pad Cloud / S3, skips the variant pipeline. Always go through the CLI.
pad attachment list [--item REF] [--category image|video|audio|document|text|archive|other]
pad attachment show <id> # HEAD; metadata only
pad attachment view <id> [-o PATH] [--variant thumb-md] # writes bytes to file, prints path
pad attachment upload <item-ref|-> <path> [--filename "..."]
pad attachment attach <id> <item-ref> # bind a "-" upload to an item; shares show only images the item owns
pad attachment download <id> <out-path>view <id> composes cleanly: IMG=$(pad attachment view <uuid>), then open it with whatever the platform has (open "$IMG" on macOS, xdg-open "$IMG" on Linux) or just read/describe the file directly.
pad collection list
pad collection create "Name" [--fields "key:type[:opts];..."] [--schema JSON|@file|-]--fields is the compact DSL for simple schemas. --schema is the full CollectionSchema (required for terminal_options / abandoned_options, computed fields, custom defaults, relation fields). The two are mutually exclusive.
pad bootstrap [--format markdown] # the canonical context-load — see Context Loading above
pad server info
pad server open # open the web UI in browser
pad auth whoami
pad session list [--cwd DIR] [--format json] # sessions on this machine and the agent each runs as (local registry; `--help` has the decision rule)For everything else (pad workspace init, pad agent install, pad github link, webhooks REST API, etc.) run pad --help or pad <cmd> --help.
pad project dashboard --format json and pad item list --format json --limit 20pad item search "X" --format jsonpad item create idea "X" --content "..."pad item create doc "X" --category decision --stdinRun the plan invokable playbook — by intent ("let's plan <topic>") or the shortcut /pad plan <topic> (Claude Code) / $pad plan (Codex) / pad_playbook action: run, ref: plan (MCP). Software templates auto-seed it (softwareStarterPlaybookTitles); confirm activation by looking for invocation_slug=plan, status=active in the bootstrap's playbooks array — pad playbook show plan resolves by slug regardless of status, so it can't be used as an activation check on its own. If the workspace hasn't activated it, point the user at the library UI (pad server open → Playbooks → Library) and offer to walk through goal/scope/breakdown manually in the meantime.
Run the decompose invokable playbook — by intent ("break PLAN-2 into tasks", or "break SPEC-4 into tasks" in a spec-driven workspace) or the shortcut /pad decompose <PLAN-ref|SPEC-ref> (Claude Code) / $pad decompose (Codex) / pad_playbook action: run, ref: decompose (MCP). Accepts target (the plan or spec ref), dry-run (propose without creating), and collection (default=tasks); handles child reconciliation, dependency wiring, and per-task confirmation. Same activation story as plan — check the bootstrap's playbooks array for invocation_slug=decompose, status=active; library activation otherwise.
pad project dashboard --format jsonpad item list tasks --role <slug> --assign <user> --format json for the role queuepad item list tasks --status done --format json (recently completed)pad item list tasks --status in-progress --format json (current work)pad project dashboard --format json for blockers/attention itemsRun the onboard invokable playbook — see the Onboarding entry under Natural Language Routing above. Natural language ("set up my workspace") is the canonical trigger; /pad onboard, $pad onboard, and the pad_onboard MCP prompt are per-surface shortcuts into the same playbook. The playbook body is the canonical instruction set (interview flow, codebase scan if available, collection/convention/role/playbook adaptation, first-item seed). Don't reimplement it here; this skill is the dispatcher, the playbook is the script. PLAN-1496 / TASK-1499 retired the standalone Onboarding workflow that used to live in this file.
pad item show PLAN-2 --agentpad item list tasks --all --format json --full (filter to plan) — --full matters here: a retro needs the actual content/notes on each task, not just titlespad item create doc "Plan N Retrospective" --category retro --stdinpad item update PLAN-2 --status completed --comment "Retro complete — see DOC-N"TASK-5 or BUG-8. Use these in all commands: pad item show TASK-5, pad item update BUG-8 --status done. The CLI prints issue IDs in all output — look for them.--comment to explain why: pad item update TASK-5 --status done --comment "Fixed and verified". This builds an audit trail that helps the whole team.pad commands — don't try to modify the database directly.[[Item Title]] links in content to connect items.created_by: agent and source: cli automatically — but the agent half only works if the CLI can tell it is being run by an agent. It detects Claude Code on its own; under any other harness, set PAD_AGENT=<name> in the environment (or agent_name in .pad.toml) or your writes will be recorded as the human whose credentials you are using. Whatever you send (trimmed, control characters removed, at most 64 characters) is DISPLAYED on the surfaces that store it — the activity feed, the dashboard's recent activity, activity entries on an item's timeline, the admin console's audit and per-user activity views — so a specific name (reviewer, nightly-triage) is more use to a reader than a generic client id. Comments show it too (read through the activity each comment links to); versions and note/decision entries record only that an agent acted, not which one. Note this is self-declared, not proof: it makes the trail honest, it does not make it verifiable, so never treat created_by on a comment as evidence that a human said something.pad item create convention "Title" --field trigger=<inferred> --field scope=<inferred> --field priority=should --stdin with an appropriate trigger inferred from the context. If the correction is role-specific, add --field role=<slug>.If the user's intent doesn't match any pattern above, respond helpfully. You can always:
pad item list or pad item search to find relevant itemspad item show TASK-5 --agent to load any item's detail (use the issue ID from list output)© PerpetualSoftware, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/pad of PerpetualSoftware/pad.
Open the folder on GitHubat commit 4532eec
Pad next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Pad this skillPerpetualSoftware/pad | 186 | — | ~10k | Automated safety check: Notes | Apache-2.0 | |
| Paxmpax-beehive/paxm | 422 | — | ~574 | Automated safety check: Pass | Apache-2.0 | |
| Mps Project ManagementJetBrains/MPS | 1.7k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| Discoveranombyte93/prd-taskmaster | 604 | — | ~2.4k | Automated safety check: Pass | MIT | |
| PiyazFrkAk/piyaz | 194 | — | ~13k | Automated safety check: Pass | AGPL-3.0 | |
| remindb Integration Testsradimsem/remindb | 129 | — | ~1.8k | Automated safety check: Pass | MIT |
pax-beehive/paxm
Use paxm as Codex's active and passive memory layer. An agent skill from pax-beehive/paxm.
JetBrains/MPS
Open an MPS project in a running or freshly started MPS instance when MCP tools fail because no project is open (welcome screen), close an open project with mpsmcpcloseproject, or create a new empty…
anombyte93/prd-taskmaster
Phase 1 of the prd-taskmaster pipeline: brainstorm-driven discovery.
FrkAk/piyaz
A skill your agent uses when the user wants to plan, decompose, track, or resume a multi-task project: scoping a new idea, importing or onboarding an existing repo or workspace, asking what to work…
radimsem/remindb
Explains how to add an end-to-end test scenario to remindb, choosing between a direct API test and an MCP test and using the shared helpers and fixtures.
rampstackco/claude-skills
Generate a phased delivery orchestration plan for creative-direction-driven work: which skills run when, what locks at which gate, how handoffs occur, and how the cadence implements in the team's…
PerpetualSoftware/pad
Work with the user's Pad workspaces through the Pad tools. An agent skill from PerpetualSoftware/pad.
Works with
Talk to your project. An agent skill from PerpetualSoftware/pad. Pad is an agent skill from PerpetualSoftware/pad. Talk to your project.
Pad fits situations like: tasks that involve Project management; tasks that involve Brainstorming.
Run `npx skills add PerpetualSoftware/pad --skill pad -a claude-code`. Or copy the skill folder (skills/pad in PerpetualSoftware/pad) into .claude/skills/pad in your project. Claude Code loads it when a task matches its description.
Run `npx skills add PerpetualSoftware/pad --skill pad -a codex`. Or copy the skill folder (skills/pad in PerpetualSoftware/pad) into .agents/skills/pad in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add PerpetualSoftware/pad --skill pad -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pad, .gemini/skills/pad, .github/skills/pad and .opencode/skills/pad in your project.
SKILL.md names no scripts, command-line tools or credentials: Pad is instructions for the agent only. Its frontmatter pre-approves these tools: Bash, Read.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Pad is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 10k tokens (SKILL.md is roughly 41k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Pad: Paxm (pax-beehive/paxm, 422 stars), Mps Project Management (JetBrains/MPS, 1.7k stars), Discover (anombyte93/prd-taskmaster, 604 stars) and Piyaz (FrkAk/piyaz, 194 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
PerpetualSoftware (a GitHub organization) maintains it in PerpetualSoftware/pad, which has 186 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 8, 2026.
Source: PerpetualSoftware/pad on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.