feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
// Package builders provides build implementations for different project types.
package builders
import (
"context"
2026-03-26 17:41:53 +00:00
"path"
2026-04-01 16:29:30 +00:00
"runtime"
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
2026-03-26 17:41:53 +00:00
"dappco.re/go/core"
"dappco.re/go/core/build/internal/ax"
2026-03-22 01:53:16 +00:00
"dappco.re/go/core/build/pkg/build"
"dappco.re/go/core/io"
coreerr "dappco.re/go/core/log"
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
)
// TaskfileBuilder builds projects using Taskfile (https://taskfile.dev/).
// This is a generic builder that can handle any project type that has a Taskfile.
2026-03-31 18:33:36 +01:00
//
// b := builders.NewTaskfileBuilder()
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
type TaskfileBuilder struct { }
// NewTaskfileBuilder creates a new Taskfile builder.
2026-03-31 18:33:36 +01:00
//
// b := builders.NewTaskfileBuilder()
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
func NewTaskfileBuilder ( ) * TaskfileBuilder {
return & TaskfileBuilder { }
}
// Name returns the builder's identifier.
2026-03-31 18:33:36 +01:00
//
// name := b.Name() // → "taskfile"
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
func ( b * TaskfileBuilder ) Name ( ) string {
return "taskfile"
}
// Detect checks if a Taskfile exists in the directory.
2026-03-31 18:33:36 +01:00
//
// ok, err := b.Detect(io.Local, ".")
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
func ( b * TaskfileBuilder ) Detect ( fs io . Medium , dir string ) ( bool , error ) {
// Check for Taskfile.yml, Taskfile.yaml, or Taskfile
taskfiles := [ ] string {
"Taskfile.yml" ,
"Taskfile.yaml" ,
"Taskfile" ,
"taskfile.yml" ,
"taskfile.yaml" ,
}
for _ , tf := range taskfiles {
2026-03-26 17:41:53 +00:00
if fs . IsFile ( ax . Join ( dir , tf ) ) {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
return true , nil
}
}
return false , nil
}
// Build runs the Taskfile build task for each target platform.
2026-03-31 18:33:36 +01:00
//
// artifacts, err := b.Build(ctx, cfg, []build.Target{{OS: "linux", Arch: "amd64"}})
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
func ( b * TaskfileBuilder ) Build ( ctx context . Context , cfg * build . Config , targets [ ] build . Target ) ( [ ] build . Artifact , error ) {
2026-03-30 01:13:57 +00:00
taskCommand , err := b . resolveTaskCli ( )
if err != nil {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
return nil , err
}
// Create output directory
outputDir := cfg . OutputDir
if outputDir == "" {
2026-03-26 17:41:53 +00:00
outputDir = ax . Join ( cfg . ProjectDir , "dist" )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
if err := cfg . FS . EnsureDir ( outputDir ) ; err != nil {
2026-03-16 21:03:21 +00:00
return nil , coreerr . E ( "TaskfileBuilder.Build" , "failed to create output directory" , err )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
var artifacts [ ] build . Artifact
2026-04-01 16:29:30 +00:00
// If no targets are specified, build the host target so Taskfile builds
// still receive the standard GOOS/GOARCH surface.
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
if len ( targets ) == 0 {
2026-04-01 16:29:30 +00:00
targets = [ ] build . Target { { OS : runtime . GOOS , Arch : runtime . GOARCH } }
}
// Run build task for each target
for _ , target := range targets {
2026-04-01 21:05:47 +00:00
if err := b . runTask ( ctx , cfg , taskCommand , outputDir , target ) ; err != nil {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
return nil , err
}
2026-04-01 16:29:30 +00:00
// Try to find artifacts for this target
found := b . findArtifactsForTarget ( cfg . FS , outputDir , target )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
artifacts = append ( artifacts , found ... )
}
return artifacts , nil
}
// runTask executes the Taskfile build task.
2026-04-01 21:05:47 +00:00
func ( b * TaskfileBuilder ) runTask ( ctx context . Context , cfg * build . Config , taskCommand string , outputDir string , target build . Target ) error {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
// Build task command
args := [ ] string { "build" }
2026-04-01 14:20:05 +00:00
env := append ( [ ] string { } , cfg . Env ... )
2026-04-01 21:05:47 +00:00
platformDir := ax . Join ( outputDir , core . Sprintf ( "%s_%s" , target . OS , target . Arch ) )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
// Pass variables if targets are specified
2026-04-01 21:01:13 +00:00
if target . OS != "" {
value := core . Sprintf ( "GOOS=%s" , target . OS )
2026-03-26 17:41:53 +00:00
args = append ( args , value )
env = append ( env , value )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
2026-04-01 21:01:13 +00:00
if target . Arch != "" {
value := core . Sprintf ( "GOARCH=%s" , target . Arch )
args = append ( args , value )
env = append ( env , value )
}
if target . OS != "" {
value := core . Sprintf ( "TARGET_OS=%s" , target . OS )
args = append ( args , value )
env = append ( env , value )
}
if target . Arch != "" {
value := core . Sprintf ( "TARGET_ARCH=%s" , target . Arch )
2026-03-26 17:41:53 +00:00
args = append ( args , value )
env = append ( env , value )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
2026-04-01 21:05:47 +00:00
value := core . Sprintf ( "OUTPUT_DIR=%s" , outputDir )
args = append ( args , value )
env = append ( env , value )
2026-04-01 21:01:13 +00:00
if platformDir != "" {
value := core . Sprintf ( "TARGET_DIR=%s" , platformDir )
args = append ( args , value )
env = append ( env , value )
}
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
if cfg . Name != "" {
2026-03-26 17:41:53 +00:00
value := core . Sprintf ( "NAME=%s" , cfg . Name )
args = append ( args , value )
env = append ( env , value )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
if cfg . Version != "" {
2026-03-26 17:41:53 +00:00
value := core . Sprintf ( "VERSION=%s" , cfg . Version )
args = append ( args , value )
env = append ( env , value )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
2026-04-01 21:13:33 +00:00
value = "CGO_ENABLED=0"
if cfg . CGO {
value = "CGO_ENABLED=1"
}
args = append ( args , value )
env = append ( env , value )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
2026-04-01 21:01:13 +00:00
if target . OS != "" && target . Arch != "" {
core . Print ( nil , "Running task build for %s/%s" , target . OS , target . Arch )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
} else {
2026-03-26 17:41:53 +00:00
core . Print ( nil , "Running task build" )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
2026-03-30 01:13:57 +00:00
if err := ax . ExecWithEnv ( ctx , cfg . ProjectDir , env , taskCommand , args ... ) ; err != nil {
2026-03-16 21:03:21 +00:00
return coreerr . E ( "TaskfileBuilder.runTask" , "task build failed" , err )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
return nil
}
// findArtifacts searches for built artifacts in the output directory.
func ( b * TaskfileBuilder ) findArtifacts ( fs io . Medium , outputDir string ) [ ] build . Artifact {
var artifacts [ ] build . Artifact
entries , err := fs . List ( outputDir )
if err != nil {
return artifacts
}
for _ , entry := range entries {
if entry . IsDir ( ) {
continue
}
// Skip common non-artifact files
name := entry . Name ( )
2026-03-26 17:41:53 +00:00
if core . HasPrefix ( name , "." ) || name == "CHECKSUMS.txt" {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
continue
}
artifacts = append ( artifacts , build . Artifact {
2026-03-26 17:41:53 +00:00
Path : ax . Join ( outputDir , name ) ,
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
OS : "" ,
Arch : "" ,
} )
}
return artifacts
}
// findArtifactsForTarget searches for built artifacts for a specific target.
func ( b * TaskfileBuilder ) findArtifactsForTarget ( fs io . Medium , outputDir string , target build . Target ) [ ] build . Artifact {
var artifacts [ ] build . Artifact
// 1. Look for platform-specific subdirectory: output/os_arch/
2026-03-26 17:41:53 +00:00
platformSubdir := ax . Join ( outputDir , core . Sprintf ( "%s_%s" , target . OS , target . Arch ) )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
if fs . IsDir ( platformSubdir ) {
entries , _ := fs . List ( platformSubdir )
for _ , entry := range entries {
if entry . IsDir ( ) {
// Handle .app bundles on macOS
2026-03-26 17:41:53 +00:00
if target . OS == "darwin" && core . HasSuffix ( entry . Name ( ) , ".app" ) {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
artifacts = append ( artifacts , build . Artifact {
2026-03-26 17:41:53 +00:00
Path : ax . Join ( platformSubdir , entry . Name ( ) ) ,
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
OS : target . OS ,
Arch : target . Arch ,
} )
}
continue
}
// Skip hidden files
2026-03-26 17:41:53 +00:00
if core . HasPrefix ( entry . Name ( ) , "." ) {
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
continue
}
artifacts = append ( artifacts , build . Artifact {
2026-03-26 17:41:53 +00:00
Path : ax . Join ( platformSubdir , entry . Name ( ) ) ,
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
OS : target . OS ,
Arch : target . Arch ,
} )
}
if len ( artifacts ) > 0 {
return artifacts
}
}
// 2. Look for files matching the target pattern in the root output dir
patterns := [ ] string {
2026-03-26 17:41:53 +00:00
core . Sprintf ( "*-%s-%s*" , target . OS , target . Arch ) ,
core . Sprintf ( "*_%s_%s*" , target . OS , target . Arch ) ,
core . Sprintf ( "*-%s*" , target . Arch ) ,
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
for _ , pattern := range patterns {
entries , _ := fs . List ( outputDir )
for _ , entry := range entries {
match := entry . Name ( )
// Simple glob matching
if b . matchPattern ( match , pattern ) {
2026-03-26 17:41:53 +00:00
fullPath := ax . Join ( outputDir , match )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
if fs . IsDir ( fullPath ) {
continue
}
artifacts = append ( artifacts , build . Artifact {
Path : fullPath ,
OS : target . OS ,
Arch : target . Arch ,
} )
}
}
if len ( artifacts ) > 0 {
break // Found matches, stop looking
}
}
return artifacts
}
// matchPattern implements glob matching for Taskfile artifacts.
func ( b * TaskfileBuilder ) matchPattern ( name , pattern string ) bool {
2026-03-26 17:41:53 +00:00
matched , _ := path . Match ( pattern , name )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
return matched
}
2026-03-30 01:13:57 +00:00
// resolveTaskCli returns the executable path for the task CLI.
func ( b * TaskfileBuilder ) resolveTaskCli ( paths ... string ) ( string , error ) {
if len ( paths ) == 0 {
paths = [ ] string {
"/usr/local/bin/task" ,
"/opt/homebrew/bin/task" ,
}
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
2026-03-30 01:13:57 +00:00
command , err := ax . ResolveCommand ( "task" , paths ... )
if err != nil {
return "" , coreerr . E ( "TaskfileBuilder.resolveTaskCli" , "task CLI not found. Install with: brew install go-task (macOS), go install github.com/go-task/task/v3/cmd/task@latest, or see https://taskfile.dev/installation/" , err )
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}
2026-03-30 01:13:57 +00:00
return command , nil
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
}