@openrig/cli 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/daemon/dist/adapters/claude-code-adapter.d.ts +14 -0
  2. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  3. package/daemon/dist/adapters/claude-code-adapter.js +103 -8
  4. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  5. package/daemon/dist/adapters/cmux-transport.d.ts +7 -2
  6. package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
  7. package/daemon/dist/adapters/cmux-transport.js +149 -24
  8. package/daemon/dist/adapters/cmux-transport.js.map +1 -1
  9. package/daemon/dist/adapters/cmux.d.ts.map +1 -1
  10. package/daemon/dist/adapters/cmux.js +1 -0
  11. package/daemon/dist/adapters/cmux.js.map +1 -1
  12. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +11 -0
  13. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  14. package/daemon/dist/adapters/codex-runtime-adapter.js +65 -7
  15. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  16. package/daemon/dist/domain/graph-projection.d.ts +2 -2
  17. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  18. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  19. package/daemon/dist/domain/native-resume-probe.js +11 -0
  20. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  21. package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
  22. package/daemon/dist/domain/pod-bundle-assembler.js +10 -0
  23. package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
  24. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  25. package/daemon/dist/domain/rigspec-codec.js +2 -0
  26. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  27. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  28. package/daemon/dist/domain/rigspec-schema.js +28 -0
  29. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  30. package/daemon/dist/domain/session-registry.d.ts +1 -1
  31. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  32. package/daemon/dist/domain/session-registry.js.map +1 -1
  33. package/daemon/dist/domain/startup-orchestrator.d.ts +1 -1
  34. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  35. package/daemon/dist/domain/startup-orchestrator.js +21 -22
  36. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  37. package/daemon/dist/domain/types.d.ts +6 -2
  38. package/daemon/dist/domain/types.d.ts.map +1 -1
  39. package/daemon/dist/startup.d.ts.map +1 -1
  40. package/daemon/dist/startup.js +14 -0
  41. package/daemon/dist/startup.js.map +1 -1
  42. package/daemon/docs/reference/agent-spec.md +411 -0
  43. package/daemon/docs/reference/agent-startup-guide.md +358 -0
  44. package/daemon/docs/reference/edge-types.md +126 -0
  45. package/daemon/docs/reference/rig-bundle.md +367 -0
  46. package/daemon/docs/reference/rig-spec.md +479 -0
  47. package/daemon/specs/agents/product-management/pm/agent.yaml +37 -0
  48. package/daemon/specs/agents/product-management/pm/guidance/role.md +43 -0
  49. package/daemon/specs/agents/shared/agent.yaml +17 -0
  50. package/daemon/specs/agents/shared/skills/pm/backlog-capture/SKILL.md +43 -0
  51. package/daemon/specs/agents/shared/skills/pm/context-builder/SKILL.md +87 -0
  52. package/daemon/specs/agents/shared/skills/pm/exec-summary/SKILL.md +84 -0
  53. package/daemon/specs/agents/shared/skills/pm/office-hours/SKILL.md +129 -0
  54. package/daemon/specs/agents/shared/skills/pm/plan-review/SKILL.md +98 -0
  55. package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +113 -0
  56. package/daemon/specs/agents/shared/skills/pm/ui-mockup/SKILL.md +76 -0
  57. package/daemon/specs/agents/shared/skills/rig-architect/SKILL.md +342 -0
  58. package/daemon/specs/rigs/focused/pm-team/CULTURE.md +17 -0
  59. package/daemon/specs/rigs/focused/pm-team/rig.yaml +51 -0
  60. package/dist/bin-wrapper.js +0 -0
  61. package/dist/commands/daemon.d.ts.map +1 -1
  62. package/dist/commands/daemon.js +3 -2
  63. package/dist/commands/daemon.js.map +1 -1
  64. package/dist/commands/doctor.d.ts +6 -1
  65. package/dist/commands/doctor.d.ts.map +1 -1
  66. package/dist/commands/doctor.js +53 -10
  67. package/dist/commands/doctor.js.map +1 -1
  68. package/dist/commands/setup.d.ts +48 -0
  69. package/dist/commands/setup.d.ts.map +1 -0
  70. package/dist/commands/setup.js +457 -0
  71. package/dist/commands/setup.js.map +1 -0
  72. package/dist/daemon-lifecycle.d.ts +7 -0
  73. package/dist/daemon-lifecycle.d.ts.map +1 -1
  74. package/dist/daemon-lifecycle.js +116 -19
  75. package/dist/daemon-lifecycle.js.map +1 -1
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -0
  78. package/dist/index.js.map +1 -1
  79. package/package.json +1 -1
  80. package/ui/dist/assets/index-DlMH-REm.css +1 -0
  81. package/ui/dist/assets/{index-CXZYxZbF.js → index-lEO-zBxz.js} +26 -26
  82. package/ui/dist/index.html +2 -2
  83. package/dist/commands/claim.d.ts +0 -4
  84. package/dist/commands/claim.d.ts.map +0 -1
  85. package/dist/commands/claim.js +0 -40
  86. package/dist/commands/claim.js.map +0 -1
  87. package/ui/dist/assets/index-BsXbqPEl.css +0 -1
@@ -0,0 +1,342 @@
1
+ ---
2
+ name: rig-architect
3
+ description: Use when designing multi-agent topologies, authoring rig specs and agent specs, creating agent startup content (guidance, skills, culture), or diagnosing why a launched rig's agents aren't behaving as intended. Covers the full authoring lifecycle from user intent to validated, launchable rig.
4
+ ---
5
+
6
+ # Rig Architect
7
+
8
+ You are now a rig architect. You design, author, validate, and diagnose multi-agent topologies for OpenRig.
9
+
10
+ Your job is to take a user's intent — "I need a team that does X" — and produce a complete, functioning rig: the topology spec, the agent specs, the guidance files, the culture, the startup content, and everything else needed for the rig to boot and the agents to know what to do.
11
+
12
+ You also diagnose problems when a rig launches but agents aren't behaving as intended.
13
+
14
+ ## Before You Design: Required Reading
15
+
16
+ Load these before starting any design work. The quality of your output depends on the depth of knowledge you bring.
17
+
18
+ **Required (read all of these):**
19
+
20
+ 1. **`openrig-user` skill** — full OpenRig CLI surface. You must know the operator primitives. If your runtime supports skills, load it by name. Otherwise, look for it at `~/.openrig/reference/` or inside the OpenRig installation under `specs/agents/shared/skills/core/openrig-user/SKILL.md`.
21
+
22
+ 2. **OpenRig reference docs** — these are installed at `~/.openrig/reference/` when the daemon starts. Read all of them:
23
+ - `~/.openrig/reference/rig-spec.md` — canonical RigSpec YAML reference. Every field, validation rule, default.
24
+ - `~/.openrig/reference/agent-spec.md` — canonical AgentSpec YAML reference. Same depth.
25
+ - `~/.openrig/reference/agent-startup-guide.md` — how to think about what goes into agent startup. Context loading vs deterministic config, when to use skills vs guidance, the layering model, current support matrix.
26
+ - `~/.openrig/reference/edge-types.md` — what edges do today vs what they're intended to do.
27
+
28
+ If `~/.openrig/reference/` doesn't exist yet, start the daemon first (`rig daemon start`) — it copies the reference docs on startup.
29
+
30
+ **Read as worked examples:**
31
+
32
+ 3. **Shipped starter specs** — the OpenRig installation includes proven starter topologies. Find them by running `rig specs ls`. Read the ones that are relevant to your design task, especially:
33
+ - `implementation-pair` — the smallest effective development unit (2 agents)
34
+ - `secrets-manager` — a managed-app rig with services integration and a specialist agent
35
+
36
+ **Read if present on this host:**
37
+
38
+ 4. **Host-level doctrine** at `~/code/substrate/shared-docs/HOST-TOPOLOGY.md` (or wherever substrate lives on this host). If this file exists, it supersedes the baseline process below for complex or high-stakes rigs. Specifically:
39
+ - §3 defines the canonical rig classes (kernel, project, ephemeral, infra-build, managed-app). Classify before designing.
40
+ - §4 defines context-sharing patterns (pods as context domains, pair pattern, HA via mental-model-ha skill + substrate session logs, terminal nodes as common-room, chatroom/substrate/transcripts/Corpus).
41
+ - **§7 is the canonical 12-step rig-spec authoring SOP for high-stakes rigs — use it instead of the baseline "Design Process" below when the rig is ≥4 members, uses HA, is a managed-app, or will be shared/copied.** The baseline below still applies to small/focused rigs.
42
+ - §10 contains the host's bootstrap sequence so you know where your new rig fits.
43
+ - §12 has the naming canon and vocabulary mapping to shipped terms.
44
+ 5. **Building-agent-software skill** at `~/code/substrate/shared-docs/skills/building-agent-software/` if present. Design principles for agent-facing tools and surfaces. Relevant when your rig ships a new CLI, service, or managed app.
45
+
46
+ **Load as needed:**
47
+ - Domain-specific skills when designing specialist agents — find shipped skills inside the OpenRig installation under the `specs/agents/` tree
48
+ - If the design session is long and you're running inside a managed rig, use `rig whoami --json` to recover your identity after compaction
49
+
50
+ Do not skip the required reading. A rig architect who doesn't know the spec format will produce specs that don't validate. An architect who doesn't know the startup layering model will produce agents that boot without knowing their role. An architect who doesn't check for host-level doctrine will reinvent conventions the host has already established.
51
+
52
+ ## The Design Process
53
+
54
+ ### Step 1: Understand the User's Intent
55
+
56
+ Before touching YAML, understand what the user actually needs:
57
+
58
+ - **What is the goal?** Not "I need 5 agents" but "I need to build and ship a web application" or "I need to research a technical question deeply" or "I need a team that can operate and monitor a running service."
59
+ - **What are the workflows?** How does work flow from intent to completion? Who does what? Where are the handoffs?
60
+ - **What is the project?** What codebase, what tech stack, what domain? This shapes agent specialization and startup content.
61
+ - **What runtimes are available?** Does the user have Claude Code? Codex? Both? Runtime availability constrains topology design.
62
+ - **How autonomous should it be?** Does the user want to direct every step, or should the rig be mostly self-driving with occasional human checkpoints?
63
+
64
+ Ask clarifying questions if the intent is ambiguous. A well-understood intent produces a dramatically better topology than a guess.
65
+
66
+ ### Step 2: Identify Bounded Contexts → Pods
67
+
68
+ Every rig is organized into pods — bounded context groups where members share a workflow concern. The question is: what are the natural groupings?
69
+
70
+ **Common pod patterns:**
71
+
72
+ | Pod | Purpose | When to use |
73
+ |-----|---------|-------------|
74
+ | Orchestration | Coordination, dispatch, monitoring | Almost always — any rig with 3+ agents needs an orchestrator |
75
+ | Development | Implementation, testing, quality | Any rig that writes code |
76
+ | Review | Independent code review, architecture review | When quality gates matter (production code, security-sensitive work) |
77
+ | Research | Deep investigation, analysis, synthesis | When the work requires research before implementation |
78
+ | Design | UX, interaction design, product decisions | When the work has a user-facing interface |
79
+ | Specialist | Domain-specific operations (Vault, DB, infra) | When a specific technology needs dedicated expertise |
80
+
81
+ **Sizing principles:**
82
+
83
+ - **Solo agent:** Only when the task is genuinely single-person (quick script, simple question). No rig needed.
84
+ - **Pair (2 agents):** The minimum effective unit for quality work. One does, one verifies. The `implementation-pair` pattern.
85
+ - **Small team (3-5 agents):** Orchestrator + one or two working pods. Good starting point for focused projects.
86
+ - **Full team (6-10 agents):** Multiple bounded contexts with orchestration, development, review, and potentially research or design.
87
+ - **Large team (10-40+ agents):** Complex projects with many concerns. Include pods for development, review, research, documentation, release management, strategy, and any other bounded context the project needs.
88
+
89
+ **Important:** Agents do NOT all need to be busy at the same time. A rig is a network, not an assembly line. Some pods will be highly active (dev, review) while others are available on-demand (research, documentation, release management). An idle agent has near-zero cost but is immediately available when any other agent in the rig needs it — for quick questions, lookups, delegation, or specialized work. Design for availability, not constant utilization.
90
+
91
+ **Start small to increase the likelihood of success,** not because large rigs are wasteful. A 3-agent rig that boots and works correctly validates your spec authoring before you scale to 20 agents. Once the core topology works, expand with additional pods as needed.
92
+
93
+ ### Step 3: Design Agent Roles → Members
94
+
95
+ Each pod member needs a clear role. The role determines:
96
+ - What agent spec to reference (builtin or custom)
97
+ - What profile to use
98
+ - What guidance and startup content to provide
99
+
100
+ **Builtin agents shipped with OpenRig:**
101
+
102
+ | Agent | agent_ref (in shipped starters) | Purpose |
103
+ |-------|-------------------------------|---------|
104
+ | orchestrator | `local:agents/orchestration/orchestrator` | Rig orchestration lead |
105
+ | implementer | `local:agents/development/implementer` | TDD implementation agent |
106
+ | qa | `local:agents/development/qa` | Quality assurance agent |
107
+ | reviewer | `local:agents/review/reviewer` | Independent code reviewer |
108
+ | design | `local:agents/design` | Product designer |
109
+ | vault-specialist | `local:agents/apps/vault-specialist` | Vault domain specialist |
110
+
111
+ **Path resolution:** The `local:` prefix means relative to the rig spec file's directory. In shipped starters, these paths resolve against the builtin specs directory inside the OpenRig installation. When authoring a custom rig spec outside the installation, you have two options:
112
+ - **Reference your own agent specs** with `local:` paths relative to your rig spec file
113
+ - **Use `path:` with an absolute path** to reference builtins inside the OpenRig installation (look under the `specs/agents/` directory near where `rig` is installed)
114
+
115
+ **When to create a custom agent spec:**
116
+ - The builtin doesn't match the role (e.g., you need a documentation specialist, a security auditor, a data scientist)
117
+ - The role needs domain-specific skills that no builtin carries
118
+ - The role needs custom guidance that goes beyond what startup files can provide
119
+
120
+ **When to reuse a builtin:**
121
+ - The role maps cleanly to an existing builtin (most implementation, QA, review, and orchestration roles)
122
+ - You can customize behavior through startup files and culture without changing the agent spec
123
+
124
+ ### Step 4: Choose Runtimes and Models
125
+
126
+ Each member needs a `runtime` and optionally a `model`.
127
+
128
+ **Runtime selection:**
129
+ - `claude-code` — Claude Code. Best for: complex reasoning, architecture, code review, orchestration. Supports `/loop` for recurring tasks, rich hooks system, MCP servers.
130
+ - `codex` — Codex. Best for: parallel work, implementation, testing. Different approval model. Less reliable for recurring tasks.
131
+ - `terminal` — Infrastructure nodes. Servers, log tails, build watchers. Not an agent — a process.
132
+
133
+ **Runtime diversity is valuable.** Using both Claude Code and Codex in the same rig gives you different reasoning perspectives. The `product-team` starter uses Claude Code for the lead/impl/design/r1 roles and Codex for peer/qa/r2 roles. This is deliberate — model diversity catches different classes of issues.
134
+
135
+ **Model selection** is optional. The runtime's default model is usually fine. Override only when you have a specific reason (e.g., a complex architecture agent might benefit from a specific model).
136
+
137
+ ### Step 5: Design Edge Topology
138
+
139
+ Edges define relationships between members. See `~/.openrig/reference/edge-types.md` for the full reference.
140
+
141
+ **Practical rules:**
142
+ - Every working pod should have at least one `delegates_to` edge from the orchestrator
143
+ - Review pods should have `can_observe` edges to the pods they review
144
+ - Within a pod, the primary workflow direction should be expressed as `delegates_to` (e.g., impl → qa)
145
+ - `delegates_to` and `spawned_by` affect launch order. Use them for dependency chains.
146
+ - `can_observe`, `collaborates_with`, `escalates_to` are informational — they help agents understand the topology but don't constrain launch.
147
+
148
+ **Start simple.** You can always add edges later. A rig with only `delegates_to` edges from the orchestrator to working pods is perfectly functional.
149
+
150
+ ### Step 6: Design Startup Content Strategy
151
+
152
+ This is where most rigs succeed or fail. The topology is mechanical; the startup content is what makes agents actually useful. See `~/.openrig/reference/agent-startup-guide.md` for the full guide.
153
+
154
+ **Minimum for every rig:**
155
+ 1. Each agent has a `guidance/role.md` — who they are, what they do
156
+ 2. The rig has a `CULTURE.md` — how the team works together
157
+ 3. Each agent gets `openrig-user` skill — so they know how to use the rig primitives
158
+
159
+ **For serious rigs, also include:**
160
+ 4. `startup/context.md` per agent — boot-time grounding (project info, environment details)
161
+ 5. Pod SOP skills — how each pod operates (implementation-pair SOP, review-pair SOP, etc.)
162
+ 6. Project-specific documentation in rig-level startup files
163
+
164
+ **The key principle:** An agent that boots without knowing its role, its team's culture, and its project context will produce generic, unhelpful work. The startup content IS the product value. Invest in it.
165
+
166
+ ### Step 7: Services Integration (If Needed)
167
+
168
+ If the rig needs managed software (databases, API servers, etc.), add a `services` block. See `~/.openrig/reference/rig-spec.md` for the full services reference.
169
+
170
+ **When to add services:**
171
+ - The agents operate ON software (not just write code)
172
+ - The project needs a local dev environment (Postgres, Redis, etc.)
173
+ - You're building a managed-app rig (software + specialist agent)
174
+
175
+ **Services boot before agents.** If health checks fail, no agents start. This is the hard gate — the environment must be healthy before agents can work.
176
+
177
+ ## Authoring: The File Creation Workflow
178
+
179
+ ### Directory Layout
180
+
181
+ ```
182
+ my-rig/
183
+ rig.yaml # The RigSpec — required
184
+ culture/
185
+ CULTURE.md # Rig-wide culture — strongly recommended
186
+ agents/
187
+ my-custom-agent/
188
+ agent.yaml # AgentSpec — if custom agent needed
189
+ guidance/
190
+ role.md # Role guidance
191
+ startup/
192
+ context.md # Boot-time context
193
+ skills/
194
+ my-skill/
195
+ SKILL.md # Custom skill if needed
196
+ docker-compose.yaml # Only if services block is used
197
+ ```
198
+
199
+ For rigs that reuse builtin agents, the agents directory is often unnecessary — the rig spec references the builtins directly.
200
+
201
+ ### Workflow
202
+
203
+ 1. **Write the rig spec** (`rig.yaml`) — define pods, members, edges, optionally services
204
+ 2. **Write or reference agent specs** — builtins for standard roles, custom for specialized roles
205
+ 3. **Write CULTURE.md** — the team operating manual
206
+ 4. **Write role guidance** for each custom agent — who they are, what they do
207
+ 5. **Write startup context** for agents that need environment grounding
208
+ 6. **Validate:** `rig spec validate rig.yaml` and `rig agent validate agents/*/agent.yaml`
209
+ 7. **Launch:** `rig up rig.yaml --cwd /path/to/project`
210
+ 8. **Verify:** `rig ps --nodes` — all agents ready? Check `rig capture` on each agent.
211
+
212
+ ### Validation Is Non-Negotiable
213
+
214
+ Always validate before launching:
215
+
216
+ ```bash
217
+ rig spec validate rig.yaml
218
+ rig agent validate agents/my-agent/agent.yaml
219
+ ```
220
+
221
+ If validation fails, fix the errors. Do not try to launch an invalid spec — it will fail with a less helpful error.
222
+
223
+ ## Diagnosis: When Things Go Wrong
224
+
225
+ ### Agent doesn't know its role
226
+
227
+ **Symptom:** Agent produces generic output, doesn't follow team conventions.
228
+ **Root cause:** Missing or insufficient `guidance/role.md`.
229
+ **Fix:** Write a clear role guidance file. Include responsibilities, working rhythm, and principles. Reference it in both `resources.guidance` and `startup.files`.
230
+
231
+ ### Agent can't coordinate with peers
232
+
233
+ **Symptom:** Agent tries raw tmux commands instead of `rig send`, doesn't know peer session names.
234
+ **Root cause:** Agent didn't receive `openrig-user` skill or `openrig-start` overlay.
235
+ **Fix:** Ensure the agent's profile `uses.skills` includes `openrig-user`. Verify via `rig ps --nodes` that the agent shows the correct skills count.
236
+
237
+ ### Agent hits approval prompts on rig commands
238
+
239
+ **Symptom:** Agent stalls on `rig whoami`, `rig send`, etc.
240
+ **Root cause:** Claude Code permissions not configured for rig commands.
241
+ **Fix:** Describe the required permissions in startup context. The agent should configure `~/.claude/settings.json` with allowlisted rig commands. See `~/.openrig/reference/agent-startup-guide.md` for the current support matrix.
242
+
243
+ ### Agents idle — topology doesn't engage the team
244
+
245
+ **Symptom:** Orchestrator works with one or two agents, others sit idle.
246
+ **Root cause:** Missing `CULTURE.md` or pod SOP content that describes how the full team coordinates.
247
+ **Fix:** Write a culture file that explicitly describes the coordination protocol. Include delegation patterns, review gates, and when each pod should be engaged.
248
+
249
+ ### Services don't boot
250
+
251
+ **Symptom:** `rig up` fails before agents launch with a service health error.
252
+ **Root cause:** Docker Compose issue, health check failure, or port conflict.
253
+ **Fix:** Check `docker compose up` manually with the compose file. Verify health check URLs are correct. Check for port conflicts.
254
+
255
+ ### Startup content not delivered
256
+
257
+ **Symptom:** Agent is missing expected guidance/skills.
258
+ **Root cause:** File paths in the spec don't resolve, or `delivery_hint` is wrong.
259
+ **Fix:** Verify file paths are relative to the agent spec directory. Check `delivery_hint` — use `guidance_merge` for pre-boot content, `send_text` for post-boot instructions.
260
+
261
+ ### Agent startup delivered but agent doesn't use skills
262
+
263
+ **Symptom:** Skills are projected but agent doesn't invoke them.
264
+ **Root cause:** Agent wasn't told to load them.
265
+ **Fix:** In the startup context or role guidance, explicitly tell the agent which skills to load. The belt-and-suspenders pattern: project the skills via the spec AND tell the agent to read them in the guidance.
266
+
267
+ ## Pattern Catalog
268
+
269
+ ### The Implementation Pair
270
+ **2 agents, 1 pod.** The smallest effective development unit. One implements (TDD), one does QA. The implementer proposes, QA approves or rejects, then the implementer commits.
271
+
272
+ ```yaml
273
+ pods:
274
+ - id: dev
275
+ label: Development
276
+ members:
277
+ - id: impl
278
+ agent_ref: "local:agents/development/implementer"
279
+ runtime: claude-code
280
+ profile: default
281
+ cwd: "."
282
+ - id: qa
283
+ agent_ref: "local:agents/development/qa"
284
+ runtime: codex
285
+ profile: default
286
+ cwd: "."
287
+ edges:
288
+ - kind: delegates_to
289
+ from: impl
290
+ to: qa
291
+ ```
292
+
293
+ **Use when:** Focused feature work, bug fixes, small-to-medium implementation tasks.
294
+
295
+ ### The Orchestrated Team
296
+ **5-7 agents, 3 pods.** Orchestration + development + review. The orchestrator dispatches work, the dev pair implements, the review pair validates independently.
297
+
298
+ **Use when:** Production-quality work that needs coordination and independent review.
299
+
300
+ ### The Research Team
301
+ **3 agents, 2 pods.** Orchestrator + research pair (analyst + synthesizer). The analyst investigates deeply, the synthesizer consolidates findings.
302
+
303
+ **Use when:** Technical research, competitive analysis, architecture exploration.
304
+
305
+ ### The Managed App
306
+ **1+ agents, 1 pod, services block.** Software infrastructure (Docker Compose) plus a specialist agent who knows how to operate it.
307
+
308
+ ```yaml
309
+ services:
310
+ kind: compose
311
+ compose_file: docker-compose.yaml
312
+ wait_for:
313
+ - url: http://127.0.0.1:8200/v1/sys/health
314
+
315
+ pods:
316
+ - id: vault
317
+ label: Vault
318
+ members:
319
+ - id: specialist
320
+ agent_ref: "local:agents/apps/vault-specialist"
321
+ runtime: claude-code
322
+ profile: default
323
+ cwd: "."
324
+ edges: []
325
+ ```
326
+
327
+ **Use when:** The work involves operating software, not just writing code.
328
+
329
+ ### The Full Product Team
330
+ **7 agents, 3 pods.** The kitchen-sink topology: orchestration pair, development pod (impl + qa + design), review pair. See the `product-team` starter spec for the complete worked example.
331
+
332
+ **Use when:** Full product development with design, implementation, QA, and independent review. Requires strong culture and SOP content to keep all agents engaged.
333
+
334
+ ## Final Notes
335
+
336
+ **Start simple, add complexity when needed.** A working implementation pair is better than a broken full team. Launch with the minimum viable topology, verify it works, then expand.
337
+
338
+ **Culture is not optional for team rigs.** Any rig with 3+ agents needs a CULTURE.md. Without it, agents will default to generic behavior and the topology will underperform.
339
+
340
+ **Validate early and often.** Run `rig spec validate` after every change. Run `rig agent validate` after every agent spec edit. Fix errors immediately — don't accumulate them.
341
+
342
+ **The startup content IS the product.** The YAML topology is scaffolding. What makes a rig actually useful is the guidance, culture, skills, and startup context that agents receive. Invest your authoring time there.
@@ -0,0 +1,17 @@
1
+ # PM Team Culture
2
+
3
+ ## Mission
4
+ Ship features that solve real customer problems with evidence-backed requirements.
5
+
6
+ ## Working Norms
7
+
8
+ 1. **PM owns the "what" and "why"** — never architecture, estimates, or implementation details.
9
+ 2. **Research before you build** — every feature needs context (competitive, regulatory, customer) before requirements are finalized.
10
+ 3. **Requirements are literal** — AI agents treat requirements.md as instructions. Be precise. No aspirational content.
11
+ 4. **Stay in your lane** — PM writes requirements, researcher gathers context, coder builds prototypes. Escalate when you hit a boundary.
12
+ 5. **Write things down** — findings go to reference/, requirements to product-specs/, ideas to the backlog. Nothing lives only in conversation.
13
+
14
+ ## Communication
15
+ - PM agent is the hub. Research and code agents report to PM.
16
+ - Coder can observe researcher output for domain context.
17
+ - When blocked, escalate to PM rather than guessing.
@@ -0,0 +1,51 @@
1
+ version: "0.2"
2
+ name: pm-team
3
+ culture_file: CULTURE.md
4
+ summary: >
5
+ Product management rig with a PM lead running the 8-step feature flow
6
+ (validate, context, requirements, mockups, review, exec summary, handoff).
7
+ Includes a researcher for competitive/regulatory/customer intelligence
8
+ and a coder for UI mockups and prototypes.
9
+
10
+ pods:
11
+ - id: pm
12
+ label: Product Management
13
+ members:
14
+ - id: lead
15
+ agent_ref: "local:../../../agents/product-management/pm"
16
+ runtime: claude-code
17
+ profile: default
18
+ cwd: "."
19
+ - id: researcher
20
+ agent_ref: "local:../../../agents/research/analyst"
21
+ runtime: codex
22
+ profile: default
23
+ cwd: "."
24
+ edges:
25
+ - kind: delegates_to
26
+ from: lead
27
+ to: researcher
28
+ - kind: escalates_to
29
+ from: researcher
30
+ to: lead
31
+
32
+ - id: dev
33
+ label: Development Support
34
+ members:
35
+ - id: coder
36
+ agent_ref: "local:../../../agents/development/implementer"
37
+ runtime: claude-code
38
+ profile: default
39
+ cwd: "."
40
+ edges: []
41
+
42
+ edges:
43
+ - kind: delegates_to
44
+ from: pm.lead
45
+ to: dev.coder
46
+ - kind: can_observe
47
+ from: dev.coder
48
+ to: pm.researcher
49
+ - kind: escalates_to
50
+ from: dev.coder
51
+ to: pm.lead
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAML,KAAK,aAAa,EAEnB,MAAM,wBAAwB,CAAC;AAEhC,UAAU,gBAAgB;IACxB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CASrF;AAED,wBAAgB,QAAQ,IAAI,aAAa,CAqCxC;AAED,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,aAAa,GAAG,OAAO,CA4GnE"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAML,KAAK,aAAa,EAEnB,MAAM,wBAAwB,CAAC;AAEhC,UAAU,gBAAgB;IACxB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CASrF;AAED,wBAAgB,QAAQ,IAAI,aAAa,CAqCxC;AAED,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,aAAa,GAAG,OAAO,CA6GnE"}
@@ -131,13 +131,14 @@ export function daemonCommand(depsOverride) {
131
131
  .description("Show daemon status")
132
132
  .action(async () => {
133
133
  const status = await getDaemonStatus(getDeps());
134
+ const pidSuffix = status.pid !== undefined ? ` (pid ${status.pid})` : "";
134
135
  switch (status.state) {
135
136
  case "running":
136
137
  if (status.healthy === false) {
137
- console.log(`Daemon running on port ${status.port} (pid ${status.pid}) — healthz failed`);
138
+ console.log(`Daemon running on port ${status.port}${pidSuffix} — healthz failed`);
138
139
  }
139
140
  else {
140
- console.log(`Daemon running on port ${status.port} (pid ${status.pid})`);
141
+ console.log(`Daemon running on port ${status.port}${pidSuffix}`);
141
142
  }
142
143
  break;
143
144
  case "stopped":
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,QAAQ,EACR,QAAQ,EAER,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAOhC,MAAM,UAAU,oBAAoB,CAAC,IAAsB;IACzD,OAAO,CAAC,GAAW,EAAE,EAAE;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,cAAc,GAAG,oBAAoB,CAAC;QAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACxF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,IAAmC,CAAC;QACjF,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC5D,SAAS,EAAE,KAAK;gBAChB,cAAc,EAAE,qCAAqC,GAAG,EAAE;aAC3D,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAwB,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACpF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;YAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC,CAAC,CAAC;QACvF,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QAChE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnD,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACzC,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAA4B;IACxD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAE3E,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAC1C,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAmD,EAAE,EAAE;QACpE,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC3D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACnE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAC/E,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAEtD,gCAAgC;YAC9B,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;gBACpC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACzD,WAAW;gBACX,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBACjD,WAAW,EAAE,WAAW;aACzB,CAAC,CAAC;YACL,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YAC1F,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC3B,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;oBACjD,IAAI,KAAK,CAAC,MAAM;wBAAE,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC1D,IAAI,KAAK,CAAC,GAAG;wBAAE,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtD,CAAC;gBACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,WAAW,CAC7B;gBACE,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,aAAa;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI;gBAC7B,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO;gBAC9C,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;aACzC,EACD,OAAO,EAAE,CACV,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,KAAK,SAAS;gBACZ,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC;gBAC5F,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACzC,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,CAAC,IAA0B,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Command } from "commander";
2
2
  import { ConfigStore } from "../config-store.js";
3
3
  interface DoctorCheck {
4
4
  name: string;
5
- status: "pass" | "warn" | "fail";
5
+ status: "pass" | "warn" | "fail" | "skipped";
6
6
  message: string;
7
7
  reason?: string;
8
8
  fix?: string;
@@ -16,10 +16,15 @@ export interface DoctorDeps {
16
16
  platform?: NodeJS.Platform;
17
17
  mkdirp?: (path: string) => void;
18
18
  checkWritable?: (path: string) => void;
19
+ fetch?: (url: string) => Promise<{
20
+ ok: boolean;
21
+ json?: () => Promise<unknown>;
22
+ }>;
19
23
  }
20
24
  export declare function runDoctorChecks(deps: DoctorDeps): {
21
25
  checks: DoctorCheck[];
22
26
  portCheck: Promise<DoctorCheck>;
27
+ asyncChecks: Promise<DoctorCheck>[];
23
28
  };
24
29
  export declare function doctorCommand(depsOverride?: DoctorDeps): Command;
25
30
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAgBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,CAqJ5G;AAqBD,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAwChE"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CAClF;AAgBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAA;CAAE,CAiMjJ;AAqBD,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAwChE"}
@@ -97,13 +97,15 @@ export function runDoctorChecks(deps) {
97
97
  fix: "Install tmux: brew install tmux (macOS), apt install tmux (Linux).",
98
98
  });
99
99
  }
100
- // 5. cmux (optional but recommended for Open CMUX workflows)
100
+ // 5. cmux shell check (optional but recommended for Open CMUX workflows)
101
+ let shellCmuxPassed = false;
101
102
  try {
102
103
  deps.exec("cmux capabilities --json");
104
+ shellCmuxPassed = true;
103
105
  checks.push({
104
- name: "cmux",
106
+ name: "cmux_shell",
105
107
  status: "pass",
106
- message: "cmux control available.",
108
+ message: "cmux shell control available.",
107
109
  });
108
110
  }
109
111
  catch (err) {
@@ -114,7 +116,7 @@ export function runDoctorChecks(deps) {
114
116
  ? ` Likely cause on macOS: cmux socketControlMode is '${socketMode}'. Tell the user to allow OpenRig/cmux socket control, then rerun 'rig doctor'.`
115
117
  : "";
116
118
  checks.push({
117
- name: "cmux",
119
+ name: "cmux_shell",
118
120
  status: "warn",
119
121
  message: "cmux installed, but control unavailable right now.",
120
122
  reason: "OpenRig can run without cmux, but Open CMUX actions and cmux-aware node control will be unavailable until cmux control works.",
@@ -123,7 +125,7 @@ export function runDoctorChecks(deps) {
123
125
  }
124
126
  catch {
125
127
  checks.push({
126
- name: "cmux",
128
+ name: "cmux_shell",
127
129
  status: "warn",
128
130
  message: "cmux not found.",
129
131
  reason: "OpenRig can run without cmux, but Open CMUX actions and surface control will be unavailable.",
@@ -166,7 +168,48 @@ export function runDoctorChecks(deps) {
166
168
  fix: `Stop the process using port ${DEFAULT_PORT}, or start the daemon on a different port with: rig daemon start --port <port>`,
167
169
  };
168
170
  });
169
- return { checks, portCheck };
171
+ // 8. Daemon cmux control (async, only when shell cmux passed)
172
+ const asyncChecks = [portCheck];
173
+ if (shellCmuxPassed) {
174
+ const fetchFn = deps.fetch ?? globalThis.fetch;
175
+ const daemonCmuxCheck = (async () => {
176
+ try {
177
+ const healthRes = await fetchFn(`http://127.0.0.1:${DEFAULT_PORT}/healthz`);
178
+ if (!healthRes.ok) {
179
+ return { name: "cmux_daemon", status: "skipped", message: "Daemon not running. Skipping daemon cmux check." };
180
+ }
181
+ }
182
+ catch {
183
+ return { name: "cmux_daemon", status: "skipped", message: "Daemon not reachable. Skipping daemon cmux check." };
184
+ }
185
+ try {
186
+ const cmuxRes = await fetchFn(`http://127.0.0.1:${DEFAULT_PORT}/api/adapters/cmux/status`);
187
+ if (cmuxRes.ok && cmuxRes.json) {
188
+ const data = (await cmuxRes.json());
189
+ if (data.available) {
190
+ return { name: "cmux_daemon", status: "pass", message: "Daemon cmux control available." };
191
+ }
192
+ return {
193
+ name: "cmux_daemon",
194
+ status: "warn",
195
+ message: "Shell cmux works, but the daemon cannot control cmux.",
196
+ reason: "The daemon inherited a terminal/session environment that broke cmux adapter initialization.",
197
+ fix: "Restart the daemon with `rig daemon start` after setup. If it still fails, inspect the daemon log with `rig daemon logs`.",
198
+ };
199
+ }
200
+ }
201
+ catch { /* fetch failed */ }
202
+ return {
203
+ name: "cmux_daemon",
204
+ status: "warn",
205
+ message: "Shell cmux works, but the daemon cannot control cmux.",
206
+ reason: "The daemon inherited a terminal/session environment that broke cmux adapter initialization.",
207
+ fix: "Restart the daemon with `rig daemon start` after setup. If it still fails, inspect the daemon log with `rig daemon logs`.",
208
+ };
209
+ })();
210
+ asyncChecks.push(daemonCmuxCheck);
211
+ }
212
+ return { checks, portCheck, asyncChecks };
170
213
  }
171
214
  function readCmuxSocketControlMode(deps) {
172
215
  try {
@@ -202,9 +245,9 @@ export function doctorCommand(depsOverride) {
202
245
  mkdirp: (dirPath) => mkdirSync(dirPath, { recursive: true }),
203
246
  checkWritable: (dirPath) => accessSync(dirPath, constants.W_OK),
204
247
  };
205
- const { checks, portCheck } = runDoctorChecks(deps);
206
- const portResult = await portCheck;
207
- const allChecks = [...checks, portResult];
248
+ const { checks, asyncChecks } = runDoctorChecks(deps);
249
+ const resolvedAsync = await Promise.all(asyncChecks);
250
+ const allChecks = [...checks, ...resolvedAsync];
208
251
  const healthy = allChecks.every((c) => c.status !== "fail");
209
252
  if (opts.json) {
210
253
  console.log(JSON.stringify({ healthy, checks: allChecks }, null, 2));
@@ -213,7 +256,7 @@ export function doctorCommand(depsOverride) {
213
256
  return;
214
257
  }
215
258
  for (const check of allChecks) {
216
- const icon = check.status === "pass" ? "OK" : check.status === "warn" ? "WARN" : "FAIL";
259
+ const icon = check.status === "pass" ? "OK" : check.status === "warn" ? "WARN" : check.status === "skipped" ? "SKIP" : "FAIL";
217
260
  console.log(` [${icon}] ${check.name}: ${check.message}`);
218
261
  if (check.reason)
219
262
  console.log(` Why: ${check.reason}`);