@cluesmith/codev 3.2.3 → 3.3.0
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.
- package/dashboard-dist/assets/index-BZRTEMtH.css +32 -0
- package/dashboard-dist/assets/{index-BZ1x7x1X.js → index-JCbkpAcV.js} +33 -33
- package/dashboard-dist/assets/index-JCbkpAcV.js.map +1 -0
- package/dashboard-dist/index.html +2 -2
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +173 -0
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/attach.js +2 -2
- package/dist/agent-farm/commands/attach.js.map +1 -1
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
- package/dist/agent-farm/commands/cleanup.js +16 -0
- package/dist/agent-farm/commands/cleanup.js.map +1 -1
- package/dist/agent-farm/commands/inbox.d.ts +42 -0
- package/dist/agent-farm/commands/inbox.d.ts.map +1 -0
- package/dist/agent-farm/commands/inbox.js +129 -0
- package/dist/agent-farm/commands/inbox.js.map +1 -0
- package/dist/agent-farm/commands/interrupt.d.ts +20 -0
- package/dist/agent-farm/commands/interrupt.d.ts.map +1 -0
- package/dist/agent-farm/commands/interrupt.js +65 -0
- package/dist/agent-farm/commands/interrupt.js.map +1 -0
- package/dist/agent-farm/commands/reset/constants.d.ts +52 -0
- package/dist/agent-farm/commands/reset/constants.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/constants.js +52 -0
- package/dist/agent-farm/commands/reset/constants.js.map +1 -0
- package/dist/agent-farm/commands/reset/context.d.ts +230 -0
- package/dist/agent-farm/commands/reset/context.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/context.js +428 -0
- package/dist/agent-farm/commands/reset/context.js.map +1 -0
- package/dist/agent-farm/commands/reset/index.d.ts +192 -0
- package/dist/agent-farm/commands/reset/index.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/index.js +488 -0
- package/dist/agent-farm/commands/reset/index.js.map +1 -0
- package/dist/agent-farm/commands/reset/receipt.d.ts +97 -0
- package/dist/agent-farm/commands/reset/receipt.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/receipt.js +149 -0
- package/dist/agent-farm/commands/reset/receipt.js.map +1 -0
- package/dist/agent-farm/commands/reset/reorient.d.ts +117 -0
- package/dist/agent-farm/commands/reset/reorient.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/reorient.js +313 -0
- package/dist/agent-farm/commands/reset/reorient.js.map +1 -0
- package/dist/agent-farm/commands/reset.d.ts +19 -0
- package/dist/agent-farm/commands/reset.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset.js +292 -0
- package/dist/agent-farm/commands/reset.js.map +1 -0
- package/dist/agent-farm/commands/send.d.ts +2 -2
- package/dist/agent-farm/commands/send.d.ts.map +1 -1
- package/dist/agent-farm/commands/send.js +52 -11
- package/dist/agent-farm/commands/send.js.map +1 -1
- package/dist/agent-farm/commands/setup.d.ts +4 -1
- package/dist/agent-farm/commands/setup.d.ts.map +1 -1
- package/dist/agent-farm/commands/setup.js +8 -4
- package/dist/agent-farm/commands/setup.js.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.d.ts +116 -6
- package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.js +345 -74
- package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +13 -1
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +105 -9
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/commands/tower-sweep-husks.d.ts +6 -0
- package/dist/agent-farm/commands/tower-sweep-husks.d.ts.map +1 -0
- package/dist/agent-farm/commands/tower-sweep-husks.js +77 -0
- package/dist/agent-farm/commands/tower-sweep-husks.js.map +1 -0
- package/dist/agent-farm/commands/tower.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower.js +34 -0
- package/dist/agent-farm/commands/tower.js.map +1 -1
- package/dist/agent-farm/commands/whoami.d.ts +65 -0
- package/dist/agent-farm/commands/whoami.d.ts.map +1 -0
- package/dist/agent-farm/commands/whoami.js +196 -0
- package/dist/agent-farm/commands/whoami.js.map +1 -0
- package/dist/agent-farm/db/index.d.ts +1 -1
- package/dist/agent-farm/db/index.d.ts.map +1 -1
- package/dist/agent-farm/db/index.js +80 -1
- package/dist/agent-farm/db/index.js.map +1 -1
- package/dist/agent-farm/db/mailbox.d.ts +222 -0
- package/dist/agent-farm/db/mailbox.d.ts.map +1 -0
- package/dist/agent-farm/db/mailbox.js +304 -0
- package/dist/agent-farm/db/mailbox.js.map +1 -0
- package/dist/agent-farm/db/schema.d.ts +1 -1
- package/dist/agent-farm/db/schema.d.ts.map +1 -1
- package/dist/agent-farm/db/schema.js +35 -0
- package/dist/agent-farm/db/schema.js.map +1 -1
- package/dist/agent-farm/db/types.d.ts +45 -0
- package/dist/agent-farm/db/types.d.ts.map +1 -1
- package/dist/agent-farm/db/types.js.map +1 -1
- package/dist/agent-farm/lib/builder-lookup.d.ts +1 -1
- package/dist/agent-farm/lib/builder-lookup.js +2 -2
- package/dist/agent-farm/lib/builder-lookup.js.map +1 -1
- package/dist/agent-farm/lib/reconnect-backoff.d.ts +54 -0
- package/dist/agent-farm/lib/reconnect-backoff.d.ts.map +1 -0
- package/dist/agent-farm/lib/reconnect-backoff.js +47 -0
- package/dist/agent-farm/lib/reconnect-backoff.js.map +1 -0
- package/dist/agent-farm/lib/tower-client.d.ts +16 -6
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tower-client.js +37 -6
- package/dist/agent-farm/lib/tower-client.js.map +1 -1
- package/dist/agent-farm/lib/tunnel-client.d.ts +69 -1
- package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tunnel-client.js +218 -27
- package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
- package/dist/agent-farm/servers/architect-session-holder.d.ts +133 -0
- package/dist/agent-farm/servers/architect-session-holder.d.ts.map +1 -0
- package/dist/agent-farm/servers/architect-session-holder.js +268 -0
- package/dist/agent-farm/servers/architect-session-holder.js.map +1 -0
- package/dist/agent-farm/servers/cron-delivery.d.ts +72 -0
- package/dist/agent-farm/servers/cron-delivery.d.ts.map +1 -0
- package/dist/agent-farm/servers/cron-delivery.js +80 -0
- package/dist/agent-farm/servers/cron-delivery.js.map +1 -0
- package/dist/agent-farm/servers/delayed-send.d.ts +85 -0
- package/dist/agent-farm/servers/delayed-send.d.ts.map +1 -0
- package/dist/agent-farm/servers/delayed-send.js +165 -0
- package/dist/agent-farm/servers/delayed-send.js.map +1 -0
- package/dist/agent-farm/servers/gate-profiles.d.ts +67 -0
- package/dist/agent-farm/servers/gate-profiles.d.ts.map +1 -0
- package/dist/agent-farm/servers/gate-profiles.js +113 -0
- package/dist/agent-farm/servers/gate-profiles.js.map +1 -0
- package/dist/agent-farm/servers/mailbox-delivery.d.ts +370 -0
- package/dist/agent-farm/servers/mailbox-delivery.d.ts.map +1 -0
- package/dist/agent-farm/servers/mailbox-delivery.js +617 -0
- package/dist/agent-farm/servers/mailbox-delivery.js.map +1 -0
- package/dist/agent-farm/servers/mailbox-wiring.d.ts +125 -0
- package/dist/agent-farm/servers/mailbox-wiring.d.ts.map +1 -0
- package/dist/agent-farm/servers/mailbox-wiring.js +425 -0
- package/dist/agent-farm/servers/mailbox-wiring.js.map +1 -0
- package/dist/agent-farm/servers/message-write.d.ts +53 -1
- package/dist/agent-farm/servers/message-write.d.ts.map +1 -1
- package/dist/agent-farm/servers/message-write.js +63 -0
- package/dist/agent-farm/servers/message-write.js.map +1 -1
- package/dist/agent-farm/servers/overview.d.ts.map +1 -1
- package/dist/agent-farm/servers/overview.js +23 -4
- package/dist/agent-farm/servers/overview.js.map +1 -1
- package/dist/agent-farm/servers/process-census.d.ts +41 -0
- package/dist/agent-farm/servers/process-census.d.ts.map +1 -0
- package/dist/agent-farm/servers/process-census.js +62 -0
- package/dist/agent-farm/servers/process-census.js.map +1 -0
- package/dist/agent-farm/servers/render-gate.d.ts +141 -0
- package/dist/agent-farm/servers/render-gate.d.ts.map +1 -0
- package/dist/agent-farm/servers/render-gate.js +251 -0
- package/dist/agent-farm/servers/render-gate.js.map +1 -0
- package/dist/agent-farm/servers/session-log-sweep.d.ts +93 -0
- package/dist/agent-farm/servers/session-log-sweep.d.ts.map +1 -0
- package/dist/agent-farm/servers/session-log-sweep.js +165 -0
- package/dist/agent-farm/servers/session-log-sweep.js.map +1 -0
- package/dist/agent-farm/servers/session-submit.d.ts +90 -0
- package/dist/agent-farm/servers/session-submit.d.ts.map +1 -0
- package/dist/agent-farm/servers/session-submit.js +127 -0
- package/dist/agent-farm/servers/session-submit.js.map +1 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.d.ts +87 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.d.ts.map +1 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.js +129 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.js.map +1 -0
- package/dist/agent-farm/servers/tower-cron.d.ts +10 -7
- package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-cron.js +58 -53
- package/dist/agent-farm/servers/tower-cron.js.map +1 -1
- package/dist/agent-farm/servers/tower-instances.d.ts +14 -2
- package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-instances.js +128 -19
- package/dist/agent-farm/servers/tower-instances.js.map +1 -1
- package/dist/agent-farm/servers/tower-messages.d.ts +38 -1
- package/dist/agent-farm/servers/tower-messages.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-messages.js +106 -1
- package/dist/agent-farm/servers/tower-messages.js.map +1 -1
- package/dist/agent-farm/servers/tower-routes.d.ts +16 -4
- package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-routes.js +807 -99
- package/dist/agent-farm/servers/tower-routes.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +241 -15
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.d.ts +17 -2
- package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.js +139 -124
- package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.js +63 -4
- package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
- package/dist/agent-farm/servers/tower-types.d.ts +2 -1
- package/dist/agent-farm/servers/tower-types.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-utils.d.ts +99 -1
- package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-utils.js +242 -6
- package/dist/agent-farm/servers/tower-utils.js.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.js +6 -21
- package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
- package/dist/agent-farm/servers/write-queue.d.ts +35 -0
- package/dist/agent-farm/servers/write-queue.d.ts.map +1 -0
- package/dist/agent-farm/servers/write-queue.js +56 -0
- package/dist/agent-farm/servers/write-queue.js.map +1 -0
- package/dist/agent-farm/state.d.ts +6 -1
- package/dist/agent-farm/state.d.ts.map +1 -1
- package/dist/agent-farm/state.js +5 -2
- package/dist/agent-farm/state.js.map +1 -1
- package/dist/agent-farm/types.d.ts +39 -0
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/agent-names.d.ts +2 -2
- package/dist/agent-farm/utils/agent-names.d.ts.map +1 -1
- package/dist/agent-farm/utils/agent-names.js +3 -3
- package/dist/agent-farm/utils/agent-names.js.map +1 -1
- package/dist/agent-farm/utils/architect-name.d.ts +2 -2
- package/dist/agent-farm/utils/architect-name.d.ts.map +1 -1
- package/dist/agent-farm/utils/architect-name.js +3 -3
- package/dist/agent-farm/utils/architect-name.js.map +1 -1
- package/dist/agent-farm/utils/config.d.ts +13 -0
- package/dist/agent-farm/utils/config.d.ts.map +1 -1
- package/dist/agent-farm/utils/config.js +33 -1
- package/dist/agent-farm/utils/config.js.map +1 -1
- package/dist/agent-farm/utils/harness.d.ts +103 -7
- package/dist/agent-farm/utils/harness.d.ts.map +1 -1
- package/dist/agent-farm/utils/harness.js +126 -19
- package/dist/agent-farm/utils/harness.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -32
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +3 -2
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +7 -6
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/agy-auth-cache.d.ts +97 -0
- package/dist/commands/consult/agy-auth-cache.d.ts.map +1 -0
- package/dist/commands/consult/agy-auth-cache.js +320 -0
- package/dist/commands/consult/agy-auth-cache.js.map +1 -0
- package/dist/commands/consult/cli-options.d.ts +34 -0
- package/dist/commands/consult/cli-options.d.ts.map +1 -0
- package/dist/commands/consult/cli-options.js +67 -0
- package/dist/commands/consult/cli-options.js.map +1 -0
- package/dist/commands/consult/index.d.ts +56 -2
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +330 -27
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/consult/metrics.d.ts +42 -0
- package/dist/commands/consult/metrics.d.ts.map +1 -1
- package/dist/commands/consult/metrics.js +129 -9
- package/dist/commands/consult/metrics.js.map +1 -1
- package/dist/commands/doctor.d.ts +28 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +258 -22
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +3 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/checks.d.ts +23 -0
- package/dist/commands/porch/checks.d.ts.map +1 -1
- package/dist/commands/porch/checks.js +60 -0
- package/dist/commands/porch/checks.js.map +1 -1
- package/dist/commands/porch/config.d.ts +20 -0
- package/dist/commands/porch/config.d.ts.map +1 -1
- package/dist/commands/porch/config.js +20 -0
- package/dist/commands/porch/config.js.map +1 -1
- package/dist/commands/porch/index.d.ts.map +1 -1
- package/dist/commands/porch/index.js +32 -36
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/next.d.ts.map +1 -1
- package/dist/commands/porch/next.js +2 -41
- package/dist/commands/porch/next.js.map +1 -1
- package/dist/commands/update.d.ts +4 -4
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +9 -11
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/config.d.ts +70 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +67 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/consult-lanes.d.ts +149 -0
- package/dist/lib/consult-lanes.d.ts.map +1 -0
- package/dist/lib/consult-lanes.js +360 -0
- package/dist/lib/consult-lanes.js.map +1 -0
- package/dist/lib/default-branch.d.ts +1 -1
- package/dist/lib/default-branch.js +1 -1
- package/dist/lib/github.js +1 -1
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/gitignore.d.ts +25 -2
- package/dist/lib/gitignore.d.ts.map +1 -1
- package/dist/lib/gitignore.js +70 -0
- package/dist/lib/gitignore.js.map +1 -1
- package/dist/lib/migration-backup-audit.d.ts +64 -0
- package/dist/lib/migration-backup-audit.d.ts.map +1 -0
- package/dist/lib/migration-backup-audit.js +145 -0
- package/dist/lib/migration-backup-audit.js.map +1 -0
- package/dist/lib/prompt-behavior-metrics.d.ts +67 -0
- package/dist/lib/prompt-behavior-metrics.d.ts.map +1 -0
- package/dist/lib/prompt-behavior-metrics.js +290 -0
- package/dist/lib/prompt-behavior-metrics.js.map +1 -0
- package/dist/lib/protocol-drift-audit.d.ts +118 -0
- package/dist/lib/protocol-drift-audit.d.ts.map +1 -0
- package/dist/lib/protocol-drift-audit.js +217 -0
- package/dist/lib/protocol-drift-audit.js.map +1 -0
- package/dist/lib/scaffold.d.ts +10 -3
- package/dist/lib/scaffold.d.ts.map +1 -1
- package/dist/lib/scaffold.js +29 -26
- package/dist/lib/scaffold.js.map +1 -1
- package/dist/lib/skeleton.d.ts +22 -1
- package/dist/lib/skeleton.d.ts.map +1 -1
- package/dist/lib/skeleton.js +120 -0
- package/dist/lib/skeleton.js.map +1 -1
- package/dist/lib/test-env.d.ts +74 -0
- package/dist/lib/test-env.d.ts.map +1 -0
- package/dist/lib/test-env.js +92 -0
- package/dist/lib/test-env.js.map +1 -0
- package/dist/terminal/pty-manager.d.ts +9 -0
- package/dist/terminal/pty-manager.d.ts.map +1 -1
- package/dist/terminal/pty-manager.js +32 -6
- package/dist/terminal/pty-manager.js.map +1 -1
- package/dist/terminal/pty-session.d.ts +156 -4
- package/dist/terminal/pty-session.d.ts.map +1 -1
- package/dist/terminal/pty-session.js +307 -42
- package/dist/terminal/pty-session.js.map +1 -1
- package/dist/terminal/ring-buffer.d.ts +39 -6
- package/dist/terminal/ring-buffer.d.ts.map +1 -1
- package/dist/terminal/ring-buffer.js +74 -6
- package/dist/terminal/ring-buffer.js.map +1 -1
- package/dist/terminal/session-manager.d.ts +129 -0
- package/dist/terminal/session-manager.d.ts.map +1 -1
- package/dist/terminal/session-manager.js +337 -44
- package/dist/terminal/session-manager.js.map +1 -1
- package/dist/terminal/session-screen.d.ts +91 -0
- package/dist/terminal/session-screen.d.ts.map +1 -0
- package/dist/terminal/session-screen.js +135 -0
- package/dist/terminal/session-screen.js.map +1 -0
- package/dist/terminal/shellper-client.d.ts +19 -4
- package/dist/terminal/shellper-client.d.ts.map +1 -1
- package/dist/terminal/shellper-client.js +70 -8
- package/dist/terminal/shellper-client.js.map +1 -1
- package/dist/terminal/shellper-main.js +2 -1
- package/dist/terminal/shellper-main.js.map +1 -1
- package/dist/terminal/shellper-process.d.ts +1 -1
- package/dist/terminal/shellper-process.d.ts.map +1 -1
- package/dist/terminal/shellper-process.js +33 -9
- package/dist/terminal/shellper-process.js.map +1 -1
- package/dist/terminal/shellper-protocol.d.ts +40 -2
- package/dist/terminal/shellper-protocol.d.ts.map +1 -1
- package/dist/terminal/shellper-protocol.js +72 -5
- package/dist/terminal/shellper-protocol.js.map +1 -1
- package/dist/terminal/shellper-replay-buffer.d.ts +69 -7
- package/dist/terminal/shellper-replay-buffer.d.ts.map +1 -1
- package/dist/terminal/shellper-replay-buffer.js +167 -31
- package/dist/terminal/shellper-replay-buffer.js.map +1 -1
- package/package.json +11 -9
- package/skeleton/.claude/skills/afx/SKILL.md +27 -1
- package/skeleton/.claude/skills/arch-init/SKILL.md +135 -0
- package/skeleton/.claude/skills/arch-save/SKILL.md +183 -0
- package/skeleton/.claude/skills/codev/SKILL.md +33 -2
- package/skeleton/.claude/skills/runnable-worktrees/SKILL.md +119 -0
- package/skeleton/.codex/skills/afx/SKILL.md +170 -0
- package/skeleton/.codex/skills/arch-init/SKILL.md +135 -0
- package/skeleton/.codex/skills/arch-save/SKILL.md +183 -0
- package/skeleton/.codex/skills/codev/SKILL.md +90 -0
- package/skeleton/.codex/skills/consult/SKILL.md +96 -0
- package/skeleton/.codex/skills/generate-image/SKILL.md +45 -0
- package/skeleton/.codex/skills/porch/SKILL.md +60 -0
- package/skeleton/.codex/skills/runnable-worktrees/SKILL.md +119 -0
- package/skeleton/.codex/skills/update-arch-docs/SKILL.md +132 -0
- package/skeleton/protocols/air/builder-prompt.md +28 -47
- package/skeleton/protocols/air/consult-types/impl-review.md +17 -34
- package/skeleton/protocols/air/consult-types/pr-review.md +14 -37
- package/skeleton/protocols/air/prompts/implement.md +20 -73
- package/skeleton/protocols/air/prompts/pr.md +22 -54
- package/skeleton/protocols/air/protocol.md +40 -71
- package/skeleton/protocols/aspir/builder-prompt.md +29 -66
- package/skeleton/protocols/aspir/consult-types/impl-review.md +17 -44
- package/skeleton/protocols/aspir/consult-types/phase-review.md +17 -44
- package/skeleton/protocols/aspir/consult-types/plan-review.md +14 -38
- package/skeleton/protocols/aspir/consult-types/pr-review.md +13 -39
- package/skeleton/protocols/aspir/consult-types/spec-review.md +13 -33
- package/skeleton/protocols/aspir/prompts/implement.md +27 -196
- package/skeleton/protocols/aspir/prompts/plan.md +21 -85
- package/skeleton/protocols/aspir/prompts/review.md +29 -228
- package/skeleton/protocols/aspir/prompts/specify.md +25 -111
- package/skeleton/protocols/aspir/protocol.json +10 -0
- package/skeleton/protocols/aspir/protocol.md +36 -82
- package/skeleton/protocols/bugfix/builder-prompt.md +23 -45
- package/skeleton/protocols/bugfix/consult-types/impl-review.md +21 -45
- package/skeleton/protocols/bugfix/consult-types/pr-review.md +18 -52
- package/skeleton/protocols/bugfix/prompts/fix.md +16 -61
- package/skeleton/protocols/bugfix/prompts/investigate.md +18 -62
- package/skeleton/protocols/bugfix/prompts/pr.md +22 -57
- package/skeleton/protocols/bugfix/protocol.md +44 -50
- package/skeleton/protocols/experiment/builder-prompt.md +25 -58
- package/skeleton/protocols/experiment/protocol.md +22 -188
- package/skeleton/protocols/experiment/templates/notes.md +11 -71
- package/skeleton/protocols/maintain/builder-prompt.md +24 -45
- package/skeleton/protocols/maintain/consult-types/impl-review.md +17 -44
- package/skeleton/protocols/maintain/consult-types/pr-review.md +13 -39
- package/skeleton/protocols/maintain/prompts/maintain.md +1 -1
- package/skeleton/protocols/maintain/protocol.md +32 -266
- package/skeleton/protocols/maintain/templates/maintenance-run.md +11 -0
- package/skeleton/protocols/pir/builder-prompt.md +30 -64
- package/skeleton/protocols/pir/consult-types/impl-review.md +17 -50
- package/skeleton/protocols/pir/consult-types/pr-review.md +11 -40
- package/skeleton/protocols/pir/prompts/implement.md +1 -2
- package/skeleton/protocols/pir/prompts/plan.md +0 -3
- package/skeleton/protocols/pir/prompts/review.md +1 -1
- package/skeleton/protocols/pir/protocol.md +54 -177
- package/skeleton/protocols/research/builder-prompt.md +27 -58
- package/skeleton/protocols/research/protocol.md +28 -153
- package/skeleton/protocols/spike/builder-prompt.md +30 -48
- package/skeleton/protocols/spike/protocol.md +24 -107
- package/skeleton/protocols/spike/templates/findings.md +9 -39
- package/skeleton/protocols/spir/builder-prompt.md +33 -62
- package/skeleton/protocols/spir/consult-types/impl-review.md +17 -44
- package/skeleton/protocols/spir/consult-types/phase-review.md +17 -44
- package/skeleton/protocols/spir/consult-types/plan-review.md +14 -38
- package/skeleton/protocols/spir/consult-types/pr-review.md +13 -39
- package/skeleton/protocols/spir/consult-types/spec-review.md +13 -33
- package/skeleton/protocols/spir/prompts/implement.md +26 -195
- package/skeleton/protocols/spir/prompts/plan.md +20 -84
- package/skeleton/protocols/spir/prompts/review.md +28 -227
- package/skeleton/protocols/spir/prompts/specify.md +24 -110
- package/skeleton/protocols/spir/protocol.json +10 -0
- package/skeleton/protocols/spir/protocol.md +84 -633
- package/skeleton/protocols/spir/templates/plan.md +28 -147
- package/skeleton/protocols/spir/templates/review.md +21 -80
- package/skeleton/protocols/spir/templates/spec.md +24 -118
- package/skeleton/resources/commands/agent-farm.md +348 -0
- package/skeleton/resources/commands/codev.md +5 -0
- package/skeleton/resources/commands/consult.md +262 -8
- package/skeleton/resources/commands/overview.md +1 -0
- package/skeleton/roles/architect.md +67 -306
- package/skeleton/roles/builder.md +77 -191
- package/skeleton/templates/AGENTS.md +2 -0
- package/skeleton/templates/CLAUDE.md +2 -0
- package/templates/tower.html +39 -2
- package/dashboard-dist/assets/index-BZ1x7x1X.js.map +0 -1
- package/dashboard-dist/assets/index-DB1KBSNE.css +0 -32
- package/dist/agent-farm/servers/send-buffer.d.ts +0 -59
- package/dist/agent-farm/servers/send-buffer.d.ts.map +0 -1
- package/dist/agent-farm/servers/send-buffer.js +0 -103
- package/dist/agent-farm/servers/send-buffer.js.map +0 -1
- package/skeleton/porch/prompts/defend.md +0 -108
- package/skeleton/porch/prompts/diagnose.md +0 -70
- package/skeleton/porch/prompts/evaluate.md +0 -132
- package/skeleton/porch/prompts/fix.md +0 -59
- package/skeleton/porch/prompts/implement.md +0 -88
- package/skeleton/porch/prompts/plan.md +0 -74
- package/skeleton/porch/prompts/pr.md +0 -84
- package/skeleton/porch/prompts/review.md +0 -249
- package/skeleton/porch/prompts/specify.md +0 -53
- package/skeleton/porch/prompts/test.md +0 -63
- package/skeleton/protocols/aspir/templates/plan.md +0 -184
- package/skeleton/protocols/aspir/templates/review.md +0 -120
- package/skeleton/protocols/aspir/templates/spec.md +0 -154
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arch-save
|
|
3
|
+
description: Save an architect's state, clear its context, and re-init automatically — the packaged save→clear→re-init refresh cycle. Use when the owner directs a context refresh, or says "/arch-save", "save and clear", "refresh your context". Runs on the owner's direction; an architect does not invoke it autonomously mid-task. Counterpart to /arch-init, which recovers the state this writes.
|
|
4
|
+
argument-hint: "[name] (e.g. main; omit to auto-detect via afx whoami)"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /arch-save — save state, clear, and come back as yourself
|
|
8
|
+
|
|
9
|
+
Long sessions accumulate stale context. This is the deliberate cure: you choose the
|
|
10
|
+
moment, you choose what survives, and a fresh session resumes from what you wrote.
|
|
11
|
+
|
|
12
|
+
`$ARGUMENTS` is the architect name (e.g. `main`). Omit it to auto-detect.
|
|
13
|
+
|
|
14
|
+
## When NOT to run this
|
|
15
|
+
|
|
16
|
+
**On the owner's direction, or when the owner runs it themselves.** Do not invoke this
|
|
17
|
+
autonomously mid-task on your own judgement — the irreversible step is a human decision,
|
|
18
|
+
relocated from "press `/clear`" to "invoke `/arch-save`", not removed. If the owner tells
|
|
19
|
+
you to run it, run it; if you think it is time, *suggest* it and wait.
|
|
20
|
+
|
|
21
|
+
**Only at a resumable boundary** — a gate approval, a PR merge, a completed investigation,
|
|
22
|
+
the end of a long tool-heavy stretch. **Never mid-task.** Nothing here can check that; the
|
|
23
|
+
state file must describe a point a fresh session can resume *from*, not a half-finished
|
|
24
|
+
action. A mid-task snapshot resumes into confusion.
|
|
25
|
+
|
|
26
|
+
## The procedure
|
|
27
|
+
|
|
28
|
+
Do these in order. **The order is the feature** — step 3 must precede step 4, because the
|
|
29
|
+
context that knows what to write is the one about to be destroyed.
|
|
30
|
+
|
|
31
|
+
### 1. Resolve your name
|
|
32
|
+
|
|
33
|
+
If `$ARGUMENTS` is non-empty, that is your name. Otherwise run `afx whoami` and use the
|
|
34
|
+
reported `name` when `type: architect`.
|
|
35
|
+
|
|
36
|
+
- `type: builder` → **STOP.** This terminal is a builder. Report the mismatch.
|
|
37
|
+
- Non-zero exit → **STOP** and ask which architect you are. Do **not** guess, and do not
|
|
38
|
+
default to `main` — writing another architect's state file is the exact failure
|
|
39
|
+
`/arch-init` exists to prevent (#1094).
|
|
40
|
+
|
|
41
|
+
**Validate the name before building any path**: `[a-z][a-z0-9-]*`, at most 64 characters.
|
|
42
|
+
Reject slashes, `..`, uppercase, spaces. Never interpolate an unvalidated name into
|
|
43
|
+
`codev/state/<name>.md`.
|
|
44
|
+
|
|
45
|
+
### 2. Stop your own monitors
|
|
46
|
+
|
|
47
|
+
Enumerate every monitor, watcher or background task you armed, and stop it.
|
|
48
|
+
|
|
49
|
+
This is the half that only *you* can do. Monitors are **session-bound, not
|
|
50
|
+
context-bound**: they survive `/clear` and keep firing into a context that cannot evaluate
|
|
51
|
+
their alerts. `pgrep` cannot see them — they are harness background tasks, not shell
|
|
52
|
+
processes — so the instance after the clear has no handle on them. You do. Use it.
|
|
53
|
+
|
|
54
|
+
### 3. Write the pruned state file
|
|
55
|
+
|
|
56
|
+
Rewrite `codev/state/<name>.md`. **Pruning is part of the save, not polish afterwards — a
|
|
57
|
+
save that only appends has not done its job.**
|
|
58
|
+
|
|
59
|
+
- **Rewrite the current-state / open-loops section in place.** Do not accumulate stale
|
|
60
|
+
"current state" blocks. Never leave two sections with the same heading — a duplicated
|
|
61
|
+
"How to resume" means you appended where you should have overwritten.
|
|
62
|
+
- **Delete resolved loops outright.** A closed item's record is the log entry, not a
|
|
63
|
+
lingering line in current state.
|
|
64
|
+
- **Append one short dated entry** for what changed this stretch.
|
|
65
|
+
- **Collapse older entries into one-line summaries that point at durable artifacts** — the
|
|
66
|
+
merged PRs, closed issues and reviews where the detail actually lives.
|
|
67
|
+
- **Aim for one screen.** If the file has grown past easy reading, prune as part of *this*
|
|
68
|
+
save rather than leaving it for next time.
|
|
69
|
+
|
|
70
|
+
**Prune by pointer, never by deletion.** These files are gitignored (`.gitignore:15`), so
|
|
71
|
+
there is no history to recover from — pruned prose is gone for good. Replace detail with a
|
|
72
|
+
pointer to something durable; never delete the only record of something. Copying the file
|
|
73
|
+
first (`cp codev/state/<name>.md codev/state/.<name>.bak.md`) is cheap insurance.
|
|
74
|
+
|
|
75
|
+
**Content guardrails.** No secrets — tokens, keys, credentials. No transcript dumps, no
|
|
76
|
+
raw tool output. Only: current focus, open loops, and what a fresh session needs to resume.
|
|
77
|
+
|
|
78
|
+
Use the template at the end of this document.
|
|
79
|
+
|
|
80
|
+
### 4. Clear
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
afx send architect:<name> --raw '/clear'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**`architect:<name>`, never bare `architect`.** For a non-builder sender the bare form
|
|
87
|
+
resolves to `main`, or to the first registered architect — so a *sibling* architect
|
|
88
|
+
running this would clear **main's** terminal instead of its own. That destroys the context
|
|
89
|
+
of someone who never asked for anything, and it is one word away from correct.
|
|
90
|
+
|
|
91
|
+
**`--raw`, never the escape channel.** The escape route writes a bare ESC and discards the
|
|
92
|
+
message body, so `/clear` sent that way delivers an interrupt: the command appears to
|
|
93
|
+
succeed and nothing is cleared.
|
|
94
|
+
|
|
95
|
+
### 5. Schedule the re-init
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
afx send architect:<name> --delay 15 --raw '/arch-init <name>'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Tower holds this for 15 seconds and then delivers it. It has to come from outside the
|
|
102
|
+
session, because the clear destroys the context that would otherwise send it.
|
|
103
|
+
|
|
104
|
+
**Tower does not know whether the clear landed** — it waits out a delay, it does not
|
|
105
|
+
observe the result. 15 seconds is a value chosen because it works in practice, not a
|
|
106
|
+
guarantee about the clear's completion. If the timing is wrong the re-init arrives at the
|
|
107
|
+
wrong moment, which costs one manual message (see below) and nothing else. That is the
|
|
108
|
+
whole reason this cycle can be built on a delay rather than on machinery.
|
|
109
|
+
|
|
110
|
+
Delayed sends are **not persisted** — if Tower restarts inside the window, the message is
|
|
111
|
+
dropped. That is recoverable; see below.
|
|
112
|
+
|
|
113
|
+
**If this send fails, do not end your turn.** Step 4 queued the `/clear`, but it does not
|
|
114
|
+
take effect until your turn ends — so at this moment you still have your full context and
|
|
115
|
+
the failure is recoverable. Retry the send; if it keeps failing (Tower down, for example),
|
|
116
|
+
tell the owner that the clear is queued with no re-init scheduled, and give them the
|
|
117
|
+
command to send by hand once Tower is back. Ending the turn here is the one way to turn a
|
|
118
|
+
recoverable failure into a cleared session nobody is coming back for.
|
|
119
|
+
|
|
120
|
+
### 6. Stop
|
|
121
|
+
|
|
122
|
+
Do not start new work. End your turn so the clear can take effect.
|
|
123
|
+
|
|
124
|
+
## After the clear
|
|
125
|
+
|
|
126
|
+
`/arch-init` will read your state file and resume. Two things it should do first, in this
|
|
127
|
+
order:
|
|
128
|
+
|
|
129
|
+
1. **Reconcile monitors.** You stopped yours in step 2, but treat any alert you cannot
|
|
130
|
+
account for from the state block's monitor list as **stale** — disregard it, and stop
|
|
131
|
+
it if you can. An alert from a decommissioned target is indistinguishable from a live
|
|
132
|
+
one.
|
|
133
|
+
2. **Then re-arm** the monitors the block lists, and let each one **self-test once** before
|
|
134
|
+
trusting its alerts. A freshly-armed monitor's first alert has been a false positive in
|
|
135
|
+
practice.
|
|
136
|
+
|
|
137
|
+
## If `/arch-init` never arrives
|
|
138
|
+
|
|
139
|
+
Nothing is lost. The state file is on disk, the terminal is alive. Send it by hand:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
afx send architect:<name> --raw '/arch-init <name>'
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
This is the recovery the whole design leans on, which is why the cycle can accept imprecise
|
|
146
|
+
timing rather than needing machinery to guarantee it.
|
|
147
|
+
|
|
148
|
+
**If the clear did not take effect** — you still have your full context and a stray
|
|
149
|
+
`/arch-init` arrived — nothing was destroyed. Check whether `/clear` was submitted as its
|
|
150
|
+
own message rather than merged into another one, and report it; a `/clear` that arrives as
|
|
151
|
+
literal text on the front of the next message never executes.
|
|
152
|
+
|
|
153
|
+
## State block template
|
|
154
|
+
|
|
155
|
+
The structure below comes from a live run of this cycle. Every element earns its place;
|
|
156
|
+
keep them all, including a `MONITORS:` line even when the answer is "none armed" — an
|
|
157
|
+
omitted monitor list is indistinguishable from a forgotten one.
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
# <lane> architect — state (vNN, <date> ~HH:MM UTC — <milestone>, DELIBERATE /clear cycle)
|
|
161
|
+
# ⭐ THIS /clear IS INTENTIONAL (owner-directed context refresh). On re-init: normal
|
|
162
|
+
# /arch-init flow, then:
|
|
163
|
+
# 1. MONITORS: <what to stop if it is still firing, then what to re-arm> — watch target,
|
|
164
|
+
# cadence, alert pattern. Self-test once before trusting alerts. ("none armed" is a
|
|
165
|
+
# valid and complete answer.)
|
|
166
|
+
# 2. DONE pre-clear, with receipts: <PR> MERGED (<sha>, verified on origin/<branch>);
|
|
167
|
+
# <branch> PUSH-VERIFIED (<sha> local==origin). Distinguish "written" from "verified" —
|
|
168
|
+
# a cold reader cannot tell.
|
|
169
|
+
# 3. ACTIVE LANES: <builder-id> = <workstream> (<brief file on disk>; <standing rule>).
|
|
170
|
+
# Name the file, so no instruction lives only in the context being destroyed.
|
|
171
|
+
# 4. LATEST RESULTS: <the decision-relevant numbers>, so the first post-resume decision
|
|
172
|
+
# needs no archaeology.
|
|
173
|
+
# 5. QUEUED, with ordering: <item> — WAITS for <verdict>; <item> — <when>.
|
|
174
|
+
# 6. ENVELOPE: <standing authorization that survives>; <what expired with the completed
|
|
175
|
+
# work>.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Guardrails (architect-wide)
|
|
179
|
+
|
|
180
|
+
- **Never auto-approve porch gates.** A gate notification is for the human, not you.
|
|
181
|
+
- **Touch only your own builders / spawns / filings.**
|
|
182
|
+
- **Never `cd` into a builder worktree**; use `git -C` and absolute paths.
|
|
183
|
+
- **Stay on the default branch at the workspace root.**
|
|
@@ -16,7 +16,7 @@ codev doctor Check system dependencies
|
|
|
16
16
|
|
|
17
17
|
## codev init
|
|
18
18
|
|
|
19
|
-
Creates a **new directory** with the full codev structure: specs/, plans/, reviews/, protocols, CLAUDE.md, AGENTS.md,
|
|
19
|
+
Creates a **new directory** with the full codev structure: specs/, plans/, reviews/, protocols, CLAUDE.md, AGENTS.md, `.claude/skills/`, `.codex/skills/`, .codev/config.json, and .gitignore.
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
codev init my-app # Interactive setup
|
|
@@ -34,7 +34,7 @@ codev adopt -y # Skip conflict prompts
|
|
|
34
34
|
|
|
35
35
|
## codev update
|
|
36
36
|
|
|
37
|
-
Updates framework files (protocols, roles, skills) from the installed `@cluesmith/codev` package. **Never touches user data** (specs, plans, reviews). Creates `.codev-new` versions for customized files.
|
|
37
|
+
Updates framework files (protocols, roles, skills) from the installed `@cluesmith/codev` package. **Never touches user data** (specs, plans, reviews). Creates `.codev-new` versions for customized files. Missing Claude and Codex skills are added, while existing skill directories are preserved.
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
codev update # Interactive update
|
|
@@ -57,3 +57,34 @@ codev doctor
|
|
|
57
57
|
- `codev init` creates a new directory — use `codev adopt` for existing projects
|
|
58
58
|
- Always run `codev adopt` and `codev update` from the project root
|
|
59
59
|
- `codev update` only updates framework files — it never touches specs/plans/reviews
|
|
60
|
+
|
|
61
|
+
## Local build and install (this repository)
|
|
62
|
+
|
|
63
|
+
Test changes locally before publishing. Run from the repository root:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pnpm build # builds core first, then codev (including dashboard)
|
|
67
|
+
pnpm -w run local-install # packs both packages, installs globally, restarts Tower
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`local-install` (`scripts/local-install.sh`) packs `@cluesmith/codev-core` and
|
|
71
|
+
`@cluesmith/codev`, installs both in a single `npm install -g` (separate installs fail —
|
|
72
|
+
`codev-core` is not on the public registry), restores the executable bit on
|
|
73
|
+
`scripts/forge/**/*.sh` that `pnpm pack` strips, and restarts Tower last. Install runs while
|
|
74
|
+
Tower is up; only the final restart causes downtime. **Do not stop Tower first**, and do not use
|
|
75
|
+
`npm link` / `pnpm link` — it breaks global installs.
|
|
76
|
+
|
|
77
|
+
`pnpm build` also runs `copy-skeleton`, which copies `codev-skeleton/` into
|
|
78
|
+
`packages/codev/skeleton`. **Tests read that copy**, so after editing anything under
|
|
79
|
+
`codev-skeleton/` you must rebuild before the suite reflects your change.
|
|
80
|
+
|
|
81
|
+
### Where to run things
|
|
82
|
+
|
|
83
|
+
- `pnpm install` — repository root (installs all workspace packages)
|
|
84
|
+
- `pnpm build` / `pnpm test` — `packages/codev/`, or `pnpm --filter @cluesmith/codev build`
|
|
85
|
+
- Unit tests `packages/codev/tests/unit/` · E2E `packages/codev/tests/e2e/`
|
|
86
|
+
- Never run npm commands from the repository root unless told to
|
|
87
|
+
|
|
88
|
+
### Measuring code size
|
|
89
|
+
|
|
90
|
+
`tokei -e "tests/lib" -e "node_modules" -e ".git" -e ".builders" -e "dist" .`
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: runnable-worktrees
|
|
3
|
+
description: Make builder worktrees runnable — the `.codev/config.json` `worktree` block (symlinks, postSpawn, devCommand), the `afx dev` CLI, VSCode dev controls, and per-stack config recipes. Use when configuring a repo so reviewers can run a builder's branch, when `afx dev` fails to bind or start, when a dev process is orphaned holding a port, or when asked why worktree dev uses the same ports as main.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Runnable worktrees
|
|
7
|
+
|
|
8
|
+
When configured, each builder worktree (`.builders/<id>/`) becomes runnable: reviewers can run
|
|
9
|
+
whatever your dev command starts — a dev server, `cargo run`, `expo start`, a test watcher, a
|
|
10
|
+
build script — against the builder's branch without `cd`'ing, installing, or hunting for the
|
|
11
|
+
command. Opt-in via `.codev/config.json`; unconfigured repos see zero behavior change.
|
|
12
|
+
|
|
13
|
+
## Config: the `worktree` block
|
|
14
|
+
|
|
15
|
+
```jsonc
|
|
16
|
+
{
|
|
17
|
+
"worktree": {
|
|
18
|
+
"symlinks": ["..."], // globs symlinked from the workspace root into each new worktree
|
|
19
|
+
"postSpawn": ["..."], // shell commands run inside each new worktree after createWorktree
|
|
20
|
+
"devCommand": "..." // consumed by `afx dev <builder-id|main>`
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- **`symlinks`** — globs resolve from the workspace root and link into the worktree at the same
|
|
26
|
+
relative path. Root `.env` and `.codev/config.json` are *always* symlinked regardless.
|
|
27
|
+
**Symlinks, not copies**, so edits to main's env files reflect instantly in a running dev
|
|
28
|
+
session. A directory match is silently skipped (a glob cannot mask the worktree's own source)
|
|
29
|
+
**unless** the entry ends in a slash: `".local-user-data/"` is treated as a literal path and
|
|
30
|
+
links the directory whole — shared with the parent, not branch-isolated. A dangling link is
|
|
31
|
+
fine if the source does not exist yet.
|
|
32
|
+
- **`postSpawn`** — commands run sequentially with `cwd` = worktree path. A non-zero exit aborts
|
|
33
|
+
the spawn loudly; the half-built worktree stays for inspection.
|
|
34
|
+
- **`devCommand`** — the foreground command that starts your dev process. Required for
|
|
35
|
+
`afx dev`.
|
|
36
|
+
|
|
37
|
+
**Codev does not auto-detect your stack.** Pick a recipe below.
|
|
38
|
+
|
|
39
|
+
## CLI
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
afx dev <builder-id> # start dev in that builder's worktree
|
|
43
|
+
afx dev main # start dev in the MAIN workspace (Codev-managed)
|
|
44
|
+
afx dev --stop # stop the running dev PTY (builder or main)
|
|
45
|
+
afx setup <builder-id> # re-apply symlinks + postSpawn to an existing worktree (idempotent)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**One dev PTY at a time**, across {main + all builders} — deliberate; see *URLs are
|
|
49
|
+
load-bearing*. `main` is a reserved target running `worktree.devCommand` in the main checkout as
|
|
50
|
+
a Codev-managed, swappable PTY, symmetric with builders. Starting a second target prompts to
|
|
51
|
+
swap; a same-target request prints the existing terminal URL and exits. Dev PTYs are
|
|
52
|
+
**non-persistent** — a Tower restart or crash kills them; re-run to restart.
|
|
53
|
+
|
|
54
|
+
**Start main's dev with `afx dev main`, not a bare `pnpm dev`.** A hand-run `pnpm dev` is
|
|
55
|
+
invisible to Codev (which never kills what it did not spawn), so a builder dev started while it
|
|
56
|
+
holds the ports either fails to bind or — worse — serves main's code under the worktree URL.
|
|
57
|
+
`afx dev main` makes it a managed PTY that swap-detection can stop cleanly. This only helps if
|
|
58
|
+
used consistently.
|
|
59
|
+
|
|
60
|
+
## VSCode
|
|
61
|
+
|
|
62
|
+
Right-click a builder row in the Codev sidebar (Builders or Needs Attention):
|
|
63
|
+
|
|
64
|
+
- **Open Builder Terminal** — that builder's AI terminal in a tab (same as left-click).
|
|
65
|
+
- **Open Worktree Folder** — `.builders/<id>/` in the OS file manager.
|
|
66
|
+
- **Run Worktree Setup** — re-applies `worktree.symlinks` and `worktree.postSpawn` to an
|
|
67
|
+
existing worktree (the git steps are skipped). Idempotent. Use when the lockfile changed, when
|
|
68
|
+
`symlinks`/`postSpawn` grew after the builder spawned, when a link was deleted, or when the
|
|
69
|
+
original setup aborted. Streams install output in a fresh terminal. CLI: `afx setup <id>`.
|
|
70
|
+
- **View Diff** — unified `main...HEAD` diff for that worktree with a file-list pane.
|
|
71
|
+
- **Run Dev** / **Stop Dev** — spawn or kill the dev PTY as a `Codev: <name> (dev)` tab;
|
|
72
|
+
prompts to swap if another dev is running.
|
|
73
|
+
|
|
74
|
+
The sidebar's **Workspace** view carries a dev control for whatever folder the window is rooted
|
|
75
|
+
at — the main checkout resolves to `main`, a `.builders/<id>/` window resolves to that builder.
|
|
76
|
+
The row tooltip names the resolved target. Commands are also in the palette (Cmd+Shift+P); no
|
|
77
|
+
default keybindings.
|
|
78
|
+
|
|
79
|
+
## URLs are load-bearing
|
|
80
|
+
|
|
81
|
+
The dev PTY intentionally uses **the same ports and URLs as main**. OAuth callbacks, CORS
|
|
82
|
+
allowlists, cookie scoping, CSP `connect-src` and webhook URLs are all keyed off origin, so
|
|
83
|
+
running a worktree on a different port would break them.
|
|
84
|
+
|
|
85
|
+
Consequence: stop main's dev before starting a builder's, or the spawned dev fails at bind time
|
|
86
|
+
with `EADDRINUSE`.
|
|
87
|
+
|
|
88
|
+
## Cleanup and orphan recovery
|
|
89
|
+
|
|
90
|
+
`afx dev --stop` and the swap path kill the entire PTY **process group** (SIGTERM, then SIGKILL
|
|
91
|
+
after 5s), which signals every grandchild of a monorepo orchestrator (`pnpm dev`, `turbo dev`,
|
|
92
|
+
`pnpm -r --parallel run dev`) at once. Ports are reclaimed by the OS as a consequence — Codev
|
|
93
|
+
never manipulates ports directly.
|
|
94
|
+
|
|
95
|
+
If Tower hard-crashes mid-dev and a process is left holding a port outside Codev's records:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
lsof -ti :<port> | xargs kill
|
|
99
|
+
lsof -ti :3000,:3001,:4000 | xargs kill
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Recipes
|
|
103
|
+
|
|
104
|
+
**pnpm monorepo (Next.js / Turbo)**
|
|
105
|
+
```json
|
|
106
|
+
{"worktree": {"symlinks": [".env.local", ".env.development.local", "packages/*/.env", "packages/*/.env.local", "turbo.json"], "postSpawn": ["pnpm install --frozen-lockfile"], "devCommand": "pnpm dev"}}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**npm** — `{"symlinks": [".env.local", ".env.development"], "postSpawn": ["npm ci"], "devCommand": "npm run dev"}`
|
|
110
|
+
|
|
111
|
+
**yarn** — `{"symlinks": [".env.local"], "postSpawn": ["yarn install --frozen-lockfile"], "devCommand": "yarn dev"}`
|
|
112
|
+
|
|
113
|
+
**bun** — `{"symlinks": [".env.local"], "postSpawn": ["bun install --frozen-lockfile"], "devCommand": "bun dev"}`
|
|
114
|
+
|
|
115
|
+
**cargo** — `{"symlinks": [".env"], "postSpawn": [], "devCommand": "cargo run"}`
|
|
116
|
+
|
|
117
|
+
**poetry / uv** — `{"symlinks": [".env", ".env.local"], "postSpawn": ["uv sync"], "devCommand": "uv run python -m myapp"}`
|
|
118
|
+
|
|
119
|
+
**go mod** — `{"symlinks": [".env"], "postSpawn": ["go mod download"], "devCommand": "go run ./cmd/server"}`
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afx
|
|
3
|
+
description: Agent Farm CLI — the tool for spawning builders, managing Tower, workspaces, and cron tasks. ALWAYS consult this skill BEFORE running any `afx` command to get the exact syntax. This prevents wasting time guessing flags that don't exist. Use this whenever you need to spawn a builder, check status, send messages, clean up worktrees, manage Tower, or run cron tasks. If you're about to type `afx` followed by anything, check here first.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agent Farm CLI
|
|
7
|
+
|
|
8
|
+
## afx spawn
|
|
9
|
+
|
|
10
|
+
Spawns a new builder in an isolated git worktree.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
afx spawn [number] [options]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**The ONLY flags that exist:**
|
|
17
|
+
|
|
18
|
+
| Flag | Description |
|
|
19
|
+
|------|-------------|
|
|
20
|
+
| `--protocol <name>` | Protocol: spir, aspir, air, bugfix, maintain, experiment. **Required for numbered spawns.** |
|
|
21
|
+
| `--task <text>` | Ad-hoc task (no issue number needed) |
|
|
22
|
+
| `--shell` | Bare Claude session |
|
|
23
|
+
| `--worktree` | Bare worktree session |
|
|
24
|
+
| `--files <files>` | Context files, comma-separated. **Requires `--task`.** |
|
|
25
|
+
| `--no-comment` | Skip commenting on the GitHub issue |
|
|
26
|
+
| `--force` | Skip dirty-worktree and collision checks |
|
|
27
|
+
| `--soft` | Soft mode (AI follows protocol, you verify) |
|
|
28
|
+
| `--strict` | Strict mode (porch orchestrates) — this is the default |
|
|
29
|
+
| `--resume` | Resume builder in existing worktree |
|
|
30
|
+
| `--no-role` | Skip loading role prompt |
|
|
31
|
+
|
|
32
|
+
**There is NO `-t`, `--title`, `--name`, or `--branch` flag.** The branch name is auto-generated from the issue title.
|
|
33
|
+
|
|
34
|
+
**Examples:**
|
|
35
|
+
```bash
|
|
36
|
+
afx spawn 42 --protocol spir # SPIR builder for issue #42
|
|
37
|
+
afx spawn 42 --protocol aspir # ASPIR (autonomous, no human gates)
|
|
38
|
+
afx spawn 42 --protocol air # AIR (small features)
|
|
39
|
+
afx spawn 42 --protocol bugfix # Bugfix
|
|
40
|
+
afx spawn 42 --protocol spir --soft # Soft mode
|
|
41
|
+
afx spawn 42 --resume # Resume existing builder
|
|
42
|
+
afx spawn --task "fix the flaky test" # Ad-hoc task (no issue)
|
|
43
|
+
afx spawn 42 --protocol spir --force # Skip dirty-worktree check
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Pre-spawn checklist:**
|
|
47
|
+
1. `git status` — worktree must be clean (or use `--force`)
|
|
48
|
+
2. Commit specs/plans first — builders branch from HEAD and can't see uncommitted files
|
|
49
|
+
3. `--protocol` is required for numbered spawns
|
|
50
|
+
|
|
51
|
+
## afx send
|
|
52
|
+
|
|
53
|
+
Sends a message to a running builder.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
afx send [builder] [message]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Flag | Description |
|
|
60
|
+
|------|-------------|
|
|
61
|
+
| `--all` | Send to all builders |
|
|
62
|
+
| `--file <path>` | Include file content |
|
|
63
|
+
| `--interrupt` | Send Ctrl+C first |
|
|
64
|
+
| `--raw` | Skip structured formatting |
|
|
65
|
+
| `--no-enter` | Don't press Enter after message |
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
afx send 0042 "PR approved, please merge"
|
|
69
|
+
afx send 0585 "check the test output" --file /tmp/test-results.txt
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## afx cleanup
|
|
73
|
+
|
|
74
|
+
Removes a builder's worktree and branch after work is done.
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
afx cleanup [options]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
| Flag | Description |
|
|
81
|
+
|------|-------------|
|
|
82
|
+
| `-p, --project <id>` | Builder project ID (no leading zeros: `585` not `0585`) |
|
|
83
|
+
| `-i, --issue <number>` | Cleanup bugfix builder by issue number |
|
|
84
|
+
| `-t, --task <id>` | Cleanup task builder (e.g., `task-bEPd`) |
|
|
85
|
+
| `-f, --force` | Force cleanup even if branch not merged |
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
afx cleanup -p 585 # Clean up project 585
|
|
89
|
+
afx cleanup -p 585 -f # Force (unmerged branch)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Note:** `afx cleanup` uses plain numbers (`585`), not zero-padded (`0585`). But `afx send` uses zero-padded IDs (`0585`).
|
|
93
|
+
|
|
94
|
+
## afx status
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
afx status # Show all builders and workspace status
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
No flags needed. Shows Tower status, workspace, and all active builders.
|
|
101
|
+
|
|
102
|
+
## afx whoami
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
afx whoami # Report this terminal's identity (workspace, type, name)
|
|
106
|
+
afx whoami --json # Same, as a single JSON object
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Resolves identity from Tower/global.db's perspective: builder-worktree cwd
|
|
110
|
+
match first, then the Tower-injected `CODEV_ARCHITECT_NAME` env var. Exits 1
|
|
111
|
+
with an explanation when identity cannot be determined — it never guesses and
|
|
112
|
+
never defaults to `main` (issue #1094). Builders also get an `architect:`
|
|
113
|
+
field naming their spawning architect when recorded. Works without Tower.
|
|
114
|
+
|
|
115
|
+
## afx tower
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
afx tower start # Start Tower on port 4100
|
|
119
|
+
afx tower stop # Stop Tower
|
|
120
|
+
afx tower log # Tail Tower logs
|
|
121
|
+
afx tower status # Check daemon and cloud connection status
|
|
122
|
+
afx tower connect # Connect to Codev Cloud
|
|
123
|
+
afx tower disconnect # Disconnect from Codev Cloud
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
There is NO `afx tower restart` — use `afx tower stop && afx tower start`.
|
|
127
|
+
|
|
128
|
+
## afx workspace
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
afx workspace start # Start workspace for current project
|
|
132
|
+
afx workspace stop # Stop workspace processes
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`afx dash` is a deprecated alias — use `afx workspace` instead.
|
|
136
|
+
|
|
137
|
+
## afx cron
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
afx cron list # List all cron tasks
|
|
141
|
+
afx cron status <name> # Check task status
|
|
142
|
+
afx cron run <name> # Run immediately
|
|
143
|
+
afx cron enable <name> # Enable
|
|
144
|
+
afx cron disable <name> # Disable
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
There is NO `afx cron add` — create YAML files in `.af-cron/` directly:
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
name: Service Health Check # required, unique per workspace
|
|
151
|
+
schedule: "*/15 * * * *" # required, cron expression (or @hourly/@daily/@startup)
|
|
152
|
+
command: ./health-check.sh # required, run via shell
|
|
153
|
+
message: "Health alert: ${output}" # required, ${output} = trimmed command output
|
|
154
|
+
condition: "exitCode != 0" # optional JS expression, see below
|
|
155
|
+
target: architect # optional, default architect
|
|
156
|
+
timeout: 30 # optional, seconds, default 30
|
|
157
|
+
enabled: true # optional, default true
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`condition` is a JavaScript expression with two variables in scope: `output` (string — the command's trimmed output) and `exitCode` (number — 0 on success, the command's exit code on non-zero exit, 124 on timeout, -1 on spawn failure). With a `condition`, the message is delivered exactly when it evaluates truthy — including on failed runs (e.g. `exitCode != 0` alerts when the command fails). Without a `condition`, the message is delivered only when the command exits 0.
|
|
161
|
+
|
|
162
|
+
## Other commands
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
afx open <file> # Open file in annotation viewer (NOT system open)
|
|
166
|
+
afx shell # Spawn utility shell
|
|
167
|
+
afx attach # Attach to running builder terminal
|
|
168
|
+
afx rename <name> # Rename current shell session
|
|
169
|
+
afx architect # Start architect session in current terminal
|
|
170
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arch-init
|
|
3
|
+
description: Adopt an architect identity and recover its state from codev/state/<name>.md. Use when an architect terminal needs to (re)establish which architect it is — after a restart, context loss, or session handoff — or when the user says "/arch-init", "you are the X architect", or "recover your architect state". Identity resolves via `afx whoami` (an explicit name argument overrides); if neither resolves, ask the human — never guess.
|
|
4
|
+
argument-hint: "[name] (e.g. main; omit to auto-detect via afx whoami)"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /arch-init — become architect `<name>` and recover state
|
|
8
|
+
|
|
9
|
+
You are an **architect agent** in a codev workspace. This command tells you
|
|
10
|
+
which architect you are and where your durable state lives, so you can resume
|
|
11
|
+
mid-stream.
|
|
12
|
+
|
|
13
|
+
`$ARGUMENTS` is the architect name (e.g. `main`, or a sibling architect's
|
|
14
|
+
name in a multi-architect workspace).
|
|
15
|
+
|
|
16
|
+
## What to do
|
|
17
|
+
|
|
18
|
+
1. **Resolve your name.**
|
|
19
|
+
- If `$ARGUMENTS` is non-empty, that is your name — the human named you
|
|
20
|
+
explicitly, which removes all identity-resolution risk. **Validate it
|
|
21
|
+
first**: an architect name must match `[a-z][a-z0-9-]*` and be at most
|
|
22
|
+
64 characters (lowercase letters, digits, hyphens; starts with a
|
|
23
|
+
letter). Reject anything else — slashes, `..`, uppercase, spaces — and
|
|
24
|
+
tell the human the rule. Never build a file path from an unvalidated
|
|
25
|
+
name (path-traversal guard).
|
|
26
|
+
- If `$ARGUMENTS` is empty, run `afx whoami` and read its output:
|
|
27
|
+
- `type: architect` → adopt the reported `name`.
|
|
28
|
+
- `type: builder` → STOP. This terminal is a builder, not an architect;
|
|
29
|
+
report the mismatch to the human and do not adopt an architect
|
|
30
|
+
identity.
|
|
31
|
+
- Non-zero exit (identity unknown) → STOP and ask the human which
|
|
32
|
+
architect you are. Do NOT guess, and do NOT default to `main` —
|
|
33
|
+
adopting the wrong identity and writing to another architect's state
|
|
34
|
+
file is the exact failure this command exists to prevent.
|
|
35
|
+
|
|
36
|
+
2. **Read your state file: `codev/state/<name>.md`** (relative to the
|
|
37
|
+
workspace root).
|
|
38
|
+
- If it does not exist: list the architect state files in `codev/state/`
|
|
39
|
+
— **excluding `*_thread.md` files**, which are builder thread logs that
|
|
40
|
+
share the directory — tell the human the file is missing, and ask
|
|
41
|
+
whether to start a fresh state file for `<name>`. Do not fabricate
|
|
42
|
+
state.
|
|
43
|
+
- The state file is authoritative free text. It typically opens with a
|
|
44
|
+
role banner and may carry resume instructions; follow whatever it says.
|
|
45
|
+
- Architect state files are per-person and gitignored
|
|
46
|
+
(`codev/state/*.md`); never commit them. Builder `*_thread.md` files
|
|
47
|
+
are the opposite: versioned, shipping with each builder PR.
|
|
48
|
+
|
|
49
|
+
3. **Confirm identity + orient, then follow the state file.** In one tight
|
|
50
|
+
block, report: who you now are (name + one-line role from the banner, if
|
|
51
|
+
present), the file you read, and the current-state / open-loops summary
|
|
52
|
+
from the most recent dated section (or the file's leading content if it
|
|
53
|
+
has no dated sections). Then carry out whatever the state file says to do
|
|
54
|
+
on resume. Do not invent a new agenda — resume the one the state file
|
|
55
|
+
describes.
|
|
56
|
+
|
|
57
|
+
## Saving your state (and knowing when to `/clear`)
|
|
58
|
+
|
|
59
|
+
Recovery is only half the loop. `/arch-init` reads state; **you** write it. The
|
|
60
|
+
state file is not crash insurance — it is your deliberate memory-management
|
|
61
|
+
mechanism. Auto-compaction happens at an arbitrary moment with content you did
|
|
62
|
+
not choose; a state save happens at a boundary **you** pick, with a summary
|
|
63
|
+
**you** curate. That is strictly better, so use it:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
/arch-init (recover) → work → save at a checkpoint → refresh → /arch-init (recover) → …
|
|
67
|
+
│
|
|
68
|
+
packaged: /arch-save ─────────────────┤ stops monitors, saves, clears,
|
|
69
|
+
│ schedules /arch-init
|
|
70
|
+
manual: suggest /clear → human clears ┘ then human runs /arch-init
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**When to save.** Save at a *resumable boundary* — a point a fresh session
|
|
74
|
+
could pick up cleanly from. Good moments, judged by you: a gate approval, a PR
|
|
75
|
+
merge, a completed investigation, the end of a long tool-heavy stretch.
|
|
76
|
+
**Never save mid-task.** The state file must describe a point you can resume
|
|
77
|
+
*from*, not a half-finished action; a mid-task snapshot resumes into confusion.
|
|
78
|
+
|
|
79
|
+
**How to save (write format = read format).** Recovery reads *the role banner
|
|
80
|
+
plus the most recent dated section*, so a save must leave exactly that behind:
|
|
81
|
+
|
|
82
|
+
1. **Rewrite the current-state / open-loops section in place** — overwrite it
|
|
83
|
+
with where things actually stand now (current focus + open loops + how to
|
|
84
|
+
resume). Do not accumulate stale "current state" blocks, and never leave two
|
|
85
|
+
sections with the same heading (a duplicated "How to resume" or "Open loops"
|
|
86
|
+
means you appended where you should have overwritten). **Delete resolved
|
|
87
|
+
loops entirely** — a closed item's record is the log entry, not a lingering
|
|
88
|
+
line in current state.
|
|
89
|
+
2. **Append one short dated log entry** capturing what changed this stretch.
|
|
90
|
+
3. **Compact — this is part of the save, not optional polish.** Every save
|
|
91
|
+
both adds AND removes: after writing, keep the recent dated log entries in
|
|
92
|
+
full and collapse older ones into a single one-line summary that names
|
|
93
|
+
where the detail lives (the closed PRs, issues, and reviews it covered).
|
|
94
|
+
Remember these state files are gitignored — there is no git history to
|
|
95
|
+
fall back on, so pruned prose is gone for good. Prune by replacing detail
|
|
96
|
+
with pointers to durable artifacts, never by deleting the only record of
|
|
97
|
+
something. The file is a summary a fresh session reads at a glance —
|
|
98
|
+
one screen is the right order of magnitude, judged by you. If a save has
|
|
99
|
+
grown it past easy readability, prune as part of that save rather than
|
|
100
|
+
leaving it for next time.
|
|
101
|
+
|
|
102
|
+
**Content guardrails.** No secrets (tokens, keys, credentials). No transcript
|
|
103
|
+
dumps or raw tool output. Include only: current focus, open loops, and the
|
|
104
|
+
instructions a fresh session needs to resume.
|
|
105
|
+
|
|
106
|
+
**Then — and only then — suggest the refresh.** Save first, *then* tell the
|
|
107
|
+
human it is a good time to clear. You must never decide unilaterally to lose
|
|
108
|
+
your context; keeping the irreversible step behind a human decision means
|
|
109
|
+
accepting the suggestion can never lose anything, because the save already
|
|
110
|
+
happened. Make the suggestion **advisory, never nagging**, and only right
|
|
111
|
+
after a save — e.g.:
|
|
112
|
+
|
|
113
|
+
> State saved to `codev/state/<name>.md` — good time to refresh if this
|
|
114
|
+
> session is feeling heavy.
|
|
115
|
+
|
|
116
|
+
Do not repeat it, and do not prompt for it at any other time.
|
|
117
|
+
|
|
118
|
+
**`/arch-save` packages this whole loop**, and is the preferred path when the
|
|
119
|
+
owner directs a refresh: it stops your monitors, writes the pruned state file,
|
|
120
|
+
clears, and schedules `/arch-init` to bring you back — in that order, which is
|
|
121
|
+
the part that matters. The save discipline above is what it performs at its
|
|
122
|
+
step 3, so this section remains the source of truth for *how to write the
|
|
123
|
+
file*; `/arch-save` is the source of truth for *the sequence*. The manual path
|
|
124
|
+
(save → human clears → `/arch-init`) stays valid and is the fallback when
|
|
125
|
+
Tower is unavailable.
|
|
126
|
+
|
|
127
|
+
## Guardrails (architect-wide; the state file may add more)
|
|
128
|
+
|
|
129
|
+
- **Never auto-approve porch gates.** A gate notification is for the human,
|
|
130
|
+
not you.
|
|
131
|
+
- **Touch only your own builders / spawns / filings.** Sibling architects own
|
|
132
|
+
theirs.
|
|
133
|
+
- **Never `cd` into a builder worktree**; use `git -C` + absolute paths.
|
|
134
|
+
- **Stay on the default branch at the workspace root**; verify with
|
|
135
|
+
`git branch` if unsure.
|