This comprehensive refactoring addresses critical architectural issues: IMPORT CYCLE RESOLUTION: • pkg/crypto ↔ pkg/slurp/roles: Created pkg/security/access_levels.go • pkg/ucxl → pkg/dht: Created pkg/storage/interfaces.go • pkg/slurp/leader → pkg/election → pkg/slurp/storage: Moved types to pkg/election/interfaces.go MODULE PATH MIGRATION: • Changed from github.com/anthonyrawlins/bzzz to chorus.services/bzzz • Updated all import statements across 115+ files • Maintains compatibility while removing personal GitHub account dependency TYPE SYSTEM IMPROVEMENTS: • Resolved duplicate type declarations in crypto package • Added missing type definitions (RoleStatus, TimeRestrictions, KeyStatus, KeyRotationResult) • Proper interface segregation to prevent future cycles ARCHITECTURAL BENEFITS: • Build now progresses past structural issues to normal dependency resolution • Cleaner separation of concerns between packages • Eliminates circular dependencies that prevented compilation • Establishes foundation for scalable codebase growth 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
233 lines
6.8 KiB
Go
233 lines
6.8 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"chorus.services/bzzz/gitea"
|
|
"chorus.services/bzzz/github"
|
|
)
|
|
|
|
// DefaultProviderFactory implements ProviderFactory
|
|
type DefaultProviderFactory struct{}
|
|
|
|
// CreateProvider creates a task provider based on configuration
|
|
func (f *DefaultProviderFactory) CreateProvider(ctx context.Context, config *Config) (TaskProvider, error) {
|
|
switch strings.ToLower(config.Provider) {
|
|
case "gitea":
|
|
return f.createGiteaProvider(ctx, config)
|
|
case "github":
|
|
return f.createGitHubProvider(ctx, config)
|
|
default:
|
|
return nil, fmt.Errorf("unsupported provider: %s", config.Provider)
|
|
}
|
|
}
|
|
|
|
// SupportedProviders returns list of supported providers
|
|
func (f *DefaultProviderFactory) SupportedProviders() []string {
|
|
return []string{"gitea", "github"}
|
|
}
|
|
|
|
// createGiteaProvider creates a Gitea task provider
|
|
func (f *DefaultProviderFactory) createGiteaProvider(ctx context.Context, config *Config) (TaskProvider, error) {
|
|
giteaConfig := &gitea.Config{
|
|
BaseURL: config.BaseURL,
|
|
AccessToken: config.AccessToken,
|
|
Owner: config.Owner,
|
|
Repository: config.Repository,
|
|
TaskLabel: config.TaskLabel,
|
|
InProgressLabel: config.InProgressLabel,
|
|
CompletedLabel: config.CompletedLabel,
|
|
Assignee: config.Assignee,
|
|
BaseBranch: config.BaseBranch,
|
|
BranchPrefix: config.BranchPrefix,
|
|
}
|
|
|
|
client, err := gitea.NewClient(ctx, giteaConfig)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create Gitea client: %w", err)
|
|
}
|
|
|
|
return &GiteaProvider{
|
|
client: client,
|
|
config: config,
|
|
}, nil
|
|
}
|
|
|
|
// createGitHubProvider creates a GitHub task provider
|
|
func (f *DefaultProviderFactory) createGitHubProvider(ctx context.Context, config *Config) (TaskProvider, error) {
|
|
githubConfig := &github.Config{
|
|
AccessToken: config.AccessToken,
|
|
Owner: config.Owner,
|
|
Repository: config.Repository,
|
|
TaskLabel: config.TaskLabel,
|
|
InProgressLabel: config.InProgressLabel,
|
|
CompletedLabel: config.CompletedLabel,
|
|
Assignee: config.Assignee,
|
|
BaseBranch: config.BaseBranch,
|
|
BranchPrefix: config.BranchPrefix,
|
|
}
|
|
|
|
client, err := github.NewClient(ctx, githubConfig)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create GitHub client: %w", err)
|
|
}
|
|
|
|
return &GitHubProvider{
|
|
client: client,
|
|
config: config,
|
|
}, nil
|
|
}
|
|
|
|
// GiteaProvider adapts Gitea client to TaskProvider interface
|
|
type GiteaProvider struct {
|
|
client *gitea.Client
|
|
config *Config
|
|
}
|
|
|
|
// ListAvailableTasks implements TaskProvider interface
|
|
func (p *GiteaProvider) ListAvailableTasks() ([]*Task, error) {
|
|
giteaTasks, err := p.client.ListAvailableTasks()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
tasks := make([]*Task, len(giteaTasks))
|
|
for i, gTask := range giteaTasks {
|
|
tasks[i] = p.convertGiteaTask(gTask)
|
|
}
|
|
|
|
return tasks, nil
|
|
}
|
|
|
|
// ClaimTask implements TaskProvider interface
|
|
func (p *GiteaProvider) ClaimTask(issueNumber int64, agentID string) (*Task, error) {
|
|
gTask, err := p.client.ClaimTask(issueNumber, agentID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return p.convertGiteaTask(gTask), nil
|
|
}
|
|
|
|
// CompleteTask implements TaskProvider interface
|
|
func (p *GiteaProvider) CompleteTask(issueNumber int64, agentID string, results map[string]interface{}) error {
|
|
return p.client.CompleteTask(issueNumber, agentID, results)
|
|
}
|
|
|
|
// GetTask implements TaskProvider interface
|
|
func (p *GiteaProvider) GetTask(issueNumber int64) (*Task, error) {
|
|
// This would need to be implemented in the Gitea client
|
|
return nil, fmt.Errorf("GetTask not yet implemented for Gitea provider")
|
|
}
|
|
|
|
// GetConfig implements TaskProvider interface
|
|
func (p *GiteaProvider) GetConfig() *Config {
|
|
return p.config
|
|
}
|
|
|
|
// convertGiteaTask converts a Gitea task to the unified Task format
|
|
func (p *GiteaProvider) convertGiteaTask(gTask *gitea.Task) *Task {
|
|
labels := make([]string, len(gTask.Labels))
|
|
for i, label := range gTask.Labels {
|
|
labels[i] = label.Name
|
|
}
|
|
|
|
assignee := ""
|
|
if gTask.Assignee != nil {
|
|
assignee = gTask.Assignee.Login
|
|
}
|
|
|
|
return &Task{
|
|
ID: gTask.ID,
|
|
Number: gTask.Number,
|
|
Title: gTask.Title,
|
|
Description: gTask.Description,
|
|
State: gTask.State,
|
|
Provider: "gitea",
|
|
Repository: fmt.Sprintf("%s/%s", p.config.Owner, p.config.Repository),
|
|
CreatedAt: gTask.CreatedAt,
|
|
UpdatedAt: gTask.UpdatedAt,
|
|
Assignee: assignee,
|
|
Labels: labels,
|
|
TaskType: gTask.TaskType,
|
|
Priority: gTask.Priority,
|
|
Requirements: gTask.Requirements,
|
|
Deliverables: gTask.Deliverables,
|
|
Context: gTask.Context,
|
|
RequiredRole: gTask.RequiredRole,
|
|
RequiredExpertise: gTask.RequiredExpertise,
|
|
}
|
|
}
|
|
|
|
// GitHubProvider adapts GitHub client to TaskProvider interface
|
|
type GitHubProvider struct {
|
|
client *github.Client
|
|
config *Config
|
|
}
|
|
|
|
// ListAvailableTasks implements TaskProvider interface
|
|
func (p *GitHubProvider) ListAvailableTasks() ([]*Task, error) {
|
|
githubTasks, err := p.client.ListAvailableTasks()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
tasks := make([]*Task, len(githubTasks))
|
|
for i, gTask := range githubTasks {
|
|
tasks[i] = p.convertGitHubTask(gTask)
|
|
}
|
|
|
|
return tasks, nil
|
|
}
|
|
|
|
// ClaimTask implements TaskProvider interface
|
|
func (p *GitHubProvider) ClaimTask(issueNumber int64, agentID string) (*Task, error) {
|
|
gTask, err := p.client.ClaimTask(int(issueNumber), agentID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return p.convertGitHubTask(gTask), nil
|
|
}
|
|
|
|
// CompleteTask implements TaskProvider interface
|
|
func (p *GitHubProvider) CompleteTask(issueNumber int64, agentID string, results map[string]interface{}) error {
|
|
return p.client.CompleteTask(int(issueNumber), agentID, results)
|
|
}
|
|
|
|
// GetTask implements TaskProvider interface
|
|
func (p *GitHubProvider) GetTask(issueNumber int64) (*Task, error) {
|
|
// This would need to be implemented in the GitHub client
|
|
return nil, fmt.Errorf("GetTask not yet implemented for GitHub provider")
|
|
}
|
|
|
|
// GetConfig implements TaskProvider interface
|
|
func (p *GitHubProvider) GetConfig() *Config {
|
|
return p.config
|
|
}
|
|
|
|
// convertGitHubTask converts a GitHub task to the unified Task format
|
|
func (p *GitHubProvider) convertGitHubTask(gTask *github.Task) *Task {
|
|
return &Task{
|
|
ID: gTask.ID,
|
|
Number: int64(gTask.Number),
|
|
Title: gTask.Title,
|
|
Description: gTask.Description,
|
|
State: gTask.State,
|
|
Provider: "github",
|
|
Repository: fmt.Sprintf("%s/%s", p.config.Owner, p.config.Repository),
|
|
CreatedAt: gTask.CreatedAt,
|
|
UpdatedAt: gTask.UpdatedAt,
|
|
Assignee: gTask.Assignee,
|
|
Labels: gTask.Labels,
|
|
TaskType: gTask.TaskType,
|
|
Priority: gTask.Priority,
|
|
Requirements: gTask.Requirements,
|
|
Deliverables: gTask.Deliverables,
|
|
Context: gTask.Context,
|
|
RequiredRole: "", // Would need to be parsed from GitHub task
|
|
RequiredExpertise: []string{}, // Would need to be parsed from GitHub task
|
|
}
|
|
} |