@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,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builder context resolution for `afx reset` (Spec 1273, phase 4).
|
|
3
|
+
*
|
|
4
|
+
* Invariant R3 requires a re-orientation carrying protocol, mode, worktree,
|
|
5
|
+
* branch, project identity and porch re-entry. The first draft of the plan
|
|
6
|
+
* assumed the builder registry held those facts. **It does not**, and the gap is
|
|
7
|
+
* silent rather than obvious:
|
|
8
|
+
*
|
|
9
|
+
* - `builders.protocol_name` is NULL for spec-type builders. `spawn.ts` never
|
|
10
|
+
* passes `protocolName` on that path (only the `protocol`-type spawn does),
|
|
11
|
+
* so every SPIR/ASPIR lane — precisely the long-running builders this feature
|
|
12
|
+
* exists for — has NULL there. Reading `db/schema.ts` shows the column and
|
|
13
|
+
* looks fine; the persistence path is where the truth is.
|
|
14
|
+
* - Mode is not persisted at all. `resolveMode` computes it at spawn from flags
|
|
15
|
+
* plus protocol defaults and discards it, so a spawn-time `--soft` cannot be
|
|
16
|
+
* recovered afterwards by recomputation.
|
|
17
|
+
* - Harness comes from workspace config, which can change while a builder runs,
|
|
18
|
+
* so config is not authoritative for a *running* builder.
|
|
19
|
+
*
|
|
20
|
+
* So this module reads the worktree, which holds all of it authoritatively:
|
|
21
|
+
* porch's `status.yaml` (protocol, phase), `.builder-prompt.txt` (the literal
|
|
22
|
+
* `## Mode:` line the builder was given), and `.builder-start.sh` (the launch
|
|
23
|
+
* line of the process actually running).
|
|
24
|
+
*
|
|
25
|
+
* Every chain ends in a **loud abort**, never a default. A guessed protocol or
|
|
26
|
+
* mode would produce a plausible-looking re-orientation that quietly reframes the
|
|
27
|
+
* builder — the exact drift R3 exists to prevent.
|
|
28
|
+
*/
|
|
29
|
+
import { join } from 'node:path';
|
|
30
|
+
import { parseAgentName } from '../../utils/agent-names.js';
|
|
31
|
+
import { BUILTIN_HARNESSES, getBuiltinHarness, buildCustomHarnessProvider, } from '../../utils/harness.js';
|
|
32
|
+
/** Thrown when a fact cannot be established. Never swallowed into a default. */
|
|
33
|
+
export class ContextResolutionError extends Error {
|
|
34
|
+
constructor(message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = 'ContextResolutionError';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Project ids this builder could legitimately own, most specific first.
|
|
41
|
+
*
|
|
42
|
+
* Three forms, because porch names projects differently per lane:
|
|
43
|
+
* - the issue number, for issue-driven lanes;
|
|
44
|
+
* - the builder id itself — `spawn.ts` passes `builderId` as the porch project
|
|
45
|
+
* id on the `--task` path;
|
|
46
|
+
* - the builder id with its protocol prefix stripped (`aspir-1273` → `1273`),
|
|
47
|
+
* which is how spec-driven lanes are named.
|
|
48
|
+
*/
|
|
49
|
+
export function candidateProjectIds(identity) {
|
|
50
|
+
const out = [];
|
|
51
|
+
if (identity.issueNumber)
|
|
52
|
+
out.push(identity.issueNumber);
|
|
53
|
+
// The raw registry id, INCLUDING any `builder-` prefix. `spawn --task
|
|
54
|
+
// --protocol X` passes `builderId` straight to `porch init`
|
|
55
|
+
// (`spawn.ts:548`), and `initPorchInWorktree` keeps dashes when sanitising
|
|
56
|
+
// (`spawn-worktree.ts:472`), so that lane's porch project id really is
|
|
57
|
+
// `builder-task-<id>`. Omitting this form orphaned it: porch resolved to
|
|
58
|
+
// null, and the builder was re-oriented as protocol TASK with no porch
|
|
59
|
+
// re-entry — a silently degraded frame rather than a loud failure.
|
|
60
|
+
out.push(identity.builderId);
|
|
61
|
+
// And without the prefix, which is how spec/bugfix lanes are named.
|
|
62
|
+
const bare = identity.builderId.replace(/^builder-/, '');
|
|
63
|
+
if (bare !== identity.builderId)
|
|
64
|
+
out.push(bare);
|
|
65
|
+
const dash = bare.indexOf('-');
|
|
66
|
+
if (dash > 0)
|
|
67
|
+
out.push(bare.slice(dash + 1));
|
|
68
|
+
return out.filter(v => v !== '');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compare ids ignoring case and leading zeros.
|
|
72
|
+
*
|
|
73
|
+
* Case: the registry lowercases builder ids while worktree and directory names
|
|
74
|
+
* preserve the original (`builder-task-re_v` vs `.builders/task-RE_V`). macOS
|
|
75
|
+
* hides that; a case-sensitive filesystem would not.
|
|
76
|
+
* Leading zeros: project dirs use `0087-…` while porch ids and CLI arguments use
|
|
77
|
+
* `87` (`afx cleanup -p 466` vs `0466` is the same long-standing split).
|
|
78
|
+
*/
|
|
79
|
+
function normalizeId(value) {
|
|
80
|
+
return value.trim().toLowerCase().replace(/^0+(?=\d)/, '');
|
|
81
|
+
}
|
|
82
|
+
function claimStrength(dir, statusId, identity) {
|
|
83
|
+
const rawId = normalizeId(identity.builderId);
|
|
84
|
+
if (statusId && normalizeId(statusId) === rawId && !/^\d+$/.test(rawId))
|
|
85
|
+
return 'strong';
|
|
86
|
+
const wanted = candidateProjectIds(identity).map(normalizeId);
|
|
87
|
+
// A status.yaml that STATES its id is authoritative about what it is. If that
|
|
88
|
+
// id does not claim this builder, the directory name cannot overrule it —
|
|
89
|
+
// `codev/projects/1273-old/` holding `id: '999'` belongs to 999, whatever the
|
|
90
|
+
// directory is called. Falling through to the name here let a renamed or
|
|
91
|
+
// recycled directory claim a builder, and manufactured false ambiguities
|
|
92
|
+
// alongside the real project.
|
|
93
|
+
if (statusId)
|
|
94
|
+
return wanted.includes(normalizeId(statusId)) ? 'weak' : 'none';
|
|
95
|
+
// Directory-name fallback applies ONLY when the file states no id at all.
|
|
96
|
+
const dirNorm = normalizeId(dir);
|
|
97
|
+
return wanted.some(c => dirNorm === c || dirNorm.startsWith(`${c}-`)) ? 'weak' : 'none';
|
|
98
|
+
}
|
|
99
|
+
export function readPorchContext(fs, worktree, identity) {
|
|
100
|
+
const projectsDir = join(worktree, 'codev', 'projects');
|
|
101
|
+
const dirs = fs.listDirs(projectsDir);
|
|
102
|
+
if (!dirs || dirs.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
// The protocol the builder id claims, used to corroborate weak (number-only)
|
|
105
|
+
// matches. Absent for ids that are not in canonical form, in which case a weak
|
|
106
|
+
// match cannot be corroborated and is not trusted.
|
|
107
|
+
const expectedProtocol = parseAgentName(identity.builderId)?.protocol ?? null;
|
|
108
|
+
const strong = [];
|
|
109
|
+
const weak = [];
|
|
110
|
+
for (const dir of dirs) {
|
|
111
|
+
const statusPath = join(projectsDir, dir, 'status.yaml');
|
|
112
|
+
const content = fs.read(statusPath);
|
|
113
|
+
if (content === null)
|
|
114
|
+
continue;
|
|
115
|
+
const protocol = matchScalar(content, 'protocol');
|
|
116
|
+
const phase = matchScalar(content, 'phase');
|
|
117
|
+
const id = matchScalar(content, 'id');
|
|
118
|
+
if (!protocol || !phase)
|
|
119
|
+
continue;
|
|
120
|
+
const claim = claimStrength(dir, id, identity);
|
|
121
|
+
if (claim === 'none')
|
|
122
|
+
continue;
|
|
123
|
+
const currentPlanPhase = matchScalar(content, 'current_plan_phase');
|
|
124
|
+
const ctx = {
|
|
125
|
+
projectId: id ?? dir.split('-')[0],
|
|
126
|
+
projectName: dir,
|
|
127
|
+
protocol,
|
|
128
|
+
phase,
|
|
129
|
+
currentPlanPhase: currentPlanPhase && currentPlanPhase !== 'null' ? currentPlanPhase : null,
|
|
130
|
+
statusPath,
|
|
131
|
+
};
|
|
132
|
+
if (claim === 'strong') {
|
|
133
|
+
strong.push(ctx);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// A weak match must agree with the protocol the builder id declares.
|
|
137
|
+
// Without this, `builder-bugfix-799` adopts the PIR project that happens to
|
|
138
|
+
// share the number — wrong protocol, wrong porch id, and silently so.
|
|
139
|
+
//
|
|
140
|
+
// And when the id is not in canonical form there IS no protocol to
|
|
141
|
+
// corroborate against, so the claim cannot be trusted at all. The previous
|
|
142
|
+
// version's comment said exactly that while the code did the opposite —
|
|
143
|
+
// `if (expectedProtocol && mismatch) continue` let every weak claim through
|
|
144
|
+
// whenever `expectedProtocol` was null. A legacy or noncanonical builder
|
|
145
|
+
// could adopt any historical project sharing its tail.
|
|
146
|
+
if (!expectedProtocol)
|
|
147
|
+
continue;
|
|
148
|
+
if (protocol.toLowerCase() !== expectedProtocol.toLowerCase())
|
|
149
|
+
continue;
|
|
150
|
+
weak.push(ctx);
|
|
151
|
+
}
|
|
152
|
+
const matches = strong.length > 0 ? strong : weak;
|
|
153
|
+
if (matches.length === 0)
|
|
154
|
+
return null;
|
|
155
|
+
if (matches.length > 1) {
|
|
156
|
+
// Never pick one arbitrarily — that is the bug this whole function exists to
|
|
157
|
+
// fix, and picking the "least wrong" of several is the same mistake with
|
|
158
|
+
// better manners.
|
|
159
|
+
throw new ContextResolutionError(`Ambiguous porch project for '${identity.builderId}': ${matches
|
|
160
|
+
.map(m => `${m.projectName} (${m.protocol})`)
|
|
161
|
+
.join(', ')} all claim it. Refusing to guess which one governs this builder.`);
|
|
162
|
+
}
|
|
163
|
+
return matches[0];
|
|
164
|
+
}
|
|
165
|
+
/** Read a top-level scalar from porch's status.yaml, stripping quotes. */
|
|
166
|
+
function matchScalar(content, key) {
|
|
167
|
+
const m = content.match(new RegExp(`^${key}:\\s*(.+)$`, 'm'));
|
|
168
|
+
if (!m)
|
|
169
|
+
return null;
|
|
170
|
+
const raw = m[1].trim().replace(/^['"]|['"]$/g, '');
|
|
171
|
+
return raw === '' ? null : raw;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The protocol recorded in status.yaml, if there is one.
|
|
175
|
+
*
|
|
176
|
+
* Reads through `readPorchContext` rather than re-scanning the project dirs, so
|
|
177
|
+
* the two cannot disagree about which status.yaml is authoritative. Worktrees
|
|
178
|
+
* routinely hold MANY project directories here (porch history is committed to
|
|
179
|
+
* `main`), which is exactly why both go through one identity-aware selector.
|
|
180
|
+
*/
|
|
181
|
+
export function protocolFromStatus(fs, worktree, identity) {
|
|
182
|
+
return readPorchContext(fs, worktree, identity)?.protocol ?? null;
|
|
183
|
+
}
|
|
184
|
+
// ============================================================================
|
|
185
|
+
// Mode
|
|
186
|
+
// ============================================================================
|
|
187
|
+
/**
|
|
188
|
+
* Read the mode the builder was actually told it was running in.
|
|
189
|
+
*
|
|
190
|
+
* The spawn prompt renders a literal `## Mode: STRICT` heading, and `--resume`
|
|
191
|
+
* does not rewrite the prompt file, so this stays correct across resumes. It is
|
|
192
|
+
* a stronger source than recomputing `resolveMode`, which cannot recover a
|
|
193
|
+
* spawn-time `--soft` from protocol defaults.
|
|
194
|
+
*/
|
|
195
|
+
export function modeFromBuilderPrompt(fs, worktree) {
|
|
196
|
+
const content = fs.read(join(worktree, '.builder-prompt.txt'));
|
|
197
|
+
if (content === null)
|
|
198
|
+
return null;
|
|
199
|
+
const m = content.match(/^##\s*Mode:\s*(STRICT|SOFT)\s*$/im);
|
|
200
|
+
if (!m)
|
|
201
|
+
return null;
|
|
202
|
+
return m[1].toLowerCase();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Recover an issue number from a porch project id.
|
|
206
|
+
*
|
|
207
|
+
* Porch ids are not uniformly numeric. PIR and SPIR use the bare issue number;
|
|
208
|
+
* **BUGFIX deliberately uses `<prefix>-<N>`** (`spawn.ts:817`, "historical, kept
|
|
209
|
+
* untouched"). A strict `/^\d+$/` guard therefore threw away BUGFIX's issue
|
|
210
|
+
* identity whenever the registry row lacked one — and on BUGFIX the issue body
|
|
211
|
+
* IS the spec, so the re-orientation lost the requirements it was meant to carry.
|
|
212
|
+
*
|
|
213
|
+
* Accepts a bare number or a canonical `<word>-<number>`; rejects anything else,
|
|
214
|
+
* so an ad-hoc task id (`builder-task-abc`) still cannot masquerade as an issue.
|
|
215
|
+
*/
|
|
216
|
+
export function issueNumberFromPorchId(projectId) {
|
|
217
|
+
if (!projectId)
|
|
218
|
+
return undefined;
|
|
219
|
+
if (/^\d+$/.test(projectId))
|
|
220
|
+
return projectId;
|
|
221
|
+
const m = projectId.match(/^[a-z]+-(\d+)$/i);
|
|
222
|
+
return m ? m[1] : undefined;
|
|
223
|
+
}
|
|
224
|
+
// ============================================================================
|
|
225
|
+
// Harness
|
|
226
|
+
// ============================================================================
|
|
227
|
+
/**
|
|
228
|
+
* Identify the harness from the worktree's launch script.
|
|
229
|
+
*
|
|
230
|
+
* Per-builder ground truth: the script is what the running process was started
|
|
231
|
+
* with, so it stays right even if workspace config changed since the spawn.
|
|
232
|
+
*/
|
|
233
|
+
export function harnessFromLaunchScript(fs, worktree, customHarnesses) {
|
|
234
|
+
const content = fs.read(join(worktree, '.builder-start.sh'));
|
|
235
|
+
if (content === null)
|
|
236
|
+
return null;
|
|
237
|
+
// Custom names first: a project may define a custom harness whose name
|
|
238
|
+
// contains a builtin's (e.g. "claude-experimental"), and the more specific
|
|
239
|
+
// match is the right one.
|
|
240
|
+
const names = new Set([
|
|
241
|
+
...Object.keys(customHarnesses ?? {}),
|
|
242
|
+
...Object.keys(BUILTIN_HARNESSES),
|
|
243
|
+
]);
|
|
244
|
+
for (const line of content.split('\n')) {
|
|
245
|
+
const command = commandNameOf(line);
|
|
246
|
+
if (command && names.has(command))
|
|
247
|
+
return command;
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* The command a shell line invokes, or null if the line invokes nothing.
|
|
253
|
+
*
|
|
254
|
+
* Matching on **command position** rather than searching the whole line for a
|
|
255
|
+
* harness name: a substring search would report a false positive on a line like
|
|
256
|
+
* `if [ "$HARNESS" = "codex" ]`, and naming the wrong harness would either refuse
|
|
257
|
+
* a resettable builder or — worse — approve typing into one that cannot be reset.
|
|
258
|
+
*/
|
|
259
|
+
function commandNameOf(line) {
|
|
260
|
+
let rest = line.trim();
|
|
261
|
+
if (!rest || rest.startsWith('#'))
|
|
262
|
+
return null;
|
|
263
|
+
// Strip shell control keywords that can prefix a command on the same line.
|
|
264
|
+
rest = rest.replace(/^(?:while|until|if|then|else|elif|do|done|fi|exec|command|nohup)\s+/, '');
|
|
265
|
+
// Strip leading `VAR=value ` environment assignments.
|
|
266
|
+
while (/^[A-Za-z_][A-Za-z0-9_]*=/.test(rest)) {
|
|
267
|
+
const space = rest.indexOf(' ');
|
|
268
|
+
if (space === -1)
|
|
269
|
+
return null; // a bare assignment invokes nothing
|
|
270
|
+
rest = rest.slice(space + 1).trimStart();
|
|
271
|
+
}
|
|
272
|
+
const first = rest.split(/\s+/)[0];
|
|
273
|
+
if (!first || first.includes('='))
|
|
274
|
+
return null;
|
|
275
|
+
// Basename, so `/usr/local/bin/claude` resolves like `claude`, with any
|
|
276
|
+
// surrounding quotes removed.
|
|
277
|
+
const base = first.replace(/^['"]|['"]$/g, '').split('/').pop();
|
|
278
|
+
return base && base !== '' ? base : null;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Map a harness name to its provider, honouring project-defined custom harnesses.
|
|
282
|
+
*
|
|
283
|
+
* Custom harnesses resolve to a real provider rather than failing as
|
|
284
|
+
* "unrecognisable", so the refusal a project sees is the accurate one — *this
|
|
285
|
+
* harness cannot reset in-session* — instead of a misleading "unknown harness".
|
|
286
|
+
* `buildCustomHarnessProvider` does not set `supportsContextReset`, so custom
|
|
287
|
+
* harnesses are unsupported by default; letting one declare support would be a
|
|
288
|
+
* one-field addition to `CustomHarnessConfig`, deliberately out of scope here.
|
|
289
|
+
*/
|
|
290
|
+
export function harnessProviderFor(harnessName, customHarnesses) {
|
|
291
|
+
// Own-property lookup (see getBuiltinHarness): `harnessName` comes from a running
|
|
292
|
+
// builder's launch script — a user-controlled key — so a bare index could hand
|
|
293
|
+
// back an inherited Object member as a bogus provider.
|
|
294
|
+
const builtin = getBuiltinHarness(harnessName);
|
|
295
|
+
if (builtin)
|
|
296
|
+
return builtin;
|
|
297
|
+
if (customHarnesses && harnessName in customHarnesses) {
|
|
298
|
+
return buildCustomHarnessProvider(customHarnesses[harnessName]);
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Derive artifact identity from the porch project.
|
|
304
|
+
*
|
|
305
|
+
* Porch names its project dir `<id>-<title>`, and spec/plan files share that
|
|
306
|
+
* stem by convention (`codev/specs/<id>-<title>.md`). Paths are returned only
|
|
307
|
+
* when the file exists.
|
|
308
|
+
*/
|
|
309
|
+
export function artifactPaths(fs, worktree, porch) {
|
|
310
|
+
if (!porch)
|
|
311
|
+
return { specName: null, specPath: null, planPath: null };
|
|
312
|
+
const specName = porch.projectName;
|
|
313
|
+
const specRel = join('codev', 'specs', `${specName}.md`);
|
|
314
|
+
const planRel = join('codev', 'plans', `${specName}.md`);
|
|
315
|
+
return {
|
|
316
|
+
specName,
|
|
317
|
+
specPath: fs.exists(join(worktree, specRel)) ? specRel : null,
|
|
318
|
+
planPath: fs.exists(join(worktree, planRel)) ? planRel : null,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Resolve everything the re-orientation needs, or throw.
|
|
323
|
+
*
|
|
324
|
+
* Deliberately does NOT consult `builders.protocol_name`: it is NULL for
|
|
325
|
+
* spec-type builders, so a reader who "fixed" this to use the registry would
|
|
326
|
+
* break exactly the lanes the feature targets while the code looked more correct.
|
|
327
|
+
*/
|
|
328
|
+
export function resolveBuilderContext(options) {
|
|
329
|
+
const { fs, builderId, worktree, branch, issueNumber, taskText, modeOverride, customHarnesses } = options;
|
|
330
|
+
if (!fs.exists(worktree)) {
|
|
331
|
+
throw new ContextResolutionError(`Worktree not found for '${builderId}': ${worktree}. The builder's registry row may be stale.`);
|
|
332
|
+
}
|
|
333
|
+
// Resolved once, with identity, and reused for both the protocol chain and
|
|
334
|
+
// the result. Two independent scans could disagree about which project is
|
|
335
|
+
// this builder's — the exact ambiguity the identity match exists to remove.
|
|
336
|
+
const identity = { builderId, issueNumber };
|
|
337
|
+
const porch = readPorchContext(fs, worktree, identity);
|
|
338
|
+
// --- Protocol: status.yaml → builder id → abort -------------------------
|
|
339
|
+
let protocol = porch?.protocol ?? null;
|
|
340
|
+
let protocolSource = 'status.yaml';
|
|
341
|
+
if (!protocol) {
|
|
342
|
+
const parsed = parseAgentName(builderId);
|
|
343
|
+
if (parsed) {
|
|
344
|
+
protocol = parsed.protocol;
|
|
345
|
+
protocolSource = 'builder-id';
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (!protocol) {
|
|
349
|
+
throw new ContextResolutionError(`Cannot determine the protocol for '${builderId}': no porch status.yaml under ${worktree}/codev/projects, ` +
|
|
350
|
+
`and the builder id is not in canonical 'builder-<protocol>-<id>' form. ` +
|
|
351
|
+
`Refusing to re-orient a builder without naming its protocol.`);
|
|
352
|
+
}
|
|
353
|
+
// --- Mode: flag → .builder-prompt.txt → abort ---------------------------
|
|
354
|
+
const promptMode = modeFromBuilderPrompt(fs, worktree);
|
|
355
|
+
// Positive evidence, not a negative inference: a bare `--task` spawn writes a
|
|
356
|
+
// prompt with no `## Mode:` heading, while `--task --protocol X` renders the
|
|
357
|
+
// full template (built BEFORE porch init, so it survives a failed init).
|
|
358
|
+
const isBareTask = Boolean(taskText) && promptMode === null;
|
|
359
|
+
let mode = modeOverride ?? null;
|
|
360
|
+
let modeSource = 'flag';
|
|
361
|
+
if (!mode) {
|
|
362
|
+
mode = promptMode;
|
|
363
|
+
modeSource = 'builder-prompt';
|
|
364
|
+
}
|
|
365
|
+
if (!mode && isBareTask) {
|
|
366
|
+
// A `--task` spawn writes a bare prompt with no `## Mode:` heading, so this
|
|
367
|
+
// lane could never auto-detect and every `afx reset <task>` hard-errored.
|
|
368
|
+
//
|
|
369
|
+
// Defaulting to SOFT is not a guess dressed up as a fact: "strict" means
|
|
370
|
+
// *porch orchestrates this builder*, and a builder with no porch project
|
|
371
|
+
// cannot be strict. The source is recorded as `task-default` so the report
|
|
372
|
+
// says where it came from rather than implying the worktree stated it.
|
|
373
|
+
//
|
|
374
|
+
// Scoped deliberately to the no-porch case. A porch-driven builder missing
|
|
375
|
+
// its `## Mode:` line is a genuine ambiguity and still aborts below.
|
|
376
|
+
mode = 'soft';
|
|
377
|
+
modeSource = 'task-default';
|
|
378
|
+
}
|
|
379
|
+
if (!mode) {
|
|
380
|
+
throw new ContextResolutionError(`Cannot determine the mode (strict/soft) for '${builderId}': no '## Mode:' line in ` +
|
|
381
|
+
`${join(worktree, '.builder-prompt.txt')}, and this builder is not the bare ad-hoc-task ` +
|
|
382
|
+
`lane that defaults to soft (no task text, or a rendered protocol template). ` +
|
|
383
|
+
`Mode is not persisted anywhere else — pass --mode strict or --mode soft explicitly.`);
|
|
384
|
+
}
|
|
385
|
+
// --- Harness: .builder-start.sh → provider → capability check → abort ---
|
|
386
|
+
const harnessName = harnessFromLaunchScript(fs, worktree, customHarnesses);
|
|
387
|
+
if (!harnessName) {
|
|
388
|
+
throw new ContextResolutionError(`Cannot determine the harness for '${builderId}': no recognisable launch command in ` +
|
|
389
|
+
`${join(worktree, '.builder-start.sh')}. Refusing to type into a terminal whose agent is unknown.`);
|
|
390
|
+
}
|
|
391
|
+
const harness = harnessProviderFor(harnessName, customHarnesses);
|
|
392
|
+
if (!harness) {
|
|
393
|
+
throw new ContextResolutionError(`Harness '${harnessName}' is not a known provider — it is neither built in nor defined under ` +
|
|
394
|
+
`"harness" in .codev/config.json. Refusing to type into a terminal whose agent is unknown.`);
|
|
395
|
+
}
|
|
396
|
+
if (!harness.supportsContextReset) {
|
|
397
|
+
throw new ContextResolutionError(`Harness '${harnessName}' has no in-session context reset, so 'afx reset' cannot clear this ` +
|
|
398
|
+
`builder's context. Only the claude harness supports it today. ` +
|
|
399
|
+
`To give this builder a fresh window, stop it and respawn without --resume.`);
|
|
400
|
+
}
|
|
401
|
+
const { specName, specPath, planPath } = artifactPaths(fs, worktree, porch);
|
|
402
|
+
return {
|
|
403
|
+
builderId,
|
|
404
|
+
worktree,
|
|
405
|
+
branch,
|
|
406
|
+
protocol,
|
|
407
|
+
protocolSource,
|
|
408
|
+
mode,
|
|
409
|
+
modeSource,
|
|
410
|
+
harnessName,
|
|
411
|
+
harness,
|
|
412
|
+
porch,
|
|
413
|
+
specName,
|
|
414
|
+
specPath,
|
|
415
|
+
planPath,
|
|
416
|
+
// Issue-driven protocols name the porch project after the issue, so the
|
|
417
|
+
// project id is the correct value when the registry row has none — but ONLY
|
|
418
|
+
// when it is actually an issue number. The `--task --protocol` lane's porch
|
|
419
|
+
// id is `builder-task-<id>`, which would render `- Issue: #builder-task-abc`
|
|
420
|
+
// and an unfollowable `gh issue view builder-task-abc` in the
|
|
421
|
+
// re-orientation. A fabricated issue reference is worse than none: it sends
|
|
422
|
+
// a freshly-reset builder to look up requirements that do not exist.
|
|
423
|
+
issueNumber: issueNumber ?? issueNumberFromPorchId(porch?.projectId),
|
|
424
|
+
taskText,
|
|
425
|
+
isBareTask,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/agent-farm/commands/reset/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset orchestrator — the `afx reset` state machine (Spec 1273).
|
|
3
|
+
*
|
|
4
|
+
* Composes the verified parts from phases 1–5 into the flow the architect ran by
|
|
5
|
+
* hand on 2026-07-27: request save-state → verify the receipt → wait for the
|
|
6
|
+
* turn to end → `/clear` → re-orient.
|
|
7
|
+
*
|
|
8
|
+
* ## Why this is a state machine over injected ports
|
|
9
|
+
*
|
|
10
|
+
* Reset is destructive in a way almost nothing else in Agent Farm is: `/clear`
|
|
11
|
+
* discards a builder's entire conversation, and there is no undo. Every safety
|
|
12
|
+
* property is therefore an ORDERING property — "the clear never happens before
|
|
13
|
+
* X" — and ordering is exactly what is hardest to prove by reading code.
|
|
14
|
+
*
|
|
15
|
+
* So the orchestrator does two things no ordinary command does:
|
|
16
|
+
*
|
|
17
|
+
* 1. Every externally-visible action goes through a port (`clock`, `fs`,
|
|
18
|
+
* `sendMessage`, `sendRaw`, `sendEscape`). Nothing here touches Tower, a
|
|
19
|
+
* PTY or the filesystem directly.
|
|
20
|
+
* 2. Every action is appended to an ordered **step log** before it is
|
|
21
|
+
* performed.
|
|
22
|
+
*
|
|
23
|
+
* The invariant tests then assert over that log — that `clear` never appears
|
|
24
|
+
* without `assemble` before it, that `escalate-esc` never precedes
|
|
25
|
+
* `receipt-accepted`, that an aborted run contains no `clear` at all. That turns
|
|
26
|
+
* "impossible by construction" from a claim in a comment into something a test
|
|
27
|
+
* can fail on.
|
|
28
|
+
*
|
|
29
|
+
* ## The invariants, and where each is enforced
|
|
30
|
+
*
|
|
31
|
+
* - **R1** (never clear without a saved re-orientation): `runReset` assembles and
|
|
32
|
+
* writes `.builder-reorient.md` at step 2, before any destructive step exists
|
|
33
|
+
* in the log. Assembly failure returns before the request is even sent.
|
|
34
|
+
* - **R2** (never clear without a verified receipt): the poll loop only leaves
|
|
35
|
+
* `awaiting-receipt` on `accepted`; every other exit path returns an aborted
|
|
36
|
+
* result.
|
|
37
|
+
* - **R3** (complete-or-abort re-orientation): delegated wholesale to
|
|
38
|
+
* `assembleReorientation`, which throws rather than emitting a partial frame.
|
|
39
|
+
* - **R4** (never clear a builder mid-turn): quiescence is a bounded wait, then
|
|
40
|
+
* at most ONE ESC escalation, then a second bounded wait. Still not quiet
|
|
41
|
+
* aborts — there is deliberately no third attempt and no "clear anyway".
|
|
42
|
+
*/
|
|
43
|
+
import type { ResolvedBuilderContext } from './context.js';
|
|
44
|
+
import { type IssuePayload, type ReorientationPayload, type ResumeNoticePort, type SpawnPromptPort } from './reorient.js';
|
|
45
|
+
import { type ReceiptFsPort } from './receipt.js';
|
|
46
|
+
/** Filesystem surface. Superset of the receipt gate's, plus the R1 write. */
|
|
47
|
+
export interface ResetFsPort extends ReceiptFsPort {
|
|
48
|
+
write(path: string, content: string): void;
|
|
49
|
+
}
|
|
50
|
+
/** Wall clock and sleep, injected so tests run instantly and deterministically. */
|
|
51
|
+
export interface ClockPort {
|
|
52
|
+
now(): number;
|
|
53
|
+
sleep(ms: number): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
/** What the orchestrator can observe about the target terminal. */
|
|
56
|
+
export interface TerminalObservation {
|
|
57
|
+
exists: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Epoch ms of the last PTY output (phase 2).
|
|
60
|
+
*
|
|
61
|
+
* `undefined` means the Tower serving this terminal predates the field — NOT
|
|
62
|
+
* "no output ever". The quiescence gate refuses to proceed on `undefined`
|
|
63
|
+
* rather than treating it as 0, which would read as "silent since 1970" and
|
|
64
|
+
* clear a builder mid-turn. That is the exact R4 violation this field exists
|
|
65
|
+
* to prevent.
|
|
66
|
+
*/
|
|
67
|
+
lastDataAt?: number;
|
|
68
|
+
/**
|
|
69
|
+
* Whether input can actually reach the process right now.
|
|
70
|
+
*
|
|
71
|
+
* `undefined` means an older Tower did not report it. Unlike `lastDataAt`,
|
|
72
|
+
* absence here is NOT treated as a refusal, and the asymmetry is deliberate:
|
|
73
|
+
* an unobservable turn state leads to a SILENT, destructive failure (clearing
|
|
74
|
+
* a builder mid-turn), whereas an unobservable write path leads to a LOUD,
|
|
75
|
+
* harmless one (the first send throws). Refuse only what fails quietly.
|
|
76
|
+
*/
|
|
77
|
+
writable?: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The three ways to reach a terminal, kept as three distinct operations.
|
|
81
|
+
*
|
|
82
|
+
* They are separate methods rather than one `write(data, mode)` because the
|
|
83
|
+
* underlying transports are genuinely different and confusing two of them is
|
|
84
|
+
* silent. Tower's `escape` route calls `writeEscapeToSession`, which writes a
|
|
85
|
+
* hardcoded ESC and **ignores the message body entirely**
|
|
86
|
+
* (`servers/message-write.ts:46`). So a single `writeRaw(data)` bound to
|
|
87
|
+
* `escape: true` would deliver an ESC when asked to type `/clear` — the command
|
|
88
|
+
* would appear to succeed, the terminal would go quiet, and no context would be
|
|
89
|
+
* cleared. Splitting the port makes that mistake unrepresentable.
|
|
90
|
+
*/
|
|
91
|
+
export interface TerminalPort {
|
|
92
|
+
observe(): Promise<TerminalObservation>;
|
|
93
|
+
/** Deliver a normal, formatted message (the save request, the re-orientation). */
|
|
94
|
+
sendMessage(message: string): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Type unformatted text into the PTY (Tower's `raw: true`).
|
|
97
|
+
*
|
|
98
|
+
* This is how `/clear` is delivered — as literal typed input, which is what
|
|
99
|
+
* the verified manual recipe used (`afx send <builder> --raw '/clear'`).
|
|
100
|
+
*/
|
|
101
|
+
sendRaw(text: string): Promise<void>;
|
|
102
|
+
/** Send a bare ESC keystroke (Tower's `escape: true`; phase 1's path). */
|
|
103
|
+
sendEscape(): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Recent terminal output plus the buffer's total line count, for best-effort
|
|
106
|
+
* clear confirmation. Null when this Tower cannot serve it.
|
|
107
|
+
*
|
|
108
|
+
* `total` is what makes confirmation trustworthy. Reset writes into this same
|
|
109
|
+
* terminal — the save request, the re-orientation — so any pattern matched
|
|
110
|
+
* against the whole buffer eventually collides with reset's OWN text. (It did,
|
|
111
|
+
* twice: first the echoed `/clear`, then the save request's "CONTEXT RESET
|
|
112
|
+
* INCOMING" header.) Snapshotting `total` before the clear lets the check read
|
|
113
|
+
* only what the harness emitted AFTERWARDS.
|
|
114
|
+
*/
|
|
115
|
+
readOutput?(): Promise<{
|
|
116
|
+
lines: string[];
|
|
117
|
+
total: number;
|
|
118
|
+
} | null>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Every externally-visible action, in order.
|
|
122
|
+
*
|
|
123
|
+
* The names are part of the test contract — the invariant assertions match on
|
|
124
|
+
* them — so renaming one is an API change, not a cosmetic edit.
|
|
125
|
+
*/
|
|
126
|
+
export type ResetStepName = 'resolve' | 'assemble' | 'write-reorient-file' | 'interrupt-first' | 'send-save-request' | 'receipt-accepted' | 'quiescent' | 'escalate-esc' | 'clear' | 'clear-confirmed' | 'clear-unconfirmed' | 'send-reorientation';
|
|
127
|
+
export interface ResetStep {
|
|
128
|
+
name: ResetStepName;
|
|
129
|
+
at: number;
|
|
130
|
+
detail?: string;
|
|
131
|
+
}
|
|
132
|
+
export type ResetOutcome = 'completed' | 'aborted' | 'dry-run';
|
|
133
|
+
export interface ResetResult {
|
|
134
|
+
outcome: ResetOutcome;
|
|
135
|
+
steps: ResetStep[];
|
|
136
|
+
/** Populated on `aborted`. Names the gate that failed, never just "failed". */
|
|
137
|
+
abortReason?: string;
|
|
138
|
+
nonce: string;
|
|
139
|
+
statePath: string;
|
|
140
|
+
reorientPath: string;
|
|
141
|
+
payload?: ReorientationPayload;
|
|
142
|
+
/**
|
|
143
|
+
* The exact save-state request the builder is asked to act on.
|
|
144
|
+
*
|
|
145
|
+
* Exposed rather than kept internal because `--dry-run` must be able to print
|
|
146
|
+
* it. The request is what the whole R2 gate is verifying compliance with, so
|
|
147
|
+
* "what exactly will the builder be told to write" is the single most useful
|
|
148
|
+
* thing a dry run can show — and it cannot be shown if the orchestrator keeps
|
|
149
|
+
* it to itself.
|
|
150
|
+
*/
|
|
151
|
+
saveRequest: string;
|
|
152
|
+
/** Size of the accepted state file, for the report. */
|
|
153
|
+
stateBytes?: number;
|
|
154
|
+
}
|
|
155
|
+
/** Thrown for conditions that must stop the run before anything is touched. */
|
|
156
|
+
export declare class ResetPreflightError extends Error {
|
|
157
|
+
constructor(message: string);
|
|
158
|
+
}
|
|
159
|
+
export interface RunResetOptions {
|
|
160
|
+
context: ResolvedBuilderContext;
|
|
161
|
+
fs: ResetFsPort;
|
|
162
|
+
clock: ClockPort;
|
|
163
|
+
terminal: TerminalPort;
|
|
164
|
+
buildSpawnPrompt: SpawnPromptPort;
|
|
165
|
+
buildResumeNotice?: ResumeNoticePort;
|
|
166
|
+
issue?: IssuePayload;
|
|
167
|
+
/** Architect addendum from `--note` / `--file`. */
|
|
168
|
+
addendum?: string;
|
|
169
|
+
/** Print the plan and touch nothing. */
|
|
170
|
+
dryRun?: boolean;
|
|
171
|
+
/** ESC before the save request, for a builder already wedged mid-turn. */
|
|
172
|
+
interruptFirst?: boolean;
|
|
173
|
+
receiptTimeoutMs?: number;
|
|
174
|
+
pollIntervalMs?: number;
|
|
175
|
+
minBytes?: number;
|
|
176
|
+
stabilityWindowMs?: number;
|
|
177
|
+
quietWindowMs?: number;
|
|
178
|
+
quiesceTimeoutMs?: number;
|
|
179
|
+
quiescePostEscalationTimeoutMs?: number;
|
|
180
|
+
/** Override for the state-file name. Validated to stay inside the worktree. */
|
|
181
|
+
stateFileName?: string;
|
|
182
|
+
}
|
|
183
|
+
export declare function runReset(options: RunResetOptions): Promise<ResetResult>;
|
|
184
|
+
/**
|
|
185
|
+
* Render the step log as the run report.
|
|
186
|
+
*
|
|
187
|
+
* Each line carries its EVIDENCE, not just a tick. "Receipt accepted" alone is
|
|
188
|
+
* the kind of reassurance that hides a stale file; "accepted — 8,432 bytes
|
|
189
|
+
* carrying nonce a1b2c3" is checkable.
|
|
190
|
+
*/
|
|
191
|
+
export declare function formatResetReport(result: ResetResult): string;
|
|
192
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/agent-farm/commands/reset/index.ts"],"names":[],"mappings":"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"}
|