Command reference
Reference. Two ways to reach the same engine, and one of them is the way in.
Run the /procoder: commands
This is the interface. Each one is a skill: it runs the binary, reads the output, and knows what to do with it — which checks to re-run, what counts as evidence, when to refuse. Typing the binary yourself gets you the numbers without the judgment that surrounds them.
| Command | What it does |
|---|---|
/procoder:adr |
Architecture decision records: durable decisions with their date, context, and consequences — supersede, never rewrite. |
/procoder:agents |
Keep the universal agent layer in sync: per-host rule files derived from AGENTS.md, with drift blocking the gate. |
/procoder:audit |
Onboard an existing codebase: every domain's checks over the whole tree, then a triaged plan to bring it in line. |
/procoder:backlog |
The project layer: milestones, epics, and user stories with refusing controllers — spec-seeded, sprint-ready. |
/procoder:check |
Run the formatting gate over the changed files, as a commit or CI would. |
/procoder:ci |
CI/CD hygiene and run health: pinned actions, timeouts, concurrency, tests — plus the latest runs via gh. |
/procoder:debug |
Systematic debugging: root cause before any fix, one hypothesis at a time, and a three-strikes rule that questions the architecture instead of stacking patches. |
/procoder:deps |
The dependency freshness report: what is behind, by how much, per ecosystem — judgment stays yours. |
/procoder:docs |
The documentation report: references, diagrams, drift, API docs, badges, README structure, links, Pages. |
/procoder:doctor |
Report which formatters this repository needs, which are installed, and how to install the rest. |
/procoder:env |
What changed in the project's environment since you last synced: dependencies, migrations, new env keys. |
/procoder:format |
Show the formatted result for files, so you can review and write it. |
/procoder:git |
The pre-finish status: branch, hygiene findings, message checks, workflow lint, template state. |
/procoder:index |
The code index: build it, then find, search, refs, outline, and impact instead of grepping blind. |
/procoder:infra |
DevOps hygiene where the files exist: Dockerfiles, Terraform, Kubernetes manifests, Helm charts. |
/procoder:init |
Install the formatters this repository needs, with every command visible before it runs. |
/procoder:lint |
The canonical linter per ecosystem over your changes: findings are diagnoses you judge, fix, or explain. |
/procoder:maintain |
The maintainability report: dead-code candidates, complexity, function length — judgment calls you decide on. |
/procoder:merge |
Finish a PR properly: every check green, every review addressed — human and bot — then merge and clean up. |
/procoder:perf |
The performance discipline: measure before touching, benchmark what matters, prove regressions and fixes with numbers. |
/procoder:plan |
Turn an approved spec into an implementation plan an engineer with zero context could execute — with a quality controller that blocks placeholders and hollow tasks. |
/procoder:pr |
Prepare and open a pull request the senior way: gate, template, scrubbed, everything visible. |
/procoder:release |
The pre-tag controller: version sync, changelog, clean tree, gate, and suite — every failure listed, the tag printed, never run. |
/procoder:run |
How to run this project: the launch commands it declares, with the file that declared each. |
/procoder:security |
The security pass: secrets (blocking), SAST, dependency vulns — plus the index's entry points to review from. |
/procoder:simplify |
The over-engineering review: five tags (delete, stdlib, native, yagni, shrink), a mandatory replacement per finding, and a real null result when there is nothing to cut. |
/procoder:spec |
Spec-first design: a gap-closing interview that produces a complete spec, with a quality controller that blocks until every section is answered and every question resolved. |
/procoder:sprint |
Scope-boxed sprints over the backlog: one active sprint, explicit carry-over, a close that refuses to hide unfinished work. |
/procoder:status |
The state of play, computed fresh: branch, dirty files, the active sprint, open work, index freshness. |
/procoder:tdd |
Test-driven development with tests that actually catch breaks: red before green, name the break each test catches, and the mutation check before done. |
/procoder:test |
Run the repository's actual test suite: every ecosystem's canonical runner — NOT run is never green. |
/procoder:todo |
The quality-gated task list: tasks with real descriptions, testable acceptance criteria, and evidence — a task only closes when the controller agrees it is done. |
/procoder:update |
Update the procoder plugin from the marketplace and verify the new version end to end. |
The binary underneath
Everything below is what those skills call. Reach for it directly only when you have to:
- your agent is not Claude Code — see Install without the plugin
- you are scripting CI, where
procoder checkis the whole point - you are debugging Procoder itself
It is the same binary and the same rules either way; what you give up is the skill's judgment about what to do with the answer. Prefer the slash command.
The binary only ever computes and reports — the agent (or you) acts on the results (P-CONTROL).
Onboarding
procoder audit
The onboarding sweep for a repository Procoder has not governed before:
every domain's checks over the WHOLE tracked tree — formatting verdicts,
hygiene, secrets, lint — aggregated into one scorecard with a triage
order. Exit 1 while the repository would fail the gate; the
/procoder:audit skill drives the fixing.
Everyday commands
procoder check [paths...]
The commit gate. Over the changed files (or the given paths): formatting (unformatted and unchecked both fail), git hygiene (conflict markers, junk and caches, oversized files, AI-attribution lines — all blocking), workflow lint, CI hygiene, infrastructure hygiene, lint findings, secrets (blocking), docs checks, and the change's blast radius from the index. Exit 1 on any blocking finding.
procoder git
The pre-finish status: branch vs default, changed-file count, template
presence and registration, and every hygiene finding — the same rules as
check, shared through one code path so they can never disagree.
procoder format <files...>
Prints each file's formatted result (gofmt, ruff, prettier, rustfmt, clang-format, shfmt — the project's config always wins) so it can be reviewed and written. Never touches the file.
procoder lint [--types] [paths...]
The canonical linter per ecosystem: golangci-lint (Go), ruff check
(Python), shellcheck (shell), eslint (JS/TS — configless plain JavaScript
gets the built-in-rules Procoder baseline; configless TypeScript is out of
scope), cargo clippy (Rust), ktlint (Kotlin), swiftlint (Swift), rubocop
(Ruby), and checkstyle (Java, google_checks baseline). Go repositories without a golangci config get Procoder's curated
baseline (standard set plus gosec, gocritic, errorlint, unparam,
copyloopvar, nilerr) — the repo's own golangci config always wins,
whichever of .golangci.yml/.yaml/.toml/.json it uses. Report
by default; [lint] policy = "block" makes findings block.
--types adds the type-checker where the canonical linter does not
compile the code: tsc --noEmit for TypeScript (grouped under each
file's nearest tsconfig — without one the file is declared out of scope,
never silently skipped) and pyright for Python. Go and Rust need no
flag: golangci-lint and clippy already compile what they lint.
procoder backlog <sub>
The project layer under .procoder/backlog/: milestones → epics →
user stories, with the story as the execution unit of spec-based work
(the todo list stays standalone for everything else).
milestone <title>/epic <title> [--milestone <id>]/story <title> --epic <id>— print each file for the agent to review and write; slug collisions refuse rather than overwrite.bug <title> [--epic <id>] [--severity s1|s2|s3|s4]— a defect is a story withType: bugand a severity (default s3): the description prompts for reproduction steps, the criteria are pre-seeded with the non-negotiable regression test, and closing without a severity is refused. The board marks open bugs with their severity.seed <spec> [--milestone <id>]— decompose a COMPLETE spec into an epic plus one story per acceptance criterion. The epic records the spec name and a content fingerprint; an incomplete spec is refused with the spec checker's gaps replayed.list/board— the flat listing, and the tree with statuses, sprint tags, spec-drift flags (⚠ spec drift/⚠ spec missing), orphans, and a summary line.close story <id>...— refuses until the description is real, every acceptance criterion is checked, evidence is recorded, and the gate is clean — todo-close rigor, applied to stories. Several ids share ONE gate and suite run: the tree is what they judge, so asking per story only repeats the answer. An incomplete story is refused by name while the rest still close.close epic <id>/close milestone <id>— refuse while any child is open; epic close warns on spec drift (never blocks on it).
procoder sprint <sub>
Scope-boxed sprints over the backlog — a goal plus the stories pulled into it, no story points, no calendar enforcement.
open <goal>— refuses while another sprint is active (one active sprint is the WIP limit); prints the sprint file.pull <story-id>...— commits stories to the active sprint; done, missing, or already-committed stories are refused individually while the rest still pull.carry <story-id> <reason>— returns an unfinished story to the backlog with the reason recorded in the story file; no reason, no carry.status— goal, committed stories, done/total and carried counts.close— refuses while a committed story is neither done nor carried; on success the sprint file gains a Result section with committed/done/carried counts, plus a Retro scaffold (what slowed us, what we change, one adaptation worth keeping).- The retro is the price of the next sprint:
openrefuses while the last closed sprint's Retro is empty. A repo opts out with[sprint] retro = "off"in config.toml.
procoder release [<version>]
The pre-tag controller: verifies in one pass that every file in
[release] files (config.toml) carries the version, CHANGELOG.md has
the ## <version> entry, the working tree is clean (untracked
included), the gate is clean, and the suite is green under
[test] policy. Every failure is listed together; on success the
git tag command is printed for the agent to run — the binary tags
nothing. Without [release] files the version-sync leg says
it verified nothing. Bare procoder release reads the newest changelog
version and checks that.
procoder adr <sub>
Architecture decision records under .procoder/adr/, numbered and
immutable — a changed mind writes a new record and supersedes the old.
new <title> prints the next-numbered record (Context / Decision /
Consequences); list shows proposed first; check refuses hollow
records, unknown statuses, dangling supersede references, and
duplicated numbers. The audit sweep includes these findings.
procoder deps
The freshness report: outdated dependencies per ecosystem via each
one's native tool — go list -u -m, npm outdated, cargo-outdated and
pip where available — capped, summarized, report-only. Licenses report
where a tool exists (go-licenses for Go) and answer NOT checked
everywhere else. A missing optional tool is information; a
tool that errored is a failure.
procoder bench [--save]
The Go benchmarks (go test -bench . -benchmem), compared against the
committed baseline in .procoder/bench/baseline.txt: per-benchmark
ns/op and B/op deltas, regressions beyond [bench] threshold (default
10%) marked and exiting 1, new and vanished benchmarks listed. --save
records a new baseline — a decision, taken deliberately. Results are
single-run and machine-local; a baseline from another GOOS/GOARCH
compares with a warning. Go only in this version, said out loud.
procoder test [--coverage] [--name <pattern>] [paths...]
The repository's actual test suite, run by every detected ecosystem's
canonical runner: go test ./..., cargo test, the package.json test
script (via the lockfile's package manager), pytest, and gradle/maven.
Verdicts are PASS with counts where the output allows, FAIL
with the failing tests named, and NOT run when a runner or test script
is absent, which is never reported as green. --coverage adds the
percentage where the runner measures it natively (Go; pytest with
pytest-cov); a number is reported, never enforced. With
--name <pattern> narrows the run to matching tests — -run for Go,
-k for pytest, --tests for gradle, -Dtest= for maven, the pattern
after -- for a JS test script, and a positional for cargo. A runner
that cannot express the pattern reports NOT filtered rather than
silently running everything, and zero matches is a pass saying
so. With [test] policy = "block" in config.toml, todo close and
backlog close story run the suite and refuse while it is red — or
while it cannot be verified at all, because unknown is never done.
procoder status
The state of play, computed fresh: current branch against the default, dirty file count, the active sprint with its done/total and open stories, open todo tasks, unlearned lessons, and index freshness. Every line is a computed fact; anything that cannot be read says so with the reason rather than defaulting to something comfortable. The same block is injected at session start, inside a hard three-second budget that never runs the gate, the suite, or any network tool.
procoder run [--exec]
How to run this project: the launch command(s) it declares — package.json
scripts, Makefile targets, a Go main, a Cargo bin, manage.py, docker
compose, a Procfile — each with the file and line that declared it,
most specific first. Procoder does not manage processes: a server is
long-running, and backgrounding and log capture belong to the shell that
owns it. --exec runs a single one-shot candidate (120s, stdin closed)
and refuses when there is a choice to make or the command looks like a
server. A repository with nothing to run says so and exits 0.
procoder env [--sync]
What changed in the project's environment since you last synced:
lockfile digests per ecosystem with the install command to run,
migrations added or removed, and keys declared in an .env.example that
the local .env lacks — key names only, never a value from either
file. --sync records the current tree as the new baseline, which is a
statement that you have installed and migrated. Report-only: drift is
judgment, never a block. Files git ignores are never surveyed.
procoder security [--deep]
Secrets over the changed files with gitleaks — always blocking, values
never echoed, rotation ordered. --deep adds semgrep SAST (ERROR blocks)
and osv-scanner dependency vulnerabilities (CVSS ≥ 7.0 blocks) over the
repository.
procoder maintain
Dead-code candidates from the index's precise tier, cyclomatic complexity
and function length from isolated linter runs. Nothing blocks; thresholds
are the repo's to set ([maintain] in config.toml).
procoder docs [--external]
Broken relative references and non-compiling Mermaid diagrams block; doc
drift, missing API doc comments, required docs, badges, README structure,
version-tracked pages, and command coverage report. --external adds
lychee link checking and GitHub Pages health.
procoder ci [--runs]
Workflow hygiene: actions pinned to mutable refs (report by default,
[ci] pin_actions_policy = "block" to block), missing per-job
timeout-minutes, missing concurrency cancellation, and pipelines without
tests.
procoder infra
Where the files exist: hadolint over Dockerfiles, terraform fmt /
validate / tflint over Terraform (a failing validate blocks),
kubeconform over Kubernetes manifests, helm lint over charts.
Specs, plans, and tasks
The chain: a spec says what and why, a plan says how exactly, todos track gated execution — and each link has its own quality controller.
procoder todo <sub>
The quality-gated task list under .procoder/todo/ — one Markdown file
per task, with a real description, testable acceptance criteria, and an
evidence section.
add <title>— prints the task file and its path; the agent writes it and replaces the placeholders before starting work.list/show <id>— every task (open first) / one task in full.close <id>— the quality controller. It refuses to close until every acceptance criterion is checked, the evidence section records what was run and what it proved, and the commit gate is clean — and it names exactly what is missing. Only a passing close movesStatus:to closed.
procoder spec <sub>
Spec-first design under .procoder/specs/ — the /procoder:spec skill
interviews the gaps closed; the binary judges completeness.
template <name>— prints the spec shape (Problem, Users, In/Out of scope, Constraints, Interfaces, Data, Edge cases, Failure modes, Acceptance criteria, Open questions) for the agent to write.list— every spec in the repo.check [name|all]— the quality controller: blocks while any required section is missing or empty, while anyOPEN:question is unresolved, and while acceptance criteria are not testable checkboxes. A complete spec seeds the todo list — one task per criterion group.
procoder plan <sub>
Implementation plans under .procoder/plans/, written from an approved
spec for an engineer with zero context.
template <name>— prints the plan shape (Goal, Architecture, Constraints,## Task N:blocks with Files, Interfaces, checkbox steps).list— every plan in the repo.check [name|all]— the quality controller: blocks on placeholders ("TBD", "handle edge cases", "similar to task N" — a plan is written, not promised), on empty sections, and on tasks withoutFiles:or checkbox steps.
procoder debt
Harvests deliberate-simplification markers into a ledger. Convention: a
corner cut on purpose carries a comment with the configured marker
(default debt:, [debt] marker in config.toml) naming the ceiling and
the condition to revisit. Markers with no revisit trigger are flagged —
those are the ones that silently rot. Read-only, never blocking.
procoder agents
The universal agent layer: per-host rule files (Cursor, Windsurf, Cline,
Kilo Code, Roo Code, Kiro, Antigravity, Qoder, Copilot editors, Codex)
derived from the canonical AGENTS.md. Prints the content for anything
missing or drifted so the agent can write it; drift blocks the gate.
See Every agent for the full host matrix.
procoder lessons
The self-learning loop's ledger (.procoder/github/LESSONS.md): every
finding that escaped the repository's gates and was caught downstream becomes a
lesson, and every lesson must carry the adaptation that closes its class —
a linter enabled, a line added to the pre-PR review rubric
(.procoder/github/REVIEW.md), a controller tightened, a pinning test.
Entries with no adaptation are flagged UNLEARNED and exit 1 — recorded is
not learned. An unreadable ledger exits 2.
procoder principles
Prints the engineering principles each session starts with (a SessionStart
hook injects them): build-ladder first — reuse, stdlib, platform, then the
minimum code that works — the delegation discipline (independent work
fans out to parallel subagents under a clear contract, watched as it
lands, nothing merged unjudged), and ADHD/ASD-friendly formatting for
complex answers: a title and one-line summary, type-labeled problem
cards, decisions in their own numbered list, noise filtered, and short
single-topic answers left plain. A repo replaces them wholesale with
.procoder/PRINCIPLES.md.
The code index
procoder index <sub>
build— both tiers: universal-ctags (broad) + SCIP (precise) into.procoder/index/(gitignored), stamped with the commit.find <symbol>/search <text>/outline <file>— definitions, fuzzy lookup, a file's symbols in order.refs <symbol>— every reference, labeled precise (SCIP) or textual.impls <symbol>— what implements an interface or its methods. Precise tier only: implementation relationships exist nowhere else, so without SCIP the answer is "not built", never a textual guess.callers <symbol>/graph— the call graph and its JSON edge list.unused— dead-code candidates, exported API marked.entrypoints— mains and the exported surface.impact— the blast radius of the working-tree change.stats— what's indexed and staleness, said out loud.rename <symbol> <new> [--at path:line]— the cross-file rename as a reviewable unified diff, computed by the language's own engine (Go via gopls). Per P-CONTROL nothing is written: the agent reviews and applies the diff itself. Languages without an engine answer with the reference worksheet (refs) instead of a half-right rewrite;--atpicks one definition when the name is defined more than once.
Setup and plumbing
procoder doctor
Which tools this repository needs (by its file inventory), which are installed, versions, and the install command for each gap.
procoder init [--yes]
Prints one install command per missing tool for this machine's package
managers; --yes executes them and re-surveys — an installer exiting 0 is
a claim, the tool resolving is the fact.
procoder templates
Prints the default content for any missing repo file Procoder reads:
the PR/commit/workflow templates under .procoder/github/, the docs and
security rules, the Mermaid theme.
procoder scrub <file|->
Checks text for AI-attribution lines; exit 1 when any are found.
procoder hook post-tool-use
The write hook's entry point — reads a PostToolUse payload on stdin and answers with findings for the file just written. Wired by the plugin; rarely invoked by hand.
procoder version
Prints the version.