Files
gastown/internal/config/types.go
Steve Yegge 42d8944f71 feat: default crew name to 'max', support town-level override
- Add DefaultCrewName constant ('max') to config package
- Add default_crew_name field to MayorConfig for town-level override
- Update gt rig add to resolve crew name: --crew flag > town config > default
- Update help text to reflect new default

Priority: --crew flag > MayorConfig.DefaultCrewName > config.DefaultCrewName ('max')
2025-12-23 04:47:07 -08:00

242 lines
9.1 KiB
Go

// Package config provides configuration types and serialization for Gas Town.
package config
import (
"os"
"time"
)
// TownConfig represents the main town identity (mayor/town.json).
type TownConfig struct {
Type string `json:"type"` // "town"
Version int `json:"version"` // schema version
Name string `json:"name"` // town identifier
CreatedAt time.Time `json:"created_at"`
}
// MayorConfig represents town-level behavioral configuration (mayor/config.json).
// This is separate from TownConfig (identity) to keep configuration concerns distinct.
type MayorConfig struct {
Type string `json:"type"` // "mayor-config"
Version int `json:"version"` // schema version
Theme *TownThemeConfig `json:"theme,omitempty"` // global theme settings
Daemon *DaemonConfig `json:"daemon,omitempty"` // daemon settings
Deacon *DeaconConfig `json:"deacon,omitempty"` // deacon settings
DefaultCrewName string `json:"default_crew_name,omitempty"` // default crew name for new rigs
}
// DaemonConfig represents daemon process settings.
type DaemonConfig struct {
HeartbeatInterval string `json:"heartbeat_interval,omitempty"` // e.g., "30s"
PollInterval string `json:"poll_interval,omitempty"` // e.g., "10s"
}
// DeaconConfig represents deacon process settings.
type DeaconConfig struct {
PatrolInterval string `json:"patrol_interval,omitempty"` // e.g., "5m"
}
// CurrentMayorConfigVersion is the current schema version for MayorConfig.
const CurrentMayorConfigVersion = 1
// DefaultCrewName is the default name for crew workspaces when not overridden.
const DefaultCrewName = "max"
// RigsConfig represents the rigs registry (mayor/rigs.json).
type RigsConfig struct {
Version int `json:"version"`
Rigs map[string]RigEntry `json:"rigs"`
}
// RigEntry represents a single rig in the registry.
type RigEntry struct {
GitURL string `json:"git_url"`
AddedAt time.Time `json:"added_at"`
BeadsConfig *BeadsConfig `json:"beads,omitempty"`
}
// BeadsConfig represents beads configuration for a rig.
type BeadsConfig struct {
Repo string `json:"repo"` // "local" | path | git-url
Prefix string `json:"prefix"` // issue prefix
}
// AgentState represents an agent's current state (*/state.json).
type AgentState struct {
Role string `json:"role"` // "mayor", "witness", etc.
LastActive time.Time `json:"last_active"`
Session string `json:"session,omitempty"`
Extra map[string]any `json:"extra,omitempty"`
}
// CurrentTownVersion is the current schema version for TownConfig.
const CurrentTownVersion = 1
// CurrentRigsVersion is the current schema version for RigsConfig.
const CurrentRigsVersion = 1
// CurrentRigConfigVersion is the current schema version for RigConfig.
const CurrentRigConfigVersion = 1
// CurrentRigSettingsVersion is the current schema version for RigSettings.
const CurrentRigSettingsVersion = 1
// RigConfig represents per-rig identity (rig/config.json).
// This contains only identity - behavioral config is in settings/config.json.
type RigConfig struct {
Type string `json:"type"` // "rig"
Version int `json:"version"` // schema version
Name string `json:"name"` // rig name
GitURL string `json:"git_url"` // git repository URL
CreatedAt time.Time `json:"created_at"` // when the rig was created
Beads *BeadsConfig `json:"beads,omitempty"`
}
// RigSettings represents per-rig behavioral configuration (settings/config.json).
type RigSettings struct {
Type string `json:"type"` // "rig-settings"
Version int `json:"version"` // schema version
MergeQueue *MergeQueueConfig `json:"merge_queue,omitempty"` // merge queue settings
Theme *ThemeConfig `json:"theme,omitempty"` // tmux theme settings
Namepool *NamepoolConfig `json:"namepool,omitempty"` // polecat name pool settings
}
// ThemeConfig represents tmux theme settings for a rig.
type ThemeConfig struct {
// Name picks from the default palette (e.g., "ocean", "forest").
// If empty, a theme is auto-assigned based on rig name.
Name string `json:"name,omitempty"`
// Custom overrides the palette with specific colors.
Custom *CustomTheme `json:"custom,omitempty"`
// RoleThemes overrides themes for specific roles in this rig.
// Keys: "witness", "refinery", "crew", "polecat"
RoleThemes map[string]string `json:"role_themes,omitempty"`
}
// CustomTheme allows specifying exact colors for the status bar.
type CustomTheme struct {
BG string `json:"bg"` // Background color (hex or tmux color name)
FG string `json:"fg"` // Foreground color (hex or tmux color name)
}
// TownThemeConfig represents global theme settings (mayor/config.json).
type TownThemeConfig struct {
// RoleDefaults sets default themes for roles across all rigs.
// Keys: "witness", "refinery", "crew", "polecat"
RoleDefaults map[string]string `json:"role_defaults,omitempty"`
}
// BuiltinRoleThemes returns the default themes for each role.
// These are used when no explicit configuration is provided.
func BuiltinRoleThemes() map[string]string {
return map[string]string{
"witness": "rust", // Red/rust - watchful, alert
"refinery": "plum", // Purple - processing, refining
// crew and polecat use rig theme by default (no override)
}
}
// MergeQueueConfig represents merge queue settings for a rig.
type MergeQueueConfig struct {
// Enabled controls whether the merge queue is active.
Enabled bool `json:"enabled"`
// TargetBranch is the default branch to merge into (usually "main").
TargetBranch string `json:"target_branch"`
// IntegrationBranches enables integration branch workflow for epics.
IntegrationBranches bool `json:"integration_branches"`
// OnConflict specifies conflict resolution strategy: "assign_back" or "auto_rebase".
OnConflict string `json:"on_conflict"`
// RunTests controls whether to run tests before merging.
RunTests bool `json:"run_tests"`
// TestCommand is the command to run for tests.
TestCommand string `json:"test_command,omitempty"`
// DeleteMergedBranches controls whether to delete branches after merging.
DeleteMergedBranches bool `json:"delete_merged_branches"`
// RetryFlakyTests is the number of times to retry flaky tests.
RetryFlakyTests int `json:"retry_flaky_tests"`
// PollInterval is how often to poll for new merge requests (e.g., "30s").
PollInterval string `json:"poll_interval"`
// MaxConcurrent is the maximum number of concurrent merges.
MaxConcurrent int `json:"max_concurrent"`
}
// OnConflict strategy constants.
const (
OnConflictAssignBack = "assign_back"
OnConflictAutoRebase = "auto_rebase"
)
// DefaultMergeQueueConfig returns a MergeQueueConfig with sensible defaults.
func DefaultMergeQueueConfig() *MergeQueueConfig {
return &MergeQueueConfig{
Enabled: true,
TargetBranch: "main",
IntegrationBranches: true,
OnConflict: OnConflictAssignBack,
RunTests: true,
TestCommand: "go test ./...",
DeleteMergedBranches: true,
RetryFlakyTests: 1,
PollInterval: "30s",
MaxConcurrent: 1,
}
}
// NamepoolConfig represents namepool settings for themed polecat names.
type NamepoolConfig struct {
// Style picks from a built-in theme (e.g., "mad-max", "minerals", "wasteland").
// If empty, defaults to "mad-max".
Style string `json:"style,omitempty"`
// Names is a custom list of names to use instead of a built-in theme.
// If provided, overrides the Style setting.
Names []string `json:"names,omitempty"`
// MaxBeforeNumbering is when to start appending numbers.
// Default is 50. After this many polecats, names become name-01, name-02, etc.
MaxBeforeNumbering int `json:"max_before_numbering,omitempty"`
}
// DefaultNamepoolConfig returns a NamepoolConfig with sensible defaults.
func DefaultNamepoolConfig() *NamepoolConfig {
return &NamepoolConfig{
Style: "mad-max",
MaxBeforeNumbering: 50,
}
}
// AccountsConfig represents Claude Code account configuration (mayor/accounts.json).
// This enables Gas Town to manage multiple Claude Code accounts with easy switching.
type AccountsConfig struct {
Version int `json:"version"` // schema version
Accounts map[string]Account `json:"accounts"` // handle -> account details
Default string `json:"default"` // default account handle
}
// Account represents a single Claude Code account.
type Account struct {
Email string `json:"email"` // account email
Description string `json:"description,omitempty"` // human description
ConfigDir string `json:"config_dir"` // path to CLAUDE_CONFIG_DIR
}
// CurrentAccountsVersion is the current schema version for AccountsConfig.
const CurrentAccountsVersion = 1
// DefaultAccountsConfigDir returns the default base directory for account configs.
func DefaultAccountsConfigDir() string {
home, _ := os.UserHomeDir()
return home + "/.claude-accounts"
}