929 lines
28 KiB
Markdown
929 lines
28 KiB
Markdown
# pi-crew
|
|
|
|
`pi-crew` is a Pi extension/package for coordinated AI teams: autonomous routing, manual slash-command controls, durable run state, artifacts, async/background execution, optional worktree isolation, resource management, validation, import/export, dashboard helpers, and safe API interop.
|
|
|
|
NPM package:
|
|
|
|
```text
|
|
pi-crew
|
|
```
|
|
|
|
GitHub repository:
|
|
|
|
```text
|
|
https://github.com/baphuongna/pi-crew
|
|
```
|
|
|
|
## Status
|
|
|
|
`pi-crew` is published on npm and implemented with safe execution defaults and product-oriented foundations.
|
|
|
|
Current highlights:
|
|
|
|
- one main Pi tool: `team`
|
|
- autonomous delegation policy injection before agent start
|
|
- metadata-aware `recommend` action for routing, decomposition, fanout hints, async/worktree suggestions
|
|
- configurable autonomy profiles: `manual`, `suggested`, `assisted`, `aggressive`
|
|
- builtin agents, teams, and workflows
|
|
- user/project/builtin resource discovery where user resources override builtin resources, and project resources cannot shadow trusted user/builtin names
|
|
- resource format support for routing metadata: `triggers`, `useWhen`, `avoidWhen`, `cost`, `category`
|
|
- durable run state: manifest, tasks, events, artifacts, imports/exports
|
|
- foreground workflow scheduler
|
|
- detached async/background runner
|
|
- stale async PID detection
|
|
- active run summary and async completion notifications in Pi sessions
|
|
- owner-session delivery guards so stale sessions do not receive background subagent/result/live-session completions
|
|
- real child Pi worker execution by default, with explicit scaffold/dry-run opt-out
|
|
- child Pi JSON output parsing for final text, usage, and event counts
|
|
- retryable model fallback attempts per task
|
|
- aggregate usage totals in status/summary
|
|
- progress, summary, prompt, result, log, diff, patch, export artifacts
|
|
- task packets, verification/green-contract evidence, policy decision artifacts, and task graph metadata
|
|
- opt-in git worktree isolation per task
|
|
- worktree branch mismatch detection
|
|
- dirty worktree preservation unless `force` is explicitly set
|
|
- cancel/resume lifecycle operations
|
|
- forget/prune cleanup operations with explicit confirmation
|
|
- export/import portable run bundles
|
|
- resource create/update/delete with backups, dry-run, reference checks, and optional reference updates
|
|
- resource validation and doctor checks
|
|
- project initialization for `.pi` layout and `.gitignore`
|
|
- config show/update with user/project scope and nested unset support
|
|
- safe API interop for manifest/task/event/heartbeat/claim/mailbox operations
|
|
- realpath containment for run/import/artifact/transcript/mailbox/agent state reads and writes, including symlink escape protection
|
|
- read-only state APIs avoid creating mailbox files when only inspecting delivery or mailbox state
|
|
- run-level and task-level mailbox files with validation/repair support
|
|
- `/team-manager` interactive helper
|
|
- `/team-dashboard` custom TUI overlay with progress preview, action shortcuts, and reload
|
|
- `parallel-research` team/workflow for dynamic `Source/pi-*` fanout and parallel shard exploration
|
|
- observability metrics: per-session Counter/Gauge/Histogram registry, JSONL sink, `/team-metrics`, dashboard metrics pane, Prometheus/OTLP exporters (OTLP opt-in)
|
|
- reliability hardening: heartbeat gradient watcher, opt-in retry executor with attempt trace, crash-recovery detection, deadletter queue
|
|
- background `Agent`/`crew_agent` completion wake-up so parent sessions can automatically join completed subagent results
|
|
- optional `runtime.requirePlanApproval` gate for planner-first approval before mutating adaptive implementation workers run
|
|
- optional `runtime.completionMutationGuard` to warn or fail implementation-style workers that complete without observed mutation tool calls
|
|
- grouped result delivery is correlated through mailbox metadata, deduped by request id, and acknowledged via existing `ack-message`
|
|
- shared redaction for common secrets before durable event/log/mailbox/artifact/metric/diagnostic persistence
|
|
- package polish: `schema.json`, TypeScript semantic check, strip-types import smoke, cross-platform CI workflow, dry-run package verification
|
|
|
|
## Install
|
|
|
|
From npm:
|
|
|
|
```bash
|
|
pi install npm:pi-crew
|
|
```
|
|
|
|
From the workspace root for local development:
|
|
|
|
```bash
|
|
pi install ./pi-crew
|
|
```
|
|
|
|
Optional config bootstrap after npm install:
|
|
|
|
```bash
|
|
pi-crew
|
|
```
|
|
|
|
Optional config bootstrap from a local clone:
|
|
|
|
```bash
|
|
node ./pi-crew/install.mjs
|
|
```
|
|
|
|
Local verification from this package:
|
|
|
|
```bash
|
|
cd pi-crew
|
|
npm run ci
|
|
```
|
|
|
|
## Runtime safety model
|
|
|
|
By default, `run` launches each crew task as a separate child Pi process. This matches the subagent model from `pi-subagents`: the parent session orchestrates while worker sessions execute independently and stream durable output back to run state.
|
|
|
|
Use scaffold/dry-run mode only when you explicitly want prompts/artifacts without launching workers:
|
|
|
|
```json
|
|
{
|
|
"runtime": { "mode": "scaffold" }
|
|
}
|
|
```
|
|
|
|
or disable workers globally:
|
|
|
|
```json
|
|
{
|
|
"executeWorkers": false
|
|
}
|
|
```
|
|
|
|
Worktree mode is opt-in:
|
|
|
|
```json
|
|
{
|
|
"action": "run",
|
|
"team": "implementation",
|
|
"goal": "Implement feature X",
|
|
"workspaceMode": "worktree"
|
|
}
|
|
```
|
|
|
|
By default, worktree mode requires a clean leader repository. Dirty task worktrees are preserved unless cleanup is called with `force: true`.
|
|
|
|
## Config
|
|
|
|
User config path:
|
|
|
|
```text
|
|
~/.pi/agent/extensions/pi-crew/config.json
|
|
```
|
|
|
|
Project config path:
|
|
|
|
```text
|
|
.crew/config.json # default (new projects)
|
|
.pi/teams/config.json # legacy (when the repo already has .pi/)
|
|
```
|
|
|
|
The project root is auto-detected by walking up from the current directory and stopping at any of: `.git`, `.pi`, `.crew`, `.hg`, `.svn`, `.factory`, `.omc`, or any common manifest file (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `pom.xml`, `composer.json`, `build.gradle[.kts]`). If the project already has a `.pi/` directory, pi-crew reuses it under `.pi/teams/` to avoid creating a parallel layout; otherwise it uses `.crew/`.
|
|
|
|
Config merge priority:
|
|
|
|
```text
|
|
user < project for ordinary presentation/UX settings
|
|
```
|
|
|
|
Trust-boundary exception: project config is intentionally not trusted for sensitive execution controls. Project-level values such as `executeWorkers`, `asyncByDefault`, runtime mode/live-session inheritance, autonomy mode, `agents.disableBuiltins`, `agents.overrides`, `worktree.setupHook`, and `otlp.headers` are ignored with warnings. Set those in user config when you want to trust them explicitly.
|
|
|
|
Resource discovery trust boundary: project-local agents, teams, and workflows may add new names, but cannot shadow builtin or user resources with the same name.
|
|
|
|
Supported config:
|
|
|
|
```json
|
|
{
|
|
"asyncByDefault": false,
|
|
"executeWorkers": true,
|
|
"notifierIntervalMs": 5000,
|
|
"requireCleanWorktreeLeader": true,
|
|
"autonomous": {
|
|
"profile": "suggested",
|
|
"enabled": true,
|
|
"injectPolicy": true,
|
|
"preferAsyncForLongTasks": false,
|
|
"allowWorktreeSuggestion": true,
|
|
"magicKeywords": {
|
|
"review": ["review", "audit", "inspect"]
|
|
}
|
|
},
|
|
"runtime": {
|
|
"mode": "auto",
|
|
"groupJoin": "smart",
|
|
"groupJoinAckTimeoutMs": 300000,
|
|
"requirePlanApproval": false,
|
|
"completionMutationGuard": "warn"
|
|
},
|
|
"limits": {
|
|
"maxConcurrentWorkers": 3,
|
|
"maxTaskDepth": 2,
|
|
"maxChildrenPerTask": 5,
|
|
"maxRunMinutes": 60,
|
|
"maxRetriesPerTask": 1,
|
|
"heartbeatStaleMs": 60000
|
|
},
|
|
"ui": {
|
|
"widgetPlacement": "aboveEditor",
|
|
"widgetMaxLines": 8,
|
|
"powerbar": true,
|
|
"dashboardPlacement": "center",
|
|
"dashboardWidth": 72,
|
|
"dashboardLiveRefreshMs": 1000,
|
|
"autoOpenDashboard": false,
|
|
"autoOpenDashboardForForegroundRuns": false,
|
|
"showModel": true,
|
|
"showTokens": true,
|
|
"showTools": true
|
|
},
|
|
"tools": {
|
|
"enableClaudeStyleAliases": true,
|
|
"enableSteer": true,
|
|
"terminateOnForeground": false
|
|
},
|
|
"telemetry": {
|
|
"enabled": true
|
|
},
|
|
"observability": {
|
|
"enabled": true,
|
|
"pollIntervalMs": 5000,
|
|
"metricRetentionDays": 7
|
|
},
|
|
"reliability": {
|
|
"autoRetry": false,
|
|
"autoRecover": false,
|
|
"deadletterThreshold": 3,
|
|
"retryPolicy": {
|
|
"maxAttempts": 3,
|
|
"backoffMs": 1000,
|
|
"jitterRatio": 0.3,
|
|
"exponentialFactor": 2
|
|
}
|
|
},
|
|
"otlp": {
|
|
"enabled": false,
|
|
"endpoint": "http://localhost:4318/v1/metrics"
|
|
}
|
|
}
|
|
```
|
|
|
|
Safety notes:
|
|
|
|
- Foreground child-process runs continue in the Pi extension process and return control to chat immediately, so large workflows do not block the interactive session. They are interrupted on session shutdown. Use `async: true` only for intentionally detached runs that may survive the current session.
|
|
- Async completion notifications survive extension reload/auto-compaction: active runs are not marked consumed just because the notifier restarts, while stale owner-session callbacks are suppressed after session switches.
|
|
- Background `Agent`/`crew_agent` runs notify the parent session when they reach a terminal state; the parent can then call `get_subagent_result`/`crew_agent_result` and continue the original task.
|
|
- `tools.terminateOnForeground` is an opt-in power-user setting. When true, foreground `Agent`/`crew_agent` calls return with `terminate: true` after the child result is available, saving one follow-up LLM turn. Default is false so the assistant can still summarize raw worker output.
|
|
- Runtime state paths are treated as untrusted data: run ids, import bundles, artifact/transcript paths, mailbox files, and agent control/log files are validated with containment checks before reads or writes.
|
|
- `runtime.completionMutationGuard` defaults to `warn`; set `off` to disable or `fail` to fail implementation-style tasks that report success without observed mutation tool calls.
|
|
- Group-join result messages use normal mailbox delivery and normal `ack-message`; missing acknowledgements never block run completion, and duplicate delivery attempts reuse the same request id/message instead of appending spam.
|
|
- Common secret patterns (`token=`, `apiKey=`, `Authorization: Bearer ...`, private keys, etc.) are redacted before durable logs/events/mailbox/artifacts/metrics/diagnostics are written.
|
|
- `observability.enabled` defaults to true for in-memory metrics and heartbeat watching. Metric JSONL snapshots are gated by `telemetry.enabled`; set `telemetry.enabled=false` to opt out of local telemetry files.
|
|
- `reliability.autoRetry` and `reliability.autoRecover` default to false. Enabling retry may execute an idempotent task more than once; each attempt is recorded in `task.attempts`, and exhausted retries append a deadletter entry.
|
|
- `otlp.enabled` defaults to false. Configure `otlp.endpoint` only when you want to push metrics to an OTLP HTTP collector.
|
|
|
|
UI notes:
|
|
|
|
- `widgetPlacement`/`widgetMaxLines` keep the persistent active-run widget compact.
|
|
- `dashboardPlacement: "center"` is the default for `/team-dashboard`; set it to `"right"` only when you want a right-sidebar dashboard.
|
|
- `autoOpenDashboard`/`autoOpenDashboardForForegroundRuns` control whether the live sidebar opens automatically. Both default to false so the compact widget above the input remains the primary live UI.
|
|
- `dashboardLiveRefreshMs` controls the live sidebar refresh cadence.
|
|
- `showModel`, `showTokens`, and `showTools` show worker model attempts, token usage, and tool activity in dashboard agent rows.
|
|
|
|
Show config:
|
|
|
|
```text
|
|
/team-config
|
|
```
|
|
|
|
Update user config:
|
|
|
|
```text
|
|
/team-config asyncByDefault=true notifierIntervalMs=5000
|
|
```
|
|
|
|
Update project config:
|
|
|
|
```text
|
|
/team-config autonomous.profile=assisted autonomous.preferAsyncForLongTasks=true --project
|
|
```
|
|
|
|
Unset/delete nested config keys:
|
|
|
|
```text
|
|
/team-config --unset=autonomous.preferAsyncForLongTasks --project
|
|
/team-config autonomous.preferAsyncForLongTasks=unset --project
|
|
/team-config autonomous.preferAsyncForLongTasks=null --project
|
|
```
|
|
|
|
Config schema is exported as:
|
|
|
|
```text
|
|
./schema.json
|
|
```
|
|
|
|
## Main tool
|
|
|
|
The extension registers one main tool:
|
|
|
|
```text
|
|
team
|
|
```
|
|
|
|
Use it for complex multi-file work, planning, implementation, tests, reviews, security audits, research, async/background runs, and worktree-isolated execution.
|
|
|
|
When unsure which team/workflow to choose, call:
|
|
|
|
```json
|
|
{
|
|
"action": "recommend",
|
|
"goal": "Refactor auth flow and add tests"
|
|
}
|
|
```
|
|
|
|
## Tool actions
|
|
|
|
Supported actions:
|
|
|
|
| Action | Purpose |
|
|
|---|---|
|
|
| `list` | List discovered teams, agents, workflows, and recent runs |
|
|
| `get` | Inspect a named agent/team/workflow |
|
|
| `recommend` | Suggest team/workflow/action plus decomposition and fanout hints |
|
|
| `run` | Create a run and execute the workflow scheduler |
|
|
| `plan` | Validate and preview workflow execution without running tasks |
|
|
| `status` | Read durable run status |
|
|
| `summary` | Read/write run summary artifact |
|
|
| `events` | Read run event log |
|
|
| `artifacts` | List run artifacts |
|
|
| `worktrees` | List run worktree metadata |
|
|
| `cancel` | Cancel queued/running work |
|
|
| `resume` | Re-queue failed/cancelled/skipped/running tasks |
|
|
| `cleanup` | Clean run worktrees; dirty worktrees are preserved unless forced |
|
|
| `forget` | Delete run state/artifacts after `confirm: true` |
|
|
| `prune` | Delete old finished runs after `confirm: true` |
|
|
| `export` | Export a portable run bundle |
|
|
| `import` | Import a run bundle into local imports |
|
|
| `imports` | List imported run bundles |
|
|
| `create` | Create agent/team/workflow in user/project scope |
|
|
| `update` | Update agent/team/workflow with backup |
|
|
| `delete` | Delete agent/team/workflow with `confirm: true` and backup |
|
|
| `validate` | Validate agents, teams, workflows, references, and model hints |
|
|
| `doctor` | Check local readiness and optionally run child Pi smoke check |
|
|
| `config` | Show/update config |
|
|
| `init` | Create project `.pi` layout and update `.gitignore` |
|
|
| `autonomy` | Show/update autonomous delegation settings |
|
|
| `api` | Safe interop for run/task/event/heartbeat/claim/mailbox state, including plan approval/cancel operations |
|
|
| `help` | Show help text |
|
|
|
|
## Example tool calls
|
|
|
|
Run a default team safely:
|
|
|
|
```json
|
|
{
|
|
"action": "run",
|
|
"team": "default",
|
|
"goal": "Investigate failing tests and propose a fix"
|
|
}
|
|
```
|
|
|
|
Run async:
|
|
|
|
```json
|
|
{
|
|
"action": "run",
|
|
"team": "implementation",
|
|
"goal": "Implement the user settings screen",
|
|
"async": true
|
|
}
|
|
```
|
|
|
|
Run with worktrees:
|
|
|
|
```json
|
|
{
|
|
"action": "run",
|
|
"team": "implementation",
|
|
"workflow": "implementation",
|
|
"goal": "Add API endpoint and tests",
|
|
"workspaceMode": "worktree"
|
|
}
|
|
```
|
|
|
|
Require explicit approval after the adaptive planner writes a plan artifact and before mutating workers run:
|
|
|
|
```json
|
|
{
|
|
"action": "run",
|
|
"team": "implementation",
|
|
"workflow": "implementation",
|
|
"goal": "Refactor auth and update tests",
|
|
"config": {
|
|
"runtime": { "requirePlanApproval": true }
|
|
}
|
|
}
|
|
```
|
|
|
|
Approve or cancel the pending plan:
|
|
|
|
```json
|
|
{
|
|
"action": "api",
|
|
"runId": "team_...",
|
|
"config": { "operation": "approve-plan" }
|
|
}
|
|
```
|
|
|
|
Inspect a run:
|
|
|
|
```json
|
|
{
|
|
"action": "status",
|
|
"runId": "team_..."
|
|
}
|
|
```
|
|
|
|
Create a routed agent:
|
|
|
|
```json
|
|
{
|
|
"action": "create",
|
|
"resource": "agent",
|
|
"config": {
|
|
"scope": "project",
|
|
"name": "api-reviewer",
|
|
"description": "Reviews backend API changes",
|
|
"systemPrompt": "You review backend API changes for correctness and compatibility.",
|
|
"triggers": ["api", "endpoint", "contract"],
|
|
"useWhen": ["backend API change", "OpenAPI contract update"],
|
|
"avoidWhen": ["documentation-only edits"],
|
|
"cost": "cheap",
|
|
"category": "backend"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Slash commands
|
|
|
|
Manual slash commands are ops/debug controls. Autonomous tool use via policy/recommendation is the primary agent-driven path.
|
|
|
|
```text
|
|
/teams
|
|
/team-run [--team=name] [--workflow=name] [--async] [--worktree] <goal>
|
|
/team-cancel <runId>
|
|
/team-status <runId>
|
|
/team-summary <runId>
|
|
/team-resume <runId>
|
|
/team-events <runId>
|
|
/team-artifacts <runId>
|
|
/team-worktrees <runId>
|
|
/team-cleanup <runId> [--force]
|
|
/team-forget <runId> --confirm [--force]
|
|
/team-prune --keep=20 --confirm
|
|
/team-export <runId>
|
|
/team-import <path-to-run-export.json> [--user]
|
|
/team-imports
|
|
/team-api <runId> <operation> [key=value]
|
|
/team-metrics [filter]
|
|
/team-manager
|
|
/team-dashboard
|
|
/team-init [--copy-builtins] [--overwrite]
|
|
/team-config [key=value] [--unset=key.path] [--project]
|
|
/team-settings [list|get <key>|set <key> <value>|unset <key>|path|scope]
|
|
/team-autonomy [status|on|off|manual|suggested|assisted|aggressive] [--prefer-async] [--no-worktree-suggest]
|
|
/team-validate
|
|
/team-help
|
|
/team-doctor
|
|
```
|
|
|
|
### `/team-api` examples
|
|
|
|
```text
|
|
/team-api team_... read-manifest
|
|
/team-api team_... list-tasks
|
|
/team-api team_... read-task taskId=task_...
|
|
/team-api team_... read-events
|
|
/team-api team_... read-heartbeat taskId=task_...
|
|
/team-api team_... write-heartbeat taskId=task_... alive=true
|
|
/team-api team_... claim-task taskId=task_... owner=worker-1
|
|
/team-api team_... release-task-claim taskId=task_... owner=worker-1 token=...
|
|
/team-api team_... transition-task-status taskId=task_... owner=worker-1 token=... status=running
|
|
/team-api team_... send-message direction=outbox to=worker body="please check this"
|
|
/team-api team_... send-message taskId=task_... direction=inbox to=worker body="task scoped message"
|
|
/team-api team_... read-mailbox direction=outbox
|
|
/team-api team_... read-mailbox taskId=task_... direction=inbox
|
|
/team-api team_... ack-message messageId=msg_... # also acknowledges group-join result messages
|
|
/team-api team_... read-delivery
|
|
/team-api team_... validate-mailbox repair=true
|
|
/team-api team_... approve-plan
|
|
/team-api team_... cancel-plan
|
|
```
|
|
|
|
Use `/team-metrics` for a current metrics snapshot. The optional argument is a glob-style metric filter:
|
|
|
|
```text
|
|
/team-metrics
|
|
/team-metrics crew.task.*
|
|
```
|
|
|
|
### `/team-settings` — view & manage config
|
|
|
|
List all settings, get/set individual keys, or unset (reset to default).
|
|
|
|
```text
|
|
/team-settings # list all known config keys
|
|
/team-settings get limits.maxTurns # read one key
|
|
/team-settings set limits.maxTurns 20 # update a key
|
|
/team-settings unset runtime.maxTurns # reset to default
|
|
/team-settings path # show config file path
|
|
/team-settings scope # show current scope (user/project)
|
|
```
|
|
|
|
**Supported config keys:**
|
|
|
|
| Key | Type | Description |
|
|
|-----|------|-------------|
|
|
| `asyncByDefault` | boolean | Run workflows async by default |
|
|
| `executeWorkers` | boolean | Enable real child Pi workers |
|
|
| `notifierIntervalMs` | number | Polling interval for async notifications |
|
|
| `runtime.mode` | `"auto"\|"scaffold"\|"child-process"\|"live-session"` | Crew runtime selection |
|
|
| `runtime.maxTurns` | number | Max turns per worker |
|
|
| `runtime.graceTurns` | number | Grace turns after max |
|
|
| `runtime.inheritContext` | boolean | Workers inherit parent context |
|
|
| `runtime.promptMode` | `"replace"\|"append"` | Prompt merge strategy |
|
|
| `runtime.groupJoin` | `"off"\|"group"\|"smart"` | Group join strategy |
|
|
| `runtime.groupJoinAckTimeoutMs` | number | Group join ack timeout (ms) |
|
|
| `runtime.requirePlanApproval` | boolean | Require plan approval before execution |
|
|
| `runtime.completionMutationGuard` | `"off"\|"warn"\|"fail"` | Mutation guard on completion |
|
|
| `limits.maxConcurrentWorkers` | number | Max concurrent workers |
|
|
| `limits.maxTaskDepth` | number | Max task tree depth |
|
|
| `limits.maxChildrenPerTask` | number | Max children per task |
|
|
| `limits.maxRunMinutes` | number | Max run duration (minutes) |
|
|
| `limits.maxRetriesPerTask` | number | Max retries per task |
|
|
| `limits.maxTasksPerRun` | number | Max tasks per run |
|
|
| `limits.heartbeatStaleMs` | number | Heartbeat stale threshold (ms) |
|
|
| `control.enabled` | boolean | Enable agent control-plane |
|
|
| `control.needsAttentionAfterMs` | number | Attention trigger after inactivity (ms) |
|
|
| `autonomous.profile` | `"manual"\|"suggested"\|"assisted"\|"aggressive"` | Autonomy profile |
|
|
| `autonomous.injectPolicy` | boolean | Inject autonomy policy into prompt |
|
|
| `autonomous.preferAsyncForLongTasks` | boolean | Auto-async for long tasks |
|
|
| `autonomous.allowWorktreeSuggestion` | boolean | Suggest worktree mode |
|
|
| `tools.enableClaudeStyleAliases` | boolean | Enable Claude-style tool aliases |
|
|
| `tools.enableSteer` | boolean | Enable steer tool |
|
|
| `tools.terminateOnForeground` | boolean | Return terminate:true from foreground Agent |
|
|
| `agents.disableBuiltins` | boolean | Disable all builtin agents |
|
|
| `observability.prometheus.enabled` | boolean | Enable Prometheus exporter |
|
|
| `observability.otlp.enabled` | boolean | Enable OTLP exporter |
|
|
| `worktree.enabled` | boolean | Enable worktree isolation |
|
|
|
|
## Dashboard
|
|
|
|
Open:
|
|
|
|
```text
|
|
/team-dashboard
|
|
```
|
|
|
|
Shortcuts:
|
|
|
|
```text
|
|
↑/↓ or j/k select run
|
|
r reload run list
|
|
p toggle short/long progress preview
|
|
Enter or s show status
|
|
a list artifacts
|
|
u show summary
|
|
i API read-manifest
|
|
q or Esc close
|
|
```
|
|
|
|
## Manager
|
|
|
|
Open:
|
|
|
|
```text
|
|
/team-manager
|
|
```
|
|
|
|
Current flows:
|
|
|
|
- list resources/runs
|
|
- run a team
|
|
- show run status
|
|
- cleanup run worktrees
|
|
- create routed agent/team resources
|
|
- update routed agent/team resources
|
|
- doctor
|
|
|
|
## Resource paths
|
|
|
|
Builtin package resources:
|
|
|
|
```text
|
|
agents/*.md
|
|
teams/*.team.md
|
|
workflows/*.workflow.md
|
|
```
|
|
|
|
User resources:
|
|
|
|
```text
|
|
~/.pi/agent/agents/*.md
|
|
~/.pi/agent/teams/*.team.md
|
|
~/.pi/agent/workflows/*.workflow.md
|
|
```
|
|
|
|
Project resources (new default layout):
|
|
|
|
```text
|
|
.crew/agents/*.md
|
|
.crew/teams/*.team.md
|
|
.crew/workflows/*.workflow.md
|
|
```
|
|
|
|
Legacy layout (when `.pi/` already exists in the repo):
|
|
|
|
```text
|
|
.pi/teams/agents/*.md
|
|
.pi/teams/teams/*.team.md
|
|
.pi/teams/workflows/*.workflow.md
|
|
```
|
|
|
|
Discovery priority:
|
|
|
|
```text
|
|
builtin < user < project
|
|
```
|
|
|
|
## Resource metadata
|
|
|
|
Agents and teams may include optional routing metadata in frontmatter:
|
|
|
|
```yaml
|
|
---
|
|
name: api-reviewer
|
|
description: Reviews API changes
|
|
triggers: api, endpoint, contract
|
|
useWhen: backend API changes, OpenAPI changes
|
|
avoidWhen: docs-only edits
|
|
cost: cheap
|
|
category: backend
|
|
---
|
|
```
|
|
|
|
These fields guide autonomous policy injection and `recommend` routing.
|
|
|
|
## Builtin resources
|
|
|
|
Builtin agents include roles such as:
|
|
|
|
```text
|
|
analyst
|
|
critic
|
|
executor
|
|
explorer
|
|
planner
|
|
reviewer
|
|
security-reviewer
|
|
test-engineer
|
|
verifier
|
|
writer
|
|
```
|
|
|
|
Builtin teams include:
|
|
|
|
```text
|
|
default
|
|
fast-fix
|
|
implementation
|
|
research
|
|
review
|
|
```
|
|
|
|
Builtin workflows include:
|
|
|
|
```text
|
|
default
|
|
fast-fix
|
|
implementation
|
|
research
|
|
review
|
|
```
|
|
|
|
## State layout
|
|
|
|
Project-local state is preferred when the cwd is inside a recognised project (any of the markers listed in the Config section above). Otherwise pi-crew falls back to user-global state.
|
|
|
|
The project state root (`<crewRoot>` below) resolves to:
|
|
|
|
```text
|
|
<repoRoot>/.crew/ # default, used for new projects
|
|
<repoRoot>/.pi/teams/ # legacy reuse when .pi/ already exists
|
|
```
|
|
|
|
Typical project-local state (`<crewRoot>` is one of the two paths above):
|
|
|
|
```text
|
|
<crewRoot>/state/runs/{runId}/manifest.json
|
|
<crewRoot>/state/runs/{runId}/tasks.json
|
|
<crewRoot>/state/runs/{runId}/events.jsonl
|
|
<crewRoot>/artifacts/{runId}/...
|
|
<crewRoot>/worktrees/{runId}/{taskId}
|
|
<crewRoot>/imports/{runId}/run-export.json
|
|
```
|
|
|
|
Mailbox state:
|
|
|
|
```text
|
|
<crewRoot>/state/runs/{runId}/mailbox/inbox.jsonl
|
|
<crewRoot>/state/runs/{runId}/mailbox/outbox.jsonl
|
|
<crewRoot>/state/runs/{runId}/mailbox/delivery.json
|
|
<crewRoot>/state/runs/{runId}/mailbox/tasks/{taskId}/inbox.jsonl
|
|
<crewRoot>/state/runs/{runId}/mailbox/tasks/{taskId}/outbox.jsonl
|
|
```
|
|
|
|
User-global fallback (shared with other Pi tools):
|
|
|
|
```text
|
|
~/.pi/agent/extensions/pi-crew/state/runs/...
|
|
~/.pi/agent/extensions/pi-crew/artifacts/...
|
|
~/.pi/agent/extensions/pi-crew/imports/...
|
|
```
|
|
|
|
## Project initialization
|
|
|
|
Initialize project-local layout:
|
|
|
|
```text
|
|
/team-init
|
|
```
|
|
|
|
Optionally copy builtin resources:
|
|
|
|
```text
|
|
/team-init --copy-builtins
|
|
/team-init --copy-builtins --overwrite
|
|
```
|
|
|
|
Created directories (new projects):
|
|
|
|
```text
|
|
.crew/agents/
|
|
.crew/teams/
|
|
.crew/workflows/
|
|
.crew/imports/
|
|
```
|
|
|
|
If the project already has `.pi/`, the legacy layout is initialised instead:
|
|
|
|
```text
|
|
.pi/teams/agents/
|
|
.pi/teams/teams/
|
|
.pi/teams/workflows/
|
|
.pi/teams/imports/
|
|
```
|
|
|
|
`.gitignore` entries are written for whichever layout is active, e.g.:
|
|
|
|
```text
|
|
# new layout
|
|
.crew/state/
|
|
.crew/artifacts/
|
|
.crew/worktrees/
|
|
.crew/imports/
|
|
|
|
# legacy layout
|
|
.pi/teams/state/
|
|
.pi/teams/artifacts/
|
|
.pi/teams/worktrees/
|
|
.pi/teams/imports/
|
|
```
|
|
|
|
## Import/export
|
|
|
|
Export writes:
|
|
|
|
```text
|
|
{artifactsRoot}/export/run-export.json
|
|
{artifactsRoot}/export/run-export.md
|
|
```
|
|
|
|
Import stores bundles under (new layout):
|
|
|
|
```text
|
|
.crew/imports/{runId}/run-export.json
|
|
.crew/imports/{runId}/README.md
|
|
```
|
|
|
|
or under the legacy layout when `.pi/` already exists:
|
|
|
|
```text
|
|
.pi/teams/imports/{runId}/run-export.json
|
|
.pi/teams/imports/{runId}/README.md
|
|
```
|
|
|
|
or user-global imports with `--user`:
|
|
|
|
```text
|
|
~/.pi/agent/extensions/pi-crew/imports/{runId}/run-export.json
|
|
~/.pi/agent/extensions/pi-crew/imports/{runId}/README.md
|
|
```
|
|
|
|
## Doctor and validation
|
|
|
|
Validate resources:
|
|
|
|
```text
|
|
/team-validate
|
|
```
|
|
|
|
Doctor:
|
|
|
|
```text
|
|
/team-doctor
|
|
```
|
|
|
|
Doctor checks include:
|
|
|
|
- cwd
|
|
- platform/architecture/Node.js version
|
|
- `pi --version`
|
|
- `git --version`
|
|
- writable state paths
|
|
- config parse
|
|
- discovery counts
|
|
- resource validation
|
|
- current model/provider when available
|
|
- model/fallback hints
|
|
|
|
Optional child Pi smoke check is explicit only:
|
|
|
|
```json
|
|
{
|
|
"action": "doctor",
|
|
"config": {
|
|
"smokeChildPi": true
|
|
}
|
|
}
|
|
```
|
|
|
|
## Environment variables
|
|
|
|
```text
|
|
PI_CREW_EXECUTE_WORKERS=0 disable child workers and use scaffold/dry-run mode
|
|
PI_TEAMS_EXECUTE_WORKERS=0 legacy disable flag
|
|
PI_TEAMS_MOCK_CHILD_PI=success test/mock child worker success
|
|
PI_TEAMS_MOCK_CHILD_PI=json-success
|
|
PI_TEAMS_MOCK_CHILD_PI=retryable-failure
|
|
PI_TEAMS_INHERIT_PROJECT_CONTEXT control child prompt context inheritance
|
|
PI_TEAMS_INHERIT_SKILLS control skill inheritance
|
|
PI_TEAMS_HOME override home path for tests/config/state
|
|
PI_TEAMS_PI_BIN optional explicit Pi CLI script/shim path for doctor/child workers
|
|
```
|
|
|
|
## Development
|
|
|
|
Install dependencies:
|
|
|
|
```bash
|
|
cd pi-crew
|
|
npm install
|
|
```
|
|
|
|
Run tests:
|
|
|
|
```bash
|
|
npm test
|
|
```
|
|
|
|
Typecheck and smoke import:
|
|
|
|
```bash
|
|
npm run typecheck
|
|
```
|
|
|
|
Full local CI-equivalent check:
|
|
|
|
```bash
|
|
npm run ci
|
|
```
|
|
|
|
GitHub CI runs the same typecheck/test/pack checks on:
|
|
|
|
```text
|
|
ubuntu-latest
|
|
windows-latest
|
|
macos-latest
|
|
```
|
|
|
|
Package dry-run only:
|
|
|
|
```bash
|
|
npm pack --dry-run
|
|
```
|
|
|
|
## Documentation
|
|
|
|
Package docs:
|
|
|
|
```text
|
|
pi-crew/docs/architecture.md
|
|
pi-crew/docs/usage.md
|
|
pi-crew/docs/resource-formats.md
|
|
pi-crew/docs/live-mailbox-runtime.md
|
|
pi-crew/docs/publishing.md
|
|
```
|
|
|
|
Historical workspace-level design/progress docs may exist in the original development workspace under `docs/pi-crew-*`, but package-maintained docs live under `pi-crew/docs/`.
|
|
|
|
## Local Pi smoke
|
|
|
|
A local Pi smoke test requires an installed Pi CLI and a real Pi environment:
|
|
|
|
```bash
|
|
cd pi-crew
|
|
npm run smoke:pi
|
|
```
|
|
|
|
Then in Pi:
|
|
|
|
```text
|
|
/team-doctor
|
|
/team-validate
|
|
/team-autonomy status
|
|
```
|
|
|
|
## Acknowledgements
|
|
|
|
`pi-crew` builds on ideas and selected MIT-licensed implementation patterns from `pi-subagents` and `oh-my-claudecode`.
|
|
|
|
It also draws conceptual inspiration from `oh-my-openagent`; no `oh-my-openagent` source code is copied unless separately documented and license-compatible.
|