Commit Graph

28 Commits

Author SHA1 Message Date
Steve Yegge
e1c041f3b0 fix: spawn and swarm bug fixes from MVP testing
- spawn.go: Parse bd show --json as array, fix issue_type json tag
- session/manager.go: Check filesystem directly in hasPolecat()
  to handle newly-created polecats
- swarm/manager.go: Use bd show to get children via dependents field
  instead of non-existent bd list --parent flag

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 22:07:13 -08:00
Steve Yegge
59921d52c8 feat: refactor mail system to use bd mail backend
- Mail commands (send/inbox/read/delete) now wrap bd mail CLI
- Address translation: mayor/ → mayor, rig/polecat → rig-polecat
- Beads stores messages as type=message issues
- Legacy JSONL mode retained for crew workers (local mail)
- Refinery notifications use new mail interface
- Swarm landing notifications use new mail interface

Closes gt-u1j.6, gt-u1j.12

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 21:45:42 -08:00
Steve Yegge
b56977218b feat: add gt crew commands (list, attach, remove, refresh, status)
Add remaining crew subcommands for user-managed workspaces:

- gt crew list: List crew workspaces with session/git status
- gt crew at/attach: Start or attach to tmux session
- gt crew remove: Remove workspace with safety checks
- gt crew refresh: Context cycling with mail-to-self handoff
- gt crew status: Show detailed workspace status with mail info

All commands support --rig flag for explicit rig selection and
--json output where appropriate.

Closes: gt-cik.9

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 20:57:26 -08:00
Steve Yegge
ec651072b1 Merge gt-cik.2-furiosa: add gt crew add command 2025-12-16 20:51:52 -08:00
Steve Yegge
887c0f19d1 feat: add gt crew add command for user-managed workspaces
Implements gt-cik.2: Create crew workspace command with:
- internal/crew/types.go: CrewWorker type definition
- internal/crew/manager.go: Manager for crew lifecycle
- internal/crew/manager_test.go: Unit tests
- internal/cmd/crew.go: CLI command with --rig and --branch flags

Crew workers are user-managed persistent workspaces that:
- Clone repo into <rig>/crew/<name>/
- Create optional feature branch (crew/<name>)
- Set up mail directory for delivery
- Initialize CLAUDE.md with crew worker prompting
- Are NOT registered with witness (user-managed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 20:46:52 -08:00
Steve Yegge
05f692cc2f feat: add crew directory structure and manager
Add crew/ directory support to rig structure for user-managed
persistent workspaces. Crew workers are separate from polecats
(AI-managed) and can have optional custom BEADS_DIR configuration.

- Add internal/crew package with Worker type and Manager
- Update rig types to include Crew slice and CrewCount in summary
- Update rig manager to scan for crew workers
- Add crew/ to AgentDirs for rig initialization

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 20:31:18 -08:00
Steve Yegge
a1de1c74d6 feat: add refinery mail notifications for conflict handling
- notifyWorkerConflict: Mail worker with rebase instructions on conflict
- notifyWorkerMerged: Mail worker on successful merge
- findTownRoot: Walk up to find workspace for mail routing
- High priority notification for conflicts
- Integrates with mail system for agent communication

This completes the semantic merge handling for MVP - conflicts
are intelligently handled by notifying workers rather than
silently failing.

Closes gt-kmn.4

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:24:19 -08:00
Steve Yegge
f8c177e17b feat: add witness swarm landing protocol
- ExecuteLanding: Full landing protocol for swarms
- Phase 1: Stop all polecat sessions
- Phase 2: Git audit (uncommitted/unpushed detection)
- Phase 3: Branch cleanup
- Phase 4: Mail notification to Mayor
- Code at risk detection with escalation
- Beads-only changes considered safe
- Updated gt swarm land to use full protocol

Closes gt-kmn.6

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:22:52 -08:00
Steve Yegge
163b06582c feat: add refinery merge queue processing loop
- ProcessQueue: iterates pending MRs and processes each
- ProcessMR: fetch, merge, test, push workflow
- Conflict detection with merge abort
- Test integration via configurable test_command
- Automatic branch cleanup after successful merge
- Stats tracking (merged/failed counts)
- 10-second polling loop in foreground mode

Closes gt-ov2

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:20:36 -08:00
Steve Yegge
e984a55fe5 feat: add mail system and CLI commands
- internal/mail: Message types with priority support
- internal/mail: Mailbox JSONL operations (list, get, append, delete)
- internal/mail: Router for address resolution and delivery
- gt mail send: Send messages to agents
- gt mail inbox: List messages (--unread, --json)
- gt mail read: Read and mark messages as read
- Address formats: mayor/, rig/, rig/polecat, rig/refinery
- High priority messages trigger tmux notification
- Auto-detect sender from GT_RIG/GT_POLECAT env vars

Closes gt-u1j.6, gt-u1j.12

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:19:15 -08:00
Steve Yegge
d3d929105e feat: add refinery package and CLI commands
- internal/refinery: Types for Refinery, MergeRequest, queue items
- internal/refinery: Manager with start/stop/status/queue operations
- gt refinery start: Start refinery for a rig (--foreground option)
- gt refinery stop: Stop running refinery
- gt refinery status: Show refinery state and statistics
- gt refinery queue: Show pending merge requests
- Auto-discover polecat work branches as queue items
- JSON output support for status and queue commands

Closes gt-rm3

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:16:36 -08:00
Steve Yegge
b26e9aa308 feat: add CLI spawn command for polecat work assignment
- gt spawn <rig/polecat> --issue <id>: Assign issue and start session
- gt spawn <rig> --issue <id>: Auto-select idle polecat
- gt spawn -m task: Free-form task assignment
- --create: Create polecat if does not exist
- --no-start: Assign without starting session
- Fetches issue details from beads for rich context
- Auto-selects idle polecats when polecat not specified

Closes gt-u1j.19

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:14:02 -08:00
Steve Yegge
d92c67629e feat: add CLI swarm commands (create, start, status, list, land, cancel)
- gt swarm create: Create swarm from beads epic with workers
- gt swarm start: Activate a created swarm
- gt swarm status: Show detailed swarm info with task progress
- gt swarm list: List swarms with filtering by rig/status
- gt swarm land: Manually trigger landing to target branch
- gt swarm cancel: Cancel an active swarm
- SwarmStore: JSON-based persistence for swarm state
- Support for --json output on status and list commands

Closes gt-kmn.7

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:11:57 -08:00
Steve Yegge
807ba76a9b feat: add integration branch management for swarms
- CreateIntegrationBranch: create from BaseCommit, push to origin
- MergeToIntegration: merge worker branch with conflict detection
- LandToMain: merge integration to target branch
- CleanupBranches: remove all swarm branches after landing
- Helper functions for branch naming conventions

Closes gt-kmn.3

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:01:46 -08:00
Steve Yegge
515d8f82ce feat: add SwarmManager for swarm lifecycle operations
- Create/Start/Cancel swarm lifecycle methods
- State transition validation (Created->Active->Merging->Landed)
- Task assignment and state tracking
- GetReadyTasks/GetActiveTasks queries
- IsComplete check for swarm completion
- Integration with beads CLI for task loading

Closes gt-kmn.2

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 14:00:07 -08:00
Steve Yegge
f7a0b4045c feat: add gt stop --all emergency shutdown command
- gt stop --all: Kill all sessions across all rigs
- gt stop --rig <name>: Kill sessions in specific rig
- gt stop --graceful: Try graceful shutdown before force kill
- Captures session output before stopping
- Reports success/failure summary

Closes gt-u1j.22

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:58:03 -08:00
Steve Yegge
29e4436891 fix: code review fixes from gt-2tp and gt-y0t
- Replace custom contains() with strings.Contains in init.go
- Make session stop --force flag actually work
- Update session.Manager.Stop() to accept force parameter

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:56:32 -08:00
Steve Yegge
eef28f3ee5 feat: add CLI session commands (start, stop, at, list, capture, inject)
- start: Create tmux session and launch claude for polecat
- stop: Graceful shutdown with optional --force
- at: Attach to running session
- list: Show all active sessions with --json support
- capture: Get recent terminal output
- inject: Send message to session via tmux send-keys

Closes gt-u1j.11

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:51:37 -08:00
Steve Yegge
a5023c633b feat: add CLI core commands (status, prime, init)
- status: Show town status with rig/polecat/witness counts (--json supported)
- prime: Output role context based on current directory
- init: Initialize a git repo as a Gas Town rig

Closes gt-u1j.10

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:49:48 -08:00
Steve Yegge
452c649ce7 feat: add polecat lifecycle management
Types:
- Polecat: worker agent with state, clone, branch, issue
- State: idle/active/working/done/stuck
- Summary: concise status view

Manager operations:
- Add: clone rig, create branch, init state
- Remove: delete polecat (checks for uncommitted changes)
- List: enumerate all polecats
- Get: retrieve specific polecat

State management:
- SetState: update lifecycle state
- AssignIssue: assign work (sets StateWorking)
- ClearIssue: remove assignment (sets StateIdle)
- Wake: idle → active
- Sleep: active → idle

State persisted to polecats/<name>/state.json

Closes gt-u1j.8

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:37:34 -08:00
Steve Yegge
29ae7762a6 feat: add session management for polecat lifecycle
Manager operations:
- Start: create tmux session with optional issue assignment
- Stop: graceful shutdown with Ctrl+C then kill
- IsRunning: check if session exists
- List: enumerate all sessions for rig
- Attach: attach to session
- Capture: get recent output
- Inject: send message to session
- StopAll: terminate all sessions

Session naming: gt-<rig>-<polecat>

StartOptions:
- WorkDir: override working directory
- Issue: initial issue to work on
- Command: override default "claude" command

Environment variables set on start:
- GT_RIG: rig name
- GT_POLECAT: polecat name

Closes gt-u1j.7

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:35:22 -08:00
Steve Yegge
a0ecc051b8 feat: add rig management package
Types:
- Rig: managed repository with polecats, witness, refinery, mayor
- RigSummary: concise rig overview
- Manager: rig discovery, loading, creation

Manager operations:
- DiscoverRigs: load all registered rigs
- GetRig: get specific rig by name
- RigExists, ListRigNames: query helpers
- AddRig: clone and register new rig
- RemoveRig: unregister rig (keeps files)

Rig structure follows docs/architecture.md:
- polecats/, refinery/rig/, witness/rig/, mayor/rig/

Closes gt-u1j.5

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:33:52 -08:00
Steve Yegge
355759be15 feat: add swarm package with core types
Types:
- Swarm: coordinated multi-agent work unit
- SwarmTask: single task assigned to worker
- SwarmState: lifecycle states (created/active/merging/landed/failed/cancelled)
- TaskState: task states (pending/assigned/in_progress/review/merged/failed)
- SwarmSummary: high-level progress overview

Methods:
- SwarmState.IsTerminal(), IsActive()
- TaskState.IsComplete()
- Swarm.Summary(), Progress()

Closes gt-kmn.1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:31:56 -08:00
Steve Yegge
8bd1a353db feat: add workspace detection by walking up directory tree
Detection:
- Find() walks up from given directory looking for markers
- Primary marker: config/town.json
- Secondary marker: mayor/ directory
- Follows symlinks using filepath.EvalSymlinks

Functions:
- Find, FindOrError: from given directory
- FindFromCwd, FindFromCwdOrError: from current directory
- IsWorkspace: check if directory is workspace root

Closes gt-f9x.2

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:30:25 -08:00
Steve Yegge
5a4e861a85 feat: add tmux wrapper package for session operations
Session lifecycle:
- NewSession, KillSession, HasSession, ListSessions, RenameSession

Session interaction:
- SendKeys, SendKeysRaw, CapturePane, CapturePaneAll, AttachSession

Environment and windows:
- SetEnvironment, GetEnvironment, SelectWindow, GetSessionInfo

Error handling:
- Detects ErrNoServer, ErrSessionExists, ErrSessionNotFound
- Graceful handling when no tmux server running

Closes gt-u1j.4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:28:35 -08:00
Steve Yegge
f46a1e6eab feat: add git wrapper package for subprocess operations
Operations:
- Clone, Checkout, Fetch, Pull, Push
- Add, Commit, CommitAll
- Status, CurrentBranch, HasUncommittedChanges, RemoteURL
- Merge, Rebase, AbortMerge, AbortRebase
- CreateBranch, DeleteBranch, Rev, IsAncestor

Error handling:
- Detects ErrNotARepo, ErrMergeConflict, ErrAuthFailure, ErrRebaseConflict
- Wraps git stderr in error messages

Closes gt-u1j.3

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:27:03 -08:00
Steve Yegge
e16931b304 feat: add config package with types and JSON serialization
Types:
- TownConfig: main town configuration (config/town.json)
- RigsConfig: rigs registry with BeadsConfig per rig
- AgentState: agent state with role, session, extras

Features:
- Load/Save functions for all types
- Version compatibility checks
- Required field validation
- Creates parent directories on save

Closes gt-f9x.1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:24:28 -08:00
Steve Yegge
7217b34a90 feat: add Cobra CLI scaffolding with Lipgloss styles
- cmd/gt/main.go: Entry point using Cobra
- internal/cmd/root.go: Root command with description
- internal/cmd/version.go: Version command with build info
- internal/style/style.go: Lipgloss styles for terminal output

Closes gt-u1j.1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:19:27 -08:00