diff --git a/internal/app/app.go b/internal/app/app.go index 0c0ef6e..331712c 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -87,13 +87,8 @@ func CreateProject(cfg *config.Config, name, repoPath string) error { } p := project.NewProject(name, repoPath) - - if cfg.Defaults.DefaultAgent != "" { - p.Settings.DefaultAgent = cfg.Defaults.DefaultAgent - } - if cfg.Defaults.BranchPrefix != "" { - p.Settings.BranchPrefix = cfg.Defaults.BranchPrefix - } + // Project settings only store explicit user overrides. + // Empty values cascade to global config defaults at runtime. if err := registry.Add(p); err != nil { return fmt.Errorf("failed to save project: %w", err) diff --git a/internal/project/project.go b/internal/project/project.go index 3a594b1..9c6bd76 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -49,10 +49,8 @@ func NewProject(name, repoPath string) *Project { Settings: ProjectSettings{ AutoSpawnAgent: true, AutoCreateBranch: true, - BranchPrefix: "task/", - BranchNaming: "template", - BranchTemplate: "{prefix}{slug}", - SlugMaxLength: 40, + // String/int settings left empty to cascade to global config. + // Use Model.getBranchPrefix(), getBranchTemplate(), getSlugMaxLength() for resolution. }, } } diff --git a/internal/ui/model.go b/internal/ui/model.go index 6d48abc..5ae7a67 100644 --- a/internal/ui/model.go +++ b/internal/ui/model.go @@ -1438,12 +1438,8 @@ func (m *Model) createProjectFromPath() (tea.Model, tea.Cmd) { name := filepath.Base(absPath) newProject := project.NewProject(name, absPath) - if m.config.Defaults.DefaultAgent != "" { - newProject.Settings.DefaultAgent = m.config.Defaults.DefaultAgent - } - if m.config.Defaults.BranchPrefix != "" { - newProject.Settings.BranchPrefix = m.config.Defaults.BranchPrefix - } + // Project settings only store explicit user overrides. + // Empty values cascade to global config via getDefaultAgent() and GetBranchPrefix(). if err := m.projectRegistry.Add(newProject); err != nil { m.notify("Failed to save: " + err.Error()) @@ -2425,11 +2421,11 @@ func (m *Model) setupMainRepoBranch(ticket *board.Ticket) error { } func (m *Model) generateBranchNameFromTitle(title string, proj *project.Project) string { - maxLen := proj.GetSlugMaxLength() + maxLen := m.getSlugMaxLength(proj) slug := board.Slugify(title, maxLen) - template := proj.GetBranchTemplate() - prefix := proj.GetBranchPrefix() + template := m.getBranchTemplate(proj) + prefix := m.getBranchPrefix(proj) result := strings.ReplaceAll(template, "{prefix}", prefix) result = strings.ReplaceAll(result, "{slug}", slug) @@ -2552,10 +2548,10 @@ func (m *Model) prepareSpawn(ticket *board.Ticket, proj *project.Project, agentC generatedBranch := branchName if generatedBranch == "" { - maxLen := proj.GetSlugMaxLength() + maxLen := m.getSlugMaxLength(proj) slug := board.Slugify(ticket.Title, maxLen) - template := proj.GetBranchTemplate() - prefix := proj.GetBranchPrefix() + template := m.getBranchTemplate(proj) + prefix := m.getBranchPrefix(proj) generatedBranch = strings.ReplaceAll(template, "{prefix}", prefix) generatedBranch = strings.ReplaceAll(generatedBranch, "{slug}", slug) } @@ -2875,6 +2871,36 @@ func (m *Model) getDefaultAgent() string { return m.config.Defaults.DefaultAgent } +func (m *Model) getBranchPrefix(proj *project.Project) string { + if proj != nil && proj.Settings.BranchPrefix != "" { + return proj.Settings.BranchPrefix + } + if m.config.Defaults.BranchPrefix != "" { + return m.config.Defaults.BranchPrefix + } + return "task/" +} + +func (m *Model) getBranchTemplate(proj *project.Project) string { + if proj != nil && proj.Settings.BranchTemplate != "" { + return proj.Settings.BranchTemplate + } + if m.config.Defaults.BranchTemplate != "" { + return m.config.Defaults.BranchTemplate + } + return "{prefix}{slug}" +} + +func (m *Model) getSlugMaxLength(proj *project.Project) int { + if proj != nil && proj.Settings.SlugMaxLength > 0 { + return proj.Settings.SlugMaxLength + } + if m.config.Defaults.SlugMaxLength > 0 { + return m.config.Defaults.SlugMaxLength + } + return 40 +} + func (m *Model) getAgentIndex(agentName string) int { agents := m.getAgentNames() for i, name := range agents {