From c2915d6037087e69ca3abe8adcd1a5010ef7fcac Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Tue, 12 May 2026 11:04:17 -0400 Subject: [PATCH 1/2] feat(appsetup): add retro agent app configuration Add GitHub App configuration for the retro agent role with appropriate permissions for retrospective analysis: - Actions: read (for accessing workflow runs) - Contents: read (for repository checkout) - Pull Requests: read (for PR data) - Issues: write (for posting feedback comments) The retro agent is triggered via workflow_dispatch from other agents (not webhooks), so it has no webhook event subscriptions. Includes test coverage for the new retro agent configuration. Co-Authored-By: Claude Sonnet 4.5 --- internal/forge/github/types.go | 11 +++++++++++ internal/forge/github/types_test.go | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/internal/forge/github/types.go b/internal/forge/github/types.go index 4d8a038b9..7ac3fd7ba 100644 --- a/internal/forge/github/types.go +++ b/internal/forge/github/types.go @@ -135,6 +135,17 @@ func AgentAppConfig(org, role string) AppConfig { // No webhook events — this agent runs on a cron schedule, not events. base.Events = []string{} + case "retro": + base.Description = fmt.Sprintf("Fullsend retro agent for %s", org) + base.Permissions = AppPermissions{ + Actions: "read", + Contents: "read", + PullRequests: "read", + Issues: "write", + } + // No webhook events — triggered via workflow_dispatch from other agents. + base.Events = []string{} + default: base.Description = fmt.Sprintf("Fullsend %s agent for %s", role, org) base.Permissions = AppPermissions{ diff --git a/internal/forge/github/types_test.go b/internal/forge/github/types_test.go index eeae29bf7..ba284b4ce 100644 --- a/internal/forge/github/types_test.go +++ b/internal/forge/github/types_test.go @@ -87,6 +87,20 @@ func TestAgentAppConfig_Prioritize(t *testing.T) { assert.Empty(t, cfg.Events) } +func TestAgentAppConfig_Retro(t *testing.T) { + cfg := AgentAppConfig("myorg", "retro") + + assert.Equal(t, "myorg-retro", cfg.Name) + assert.Equal(t, "read", cfg.Permissions.Actions) + assert.Equal(t, "read", cfg.Permissions.Contents) + assert.Equal(t, "read", cfg.Permissions.PullRequests) + assert.Equal(t, "write", cfg.Permissions.Issues) + assert.Empty(t, cfg.Permissions.OrganizationProjects) + + // Retro is triggered via workflow_dispatch, no webhook events. + assert.Empty(t, cfg.Events) +} + func TestAgentAppConfig_UnknownRole(t *testing.T) { cfg := AgentAppConfig("myorg", "custom-bot") From 356285a896bbbb33f54eae6015d0eae86aa745f0 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Tue, 12 May 2026 13:22:45 -0400 Subject: [PATCH 2/2] fix: remove duplicate retro case and correct test assertion - Remove duplicate 'case retro' that was causing compilation error - Fix test to expect 'fullsend-retro' (current naming convention) - Rebase onto latest main to resolve merge conflict --- internal/forge/github/types.go | 11 +---------- internal/forge/github/types_test.go | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/internal/forge/github/types.go b/internal/forge/github/types.go index 7ac3fd7ba..3684a7d1b 100644 --- a/internal/forge/github/types.go +++ b/internal/forge/github/types.go @@ -60,7 +60,7 @@ func AgentAppConfig(org, role string) AppConfig { base.Name = fmt.Sprintf("fullsend-%s", role) - switch role { + switch role{ case "fullsend": base.Description = fmt.Sprintf("Fullsend orchestrator for %s", org) base.Permissions = AppPermissions{ @@ -113,15 +113,6 @@ func AgentAppConfig(org, role string) AppConfig { } base.Events = []string{"issues", "issue_comment", "pull_request"} - case "retro": - base.Description = fmt.Sprintf("Fullsend retro agent for %s", org) - base.Permissions = AppPermissions{ - Contents: "read", - PullRequests: "read", - Issues: "write", - } - base.Events = []string{"issues", "pull_request"} - case "prioritize": base.Description = fmt.Sprintf("Fullsend prioritize agent for %s", org) base.Permissions = AppPermissions{ diff --git a/internal/forge/github/types_test.go b/internal/forge/github/types_test.go index ba284b4ce..381dbafcf 100644 --- a/internal/forge/github/types_test.go +++ b/internal/forge/github/types_test.go @@ -90,7 +90,7 @@ func TestAgentAppConfig_Prioritize(t *testing.T) { func TestAgentAppConfig_Retro(t *testing.T) { cfg := AgentAppConfig("myorg", "retro") - assert.Equal(t, "myorg-retro", cfg.Name) + assert.Equal(t, "fullsend-retro", cfg.Name) assert.Equal(t, "read", cfg.Permissions.Actions) assert.Equal(t, "read", cfg.Permissions.Contents) assert.Equal(t, "read", cfg.Permissions.PullRequests)