Implements defence in depth through build variants - only compiled code
exists in the binary. Commands now self-register via cli.RegisterCommands()
in their init() functions, mirroring the i18n.RegisterLocales() pattern.
Structure changes:
- cmd/{ai,build,ci,dev,docs,doctor,go,php,pkg,sdk,setup,test,vm}/ → pkg/*/cmd_*.go
- cmd/core_dev.go, cmd/core_ci.go → cmd/variants/{full,ci,php,minimal}.go
- Added pkg/cli/commands.go with RegisterCommands API
- Updated pkg/cli/runtime.go to attach registered commands
Build variants:
- go build → full (21MB, all 13 command groups)
- go build -tags ci → ci (18MB, build/ci/sdk/doctor)
- go build -tags php → php (14MB, php/doctor)
- go build -tags minimal → minimal (11MB, doctor only)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package ci
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/host-uk/core/pkg/i18n"
|
|
"github.com/host-uk/core/pkg/release"
|
|
)
|
|
|
|
// runCIReleaseInit creates a release configuration interactively.
|
|
func runCIReleaseInit() error {
|
|
projectDir, err := os.Getwd()
|
|
if err != nil {
|
|
return fmt.Errorf("%s: %w", i18n.T("common.error.failed", map[string]any{"Action": "get working directory"}), err)
|
|
}
|
|
|
|
// Check if config already exists
|
|
if release.ConfigExists(projectDir) {
|
|
fmt.Printf("%s %s %s\n",
|
|
releaseDimStyle.Render(i18n.T("common.label.note")),
|
|
i18n.T("cmd.ci.init.config_exists"),
|
|
release.ConfigPath(projectDir))
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
fmt.Print(i18n.T("cmd.ci.init.overwrite_prompt"))
|
|
response, _ := reader.ReadString('\n')
|
|
response = strings.TrimSpace(strings.ToLower(response))
|
|
if response != "y" && response != "yes" {
|
|
fmt.Println(i18n.T("common.prompt.abort"))
|
|
return nil
|
|
}
|
|
}
|
|
|
|
fmt.Printf("%s %s\n", releaseHeaderStyle.Render(i18n.T("cmd.ci.label.init")), i18n.T("cmd.ci.init.creating"))
|
|
fmt.Println()
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
// Project name
|
|
defaultName := filepath.Base(projectDir)
|
|
fmt.Printf("%s [%s]: ", i18n.T("cmd.ci.init.project_name"), defaultName)
|
|
name, _ := reader.ReadString('\n')
|
|
name = strings.TrimSpace(name)
|
|
if name == "" {
|
|
name = defaultName
|
|
}
|
|
|
|
// Repository
|
|
fmt.Printf("%s ", i18n.T("cmd.ci.init.github_repo"))
|
|
repo, _ := reader.ReadString('\n')
|
|
repo = strings.TrimSpace(repo)
|
|
|
|
// Create config
|
|
cfg := release.DefaultConfig()
|
|
cfg.Project.Name = name
|
|
cfg.Project.Repository = repo
|
|
|
|
// Write config
|
|
if err := release.WriteConfig(cfg, projectDir); err != nil {
|
|
return fmt.Errorf("%s: %w", i18n.T("common.error.failed", map[string]any{"Action": "write config"}), err)
|
|
}
|
|
|
|
fmt.Println()
|
|
fmt.Printf("%s %s %s\n",
|
|
releaseSuccessStyle.Render(i18n.T("common.label.success")),
|
|
i18n.T("cmd.ci.init.config_written"),
|
|
release.ConfigPath(projectDir))
|
|
|
|
return nil
|
|
}
|