Unify agent startup with Manager pattern

Refactors all agent startup paths (witness, refinery, crew, polecat) to use
a consistent Manager interface with Start(), Stop(), IsRunning(), and
SessionName() methods.

Includes:
- Witness manager with GUPP propulsion nudge for startup
- Refinery manager for engineer sessions
- Crew manager for worker agents
- Session/polecat manager updates
- claude_settings_check doctor check for settings validation
- Settings management consolidated from rig/manager.go
- Settings location moved outside source repos to prevent conflicts

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
julianknutsen
2026-01-06 15:16:33 -08:00
parent 81a7d04239
commit 72544cc06d
12 changed files with 935 additions and 384 deletions

View File

@@ -12,6 +12,7 @@ import (
"time"
"github.com/steveyegge/gastown/internal/beads"
"github.com/steveyegge/gastown/internal/claude"
"github.com/steveyegge/gastown/internal/config"
"github.com/steveyegge/gastown/internal/git"
"github.com/steveyegge/gastown/internal/templates"
@@ -436,6 +437,33 @@ Use crew for your own workspace. Polecats are for batch work dispatch.
return nil, fmt.Errorf("creating polecats dir: %w", err)
}
// Install Claude settings for all agent directories.
// Settings are placed in parent directories (not inside git repos) so Claude
// finds them via directory traversal without polluting source repos.
fmt.Printf(" Installing Claude settings...\n")
settingsRoles := []struct {
dir string
role string
}{
{witnessPath, "witness"},
{filepath.Join(rigPath, "refinery"), "refinery"},
{crewPath, "crew"},
{polecatsPath, "polecat"},
}
for _, sr := range settingsRoles {
if err := claude.EnsureSettingsForRole(sr.dir, sr.role); err != nil {
fmt.Fprintf(os.Stderr, " Warning: Could not create %s settings: %v\n", sr.role, err)
}
}
fmt.Printf(" ✓ Installed Claude settings\n")
// Initialize beads at rig level
fmt.Printf(" Initializing beads database...\n")
if err := m.initBeads(rigPath, opts.BeadsPrefix); err != nil {
return nil, fmt.Errorf("initializing beads: %w", err)
}
fmt.Printf(" ✓ Initialized beads (prefix: %s)\n", opts.BeadsPrefix)
// Create rig-level agent beads (witness, refinery) in rig beads.
// Town-level agents (mayor, deacon) are created by gt install in town beads.
if err := m.initAgentBeads(rigPath, opts.Name, opts.BeadsPrefix); err != nil {