refactor(i18n): consolidate duplicate translation keys into common section

Add common.* keys for reusable translations:
- common.label.* - UI labels (error, done, status, version, etc.)
- common.status.* - status words (running, stopped, dirty, synced)
- common.error.* - error messages (failed, not_found, working_dir)
- common.flag.* - CLI flag descriptions (registry, verbose, etc.)
- common.count.* - count templates (failed, passed, skipped)
- common.result.* - result messages (all_passed, no_issues)
- common.progress.* - progress messages (running, checking)
- common.hint.* - help hints (install_with, fix_deps)

Update all cmd/* files to use common keys instead of duplicated
command-specific keys. Reduces translation maintenance burden
and ensures consistency across the CLI.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Snider 2026-01-30 11:32:25 +00:00
parent a00a3240a6
commit 3169728d3a
44 changed files with 350 additions and 432 deletions

View file

@ -45,7 +45,7 @@ var taskCommitCmd = &cobra.Command{
cfg, err := agentic.LoadConfig("") cfg, err := agentic.LoadConfig("")
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
client := agentic.NewClientFromConfig(cfg) client := agentic.NewClientFromConfig(cfg)
@ -71,7 +71,7 @@ var taskCommitCmd = &cobra.Command{
// Get current directory // Get current directory
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Check for uncommitted changes // Check for uncommitted changes
@ -116,7 +116,7 @@ var taskPRCmd = &cobra.Command{
cfg, err := agentic.LoadConfig("") cfg, err := agentic.LoadConfig("")
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
client := agentic.NewClientFromConfig(cfg) client := agentic.NewClientFromConfig(cfg)
@ -133,7 +133,7 @@ var taskPRCmd = &cobra.Command{
// Get current directory // Get current directory
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Check current branch // Check current branch
@ -174,7 +174,7 @@ var taskPRCmd = &cobra.Command{
} }
fmt.Printf("%s %s\n", successStyle.Render(">>"), i18n.T("cmd.ai.task_pr.created")) fmt.Printf("%s %s\n", successStyle.Render(">>"), i18n.T("cmd.ai.task_pr.created"))
fmt.Printf(" %s %s\n", i18n.T("cmd.ai.label.url"), prURL) fmt.Printf(" %s %s\n", i18n.T("common.label.url"), prURL)
return nil return nil
}, },

View file

@ -43,7 +43,7 @@ var tasksCmd = &cobra.Command{
cfg, err := agentic.LoadConfig("") cfg, err := agentic.LoadConfig("")
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
client := agentic.NewClientFromConfig(cfg) client := agentic.NewClientFromConfig(cfg)
@ -88,7 +88,7 @@ var taskCmd = &cobra.Command{
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cfg, err := agentic.LoadConfig("") cfg, err := agentic.LoadConfig("")
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
client := agentic.NewClientFromConfig(cfg) client := agentic.NewClientFromConfig(cfg)
@ -167,7 +167,7 @@ var taskCmd = &cobra.Command{
} }
fmt.Printf("%s %s\n", successStyle.Render(">>"), i18n.T("cmd.ai.task.claimed")) fmt.Printf("%s %s\n", successStyle.Render(">>"), i18n.T("cmd.ai.task.claimed"))
fmt.Printf(" %s %s\n", i18n.T("cmd.ai.label.status"), formatTaskStatus(claimedTask.Status)) fmt.Printf(" %s %s\n", i18n.T("common.label.status"), formatTaskStatus(claimedTask.Status))
} }
return nil return nil
@ -224,10 +224,10 @@ func printTaskDetails(task *agentic.Task) {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.id")), taskIDStyle.Render(task.ID)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.id")), taskIDStyle.Render(task.ID))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.title")), taskTitleStyle.Render(task.Title)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.title")), taskTitleStyle.Render(task.Title))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.priority")), formatTaskPriority(task.Priority)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.priority")), formatTaskPriority(task.Priority))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.status")), formatTaskStatus(task.Status)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.status")), formatTaskStatus(task.Status))
if task.Project != "" { if task.Project != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.ai.label.project")), task.Project) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.project")), task.Project)
} }
if len(task.Labels) > 0 { if len(task.Labels) > 0 {

View file

@ -40,7 +40,7 @@ var taskUpdateCmd = &cobra.Command{
cfg, err := agentic.LoadConfig("") cfg, err := agentic.LoadConfig("")
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
client := agentic.NewClientFromConfig(cfg) client := agentic.NewClientFromConfig(cfg)
@ -75,7 +75,7 @@ var taskCompleteCmd = &cobra.Command{
cfg, err := agentic.LoadConfig("") cfg, err := agentic.LoadConfig("")
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ai.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
client := agentic.NewClientFromConfig(cfg) client := agentic.NewClientFromConfig(cfg)

View file

@ -119,7 +119,7 @@ func init() {
pwaCmd.Flags().StringVar(&pwaURL, "url", "", i18n.T("cmd.build.pwa.flag.url")) pwaCmd.Flags().StringVar(&pwaURL, "url", "", i18n.T("cmd.build.pwa.flag.url"))
// sdk subcommand flags // sdk subcommand flags
sdkBuildCmd.Flags().StringVar(&sdkSpec, "spec", "", i18n.T("cmd.build.sdk.flag.spec")) sdkBuildCmd.Flags().StringVar(&sdkSpec, "spec", "", i18n.T("common.flag.spec"))
sdkBuildCmd.Flags().StringVar(&sdkLang, "lang", "", i18n.T("cmd.build.sdk.flag.lang")) sdkBuildCmd.Flags().StringVar(&sdkLang, "lang", "", i18n.T("cmd.build.sdk.flag.lang"))
sdkBuildCmd.Flags().StringVar(&sdkVersion, "version", "", i18n.T("cmd.build.sdk.flag.version")) sdkBuildCmd.Flags().StringVar(&sdkVersion, "version", "", i18n.T("cmd.build.sdk.flag.version"))
sdkBuildCmd.Flags().BoolVar(&sdkDryRun, "dry-run", false, i18n.T("cmd.build.sdk.flag.dry_run")) sdkBuildCmd.Flags().BoolVar(&sdkDryRun, "dry-run", false, i18n.T("cmd.build.sdk.flag.dry_run"))

View file

@ -25,13 +25,13 @@ func runProjectBuild(buildType string, ciMode bool, targetsFlag string, outputDi
// Get current working directory as project root // Get current working directory as project root
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.build.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Load configuration from .core/build.yaml (or defaults) // Load configuration from .core/build.yaml (or defaults)
buildCfg, err := buildpkg.LoadConfig(projectDir) buildCfg, err := buildpkg.LoadConfig(projectDir)
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.build.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
// Detect project type if not specified // Detect project type if not specified
@ -120,13 +120,13 @@ func runProjectBuild(buildType string, ciMode bool, targetsFlag string, outputDi
artifacts, err := builder.Build(ctx, cfg, buildTargets) artifacts, err := builder.Build(ctx, cfg, buildTargets)
if err != nil { if err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.build_failed"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("common.error.build_failed"), err)
} }
return err return err
} }
if !ciMode { if !ciMode {
fmt.Printf("%s %s\n", buildSuccessStyle.Render(i18n.T("cmd.build.label.success")), i18n.T("cmd.build.built_artifacts", map[string]interface{}{"Count": len(artifacts)})) fmt.Printf("%s %s\n", buildSuccessStyle.Render(i18n.T("common.label.success")), i18n.T("cmd.build.built_artifacts", map[string]interface{}{"Count": len(artifacts)}))
fmt.Println() fmt.Println()
for _, artifact := range artifacts { for _, artifact := range artifacts {
relPath, err := filepath.Rel(projectDir, artifact.Path) relPath, err := filepath.Rel(projectDir, artifact.Path)
@ -164,7 +164,7 @@ func runProjectBuild(buildType string, ciMode bool, targetsFlag string, outputDi
if err := signing.SignBinaries(ctx, signCfg, signingArtifacts); err != nil { if err := signing.SignBinaries(ctx, signCfg, signingArtifacts); err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.signing_failed"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.build.error.signing_failed"), err)
} }
return err return err
} }
@ -172,7 +172,7 @@ func runProjectBuild(buildType string, ciMode bool, targetsFlag string, outputDi
if signCfg.MacOS.Notarize { if signCfg.MacOS.Notarize {
if err := signing.NotarizeBinaries(ctx, signCfg, signingArtifacts); err != nil { if err := signing.NotarizeBinaries(ctx, signCfg, signingArtifacts); err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.notarization_failed"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.build.error.notarization_failed"), err)
} }
return err return err
} }
@ -190,7 +190,7 @@ func runProjectBuild(buildType string, ciMode bool, targetsFlag string, outputDi
archivedArtifacts, err = buildpkg.ArchiveAll(artifacts) archivedArtifacts, err = buildpkg.ArchiveAll(artifacts)
if err != nil { if err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.archive_failed"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.build.error.archive_failed"), err)
} }
return err return err
} }
@ -258,7 +258,7 @@ func computeAndWriteChecksums(ctx context.Context, projectDir, outputDir string,
checksummedArtifacts, err := buildpkg.ChecksumAll(artifacts) checksummedArtifacts, err := buildpkg.ChecksumAll(artifacts)
if err != nil { if err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.checksum_failed"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.build.error.checksum_failed"), err)
} }
return nil, err return nil, err
} }
@ -267,7 +267,7 @@ func computeAndWriteChecksums(ctx context.Context, projectDir, outputDir string,
checksumPath := filepath.Join(outputDir, "CHECKSUMS.txt") checksumPath := filepath.Join(outputDir, "CHECKSUMS.txt")
if err := buildpkg.WriteChecksumFile(checksummedArtifacts, checksumPath); err != nil { if err := buildpkg.WriteChecksumFile(checksummedArtifacts, checksumPath); err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.write_checksums"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.build.error.write_checksums"), err)
} }
return nil, err return nil, err
} }
@ -276,7 +276,7 @@ func computeAndWriteChecksums(ctx context.Context, projectDir, outputDir string,
if signCfg.Enabled { if signCfg.Enabled {
if err := signing.SignChecksums(ctx, signCfg, checksumPath); err != nil { if err := signing.SignChecksums(ctx, signCfg, checksumPath); err != nil {
if !ciMode { if !ciMode {
fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), i18n.T("cmd.build.error.gpg_signing_failed"), err) fmt.Printf("%s %s: %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.build.error.gpg_signing_failed"), err)
} }
return nil, err return nil, err
} }

View file

@ -66,7 +66,7 @@ func downloadPWA(baseURL, destDir string) error {
manifestURL, err := findManifestURL(string(body), baseURL) manifestURL, err := findManifestURL(string(body), baseURL)
if err != nil { if err != nil {
// If no manifest, it's not a PWA, but we can still try to package it as a simple site. // If no manifest, it's not a PWA, but we can still try to package it as a simple site.
fmt.Printf("%s %s\n", i18n.T("cmd.build.pwa.warning"), i18n.T("cmd.build.pwa.no_manifest")) fmt.Printf("%s %s\n", i18n.T("common.label.warning"), i18n.T("cmd.build.pwa.no_manifest"))
if err := os.WriteFile(filepath.Join(destDir, "index.html"), body, 0644); err != nil { if err := os.WriteFile(filepath.Join(destDir, "index.html"), body, 0644); err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.build.pwa.error.write_index"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.build.pwa.error.write_index"), err)
} }
@ -85,7 +85,7 @@ func downloadPWA(baseURL, destDir string) error {
assets := collectAssets(manifest, manifestURL) assets := collectAssets(manifest, manifestURL)
for _, assetURL := range assets { for _, assetURL := range assets {
if err := downloadAsset(assetURL, destDir); err != nil { if err := downloadAsset(assetURL, destDir); err != nil {
fmt.Printf("%s %s %s: %v\n", i18n.T("cmd.build.pwa.warning"), i18n.T("cmd.build.pwa.asset_download_failed"), assetURL, err) fmt.Printf("%s %s %s: %v\n", i18n.T("common.label.warning"), i18n.T("cmd.build.pwa.asset_download_failed"), assetURL, err)
} }
} }

View file

@ -21,7 +21,7 @@ func runBuildSDK(specPath, lang, version string, dryRun bool) error {
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.build.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Load config // Load config
@ -44,10 +44,10 @@ func runBuildSDK(specPath, lang, version string, dryRun bool) error {
// Detect spec // Detect spec
detectedSpec, err := s.DetectSpec() detectedSpec, err := s.DetectSpec()
if err != nil { if err != nil {
fmt.Printf("%s %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), err) fmt.Printf("%s %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), err)
return err return err
} }
fmt.Printf(" %s %s\n", i18n.T("cmd.build.sdk.spec_label"), buildTargetStyle.Render(detectedSpec)) fmt.Printf(" %s %s\n", i18n.T("common.label.spec"), buildTargetStyle.Render(detectedSpec))
if dryRun { if dryRun {
if lang != "" { if lang != "" {
@ -63,20 +63,20 @@ func runBuildSDK(specPath, lang, version string, dryRun bool) error {
if lang != "" { if lang != "" {
// Generate single language // Generate single language
if err := s.GenerateLanguage(ctx, lang); err != nil { if err := s.GenerateLanguage(ctx, lang); err != nil {
fmt.Printf("%s %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), err) fmt.Printf("%s %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), err)
return err return err
} }
fmt.Printf(" %s %s\n", i18n.T("cmd.build.sdk.generated_label"), buildTargetStyle.Render(lang)) fmt.Printf(" %s %s\n", i18n.T("cmd.build.sdk.generated_label"), buildTargetStyle.Render(lang))
} else { } else {
// Generate all // Generate all
if err := s.Generate(ctx); err != nil { if err := s.Generate(ctx); err != nil {
fmt.Printf("%s %v\n", buildErrorStyle.Render(i18n.T("cmd.build.label.error")), err) fmt.Printf("%s %v\n", buildErrorStyle.Render(i18n.T("common.label.error")), err)
return err return err
} }
fmt.Printf(" %s %s\n", i18n.T("cmd.build.sdk.generated_label"), buildTargetStyle.Render(strings.Join(config.Languages, ", "))) fmt.Printf(" %s %s\n", i18n.T("cmd.build.sdk.generated_label"), buildTargetStyle.Render(strings.Join(config.Languages, ", ")))
} }
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", buildSuccessStyle.Render(i18n.T("cmd.build.label.success")), i18n.T("cmd.build.sdk.complete")) fmt.Printf("%s %s\n", buildSuccessStyle.Render(i18n.T("common.label.success")), i18n.T("cmd.build.sdk.complete"))
return nil return nil
} }

View file

@ -12,13 +12,13 @@ import (
func runChangelog(fromRef, toRef string) error { func runChangelog(fromRef, toRef string) error {
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Load config for changelog settings // Load config for changelog settings
cfg, err := release.LoadConfig(projectDir) cfg, err := release.LoadConfig(projectDir)
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
// Generate changelog // Generate changelog

View file

@ -15,13 +15,13 @@ import (
func runCIReleaseInit() error { func runCIReleaseInit() error {
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Check if config already exists // Check if config already exists
if release.ConfigExists(projectDir) { if release.ConfigExists(projectDir) {
fmt.Printf("%s %s %s\n", fmt.Printf("%s %s %s\n",
releaseDimStyle.Render(i18n.T("cmd.ci.label.note")), releaseDimStyle.Render(i18n.T("common.label.note")),
i18n.T("cmd.ci.init.config_exists"), i18n.T("cmd.ci.init.config_exists"),
release.ConfigPath(projectDir)) release.ConfigPath(projectDir))
@ -66,7 +66,7 @@ func runCIReleaseInit() error {
fmt.Println() fmt.Println()
fmt.Printf("%s %s %s\n", fmt.Printf("%s %s %s\n",
releaseSuccessStyle.Render(i18n.T("cmd.ci.label.success")), releaseSuccessStyle.Render(i18n.T("common.label.success")),
i18n.T("cmd.ci.init.config_written"), i18n.T("cmd.ci.init.config_written"),
release.ConfigPath(projectDir)) release.ConfigPath(projectDir))

View file

@ -17,13 +17,13 @@ func runCIPublish(dryRun bool, version string, draft, prerelease bool) error {
// Get current directory // Get current directory
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Load configuration // Load configuration
cfg, err := release.LoadConfig(projectDir) cfg, err := release.LoadConfig(projectDir)
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.load_config"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.load_config"), err)
} }
// Apply CLI overrides // Apply CLI overrides
@ -60,14 +60,14 @@ func runCIPublish(dryRun bool, version string, draft, prerelease bool) error {
// Publish pre-built artifacts // Publish pre-built artifacts
rel, err := release.Publish(ctx, cfg, dryRun) rel, err := release.Publish(ctx, cfg, dryRun)
if err != nil { if err != nil {
fmt.Printf("%s %v\n", releaseErrorStyle.Render(i18n.T("cmd.ci.label.error")), err) fmt.Printf("%s %v\n", releaseErrorStyle.Render(i18n.T("common.label.error")), err)
return err return err
} }
// Print summary // Print summary
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", releaseSuccessStyle.Render(i18n.T("cmd.ci.label.success")), i18n.T("cmd.ci.publish_completed")) fmt.Printf("%s %s\n", releaseSuccessStyle.Render(i18n.T("common.label.success")), i18n.T("cmd.ci.publish_completed"))
fmt.Printf(" %s %s\n", i18n.T("cmd.ci.label.version"), releaseValueStyle.Render(rel.Version)) fmt.Printf(" %s %s\n", i18n.T("common.label.version"), releaseValueStyle.Render(rel.Version))
fmt.Printf(" %s %d\n", i18n.T("cmd.ci.label.artifacts"), len(rel.Artifacts)) fmt.Printf(" %s %d\n", i18n.T("cmd.ci.label.artifacts"), len(rel.Artifacts))
if !dryRun { if !dryRun {

View file

@ -12,7 +12,7 @@ import (
func runCIReleaseVersion() error { func runCIReleaseVersion() error {
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
version, err := release.DetermineVersion(projectDir) version, err := release.DetermineVersion(projectDir)
@ -20,6 +20,6 @@ func runCIReleaseVersion() error {
return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.determine_version"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.ci.error.determine_version"), err)
} }
fmt.Printf("%s %s\n", i18n.T("cmd.ci.label.version"), releaseValueStyle.Render(version)) fmt.Printf("%s %s\n", i18n.T("common.label.version"), releaseValueStyle.Render(version))
return nil return nil
} }

View file

@ -58,7 +58,7 @@ func addCICommand(parent *cobra.Command) {
}, },
} }
ciCmd.Flags().StringVar(&ciRegistryPath, "registry", "", i18n.T("cmd.dev.ci.flag.registry")) ciCmd.Flags().StringVar(&ciRegistryPath, "registry", "", i18n.T("common.flag.registry"))
ciCmd.Flags().StringVarP(&ciBranch, "branch", "b", "main", i18n.T("cmd.dev.ci.flag.branch")) ciCmd.Flags().StringVarP(&ciBranch, "branch", "b", "main", i18n.T("cmd.dev.ci.flag.branch"))
ciCmd.Flags().BoolVar(&ciFailedOnly, "failed", false, i18n.T("cmd.dev.ci.flag.failed")) ciCmd.Flags().BoolVar(&ciFailedOnly, "failed", false, i18n.T("cmd.dev.ci.flag.failed"))
@ -154,7 +154,7 @@ func runCI(registryPath string, branch string, failedOnly bool) error {
fmt.Printf(" * %s", ciFailureStyle.Render(i18n.T("cmd.dev.ci.failing", map[string]interface{}{"Count": failed}))) fmt.Printf(" * %s", ciFailureStyle.Render(i18n.T("cmd.dev.ci.failing", map[string]interface{}{"Count": failed})))
} }
if pending > 0 { if pending > 0 {
fmt.Printf(" * %s", ciPendingStyle.Render(i18n.T("cmd.dev.ci.pending", map[string]interface{}{"Count": pending}))) fmt.Printf(" * %s", ciPendingStyle.Render(i18n.T("common.count.pending", map[string]interface{}{"Count": pending})))
} }
if len(noCI) > 0 { if len(noCI) > 0 {
fmt.Printf(" * %s", ciSkippedStyle.Render(i18n.T("cmd.dev.ci.no_ci", map[string]interface{}{"Count": len(noCI)}))) fmt.Printf(" * %s", ciSkippedStyle.Render(i18n.T("cmd.dev.ci.no_ci", map[string]interface{}{"Count": len(noCI)})))
@ -182,7 +182,7 @@ func runCI(registryPath string, branch string, failedOnly bool) error {
if len(fetchErrors) > 0 { if len(fetchErrors) > 0 {
fmt.Println() fmt.Println()
for _, err := range fetchErrors { for _, err := range fetchErrors {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.dev.ci.error_label")), err) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.error")), err)
} }
} }

View file

@ -30,7 +30,7 @@ func addCommitCommand(parent *cobra.Command) {
}, },
} }
commitCmd.Flags().StringVar(&commitRegistryPath, "registry", "", i18n.T("cmd.dev.commit.flag.registry")) commitCmd.Flags().StringVar(&commitRegistryPath, "registry", "", i18n.T("common.flag.registry"))
commitCmd.Flags().BoolVar(&commitAll, "all", false, i18n.T("cmd.dev.commit.flag.all")) commitCmd.Flags().BoolVar(&commitAll, "all", false, i18n.T("cmd.dev.commit.flag.all"))
parent.AddCommand(commitCmd) parent.AddCommand(commitCmd)
@ -54,7 +54,7 @@ func runCommit(registryPath string, all bool) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to load registry: %w", err) return fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
registryPath, err = repos.FindRegistry() registryPath, err = repos.FindRegistry()
if err == nil { if err == nil {
@ -62,7 +62,7 @@ func runCommit(registryPath string, all bool) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to load registry: %w", err) return fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
// Fallback: scan current directory for repos // Fallback: scan current directory for repos
reg, err = repos.ScanDirectory(cwd) reg, err = repos.ScanDirectory(cwd)
@ -154,7 +154,7 @@ func runCommit(registryPath string, all bool) error {
// Summary // Summary
fmt.Printf("%s", successStyle.Render(i18n.T("cmd.dev.done_succeeded", map[string]interface{}{"Count": succeeded}))) fmt.Printf("%s", successStyle.Render(i18n.T("cmd.dev.done_succeeded", map[string]interface{}{"Count": succeeded})))
if failed > 0 { if failed > 0 {
fmt.Printf(", %s", errorStyle.Render(i18n.T("cmd.dev.count_failed", map[string]interface{}{"Count": failed}))) fmt.Printf(", %s", errorStyle.Render(i18n.T("common.count.failed", map[string]interface{}{"Count": failed})))
} }
fmt.Println() fmt.Println()

View file

@ -30,7 +30,7 @@ func addHealthCommand(parent *cobra.Command) {
}, },
} }
healthCmd.Flags().StringVar(&healthRegistryPath, "registry", "", i18n.T("cmd.dev.health.flag.registry")) healthCmd.Flags().StringVar(&healthRegistryPath, "registry", "", i18n.T("common.flag.registry"))
healthCmd.Flags().BoolVarP(&healthVerbose, "verbose", "v", false, i18n.T("cmd.dev.health.flag.verbose")) healthCmd.Flags().BoolVarP(&healthVerbose, "verbose", "v", false, i18n.T("cmd.dev.health.flag.verbose"))
parent.AddCommand(healthCmd) parent.AddCommand(healthCmd)
@ -149,7 +149,7 @@ func printHealthSummary(total int, dirty, ahead, behind, errors []string) {
// Dirty status // Dirty status
if len(dirty) > 0 { if len(dirty) > 0 {
parts = append(parts, cli.StatusPart(len(dirty), i18n.T("cmd.dev.health.dirty"), cli.WarningStyle)) parts = append(parts, cli.StatusPart(len(dirty), i18n.T("common.status.dirty"), cli.WarningStyle))
} else { } else {
parts = append(parts, cli.StatusText(i18n.T("cmd.dev.status.clean"), cli.SuccessStyle)) parts = append(parts, cli.StatusText(i18n.T("cmd.dev.status.clean"), cli.SuccessStyle))
} }
@ -158,14 +158,14 @@ func printHealthSummary(total int, dirty, ahead, behind, errors []string) {
if len(ahead) > 0 { if len(ahead) > 0 {
parts = append(parts, cli.StatusPart(len(ahead), i18n.T("cmd.dev.health.to_push"), cli.ValueStyle)) parts = append(parts, cli.StatusPart(len(ahead), i18n.T("cmd.dev.health.to_push"), cli.ValueStyle))
} else { } else {
parts = append(parts, cli.StatusText(i18n.T("cmd.dev.health.synced"), cli.SuccessStyle)) parts = append(parts, cli.StatusText(i18n.T("common.status.synced"), cli.SuccessStyle))
} }
// Pull status // Pull status
if len(behind) > 0 { if len(behind) > 0 {
parts = append(parts, cli.StatusPart(len(behind), i18n.T("cmd.dev.health.to_pull"), cli.WarningStyle)) parts = append(parts, cli.StatusPart(len(behind), i18n.T("cmd.dev.health.to_pull"), cli.WarningStyle))
} else { } else {
parts = append(parts, cli.StatusText(i18n.T("cmd.dev.health.up_to_date"), cli.SuccessStyle)) parts = append(parts, cli.StatusText(i18n.T("common.status.up_to_date"), cli.SuccessStyle))
} }
// Errors (only if any) // Errors (only if any)

View file

@ -32,7 +32,7 @@ func addImpactCommand(parent *cobra.Command) {
}, },
} }
impactCmd.Flags().StringVar(&impactRegistryPath, "registry", "", i18n.T("cmd.dev.impact.flag.registry")) impactCmd.Flags().StringVar(&impactRegistryPath, "registry", "", i18n.T("common.flag.registry"))
parent.AddCommand(impactCmd) parent.AddCommand(impactCmd)
} }
@ -138,7 +138,7 @@ func runImpact(registryPath string, repoName string) error {
// Summary // Summary
fmt.Printf("%s %s\n", fmt.Printf("%s %s\n",
dimStyle.Render(i18n.T("cmd.dev.impact.summary")), dimStyle.Render(i18n.T("common.label.summary")),
i18n.T("cmd.dev.impact.changes_affect", map[string]interface{}{ i18n.T("cmd.dev.impact.changes_affect", map[string]interface{}{
"Repo": repoNameStyle.Render(repoName), "Repo": repoNameStyle.Render(repoName),
"Affected": len(allAffected), "Affected": len(allAffected),

View file

@ -72,7 +72,7 @@ func addIssuesCommand(parent *cobra.Command) {
}, },
} }
issuesCmd.Flags().StringVar(&issuesRegistryPath, "registry", "", i18n.T("cmd.dev.issues.flag.registry")) issuesCmd.Flags().StringVar(&issuesRegistryPath, "registry", "", i18n.T("common.flag.registry"))
issuesCmd.Flags().IntVarP(&issuesLimit, "limit", "l", 10, i18n.T("cmd.dev.issues.flag.limit")) issuesCmd.Flags().IntVarP(&issuesLimit, "limit", "l", 10, i18n.T("cmd.dev.issues.flag.limit"))
issuesCmd.Flags().StringVarP(&issuesAssignee, "assignee", "a", "", i18n.T("cmd.dev.issues.flag.assignee")) issuesCmd.Flags().StringVarP(&issuesAssignee, "assignee", "a", "", i18n.T("cmd.dev.issues.flag.assignee"))
@ -150,7 +150,7 @@ func runIssues(registryPath string, limit int, assignee string) error {
if len(fetchErrors) > 0 { if len(fetchErrors) > 0 {
fmt.Println() fmt.Println()
for _, err := range fetchErrors { for _, err := range fetchErrors {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.dev.issues.error_label")), err) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.error")), err)
} }
} }

View file

@ -29,7 +29,7 @@ func addPullCommand(parent *cobra.Command) {
}, },
} }
pullCmd.Flags().StringVar(&pullRegistryPath, "registry", "", i18n.T("cmd.dev.pull.flag.registry")) pullCmd.Flags().StringVar(&pullRegistryPath, "registry", "", i18n.T("common.flag.registry"))
pullCmd.Flags().BoolVar(&pullAll, "all", false, i18n.T("cmd.dev.pull.flag.all")) pullCmd.Flags().BoolVar(&pullAll, "all", false, i18n.T("cmd.dev.pull.flag.all"))
parent.AddCommand(pullCmd) parent.AddCommand(pullCmd)
@ -47,7 +47,7 @@ func runPull(registryPath string, all bool) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to load registry: %w", err) return fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
registryPath, err = repos.FindRegistry() registryPath, err = repos.FindRegistry()
if err == nil { if err == nil {
@ -55,7 +55,7 @@ func runPull(registryPath string, all bool) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to load registry: %w", err) return fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
// Fallback: scan current directory // Fallback: scan current directory
cwd, _ := os.Getwd() cwd, _ := os.Getwd()
@ -138,7 +138,7 @@ func runPull(registryPath string, all bool) error {
fmt.Println() fmt.Println()
fmt.Printf("%s", successStyle.Render(i18n.T("cmd.dev.pull.done_pulled", map[string]interface{}{"Count": succeeded}))) fmt.Printf("%s", successStyle.Render(i18n.T("cmd.dev.pull.done_pulled", map[string]interface{}{"Count": succeeded})))
if failed > 0 { if failed > 0 {
fmt.Printf(", %s", errorStyle.Render(i18n.T("cmd.dev.count_failed", map[string]interface{}{"Count": failed}))) fmt.Printf(", %s", errorStyle.Render(i18n.T("common.count.failed", map[string]interface{}{"Count": failed})))
} }
fmt.Println() fmt.Println()

View file

@ -30,7 +30,7 @@ func addPushCommand(parent *cobra.Command) {
}, },
} }
pushCmd.Flags().StringVar(&pushRegistryPath, "registry", "", i18n.T("cmd.dev.push.flag.registry")) pushCmd.Flags().StringVar(&pushRegistryPath, "registry", "", i18n.T("common.flag.registry"))
pushCmd.Flags().BoolVarP(&pushForce, "force", "f", false, i18n.T("cmd.dev.push.flag.force")) pushCmd.Flags().BoolVarP(&pushForce, "force", "f", false, i18n.T("cmd.dev.push.flag.force"))
parent.AddCommand(pushCmd) parent.AddCommand(pushCmd)
@ -54,7 +54,7 @@ func runPush(registryPath string, force bool) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to load registry: %w", err) return fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
registryPath, err = repos.FindRegistry() registryPath, err = repos.FindRegistry()
if err == nil { if err == nil {
@ -62,7 +62,7 @@ func runPush(registryPath string, force bool) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to load registry: %w", err) return fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
// Fallback: scan current directory for repos // Fallback: scan current directory for repos
reg, err = repos.ScanDirectory(cwd) reg, err = repos.ScanDirectory(cwd)
@ -109,12 +109,12 @@ func runPush(registryPath string, force bool) error {
} }
// Show repos to push // Show repos to push
fmt.Printf("\n%s\n\n", i18n.T("cmd.dev.push.repos_with_unpushed", map[string]interface{}{"Count": len(aheadRepos)})) fmt.Printf("\n%s\n\n", i18n.T("common.count.repos_unpushed", map[string]interface{}{"Count": len(aheadRepos)}))
totalCommits := 0 totalCommits := 0
for _, s := range aheadRepos { for _, s := range aheadRepos {
fmt.Printf(" %s: %s\n", fmt.Printf(" %s: %s\n",
repoNameStyle.Render(s.Name), repoNameStyle.Render(s.Name),
aheadStyle.Render(i18n.T("cmd.dev.push.commits_count", map[string]interface{}{"Count": s.Ahead})), aheadStyle.Render(i18n.T("common.count.commits", map[string]interface{}{"Count": s.Ahead})),
) )
totalCommits += s.Ahead totalCommits += s.Ahead
} }
@ -185,7 +185,7 @@ func runPush(registryPath string, force bool) error {
fmt.Println() fmt.Println()
fmt.Printf("%s", successStyle.Render(i18n.T("cmd.dev.push.done_pushed", map[string]interface{}{"Count": succeeded}))) fmt.Printf("%s", successStyle.Render(i18n.T("cmd.dev.push.done_pushed", map[string]interface{}{"Count": succeeded})))
if failed > 0 { if failed > 0 {
fmt.Printf(", %s", errorStyle.Render(i18n.T("cmd.dev.count_failed", map[string]interface{}{"Count": failed}))) fmt.Printf(", %s", errorStyle.Render(i18n.T("common.count.failed", map[string]interface{}{"Count": failed})))
} }
fmt.Println() fmt.Println()
@ -255,7 +255,7 @@ func runPushSingleRepo(ctx context.Context, repoPath string, force bool) error {
// Show commits to push // Show commits to push
fmt.Printf("%s: %s\n", repoNameStyle.Render(s.Name), fmt.Printf("%s: %s\n", repoNameStyle.Render(s.Name),
aheadStyle.Render(i18n.T("cmd.dev.push.commits_count", map[string]interface{}{"Count": s.Ahead}))) aheadStyle.Render(i18n.T("common.count.commits", map[string]interface{}{"Count": s.Ahead})))
// Confirm unless --force // Confirm unless --force
if !force { if !force {

View file

@ -69,7 +69,7 @@ func addReviewsCommand(parent *cobra.Command) {
}, },
} }
reviewsCmd.Flags().StringVar(&reviewsRegistryPath, "registry", "", i18n.T("cmd.dev.reviews.flag.registry")) reviewsCmd.Flags().StringVar(&reviewsRegistryPath, "registry", "", i18n.T("common.flag.registry"))
reviewsCmd.Flags().StringVar(&reviewsAuthor, "author", "", i18n.T("cmd.dev.reviews.flag.author")) reviewsCmd.Flags().StringVar(&reviewsAuthor, "author", "", i18n.T("cmd.dev.reviews.flag.author"))
reviewsCmd.Flags().BoolVar(&reviewsShowAll, "all", false, i18n.T("cmd.dev.reviews.flag.all")) reviewsCmd.Flags().BoolVar(&reviewsShowAll, "all", false, i18n.T("cmd.dev.reviews.flag.all"))
@ -166,7 +166,7 @@ func runReviews(registryPath string, author string, showAll bool) error {
fmt.Println() fmt.Println()
fmt.Printf("%s", i18n.T("cmd.dev.reviews.open_prs", map[string]interface{}{"Count": len(allPRs)})) fmt.Printf("%s", i18n.T("cmd.dev.reviews.open_prs", map[string]interface{}{"Count": len(allPRs)}))
if pending > 0 { if pending > 0 {
fmt.Printf(" * %s", prPendingStyle.Render(i18n.T("cmd.dev.reviews.pending", map[string]interface{}{"Count": pending}))) fmt.Printf(" * %s", prPendingStyle.Render(i18n.T("common.count.pending", map[string]interface{}{"Count": pending})))
} }
if approved > 0 { if approved > 0 {
fmt.Printf(" * %s", prApprovedStyle.Render(i18n.T("cmd.dev.reviews.approved", map[string]interface{}{"Count": approved}))) fmt.Printf(" * %s", prApprovedStyle.Render(i18n.T("cmd.dev.reviews.approved", map[string]interface{}{"Count": approved})))
@ -185,7 +185,7 @@ func runReviews(registryPath string, author string, showAll bool) error {
if len(fetchErrors) > 0 { if len(fetchErrors) > 0 {
fmt.Println() fmt.Println()
for _, err := range fetchErrors { for _, err := range fetchErrors {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.dev.issues.error_label")), err) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.error")), err)
} }
} }

View file

@ -24,7 +24,7 @@ func addSyncCommand(parent *cobra.Command) {
Long: i18n.T("cmd.dev.sync.long"), Long: i18n.T("cmd.dev.sync.long"),
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
if err := runSync(); err != nil { if err := runSync(); err != nil {
return fmt.Errorf("%s %w", i18n.T("cmd.dev.sync.error_prefix"), err) return fmt.Errorf("%s %w", i18n.T("common.label.error"), err)
} }
fmt.Println(i18n.T("cmd.dev.sync.success")) fmt.Println(i18n.T("cmd.dev.sync.success"))
return nil return nil

View file

@ -52,7 +52,7 @@ func runVMInstall() error {
return nil return nil
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.image_label")), devops.ImageName()) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.image")), devops.ImageName())
fmt.Println() fmt.Println()
fmt.Println(i18n.T("cmd.dev.vm.downloading")) fmt.Println(i18n.T("cmd.dev.vm.downloading"))
fmt.Println() fmt.Println()
@ -185,7 +185,7 @@ func runVMStop() error {
return err return err
} }
fmt.Println(successStyle.Render(i18n.T("cmd.dev.vm.stopped"))) fmt.Println(successStyle.Render(i18n.T("common.status.stopped")))
return nil return nil
} }
@ -222,7 +222,7 @@ func runVMStatus() error {
if status.Installed { if status.Installed {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.installed_label")), successStyle.Render(i18n.T("cmd.dev.vm.installed_yes"))) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.installed_label")), successStyle.Render(i18n.T("cmd.dev.vm.installed_yes")))
if status.ImageVersion != "" { if status.ImageVersion != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.version_label")), status.ImageVersion) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.version")), status.ImageVersion)
} }
} else { } else {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.installed_label")), errorStyle.Render(i18n.T("cmd.dev.vm.installed_no"))) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.installed_label")), errorStyle.Render(i18n.T("cmd.dev.vm.installed_no")))
@ -235,14 +235,14 @@ func runVMStatus() error {
// Running status // Running status
if status.Running { if status.Running {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.status_label")), successStyle.Render(i18n.T("cmd.dev.vm.status_running"))) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.status")), successStyle.Render(i18n.T("common.status.running")))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.container_label")), status.ContainerID[:8]) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.container_label")), status.ContainerID[:8])
fmt.Printf("%s %dMB\n", dimStyle.Render(i18n.T("cmd.dev.vm.memory_label")), status.Memory) fmt.Printf("%s %dMB\n", dimStyle.Render(i18n.T("cmd.dev.vm.memory_label")), status.Memory)
fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.dev.vm.cpus_label")), status.CPUs) fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.dev.vm.cpus_label")), status.CPUs)
fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.dev.vm.ssh_port")), status.SSHPort) fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.dev.vm.ssh_port")), status.SSHPort)
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.uptime_label")), formatVMUptime(status.Uptime)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.uptime_label")), formatVMUptime(status.Uptime))
} else { } else {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.status_label")), dimStyle.Render(i18n.T("cmd.dev.vm.status_stopped"))) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.status")), dimStyle.Render(i18n.T("common.status.stopped")))
fmt.Println() fmt.Println()
fmt.Println(i18n.T("cmd.dev.vm.start_with", map[string]interface{}{"Command": dimStyle.Render("core dev boot")})) fmt.Println(i18n.T("cmd.dev.vm.start_with", map[string]interface{}{"Command": dimStyle.Render("core dev boot")}))
} }
@ -452,7 +452,7 @@ func runVMUpdate(apply bool) error {
ctx := context.Background() ctx := context.Background()
fmt.Println(i18n.T("cmd.dev.vm.checking_updates")) fmt.Println(i18n.T("common.progress.checking_updates"))
fmt.Println() fmt.Println()
current, latest, hasUpdate, err := d.CheckUpdate(ctx) current, latest, hasUpdate, err := d.CheckUpdate(ctx)
@ -460,7 +460,7 @@ func runVMUpdate(apply bool) error {
return fmt.Errorf("failed to check for updates: %w", err) return fmt.Errorf("failed to check for updates: %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.current_label")), valueStyle.Render(current)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.current")), valueStyle.Render(current))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.latest_label")), valueStyle.Render(latest)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.dev.vm.latest_label")), valueStyle.Render(latest))
fmt.Println() fmt.Println()

View file

@ -36,7 +36,7 @@ func addWorkCommand(parent *cobra.Command) {
workCmd.Flags().BoolVar(&workStatusOnly, "status", false, i18n.T("cmd.dev.work.flag.status")) workCmd.Flags().BoolVar(&workStatusOnly, "status", false, i18n.T("cmd.dev.work.flag.status"))
workCmd.Flags().BoolVar(&workAutoCommit, "commit", false, i18n.T("cmd.dev.work.flag.commit")) workCmd.Flags().BoolVar(&workAutoCommit, "commit", false, i18n.T("cmd.dev.work.flag.commit"))
workCmd.Flags().StringVar(&workRegistryPath, "registry", "", i18n.T("cmd.dev.work.flag.registry")) workCmd.Flags().StringVar(&workRegistryPath, "registry", "", i18n.T("common.flag.registry"))
parent.AddCommand(workCmd) parent.AddCommand(workCmd)
} }
@ -162,9 +162,9 @@ func runWork(registryPath string, statusOnly, autoCommit bool) error {
} }
fmt.Println() fmt.Println()
fmt.Printf("%s\n", i18n.T("cmd.dev.work.repos_with_unpushed", map[string]interface{}{"Count": len(aheadRepos)})) fmt.Printf("%s\n", i18n.T("common.count.repos_unpushed", map[string]interface{}{"Count": len(aheadRepos)}))
for _, s := range aheadRepos { for _, s := range aheadRepos {
fmt.Printf(" %s: %s\n", s.Name, i18n.T("cmd.dev.work.commits_count", map[string]interface{}{"Count": s.Ahead})) fmt.Printf(" %s: %s\n", s.Name, i18n.T("common.count.commits", map[string]interface{}{"Count": s.Ahead}))
} }
fmt.Println() fmt.Println()
@ -244,7 +244,7 @@ func printStatusTable(statuses []git.RepoStatus) {
// Print header with fixed-width formatting // Print header with fixed-width formatting
fmt.Printf("%-*s %8s %9s %6s %5s\n", fmt.Printf("%-*s %8s %9s %6s %5s\n",
nameWidth, nameWidth,
cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_repo")), cli.TitleStyle.Render(i18n.T("common.label.repo")),
cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_modified")), cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_modified")),
cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_untracked")), cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_untracked")),
cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_staged")), cli.TitleStyle.Render(i18n.T("cmd.dev.work.table_staged")),
@ -341,7 +341,7 @@ func loadRegistry(registryPath string) ([]string, map[string]string, error) {
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("failed to load registry: %w", err) return nil, nil, fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
registryPath, err = repos.FindRegistry() registryPath, err = repos.FindRegistry()
if err == nil { if err == nil {
@ -349,7 +349,7 @@ func loadRegistry(registryPath string) ([]string, map[string]string, error) {
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("failed to load registry: %w", err) return nil, nil, fmt.Errorf("failed to load registry: %w", err)
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.dev.registry_label")), registryPath) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
} else { } else {
// Fallback: scan current directory // Fallback: scan current directory
cwd, _ := os.Getwd() cwd, _ := os.Getwd()

View file

@ -22,7 +22,7 @@ var docsListCmd = &cobra.Command{
} }
func init() { func init() {
docsListCmd.Flags().StringVar(&docsListRegistryPath, "registry", "", i18n.T("cmd.docs.list.flag.registry")) docsListCmd.Flags().StringVar(&docsListRegistryPath, "registry", "", i18n.T("common.flag.registry"))
} }
func runDocsList(registryPath string) error { func runDocsList(registryPath string) error {
@ -32,7 +32,7 @@ func runDocsList(registryPath string) error {
} }
fmt.Printf("\n%-20s %-8s %-8s %-10s %s\n", fmt.Printf("\n%-20s %-8s %-8s %-10s %s\n",
headerStyle.Render(i18n.T("cmd.docs.list.header.repo")), headerStyle.Render(i18n.T("common.label.repo")),
headerStyle.Render(i18n.T("cmd.docs.list.header.readme")), headerStyle.Render(i18n.T("cmd.docs.list.header.readme")),
headerStyle.Render(i18n.T("cmd.docs.list.header.claude")), headerStyle.Render(i18n.T("cmd.docs.list.header.claude")),
headerStyle.Render(i18n.T("cmd.docs.list.header.changelog")), headerStyle.Render(i18n.T("cmd.docs.list.header.changelog")),
@ -50,7 +50,7 @@ func runDocsList(registryPath string) error {
docsDir := cli.CheckMark(false) docsDir := cli.CheckMark(false)
if len(info.DocsFiles) > 0 { if len(info.DocsFiles) > 0 {
docsDir = docsFoundStyle.Render(i18n.T("cmd.docs.list.files_count", map[string]interface{}{"Count": len(info.DocsFiles)})) docsDir = docsFoundStyle.Render(i18n.T("common.count.files", map[string]interface{}{"Count": len(info.DocsFiles)}))
} }
fmt.Printf("%-20s %-8s %-8s %-10s %s\n", fmt.Printf("%-20s %-8s %-8s %-10s %s\n",
@ -70,7 +70,7 @@ func runDocsList(registryPath string) error {
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", fmt.Printf("%s %s\n",
cli.Label(i18n.T("cmd.docs.list.coverage_label")), cli.Label(i18n.T("common.label.coverage")),
i18n.T("cmd.docs.list.coverage_summary", map[string]interface{}{"WithDocs": withDocs, "WithoutDocs": withoutDocs}), i18n.T("cmd.docs.list.coverage_summary", map[string]interface{}{"WithDocs": withDocs, "WithoutDocs": withoutDocs}),
) )

View file

@ -27,7 +27,7 @@ var docsSyncCmd = &cobra.Command{
} }
func init() { func init() {
docsSyncCmd.Flags().StringVar(&docsSyncRegistryPath, "registry", "", i18n.T("cmd.docs.sync.flag.registry")) docsSyncCmd.Flags().StringVar(&docsSyncRegistryPath, "registry", "", i18n.T("common.flag.registry"))
docsSyncCmd.Flags().BoolVar(&docsSyncDryRun, "dry-run", false, i18n.T("cmd.docs.sync.flag.dry_run")) docsSyncCmd.Flags().BoolVar(&docsSyncDryRun, "dry-run", false, i18n.T("cmd.docs.sync.flag.dry_run"))
docsSyncCmd.Flags().StringVar(&docsSyncOutputDir, "output", "", i18n.T("cmd.docs.sync.flag.output")) docsSyncCmd.Flags().StringVar(&docsSyncOutputDir, "output", "", i18n.T("cmd.docs.sync.flag.output"))
} }
@ -105,7 +105,7 @@ func runDocsSync(registryPath string, outputDir string, dryRun bool) error {
} }
fmt.Printf("\n%s %s\n", fmt.Printf("\n%s %s\n",
dimStyle.Render(i18n.T("cmd.docs.sync.total_label")), dimStyle.Render(i18n.T("common.label.total")),
i18n.T("cmd.docs.sync.total_summary", map[string]interface{}{"Files": totalFiles, "Repos": len(docsInfo), "Output": outputDir})) i18n.T("cmd.docs.sync.total_summary", map[string]interface{}{"Files": totalFiles, "Repos": len(docsInfo), "Output": outputDir}))
if dryRun { if dryRun {
@ -150,7 +150,7 @@ func runDocsSync(registryPath string, outputDir string, dryRun bool) error {
synced++ synced++
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.docs.sync.done_label")), i18n.T("cmd.docs.sync.synced_packages", map[string]interface{}{"Count": synced})) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.docs.sync.synced_packages", map[string]interface{}{"Count": synced}))
return nil return nil
} }

View file

@ -47,7 +47,7 @@ func addGoFmtCommand(parent *cobra.Command) {
} }
fmtCmd.Flags().BoolVar(&fmtFix, "fix", false, i18n.T("cmd.go.fmt.flag.fix")) fmtCmd.Flags().BoolVar(&fmtFix, "fix", false, i18n.T("cmd.go.fmt.flag.fix"))
fmtCmd.Flags().BoolVar(&fmtDiff, "diff", false, i18n.T("cmd.go.fmt.flag.diff")) fmtCmd.Flags().BoolVar(&fmtDiff, "diff", false, i18n.T("common.flag.diff"))
fmtCmd.Flags().BoolVar(&fmtCheck, "check", false, i18n.T("cmd.go.fmt.flag.check")) fmtCmd.Flags().BoolVar(&fmtCheck, "check", false, i18n.T("cmd.go.fmt.flag.check"))
parent.AddCommand(fmtCmd) parent.AddCommand(fmtCmd)

View file

@ -33,13 +33,13 @@ func addGoTestCommand(parent *cobra.Command) {
}, },
} }
testCmd.Flags().BoolVar(&testCoverage, "coverage", false, i18n.T("cmd.go.test.flag.coverage")) testCmd.Flags().BoolVar(&testCoverage, "coverage", false, i18n.T("common.flag.coverage"))
testCmd.Flags().StringVar(&testPkg, "pkg", "", i18n.T("cmd.go.test.flag.pkg")) testCmd.Flags().StringVar(&testPkg, "pkg", "", i18n.T("common.flag.pkg"))
testCmd.Flags().StringVar(&testRun, "run", "", i18n.T("cmd.go.test.flag.run")) testCmd.Flags().StringVar(&testRun, "run", "", i18n.T("cmd.go.test.flag.run"))
testCmd.Flags().BoolVar(&testShort, "short", false, i18n.T("cmd.go.test.flag.short")) testCmd.Flags().BoolVar(&testShort, "short", false, i18n.T("cmd.go.test.flag.short"))
testCmd.Flags().BoolVar(&testRace, "race", false, i18n.T("cmd.go.test.flag.race")) testCmd.Flags().BoolVar(&testRace, "race", false, i18n.T("cmd.go.test.flag.race"))
testCmd.Flags().BoolVar(&testJSON, "json", false, i18n.T("cmd.go.test.flag.json")) testCmd.Flags().BoolVar(&testJSON, "json", false, i18n.T("cmd.go.test.flag.json"))
testCmd.Flags().BoolVarP(&testVerbose, "verbose", "v", false, i18n.T("cmd.go.test.flag.verbose")) testCmd.Flags().BoolVarP(&testVerbose, "verbose", "v", false, i18n.T("common.flag.verbose"))
parent.AddCommand(testCmd) parent.AddCommand(testCmd)
} }
@ -73,8 +73,8 @@ func runGoTest(coverage bool, pkg, run string, short, race, jsonOut, verbose boo
args = append(args, pkg) args = append(args, pkg)
if !jsonOut { if !jsonOut {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.go.test.label")), i18n.T("cmd.go.test.running")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.test")), i18n.T("common.result.running_tests"))
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.go.test.package_label")), pkg) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("common.label.package")), pkg)
fmt.Println() fmt.Println()
} }
@ -113,7 +113,7 @@ func runGoTest(coverage bool, pkg, run string, short, race, jsonOut, verbose boo
// Summary // Summary
if err == nil { if err == nil {
fmt.Printf(" %s %s\n", successStyle.Render("✓"), i18n.T("cmd.go.test.passed", map[string]interface{}{"Count": passed})) fmt.Printf(" %s %s\n", successStyle.Render("✓"), i18n.T("common.count.passed", map[string]interface{}{"Count": passed}))
} else { } else {
fmt.Printf(" %s %s\n", errorStyle.Render("✗"), i18n.T("cmd.go.test.passed_failed", map[string]interface{}{"Passed": passed, "Failed": failed})) fmt.Printf(" %s %s\n", errorStyle.Render("✗"), i18n.T("cmd.go.test.passed_failed", map[string]interface{}{"Passed": passed, "Failed": failed}))
} }
@ -193,13 +193,13 @@ func addGoCovCommand(parent *cobra.Command) {
covFile.Close() covFile.Close()
defer os.Remove(covPath) defer os.Remove(covPath)
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.go.cov.label")), i18n.T("cmd.go.cov.running")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.coverage")), i18n.T("cmd.go.cov.running"))
// Truncate package list if too long for display // Truncate package list if too long for display
displayPkg := pkg displayPkg := pkg
if len(displayPkg) > 60 { if len(displayPkg) > 60 {
displayPkg = displayPkg[:57] + "..." displayPkg = displayPkg[:57] + "..."
} }
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.go.test.package_label")), displayPkg) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("common.label.package")), displayPkg)
fmt.Println() fmt.Println()
// Run tests with coverage // Run tests with coverage
@ -287,7 +287,7 @@ func addGoCovCommand(parent *cobra.Command) {
}, },
} }
covCmd.Flags().StringVar(&covPkg, "pkg", "", i18n.T("cmd.go.cov.flag.pkg")) covCmd.Flags().StringVar(&covPkg, "pkg", "", i18n.T("common.flag.pkg"))
covCmd.Flags().BoolVar(&covHTML, "html", false, i18n.T("cmd.go.cov.flag.html")) covCmd.Flags().BoolVar(&covHTML, "html", false, i18n.T("cmd.go.cov.flag.html"))
covCmd.Flags().BoolVar(&covOpen, "open", false, i18n.T("cmd.go.cov.flag.open")) covCmd.Flags().BoolVar(&covOpen, "open", false, i18n.T("cmd.go.cov.flag.open"))
covCmd.Flags().Float64Var(&covThreshold, "threshold", 0, i18n.T("cmd.go.cov.flag.threshold")) covCmd.Flags().Float64Var(&covThreshold, "threshold", 0, i18n.T("cmd.go.cov.flag.threshold"))

View file

@ -38,8 +38,8 @@ func addGoInstallCommand(parent *cobra.Command) {
} }
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.go.install.label")), i18n.T("cmd.go.install.installing")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.install")), i18n.T("common.status.installing"))
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.go.install.path_label")), installPath) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("common.label.path")), installPath)
if installNoCgo { if installNoCgo {
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.go.install.cgo_label")), i18n.T("cmd.go.install.cgo_disabled")) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.go.install.cgo_label")), i18n.T("cmd.go.install.cgo_disabled"))
} }
@ -75,7 +75,7 @@ func addGoInstallCommand(parent *cobra.Command) {
}, },
} }
installCmd.Flags().BoolVarP(&installVerbose, "verbose", "v", false, i18n.T("cmd.go.install.flag.verbose")) installCmd.Flags().BoolVarP(&installVerbose, "verbose", "v", false, i18n.T("common.flag.verbose"))
installCmd.Flags().BoolVar(&installNoCgo, "no-cgo", false, i18n.T("cmd.go.install.flag.no_cgo")) installCmd.Flags().BoolVar(&installNoCgo, "no-cgo", false, i18n.T("cmd.go.install.flag.no_cgo"))
parent.AddCommand(installCmd) parent.AddCommand(installCmd)

View file

@ -31,7 +31,7 @@ func addPHPBuildCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
ctx := context.Background() ctx := context.Background()
@ -57,7 +57,7 @@ func addPHPBuildCommand(parent *cobra.Command) {
buildCmd.Flags().StringVar(&buildType, "type", "", i18n.T("cmd.php.build.flag.type")) buildCmd.Flags().StringVar(&buildType, "type", "", i18n.T("cmd.php.build.flag.type"))
buildCmd.Flags().StringVar(&buildImageName, "name", "", i18n.T("cmd.php.build.flag.name")) buildCmd.Flags().StringVar(&buildImageName, "name", "", i18n.T("cmd.php.build.flag.name"))
buildCmd.Flags().StringVar(&buildTag, "tag", "", i18n.T("cmd.php.build.flag.tag")) buildCmd.Flags().StringVar(&buildTag, "tag", "", i18n.T("common.flag.tag"))
buildCmd.Flags().StringVar(&buildPlatform, "platform", "", i18n.T("cmd.php.build.flag.platform")) buildCmd.Flags().StringVar(&buildPlatform, "platform", "", i18n.T("cmd.php.build.flag.platform"))
buildCmd.Flags().StringVar(&buildDockerfile, "dockerfile", "", i18n.T("cmd.php.build.flag.dockerfile")) buildCmd.Flags().StringVar(&buildDockerfile, "dockerfile", "", i18n.T("cmd.php.build.flag.dockerfile"))
buildCmd.Flags().StringVar(&buildOutputPath, "output", "", i18n.T("cmd.php.build.flag.output")) buildCmd.Flags().StringVar(&buildOutputPath, "output", "", i18n.T("cmd.php.build.flag.output"))
@ -128,17 +128,17 @@ func runPHPBuildDocker(ctx context.Context, projectDir string, opts dockerBuildO
buildOpts.Tag = "latest" buildOpts.Tag = "latest"
} }
fmt.Printf("%s %s:%s\n", dimStyle.Render(i18n.T("cmd.php.build.image")), buildOpts.ImageName, buildOpts.Tag) fmt.Printf("%s %s:%s\n", dimStyle.Render(i18n.T("common.label.image")), buildOpts.ImageName, buildOpts.Tag)
if opts.Platform != "" { if opts.Platform != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.build.platform")), opts.Platform) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.build.platform")), opts.Platform)
} }
fmt.Println() fmt.Println()
if err := phppkg.BuildDocker(ctx, buildOpts); err != nil { if err := phppkg.BuildDocker(ctx, buildOpts); err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.build_failed"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.build_failed"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.build.docker_success")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.build.docker_success"))
fmt.Printf("%s docker run -p 80:80 -p 443:443 %s:%s\n", fmt.Printf("%s docker run -p 80:80 -p 443:443 %s:%s\n",
dimStyle.Render(i18n.T("cmd.php.build.docker_run_with")), dimStyle.Render(i18n.T("cmd.php.build.docker_run_with")),
buildOpts.ImageName, buildOpts.Tag) buildOpts.ImageName, buildOpts.Tag)
@ -168,15 +168,15 @@ func runPHPBuildLinuxKit(ctx context.Context, projectDir string, opts linuxKitBu
buildOpts.Template = "server-php" buildOpts.Template = "server-php"
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.build.template")), buildOpts.Template) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.template")), buildOpts.Template)
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.build.format")), buildOpts.Format) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.build.format")), buildOpts.Format)
fmt.Println() fmt.Println()
if err := phppkg.BuildLinuxKit(ctx, buildOpts); err != nil { if err := phppkg.BuildLinuxKit(ctx, buildOpts); err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.build_failed"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.build_failed"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.build.linuxkit_success")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.build.linuxkit_success"))
return nil return nil
} }
@ -225,7 +225,7 @@ func addPHPServeCommand(parent *cobra.Command) {
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.serve.running")) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.serve.running"))
fmt.Printf("%s %s:%s\n", dimStyle.Render(i18n.T("cmd.php.build.image")), imageName, func() string { fmt.Printf("%s %s:%s\n", dimStyle.Render(i18n.T("common.label.image")), imageName, func() string {
if serveTag == "" { if serveTag == "" {
return "latest" return "latest"
} }
@ -258,7 +258,7 @@ func addPHPServeCommand(parent *cobra.Command) {
} }
serveCmd.Flags().StringVar(&serveImageName, "name", "", i18n.T("cmd.php.serve.flag.name")) serveCmd.Flags().StringVar(&serveImageName, "name", "", i18n.T("cmd.php.serve.flag.name"))
serveCmd.Flags().StringVar(&serveTag, "tag", "", i18n.T("cmd.php.serve.flag.tag")) serveCmd.Flags().StringVar(&serveTag, "tag", "", i18n.T("common.flag.tag"))
serveCmd.Flags().StringVar(&serveContainerName, "container", "", i18n.T("cmd.php.serve.flag.container")) serveCmd.Flags().StringVar(&serveContainerName, "container", "", i18n.T("cmd.php.serve.flag.container"))
serveCmd.Flags().IntVar(&servePort, "port", 0, i18n.T("cmd.php.serve.flag.port")) serveCmd.Flags().IntVar(&servePort, "port", 0, i18n.T("cmd.php.serve.flag.port"))
serveCmd.Flags().IntVar(&serveHTTPSPort, "https-port", 0, i18n.T("cmd.php.serve.flag.https_port")) serveCmd.Flags().IntVar(&serveHTTPSPort, "https-port", 0, i18n.T("cmd.php.serve.flag.https_port"))

View file

@ -47,7 +47,7 @@ func addPHPDeployCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
env := phppkg.EnvProduction env := phppkg.EnvProduction
@ -75,12 +75,12 @@ func addPHPDeployCommand(parent *cobra.Command) {
if deployWait { if deployWait {
if phppkg.IsDeploymentSuccessful(status.Status) { if phppkg.IsDeploymentSuccessful(status.Status) {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.deploy.success")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.deploy.success"))
} else { } else {
fmt.Printf("\n%s %s\n", errorStyle.Render(i18n.T("cmd.php.label.warning")), i18n.T("cmd.php.deploy.warning_status", map[string]interface{}{"Status": status.Status})) fmt.Printf("\n%s %s\n", errorStyle.Render(i18n.T("common.label.warning")), i18n.T("cmd.php.deploy.warning_status", map[string]interface{}{"Status": status.Status}))
} }
} else { } else {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.deploy.triggered")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.deploy.triggered"))
} }
return nil return nil
@ -107,7 +107,7 @@ func addPHPDeployStatusCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
env := phppkg.EnvProduction env := phppkg.EnvProduction
@ -156,7 +156,7 @@ func addPHPDeployRollbackCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
env := phppkg.EnvProduction env := phppkg.EnvProduction
@ -184,12 +184,12 @@ func addPHPDeployRollbackCommand(parent *cobra.Command) {
if rollbackWait { if rollbackWait {
if phppkg.IsDeploymentSuccessful(status.Status) { if phppkg.IsDeploymentSuccessful(status.Status) {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.deploy_rollback.success")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.deploy_rollback.success"))
} else { } else {
fmt.Printf("\n%s %s\n", errorStyle.Render(i18n.T("cmd.php.label.warning")), i18n.T("cmd.php.deploy_rollback.warning_status", map[string]interface{}{"Status": status.Status})) fmt.Printf("\n%s %s\n", errorStyle.Render(i18n.T("common.label.warning")), i18n.T("cmd.php.deploy_rollback.warning_status", map[string]interface{}{"Status": status.Status}))
} }
} else { } else {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.deploy_rollback.triggered")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.deploy_rollback.triggered"))
} }
return nil return nil
@ -216,7 +216,7 @@ func addPHPDeployListCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
env := phppkg.EnvProduction env := phppkg.EnvProduction
@ -267,14 +267,14 @@ func printDeploymentStatus(status *phppkg.DeploymentStatus) {
statusStyle = phpDeployFailedStyle statusStyle = phpDeployFailedStyle
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.status")), statusStyle.Render(status.Status)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.status")), statusStyle.Render(status.Status))
if status.ID != "" { if status.ID != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.id")), status.ID) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.id")), status.ID)
} }
if status.URL != "" { if status.URL != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.url")), linkStyle.Render(status.URL)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.url")), linkStyle.Render(status.URL))
} }
if status.Branch != "" { if status.Branch != "" {
@ -298,7 +298,7 @@ func printDeploymentStatus(status *phppkg.DeploymentStatus) {
} }
if !status.StartedAt.IsZero() { if !status.StartedAt.IsZero() {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.started")), status.StartedAt.Format(time.RFC3339)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.started")), status.StartedAt.Format(time.RFC3339))
} }
if !status.CompletedAt.IsZero() { if !status.CompletedAt.IsZero() {

View file

@ -155,7 +155,7 @@ func runPHPDev(opts phpDevOptions) error {
// Stream unified logs // Stream unified logs
logsReader, err := server.Logs("", true) logsReader, err := server.Logs("", true)
if err != nil { if err != nil {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.php.label.warning")), i18n.T("cmd.php.dev.logs_failed", map[string]interface{}{"Error": err})) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.warning")), i18n.T("cmd.php.dev.logs_failed", map[string]interface{}{"Error": err}))
} else { } else {
defer logsReader.Close() defer logsReader.Close()
@ -174,10 +174,10 @@ func runPHPDev(opts phpDevOptions) error {
shutdown: shutdown:
// Stop services // Stop services
if err := server.Stop(); err != nil { if err := server.Stop(); err != nil {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.php.label.error")), i18n.T("cmd.php.dev.stop_error", map[string]interface{}{"Error": err})) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.php.dev.stop_error", map[string]interface{}{"Error": err}))
} }
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.dev.all_stopped")) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.dev.all_stopped"))
return nil return nil
} }
@ -196,7 +196,7 @@ func addPHPLogsCommand(parent *cobra.Command) {
}, },
} }
logsCmd.Flags().BoolVar(&logsFollow, "follow", false, i18n.T("cmd.php.logs.flag.follow")) logsCmd.Flags().BoolVar(&logsFollow, "follow", false, i18n.T("common.flag.follow"))
logsCmd.Flags().StringVar(&logsService, "service", "", i18n.T("cmd.php.logs.flag.service")) logsCmd.Flags().StringVar(&logsService, "service", "", i18n.T("cmd.php.logs.flag.service"))
parent.AddCommand(logsCmd) parent.AddCommand(logsCmd)
@ -217,7 +217,7 @@ func runPHPLogs(service string, follow bool) error {
logsReader, err := server.Logs(service, follow) logsReader, err := server.Logs(service, follow)
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.get_logs"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.get_logs"), err)
} }
defer logsReader.Close() defer logsReader.Close()
@ -273,7 +273,7 @@ func runPHPStop() error {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.stop_services"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.stop_services"), err)
} }
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.dev.all_stopped")) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.dev.all_stopped"))
return nil return nil
} }
@ -304,7 +304,7 @@ func runPHPStatus() error {
appName = "Laravel" appName = "Laravel"
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.status.project")), appName) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("common.label.project")), appName)
// Detect available services // Detect available services
services := phppkg.DetectServices(cwd) services := phppkg.DetectServices(cwd)
@ -373,8 +373,8 @@ func runPHPSSL(domain string) error {
// Check if mkcert is installed // Check if mkcert is installed
if !phppkg.IsMkcertInstalled() { if !phppkg.IsMkcertInstalled() {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.php.label.error")), i18n.T("cmd.php.ssl.mkcert_not_installed")) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.php.ssl.mkcert_not_installed"))
fmt.Printf("\n%s\n", i18n.T("cmd.php.ssl.install_with")) fmt.Printf("\n%s\n", i18n.T("common.hint.install_with"))
fmt.Printf(" %s\n", i18n.T("cmd.php.ssl.install_macos")) fmt.Printf(" %s\n", i18n.T("cmd.php.ssl.install_macos"))
fmt.Printf(" %s\n", i18n.T("cmd.php.ssl.install_linux")) fmt.Printf(" %s\n", i18n.T("cmd.php.ssl.install_linux"))
return fmt.Errorf(i18n.T("cmd.php.error.mkcert_not_installed")) return fmt.Errorf(i18n.T("cmd.php.error.mkcert_not_installed"))
@ -384,7 +384,7 @@ func runPHPSSL(domain string) error {
// Check if certs already exist // Check if certs already exist
if phppkg.CertsExist(domain, phppkg.SSLOptions{}) { if phppkg.CertsExist(domain, phppkg.SSLOptions{}) {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.skip")), i18n.T("cmd.php.ssl.certs_exist")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.skip")), i18n.T("cmd.php.ssl.certs_exist"))
certFile, keyFile, _ := phppkg.CertPaths(domain, phppkg.SSLOptions{}) certFile, keyFile, _ := phppkg.CertPaths(domain, phppkg.SSLOptions{})
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.ssl.cert_label")), certFile) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.ssl.cert_label")), certFile)
@ -399,7 +399,7 @@ func runPHPSSL(domain string) error {
certFile, keyFile, _ := phppkg.CertPaths(domain, phppkg.SSLOptions{}) certFile, keyFile, _ := phppkg.CertPaths(domain, phppkg.SSLOptions{})
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.ssl.certs_created")) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.ssl.certs_created"))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.ssl.cert_label")), certFile) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.ssl.cert_label")), certFile)
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.ssl.key_label")), keyFile) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.ssl.key_label")), keyFile)

View file

@ -32,7 +32,7 @@ func addPHPPackagesLinkCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.packages.link.linking")) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.packages.link.linking"))
@ -41,7 +41,7 @@ func addPHPPackagesLinkCommand(parent *cobra.Command) {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.link_packages"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.link_packages"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.packages.link.done")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.packages.link.done"))
return nil return nil
}, },
} }
@ -58,7 +58,7 @@ func addPHPPackagesUnlinkCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.packages.unlink.unlinking")) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.packages.unlink.unlinking"))
@ -67,7 +67,7 @@ func addPHPPackagesUnlinkCommand(parent *cobra.Command) {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.unlink_packages"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.unlink_packages"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.packages.unlink.done")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.packages.unlink.done"))
return nil return nil
}, },
} }
@ -83,7 +83,7 @@ func addPHPPackagesUpdateCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.packages.update.updating")) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.php.label.php")), i18n.T("cmd.php.packages.update.updating"))
@ -92,7 +92,7 @@ func addPHPPackagesUpdateCommand(parent *cobra.Command) {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.update_packages"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.update_packages"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.packages.update.done")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.packages.update.done"))
return nil return nil
}, },
} }
@ -108,7 +108,7 @@ func addPHPPackagesListCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
packages, err := phppkg.ListLinkedPackages(cwd) packages, err := phppkg.ListLinkedPackages(cwd)
@ -134,8 +134,8 @@ func addPHPPackagesListCommand(parent *cobra.Command) {
} }
fmt.Printf(" %s %s\n", successStyle.Render("*"), name) fmt.Printf(" %s %s\n", successStyle.Render("*"), name)
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.php.packages.list.path")), pkg.Path) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("common.label.path")), pkg.Path)
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.php.packages.list.version")), version) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("common.label.version")), version)
fmt.Println() fmt.Println()
} }

View file

@ -30,7 +30,7 @@ func addPHPTestCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -56,7 +56,7 @@ func addPHPTestCommand(parent *cobra.Command) {
} }
if err := phppkg.RunTests(ctx, opts); err != nil { if err := phppkg.RunTests(ctx, opts); err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.tests_failed"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.tests_failed"), err)
} }
return nil return nil
@ -84,7 +84,7 @@ func addPHPFmtCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -127,9 +127,9 @@ func addPHPFmtCommand(parent *cobra.Command) {
} }
if fmtFix { if fmtFix {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.fmt.success")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.fmt.success"))
} else { } else {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.fmt.no_issues")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.fmt.no_issues"))
} }
return nil return nil
@ -137,7 +137,7 @@ func addPHPFmtCommand(parent *cobra.Command) {
} }
fmtCmd.Flags().BoolVar(&fmtFix, "fix", false, i18n.T("cmd.php.fmt.flag.fix")) fmtCmd.Flags().BoolVar(&fmtFix, "fix", false, i18n.T("cmd.php.fmt.flag.fix"))
fmtCmd.Flags().BoolVar(&fmtDiff, "diff", false, i18n.T("cmd.php.fmt.flag.diff")) fmtCmd.Flags().BoolVar(&fmtDiff, "diff", false, i18n.T("common.flag.diff"))
parent.AddCommand(fmtCmd) parent.AddCommand(fmtCmd)
} }
@ -155,7 +155,7 @@ func addPHPAnalyseCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -188,7 +188,7 @@ func addPHPAnalyseCommand(parent *cobra.Command) {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.analysis_issues"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.analysis_issues"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.analyse.no_issues")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("common.result.no_issues"))
return nil return nil
}, },
} }
@ -218,7 +218,7 @@ func addPHPPsalmCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -228,8 +228,8 @@ func addPHPPsalmCommand(parent *cobra.Command) {
// Check if Psalm is available // Check if Psalm is available
_, found := phppkg.DetectPsalm(cwd) _, found := phppkg.DetectPsalm(cwd)
if !found { if !found {
fmt.Printf("%s %s\n\n", errorStyle.Render(i18n.T("cmd.php.label.error")), i18n.T("cmd.php.psalm.not_found")) fmt.Printf("%s %s\n\n", errorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.php.psalm.not_found"))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.install")), i18n.T("cmd.php.psalm.install")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.install")), i18n.T("cmd.php.psalm.install"))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.setup")), i18n.T("cmd.php.psalm.setup")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.setup")), i18n.T("cmd.php.psalm.setup"))
return fmt.Errorf(i18n.T("cmd.php.error.psalm_not_installed")) return fmt.Errorf(i18n.T("cmd.php.error.psalm_not_installed"))
} }
@ -257,13 +257,13 @@ func addPHPPsalmCommand(parent *cobra.Command) {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.psalm_issues"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.psalm_issues"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.psalm.no_issues")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("common.result.no_issues"))
return nil return nil
}, },
} }
psalmCmd.Flags().IntVar(&psalmLevel, "level", 0, i18n.T("cmd.php.psalm.flag.level")) psalmCmd.Flags().IntVar(&psalmLevel, "level", 0, i18n.T("cmd.php.psalm.flag.level"))
psalmCmd.Flags().BoolVar(&psalmFix, "fix", false, i18n.T("cmd.php.psalm.flag.fix")) psalmCmd.Flags().BoolVar(&psalmFix, "fix", false, i18n.T("common.flag.fix"))
psalmCmd.Flags().BoolVar(&psalmBaseline, "baseline", false, i18n.T("cmd.php.psalm.flag.baseline")) psalmCmd.Flags().BoolVar(&psalmBaseline, "baseline", false, i18n.T("cmd.php.psalm.flag.baseline"))
psalmCmd.Flags().BoolVar(&psalmShowInfo, "show-info", false, i18n.T("cmd.php.psalm.flag.show_info")) psalmCmd.Flags().BoolVar(&psalmShowInfo, "show-info", false, i18n.T("cmd.php.psalm.flag.show_info"))
@ -283,7 +283,7 @@ func addPHPAuditCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -341,8 +341,8 @@ func addPHPAuditCommand(parent *cobra.Command) {
fmt.Println() fmt.Println()
if totalVulns > 0 { if totalVulns > 0 {
fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("cmd.php.label.warning")), i18n.T("cmd.php.audit.found_vulns", map[string]interface{}{"Count": totalVulns})) fmt.Printf("%s %s\n", errorStyle.Render(i18n.T("common.label.warning")), i18n.T("cmd.php.audit.found_vulns", map[string]interface{}{"Count": totalVulns}))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.fix")), i18n.T("cmd.php.audit.fix_hint")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.fix")), i18n.T("common.hint.fix_deps"))
return fmt.Errorf(i18n.T("cmd.php.error.vulns_found")) return fmt.Errorf(i18n.T("cmd.php.error.vulns_found"))
} }
@ -350,12 +350,12 @@ func addPHPAuditCommand(parent *cobra.Command) {
return fmt.Errorf(i18n.T("cmd.php.audit.completed_errors")) return fmt.Errorf(i18n.T("cmd.php.audit.completed_errors"))
} }
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.audit.all_secure")) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.audit.all_secure"))
return nil return nil
}, },
} }
auditCmd.Flags().BoolVar(&auditJSONOutput, "json", false, i18n.T("cmd.php.audit.flag.json")) auditCmd.Flags().BoolVar(&auditJSONOutput, "json", false, i18n.T("common.flag.json"))
auditCmd.Flags().BoolVar(&auditFix, "fix", false, i18n.T("cmd.php.audit.flag.fix")) auditCmd.Flags().BoolVar(&auditFix, "fix", false, i18n.T("cmd.php.audit.flag.fix"))
parent.AddCommand(auditCmd) parent.AddCommand(auditCmd)
@ -376,7 +376,7 @@ func addPHPSecurityCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -420,7 +420,7 @@ func addPHPSecurityCommand(parent *cobra.Command) {
if !check.Passed && check.Message != "" { if !check.Passed && check.Message != "" {
fmt.Printf(" %s\n", dimStyle.Render(check.Message)) fmt.Printf(" %s\n", dimStyle.Render(check.Message))
if check.Fix != "" { if check.Fix != "" {
fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("cmd.php.security.fix_label")), check.Fix) fmt.Printf(" %s %s\n", dimStyle.Render(i18n.T("common.label.fix")), check.Fix)
} }
} }
} }
@ -428,7 +428,7 @@ func addPHPSecurityCommand(parent *cobra.Command) {
fmt.Println() fmt.Println()
// Print summary // Print summary
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.summary")), i18n.T("cmd.php.security.summary")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.summary")), i18n.T("cmd.php.security.summary"))
fmt.Printf(" %s %d/%d\n", dimStyle.Render(i18n.T("cmd.php.security.passed")), result.Summary.Passed, result.Summary.Total) fmt.Printf(" %s %d/%d\n", dimStyle.Render(i18n.T("cmd.php.security.passed")), result.Summary.Passed, result.Summary.Total)
if result.Summary.Critical > 0 { if result.Summary.Critical > 0 {
@ -453,7 +453,7 @@ func addPHPSecurityCommand(parent *cobra.Command) {
} }
securityCmd.Flags().StringVar(&securitySeverity, "severity", "", i18n.T("cmd.php.security.flag.severity")) securityCmd.Flags().StringVar(&securitySeverity, "severity", "", i18n.T("cmd.php.security.flag.severity"))
securityCmd.Flags().BoolVar(&securityJSONOutput, "json", false, i18n.T("cmd.php.security.flag.json")) securityCmd.Flags().BoolVar(&securityJSONOutput, "json", false, i18n.T("common.flag.json"))
securityCmd.Flags().BoolVar(&securitySarif, "sarif", false, i18n.T("cmd.php.security.flag.sarif")) securityCmd.Flags().BoolVar(&securitySarif, "sarif", false, i18n.T("cmd.php.security.flag.sarif"))
securityCmd.Flags().StringVar(&securityURL, "url", "", i18n.T("cmd.php.security.flag.url")) securityCmd.Flags().StringVar(&securityURL, "url", "", i18n.T("cmd.php.security.flag.url"))
@ -474,7 +474,7 @@ func addPHPQACommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -566,7 +566,7 @@ func addPHPQACommand(parent *cobra.Command) {
qaCmd.Flags().BoolVar(&qaQuick, "quick", false, i18n.T("cmd.php.qa.flag.quick")) qaCmd.Flags().BoolVar(&qaQuick, "quick", false, i18n.T("cmd.php.qa.flag.quick"))
qaCmd.Flags().BoolVar(&qaFull, "full", false, i18n.T("cmd.php.qa.flag.full")) qaCmd.Flags().BoolVar(&qaFull, "full", false, i18n.T("cmd.php.qa.flag.full"))
qaCmd.Flags().BoolVar(&qaFix, "fix", false, i18n.T("cmd.php.qa.flag.fix")) qaCmd.Flags().BoolVar(&qaFix, "fix", false, i18n.T("common.flag.fix"))
parent.AddCommand(qaCmd) parent.AddCommand(qaCmd)
} }
@ -574,7 +574,7 @@ func addPHPQACommand(parent *cobra.Command) {
func getQAFixCommand(checkName string, fixEnabled bool) string { func getQAFixCommand(checkName string, fixEnabled bool) string {
switch checkName { switch checkName {
case "audit": case "audit":
return i18n.T("cmd.php.qa.fix_audit") return i18n.T("common.hint.fix_deps")
case "fmt": case "fmt":
if fixEnabled { if fixEnabled {
return "" return ""
@ -682,7 +682,7 @@ func addPHPRectorCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -691,8 +691,8 @@ func addPHPRectorCommand(parent *cobra.Command) {
// Check if Rector is available // Check if Rector is available
if !phppkg.DetectRector(cwd) { if !phppkg.DetectRector(cwd) {
fmt.Printf("%s %s\n\n", errorStyle.Render(i18n.T("cmd.php.label.error")), i18n.T("cmd.php.rector.not_found")) fmt.Printf("%s %s\n\n", errorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.php.rector.not_found"))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.install")), i18n.T("cmd.php.rector.install")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.install")), i18n.T("cmd.php.rector.install"))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.setup")), i18n.T("cmd.php.rector.setup")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.setup")), i18n.T("cmd.php.rector.setup"))
return fmt.Errorf(i18n.T("cmd.php.error.rector_not_installed")) return fmt.Errorf(i18n.T("cmd.php.error.rector_not_installed"))
} }
@ -725,9 +725,9 @@ func addPHPRectorCommand(parent *cobra.Command) {
} }
if rectorFix { if rectorFix {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.rector.refactored")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.rector.refactored"))
} else { } else {
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.rector.no_changes")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.rector.no_changes"))
} }
return nil return nil
}, },
@ -756,7 +756,7 @@ func addPHPInfectionCommand(parent *cobra.Command) {
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
if !phppkg.IsPHPProject(cwd) { if !phppkg.IsPHPProject(cwd) {
@ -765,8 +765,8 @@ func addPHPInfectionCommand(parent *cobra.Command) {
// Check if Infection is available // Check if Infection is available
if !phppkg.DetectInfection(cwd) { if !phppkg.DetectInfection(cwd) {
fmt.Printf("%s %s\n\n", errorStyle.Render(i18n.T("cmd.php.label.error")), i18n.T("cmd.php.infection.not_found")) fmt.Printf("%s %s\n\n", errorStyle.Render(i18n.T("common.label.error")), i18n.T("cmd.php.infection.not_found"))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.php.label.install")), i18n.T("cmd.php.infection.install")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.install")), i18n.T("cmd.php.infection.install"))
return fmt.Errorf(i18n.T("cmd.php.error.infection_not_installed")) return fmt.Errorf(i18n.T("cmd.php.error.infection_not_installed"))
} }
@ -789,7 +789,7 @@ func addPHPInfectionCommand(parent *cobra.Command) {
return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.infection_failed"), err) return fmt.Errorf("%s: %w", i18n.T("cmd.php.error.infection_failed"), err)
} }
fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("cmd.php.label.done")), i18n.T("cmd.php.infection.complete")) fmt.Printf("\n%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.php.infection.complete"))
return nil return nil
}, },
} }

View file

@ -73,7 +73,7 @@ func runPkgInstall(repoArg, targetDir string, addToRegistry bool) error {
repoPath := filepath.Join(targetDir, repoName) repoPath := filepath.Join(targetDir, repoName)
if _, err := os.Stat(filepath.Join(repoPath, ".git")); err == nil { if _, err := os.Stat(filepath.Join(repoPath, ".git")); err == nil {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.pkg.install.skip_label")), i18n.T("cmd.pkg.install.already_exists", map[string]string{"Name": repoName, "Path": repoPath})) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.skip")), i18n.T("cmd.pkg.install.already_exists", map[string]string{"Name": repoName, "Path": repoPath}))
return nil return nil
} }
@ -82,10 +82,10 @@ func runPkgInstall(repoArg, targetDir string, addToRegistry bool) error {
} }
fmt.Printf("%s %s/%s\n", dimStyle.Render(i18n.T("cmd.pkg.install.installing_label")), org, repoName) fmt.Printf("%s %s/%s\n", dimStyle.Render(i18n.T("cmd.pkg.install.installing_label")), org, repoName)
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.pkg.install.target_label")), repoPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.target")), repoPath)
fmt.Println() fmt.Println()
fmt.Printf(" %s... ", dimStyle.Render(i18n.T("cmd.pkg.install.cloning"))) fmt.Printf(" %s... ", dimStyle.Render(i18n.T("common.status.cloning")))
err := gitClone(ctx, org, repoName, repoPath) err := gitClone(ctx, org, repoName, repoPath)
if err != nil { if err != nil {
fmt.Printf("%s\n", errorStyle.Render("✗ "+err.Error())) fmt.Printf("%s\n", errorStyle.Render("✗ "+err.Error()))
@ -102,7 +102,7 @@ func runPkgInstall(repoArg, targetDir string, addToRegistry bool) error {
} }
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.pkg.install.done_label")), i18n.T("cmd.pkg.install.installed", map[string]string{"Name": repoName})) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.pkg.install.installed", map[string]string{"Name": repoName}))
return nil return nil
} }

View file

@ -82,7 +82,7 @@ func runPkgList() error {
} }
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.pkg.list.total_label")), i18n.T("cmd.pkg.list.summary", map[string]int{"Installed": installed, "Missing": missing})) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.total")), i18n.T("cmd.pkg.list.summary", map[string]int{"Installed": installed, "Missing": missing}))
if missing > 0 { if missing > 0 {
fmt.Printf("\n%s %s\n", i18n.T("cmd.pkg.list.install_missing"), dimStyle.Render("core setup")) fmt.Printf("\n%s %s\n", i18n.T("cmd.pkg.list.install_missing"), dimStyle.Render("core setup"))
@ -164,7 +164,7 @@ func runPkgUpdate(packages []string, all bool) error {
} }
if strings.Contains(string(output), "Already up to date") { if strings.Contains(string(output), "Already up to date") {
fmt.Printf("%s\n", dimStyle.Render(i18n.T("cmd.pkg.update.up_to_date"))) fmt.Printf("%s\n", dimStyle.Render(i18n.T("common.status.up_to_date")))
} else { } else {
fmt.Printf("%s\n", successStyle.Render("✓")) fmt.Printf("%s\n", successStyle.Render("✓"))
} }
@ -173,7 +173,7 @@ func runPkgUpdate(packages []string, all bool) error {
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", fmt.Printf("%s %s\n",
dimStyle.Render(i18n.T("cmd.pkg.update.done_label")), i18n.T("cmd.pkg.update.summary", map[string]int{"Updated": updated, "Skipped": skipped, "Failed": failed})) dimStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.pkg.update.summary", map[string]int{"Updated": updated, "Skipped": skipped, "Failed": failed}))
return nil return nil
} }
@ -211,7 +211,7 @@ func runPkgOutdated() error {
basePath = filepath.Join(filepath.Dir(regPath), basePath) basePath = filepath.Join(filepath.Dir(regPath), basePath)
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.pkg.outdated.outdated_label")), i18n.T("cmd.pkg.outdated.checking")) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.pkg.outdated.outdated_label")), i18n.T("common.progress.checking_updates"))
var outdated, upToDate, notInstalled int var outdated, upToDate, notInstalled int
@ -245,10 +245,10 @@ func runPkgOutdated() error {
fmt.Println() fmt.Println()
if outdated == 0 { if outdated == 0 {
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.pkg.outdated.done_label")), i18n.T("cmd.pkg.outdated.all_up_to_date")) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.pkg.outdated.all_up_to_date"))
} else { } else {
fmt.Printf("%s %s\n", fmt.Printf("%s %s\n",
dimStyle.Render(i18n.T("cmd.pkg.outdated.summary_label")), i18n.T("cmd.pkg.outdated.summary", map[string]int{"Outdated": outdated, "UpToDate": upToDate})) dimStyle.Render(i18n.T("common.label.summary")), i18n.T("cmd.pkg.outdated.summary", map[string]int{"Outdated": outdated, "UpToDate": upToDate}))
fmt.Printf("\n%s %s\n", i18n.T("cmd.pkg.outdated.update_with"), dimStyle.Render("core pkg update --all")) fmt.Printf("\n%s %s\n", i18n.T("cmd.pkg.outdated.update_with"), dimStyle.Render("core pkg update --all"))
} }

View file

@ -97,7 +97,7 @@ func runPkgSearch(org, pattern, repoType string, limit int, refresh bool) error
} }
if os.Getenv("GH_TOKEN") != "" { if os.Getenv("GH_TOKEN") != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.pkg.search.note_label")), i18n.T("cmd.pkg.search.gh_token_warning")) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.note")), i18n.T("cmd.pkg.search.gh_token_warning"))
fmt.Printf("%s %s\n\n", dimStyle.Render(""), i18n.T("cmd.pkg.search.gh_token_unset")) fmt.Printf("%s %s\n\n", dimStyle.Render(""), i18n.T("cmd.pkg.search.gh_token_unset"))
} }
@ -170,7 +170,7 @@ func runPkgSearch(org, pattern, repoType string, limit int, refresh bool) error
} }
fmt.Println() fmt.Println()
fmt.Printf("%s %s\n", i18n.T("cmd.pkg.search.install_with"), dimStyle.Render(fmt.Sprintf("core pkg install %s/<repo-name>", org))) fmt.Printf("%s %s\n", i18n.T("common.hint.install_with"), dimStyle.Render(fmt.Sprintf("core pkg install %s/<repo-name>", org)))
return nil return nil
} }

View file

@ -54,7 +54,7 @@ func init() {
sdkDiffCmd.Flags().StringVar(&diffSpecPath, "spec", "", i18n.T("cmd.sdk.diff.flag.spec")) sdkDiffCmd.Flags().StringVar(&diffSpecPath, "spec", "", i18n.T("cmd.sdk.diff.flag.spec"))
// sdk validate flags // sdk validate flags
sdkValidateCmd.Flags().StringVar(&validateSpecPath, "spec", "", i18n.T("cmd.sdk.validate.flag.spec")) sdkValidateCmd.Flags().StringVar(&validateSpecPath, "spec", "", i18n.T("common.flag.spec"))
// Add subcommands // Add subcommands
sdkCmd.AddCommand(sdkDiffCmd) sdkCmd.AddCommand(sdkDiffCmd)
@ -64,7 +64,7 @@ func init() {
func runSDKDiff(basePath, specPath string) error { func runSDKDiff(basePath, specPath string) error {
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.sdk.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
// Detect current spec if not provided // Detect current spec if not provided
@ -82,12 +82,12 @@ func runSDKDiff(basePath, specPath string) error {
fmt.Printf("%s %s\n", sdkHeaderStyle.Render(i18n.T("cmd.sdk.diff.label")), i18n.T("cmd.sdk.diff.checking")) fmt.Printf("%s %s\n", sdkHeaderStyle.Render(i18n.T("cmd.sdk.diff.label")), i18n.T("cmd.sdk.diff.checking"))
fmt.Printf(" %s %s\n", i18n.T("cmd.sdk.diff.base_label"), sdkDimStyle.Render(basePath)) fmt.Printf(" %s %s\n", i18n.T("cmd.sdk.diff.base_label"), sdkDimStyle.Render(basePath))
fmt.Printf(" %s %s\n", i18n.T("cmd.sdk.diff.current_label"), sdkDimStyle.Render(specPath)) fmt.Printf(" %s %s\n", i18n.T("common.label.current"), sdkDimStyle.Render(specPath))
fmt.Println() fmt.Println()
result, err := sdkpkg.Diff(basePath, specPath) result, err := sdkpkg.Diff(basePath, specPath)
if err != nil { if err != nil {
fmt.Printf("%s %v\n", sdkErrorStyle.Render(i18n.T("cmd.sdk.label.error")), err) fmt.Printf("%s %v\n", sdkErrorStyle.Render(i18n.T("common.label.error")), err)
os.Exit(2) os.Exit(2)
} }
@ -106,7 +106,7 @@ func runSDKDiff(basePath, specPath string) error {
func runSDKValidate(specPath string) error { func runSDKValidate(specPath string) error {
projectDir, err := os.Getwd() projectDir, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.sdk.error.working_dir"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.working_dir"), err)
} }
s := sdkpkg.New(projectDir, &sdkpkg.Config{Spec: specPath}) s := sdkpkg.New(projectDir, &sdkpkg.Config{Spec: specPath})
@ -115,11 +115,11 @@ func runSDKValidate(specPath string) error {
detectedPath, err := s.DetectSpec() detectedPath, err := s.DetectSpec()
if err != nil { if err != nil {
fmt.Printf("%s %v\n", sdkErrorStyle.Render(i18n.T("cmd.sdk.label.error")), err) fmt.Printf("%s %v\n", sdkErrorStyle.Render(i18n.T("common.label.error")), err)
return err return err
} }
fmt.Printf(" %s %s\n", i18n.T("cmd.sdk.validate.spec_label"), sdkDimStyle.Render(detectedPath)) fmt.Printf(" %s %s\n", i18n.T("common.label.spec"), sdkDimStyle.Render(detectedPath))
fmt.Printf("%s %s\n", sdkSuccessStyle.Render(i18n.T("cmd.sdk.label.ok")), i18n.T("cmd.sdk.validate.valid")) fmt.Printf("%s %s\n", sdkSuccessStyle.Render(i18n.T("cmd.sdk.label.ok")), i18n.T("cmd.sdk.validate.valid"))
return nil return nil
} }

View file

@ -103,7 +103,7 @@ func runBootstrap(ctx context.Context, only string, dryRun, all bool, projectNam
// Clone core-devops first // Clone core-devops first
devopsPath := filepath.Join(targetDir, devopsRepo) devopsPath := filepath.Join(targetDir, devopsRepo)
if _, err := os.Stat(filepath.Join(devopsPath, ".git")); os.IsNotExist(err) { if _, err := os.Stat(filepath.Join(devopsPath, ".git")); os.IsNotExist(err) {
fmt.Printf("%s %s %s...\n", dimStyle.Render(">>"), i18n.T("cmd.setup.cloning"), devopsRepo) fmt.Printf("%s %s %s...\n", dimStyle.Render(">>"), i18n.T("common.status.cloning"), devopsRepo)
if !dryRun { if !dryRun {
if err := gitClone(ctx, defaultOrg, devopsRepo, devopsPath); err != nil { if err := gitClone(ctx, defaultOrg, devopsRepo, devopsPath); err != nil {

View file

@ -30,7 +30,7 @@ func runRegistrySetup(ctx context.Context, registryPath, only string, dryRun, al
// runRegistrySetupWithReg runs setup with an already-loaded registry. // runRegistrySetupWithReg runs setup with an already-loaded registry.
func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryPath, only string, dryRun, all, runBuild bool) error { func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryPath, only string, dryRun, all, runBuild bool) error {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.setup.registry_label")), registryPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.registry")), registryPath)
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.setup.org_label")), reg.Org) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.setup.org_label")), reg.Org)
// Determine base path for cloning // Determine base path for cloning
@ -48,7 +48,7 @@ func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryP
basePath = filepath.Join(home, basePath[2:]) basePath = filepath.Join(home, basePath[2:])
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.setup.target_label")), basePath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.target")), basePath)
// Parse type filter // Parse type filter
var typeFilter []string var typeFilter []string
@ -56,7 +56,7 @@ func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryP
for _, t := range strings.Split(only, ",") { for _, t := range strings.Split(only, ",") {
typeFilter = append(typeFilter, strings.TrimSpace(t)) typeFilter = append(typeFilter, strings.TrimSpace(t))
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.setup.filter_label")), only) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.filter")), only)
} }
// Ensure base path exists // Ensure base path exists
@ -140,7 +140,7 @@ func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryP
fmt.Printf("%s, %s, %s\n", fmt.Printf("%s, %s, %s\n",
i18n.T("cmd.setup.to_clone", map[string]interface{}{"Count": len(toClone)}), i18n.T("cmd.setup.to_clone", map[string]interface{}{"Count": len(toClone)}),
i18n.T("cmd.setup.exist", map[string]interface{}{"Count": exists}), i18n.T("cmd.setup.exist", map[string]interface{}{"Count": exists}),
i18n.T("cmd.setup.skipped", map[string]interface{}{"Count": skipped})) i18n.T("common.count.skipped", map[string]interface{}{"Count": skipped}))
if len(toClone) == 0 { if len(toClone) == 0 {
fmt.Printf("\n%s\n", i18n.T("cmd.setup.nothing_to_clone")) fmt.Printf("\n%s\n", i18n.T("cmd.setup.nothing_to_clone"))
@ -172,7 +172,7 @@ func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryP
var succeeded, failed int var succeeded, failed int
for _, repo := range toClone { for _, repo := range toClone {
fmt.Printf(" %s %s... ", dimStyle.Render(i18n.T("cmd.setup.cloning")), repo.Name) fmt.Printf(" %s %s... ", dimStyle.Render(i18n.T("common.status.cloning")), repo.Name)
repoPath := filepath.Join(basePath, repo.Name) repoPath := filepath.Join(basePath, repo.Name)
@ -188,9 +188,9 @@ func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryP
// Summary // Summary
fmt.Println() fmt.Println()
fmt.Printf("%s %s", successStyle.Render(i18n.T("cmd.setup.done_label")), i18n.T("cmd.setup.cloned_count", map[string]interface{}{"Count": succeeded})) fmt.Printf("%s %s", successStyle.Render(i18n.T("common.label.done")), i18n.T("cmd.setup.cloned_count", map[string]interface{}{"Count": succeeded}))
if failed > 0 { if failed > 0 {
fmt.Printf(", %s", errorStyle.Render(i18n.T("cmd.setup.failed_count", map[string]interface{}{"Count": failed}))) fmt.Printf(", %s", errorStyle.Render(i18n.T("common.count.failed", map[string]interface{}{"Count": failed})))
} }
if exists > 0 { if exists > 0 {
fmt.Printf(", %s", i18n.T("cmd.setup.already_exist_count", map[string]interface{}{"Count": exists})) fmt.Printf(", %s", i18n.T("cmd.setup.already_exist_count", map[string]interface{}{"Count": exists}))
@ -206,7 +206,7 @@ func runRegistrySetupWithReg(ctx context.Context, reg *repos.Registry, registryP
buildCmd.Stdout = os.Stdout buildCmd.Stdout = os.Stdout
buildCmd.Stderr = os.Stderr buildCmd.Stderr = os.Stderr
if err := buildCmd.Run(); err != nil { if err := buildCmd.Run(); err != nil {
return fmt.Errorf("%s: %w", i18n.T("cmd.setup.error.build_failed"), err) return fmt.Errorf("%s: %w", i18n.T("common.error.build_failed"), err)
} }
} }

View file

@ -43,7 +43,7 @@ var testCmd = &cobra.Command{
func init() { func init() {
testCmd.Flags().BoolVar(&testVerbose, "verbose", false, i18n.T("cmd.test.flag.verbose")) testCmd.Flags().BoolVar(&testVerbose, "verbose", false, i18n.T("cmd.test.flag.verbose"))
testCmd.Flags().BoolVar(&testCoverage, "coverage", false, i18n.T("cmd.test.flag.coverage")) testCmd.Flags().BoolVar(&testCoverage, "coverage", false, i18n.T("common.flag.coverage"))
testCmd.Flags().BoolVar(&testShort, "short", false, i18n.T("cmd.test.flag.short")) testCmd.Flags().BoolVar(&testShort, "short", false, i18n.T("cmd.test.flag.short"))
testCmd.Flags().StringVar(&testPkg, "pkg", "", i18n.T("cmd.test.flag.pkg")) testCmd.Flags().StringVar(&testPkg, "pkg", "", i18n.T("cmd.test.flag.pkg"))
testCmd.Flags().StringVar(&testRun, "run", "", i18n.T("cmd.test.flag.run")) testCmd.Flags().StringVar(&testRun, "run", "", i18n.T("cmd.test.flag.run"))

View file

@ -85,12 +85,12 @@ func printTestSummary(results testResults, showCoverage bool) {
// Print pass/fail summary // Print pass/fail summary
total := results.passed + results.failed total := results.passed + results.failed
if total > 0 { if total > 0 {
fmt.Printf(" %s %s", testPassStyle.Render("✓"), i18n.T("cmd.test.passed", map[string]interface{}{"Count": results.passed})) fmt.Printf(" %s %s", testPassStyle.Render("✓"), i18n.T("common.count.passed", map[string]interface{}{"Count": results.passed}))
if results.failed > 0 { if results.failed > 0 {
fmt.Printf(" %s %s", testFailStyle.Render("✗"), i18n.T("cmd.test.failed", map[string]interface{}{"Count": results.failed})) fmt.Printf(" %s %s", testFailStyle.Render("✗"), i18n.T("common.count.failed", map[string]interface{}{"Count": results.failed}))
} }
if results.skipped > 0 { if results.skipped > 0 {
fmt.Printf(" %s %s", testSkipStyle.Render("○"), i18n.T("cmd.test.skipped", map[string]interface{}{"Count": results.skipped})) fmt.Printf(" %s %s", testSkipStyle.Render("○"), i18n.T("common.count.skipped", map[string]interface{}{"Count": results.skipped}))
} }
fmt.Println() fmt.Println()
} }
@ -108,7 +108,7 @@ func printTestSummary(results testResults, showCoverage bool) {
printCoverageSummary(results) printCoverageSummary(results)
} else if results.covCount > 0 { } else if results.covCount > 0 {
avgCov := results.totalCov / float64(results.covCount) avgCov := results.totalCov / float64(results.covCount)
fmt.Printf("\n %s %s\n", i18n.T("cmd.test.label.coverage"), formatCoverage(avgCov)) fmt.Printf("\n %s %s\n", i18n.T("common.label.coverage"), formatCoverage(avgCov))
} }
} }

View file

@ -54,10 +54,10 @@ func runTest(verbose, coverage, short bool, pkg, run string, race, jsonOutput bo
cmd.Env = append(os.Environ(), getMacOSDeploymentTarget()) cmd.Env = append(os.Environ(), getMacOSDeploymentTarget())
if !jsonOutput { if !jsonOutput {
fmt.Printf("%s %s\n", testHeaderStyle.Render(i18n.T("cmd.test.label.test")), i18n.T("cmd.test.running")) fmt.Printf("%s %s\n", testHeaderStyle.Render(i18n.T("common.label.test")), i18n.T("common.result.running_tests"))
fmt.Printf(" %s %s\n", i18n.T("cmd.test.label.package"), testDimStyle.Render(pkg)) fmt.Printf(" %s %s\n", i18n.T("common.label.package"), testDimStyle.Render(pkg))
if run != "" { if run != "" {
fmt.Printf(" %s %s\n", i18n.T("cmd.test.label.filter"), testDimStyle.Render(run)) fmt.Printf(" %s %s\n", i18n.T("common.label.filter"), testDimStyle.Render(run))
} }
fmt.Println() fmt.Println()
} }
@ -93,7 +93,7 @@ func runTest(verbose, coverage, short bool, pkg, run string, race, jsonOutput bo
// JSON output for CI/agents // JSON output for CI/agents
printJSONResults(results, exitCode) printJSONResults(results, exitCode)
if exitCode != 0 { if exitCode != 0 {
return fmt.Errorf(i18n.T("cmd.test.error.tests_failed")) return fmt.Errorf(i18n.T("common.error.tests_failed"))
} }
return nil return nil
} }
@ -109,10 +109,10 @@ func runTest(verbose, coverage, short bool, pkg, run string, race, jsonOutput bo
if exitCode != 0 { if exitCode != 0 {
fmt.Printf("\n%s %s\n", testFailStyle.Render(i18n.T("cli.fail")), i18n.T("cmd.test.tests_failed")) fmt.Printf("\n%s %s\n", testFailStyle.Render(i18n.T("cli.fail")), i18n.T("cmd.test.tests_failed"))
return fmt.Errorf(i18n.T("cmd.test.error.tests_failed")) return fmt.Errorf(i18n.T("common.error.tests_failed"))
} }
fmt.Printf("\n%s %s\n", testPassStyle.Render(i18n.T("cli.pass")), i18n.T("cmd.test.all_passed")) fmt.Printf("\n%s %s\n", testPassStyle.Render(i18n.T("cli.pass")), i18n.T("common.result.all_passed"))
return nil return nil
} }

View file

@ -80,7 +80,7 @@ func runContainer(image, name string, detach bool, memory, cpus, sshPort int) er
SSHPort: sshPort, SSHPort: sshPort,
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.image")), image) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.image")), image)
if name != "" { if name != "" {
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.name")), name) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.name")), name)
} }
@ -94,7 +94,7 @@ func runContainer(image, name string, detach bool, memory, cpus, sshPort int) er
} }
if detach { if detach {
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.vm.label.started")), c.ID) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.started")), c.ID)
fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.vm.label.pid")), c.PID) fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.vm.label.pid")), c.PID)
fmt.Println() fmt.Println()
fmt.Println(i18n.T("cmd.vm.hint.view_logs", map[string]interface{}{"ID": c.ID[:8]})) fmt.Println(i18n.T("cmd.vm.hint.view_logs", map[string]interface{}{"ID": c.ID[:8]}))
@ -238,7 +238,7 @@ func stopContainer(id string) error {
return fmt.Errorf(i18n.T("cmd.vm.error.stop_container")+": %w", err) return fmt.Errorf(i18n.T("cmd.vm.error.stop_container")+": %w", err)
} }
fmt.Printf("%s\n", successStyle.Render(i18n.T("cmd.vm.stop.stopped"))) fmt.Printf("%s\n", successStyle.Render(i18n.T("common.status.stopped")))
return nil return nil
} }
@ -283,7 +283,7 @@ func addVMLogsCommand(parent *cobra.Command) {
}, },
} }
logsCmd.Flags().BoolVarP(&logsFollow, "follow", "f", false, i18n.T("cmd.vm.logs.flag.follow")) logsCmd.Flags().BoolVarP(&logsFollow, "follow", "f", false, i18n.T("common.flag.follow"))
parent.AddCommand(logsCmd) parent.AddCommand(logsCmd)
} }
@ -302,7 +302,7 @@ func viewLogs(id string, follow bool) error {
ctx := context.Background() ctx := context.Background()
reader, err := manager.Logs(ctx, fullID, follow) reader, err := manager.Logs(ctx, fullID, follow)
if err != nil { if err != nil {
return fmt.Errorf(i18n.T("cmd.vm.error.get_logs")+": %w", err) return fmt.Errorf(i18n.T("common.error.get_logs")+": %w", err)
} }
defer reader.Close() defer reader.Close()

View file

@ -103,7 +103,7 @@ func showTemplate(name string) error {
return err return err
} }
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.vm.label.template")), repoNameStyle.Render(name)) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("common.label.template")), repoNameStyle.Render(name))
fmt.Println(content) fmt.Println(content)
return nil return nil
@ -117,7 +117,7 @@ func showTemplateVars(name string) error {
required, optional := container.ExtractVariables(content) required, optional := container.ExtractVariables(content)
fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("cmd.vm.label.template")), repoNameStyle.Render(name)) fmt.Printf("%s %s\n\n", dimStyle.Render(i18n.T("common.label.template")), repoNameStyle.Render(name))
if len(required) > 0 { if len(required) > 0 {
fmt.Printf("%s\n", errorStyle.Render(i18n.T("cmd.vm.templates.vars.required"))) fmt.Printf("%s\n", errorStyle.Render(i18n.T("cmd.vm.templates.vars.required")))
@ -165,7 +165,7 @@ func RunFromTemplate(templateName string, vars map[string]string, runOpts contai
return fmt.Errorf(i18n.T("cmd.vm.error.write_template")+": %w", err) return fmt.Errorf(i18n.T("cmd.vm.error.write_template")+": %w", err)
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.template")), repoNameStyle.Render(templateName)) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.template")), repoNameStyle.Render(templateName))
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.building")), yamlPath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.building")), yamlPath)
// Build the image using linuxkit // Build the image using linuxkit
@ -180,7 +180,7 @@ func RunFromTemplate(templateName string, vars map[string]string, runOpts contai
return fmt.Errorf(i18n.T("cmd.vm.error.no_image_found")) return fmt.Errorf(i18n.T("cmd.vm.error.no_image_found"))
} }
fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("cmd.vm.label.image")), imagePath) fmt.Printf("%s %s\n", dimStyle.Render(i18n.T("common.label.image")), imagePath)
fmt.Println() fmt.Println()
// Run the image // Run the image
@ -199,7 +199,7 @@ func RunFromTemplate(templateName string, vars map[string]string, runOpts contai
} }
if runOpts.Detach { if runOpts.Detach {
fmt.Printf("%s %s\n", successStyle.Render(i18n.T("cmd.vm.label.started")), c.ID) fmt.Printf("%s %s\n", successStyle.Render(i18n.T("common.label.started")), c.ID)
fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.vm.label.pid")), c.PID) fmt.Printf("%s %d\n", dimStyle.Render(i18n.T("cmd.vm.label.pid")), c.PID)
fmt.Println() fmt.Println()
fmt.Println(i18n.T("cmd.vm.hint.view_logs", map[string]interface{}{"ID": c.ID[:8]})) fmt.Println(i18n.T("cmd.vm.hint.view_logs", map[string]interface{}{"ID": c.ID[:8]}))

View file

@ -1,4 +1,94 @@
{ {
"common": {
"label": {
"error": "Error:",
"done": "Done:",
"status": "Status:",
"version": "Version:",
"summary": "Summary:",
"image": "Image:",
"success": "Success:",
"warning": "Warning:",
"note": "Note:",
"registry": "Registry:",
"current": "Current:",
"total": "Total:",
"coverage": "Coverage:",
"install": "Install:",
"path": "Path:",
"test": "Test:",
"package": "Package:",
"spec": "Spec:",
"template": "Template:",
"fix": "Fix:",
"skip": "Skip:",
"started": "Started:",
"target": "Target:",
"filter": "Filter:",
"project": "Project:",
"url": "URL:",
"repo": "Repo"
},
"status": {
"running": "Running",
"stopped": "Stopped",
"dirty": "dirty",
"synced": "synced",
"up_to_date": "up to date",
"installing": "Installing",
"cloning": "Cloning"
},
"error": {
"failed": "Failed to {{.Action}}",
"not_found": "{{.Item}} not found",
"no_items": "No {{.Items}} found",
"working_dir": "Failed to get working directory",
"load_config": "Failed to load config",
"build_failed": "Build failed",
"tests_failed": "Tests failed",
"get_logs": "Failed to get logs"
},
"success": {
"completed": "{{.Action}} completed successfully",
"passed": "{{.Action}} passed"
},
"progress": {
"running": "Running {{.Task}}",
"checking": "Checking {{.Item}}",
"checking_updates": "Checking for updates..."
},
"flag": {
"registry": "Path to repos.yaml (auto-detected if not specified)",
"spec": "Path to OpenAPI spec file",
"diff": "Show diff of changes",
"verbose": "Verbose output",
"coverage": "Show detailed per-package coverage",
"json": "Output in JSON format",
"tag": "Image tag (default: latest)",
"follow": "Follow log output",
"fix": "Auto-fix issues where possible",
"pkg": "Package to test (default: ./...)"
},
"count": {
"failed": "{{.Count}} failed",
"passed": "{{.Count}} passed",
"skipped": "{{.Count}} skipped",
"pending": "{{.Count}} pending",
"files": "{{.Count}} files",
"commits": "{{.Count}} commit(s)",
"repos_unpushed": "{{.Count}} repo(s) with unpushed commits:"
},
"result": {
"all_passed": "All tests passed",
"no_issues": "No issues found",
"running_tests": "Running tests",
"run_with_coverage": "Run tests with coverage"
},
"hint": {
"install_with": "Install with:",
"fix_deps": "composer update && npm update"
}
},
"cli": { "cli": {
"aborted": "Aborted", "aborted": "Aborted",
"cancelled": "Cancelled", "cancelled": "Cancelled",
@ -15,10 +105,6 @@
"one": "{{.Count}} commit", "one": "{{.Count}} commit",
"other": "{{.Count}} commits" "other": "{{.Count}} commits"
}, },
"files": {
"one": "{{.Count}} file",
"other": "{{.Count}} files"
},
"items": { "items": {
"one": "{{.Count}} item", "one": "{{.Count}} item",
"other": "{{.Count}} items" "other": "{{.Count}} items"
@ -41,12 +127,10 @@
"checking": "Checking", "checking": "Checking",
"deploying": "Deploying", "deploying": "Deploying",
"fetching": "Fetching", "fetching": "Fetching",
"installing": "Installing",
"loading": "Loading", "loading": "Loading",
"processing": "Processing", "processing": "Processing",
"testing": "Testing" "testing": "Testing"
}, },
"running": "Running",
"skip": "Skipped", "skip": "Skipped",
"success": "Success", "success": "Success",
"time": { "time": {
@ -84,11 +168,9 @@
"get_task": "failed to get task", "get_task": "failed to get task",
"git_status": "failed to check git status", "git_status": "failed to check git status",
"list_tasks": "failed to list tasks", "list_tasks": "failed to list tasks",
"load_config": "failed to load config",
"push": "failed to push", "push": "failed to push",
"push_branch": "failed to push branch", "push_branch": "failed to push branch",
"update_task": "failed to update task", "update_task": "failed to update task"
"working_dir": "failed to get working directory"
}, },
"label": { "label": {
"blocked_by": "Blocked by:", "blocked_by": "Blocked by:",
@ -98,11 +180,8 @@
"id": "ID:", "id": "ID:",
"labels": "Labels:", "labels": "Labels:",
"priority": "Priority:", "priority": "Priority:",
"project": "Project:",
"related_files": "Related files:", "related_files": "Related files:",
"status": "Status:", "title": "Title:"
"title": "Title:",
"url": "URL:"
}, },
"long": "Manage tasks from the core-agentic service for AI-assisted development.\n\nCommands:\n tasks List tasks (filterable by status, priority, labels)\n task View task details or auto-select highest priority\n task:update Update task status or progress\n task:complete Mark task as completed or failed\n task:commit Create git commit with task reference\n task:pr Create GitHub PR linked to task\n claude Claude Code integration\n\nWorkflow:\n core ai tasks # List pending tasks\n core ai task --auto --claim # Auto-select and claim a task\n core ai task:commit <id> -m 'msg' # Commit with task reference\n core ai task:complete <id> # Mark task done", "long": "Manage tasks from the core-agentic service for AI-assisted development.\n\nCommands:\n tasks List tasks (filterable by status, priority, labels)\n task View task details or auto-select highest priority\n task:update Update task status or progress\n task:complete Mark task as completed or failed\n task:commit Create git commit with task reference\n task:pr Create GitHub PR linked to task\n claude Claude Code integration\n\nWorkflow:\n core ai tasks # List pending tasks\n core ai task --auto --claim # Auto-select and claim a task\n core ai task:commit <id> -m 'msg' # Commit with task reference\n core ai task:complete <id> # Mark task done",
"priority": { "priority": {
@ -205,12 +284,10 @@
"creating_archives": "Creating archives...", "creating_archives": "Creating archives...",
"error": { "error": {
"archive_failed": "archive failed", "archive_failed": "archive failed",
"build_failed": "build failed",
"checksum_failed": "checksum failed", "checksum_failed": "checksum failed",
"detect_type": "failed to detect project type", "detect_type": "failed to detect project type",
"gpg_signing_failed": "GPG signing failed", "gpg_signing_failed": "GPG signing failed",
"invalid_target": "invalid target format \"{{.Target}}\", expected OS/arch (e.g., linux/amd64)", "invalid_target": "invalid target format \"{{.Target}}\", expected OS/arch (e.g., linux/amd64)",
"load_config": "failed to load config",
"marshal_artifacts": "failed to marshal artifacts", "marshal_artifacts": "failed to marshal artifacts",
"no_project_type": "no supported project type detected in {{.Dir}}\nSupported types: go (go.mod), wails (wails.json), node (package.json), php (composer.json)", "no_project_type": "no supported project type detected in {{.Dir}}\nSupported types: go (go.mod), wails (wails.json), node (package.json), php (composer.json)",
"no_targets": "no valid targets specified", "no_targets": "no valid targets specified",
@ -219,7 +296,6 @@
"php_not_implemented": "PHP builder not yet implemented", "php_not_implemented": "PHP builder not yet implemented",
"signing_failed": "signing failed", "signing_failed": "signing failed",
"unsupported_type": "unsupported project type", "unsupported_type": "unsupported project type",
"working_dir": "failed to get working directory",
"write_checksums": "failed to write CHECKSUMS.txt" "write_checksums": "failed to write CHECKSUMS.txt"
}, },
"flag": { "flag": {
@ -263,11 +339,9 @@
"binary": "Binary:", "binary": "Binary:",
"build": "Build:", "build": "Build:",
"checksum": "Checksum:", "checksum": "Checksum:",
"error": "Error:",
"ok": "OK:", "ok": "OK:",
"output": "Output:", "output": "Output:",
"sign": "Sign:", "sign": "Sign:",
"success": "Success:",
"targets": "Targets:", "targets": "Targets:",
"type": "Type:" "type": "Type:"
}, },
@ -291,8 +365,7 @@
"found_manifest": "Found manifest:", "found_manifest": "Found manifest:",
"no_manifest": "no manifest file found. Proceeding with basic site download.", "no_manifest": "no manifest file found. Proceeding with basic site download.",
"short": "Build from a live PWA URL", "short": "Build from a live PWA URL",
"starting": "Starting PWA build from URL:", "starting": "Starting PWA build from URL:"
"warning": "Warning:"
}, },
"sdk": { "sdk": {
"complete": "SDK generation complete", "complete": "SDK generation complete",
@ -300,7 +373,6 @@
"flag": { "flag": {
"dry_run": "Show what would be generated without writing files", "dry_run": "Show what would be generated without writing files",
"lang": "Generate only this language (typescript, python, go, php)", "lang": "Generate only this language (typescript, python, go, php)",
"spec": "Path to OpenAPI spec file",
"version": "Version to embed in generated SDKs" "version": "Version to embed in generated SDKs"
}, },
"generated_label": "Generated:", "generated_label": "Generated:",
@ -310,7 +382,6 @@
"languages_label": "Languages:", "languages_label": "Languages:",
"long": "Generates typed API clients from OpenAPI specifications.\nSupports TypeScript, Python, Go, and PHP.\n\nExamples:\n core build sdk # Generate all configured SDKs\n core build sdk --lang typescript # Generate only TypeScript SDK\n core build sdk --spec api.yaml # Use specific OpenAPI spec", "long": "Generates typed API clients from OpenAPI specifications.\nSupports TypeScript, Python, Go, and PHP.\n\nExamples:\n core build sdk # Generate all configured SDKs\n core build sdk --lang typescript # Generate only TypeScript SDK\n core build sdk --spec api.yaml # Use specific OpenAPI spec",
"short": "Generate API SDKs from OpenAPI spec", "short": "Generate API SDKs from OpenAPI spec",
"spec_label": "Spec:",
"would_generate": "Would generate SDKs (dry-run)" "would_generate": "Would generate SDKs (dry-run)"
}, },
"short": "Build projects with auto-detection and cross-compilation", "short": "Build projects with auto-detection and cross-compilation",
@ -329,9 +400,7 @@
"error": { "error": {
"determine_version": "failed to determine version", "determine_version": "failed to determine version",
"generate_changelog": "failed to generate changelog", "generate_changelog": "failed to generate changelog",
"load_config": "failed to load config",
"no_publishers": "no publishers configured in .core/release.yaml", "no_publishers": "no publishers configured in .core/release.yaml",
"working_dir": "failed to get working directory",
"write_config": "failed to write config" "write_config": "failed to write config"
}, },
"flag": { "flag": {
@ -354,12 +423,8 @@
"label": { "label": {
"artifacts": "Artifacts:", "artifacts": "Artifacts:",
"ci": "CI:", "ci": "CI:",
"error": "Error:",
"init": "Init:", "init": "Init:",
"note": "Note:", "published": "Published:"
"published": "Published:",
"success": "Success:",
"version": "Version:"
}, },
"long": "Publishes pre-built artifacts from dist/ to configured targets.\nRun 'core build' first to create artifacts.\n\nSAFE BY DEFAULT: Runs in dry-run mode unless --we-are-go-for-launch is specified.\n\nConfiguration: .core/release.yaml", "long": "Publishes pre-built artifacts from dist/ to configured targets.\nRun 'core build' first to create artifacts.\n\nSAFE BY DEFAULT: Runs in dry-run mode unless --we-are-go-for-launch is specified.\n\nConfiguration: .core/release.yaml",
"publish_completed": "Publish completed!", "publish_completed": "Publish completed!",
@ -378,17 +443,14 @@
"short": "Tools for managing service APIs" "short": "Tools for managing service APIs"
}, },
"ci": { "ci": {
"error_label": "Error:",
"failing": "{{.Count}} failing", "failing": "{{.Count}} failing",
"flag": { "flag": {
"branch": "Filter by branch", "branch": "Filter by branch",
"failed": "Show only failed runs", "failed": "Show only failed runs"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"long": "Fetches GitHub Actions workflow status for all repos.\nShows latest run status for each repo.\nRequires the 'gh' CLI to be installed and authenticated.", "long": "Fetches GitHub Actions workflow status for all repos.\nShows latest run status for each repo.\nRequires the 'gh' CLI to be installed and authenticated.",
"no_ci": "{{.Count}} no CI", "no_ci": "{{.Count}} no CI",
"passing": "{{.Count}} passing", "passing": "{{.Count}} passing",
"pending": "{{.Count}} pending",
"repos_checked": "{{.Count}} repos checked", "repos_checked": "{{.Count}} repos checked",
"short": "Check CI status across all repos" "short": "Check CI status across all repos"
}, },
@ -396,8 +458,7 @@
"committing": "Committing dirty repos with Claude...", "committing": "Committing dirty repos with Claude...",
"failed": "Commit failed", "failed": "Commit failed",
"flag": { "flag": {
"all": "Commit all dirty repos without prompting", "all": "Commit all dirty repos without prompting"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"long": "Uses Claude to create commits for dirty repos.\nShows uncommitted changes and invokes Claude to generate commit messages.", "long": "Uses Claude to create commits for dirty repos.\nShows uncommitted changes and invokes Claude to generate commit messages.",
"short": "Claude-assisted commits across repos", "short": "Claude-assisted commits across repos",
@ -406,48 +467,37 @@
"committed": "committed", "committed": "committed",
"committing": "Committing", "committing": "Committing",
"confirm_claude_commit": "Have Claude commit these repos?", "confirm_claude_commit": "Have Claude commit these repos?",
"count_failed": "{{.Count}} failed",
"done_succeeded": "Done: {{.Count}} succeeded", "done_succeeded": "Done: {{.Count}} succeeded",
"health": { "health": {
"ahead_label": "Ahead:", "ahead_label": "Ahead:",
"behind_label": "Behind:", "behind_label": "Behind:",
"dirty": "dirty",
"dirty_label": "Dirty:", "dirty_label": "Dirty:",
"errors": "errors", "errors": "errors",
"errors_label": "Errors:", "errors_label": "Errors:",
"flag": { "flag": {
"registry": "Path to repos.yaml (auto-detected if not specified)",
"verbose": "Show detailed breakdown" "verbose": "Show detailed breakdown"
}, },
"long": "Shows a summary of repository health:\ntotal repos, dirty repos, unpushed commits, etc.", "long": "Shows a summary of repository health:\ntotal repos, dirty repos, unpushed commits, etc.",
"more": "+{{.Count}} more", "more": "+{{.Count}} more",
"repos": "repos", "repos": "repos",
"short": "Quick health check across all repos", "short": "Quick health check across all repos",
"synced": "synced",
"to_pull": "to pull", "to_pull": "to pull",
"to_push": "to push", "to_push": "to push"
"up_to_date": "up to date"
}, },
"impact": { "impact": {
"analysis_for": "Impact analysis for", "analysis_for": "Impact analysis for",
"changes_affect": "Changes to {{.Repo}} affect {{.Affected}}/{{.Total}} repos", "changes_affect": "Changes to {{.Repo}} affect {{.Affected}}/{{.Total}} repos",
"direct_dependents": "{{.Count}} direct dependent(s):", "direct_dependents": "{{.Count}} direct dependent(s):",
"flag": {
"registry": "Path to repos.yaml (auto-detected if not specified)"
},
"long": "Analyzes the dependency graph to show which repos\nwould be affected by changes to the specified repo.", "long": "Analyzes the dependency graph to show which repos\nwould be affected by changes to the specified repo.",
"no_dependents": "No repos depend on {{.Name}}", "no_dependents": "No repos depend on {{.Name}}",
"requires_registry": "impact analysis requires repos.yaml with dependency information", "requires_registry": "impact analysis requires repos.yaml with dependency information",
"short": "Show impact of changing a repo", "short": "Show impact of changing a repo",
"summary": "Summary:",
"transitive_dependents": "{{.Count}} transitive dependent(s):" "transitive_dependents": "{{.Count}} transitive dependent(s):"
}, },
"issues": { "issues": {
"error_label": "Error:",
"flag": { "flag": {
"assignee": "Filter by assignee (use @me for yourself)", "assignee": "Filter by assignee (use @me for yourself)",
"limit": "Max issues per repo", "limit": "Max issues per repo"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"long": "Fetches open issues from GitHub for all repos in the registry.\nRequires the 'gh' CLI to be installed and authenticated.", "long": "Fetches open issues from GitHub for all repos in the registry.\nRequires the 'gh' CLI to be installed and authenticated.",
"no_issues": "No open issues found.", "no_issues": "No open issues found.",
@ -463,8 +513,7 @@
"commits_behind": "{{.Count}} commit(s) behind", "commits_behind": "{{.Count}} commit(s) behind",
"done_pulled": "Done: {{.Count}} pulled", "done_pulled": "Done: {{.Count}} pulled",
"flag": { "flag": {
"all": "Pull all repos, not just those behind", "all": "Pull all repos, not just those behind"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"long": "Pulls updates for all repos.\nBy default only pulls repos that are behind. Use --all to pull all repos.", "long": "Pulls updates for all repos.\nBy default only pulls repos that are behind. Use --all to pull all repos.",
"pulling": "Pulling", "pulling": "Pulling",
@ -474,7 +523,6 @@
}, },
"push": { "push": {
"all_up_to_date": "All repos up to date. Nothing to push.", "all_up_to_date": "All repos up to date. Nothing to push.",
"commits_count": "{{.Count}} commit(s)",
"confirm": "Push all?", "confirm": "Push all?",
"confirm_push": "Push {{.Commits}} commit(s) to {{.Repos}} repo(s)?", "confirm_push": "Push {{.Commits}} commit(s) to {{.Repos}} repo(s)?",
"diverged": "branch has diverged from remote", "diverged": "branch has diverged from remote",
@ -482,18 +530,15 @@
"done_pushed": "Done: {{.Count}} pushed", "done_pushed": "Done: {{.Count}} pushed",
"failed": "Push failed", "failed": "Push failed",
"flag": { "flag": {
"force": "Skip confirmation prompt", "force": "Skip confirmation prompt"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"long": "Pushes unpushed commits for all repos.\nShows repos with commits to push and confirms before pushing.", "long": "Pushes unpushed commits for all repos.\nShows repos with commits to push and confirms before pushing.",
"nothing": "Nothing to push", "nothing": "Nothing to push",
"pull_and_retry": "Pull changes and retry push?", "pull_and_retry": "Pull changes and retry push?",
"repos_with_unpushed": "{{.Count}} repo(s) with unpushed commits:",
"short": "Push commits across all repos", "short": "Push commits across all repos",
"success": "Pushed successfully", "success": "Pushed successfully",
"uncommitted_changes_commit": "You have uncommitted changes. Commit with Claude first?" "uncommitted_changes_commit": "You have uncommitted changes. Commit with Claude first?"
}, },
"registry_label": "Registry:",
"repos_with_changes": "{{.Count}} repo(s) with uncommitted changes:", "repos_with_changes": "{{.Count}} repo(s) with uncommitted changes:",
"reviews": { "reviews": {
"approved": "{{.Count}} approved", "approved": "{{.Count}} approved",
@ -501,13 +546,11 @@
"draft": "[draft]", "draft": "[draft]",
"flag": { "flag": {
"all": "Show all PRs including drafts", "all": "Show all PRs including drafts",
"author": "Filter by PR author", "author": "Filter by PR author"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"long": "Fetches open PRs from GitHub for all repos in the registry.\nShows review status (approved, changes requested, pending).\nRequires the 'gh' CLI to be installed and authenticated.", "long": "Fetches open PRs from GitHub for all repos in the registry.\nShows review status (approved, changes requested, pending).\nRequires the 'gh' CLI to be installed and authenticated.",
"no_prs": "No open PRs found.", "no_prs": "No open PRs found.",
"open_prs": "{{.Count}} open PR(s)", "open_prs": "{{.Count}} open PR(s)",
"pending": "{{.Count}} pending",
"short": "List PRs needing review across all repos", "short": "List PRs needing review across all repos",
"status_approved": "v approved", "status_approved": "v approved",
"status_changes": "* changes requested", "status_changes": "* changes requested",
@ -521,12 +564,9 @@
"behind": "behind", "behind": "behind",
"clean": "clean", "clean": "clean",
"conflict": "conflict", "conflict": "conflict",
"dirty": "dirty", "diverged": "diverged"
"diverged": "diverged",
"synced": "synced"
}, },
"sync": { "sync": {
"error_prefix": "Error:",
"long": "This command scans the 'pkg' directory for services and ensures that the\ntop-level public API for each service is in sync with its internal implementation.\nIt automatically generates the necessary Go files with type aliases.", "long": "This command scans the 'pkg' directory for services and ensures that the\ntop-level public API for each service is in sync with its internal implementation.\nIt automatically generates the necessary Go files with type aliases.",
"short": "Synchronizes public service APIs with internal implementations", "short": "Synchronizes public service APIs with internal implementations",
"success": "Public APIs synchronized successfully." "success": "Public APIs synchronized successfully."
@ -545,7 +585,6 @@
}, },
"booting": "Booting dev environment...", "booting": "Booting dev environment...",
"check_updates": "Use {{.Command}} to check for updates", "check_updates": "Use {{.Command}} to check for updates",
"checking_updates": "Checking for updates...",
"claude": { "claude": {
"flag": { "flag": {
"auth": "Selective auth forwarding (gh,anthropic,ssh,git)", "auth": "Selective auth forwarding (gh,anthropic,ssh,git)",
@ -560,10 +599,8 @@
"connect_with": "Connect with: {{.Command}}", "connect_with": "Connect with: {{.Command}}",
"container_label": "Container:", "container_label": "Container:",
"cpus_label": "CPUs:", "cpus_label": "CPUs:",
"current_label": "Current:",
"downloading": "Downloading dev environment...", "downloading": "Downloading dev environment...",
"downloading_update": "Downloading update...", "downloading_update": "Downloading update...",
"image_label": "Image:",
"install": { "install": {
"long": "Downloads the platform-specific dev environment image.\n\nThe image includes Go, PHP, Node.js, Python, Docker, and Claude CLI.\nDownloads are cached at ~/.core/images/\n\nExamples:\n core dev install", "long": "Downloads the platform-specific dev environment image.\n\nThe image includes Go, PHP, Node.js, Python, Docker, and Claude CLI.\nDownloads are cached at ~/.core/images/\n\nExamples:\n core dev install",
"short": "Download and install the dev environment image" "short": "Download and install the dev environment image"
@ -601,15 +638,11 @@
"long": "Shows the current status of the dev environment.\n\nExamples:\n core dev vm-status", "long": "Shows the current status of the dev environment.\n\nExamples:\n core dev vm-status",
"short": "Show dev environment status" "short": "Show dev environment status"
}, },
"status_label": "Status:",
"status_running": "Running",
"status_stopped": "Stopped",
"status_title": "Dev Environment Status", "status_title": "Dev Environment Status",
"stop": { "stop": {
"long": "Stops the running dev environment VM.\n\nExamples:\n core dev stop", "long": "Stops the running dev environment VM.\n\nExamples:\n core dev stop",
"short": "Stop the dev environment" "short": "Stop the dev environment"
}, },
"stopped": "Stopped",
"stopping": "Stopping dev environment...", "stopping": "Stopping dev environment...",
"stopping_current": "Stopping current instance...", "stopping_current": "Stopping current instance...",
"test": { "test": {
@ -629,24 +662,19 @@
}, },
"update_available": "Update available", "update_available": "Update available",
"updated_in": "Updated in {{.Duration}}", "updated_in": "Updated in {{.Duration}}",
"uptime_label": "Uptime:", "uptime_label": "Uptime:"
"version_label": "Version:"
}, },
"work": { "work": {
"all_up_to_date": "All repos up to date.", "all_up_to_date": "All repos up to date.",
"commits_count": "{{.Count}} commit(s)",
"error_prefix": "error:", "error_prefix": "error:",
"flag": { "flag": {
"commit": "Use Claude to commit dirty repos before pushing", "commit": "Use Claude to commit dirty repos before pushing",
"registry": "Path to repos.yaml (auto-detected if not specified)",
"status": "Show status only, don't push" "status": "Show status only, don't push"
}, },
"long": "Manage git status, commits, and pushes across multiple repositories.\n\nReads repos.yaml to discover repositories and their relationships.\nShows status, optionally commits with Claude, and pushes changes.", "long": "Manage git status, commits, and pushes across multiple repositories.\n\nReads repos.yaml to discover repositories and their relationships.\nShows status, optionally commits with Claude, and pushes changes.",
"repos_with_unpushed": "{{.Count}} repo(s) with unpushed commits:",
"short": "Multi-repo git operations", "short": "Multi-repo git operations",
"table_ahead": "Ahead", "table_ahead": "Ahead",
"table_modified": "Modified", "table_modified": "Modified",
"table_repo": "Repo",
"table_staged": "Staged", "table_staged": "Staged",
"table_untracked": "Untracked", "table_untracked": "Untracked",
"use_commit_flag": "Use --commit to have Claude create commits" "use_commit_flag": "Use --commit to have Claude create commits"
@ -658,18 +686,12 @@
"scan_directory": "failed to scan directory" "scan_directory": "failed to scan directory"
}, },
"list": { "list": {
"coverage_label": "Coverage",
"coverage_summary": "{{.WithDocs}} with docs, {{.WithoutDocs}} without", "coverage_summary": "{{.WithDocs}} with docs, {{.WithoutDocs}} without",
"files_count": "{{.Count}} files",
"flag": {
"registry": "Path to repos.yaml (auto-detected if not specified)"
},
"header": { "header": {
"changelog": "CHANGELOG", "changelog": "CHANGELOG",
"claude": "CLAUDE", "claude": "CLAUDE",
"docs": "docs/", "docs": "docs/",
"readme": "README", "readme": "README"
"repo": "Repo"
}, },
"long": "List documentation files for all repos in the workspace.\n\nShows README.md, CLAUDE.md, CHANGELOG.md, and docs/ directory status\nfor each repository.", "long": "List documentation files for all repos in the workspace.\n\nShows README.md, CLAUDE.md, CHANGELOG.md, and docs/ directory status\nfor each repository.",
"short": "List documentation across repos" "short": "List documentation across repos"
@ -678,13 +700,11 @@
"short": "Documentation management", "short": "Documentation management",
"sync": { "sync": {
"confirm": "Sync?", "confirm": "Sync?",
"done_label": "Done:",
"dry_run_notice": "Dry run - no files copied", "dry_run_notice": "Dry run - no files copied",
"files_count": "({{.Count}} files)", "files_count": "({{.Count}} files)",
"flag": { "flag": {
"dry_run": "Show what would be synced without copying", "dry_run": "Show what would be synced without copying",
"output": "Output directory (default: core-php/docs/packages)", "output": "Output directory (default: core-php/docs/packages)"
"registry": "Path to repos.yaml (auto-detected if not specified)"
}, },
"found_label": "Found", "found_label": "Found",
"long": "Sync documentation from all repos to a central location.\n\nCopies docs/ directories from each package to core-php/docs/packages/\nfor unified documentation builds.", "long": "Sync documentation from all repos to a central location.\n\nCopies docs/ directories from each package to core-php/docs/packages/\nfor unified documentation builds.",
@ -692,7 +712,6 @@
"repos_with_docs": "{{.Count}} repo(s) with docs/ directories", "repos_with_docs": "{{.Count}} repo(s) with docs/ directories",
"short": "Sync documentation to core-php/docs/packages/", "short": "Sync documentation to core-php/docs/packages/",
"synced_packages": "Synced {{.Count}} packages", "synced_packages": "Synced {{.Count}} packages",
"total_label": "Total:",
"total_summary": "{{.Files}} files from {{.Repos}} repos → {{.Output}}" "total_summary": "{{.Files}} files from {{.Repos}} repos → {{.Output}}"
} }
}, },
@ -777,11 +796,9 @@
"flag": { "flag": {
"html": "Generate HTML coverage report", "html": "Generate HTML coverage report",
"open": "Generate and open HTML report in browser", "open": "Generate and open HTML report in browser",
"pkg": "Package to test (default: ./...)",
"threshold": "Minimum coverage percentage (exit 1 if below)" "threshold": "Minimum coverage percentage (exit 1 if below)"
}, },
"html_label": "HTML:", "html_label": "HTML:",
"label": "Coverage:",
"long": "Run tests and generate coverage report.\n\nExamples:\n core go cov # Run with coverage summary\n core go cov --html # Generate HTML report\n core go cov --open # Generate and open HTML report\n core go cov --threshold 80 # Fail if coverage < 80%", "long": "Run tests and generate coverage report.\n\nExamples:\n core go cov # Run with coverage summary\n core go cov --html # Generate HTML report\n core go cov --open # Generate and open HTML report\n core go cov --threshold 80 # Fail if coverage < 80%",
"open_manually": "(open manually)", "open_manually": "(open manually)",
"running": "Running tests with coverage", "running": "Running tests with coverage",
@ -790,7 +807,6 @@
"fmt": { "fmt": {
"flag": { "flag": {
"check": "Check only, exit 1 if not formatted", "check": "Check only, exit 1 if not formatted",
"diff": "Show diff of changes",
"fix": "Fix formatting in place" "fix": "Fix formatting in place"
}, },
"long": "Format Go code using gofmt or goimports.\n\nExamples:\n core go fmt # Check formatting\n core go fmt --fix # Fix formatting\n core go fmt --diff # Show diff", "long": "Format Go code using gofmt or goimports.\n\nExamples:\n core go fmt # Check formatting\n core go fmt --fix # Fix formatting\n core go fmt --diff # Show diff",
@ -801,14 +817,10 @@
"cgo_label": "CGO:", "cgo_label": "CGO:",
"failed": "FAIL Install failed", "failed": "FAIL Install failed",
"flag": { "flag": {
"no_cgo": "Disable CGO (CGO_ENABLED=0)", "no_cgo": "Disable CGO (CGO_ENABLED=0)"
"verbose": "Verbose output"
}, },
"installed_to": "Installed to {{.Path}}", "installed_to": "Installed to {{.Path}}",
"installing": "Installing",
"label": "Install:",
"long": "Install Go binary to $GOPATH/bin.\n\nExamples:\n core go install # Install current module\n core go install ./cmd/core # Install specific path\n core go install --no-cgo # Pure Go (no C dependencies)\n core go install -v # Verbose output", "long": "Install Go binary to $GOPATH/bin.\n\nExamples:\n core go install # Install current module\n core go install ./cmd/core # Install specific path\n core go install --no-cgo # Pure Go (no C dependencies)\n core go install -v # Verbose output",
"path_label": "Path:",
"short": "Install Go binary", "short": "Install Go binary",
"success": "OK" "success": "OK"
}, },
@ -841,21 +853,13 @@
"all_passed": "PASS All tests passed", "all_passed": "PASS All tests passed",
"coverage": "Coverage", "coverage": "Coverage",
"flag": { "flag": {
"coverage": "Show detailed per-package coverage",
"json": "Output JSON results", "json": "Output JSON results",
"pkg": "Package to test (default: ./...)",
"race": "Enable race detector", "race": "Enable race detector",
"run": "Run only tests matching regexp", "run": "Run only tests matching regexp",
"short": "Run only short tests", "short": "Run only short tests"
"verbose": "Verbose output"
}, },
"label": "Test:",
"long": "Run Go tests with coverage reporting.\n\nSets MACOSX_DEPLOYMENT_TARGET=26.0 to suppress linker warnings.\nFilters noisy output and provides colour-coded coverage.\n\nExamples:\n core go test\n core go test --coverage\n core go test --pkg ./pkg/crypt\n core go test --run TestHash", "long": "Run Go tests with coverage reporting.\n\nSets MACOSX_DEPLOYMENT_TARGET=26.0 to suppress linker warnings.\nFilters noisy output and provides colour-coded coverage.\n\nExamples:\n core go test\n core go test --coverage\n core go test --pkg ./pkg/crypt\n core go test --run TestHash",
"package_label": "Package:",
"passed": "{{.Count}} passed",
"passed_failed": "{{.Passed}} passed, {{.Failed}} failed", "passed_failed": "{{.Passed}} passed, {{.Failed}} failed",
"running": "Running tests",
"short": "Run tests with coverage",
"some_failed": "FAIL Some tests failed" "some_failed": "FAIL Some tests failed"
}, },
"work": { "work": {
@ -884,7 +888,6 @@
}, },
"long": "Run PHPStan or Larastan static analysis.\n\nAuto-detects Larastan if installed, otherwise uses PHPStan.", "long": "Run PHPStan or Larastan static analysis.\n\nAuto-detects Larastan if installed, otherwise uses PHPStan.",
"no_analyser": "no static analyser found (install PHPStan: composer require phpstan/phpstan --dev)", "no_analyser": "no static analyser found (install PHPStan: composer require phpstan/phpstan --dev)",
"no_issues": "No issues found",
"running": "Running static analysis with {{.Analyser}}", "running": "Running static analysis with {{.Analyser}}",
"short": "Run PHPStan static analysis" "short": "Run PHPStan static analysis"
}, },
@ -892,10 +895,8 @@
"all_secure": "All dependencies are secure", "all_secure": "All dependencies are secure",
"completed_errors": "audit completed with errors", "completed_errors": "audit completed with errors",
"error": "error", "error": "error",
"fix_hint": "composer update && npm update",
"flag": { "flag": {
"fix": "Auto-fix vulnerabilities (npm only)", "fix": "Auto-fix vulnerabilities (npm only)"
"json": "Output in JSON format"
}, },
"found_vulns": "Found {{.Count}} vulnerabilities across dependencies", "found_vulns": "Found {{.Count}} vulnerabilities across dependencies",
"long": "Check PHP and JavaScript dependencies for known vulnerabilities.\n\nRuns composer audit and npm audit (if package.json exists).", "long": "Check PHP and JavaScript dependencies for known vulnerabilities.\n\nRuns composer audit and npm audit (if package.json exists).",
@ -917,21 +918,18 @@
"no_cache": "Build without cache", "no_cache": "Build without cache",
"output": "Output path for LinuxKit image", "output": "Output path for LinuxKit image",
"platform": "Target platform (e.g., linux/amd64, linux/arm64)", "platform": "Target platform (e.g., linux/amd64, linux/arm64)",
"tag": "Image tag (default: latest)",
"template": "LinuxKit template name (default: server-php)", "template": "LinuxKit template name (default: server-php)",
"type": "Build type: docker (default) or linuxkit" "type": "Build type: docker (default) or linuxkit"
}, },
"format": "Format:", "format": "Format:",
"frontend": "Frontend:", "frontend": "Frontend:",
"image": "Image:",
"laravel": "Laravel:", "laravel": "Laravel:",
"linuxkit_success": "LinuxKit image built successfully", "linuxkit_success": "LinuxKit image built successfully",
"long": "Build a production-ready container image for the PHP project.\n\nBy default, builds a Docker image using FrankenPHP.\nUse --type linuxkit to build a LinuxKit VM image instead.", "long": "Build a production-ready container image for the PHP project.\n\nBy default, builds a Docker image using FrankenPHP.\nUse --type linuxkit to build a LinuxKit VM image instead.",
"octane": "Octane:", "octane": "Octane:",
"php_version": "PHP Version:", "php_version": "PHP Version:",
"platform": "Platform:", "platform": "Platform:",
"short": "Build Docker or LinuxKit image", "short": "Build Docker or LinuxKit image"
"template": "Template:"
}, },
"deploy": { "deploy": {
"deploying": "Deploying to {{.Environment}}...", "deploying": "Deploying to {{.Environment}}...",
@ -1002,13 +1000,11 @@
"error": { "error": {
"analysis_issues": "analysis found issues", "analysis_issues": "analysis found issues",
"audit_failed": "audit failed", "audit_failed": "audit failed",
"build_failed": "build failed",
"critical_high_issues": "critical or high severity issues found", "critical_high_issues": "critical or high severity issues found",
"deploy_failed": "deployment failed", "deploy_failed": "deployment failed",
"detect_config": "failed to detect project configuration", "detect_config": "failed to detect project configuration",
"fmt_failed": "formatting failed", "fmt_failed": "formatting failed",
"fmt_issues": "formatting issues found", "fmt_issues": "formatting issues found",
"get_logs": "failed to get logs",
"infection_failed": "mutation testing failed", "infection_failed": "mutation testing failed",
"infection_not_installed": "infection not installed", "infection_not_installed": "infection not installed",
"link_packages": "failed to link packages", "link_packages": "failed to link packages",
@ -1030,16 +1026,13 @@
"start_services": "failed to start services", "start_services": "failed to start services",
"status_failed": "failed to get status", "status_failed": "failed to get status",
"stop_services": "failed to stop services", "stop_services": "failed to stop services",
"tests_failed": "tests failed",
"unlink_packages": "failed to unlink packages", "unlink_packages": "failed to unlink packages",
"update_packages": "composer update failed", "update_packages": "composer update failed",
"vulns_found": "vulnerabilities found", "vulns_found": "vulnerabilities found"
"working_dir": "failed to get working directory"
}, },
"fmt": { "fmt": {
"checking": "Checking code with {{.Formatter}}", "checking": "Checking code with {{.Formatter}}",
"flag": { "flag": {
"diff": "Show diff of changes",
"fix": "Auto-fix formatting issues" "fix": "Auto-fix formatting issues"
}, },
"formatting": "Formatting code with {{.Formatter}}", "formatting": "Formatting code with {{.Formatter}}",
@ -1072,14 +1065,10 @@
"commit": "Commit:", "commit": "Commit:",
"completed": "Completed:", "completed": "Completed:",
"deploy": "Deploy:", "deploy": "Deploy:",
"done": "Done:",
"duration": "Duration:", "duration": "Duration:",
"error": "Error:",
"fix": "Fix:",
"id": "ID:", "id": "ID:",
"infection": "Infection:", "infection": "Infection:",
"info": "Info:", "info": "Info:",
"install": "Install:",
"message": "Message:", "message": "Message:",
"php": "PHP:", "php": "PHP:",
"psalm": "Psalm:", "psalm": "Psalm:",
@ -1089,17 +1078,10 @@
"security": "Security:", "security": "Security:",
"services": "Services:", "services": "Services:",
"setup": "Setup:", "setup": "Setup:",
"skip": "Skip:", "vite": "Vite:"
"started": "Started:",
"status": "Status:",
"summary": "Summary:",
"url": "URL:",
"vite": "Vite:",
"warning": "Warning:"
}, },
"logs": { "logs": {
"flag": { "flag": {
"follow": "Follow log output",
"service": "Specific service (default: all)" "service": "Specific service (default: all)"
}, },
"long": "Stream logs from Laravel services.\n\nServices: frankenphp, vite, horizon, reverb, redis", "long": "Stream logs from Laravel services.\n\nServices: frankenphp, vite, horizon, reverb, redis",
@ -1117,10 +1099,8 @@
"linked": "Linked packages:", "linked": "Linked packages:",
"long": "List all locally linked packages.\n\nShows package name, path, and version for each linked package.", "long": "List all locally linked packages.\n\nShows package name, path, and version for each linked package.",
"none_found": "No linked packages found", "none_found": "No linked packages found",
"path": "Path:",
"short": "List linked packages", "short": "List linked packages",
"unknown": "(unknown)", "unknown": "(unknown)"
"version": "Version:"
}, },
"long": "Link and manage local PHP packages for development.\n\nSimilar to npm link, this adds path repositories to composer.json\nfor developing packages alongside your project.", "long": "Link and manage local PHP packages for development.\n\nSimilar to npm link, this adds path repositories to composer.json\nfor developing packages alongside your project.",
"short": "Manage local PHP packages", "short": "Manage local PHP packages",
@ -1142,13 +1122,11 @@
"analysing_fixing": "Analysing and fixing code with Psalm", "analysing_fixing": "Analysing and fixing code with Psalm",
"flag": { "flag": {
"baseline": "Generate/update baseline file", "baseline": "Generate/update baseline file",
"fix": "Auto-fix issues where possible",
"level": "Error level (1=strictest, 8=most lenient)", "level": "Error level (1=strictest, 8=most lenient)",
"show_info": "Show info-level issues" "show_info": "Show info-level issues"
}, },
"install": "composer require --dev vimeo/psalm", "install": "composer require --dev vimeo/psalm",
"long": "Run Psalm deep static analysis with Laravel plugin support.\n\nPsalm provides deeper type inference than PHPStan and catches\ndifferent classes of bugs. Both should be run for best coverage.", "long": "Run Psalm deep static analysis with Laravel plugin support.\n\nPsalm provides deeper type inference than PHPStan and catches\ndifferent classes of bugs. Both should be run for best coverage.",
"no_issues": "No issues found",
"not_found": "Psalm not found", "not_found": "Psalm not found",
"setup": "./vendor/bin/psalm --init", "setup": "./vendor/bin/psalm --init",
"short": "Run Psalm static analysis" "short": "Run Psalm static analysis"
@ -1156,13 +1134,11 @@
"qa": { "qa": {
"all_passed": "All checks passed ({{.Passed}}/{{.Total}})", "all_passed": "All checks passed ({{.Passed}}/{{.Total}})",
"failed": "failed", "failed": "failed",
"fix_audit": "composer update && npm update",
"fix_infection": "Improve test coverage for mutated code", "fix_infection": "Improve test coverage for mutated code",
"fix_phpstan": "Fix PHPStan errors shown above", "fix_phpstan": "Fix PHPStan errors shown above",
"fix_psalm": "Fix Psalm errors shown above", "fix_psalm": "Fix Psalm errors shown above",
"fix_tests": "Fix failing tests shown above", "fix_tests": "Fix failing tests shown above",
"flag": { "flag": {
"fix": "Auto-fix issues where possible",
"full": "Run all stages including slow checks", "full": "Run all stages including slow checks",
"quick": "Only run quick checks" "quick": "Only run quick checks"
}, },
@ -1204,9 +1180,7 @@
"security": { "security": {
"checks_suffix": " CHECKS:", "checks_suffix": " CHECKS:",
"critical": "Critical:", "critical": "Critical:",
"fix_label": "Fix:",
"flag": { "flag": {
"json": "Output in JSON format",
"sarif": "Output in SARIF format (for GitHub Security)", "sarif": "Output in SARIF format (for GitHub Security)",
"severity": "Minimum severity (critical, high, medium, low)", "severity": "Minimum severity (critical, high, medium, low)",
"url": "URL to check HTTP headers (optional)" "url": "URL to check HTTP headers (optional)"
@ -1227,8 +1201,7 @@
"env_file": "Path to environment file", "env_file": "Path to environment file",
"https_port": "HTTPS port (default: 443)", "https_port": "HTTPS port (default: 443)",
"name": "Docker image name (required)", "name": "Docker image name (required)",
"port": "HTTP port (default: 80)", "port": "HTTP port (default: 80)"
"tag": "Image tag (default: latest)"
}, },
"long": "Run a production PHP container.\n\nThis starts the built Docker image in production mode.", "long": "Run a production PHP container.\n\nThis starts the built Docker image in production mode.",
"name_required": "--name is required: specify the Docker image name", "name_required": "--name is required: specify the Docker image name",
@ -1252,7 +1225,6 @@
}, },
"install_linux": "Linux: see https://github.com/FiloSottile/mkcert", "install_linux": "Linux: see https://github.com/FiloSottile/mkcert",
"install_macos": "macOS: brew install mkcert", "install_macos": "macOS: brew install mkcert",
"install_with": "Install with:",
"key_label": "Key:", "key_label": "Key:",
"mkcert_not_installed": "mkcert is not installed", "mkcert_not_installed": "mkcert is not installed",
"setting_up": "Setting up SSL for {{.Domain}}", "setting_up": "Setting up SSL for {{.Domain}}",
@ -1265,7 +1237,6 @@
"package_manager": "Package manager:", "package_manager": "Package manager:",
"pid": "pid {{.PID}}", "pid": "pid {{.PID}}",
"port": "port {{.Port}}", "port": "port {{.Port}}",
"project": "Project:",
"running": "running", "running": "running",
"short": "Show service status", "short": "Show service status",
"ssl_certs": "SSL certificates:", "ssl_certs": "SSL certificates:",
@ -1286,7 +1257,6 @@
"parallel": "Run tests in parallel" "parallel": "Run tests in parallel"
}, },
"long": "Run PHP tests using PHPUnit or Pest.\n\nAuto-detects Pest if tests/Pest.php exists, otherwise uses PHPUnit.", "long": "Run PHP tests using PHPUnit or Pest.\n\nAuto-detects Pest if tests/Pest.php exists, otherwise uses PHPUnit.",
"passed": "All tests passed",
"running": "Running tests with {{.Runner}}", "running": "Running tests with {{.Runner}}",
"short": "Run PHP tests (PHPUnit/Pest)" "short": "Run PHP tests (PHPUnit/Pest)"
} }
@ -1309,8 +1279,6 @@
"add_to_registry": "add to registry", "add_to_registry": "add to registry",
"added_to_registry": "added to repos.yaml", "added_to_registry": "added to repos.yaml",
"already_exists": "{{.Name}} already exists at {{.Path}}", "already_exists": "{{.Name}} already exists at {{.Path}}",
"cloning": "Cloning",
"done_label": "Done:",
"flag": { "flag": {
"add": "Add to repos.yaml registry", "add": "Add to repos.yaml registry",
"dir": "Target directory (default: ./packages or current dir)" "dir": "Target directory (default: ./packages or current dir)"
@ -1318,9 +1286,7 @@
"installed": "Installed {{.Name}}", "installed": "Installed {{.Name}}",
"installing_label": "Installing:", "installing_label": "Installing:",
"long": "Clones a repository from GitHub.\n\nExamples:\n core pkg install host-uk/core-php\n core pkg install host-uk/core-tenant --dir ./packages\n core pkg install host-uk/core-admin --add", "long": "Clones a repository from GitHub.\n\nExamples:\n core pkg install host-uk/core-php\n core pkg install host-uk/core-tenant --dir ./packages\n core pkg install host-uk/core-admin --add",
"short": "Clone a package from GitHub", "short": "Clone a package from GitHub"
"skip_label": "Skip:",
"target_label": "Target:"
}, },
"list": { "list": {
"install_missing": "Install missing:", "install_missing": "Install missing:",
@ -1328,21 +1294,17 @@
"no_packages": "No packages in registry.", "no_packages": "No packages in registry.",
"short": "List installed packages", "short": "List installed packages",
"summary": "{{.Installed}} installed, {{.Missing}} missing", "summary": "{{.Installed}} installed, {{.Missing}} missing",
"title": "Installed Packages", "title": "Installed Packages"
"total_label": "Total:"
}, },
"long": "Manage host-uk/core-* packages and repositories.\n\nCommands:\n search Search GitHub for packages\n install Clone a package from GitHub\n list List installed packages\n update Update installed packages\n outdated Check for outdated packages", "long": "Manage host-uk/core-* packages and repositories.\n\nCommands:\n search Search GitHub for packages\n install Clone a package from GitHub\n list List installed packages\n update Update installed packages\n outdated Check for outdated packages",
"no_description": "(no description)", "no_description": "(no description)",
"outdated": { "outdated": {
"all_up_to_date": "All packages up to date", "all_up_to_date": "All packages up to date",
"checking": "Checking for updates...",
"commits_behind": "{{.Count}} commits behind", "commits_behind": "{{.Count}} commits behind",
"done_label": "Done:",
"long": "Checks which packages have unpulled commits.\n\nExamples:\n core pkg outdated", "long": "Checks which packages have unpulled commits.\n\nExamples:\n core pkg outdated",
"outdated_label": "Outdated:", "outdated_label": "Outdated:",
"short": "Check for outdated packages", "short": "Check for outdated packages",
"summary": "{{.Outdated}} outdated, {{.UpToDate}} up to date", "summary": "{{.Outdated}} outdated, {{.UpToDate}} up to date",
"summary_label": "Summary:",
"update_with": "Update with:" "update_with": "Update with:"
}, },
"search": { "search": {
@ -1358,16 +1320,13 @@
"found_repos": "Found {{.Count}} repositories:", "found_repos": "Found {{.Count}} repositories:",
"gh_token_unset": "Unset it with: unset GH_TOKEN", "gh_token_unset": "Unset it with: unset GH_TOKEN",
"gh_token_warning": "GH_TOKEN env var is set - this may cause auth issues", "gh_token_warning": "GH_TOKEN env var is set - this may cause auth issues",
"install_with": "Install with:",
"long": "Searches GitHub for repositories matching a pattern.\nUses gh CLI for authenticated search. Results are cached for 1 hour.\n\nExamples:\n core pkg search # List all host-uk repos\n core pkg search --pattern 'core-*' # Search for core-* repos\n core pkg search --org mycompany # Search different org\n core pkg search --refresh # Bypass cache", "long": "Searches GitHub for repositories matching a pattern.\nUses gh CLI for authenticated search. Results are cached for 1 hour.\n\nExamples:\n core pkg search # List all host-uk repos\n core pkg search --pattern 'core-*' # Search for core-* repos\n core pkg search --org mycompany # Search different org\n core pkg search --refresh # Bypass cache",
"no_repos_found": "No repositories found matching pattern.", "no_repos_found": "No repositories found matching pattern.",
"note_label": "Note:",
"private_label": "[private]", "private_label": "[private]",
"short": "Search GitHub for packages" "short": "Search GitHub for packages"
}, },
"short": "Package management for core-* repos", "short": "Package management for core-* repos",
"update": { "update": {
"done_label": "Done:",
"flag": { "flag": {
"all": "Update all packages" "all": "Update all packages"
}, },
@ -1375,7 +1334,6 @@
"not_installed": "not installed", "not_installed": "not installed",
"short": "Update installed packages", "short": "Update installed packages",
"summary": "{{.Updated}} updated, {{.Skipped}} skipped, {{.Failed}} failed", "summary": "{{.Updated}} updated, {{.Skipped}} skipped, {{.Failed}} failed",
"up_to_date": "up to date",
"update_label": "Update:", "update_label": "Update:",
"updating": "Updating {{.Count}} package(s)" "updating": "Updating {{.Count}} package(s)"
} }
@ -1385,7 +1343,6 @@
"base_label": "Base:", "base_label": "Base:",
"breaking": "Breaking:", "breaking": "Breaking:",
"checking": "Checking for breaking changes", "checking": "Checking for breaking changes",
"current_label": "Current:",
"error": { "error": {
"base_required": "--base is required (version tag or file path)" "base_required": "--base is required (version tag or file path)"
}, },
@ -1397,23 +1354,15 @@
"long": "Check for breaking API changes between spec versions.\n\nCompares a base spec (version tag or file) against the current spec\nand reports any breaking changes that would affect API consumers.", "long": "Check for breaking API changes between spec versions.\n\nCompares a base spec (version tag or file) against the current spec\nand reports any breaking changes that would affect API consumers.",
"short": "Check for breaking API changes" "short": "Check for breaking API changes"
}, },
"error": {
"working_dir": "failed to get working directory"
},
"label": { "label": {
"error": "Error:",
"ok": "OK:", "ok": "OK:",
"sdk": "SDK:" "sdk": "SDK:"
}, },
"long": "Tools for validating OpenAPI specs and checking API compatibility.\nTo generate SDKs, use: core build sdk\n\nCommands:\n diff Check for breaking API changes\n validate Validate OpenAPI spec syntax", "long": "Tools for validating OpenAPI specs and checking API compatibility.\nTo generate SDKs, use: core build sdk\n\nCommands:\n diff Check for breaking API changes\n validate Validate OpenAPI spec syntax",
"short": "SDK validation and API compatibility tools", "short": "SDK validation and API compatibility tools",
"validate": { "validate": {
"flag": {
"spec": "Path to OpenAPI spec file"
},
"long": "Validate OpenAPI spec syntax.\n\nChecks that the OpenAPI specification file is valid and well-formed.", "long": "Validate OpenAPI spec syntax.\n\nChecks that the OpenAPI specification file is valid and well-formed.",
"short": "Validate OpenAPI spec", "short": "Validate OpenAPI spec",
"spec_label": "Spec:",
"valid": "Spec is valid", "valid": "Spec is valid",
"validating": "Validating OpenAPI spec" "validating": "Validating OpenAPI spec"
} }
@ -1425,18 +1374,11 @@
"cancelled": "Cancelled.", "cancelled": "Cancelled.",
"cloned": "cloned", "cloned": "cloned",
"cloned_count": "{{.Count}} cloned", "cloned_count": "{{.Count}} cloned",
"cloning": "Cloning",
"cloning_current_dir": "Cloning into current directory", "cloning_current_dir": "Cloning into current directory",
"complete": "Setup complete", "complete": "Setup complete",
"creating_project_dir": "Creating project directory", "creating_project_dir": "Creating project directory",
"done": "done", "done": "done",
"done_label": "Done:",
"error": {
"build_failed": "build failed"
},
"exist": "{{.Count}} exist", "exist": "{{.Count}} exist",
"failed_count": "{{.Count}} failed",
"filter_label": "Filter:",
"flag": { "flag": {
"all": "Skip wizard, clone all packages (non-interactive)", "all": "Skip wizard, clone all packages (non-interactive)",
"build": "Run build after cloning", "build": "Run build after cloning",
@ -1448,7 +1390,6 @@
"long": "Sets up a development workspace.\n\nREGISTRY MODE (repos.yaml exists):\n Clones all repositories defined in repos.yaml into packages/.\n Skips repos that already exist. Use --only to filter by type.\n\nBOOTSTRAP MODE (no repos.yaml):\n 1. Clones core-devops to set up the workspace\n 2. Presents an interactive wizard to select packages\n 3. Clones selected packages\n\nUse --all to skip the wizard and clone everything.", "long": "Sets up a development workspace.\n\nREGISTRY MODE (repos.yaml exists):\n Clones all repositories defined in repos.yaml into packages/.\n Skips repos that already exist. Use --only to filter by type.\n\nBOOTSTRAP MODE (no repos.yaml):\n 1. Clones core-devops to set up the workspace\n 2. Presents an interactive wizard to select packages\n 3. Clones selected packages\n\nUse --all to skip the wizard and clone everything.",
"nothing_to_clone": "Nothing to clone.", "nothing_to_clone": "Nothing to clone.",
"org_label": "Org:", "org_label": "Org:",
"registry_label": "Registry:",
"repo": { "repo": {
"created": "Created", "created": "Created",
"detected_type": "Detected project type", "detected_type": "Detected project type",
@ -1457,8 +1398,6 @@
}, },
"running_build": "Running build...", "running_build": "Running build...",
"short": "Bootstrap workspace or clone packages from registry", "short": "Bootstrap workspace or clone packages from registry",
"skipped": "{{.Count}} skipped",
"target_label": "Target:",
"to_clone": "{{.Count}} to clone", "to_clone": "{{.Count}} to clone",
"wizard": { "wizard": {
"confirm_cancel": "Cancel", "confirm_cancel": "Cancel",
@ -1479,16 +1418,12 @@
"would_load_registry": "Would load registry from" "would_load_registry": "Would load registry from"
}, },
"test": { "test": {
"all_passed": "All tests passed",
"coverage_by_package": "Coverage by package:", "coverage_by_package": "Coverage by package:",
"error": { "error": {
"no_go_mod": "no go.mod found - run from a Go project directory", "no_go_mod": "no go.mod found - run from a Go project directory"
"tests_failed": "tests failed"
}, },
"failed": "{{.Count}} failed",
"failed_packages": "Failed packages:", "failed_packages": "Failed packages:",
"flag": { "flag": {
"coverage": "Show detailed per-package coverage",
"json": "Output JSON for CI/agents", "json": "Output JSON for CI/agents",
"pkg": "Package pattern to test (default: ./...)", "pkg": "Package pattern to test (default: ./...)",
"race": "Enable race detector (-race)", "race": "Enable race detector (-race)",
@ -1497,17 +1432,9 @@
"verbose": "Show test output as it runs (-v)" "verbose": "Show test output as it runs (-v)"
}, },
"label": { "label": {
"average": "Average", "average": "Average"
"coverage": "Coverage:",
"filter": "Filter:",
"package": "Package:",
"test": "Test:"
}, },
"long": "Runs Go tests with coverage reporting.\n\nSets MACOSX_DEPLOYMENT_TARGET=26.0 to suppress linker warnings on macOS.\n\nExamples:\n core test # Run all tests with coverage summary\n core test --verbose # Show test output as it runs\n core test --coverage # Show detailed per-package coverage\n core test --pkg ./pkg/... # Test specific packages\n core test --run TestName # Run specific test by name\n core test --short # Skip long-running tests\n core test --race # Enable race detector\n core test --json # Output JSON for CI/agents", "long": "Runs Go tests with coverage reporting.\n\nSets MACOSX_DEPLOYMENT_TARGET=26.0 to suppress linker warnings on macOS.\n\nExamples:\n core test # Run all tests with coverage summary\n core test --verbose # Show test output as it runs\n core test --coverage # Show detailed per-package coverage\n core test --pkg ./pkg/... # Test specific packages\n core test --run TestName # Run specific test by name\n core test --short # Skip long-running tests\n core test --race # Enable race detector\n core test --json # Output JSON for CI/agents",
"passed": "{{.Count}} passed",
"running": "Running tests",
"short": "Run tests with coverage",
"skipped": "{{.Count}} skipped",
"tests_failed": "Tests failed" "tests_failed": "Tests failed"
}, },
"vm": { "vm": {
@ -1515,7 +1442,6 @@
"apply_template": "failed to apply template", "apply_template": "failed to apply template",
"build_image": "failed to build image", "build_image": "failed to build image",
"create_temp": "failed to create temp directory", "create_temp": "failed to create temp directory",
"get_logs": "failed to get logs",
"id_and_cmd_required": "container ID and command are required", "id_and_cmd_required": "container ID and command are required",
"id_required": "container ID is required", "id_required": "container ID is required",
"init_manager": "failed to initialize container manager", "init_manager": "failed to initialize container manager",
@ -1541,16 +1467,10 @@
"building": "Building:", "building": "Building:",
"container_stopped": "Container stopped:", "container_stopped": "Container stopped:",
"hypervisor": "Hypervisor:", "hypervisor": "Hypervisor:",
"image": "Image:",
"name": "Name:", "name": "Name:",
"pid": "PID:", "pid": "PID:"
"started": "Started:",
"template": "Template:"
}, },
"logs": { "logs": {
"flag": {
"follow": "Follow log output"
},
"long": "View logs from a VM.\n\nExamples:\n core vm logs abc12345\n core vm logs -f abc1", "long": "View logs from a VM.\n\nExamples:\n core vm logs abc12345\n core vm logs -f abc1",
"short": "View VM logs" "short": "View VM logs"
}, },
@ -1585,7 +1505,6 @@
"stop": { "stop": {
"long": "Stops a running VM by ID.\n\nExamples:\n core vm stop abc12345\n core vm stop abc1", "long": "Stops a running VM by ID.\n\nExamples:\n core vm stop abc12345\n core vm stop abc1",
"short": "Stop a running VM", "short": "Stop a running VM",
"stopped": "Stopped",
"stopping": "Stopping:" "stopping": "Stopping:"
}, },
"templates": { "templates": {
@ -1627,7 +1546,6 @@
"author": "Author", "author": "Author",
"branch": "Branch", "branch": "Branch",
"commit": "Commit", "commit": "Commit",
"coverage": "Coverage",
"date": "Date", "date": "Date",
"duration": "Duration", "duration": "Duration",
"message": "Message", "message": "Message",