// Package port defines interfaces (ports) for external dependencies. package port import "context" // TemplateProvider seeds repositories with starter files. type TemplateProvider interface { // SeedRepo populates a repository with template files. // templateName specifies which template to use (e.g., "default", "astro-landing"). // vars contains template variables for interpolation (e.g., PROJECT_NAME, DOMAIN). SeedRepo(ctx context.Context, owner, repo, templateName string, vars map[string]string) error // SeedSkeleton populates a repository with the monorepo skeleton template. // This creates the base monorepo structure without any components. // Components are added later via POST /projects/{id}/components. SeedSkeleton(ctx context.Context, owner, repo string, vars map[string]string) error // ListTemplates returns available templates. ListTemplates(ctx context.Context) ([]TemplateInfo, error) // GetTemplate returns info about a specific template. GetTemplate(ctx context.Context, name string) (*TemplateInfo, error) // GetSkeleton returns info about the monorepo skeleton template. GetSkeleton(ctx context.Context) (*TemplateInfo, error) // GetComponentTemplate returns info about a specific component template. // componentType is one of: service, worker, app-astro, app-react, cli GetComponentTemplate(ctx context.Context, componentType string) (*ComponentTemplateInfo, error) // ListComponentTemplates returns available component templates. // If componentType is empty, returns all component templates. // Otherwise, returns only templates matching the specified type. ListComponentTemplates(ctx context.Context, componentType string) ([]ComponentTemplateInfo, error) // GetComponentFiles returns the files for a component template with variables interpolated. // destPath is the destination path prefix (e.g., "services/my-api" or "apps/landing"). // vars contains template variables for interpolation. GetComponentFiles(ctx context.Context, componentType string, destPath string, vars map[string]string) ([]ComponentFile, error) // GetComponentWoodpeckerStep returns the .woodpecker.step.yml content for a component. // This is the CI step that should be inserted into the main .woodpecker.yml file. GetComponentWoodpeckerStep(ctx context.Context, componentType string, vars map[string]string) (string, error) } // TemplateInfo describes an available project template. type TemplateInfo struct { // Name is the template identifier (e.g., "astro-landing") Name string // Description explains what the template provides Description string // Stack indicates the technology stack (e.g., "astro", "go", "generic") Stack string // Files lists the files included in the template Files []string } // ComponentTemplateInfo describes a component template for monorepo projects. type ComponentTemplateInfo struct { // Type is the component type (e.g., "service", "worker", "app-astro", "app-react", "cli") Type string // Description explains what the component provides Description string // Stack indicates the technology stack (e.g., "go", "astro", "react") Stack string // DefaultPort is the default port for this component type (0 if not applicable) DefaultPort int // DestDir is the destination directory for this component type (e.g., "services", "workers", "apps", "cli") DestDir string // Files lists the files included in the template Files []string } // ComponentFile represents a file to be created for a component. type ComponentFile struct { // Path is the file path relative to the repository root Path string // Content is the file content (already interpolated with variables) Content string }