Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions pkg/cli/copilot-agents.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@ func deleteOldAgentFiles(verbose bool) error {
"create-shared-agentic-workflow.agent.md",
}

// Also delete the dangling singular form file from .github/aw/
awFiles := []string{
"upgrade-agentic-workflow.md", // singular form (typo/duplicate)
}

for _, agentFile := range agentFiles {
agentPath := filepath.Join(gitRoot, ".github", "agents", agentFile)

Expand All @@ -321,5 +326,20 @@ func deleteOldAgentFiles(verbose bool) error {
}
}

// Delete dangling files from .github/aw/
for _, awFile := range awFiles {
awPath := filepath.Join(gitRoot, ".github", "aw", awFile)

// Check if the file exists and remove it
if _, err := os.Stat(awPath); err == nil {
if err := os.Remove(awPath); err != nil {
return fmt.Errorf("failed to remove old aw file %s: %w", awFile, err)
}
if verbose {
fmt.Fprintf(os.Stderr, "Removed old aw file: %s\n", awPath)
}
}
}

return nil
}
104 changes: 104 additions & 0 deletions pkg/cli/copilot_agents_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,3 +208,107 @@ func TestEnsureFileMatchesTemplate_VerboseOutput(t *testing.T) {
})
}
}

// TestDeleteOldAgentFiles tests deletion of old agent files
func TestDeleteOldAgentFiles(t *testing.T) {
tests := []struct {
name string
filesToCreate []string // Paths relative to git root
expectedDeleted []string // Files that should be deleted
}{
{
name: "deletes old agent files from .github/agents",
filesToCreate: []string{
".github/agents/create-agentic-workflow.agent.md",
".github/agents/debug-agentic-workflow.agent.md",
".github/agents/create-shared-agentic-workflow.agent.md",
},
expectedDeleted: []string{
".github/agents/create-agentic-workflow.agent.md",
".github/agents/debug-agentic-workflow.agent.md",
".github/agents/create-shared-agentic-workflow.agent.md",
},
},
{
name: "deletes singular upgrade-agentic-workflow.md from .github/aw",
filesToCreate: []string{
".github/aw/upgrade-agentic-workflow.md",
},
expectedDeleted: []string{
".github/aw/upgrade-agentic-workflow.md",
},
},
{
name: "deletes both agent and aw files",
filesToCreate: []string{
".github/agents/create-agentic-workflow.agent.md",
".github/aw/upgrade-agentic-workflow.md",
},
expectedDeleted: []string{
".github/agents/create-agentic-workflow.agent.md",
".github/aw/upgrade-agentic-workflow.md",
},
},
{
name: "handles no files to delete",
filesToCreate: []string{},
expectedDeleted: []string{},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create a temporary directory for testing
tempDir := testutil.TempDir(t, "test-*")

// Change to temp directory and initialize git repo
oldWd, _ := os.Getwd()
defer func() {
_ = os.Chdir(oldWd)
}()
err := os.Chdir(tempDir)
if err != nil {
t.Fatalf("Failed to change directory: %v", err)
}

// Initialize git repo
if err := exec.Command("git", "init").Run(); err != nil {
t.Fatalf("Failed to init git repo: %v", err)
}

// Create test files
for _, filePath := range tt.filesToCreate {
fullPath := filepath.Join(tempDir, filePath)
dir := filepath.Dir(fullPath)
if err := os.MkdirAll(dir, 0755); err != nil {
t.Fatalf("Failed to create directory %s: %v", dir, err)
}
if err := os.WriteFile(fullPath, []byte("test content"), 0644); err != nil {
t.Fatalf("Failed to create file %s: %v", fullPath, err)
}
}

// Call deleteOldAgentFiles
err = deleteOldAgentFiles(false)
if err != nil {
t.Fatalf("deleteOldAgentFiles() returned error: %v", err)
}

// Verify expected files were deleted
for _, filePath := range tt.expectedDeleted {
fullPath := filepath.Join(tempDir, filePath)
if _, err := os.Stat(fullPath); !os.IsNotExist(err) {
t.Errorf("Expected file %s to be deleted, but it still exists", filePath)
}
}

// Verify other files weren't affected (if any exist)
// For example, the plural form should not be deleted
pluralPath := filepath.Join(tempDir, ".github/aw/upgrade-agentic-workflows.md")
if _, err := os.Stat(pluralPath); err == nil {
// If it existed, it should still exist
t.Logf("Correctly preserved .github/aw/upgrade-agentic-workflows.md (plural)")
}
})
}
}
Loading