@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
|
@@ -2,56 +2,126 @@
|
|
|
2
2
|
* Standalone replay buffer for the shellper process.
|
|
3
3
|
*
|
|
4
4
|
* Unlike RingBuffer (which stores lines), this stores raw byte chunks
|
|
5
|
-
* to preserve exact terminal output including escape sequences. It
|
|
6
|
-
* the
|
|
5
|
+
* to preserve exact terminal output including escape sequences. It evicts
|
|
6
|
+
* the oldest chunks when either the line or the byte ceiling is exceeded;
|
|
7
|
+
* both ceilings are needed, because a full-screen TUI emits almost no
|
|
8
|
+
* newlines and so is bounded only by the byte one (#1205).
|
|
7
9
|
*
|
|
8
10
|
* This module has NO dependencies beyond Node.js built-ins so the shellper
|
|
9
11
|
* process doesn't need to pull in the full package dependency tree.
|
|
12
|
+
* (shellper-protocol.ts is a sibling module under the same constraint.)
|
|
10
13
|
*/
|
|
14
|
+
import { REPLAY_PAYLOAD_MAX } from './shellper-protocol.js';
|
|
15
|
+
/**
|
|
16
|
+
* Byte ceiling on what this buffer retains (#1205). Until it existed the buffer
|
|
17
|
+
* was bounded only by line count, and a full-screen TUI (which redraws in place
|
|
18
|
+
* and emits almost no newlines) grew it without limit for the life of the
|
|
19
|
+
* session — multi-GB in the field.
|
|
20
|
+
*
|
|
21
|
+
* Derived from REPLAY_PAYLOAD_MAX rather than written as its own literal, and
|
|
22
|
+
* that derivation is the point: every send is capped at REPLAY_PAYLOAD_MAX and
|
|
23
|
+
* ShellperProcess.getReplayData() has no production callers, so it is provably
|
|
24
|
+
* the most that can ever leave the process. Bytes retained above it are
|
|
25
|
+
* unreadable by any consumer and are pure resident cost. Tying the two together
|
|
26
|
+
* keeps that true if the send cap ever moves — retaining more than can be sent
|
|
27
|
+
* would be waste, retaining less would make the send cap unreachable.
|
|
28
|
+
*
|
|
29
|
+
* This is a retention policy, not a wire constraint, which is why it lives here
|
|
30
|
+
* next to the buffer rather than in shellper-protocol.ts.
|
|
31
|
+
*/
|
|
32
|
+
export const REPLAY_BUFFER_MAX_BYTES = REPLAY_PAYLOAD_MAX;
|
|
33
|
+
const ESC = 0x1b;
|
|
34
|
+
/**
|
|
35
|
+
* How far past a byte-driven trim point we scan looking for an ESC to align to.
|
|
36
|
+
* Bounded so alignment can never turn into a long scan over ESC-free data.
|
|
37
|
+
*/
|
|
38
|
+
const ESC_ALIGN_SCAN_LIMIT = 4096;
|
|
39
|
+
/**
|
|
40
|
+
* Nudge a trim offset forward to the next ESC byte, so a cut doesn't land in
|
|
41
|
+
* the middle of an escape sequence and leave the client rendering its tail as
|
|
42
|
+
* literal garbage. Returns `offset` unchanged when no ESC is within the scan
|
|
43
|
+
* window, which is the correct fallback: a raw cut is what we'd have done
|
|
44
|
+
* anyway, and the post-connect repaint nudge covers the rest.
|
|
45
|
+
*
|
|
46
|
+
* Only byte-driven cuts need this. A newline-driven cut lands just past a
|
|
47
|
+
* `\n`, which can never appear inside an escape sequence, so it is already
|
|
48
|
+
* safe and aligning it would discard content for nothing.
|
|
49
|
+
*/
|
|
50
|
+
function alignToEscape(buf, offset) {
|
|
51
|
+
const limit = Math.min(buf.length, offset + ESC_ALIGN_SCAN_LIMIT);
|
|
52
|
+
for (let i = offset; i < limit; i++) {
|
|
53
|
+
if (buf[i] === ESC)
|
|
54
|
+
return i;
|
|
55
|
+
}
|
|
56
|
+
return offset;
|
|
57
|
+
}
|
|
58
|
+
function countNewlines(buf) {
|
|
59
|
+
let count = 0;
|
|
60
|
+
for (let i = 0; i < buf.length; i++) {
|
|
61
|
+
if (buf[i] === 0x0a)
|
|
62
|
+
count++;
|
|
63
|
+
}
|
|
64
|
+
return count;
|
|
65
|
+
}
|
|
11
66
|
export class ShellperReplayBuffer {
|
|
12
67
|
chunks = [];
|
|
13
68
|
totalBytes = 0;
|
|
14
69
|
maxLines;
|
|
70
|
+
maxBytes;
|
|
15
71
|
lineCount = 0;
|
|
16
72
|
/**
|
|
17
73
|
* @param maxLines Maximum number of lines to retain. Lines are delimited
|
|
18
74
|
* by newline characters in the raw data stream.
|
|
75
|
+
* @param maxBytes Maximum bytes to retain. Required because `maxLines` alone
|
|
76
|
+
* does not bound anything for a full-screen TUI: such an app redraws in
|
|
77
|
+
* place via cursor addressing and emits almost no newlines, so the line
|
|
78
|
+
* ceiling never fires and the buffer grows for the life of the session
|
|
79
|
+
* (#1205). Defaults to REPLAY_BUFFER_MAX_BYTES.
|
|
19
80
|
*/
|
|
20
|
-
constructor(maxLines = 10_000) {
|
|
81
|
+
constructor(maxLines = 10_000, maxBytes = REPLAY_BUFFER_MAX_BYTES) {
|
|
21
82
|
this.maxLines = maxLines;
|
|
83
|
+
this.maxBytes = maxBytes;
|
|
22
84
|
}
|
|
23
85
|
/**
|
|
24
86
|
* Append raw PTY output data to the buffer.
|
|
25
|
-
* Evicts oldest chunks if the line
|
|
87
|
+
* Evicts oldest chunks if either the line or the byte ceiling is exceeded.
|
|
26
88
|
*/
|
|
27
89
|
append(data) {
|
|
28
90
|
const buf = typeof data === 'string' ? Buffer.from(data, 'utf-8') : data;
|
|
29
91
|
if (buf.length === 0)
|
|
30
92
|
return;
|
|
31
|
-
// Count newlines in this chunk
|
|
32
|
-
let newLines = 0;
|
|
33
|
-
for (let i = 0; i < buf.length; i++) {
|
|
34
|
-
if (buf[i] === 0x0a)
|
|
35
|
-
newLines++;
|
|
36
|
-
}
|
|
37
93
|
this.chunks.push(buf);
|
|
38
94
|
this.totalBytes += buf.length;
|
|
39
|
-
this.lineCount +=
|
|
40
|
-
|
|
41
|
-
|
|
95
|
+
this.lineCount += countNewlines(buf);
|
|
96
|
+
this.evict();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Drop the oldest data until both ceilings are satisfied.
|
|
100
|
+
*
|
|
101
|
+
* Trimming from the front can cut mid-escape-sequence or discard an
|
|
102
|
+
* alt-screen-enter, which is why it was rejected in #1047. It is accepted
|
|
103
|
+
* here because every layer above already does exactly this (the send cap,
|
|
104
|
+
* the ring seed, the frame-skip path) and relies on the client's
|
|
105
|
+
* post-connect repaint nudge; an unbounded buffer, by contrast, killed
|
|
106
|
+
* sessions. Byte-driven cuts are ESC-aligned to narrow the window in which
|
|
107
|
+
* a client renders a truncated sequence as literal text.
|
|
108
|
+
*/
|
|
109
|
+
evict() {
|
|
110
|
+
while ((this.lineCount > this.maxLines || this.totalBytes > this.maxBytes) &&
|
|
111
|
+
this.chunks.length > 1) {
|
|
42
112
|
const oldest = this.chunks[0];
|
|
43
|
-
let removedLines = 0;
|
|
44
|
-
for (let i = 0; i < oldest.length; i++) {
|
|
45
|
-
if (oldest[i] === 0x0a)
|
|
46
|
-
removedLines++;
|
|
47
|
-
}
|
|
48
113
|
this.chunks.shift();
|
|
49
114
|
this.totalBytes -= oldest.length;
|
|
50
|
-
this.lineCount -=
|
|
115
|
+
this.lineCount -= countNewlines(oldest);
|
|
51
116
|
}
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
117
|
+
// A single remaining chunk can still exceed either ceiling on its own.
|
|
118
|
+
if (this.chunks.length !== 1)
|
|
119
|
+
return;
|
|
120
|
+
// Line ceiling: cut just past the newline that leaves maxLines behind.
|
|
121
|
+
// A newline never appears inside an escape sequence, so this cut is
|
|
122
|
+
// inherently safe and must not be ESC-aligned (that would discard content
|
|
123
|
+
// for no benefit).
|
|
124
|
+
if (this.lineCount > this.maxLines) {
|
|
55
125
|
const chunk = this.chunks[0];
|
|
56
126
|
let linesToSkip = this.lineCount - this.maxLines;
|
|
57
127
|
let offset = 0;
|
|
@@ -60,21 +130,87 @@ export class ShellperReplayBuffer {
|
|
|
60
130
|
linesToSkip--;
|
|
61
131
|
offset++;
|
|
62
132
|
}
|
|
63
|
-
this.
|
|
64
|
-
|
|
65
|
-
|
|
133
|
+
this.replaceSoleChunk(chunk.subarray(offset));
|
|
134
|
+
}
|
|
135
|
+
// Byte ceiling: keep the tail. This cut can land anywhere, so align it.
|
|
136
|
+
const chunk = this.chunks[0];
|
|
137
|
+
if (chunk.length > this.maxBytes) {
|
|
138
|
+
this.replaceSoleChunk(chunk.subarray(alignToEscape(chunk, chunk.length - this.maxBytes)));
|
|
66
139
|
}
|
|
67
140
|
}
|
|
68
141
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
142
|
+
* Replace the only chunk with a trimmed version of itself.
|
|
143
|
+
*
|
|
144
|
+
* Copies rather than retaining the `subarray` view: a view keeps the entire
|
|
145
|
+
* original allocation alive, so trimming an oversized chunk down to the
|
|
146
|
+
* ceiling would free none of the memory this class exists to bound. The copy
|
|
147
|
+
* is at most `maxBytes` and only happens on the rare path where a single
|
|
148
|
+
* append exceeded a ceiling by itself.
|
|
71
149
|
*/
|
|
72
|
-
|
|
150
|
+
replaceSoleChunk(next) {
|
|
151
|
+
const owned = Buffer.from(next);
|
|
152
|
+
this.chunks[0] = owned;
|
|
153
|
+
this.totalBytes = owned.length;
|
|
154
|
+
this.lineCount = countNewlines(owned);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get buffered data as a single Buffer, for the REPLAY frame on reconnection.
|
|
158
|
+
*
|
|
159
|
+
* @param maxBytes When given, return at most this many bytes (the most recent
|
|
160
|
+
* ones). The tail is collected by walking `chunks` backwards and slicing
|
|
161
|
+
* only the boundary chunk, so the allocation is O(maxBytes) rather than
|
|
162
|
+
* O(history).
|
|
163
|
+
*
|
|
164
|
+
* That distinction is the whole point (#1205). This runs on *every* client
|
|
165
|
+
* connect, and the caller's cap used to be applied to the result — meaning a
|
|
166
|
+
* multi-GB buffer allocated a multi-GB copy on top of itself at exactly the
|
|
167
|
+
* moment a user opened the terminal, then threw almost all of it away. Peak
|
|
168
|
+
* footprint doubled, and sessions were killed for it. Capping here bounds the
|
|
169
|
+
* spike regardless of how large the buffer has already grown, which also
|
|
170
|
+
* makes this correct for a buffer that accumulated before any byte ceiling
|
|
171
|
+
* existed.
|
|
172
|
+
*/
|
|
173
|
+
getReplayData(maxBytes) {
|
|
73
174
|
if (this.chunks.length === 0)
|
|
74
175
|
return Buffer.alloc(0);
|
|
75
|
-
if (this.
|
|
76
|
-
|
|
77
|
-
|
|
176
|
+
if (maxBytes === undefined || this.totalBytes <= maxBytes) {
|
|
177
|
+
// Single-chunk fast path returns the internal Buffer *by reference*
|
|
178
|
+
// rather than copying. Safe because nothing mutates chunks in place and
|
|
179
|
+
// callers only read, but it is an aliasing property the old
|
|
180
|
+
// always-concat version did not have: a caller that mutated the result
|
|
181
|
+
// would corrupt the buffer. Copy here if that ever stops being true.
|
|
182
|
+
if (this.chunks.length === 1)
|
|
183
|
+
return this.chunks[0];
|
|
184
|
+
return Buffer.concat(this.chunks, this.totalBytes);
|
|
185
|
+
}
|
|
186
|
+
if (maxBytes <= 0)
|
|
187
|
+
return Buffer.alloc(0);
|
|
188
|
+
const tail = [];
|
|
189
|
+
let collected = 0;
|
|
190
|
+
for (let i = this.chunks.length - 1; i >= 0 && collected < maxBytes; i--) {
|
|
191
|
+
const chunk = this.chunks[i];
|
|
192
|
+
const remaining = maxBytes - collected;
|
|
193
|
+
if (chunk.length <= remaining) {
|
|
194
|
+
tail.push(chunk);
|
|
195
|
+
collected += chunk.length;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Boundary chunk: take only its tail, aligned off a mid-sequence cut.
|
|
199
|
+
//
|
|
200
|
+
// `break` is load-bearing. ESC alignment moves the cut *forward*, so the
|
|
201
|
+
// piece is usually shorter than `remaining` — without breaking, the loop
|
|
202
|
+
// would see spare capacity and keep taking bytes from still-older chunks,
|
|
203
|
+
// stitching fragments across a gap into what must be one contiguous
|
|
204
|
+
// suffix. That also re-admits the unaligned mid-sequence prefix this
|
|
205
|
+
// alignment exists to prevent. Returning fewer than `maxBytes` is the
|
|
206
|
+
// accepted contract; returning a spliced stream is not.
|
|
207
|
+
const piece = chunk.subarray(alignToEscape(chunk, chunk.length - remaining));
|
|
208
|
+
tail.push(piece);
|
|
209
|
+
collected += piece.length;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
tail.reverse();
|
|
213
|
+
return Buffer.concat(tail, collected);
|
|
78
214
|
}
|
|
79
215
|
/** Current number of bytes stored. */
|
|
80
216
|
get size() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellper-replay-buffer.js","sourceRoot":"","sources":["../../src/terminal/shellper-replay-buffer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shellper-replay-buffer.js","sourceRoot":"","sources":["../../src/terminal/shellper-replay-buffer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cluesmith/codev",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Codev CLI - AI-assisted software development framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@anthropic-ai/claude-agent-sdk": "^0.2.41",
|
|
25
25
|
"@google/genai": "^1.0.0",
|
|
26
|
-
"@openai/codex-sdk": "^0.
|
|
26
|
+
"@openai/codex-sdk": "^0.146.0",
|
|
27
|
+
"@xterm/headless": "^6.0.0",
|
|
27
28
|
"better-sqlite3": "^12.10.0",
|
|
28
29
|
"chalk": "^5.3.0",
|
|
29
30
|
"commander": "^12.1.0",
|
|
@@ -33,7 +34,8 @@
|
|
|
33
34
|
"open": "^10.1.0",
|
|
34
35
|
"tree-kill": "^1.2.2",
|
|
35
36
|
"ws": "^8.18.0",
|
|
36
|
-
"@cluesmith/codev-core": "3.
|
|
37
|
+
"@cluesmith/codev-core": "3.3.0",
|
|
38
|
+
"@cluesmith/codev-sdk": "3.3.0"
|
|
37
39
|
},
|
|
38
40
|
"devDependencies": {
|
|
39
41
|
"@playwright/test": "^1.58.0",
|
|
@@ -46,10 +48,10 @@
|
|
|
46
48
|
"jsdom": "^28.1.0",
|
|
47
49
|
"playwright": "^1.58.0",
|
|
48
50
|
"tsx": "^4.19.2",
|
|
49
|
-
"typescript": "^
|
|
51
|
+
"typescript": "^6.0.3",
|
|
50
52
|
"vitest": "^4.0.15",
|
|
51
|
-
"@cluesmith/codev-
|
|
52
|
-
"@cluesmith/codev-
|
|
53
|
+
"@cluesmith/codev-web": "0.0.0",
|
|
54
|
+
"@cluesmith/codev-types": "3.3.0"
|
|
53
55
|
},
|
|
54
56
|
"engines": {
|
|
55
57
|
"node": ">=20.0.0"
|
|
@@ -71,9 +73,9 @@
|
|
|
71
73
|
},
|
|
72
74
|
"scripts": {
|
|
73
75
|
"clean": "rm -rf dist",
|
|
74
|
-
"build": "pnpm clean && tsc && pnpm
|
|
75
|
-
"
|
|
76
|
-
"dev:dashboard": "cd
|
|
76
|
+
"build": "pnpm --filter \"@cluesmith/codev^...\" build && pnpm clean && tsc && pnpm copy-dashboard && pnpm copy-skeleton",
|
|
77
|
+
"copy-dashboard": "rm -rf dashboard-dist && cp -r ../../apps/web/dist dashboard-dist",
|
|
78
|
+
"dev:dashboard": "cd ../../apps/web && pnpm dev",
|
|
77
79
|
"copy-skeleton": "rm -rf skeleton && cp -r ../../codev-skeleton skeleton",
|
|
78
80
|
"dev": "tsx src/cli.ts",
|
|
79
81
|
"start": "node dist/cli.js",
|
|
@@ -99,6 +99,19 @@ afx status # Show all builders and workspace status
|
|
|
99
99
|
|
|
100
100
|
No flags needed. Shows Tower status, workspace, and all active builders.
|
|
101
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
|
+
|
|
102
115
|
## afx tower
|
|
103
116
|
|
|
104
117
|
```bash
|
|
@@ -131,7 +144,20 @@ afx cron enable <name> # Enable
|
|
|
131
144
|
afx cron disable <name> # Disable
|
|
132
145
|
```
|
|
133
146
|
|
|
134
|
-
There is NO `afx cron add` — create YAML files in `.af-cron/` directly
|
|
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.
|
|
135
161
|
|
|
136
162
|
## Other commands
|
|
137
163
|
|
|
@@ -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.
|