diff options
| author | Paul Buetow <paul@buetow.org> | 2025-10-31 20:13:32 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-10-31 20:13:32 +0200 |
| commit | 11eea6a82cbfdde40ec1457c6ea080da4da6b7dc (patch) | |
| tree | 8026068f6a3beb3ee02c45f06f4487f4b89caaf1 /internal/cli/showcase_only_handler.go | |
| parent | 5c3e0b5cf99d028c4f06be7a825388b296e37a22 (diff) | |
feat: implement amp AI tool support and replace Taskfile with Magev0.10.0
- Add amp as default AI tool for release notes and showcase generation
- Fallback chain: amp → hexai → claude → aichat
- Replace Taskfile.yaml with magefile.go for build automation
- Update all documentation (README.md, AGENTS.md, doc/development.md)
- Update version to 0.10.0
Amp-Thread-ID: https://ampcode.com/threads/T-735ba1e2-0255-4b43-8ed1-6c0d2f78301b
Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'internal/cli/showcase_only_handler.go')
| -rw-r--r-- | internal/cli/showcase_only_handler.go | 152 |
1 files changed, 76 insertions, 76 deletions
diff --git a/internal/cli/showcase_only_handler.go b/internal/cli/showcase_only_handler.go index 2055612..1a2a835 100644 --- a/internal/cli/showcase_only_handler.go +++ b/internal/cli/showcase_only_handler.go @@ -14,90 +14,90 @@ import ( // HandleShowcaseOnly handles showcase generation without syncing // It will clone repositories if they don't exist locally, but won't sync changes func HandleShowcaseOnly(cfg *config.Config, flags *Flags) int { - // If a specific repo is requested, only generate for that repo - if flags.SyncRepo != "" { - repo := flags.SyncRepo - - // Ensure the repository is cloned - syncer := sync.New(cfg, flags.WorkDir) - syncer.SetBackupEnabled(false) - if err := syncer.EnsureRepositoryCloned(repo); err != nil { - fmt.Printf("ERROR: Failed to clone %s: %v\n", repo, err) - return 1 - } - - // Generate showcase for just this repository - fmt.Printf("\nGenerating showcase for repository: %s...\n", repo) - generator := showcase.New(cfg, flags.WorkDir) - if flags.AITool != "" { - generator.SetAITool(flags.AITool) - } - if err := generator.GenerateShowcase([]string{repo}, flags.Force); err != nil { - log.Printf("ERROR: Failed to generate showcase for %s: %v\n", repo, err) - return 1 - } - fmt.Println("Showcase generation completed!") - return 0 - } - - // Otherwise, process all repositories - allRepos, err := getAllRepositories(cfg) - if err != nil { - log.Printf("ERROR: Failed to get repositories: %v\n", err) - return 1 - } - if len(allRepos) == 0 { - fmt.Println("No repositories found") - return 1 - } - fmt.Printf("Found %d repositories total\n", len(allRepos)) - - // Create a minimal syncer just for cloning - syncer := sync.New(cfg, flags.WorkDir) - syncer.SetBackupEnabled(false) // Never use backup in showcase-only mode - - // Ensure repositories are cloned (but not synced) - fmt.Println("\nEnsuring repositories are cloned locally...") - for _, repo := range allRepos { - if err := syncer.EnsureRepositoryCloned(repo); err != nil { - fmt.Printf("WARNING: Failed to clone %s: %v\n", repo, err) - // Continue with other repos - } - } - - // Generate showcase for all repositories - fmt.Println("\nGenerating showcase for all repositories...") - generator := showcase.New(cfg, flags.WorkDir) - - // Set AI tool if specified - if flags.AITool != "" { - generator.SetAITool(flags.AITool) - } - - // Pass empty filter to process all repos - if err := generator.GenerateShowcase(nil, flags.Force); err != nil { - log.Printf("ERROR: Failed to generate showcase: %v\n", err) - return 1 - } - - fmt.Println("Showcase generation completed!") - return 0 + // If a specific repo is requested, only generate for that repo + if flags.SyncRepo != "" { + repo := flags.SyncRepo + + // Ensure the repository is cloned + syncer := sync.New(cfg, flags.WorkDir) + syncer.SetBackupEnabled(false) + if err := syncer.EnsureRepositoryCloned(repo); err != nil { + fmt.Printf("ERROR: Failed to clone %s: %v\n", repo, err) + return 1 + } + + // Generate showcase for just this repository + fmt.Printf("\nGenerating showcase for repository: %s...\n", repo) + generator := showcase.New(cfg, flags.WorkDir) + if flags.AITool != "" { + generator.SetAITool(flags.AITool) + } + if err := generator.GenerateShowcase([]string{repo}, flags.Force); err != nil { + log.Printf("ERROR: Failed to generate showcase for %s: %v\n", repo, err) + return 1 + } + fmt.Println("Showcase generation completed!") + return 0 + } + + // Otherwise, process all repositories + allRepos, err := getAllRepositories(cfg) + if err != nil { + log.Printf("ERROR: Failed to get repositories: %v\n", err) + return 1 + } + if len(allRepos) == 0 { + fmt.Println("No repositories found") + return 1 + } + fmt.Printf("Found %d repositories total\n", len(allRepos)) + + // Create a minimal syncer just for cloning + syncer := sync.New(cfg, flags.WorkDir) + syncer.SetBackupEnabled(false) // Never use backup in showcase-only mode + + // Ensure repositories are cloned (but not synced) + fmt.Println("\nEnsuring repositories are cloned locally...") + for _, repo := range allRepos { + if err := syncer.EnsureRepositoryCloned(repo); err != nil { + fmt.Printf("WARNING: Failed to clone %s: %v\n", repo, err) + // Continue with other repos + } + } + + // Generate showcase for all repositories + fmt.Println("\nGenerating showcase for all repositories...") + generator := showcase.New(cfg, flags.WorkDir) + + // Set AI tool if specified + if flags.AITool != "" { + generator.SetAITool(flags.AITool) + } + + // Pass empty filter to process all repos + if err := generator.GenerateShowcase(nil, flags.Force); err != nil { + log.Printf("ERROR: Failed to generate showcase: %v\n", err) + return 1 + } + + fmt.Println("Showcase generation completed!") + return 0 } // getAllRepositories collects all unique repository names from all sources func getAllRepositories(cfg *config.Config) ([]string, error) { repoMap := make(map[string]bool) - + // Add configured repositories for _, repo := range cfg.Repositories { repoMap[repo] = true } - + // Add Codeberg public repos if configured if codebergOrg := cfg.FindCodebergOrg(); codebergOrg != nil { fmt.Printf("Fetching public repositories from Codeberg user/org: %s...\n", codebergOrg.Name) client := codeberg.NewClient(codebergOrg.Name, codebergOrg.CodebergToken) - + repos, err := client.ListPublicRepos() if err != nil { // Try as user @@ -106,17 +106,17 @@ func getAllRepositories(cfg *config.Config) ([]string, error) { fmt.Printf("Warning: Failed to fetch Codeberg repos: %v\n", err) } } - + for _, repo := range repos { repoMap[repo.Name] = true } } - + // Add GitHub public repos if configured if githubOrg := cfg.FindGitHubOrg(); githubOrg != nil { fmt.Printf("Fetching public repositories from GitHub user/org: %s...\n", githubOrg.Name) client := github.NewClient(githubOrg.GitHubToken, githubOrg.Name) - + if client.HasToken() { repos, err := client.ListPublicRepos() if err != nil { @@ -130,12 +130,12 @@ func getAllRepositories(cfg *config.Config) ([]string, error) { fmt.Println("Warning: No GitHub token found, skipping GitHub repos") } } - + // Convert map to slice var allRepos []string for repo := range repoMap { allRepos = append(allRepos, repo) } - + return allRepos, nil } |
