pi-company
Run visible Pi agents like a local project team.
Package details
Install pi-company from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-company- Package
pi-company- Version
0.1.20- Published
- Jun 11, 2026
- Downloads
- not available
- Author
- aa2246740
- License
- Apache-2.0
- Types
- extension
- Size
- 432.8 KB
- Dependencies
- 2 dependencies · 5 peers
Pi manifest JSON
{
"extensions": [
"./dist/extensions/company.js"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-company
Run Pi agents like a visible local project team.
pi-company connects the Pi sessions you already open into one local workflow: lead keeps the global brief, workers coordinate through mailboxes, coders edit in isolated git worktrees, and local PRs cannot merge until review, test, and product acceptance gates pass.
Why Install It?
If you are already opening several Pi windows for one project, pi-company adds the missing operating layer:
- Visible agents, not hidden subagents. Every worker is still a normal Pi session you can watch, interrupt, and steer.
- One shared project truth. Lead reads local issues, PRs, gates, inboxes, runtime state, and recovery snapshots before claiming work is done.
- Parallel code without branch chaos. Coder agents work in separate git worktrees and must submit local PRs.
- Quality gates before merge. Review, tester validation, automated checks, and PM/lead product acceptance are tracked as structured evidence.
- Human steering stays global. When you type into any company Pi session, the guidance is mirrored to lead so the team does not drift.
- Provider pressure is managed. Requests are queued and staggered per provider to reduce overload failures and noisy recovery storms.
The point is simple: keep the speed of multiple agents without giving up the control of a human-readable project process.
60-Second Start
npm install -g pi-company
pi install npm:pi-company
cd ~/Documents/cmux/tarot-draw
pi
Inside Pi:
/company-init
Then talk to lead:
Build the tarot draw site. Decide which roles are needed, create issues, and keep the project gated until it is tested and accepted.
After a project has .pi-company/, ordinary pi starts from that directory attach to the existing company automatically. Ordinary directories stay ordinary Pi.
What It Looks Like
human -> lead -> local issues -> coder worktrees -> local PR
-> reviewer + tester -> PM/lead acceptance -> gates -> lead merge
Every company agent gets a desk panel inside Pi. Agents coordinate through local tools and mailbox messages. cmux can open panes automatically, but it is optional. Without cmux, you can paste launch commands into ordinary terminal windows.
What You Get
| Capability | What it means in practice |
|---|---|
| Lead brief | A single local delivery truth before anyone says "done". |
| Human steering mirror | Guidance typed into any company Pi session reaches lead. |
| Local issues | Lead breaks work into owned tasks instead of vague chat promises. |
| Coder worktrees | Parallel implementation without agents editing the same checkout. |
| Local PR gates | Coder ready, automated tests, reviewer approval, tester pass, PM/lead acceptance. |
| Recovery snapshots | If a worker pane disappears, lead sees bounded terminal text instead of waiting silently. |
| Provider queue | Same-provider requests are limited and staggered before overload errors pile up. |
| Role model policy | Different roles can launch with different configured Pi models. |
What It Is
pi-company has two pieces:
- Pi extension/package: loaded into Pi sessions to add the desk panel, mailbox polling, tools, slash commands, and human-steering mirror.
- Helper CLI: used to initialize a project, print launch commands, spawn agents, inspect status, and handle occasional operations.
Node is only the runtime for the CLI and extension code. You do not run a Node daemon in daily use. You enter a project directory and launch Pi with the pi-company extension.
What It Is Not
- Not a cloud service.
- Not a headless orchestrator that hides work from you.
- Not a replacement for Pi.
- Not a cmux-only tool. cmux improves pane management, but the runtime works with normal terminals.
- Not a license to skip review. The whole point is to make multi-agent work auditable.
Daily Use
pi
Inside Pi:
/company-init
/company-init creates the project-local .pi-company/ state and attaches the current Pi session as lead. After that, starting Pi from that directory is enough: Pi restores the chat session normally, and pi-company automatically attaches to the existing company, shows the desk panel, registers company tools, mirrors human steering, gates provider requests, and refreshes role/lead context before each agent turn.
If you prefer shell-first setup, pi-company init does the same initialization before you launch Pi.
If you want to manually push the current role instructions and lead brief into the visible chat, run /company-start inside Pi. It is a refresh command, not a required resume step.
If a one-off skill or maintenance task needs ordinary Pi behavior, run
/company-pause in that Pi session. It pauses company tool guards, inbox
delivery, provider gates, and company prompt injection for that session only.
Run /company-resume to restore company context. Use this as an escape hatch,
not as the normal way to bypass role ownership.
Installing the Pi package does not make every pi session a company session. In ordinary directories without .pi-company/, Pi stays ordinary: pi-company does not create files, register company tools, mirror human input, gate provider requests, or show the company desk panel.
Then talk to lead in natural language:
Continue the tarot draw website. Check current state, decide which roles are needed, and distribute the work.
Lead uses pi-company tools to create issues, assign work, coordinate coder/reviewer/tester/PM, and track gates. If you need another visible agent pane, lead can spawn it through tools, or you can run:
npm install -g pi-company # optional helper CLI
pi-company spawn tester --manual
pi-company spawn coder --name coder-ui --yes --manual
If cmux is installed:
pi-company spawn tester --cmux
pi-company spawn coder --name coder-ui --yes --cmux
spawn and launch-command start company-managed agents with Pi --approve
so generated worktrees do not block on Pi's project trust prompt. Ordinary pi
sessions outside a company project are unchanged.
--root <project> is only for operating on a project while your shell is somewhere else:
pi-company --root ~/Documents/cmux/tarot-draw status
When you are already inside the project directory, omit --root.
If you prefer to launch lead directly from the shell:
eval "$(pi-company launch-command lead)"
Running init again in an existing company is idempotent. It loads the existing
event log instead of resetting roster, issues, PRs, or agent status.
init also keeps .pi-company/ in .gitignore so local company state and
managed worktrees do not get committed by git add ..
Lead Is the Human Proxy
Lead is not a passive dispatcher. Lead should make routine low-risk decisions, preserve the human's requirements, and keep the project moving. Lead should only ask the human for decisions that are irreversible, expensive, legal/security sensitive, external-contract dependent, brand-risky, or mission-changing.
Lead should not absorb role-owned execution work. If the human names a required skill, tool, or method, lead preserves that requirement in the assignment to the responsible agent instead of doing that work in the lead context.
Current Scope
- Pi required
- Local single-machine runtime
- One project per company
- Project-local
.pi-company/state - Event log + reducer + mailboxes
- Local issues and PR gates
- Separate coder worktrees for parallel code edits
- Human steering mirrored to lead from every interactive Pi session
- Organization-level rate-limit backoff and staggered recovery
- Optional cmux spawn adapter
Development
npm install
npm run check
npm run build
Role File Boundaries
Pi-company separates files by their impact, not by whether they are written
with a write tool. Non-coder roles can write non-runnable Markdown/docs in
their responsibility area: PRDs, product specs, design notes, test reports,
review notes, research reports, repo-governance docs such as AGENTS.md /
CLAUDE.md, and docs/agents/**.
Runnable or behavior-changing files still belong to coder worktrees and PR gates: source files, HTML/CSS/JS, configs, package files, scripts, CI, tests, assets, generated app files, and other implementation artifacts. Coder agents can mutate only inside their assigned worktree.
For source development:
npm install
npm run build
node dist/src/cli.js status
Use spawn to create a new named agent or to launch an existing roster member.
For an exact shell command without spawn ergonomics, use launch-command <agent>.
Role Model Policy
Pi-company can launch different roles with different Pi models.
Model choices are not free-form inside the Pi UI: lead uses Pi's configured
available model list, the same source as /model and pi --list-models.
In the lead Pi pane, the human can simply say "configure role models" or run:
/company-configure-models
Lead opens a choice-based wizard. The human does not need to know role names ahead of time. The wizard lists each target with its current setting:
- default model for future and unconfigured roles
- all built-in supported roles: lead, pm, designer, researcher, coder, reviewer, tester
Targets show whether they are explicitly configured, inheriting the default, or falling back to Pi's current startup model before the human changes anything.
For each target, lead chooses one model from Pi's configured models, then an optional thinking level. After one target is configured, the wizard asks whether to configure another role or default.
The selection is saved to .pi-company/company.yaml under model_policy.
For example:
model_policy:
roles:
coder:
provider: openai-codex
model: gpt-5.4-mini
thinking: low
tester:
provider: xiaomi-token-plan-cn
model: mimo-v2.5-pro
If no explicit default is configured, agents inherit Pi's normal startup model, which is usually the same model the lead pane was launched with. If default is changed, dynamically added agents inherit that default unless their role has a role model policy.
Pi-company intentionally keeps this as an organization-level policy. If one specific running agent needs a temporary model change, switch it in that agent's own Pi pane with Pi's normal model controls instead of encoding it into the company defaults.
The next launch-command or company_spawn_agent run for that role includes
Pi flags such as --provider, --model, and --thinking. Running Pi panes keep
their current model until they are restarted or changed inside Pi.
Inside Pi, only the configured lead agent can spawn persistent agents. Other agents should message lead when they need more role context.
Only lead can create or assign formal local issues. Other agents should report scope changes, blockers, or follow-up work to lead through the mailbox. Issue assignees must already exist in the company roster; spawn/register new agents before assigning work to them.
Only the assigned issue owner can start, block, report on, or complete that issue.
When a mission or message contains shell-sensitive text such as $impeccable,
$grill-me, or $PORT, read it from stdin or a file instead of putting it in
double-quoted shell arguments:
printf '%s' 'Use $impeccable to polish site/.' \
| node dist/src/cli.js spawn coder --name coder-ui --yes --manual --mission-stdin
printf '%s' 'Run: PORT=8765; curl http://127.0.0.1:$PORT/' \
| node dist/src/cli.js message --from lead --to tester --type test --text-stdin
Launch a coder with an isolated worktree:
node dist/src/cli.js spawn coder --name coder-api --yes --manual
New coder worktrees branch from main when it exists, regardless of the
current checkout in the project root.
If cmux is installed and available:
node dist/src/cli.js spawn tester --cmux
node dist/src/cli.js spawn coder --name coder-api --yes --cmux
Pi Extension
The package exposes the compiled extension through package.json:
{
"pi": {
"extensions": ["./dist/extensions/company.js"]
}
}
During development you can also load the source extension:
pi -e ./extensions/company.ts --company-root "$PWD" --company-agent lead --company-role lead
The extension registers:
- UI: status line and desk panel for the current agent
- input hook: mirrors interactive human steering to lead
- mailbox poller: reads local messages; wake metadata tells future launchers whether a message should wake immediately or wait for digest
- commands:
/company-init,/company-start(manual brief refresh),/company-resume,/company-pause,/company-maintain,/company-status,/company-brief,/company-inbox,/company-ack,/company-send,/company-configure-models - tools: status, lead/global brief, lifecycle maintenance, inbox, send message, issues, task updates, spawn agent, local PR gates, review, test, product acceptance, automated-test evidence, merge request, rate-limit report, model policy configuration
company_lead_brief is the lead's authoritative global delivery view. Lead
must use it before telling the human that work, a feature, a PR, or the project
is complete or merged. Worker prose such as "done", "merged", "tested", or
"basically complete" is not delivery truth until the brief shows the related
issues done, PRs merged, and no dirty tracked worktree blockers.
Lifecycle Maintenance
Pi-company keeps volatile agent liveness under .pi-company/runtime/ instead
of appending periodic heartbeat events forever. Lead runs a lightweight watchdog
that can:
- read live cmux terminal text with
cmux read-screen - write bounded recovery snapshots under
.pi-company/runtime/recovery/ - notify lead when an assigned worker is offline or stale
- hibernate idle worker surfaces with
cmux close-surfacewhile preserving worktrees, branches, issues, and PR records
The default policy keeps at most six active company-owned surfaces, hibernates
idle coder panes after five minutes, hibernates idle non-coder workers after
fifteen minutes, and keeps one warm pm, tester, and reviewer when idle.
It does not auto-relaunch closed workers by default; lead decides whether to
relaunch the same owner or reassign after reading the terminal-text excerpt.
Lead can run the same pass manually with /company-maintain or the
company_maintain tool.
Message Backpressure
Every message is still written to the target agent's mailbox. To avoid wake
storms and Pi provider 429 errors, each message also carries a wake decision:
immediate: suitable for waking the target agent nowdigest: keep it in inbox; let the target agent read it in the next batch
By default, human steering always wakes lead. Assignments, review requests, test requests, and system messages can wake immediately, but respect per-agent and organization-level cooldowns. The default wake policy is light: the same agent can be woken again after 10 seconds, with up to six immediate wakes per agent per minute and twelve per company per minute. Normal reports, replies, and questions default to digest unless marked high priority.
The Pi extension records provider HTTP 429 responses through Pi's
after_provider_response hook. It also catches 429 or quota-like failures
while injecting mailbox follow-ups: the message remains unacknowledged, the
company enters backoff, and delivery is retried only after the wake policy says
the target agent can resume.
pi-company also gates provider requests before they are sent. Every Pi pane
loads the extension, and before_provider_request acquires a local provider
lease under .pi-company/provider-queue/. By default, one company allows at
most three concurrent requests per provider and spaces starts for the same
provider by five seconds. If Pi does not expose a provider name for a request,
the request is conservatively grouped under unknown-provider.
If an agent, human, or external supervisor sees provider 429, quota
exhaustion, or repeated retry failures outside those hooks, report the incident
instead of retrying in a loop:
pi-company rate-limit --actor tester --reason "Retry failed after 3 attempts: 429 Too many requests"
For cmux-based companies, an external supervisor can scan visible pi-company surfaces and report terminal-text-visible provider failures:
pi-company cmux-rate-limit-scan --workspace workspace:16
The scan ignores pi-company's own rate-limit: active/recent status lines and
does not extend an already active backoff unless --force is passed.
If a scan or human observation is verified as a false positive, lead can clear
the backoff with pi-company rate-limit-clear --actor lead --reason "..." or
the company_clear_rate_limit Pi tool.
Inside Pi, agents can use the company_report_rate_limit tool for the same
purpose. The first provider 429 pauses automatic wakes for 60 seconds. A second
report while the pause is active backs off to 120 seconds, up to a 10 minute cap.
Quota exhaustion uses at least a 10 minute pause. Lead is resumed first; other
agents are resumed in 30 second staggered intervals so recovery does not wake the
whole company at once.
The wake policy is not the main provider-safety mechanism. It only prevents message storms. Provider safety comes from the request gate: at most three concurrent requests per provider, with starts spaced by five seconds by default. Extra messages are queued as digest wakes only when they would repeatedly wake the same agent or exceed the company wake budget.
This is harness-level buffering for mailbox delivery and follow-up wakes. It does not replace Pi's provider retry logic for a model request that is already running. When that request fails, the agent records the rate-limit incident and lets pi-company delay the next wave of work.
Mailbox participants and inbox readers must be known agents. The special sender
system is allowed for system notices, but recipients are always validated
against the company roster so typo inboxes do not silently absorb work.
Agent registration must match the lead-created plan for role, branch, and worktree. A spawned Pi session can mark itself online, but it cannot silently turn into another role or claim another worker's branch.
Local PR Gates
CLI pr ready and pr auto-test default to the PR author when --actor is
omitted. Pass --actor tester or --actor system explicitly when those actors
actually produced the automated test evidence.
pr review, pr test, pr accept, and pr auto-test accept an optional
--head <commit> that pins the evidence to the exact commit the actor verified.
When omitted, evidence is stamped against the current branch tip. Passing the
reviewed commit closes a race where a coder lands a new commit between
inspection and evidence submission: the gate only counts evidence whose head
matches the PR's current head, so head-pinned evidence on a superseded commit
correctly goes stale instead of green-lighting unreviewed code.
A PR is mergeable only when:
- the PR author is an existing coder agent
- issue-bound PRs are created by the assigned owner of that issue
- the PR branch and worktree match the author's registered branch/worktree when they are known
- coder self-test evidence exists
- test brief exists
- automated tests are recorded as passed
- required independent reviewer approvals exist
- independent tester validation is pass
- PM or lead product acceptance is accept
- PR ready, review, test, product acceptance, automated test, and merge-request events come from known agents with the right role or ownership
- self-test, review, tester validation, product acceptance, and automated test evidence all match the current PR branch HEAD
- the PR branch resolves to a git commit and is not the base branch
- the PR branch still merges cleanly against the current base branch
- green evidence is explicitly clean and has no structured caveats; legacy summaries are also scanned for caveats, known issues, or unresolved risks
Product acceptance is a product-level gate, separate from tester validation and code review. PM or lead must verify that the user-facing behavior matches the human request and acceptance criteria. If a required flow was not observed, an API request/result was not visible, a named skill/tool/method was skipped, or evidence is missing, product acceptance must request changes or record a structured caveat; it cannot green-light the merge.
company_merge_pr executes the local git merge by default when lead calls it and
the gates are green. Non-lead agents can only request a merge, and lead can pass
execute_git: false to record a dry merge request. Tracked or staged root
changes block merge. Unrelated untracked files do not. Lead must not run raw
git stash, git reset, git clean, revert, or checkout-away commands in the
project root just to make a merge pass. Dirty tracked/staged root changes are a
merge blocker that must be resolved deliberately or escalated to the human. If
another PR lands first and creates a conflict, the remaining PR becomes blocked
before the project root is checked out or merged.
For UI work, tester should prefer deterministic local checks first: static file serving, DOM/content assertions, console/error checks, and targeted browser verification. Avoid repeated cmux browser viewport or screenshot loops in the user's main workspace; use them sparingly because they exercise cmux's WebView surface management, not just the website under test.
License
Apache-2.0. Contributions are accepted under the same Apache-2.0 license unless explicitly stated otherwise.