From a00a3240a6455f9cd1aec27d40bdd8b8745a7a50 Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 30 Jan 2026 11:11:07 +0000 Subject: [PATCH] refactor(i18n): use nested JSON format for translation files - Rewrite i18n package to handle nested JSON natively - Remove go-i18n dependency in favour of simple custom implementation - Flatten nested keys to dot notation internally (cli.confirm.yes) - Support pluralisation with one/other keys - Template interpolation with {{.Var}} syntax - Update tests for new API and nested structure Nested JSON is the standard format for translation tools, making it easier to manage with external translation services. Co-Authored-By: Claude Opus 4.5 --- go.mod | 2 - go.sum | 4 - pkg/i18n/i18n.go | 505 +++--- pkg/i18n/i18n_test.go | 55 +- pkg/i18n/locales/en_GB.json | 2991 +++++++++++++++++++---------------- 5 files changed, 1976 insertions(+), 1581 deletions(-) diff --git a/go.mod b/go.mod index b71ad265..3c9a699e 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/charmbracelet/huh v0.8.0 github.com/charmbracelet/lipgloss v1.1.0 github.com/getkin/kin-openapi v0.133.0 - github.com/leaanthony/clir v1.7.0 github.com/leaanthony/debme v1.2.1 github.com/leaanthony/gosod v1.0.4 github.com/minio/selfupdate v0.6.0 @@ -67,7 +66,6 @@ require ( github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect - github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect diff --git a/go.sum b/go.sum index a131c897..bb6ac61d 100644 --- a/go.sum +++ b/go.sum @@ -115,8 +115,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leaanthony/clir v1.7.0 h1:xiAnhl7ryPwuH3ERwPWZp/pCHk8wTeiwuAOt6MiNyAw= -github.com/leaanthony/clir v1.7.0/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= github.com/leaanthony/gosod v1.0.4 h1:YLAbVyd591MRffDgxUOU1NwLhT9T1/YiwjKZpkNFeaI= @@ -151,8 +149,6 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= -github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ= -github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA= github.com/oasdiff/oasdiff v1.11.8 h1:3LalSR0yYVM5sAYNInlIG4TVckLCJBkgjcnst2GKWVg= github.com/oasdiff/oasdiff v1.11.8/go.mod h1:YtP/1VnQo8FCdSWGJ11a98HFgLnFvUffH//FTDuEpls= github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index be92a99c..1fc88517 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -1,38 +1,30 @@ // Package i18n provides internationalization for the CLI. // -// It is designed to be extended by the GUI version, which can import this -// package and add additional translations for GUI-specific strings. +// Locale files use nested JSON for compatibility with translation tools: +// +// { +// "cli": { +// "success": "Operation completed", +// "count": { +// "items": { +// "one": "{{.Count}} item", +// "other": "{{.Count}} items" +// } +// } +// } +// } +// +// Keys are accessed with dot notation: T("cli.success"), T("cli.count.items") // // # Getting Started // // svc, err := i18n.New() -// if err != nil { -// log.Fatal(err) -// } // fmt.Println(svc.T("cli.success")) -// -// # Extending for GUI -// -// The GUI can extend this package by creating its own Service that embeds -// this one and loads additional locale files: -// -// guiService, err := i18n.NewWithFS(guiLocaleFS, "locales") -// -// # Locale Files -// -// Locale files are JSON with message IDs as keys. Supports both simple strings -// and go-i18n format with pluralization: -// -// { -// "cli.success": "Operation completed successfully", -// "cli.items_found": { -// "one": "{{.Count}} item found", -// "other": "{{.Count}} items found" -// } -// } +// fmt.Println(svc.T("cli.count.items", map[string]any{"Count": 5})) package i18n import ( + "bytes" "embed" "encoding/json" "fmt" @@ -41,78 +33,193 @@ import ( "path/filepath" "strings" "sync" + "text/template" - "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language" ) //go:embed locales/*.json var localeFS embed.FS +// Message represents a translation - either a simple string or plural forms. +type Message struct { + Text string // Simple string value + One string // Singular form (count == 1) + Other string // Plural form (count != 1) +} + +// IsPlural returns true if this message has plural forms. +func (m Message) IsPlural() bool { + return m.One != "" || m.Other != "" +} + +// Service provides internationalization and localization. +type Service struct { + messages map[string]map[string]Message // lang -> key -> message + currentLang string + fallbackLang string + availableLangs []language.Tag + mu sync.RWMutex +} + // Default is the global i18n service instance. -// Initialized lazily on first use or via Init(). var ( defaultService *Service defaultOnce sync.Once defaultErr error ) -// Service provides internationalization and localization. -type Service struct { - bundle *i18n.Bundle - localizer *i18n.Localizer - currentLang string - availableLangs []language.Tag - mu sync.RWMutex -} - // New creates a new i18n service with embedded locales. -// The service is initialized with the system language or English as fallback. func New() (*Service, error) { return NewWithFS(localeFS, "locales") } // NewWithFS creates a new i18n service loading locales from the given filesystem. -// This allows the GUI to provide its own locale files. func NewWithFS(fsys fs.FS, dir string) (*Service, error) { - bundle := i18n.NewBundle(language.BritishEnglish) - bundle.RegisterUnmarshalFunc("json", json.Unmarshal) - - availableLangs, err := loadLocalesFromFS(bundle, fsys, dir) - if err != nil { - return nil, err + s := &Service{ + messages: make(map[string]map[string]Message), + fallbackLang: "en-GB", } - s := &Service{ - bundle: bundle, - availableLangs: availableLangs, - currentLang: "en-GB", + entries, err := fs.ReadDir(fsys, dir) + if err != nil { + return nil, fmt.Errorf("failed to read locales directory: %w", err) + } + + for _, entry := range entries { + if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".json") { + continue + } + + filePath := filepath.Join(dir, entry.Name()) + data, err := fs.ReadFile(fsys, filePath) + if err != nil { + return nil, fmt.Errorf("failed to read locale %s: %w", entry.Name(), err) + } + + lang := strings.TrimSuffix(entry.Name(), ".json") + // Normalise underscore to hyphen (en_GB -> en-GB) + lang = strings.ReplaceAll(lang, "_", "-") + + if err := s.loadJSON(lang, data); err != nil { + return nil, fmt.Errorf("failed to parse locale %s: %w", entry.Name(), err) + } + + tag := language.Make(lang) + s.availableLangs = append(s.availableLangs, tag) + } + + if len(s.availableLangs) == 0 { + return nil, fmt.Errorf("no locale files found in %s", dir) } // Try to detect system language - if detected, err := detectLanguage(availableLangs); err == nil && detected != "" { - _ = s.SetLanguage(detected) + if detected := detectLanguage(s.availableLangs); detected != "" { + s.currentLang = detected } else { - _ = s.SetLanguage("en-GB") + s.currentLang = s.fallbackLang } return s, nil } -// NewWithBundle creates a service from an existing bundle. -// Useful for extending the CLI i18n with GUI-specific translations. -func NewWithBundle(bundle *i18n.Bundle, langs []language.Tag) *Service { - s := &Service{ - bundle: bundle, - availableLangs: langs, - currentLang: "en-GB", +// loadJSON parses nested JSON and flattens to dot-notation keys. +func (s *Service) loadJSON(lang string, data []byte) error { + var raw map[string]any + if err := json.Unmarshal(data, &raw); err != nil { + return err } - _ = s.SetLanguage("en-GB") - return s + + messages := make(map[string]Message) + flatten("", raw, messages) + s.messages[lang] = messages + return nil } +// flatten recursively flattens nested maps into dot-notation keys. +func flatten(prefix string, data map[string]any, out map[string]Message) { + for key, value := range data { + fullKey := key + if prefix != "" { + fullKey = prefix + "." + key + } + + switch v := value.(type) { + case string: + out[fullKey] = Message{Text: v} + + case map[string]any: + // Check if this is a plural object (has "one" or "other" keys) + if isPluralObject(v) { + msg := Message{} + if one, ok := v["one"].(string); ok { + msg.One = one + } + if other, ok := v["other"].(string); ok { + msg.Other = other + } + out[fullKey] = msg + } else { + // Recurse into nested object + flatten(fullKey, v, out) + } + } + } +} + +// isPluralObject checks if a map represents plural forms. +func isPluralObject(m map[string]any) bool { + _, hasOne := m["one"] + _, hasOther := m["other"] + // It's a plural object if it has one/other and no nested objects + if !hasOne && !hasOther { + return false + } + for _, v := range m { + if _, isMap := v.(map[string]any); isMap { + return false + } + } + return true +} + +func detectLanguage(supported []language.Tag) string { + langEnv := os.Getenv("LANG") + if langEnv == "" { + langEnv = os.Getenv("LC_ALL") + if langEnv == "" { + langEnv = os.Getenv("LC_MESSAGES") + } + } + if langEnv == "" { + return "" + } + + // Parse LANG format: en_GB.UTF-8 -> en-GB + baseLang := strings.Split(langEnv, ".")[0] + baseLang = strings.ReplaceAll(baseLang, "_", "-") + + parsedLang, err := language.Parse(baseLang) + if err != nil { + return "" + } + + if len(supported) == 0 { + return "" + } + + matcher := language.NewMatcher(supported) + bestMatch, _, confidence := matcher.Match(parsedLang) + + if confidence >= language.Low { + return bestMatch.String() + } + return "" +} + +// --- Global convenience functions --- + // Init initializes the default global service. -// Safe to call multiple times; only the first call has effect. func Init() error { defaultOnce.Do(func() { defaultService, defaultErr = New() @@ -129,87 +236,21 @@ func Default() *Service { } // SetDefault sets the global i18n service. -// Useful for GUI to replace with an extended service. func SetDefault(s *Service) { defaultService = s } // T translates a message using the default service. -// Shorthand for Default().T(messageID, args...). -func T(messageID string, args ...interface{}) string { - return Default().T(messageID, args...) +func T(messageID string, args ...any) string { + if svc := Default(); svc != nil { + return svc.T(messageID, args...) + } + return messageID } -// --- Language Management --- - -func loadLocalesFromFS(bundle *i18n.Bundle, fsys fs.FS, dir string) ([]language.Tag, error) { - entries, err := fs.ReadDir(fsys, dir) - if err != nil { - return nil, fmt.Errorf("failed to read locales directory: %w", err) - } - - var langs []language.Tag - for _, entry := range entries { - if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".json") { - continue - } - - filePath := filepath.Join(dir, entry.Name()) - if _, err := bundle.LoadMessageFileFS(fsys, filePath); err != nil { - return nil, fmt.Errorf("failed to load locale %s: %w", entry.Name(), err) - } - - lang := strings.TrimSuffix(entry.Name(), ".json") - tag := language.Make(lang) - langs = append(langs, tag) - } - - if len(langs) == 0 { - return nil, fmt.Errorf("no locale files found in %s", dir) - } - - return langs, nil -} - -func detectLanguage(supported []language.Tag) (string, error) { - langEnv := os.Getenv("LANG") - if langEnv == "" { - // Try LC_ALL, LC_MESSAGES as fallbacks - langEnv = os.Getenv("LC_ALL") - if langEnv == "" { - langEnv = os.Getenv("LC_MESSAGES") - } - } - if langEnv == "" { - return "", nil - } - - // Parse LANG format: en_GB.UTF-8 -> en-GB - baseLang := strings.Split(langEnv, ".")[0] - baseLang = strings.ReplaceAll(baseLang, "_", "-") - - parsedLang, err := language.Parse(baseLang) - if err != nil { - return "", fmt.Errorf("failed to parse language tag '%s': %w", baseLang, err) - } - - if len(supported) == 0 { - return "", nil - } - - matcher := language.NewMatcher(supported) - _, index, confidence := matcher.Match(parsedLang) - - if confidence >= language.Low { - return supported[index].String(), nil - } - return "", nil -} - -// --- Public Service Methods --- +// --- Service methods --- // SetLanguage sets the language for translations. -// The language tag should be a valid BCP 47 tag (e.g., "en", "en-GB", "de"). func (s *Service) SetLanguage(lang string) error { s.mu.Lock() defer s.mu.Unlock() @@ -230,7 +271,6 @@ func (s *Service) SetLanguage(lang string) error { return fmt.Errorf("unsupported language: %s", lang) } - s.localizer = i18n.NewLocalizer(s.bundle, bestMatch.String()) s.currentLang = bestMatch.String() return nil } @@ -257,121 +297,162 @@ func (s *Service) AvailableLanguages() []string { // T translates a message by its ID. // Optional template data can be passed for interpolation. // -// Examples: +// For plural messages, pass a map with "Count" to select the form: // -// svc.T("cli.success") -// svc.T("cli.items_found", map[string]int{"Count": 5}) -// svc.T("cli.greeting", map[string]string{"Name": "Alice"}) -func (s *Service) T(messageID string, args ...interface{}) string { +// svc.T("cli.count.items", map[string]any{"Count": 5}) +func (s *Service) T(messageID string, args ...any) string { s.mu.RLock() defer s.mu.RUnlock() - if s.localizer == nil { + // Try current language, then fallback + msg, ok := s.getMessage(s.currentLang, messageID) + if !ok { + msg, ok = s.getMessage(s.fallbackLang, messageID) + if !ok { + return messageID + } + } + + // Get template data + var data any + if len(args) > 0 { + data = args[0] + } + + // Get the appropriate text + text := msg.Text + if msg.IsPlural() { + count := getCount(data) + if count == 1 { + text = msg.One + } else { + text = msg.Other + } + if text == "" { + text = msg.Other // Fallback to other + } + } + + if text == "" { return messageID } - config := &i18n.LocalizeConfig{MessageID: messageID} - if len(args) > 0 { - config.TemplateData = args[0] + // Apply template if we have data + if data != nil { + text = applyTemplate(text, data) } - translation, err := s.localizer.Localize(config) + return text +} + +func (s *Service) getMessage(lang, key string) (Message, bool) { + msgs, ok := s.messages[lang] + if !ok { + return Message{}, false + } + msg, ok := msgs[key] + return msg, ok +} + +func getCount(data any) int { + if data == nil { + return 0 + } + switch d := data.(type) { + case map[string]any: + if c, ok := d["Count"]; ok { + return toInt(c) + } + case map[string]int: + if c, ok := d["Count"]; ok { + return c + } + } + return 0 +} + +func toInt(v any) int { + switch n := v.(type) { + case int: + return n + case int64: + return int(n) + case float64: + return int(n) + } + return 0 +} + +func applyTemplate(text string, data any) string { + // Quick check for template syntax + if !strings.Contains(text, "{{") { + return text + } + + tmpl, err := template.New("").Parse(text) if err != nil { - // Return the message ID if translation not found - return messageID - } - return translation -} - -// Translate is an alias for T. -func (s *Service) Translate(messageID string, args ...interface{}) string { - return s.T(messageID, args...) -} - -// MustT translates a message, panicking if not found. -// Use sparingly, mainly for critical messages that must exist. -func (s *Service) MustT(messageID string, args ...interface{}) string { - s.mu.RLock() - defer s.mu.RUnlock() - - if s.localizer == nil { - panic(fmt.Sprintf("i18n: localizer not initialized for message %q", messageID)) + return text } - config := &i18n.LocalizeConfig{MessageID: messageID} - if len(args) > 0 { - config.TemplateData = args[0] + var buf bytes.Buffer + if err := tmpl.Execute(&buf, data); err != nil { + return text } - - translation, err := s.localizer.Localize(config) - if err != nil { - panic(fmt.Sprintf("i18n: translation not found for %q: %v", messageID, err)) - } - return translation + return buf.String() } -// Bundle returns the underlying i18n.Bundle. -// Useful for extending with additional translations. -func (s *Service) Bundle() *i18n.Bundle { - return s.bundle -} - -// AddMessages adds additional messages to the bundle. -// This allows runtime extension of translations. -func (s *Service) AddMessages(lang string, messages map[string]string) error { +// AddMessages adds messages for a language at runtime. +func (s *Service) AddMessages(lang string, messages map[string]string) { s.mu.Lock() defer s.mu.Unlock() - tag := language.Make(lang) - var i18nMessages []*i18n.Message - for id, text := range messages { - i18nMessages = append(i18nMessages, &i18n.Message{ - ID: id, - Other: text, - }) + if s.messages[lang] == nil { + s.messages[lang] = make(map[string]Message) } - - if err := s.bundle.AddMessages(tag, i18nMessages...); err != nil { - return fmt.Errorf("failed to add messages for %s: %w", lang, err) + for key, text := range messages { + s.messages[lang][key] = Message{Text: text} } - - // Check if this is a new language - found := false - for _, existing := range s.availableLangs { - if existing == tag { - found = true - break - } - } - if !found { - s.availableLangs = append(s.availableLangs, tag) - } - - return nil } // LoadFS loads additional locale files from a filesystem. -// Useful for GUI to add its translations on top of CLI translations. func (s *Service) LoadFS(fsys fs.FS, dir string) error { s.mu.Lock() defer s.mu.Unlock() - newLangs, err := loadLocalesFromFS(s.bundle, fsys, dir) + entries, err := fs.ReadDir(fsys, dir) if err != nil { - return err + return fmt.Errorf("failed to read locales directory: %w", err) } - // Merge new languages - for _, newTag := range newLangs { + for _, entry := range entries { + if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".json") { + continue + } + + filePath := filepath.Join(dir, entry.Name()) + data, err := fs.ReadFile(fsys, filePath) + if err != nil { + return fmt.Errorf("failed to read locale %s: %w", entry.Name(), err) + } + + lang := strings.TrimSuffix(entry.Name(), ".json") + lang = strings.ReplaceAll(lang, "_", "-") + + if err := s.loadJSON(lang, data); err != nil { + return fmt.Errorf("failed to parse locale %s: %w", entry.Name(), err) + } + + // Add to available languages if new + tag := language.Make(lang) found := false for _, existing := range s.availableLangs { - if existing == newTag { + if existing == tag { found = true break } } if !found { - s.availableLangs = append(s.availableLangs, newTag) + s.availableLangs = append(s.availableLangs, tag) } } diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go index edbac09c..44ca33b3 100644 --- a/pkg/i18n/i18n_test.go +++ b/pkg/i18n/i18n_test.go @@ -15,7 +15,7 @@ func TestNew(t *testing.T) { // Should have English available langs := svc.AvailableLanguages() - assert.Contains(t, langs, "en") + assert.Contains(t, langs, "en-GB") } func TestTranslate(t *testing.T) { @@ -47,15 +47,15 @@ func TestSetLanguage(t *testing.T) { svc, err := New() require.NoError(t, err) - // Default is English - assert.Equal(t, "en", svc.Language()) + // Default is en-GB + assert.Equal(t, "en-GB", svc.Language()) // Setting invalid language should error err = svc.SetLanguage("xx-invalid") assert.Error(t, err) - // Language should still be English - assert.Equal(t, "en", svc.Language()) + // Language should still be en-GB + assert.Equal(t, "en-GB", svc.Language()) } func TestDefaultService(t *testing.T) { @@ -80,10 +80,9 @@ func TestAddMessages(t *testing.T) { require.NoError(t, err) // Add custom messages - err = svc.AddMessages("en", map[string]string{ + svc.AddMessages("en-GB", map[string]string{ "custom.greeting": "Hello, {{.Name}}!", }) - require.NoError(t, err) result := svc.T("custom.greeting", map[string]string{"Name": "World"}) assert.Equal(t, "Hello, World!", result) @@ -95,7 +94,7 @@ func TestAvailableLanguages(t *testing.T) { langs := svc.AvailableLanguages() assert.NotEmpty(t, langs) - assert.Contains(t, langs, "en") + assert.Contains(t, langs, "en-GB") } func TestDetectLanguage(t *testing.T) { @@ -106,13 +105,13 @@ func TestDetectLanguage(t *testing.T) { }{ { name: "English exact", - langEnv: "en", - expected: "en", + langEnv: "en-GB", + expected: "en-GB", }, { - name: "English with region and encoding", + name: "English with encoding", langEnv: "en_GB.UTF-8", - expected: "en", + expected: "en-GB", }, { name: "Empty LANG", @@ -130,8 +129,38 @@ func TestDetectLanguage(t *testing.T) { t.Setenv("LC_ALL", "") t.Setenv("LC_MESSAGES", "") - result, _ := detectLanguage(svc.availableLangs) + result := detectLanguage(svc.availableLangs) assert.Equal(t, tt.expected, result) }) } } + +func TestPluralization(t *testing.T) { + svc, err := New() + require.NoError(t, err) + + // Singular + result := svc.T("cli.count.items", map[string]any{"Count": 1}) + assert.Equal(t, "1 item", result) + + // Plural + result = svc.T("cli.count.items", map[string]any{"Count": 5}) + assert.Equal(t, "5 items", result) + + // Zero uses plural + result = svc.T("cli.count.items", map[string]any{"Count": 0}) + assert.Equal(t, "0 items", result) +} + +func TestNestedKeys(t *testing.T) { + svc, err := New() + require.NoError(t, err) + + // Deeply nested key + result := svc.T("cmd.dev.work.short") + assert.Equal(t, "Multi-repo git operations", result) + + // Nested with flag + result = svc.T("cmd.dev.work.flag.status") + assert.Equal(t, "Show status only, don't push", result) +} diff --git a/pkg/i18n/locales/en_GB.json b/pkg/i18n/locales/en_GB.json index 3d2f5a33..401fb38b 100644 --- a/pkg/i18n/locales/en_GB.json +++ b/pkg/i18n/locales/en_GB.json @@ -1,1356 +1,1647 @@ { - "cli.success": "Success", - "cli.error": "Error", - "cli.warning": "Warning", - "cli.info": "Info", - "cli.done": "Done", - "cli.failed": "Failed", - "cli.pass": "PASS", - "cli.fail": "FAIL", - "cli.ok": "OK", - "cli.skip": "Skipped", - "cli.pending": "Pending", - "cli.running": "Running", - "cli.completed": "Completed", - "cli.cancelled": "Cancelled", - "cli.aborted": "Aborted", - - "cli.confirm.yes": "Yes", - "cli.confirm.no": "No", - "cli.confirm.proceed": "Proceed?", - "cli.confirm.continue": "Continue?", - "cli.confirm.abort": "Operation aborted", - - "cli.progress.checking": "Checking", - "cli.progress.fetching": "Fetching", - "cli.progress.loading": "Loading", - "cli.progress.processing": "Processing", - "cli.progress.installing": "Installing", - "cli.progress.building": "Building", - "cli.progress.deploying": "Deploying", - "cli.progress.testing": "Testing", - - "cli.time.just_now": "just now", - "cli.time.seconds_ago": "{{.Count}} seconds ago", - "cli.time.minute_ago": "1 minute ago", - "cli.time.minutes_ago": "{{.Count}} minutes ago", - "cli.time.hour_ago": "1 hour ago", - "cli.time.hours_ago": "{{.Count}} hours ago", - "cli.time.day_ago": "1 day ago", - "cli.time.days_ago": "{{.Count}} days ago", - "cli.time.week_ago": "1 week ago", - "cli.time.weeks_ago": "{{.Count}} weeks ago", - - "cli.count.items": { - "one": "{{.Count}} item", - "other": "{{.Count}} items" + "cli": { + "aborted": "Aborted", + "cancelled": "Cancelled", + "completed": "Completed", + "confirm": { + "abort": "Operation aborted", + "continue": "Continue?", + "no": "No", + "proceed": "Proceed?", + "yes": "Yes" + }, + "count": { + "commits": { + "one": "{{.Count}} commit", + "other": "{{.Count}} commits" + }, + "files": { + "one": "{{.Count}} file", + "other": "{{.Count}} files" + }, + "items": { + "one": "{{.Count}} item", + "other": "{{.Count}} items" + }, + "repos": { + "one": "{{.Count}} repo", + "other": "{{.Count}} repos" + } + }, + "done": "Done", + "error": "Error", + "fail": "FAIL", + "failed": "Failed", + "info": "Info", + "ok": "OK", + "pass": "PASS", + "pending": "Pending", + "progress": { + "building": "Building", + "checking": "Checking", + "deploying": "Deploying", + "fetching": "Fetching", + "installing": "Installing", + "loading": "Loading", + "processing": "Processing", + "testing": "Testing" + }, + "running": "Running", + "skip": "Skipped", + "success": "Success", + "time": { + "day_ago": "1 day ago", + "days_ago": "{{.Count}} days ago", + "hour_ago": "1 hour ago", + "hours_ago": "{{.Count}} hours ago", + "just_now": "just now", + "minute_ago": "1 minute ago", + "minutes_ago": "{{.Count}} minutes ago", + "seconds_ago": "{{.Count}} seconds ago", + "week_ago": "1 week ago", + "weeks_ago": "{{.Count}} weeks ago" + }, + "warning": "Warning" }, - "cli.count.files": { - "one": "{{.Count}} file", - "other": "{{.Count}} files" + "cmd": { + "ai": { + "claude": { + "config": { + "short": "Manage Claude configuration" + }, + "long": "Tools for working with Claude Code.\n\nCommands:\n run Run Claude in the current directory\n config Manage Claude configuration", + "run": { + "short": "Run Claude Code in the current directory" + }, + "short": "Claude Code integration" + }, + "error": { + "claim_task": "failed to claim task", + "commit": "failed to commit", + "complete_task": "failed to complete task", + "create_pr": "failed to create PR", + "get_branch": "failed to get current branch", + "get_task": "failed to get task", + "git_status": "failed to check git status", + "list_tasks": "failed to list tasks", + "load_config": "failed to load config", + "push": "failed to push", + "push_branch": "failed to push branch", + "update_task": "failed to update task", + "working_dir": "failed to get working directory" + }, + "label": { + "blocked_by": "Blocked by:", + "claimed_by": "Claimed by:", + "created": "Created:", + "description": "Description:", + "id": "ID:", + "labels": "Labels:", + "priority": "Priority:", + "project": "Project:", + "related_files": "Related files:", + "status": "Status:", + "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 -m 'msg' # Commit with task reference\n core ai task:complete # Mark task done", + "priority": { + "critical": "CRITICAL", + "high": "HIGH", + "low": "LOW", + "medium": "MEDIUM" + }, + "short": "AI agent task management", + "status": { + "blocked": "blocked", + "completed": "completed", + "in_progress": "in_progress", + "pending": "pending" + }, + "task": { + "claimed": "Task claimed successfully!", + "claiming": "Claiming task...", + "context_failed": "Failed to build context", + "flag": { + "auto": "Auto-select highest priority pending task", + "claim": "Claim the task after showing details", + "context": "Show gathered context for AI collaboration" + }, + "id_required": "task ID required (or use --auto)", + "long": "Shows details of a specific task or auto-selects the highest priority task.\n\nExamples:\n core ai task abc123 # Show task details\n core ai task abc123 --claim # Show and claim the task\n core ai task abc123 --context # Show task with gathered context\n core ai task --auto # Auto-select highest priority pending task", + "no_pending": "No pending tasks available.", + "short": "Show task details or auto-select a task" + }, + "task_commit": { + "committed": "Committed:", + "creating": "Creating commit for task {{.ID}}...", + "flag": { + "message": "Commit message (without task reference)", + "push": "Push changes after committing", + "scope": "Scope for the commit type (e.g., auth, api, ui)" + }, + "long": "Creates a git commit with a task reference and co-author attribution.\n\nCommit message format:\n feat(scope): description\n\n Task: #123\n Co-Authored-By: Claude \n\nExamples:\n core ai task:commit abc123 --message 'add user authentication'\n core ai task:commit abc123 -m 'fix login bug' --scope auth\n core ai task:commit abc123 -m 'update docs' --push", + "message_required": "commit message required (--message or -m)", + "no_changes": "No uncommitted changes to commit.", + "pushed": "Changes pushed successfully", + "pushing": "Pushing changes...", + "short": "Auto-commit changes with task reference" + }, + "task_complete": { + "failed": "Task {{.ID}} marked as failed", + "flag": { + "error": "Error message if failed", + "failed": "Mark the task as failed", + "output": "Summary of the completed work" + }, + "long": "Marks a task as completed with optional output and artifacts.\n\nExamples:\n core ai task:complete abc123 --output 'Feature implemented'\n core ai task:complete abc123 --failed --error 'Build failed'", + "short": "Mark a task as completed", + "success": "Task {{.ID}} completed successfully" + }, + "task_pr": { + "branch_error": "cannot create PR from {{.Branch}} branch; create a feature branch first", + "created": "Pull request created!", + "creating": "Creating pull request...", + "flag": { + "base": "Base branch (defaults to main)", + "draft": "Create as draft PR", + "labels": "Labels to add (comma-separated)", + "title": "PR title (defaults to task title)" + }, + "long": "Creates a GitHub pull request linked to a task.\n\nRequires the GitHub CLI (gh) to be installed and authenticated.\n\nExamples:\n core ai task:pr abc123\n core ai task:pr abc123 --title 'Add authentication feature'\n core ai task:pr abc123 --draft --labels 'enhancement,needs-review'\n core ai task:pr abc123 --base develop", + "pushing_branch": "Pushing branch {{.Branch}}...", + "short": "Create a pull request for a task" + }, + "task_update": { + "flag": { + "notes": "Notes about the update", + "progress": "Progress percentage (0-100)", + "status": "New status (pending, in_progress, completed, blocked)" + }, + "flag_required": "at least one of --status, --progress, or --notes required", + "long": "Updates a task's status, progress, or adds notes.\n\nExamples:\n core ai task:update abc123 --status in_progress\n core ai task:update abc123 --progress 50 --notes 'Halfway done'", + "short": "Update task status or progress", + "success": "Task {{.ID}} updated successfully" + }, + "tasks": { + "flag": { + "labels": "Filter by labels (comma-separated)", + "limit": "Max number of tasks to return", + "priority": "Filter by priority (critical, high, medium, low)", + "project": "Filter by project", + "status": "Filter by status (pending, in_progress, completed, blocked)" + }, + "found": "{{.Count}} task(s) found:", + "hint": "Use 'core ai task ' to view details", + "long": "Lists tasks from the core-agentic service.\n\nConfiguration is loaded from:\n 1. Environment variables (AGENTIC_TOKEN, AGENTIC_BASE_URL)\n 2. .env file in current directory\n 3. ~/.core/agentic.yaml\n\nExamples:\n core ai tasks\n core ai tasks --status pending --priority high\n core ai tasks --labels bug,urgent", + "none_found": "No tasks found.", + "short": "List available tasks from core-agentic" + } + }, + "build": { + "building_project": "Building project", + "built_artifacts": "Built {{.Count}} artifact(s)", + "computing_checksums": "Computing checksums...", + "creating_archives": "Creating archives...", + "error": { + "archive_failed": "archive failed", + "build_failed": "build failed", + "checksum_failed": "checksum failed", + "detect_type": "failed to detect project type", + "gpg_signing_failed": "GPG signing failed", + "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", + "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", + "node_not_implemented": "Node.js builder not yet implemented", + "notarization_failed": "notarization failed", + "php_not_implemented": "PHP builder not yet implemented", + "signing_failed": "signing failed", + "unsupported_type": "unsupported project type", + "working_dir": "failed to get working directory", + "write_checksums": "failed to write CHECKSUMS.txt" + }, + "flag": { + "archive": "Create archives (tar.gz for linux/darwin, zip for windows)", + "checksum": "Generate SHA256 checksums and CHECKSUMS.txt", + "ci": "CI mode - minimal output with JSON artifact list at the end", + "config": "Config file path (for linuxkit: YAML config, for docker: Dockerfile)", + "format": "Output format for linuxkit (iso-bios, qcow2-bios, raw, vmdk)", + "image": "Docker image name (e.g., host-uk/core-devops)", + "no_sign": "Skip all code signing", + "notarize": "Enable macOS notarization (requires Apple credentials)", + "output": "Output directory for artifacts (default: dist)", + "push": "Push Docker image after build", + "targets": "Comma-separated OS/arch pairs (e.g., linux/amd64,darwin/arm64)", + "type": "Builder type (go, wails, docker, linuxkit, taskfile) - auto-detected if not specified" + }, + "from_path": { + "compiling": "Compiling application...", + "copying_files": "Copying application files...", + "error": { + "anchor_template": "failed to anchor template filesystem", + "clean_build_dir": "failed to clean build directory", + "copy_files": "failed to copy application files", + "create_sod": "failed to create new sod instance", + "extract_template": "failed to extract template", + "go_build": "go build failed", + "go_mod_tidy": "go mod tidy failed", + "invalid_path": "invalid path specified", + "must_be_directory": "path specified must be a directory" + }, + "flag": { + "path": "The path to the static web application files" + }, + "generating_template": "Generating application from template...", + "short": "Build from a local directory", + "starting": "Starting build from path:", + "success": "Build successful! Executable created at:" + }, + "label": { + "archive": "Archive:", + "binary": "Binary:", + "build": "Build:", + "checksum": "Checksum:", + "error": "Error:", + "ok": "OK:", + "output": "Output:", + "sign": "Sign:", + "success": "Success:", + "targets": "Targets:", + "type": "Type:" + }, + "long": "Builds the current project with automatic type detection.\nSupports Go, Wails, Docker, LinuxKit, and Taskfile projects.\nConfiguration can be provided via .core/build.yaml or command-line flags.\n\nExamples:\n core build # Auto-detect and build\n core build --type docker # Build Docker image\n core build --type linuxkit # Build LinuxKit image\n core build --type linuxkit --config linuxkit.yml --format qcow2-bios", + "pwa": { + "asset_download_failed": "failed to download asset", + "download_complete": "PWA download complete.", + "downloading_to": "Downloading PWA to temporary directory:", + "error": { + "create_temp_dir": "failed to create temporary directory", + "download_failed": "failed to download PWA", + "fetch_manifest": "failed to fetch or parse manifest", + "fetch_url": "failed to fetch URL", + "no_manifest_tag": "no tag found", + "read_response": "failed to read response body", + "write_index": "failed to write index.html" + }, + "flag": { + "url": "The URL of the PWA to build" + }, + "found_manifest": "Found manifest:", + "no_manifest": "no manifest file found. Proceeding with basic site download.", + "short": "Build from a live PWA URL", + "starting": "Starting PWA build from URL:", + "warning": "Warning:" + }, + "sdk": { + "complete": "SDK generation complete", + "dry_run_mode": "(dry-run mode)", + "flag": { + "dry_run": "Show what would be generated without writing files", + "lang": "Generate only this language (typescript, python, go, php)", + "spec": "Path to OpenAPI spec file", + "version": "Version to embed in generated SDKs" + }, + "generated_label": "Generated:", + "generating": "Generating SDKs", + "label": "Build SDK:", + "language_label": "Language:", + "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", + "short": "Generate API SDKs from OpenAPI spec", + "spec_label": "Spec:", + "would_generate": "Would generate SDKs (dry-run)" + }, + "short": "Build projects with auto-detection and cross-compilation", + "signing_binaries": "Signing binaries..." + }, + "ci": { + "changelog": { + "flag": { + "from": "Starting ref (default: previous tag)", + "to": "Ending ref (default: HEAD)" + }, + "long": "Generates a changelog from conventional commits.", + "short": "Generate changelog" + }, + "dry_run_hint": "(dry-run) use --we-are-go-for-launch to publish", + "error": { + "determine_version": "failed to determine version", + "generate_changelog": "failed to generate changelog", + "load_config": "failed to load config", + "no_publishers": "no publishers configured in .core/release.yaml", + "working_dir": "failed to get working directory", + "write_config": "failed to write config" + }, + "flag": { + "draft": "Create release as a draft", + "go_for_launch": "Actually publish (default is dry-run for safety)", + "prerelease": "Mark release as a prerelease", + "version": "Version to release (e.g., v1.2.3)" + }, + "go_for_launch": "GO FOR LAUNCH", + "init": { + "config_exists": "Configuration already exists at", + "config_written": "Configuration written to", + "creating": "Creating release configuration", + "github_repo": "GitHub repository (owner/repo):", + "long": "Creates a .core/release.yaml configuration file interactively.", + "overwrite_prompt": "Overwrite? [y/N]: ", + "project_name": "Project name", + "short": "Initialize release configuration" + }, + "label": { + "artifacts": "Artifacts:", + "ci": "CI:", + "error": "Error:", + "init": "Init:", + "note": "Note:", + "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", + "publish_completed": "Publish completed!", + "publishing": "Publishing release", + "release": { + "short": "Create a release" + }, + "short": "Publish releases (dry-run by default)", + "version": { + "long": "Shows the determined version or validates a version string.", + "short": "Show or set version" + } + }, + "dev": { + "api": { + "short": "Tools for managing service APIs" + }, + "ci": { + "error_label": "Error:", + "failing": "{{.Count}} failing", + "flag": { + "branch": "Filter by branch", + "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.", + "no_ci": "{{.Count}} no CI", + "passing": "{{.Count}} passing", + "pending": "{{.Count}} pending", + "repos_checked": "{{.Count}} repos checked", + "short": "Check CI status across all repos" + }, + "commit": { + "committing": "Committing dirty repos with Claude...", + "failed": "Commit failed", + "flag": { + "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.", + "short": "Claude-assisted commits across repos", + "success": "Committed successfully" + }, + "committed": "committed", + "committing": "Committing", + "confirm_claude_commit": "Have Claude commit these repos?", + "count_failed": "{{.Count}} failed", + "done_succeeded": "Done: {{.Count}} succeeded", + "health": { + "ahead_label": "Ahead:", + "behind_label": "Behind:", + "dirty": "dirty", + "dirty_label": "Dirty:", + "errors": "errors", + "errors_label": "Errors:", + "flag": { + "registry": "Path to repos.yaml (auto-detected if not specified)", + "verbose": "Show detailed breakdown" + }, + "long": "Shows a summary of repository health:\ntotal repos, dirty repos, unpushed commits, etc.", + "more": "+{{.Count}} more", + "repos": "repos", + "short": "Quick health check across all repos", + "synced": "synced", + "to_pull": "to pull", + "to_push": "to push", + "up_to_date": "up to date" + }, + "impact": { + "analysis_for": "Impact analysis for", + "changes_affect": "Changes to {{.Repo}} affect {{.Affected}}/{{.Total}} repos", + "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.", + "no_dependents": "No repos depend on {{.Name}}", + "requires_registry": "impact analysis requires repos.yaml with dependency information", + "short": "Show impact of changing a repo", + "summary": "Summary:", + "transitive_dependents": "{{.Count}} transitive dependent(s):" + }, + "issues": { + "error_label": "Error:", + "flag": { + "assignee": "Filter by assignee (use @me for yourself)", + "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.", + "no_issues": "No open issues found.", + "open_issues": "{{.Count}} open issue(s):", + "short": "List open issues across all repos" + }, + "long": "Manage multiple git repositories and GitHub integration.\n\nUses repos.yaml to discover repositories. Falls back to scanning\nthe current directory if no registry is found.\n\nGit Operations:\n work Combined status -> commit -> push workflow\n health Quick repo health summary\n commit Claude-assisted commit messages\n push Push repos with unpushed commits\n pull Pull repos behind remote\n\nGitHub Integration (requires gh CLI):\n issues List open issues across repos\n reviews List PRs awaiting review\n ci Check GitHub Actions status\n impact Analyse dependency impact\n\nDev Environment:\n install Download dev environment image\n boot Start dev environment VM\n stop Stop dev environment VM\n shell Open shell in dev VM\n status Check dev VM status", + "modified": "{{.Count}} modified", + "no_changes": "No uncommitted changes found.", + "no_git_repos": "No git repositories found.", + "pull": { + "all_up_to_date": "All repos up to date. Nothing to pull.", + "commits_behind": "{{.Count}} commit(s) behind", + "done_pulled": "Done: {{.Count}} pulled", + "flag": { + "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.", + "pulling": "Pulling", + "pulling_repos": "Pulling {{.Count}} repo(s):", + "repos_behind": "{{.Count}} repo(s) behind upstream:", + "short": "Pull updates across all repos" + }, + "push": { + "all_up_to_date": "All repos up to date. Nothing to push.", + "commits_count": "{{.Count}} commit(s)", + "confirm": "Push all?", + "confirm_push": "Push {{.Commits}} commit(s) to {{.Repos}} repo(s)?", + "diverged": "branch has diverged from remote", + "diverged_help": "Some repos have diverged (local and remote have different commits).", + "done_pushed": "Done: {{.Count}} pushed", + "failed": "Push failed", + "flag": { + "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.", + "nothing": "Nothing to push", + "pull_and_retry": "Pull changes and retry push?", + "repos_with_unpushed": "{{.Count}} repo(s) with unpushed commits:", + "short": "Push commits across all repos", + "success": "Pushed successfully", + "uncommitted_changes_commit": "You have uncommitted changes. Commit with Claude first?" + }, + "registry_label": "Registry:", + "repos_with_changes": "{{.Count}} repo(s) with uncommitted changes:", + "reviews": { + "approved": "{{.Count}} approved", + "changes_requested": "{{.Count}} changes requested", + "draft": "[draft]", + "flag": { + "all": "Show all PRs including drafts", + "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.", + "no_prs": "No open PRs found.", + "open_prs": "{{.Count}} open PR(s)", + "pending": "{{.Count}} pending", + "short": "List PRs needing review across all repos", + "status_approved": "v approved", + "status_changes": "* changes requested", + "status_pending": "o pending review" + }, + "scanning_label": "Scanning:", + "short": "Multi-repo development workflow", + "staged": "{{.Count}} staged", + "status": { + "ahead": "ahead", + "behind": "behind", + "clean": "clean", + "conflict": "conflict", + "dirty": "dirty", + "diverged": "diverged", + "synced": "synced" + }, + "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.", + "short": "Synchronizes public service APIs with internal implementations", + "success": "Public APIs synchronized successfully." + }, + "untracked": "{{.Count}} untracked", + "vm": { + "already_installed": "Dev environment already installed", + "boot": { + "flag": { + "cpus": "Number of CPUs (default: 2)", + "fresh": "Stop existing and start fresh", + "memory": "Memory in MB (default: 4096)" + }, + "long": "Boots the dev environment VM.\n\nExamples:\n core dev boot\n core dev boot --memory 8192 --cpus 4\n core dev boot --fresh", + "short": "Start the dev environment" + }, + "booting": "Booting dev environment...", + "check_updates": "Use {{.Command}} to check for updates", + "checking_updates": "Checking for updates...", + "claude": { + "flag": { + "auth": "Selective auth forwarding (gh,anthropic,ssh,git)", + "model": "Model to use (opus, sonnet)", + "no_auth": "Don't forward any auth credentials" + }, + "long": "Starts a Claude Code session inside the dev environment sandbox.\n\nProvides isolation while forwarding selected credentials.\nAuto-boots the dev environment if not running.\n\nAuth options (default: all):\n gh - GitHub CLI auth\n anthropic - Anthropic API key\n ssh - SSH agent forwarding\n git - Git config (name, email)\n\nExamples:\n core dev claude\n core dev claude --model opus\n core dev claude --auth gh,anthropic\n core dev claude --no-auth", + "short": "Start sandboxed Claude session" + }, + "config_label": "Config:", + "config_value": "{{.Memory}}MB, {{.CPUs}} CPUs", + "connect_with": "Connect with: {{.Command}}", + "container_label": "Container:", + "cpus_label": "CPUs:", + "current_label": "Current:", + "downloading": "Downloading dev environment...", + "downloading_update": "Downloading update...", + "image_label": "Image:", + "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" + }, + "install_with": "Install with: {{.Command}}", + "installed_in": "Installed in {{.Duration}}", + "installed_label": "Installed:", + "installed_no": "No", + "installed_yes": "Yes", + "latest_label": "Latest:", + "memory_label": "Memory:", + "not_installed": "dev environment not installed (run 'core dev install' first)", + "not_running": "Dev environment is not running", + "progress_label": "Progress:", + "run_to_update": "Run {{.Command}} to update", + "running": "Dev environment running", + "serve": { + "flag": { + "path": "Subdirectory to serve", + "port": "Port to serve on (default: 8000)" + }, + "long": "Mounts the current project into the dev environment and starts a dev server.\n\nAuto-detects the appropriate serve command based on project files.\n\nExamples:\n core dev serve\n core dev serve --port 3000\n core dev serve --path public", + "short": "Mount project and start dev server" + }, + "shell": { + "flag": { + "console": "Use serial console instead of SSH" + }, + "long": "Opens an interactive shell in the dev environment.\n\nUses SSH by default, or serial console with --console.\n\nExamples:\n core dev shell\n core dev shell --console\n core dev shell -- ls -la", + "short": "Connect to the dev environment" + }, + "ssh_port": "SSH port:", + "start_with": "Start with: {{.Command}}", + "status": { + "long": "Shows the current status of the dev environment.\n\nExamples:\n core dev vm-status", + "short": "Show dev environment status" + }, + "status_label": "Status:", + "status_running": "Running", + "status_stopped": "Stopped", + "status_title": "Dev Environment Status", + "stop": { + "long": "Stops the running dev environment VM.\n\nExamples:\n core dev stop", + "short": "Stop the dev environment" + }, + "stopped": "Stopped", + "stopping": "Stopping dev environment...", + "stopping_current": "Stopping current instance...", + "test": { + "flag": { + "name": "Run named test command from .core/test.yaml" + }, + "long": "Runs tests in the dev environment.\n\nAuto-detects the test command based on project files, or uses .core/test.yaml.\n\nExamples:\n core dev test\n core dev test --name integration\n core dev test -- go test -v ./...", + "short": "Run tests in the dev environment" + }, + "up_to_date": "Already up to date", + "update": { + "flag": { + "apply": "Download and apply the update" + }, + "long": "Checks for dev environment updates and optionally applies them.\n\nExamples:\n core dev update\n core dev update --apply", + "short": "Check for and apply updates" + }, + "update_available": "Update available", + "updated_in": "Updated in {{.Duration}}", + "uptime_label": "Uptime:", + "version_label": "Version:" + }, + "work": { + "all_up_to_date": "All repos up to date.", + "commits_count": "{{.Count}} commit(s)", + "error_prefix": "error:", + "flag": { + "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" + }, + "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", + "table_ahead": "Ahead", + "table_modified": "Modified", + "table_repo": "Repo", + "table_staged": "Staged", + "table_untracked": "Untracked", + "use_commit_flag": "Use --commit to have Claude create commits" + } + }, + "docs": { + "error": { + "load_registry": "failed to load registry", + "scan_directory": "failed to scan directory" + }, + "list": { + "coverage_label": "Coverage", + "coverage_summary": "{{.WithDocs}} with docs, {{.WithoutDocs}} without", + "files_count": "{{.Count}} files", + "flag": { + "registry": "Path to repos.yaml (auto-detected if not specified)" + }, + "header": { + "changelog": "CHANGELOG", + "claude": "CLAUDE", + "docs": "docs/", + "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.", + "short": "List documentation across repos" + }, + "long": "Manage documentation across all repos.\nScan for docs, check coverage, and sync to core-php/docs/packages/.", + "short": "Documentation management", + "sync": { + "confirm": "Sync?", + "done_label": "Done:", + "dry_run_notice": "Dry run - no files copied", + "files_count": "({{.Count}} files)", + "flag": { + "dry_run": "Show what would be synced without copying", + "output": "Output directory (default: core-php/docs/packages)", + "registry": "Path to repos.yaml (auto-detected if not specified)" + }, + "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.", + "no_docs_found": "No documentation found in any repos.", + "repos_with_docs": "{{.Count}} repo(s) with docs/ directories", + "short": "Sync documentation to core-php/docs/packages/", + "synced_packages": "Synced {{.Count}} packages", + "total_label": "Total:", + "total_summary": "{{.Files}} files from {{.Repos}} repos → {{.Output}}" + } + }, + "doctor": { + "check": { + "claude": { + "description": "AI-assisted development", + "name": "Claude Code" + }, + "composer": { + "description": "PHP dependencies", + "name": "Composer" + }, + "docker": { + "description": "Container runtime", + "name": "Docker" + }, + "gh": { + "description": "GitHub integration (issues, PRs, CI)", + "name": "GitHub CLI" + }, + "git": { + "description": "Version control", + "name": "Git" + }, + "node": { + "description": "Frontend builds", + "name": "Node.js" + }, + "php": { + "description": "Laravel packages", + "name": "PHP" + }, + "pnpm": { + "description": "Fast package manager", + "name": "pnpm" + } + }, + "checking": "Checking development environment...", + "cli_auth": "CLI authenticated", + "cli_auth_missing": "CLI authentication - run: gh auth login", + "github": "GitHub Access:", + "install_linux_gh": "# GitHub CLI: https://cli.github.com/", + "install_linux_git": "# Git: apt install git", + "install_linux_header": "# Install via your package manager or:", + "install_linux_node": "# Node: https://nodejs.org/", + "install_linux_php": "# PHP: apt install php8.3-cli", + "install_linux_pnpm": "# pnpm: npm install -g pnpm", + "install_macos": "brew install git gh php composer node pnpm docker", + "install_macos_cask": "brew install --cask claude", + "install_missing": "Install missing tools:", + "install_other": "See documentation for your OS", + "issues": "Doctor: {{.Count}} issues found", + "issues_error": "{{.Count}} required tools missing", + "long": "Checks that all required tools are installed and configured.\nRun this before 'core setup' to ensure your environment is ready.", + "no_repos_yaml": "No repos.yaml found (run from workspace directory)", + "optional": "Optional:", + "ready": "Doctor: Environment ready", + "repos_cloned": "{{.Cloned}}/{{.Total}} repos cloned", + "repos_yaml_found": "Found repos.yaml at {{.Path}}", + "required": "Required:", + "short": "Check development environment", + "ssh_found": "SSH key found", + "ssh_missing": "SSH key missing - run: ssh-keygen && gh ssh-key add", + "verbose_flag": "Show detailed version information", + "workspace": "Workspace:" + }, + "go": { + "build": { + "short": "Build Go binaries" + }, + "cov": { + "below_threshold": "FAIL Coverage {{.Actual}}% is below threshold {{.Threshold}}%", + "error": { + "below_threshold": "coverage below threshold", + "create_file": "failed to create coverage file", + "discover": "failed to discover test packages", + "generate_html": "failed to generate HTML", + "get_coverage": "failed to get coverage", + "no_packages": "no test packages found" + }, + "flag": { + "html": "Generate HTML coverage report", + "open": "Generate and open HTML report in browser", + "pkg": "Package to test (default: ./...)", + "threshold": "Minimum coverage percentage (exit 1 if below)" + }, + "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%", + "open_manually": "(open manually)", + "running": "Running tests with coverage", + "short": "Run tests with coverage report" + }, + "fmt": { + "flag": { + "check": "Check only, exit 1 if not formatted", + "diff": "Show diff of changes", + "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", + "short": "Format Go code" + }, + "install": { + "cgo_disabled": "disabled", + "cgo_label": "CGO:", + "failed": "FAIL Install failed", + "flag": { + "no_cgo": "Disable CGO (CGO_ENABLED=0)", + "verbose": "Verbose output" + }, + "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", + "path_label": "Path:", + "short": "Install Go binary", + "success": "OK" + }, + "lint": { + "flag": { + "fix": "Fix issues automatically" + }, + "long": "Run golangci-lint on the codebase.\n\nExamples:\n core go lint\n core go lint --fix", + "short": "Run golangci-lint" + }, + "long": "Go development tools with enhanced output and environment setup.\n\nCommands:\n test Run tests\n cov Run tests with coverage report\n fmt Format Go code\n lint Run golangci-lint\n install Install Go binary\n mod Module management (tidy, download, verify)\n work Workspace management", + "mod": { + "download": { + "short": "Download modules" + }, + "graph": { + "short": "Print dependency graph" + }, + "long": "Go module management commands.\n\nCommands:\n tidy Add missing and remove unused modules\n download Download modules to local cache\n verify Verify dependencies\n graph Print module dependency graph", + "short": "Module management", + "tidy": { + "short": "Tidy go.mod" + }, + "verify": { + "short": "Verify dependencies" + } + }, + "short": "Go development tools", + "test": { + "all_passed": "PASS All tests passed", + "coverage": "Coverage", + "flag": { + "coverage": "Show detailed per-package coverage", + "json": "Output JSON results", + "pkg": "Package to test (default: ./...)", + "race": "Enable race detector", + "run": "Run only tests matching regexp", + "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", + "package_label": "Package:", + "passed": "{{.Count}} passed", + "passed_failed": "{{.Passed}} passed, {{.Failed}} failed", + "running": "Running tests", + "short": "Run tests with coverage", + "some_failed": "FAIL Some tests failed" + }, + "work": { + "added": "Added {{.Module}}", + "error": { + "no_modules": "no go.mod files found" + }, + "init": { + "short": "Initialize workspace" + }, + "long": "Go workspace management commands.\n\nCommands:\n sync Sync go.work with modules\n init Initialize go.work\n use Add module to workspace", + "short": "Workspace management", + "sync": { + "short": "Sync workspace" + }, + "use": { + "short": "Add module to workspace" + } + } + }, + "php": { + "analyse": { + "flag": { + "level": "PHPStan analysis level (0-9)", + "memory": "Memory limit (e.g., 2G)" + }, + "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_issues": "No issues found", + "running": "Running static analysis with {{.Analyser}}", + "short": "Run PHPStan static analysis" + }, + "audit": { + "all_secure": "All dependencies are secure", + "completed_errors": "audit completed with errors", + "error": "error", + "fix_hint": "composer update && npm update", + "flag": { + "fix": "Auto-fix vulnerabilities (npm only)", + "json": "Output in JSON format" + }, + "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).", + "scanning": "Scanning dependencies for vulnerabilities", + "secure": "secure", + "short": "Security audit for dependencies", + "vulnerabilities": "{{.Count}} vulnerabilities" + }, + "build": { + "building_docker": "Building Docker image...", + "building_linuxkit": "Building LinuxKit image...", + "docker_run_with": "Run with:", + "docker_success": "Docker image built successfully", + "extensions": "Extensions:", + "flag": { + "dockerfile": "Path to custom Dockerfile", + "format": "LinuxKit output format: qcow2 (default), iso, raw, vmdk", + "name": "Image name (default: project directory name)", + "no_cache": "Build without cache", + "output": "Output path for LinuxKit image", + "platform": "Target platform (e.g., linux/amd64, linux/arm64)", + "tag": "Image tag (default: latest)", + "template": "LinuxKit template name (default: server-php)", + "type": "Build type: docker (default) or linuxkit" + }, + "format": "Format:", + "frontend": "Frontend:", + "image": "Image:", + "laravel": "Laravel:", + "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.", + "octane": "Octane:", + "php_version": "PHP Version:", + "platform": "Platform:", + "short": "Build Docker or LinuxKit image", + "template": "Template:" + }, + "deploy": { + "deploying": "Deploying to {{.Environment}}...", + "flag": { + "force": "Force deployment even if no changes detected", + "staging": "Deploy to staging environment", + "wait": "Wait for deployment to complete" + }, + "long": "Deploy the PHP application to Coolify.\n\nRequires configuration in .env:\n COOLIFY_URL=https://coolify.example.com\n COOLIFY_TOKEN=your-api-token\n COOLIFY_APP_ID=production-app-id\n COOLIFY_STAGING_APP_ID=staging-app-id (optional)", + "short": "Deploy to Coolify", + "success": "Deployment completed successfully", + "triggered": "Deployment triggered. Use 'core php deploy:status' to check progress.", + "warning_status": "Deployment ended with status: {{.Status}}" + }, + "deploy_list": { + "flag": { + "limit": "Number of deployments to list (default: 10)", + "staging": "List staging deployments" + }, + "long": "List recent deployments.", + "none_found": "No deployments found", + "recent": "Recent {{.Environment}} deployments:", + "short": "List recent deployments" + }, + "deploy_rollback": { + "flag": { + "id": "Specific deployment ID to rollback to", + "staging": "Rollback staging environment", + "wait": "Wait for rollback to complete" + }, + "long": "Rollback to a previous deployment.\n\nIf no deployment ID is specified, rolls back to the most recent\nsuccessful deployment.", + "rolling_back": "Rolling back {{.Environment}}...", + "short": "Rollback to previous deployment", + "success": "Rollback completed successfully", + "triggered": "Rollback triggered. Use 'core php deploy:status' to check progress.", + "warning_status": "Rollback ended with status: {{.Status}}" + }, + "deploy_status": { + "checking": "Checking {{.Environment}} deployment status...", + "flag": { + "id": "Specific deployment ID", + "staging": "Check staging environment" + }, + "long": "Show the status of a deployment.", + "short": "Show deployment status" + }, + "dev": { + "all_stopped": "All services stopped", + "detected_services": "Detected services:", + "flag": { + "domain": "Domain for SSL certificate (default: from APP_URL or localhost)", + "https": "Enable HTTPS with mkcert", + "no_horizon": "Skip Laravel Horizon", + "no_redis": "Skip Redis server", + "no_reverb": "Skip Laravel Reverb", + "no_vite": "Skip Vite dev server", + "port": "FrankenPHP port (default: 8000)" + }, + "logs_failed": "Failed to get logs: {{.Error}}", + "long": "Starts all detected Laravel services.\n\nAuto-detects:\n - Vite (vite.config.js/ts)\n - Horizon (config/horizon.php)\n - Reverb (config/reverb.php)\n - Redis (from .env)", + "press_ctrl_c": "Press Ctrl+C to stop all services", + "services_started": "Services started:", + "short": "Start Laravel development environment", + "shutting_down": "Shutting down...", + "starting": "Starting {{.AppName}} development environment", + "stop_error": "Error stopping services: {{.Error}}" + }, + "error": { + "analysis_issues": "analysis found issues", + "audit_failed": "audit failed", + "build_failed": "build failed", + "critical_high_issues": "critical or high severity issues found", + "deploy_failed": "deployment failed", + "detect_config": "failed to detect project configuration", + "fmt_failed": "formatting failed", + "fmt_issues": "formatting issues found", + "get_logs": "failed to get logs", + "infection_failed": "mutation testing failed", + "infection_not_installed": "infection not installed", + "link_packages": "failed to link packages", + "list_deployments": "failed to list deployments", + "list_packages": "failed to list packages", + "mkcert_not_installed": "mkcert not installed", + "not_laravel": "not a Laravel project (missing artisan or laravel/framework)", + "not_laravel_short": "not a Laravel project", + "not_php": "not a PHP project (missing composer.json)", + "open_shell": "failed to open shell", + "psalm_issues": "psalm found issues", + "psalm_not_installed": "psalm not installed", + "rector_failed": "rector failed", + "rector_not_installed": "rector not installed", + "rollback_failed": "rollback failed", + "security_failed": "security check failed", + "ssl_setup": "failed to setup SSL", + "start_container": "failed to start container", + "start_services": "failed to start services", + "status_failed": "failed to get status", + "stop_services": "failed to stop services", + "tests_failed": "tests failed", + "unlink_packages": "failed to unlink packages", + "update_packages": "composer update failed", + "vulns_found": "vulnerabilities found", + "working_dir": "failed to get working directory" + }, + "fmt": { + "checking": "Checking code with {{.Formatter}}", + "flag": { + "diff": "Show diff of changes", + "fix": "Auto-fix formatting issues" + }, + "formatting": "Formatting code with {{.Formatter}}", + "long": "Format PHP code using Laravel Pint.", + "no_formatter": "no formatter found (install Laravel Pint: composer require laravel/pint --dev)", + "no_issues": "No formatting issues found", + "short": "Format PHP code with Laravel Pint", + "success": "Code formatted successfully" + }, + "infection": { + "complete": "Mutation testing complete", + "flag": { + "filter": "Filter files by pattern", + "min_covered_msi": "Minimum covered mutation score (0-100, default: 70)", + "min_msi": "Minimum mutation score indicator (0-100, default: 50)", + "only_covered": "Only mutate covered code", + "threads": "Number of parallel threads (default: 4)" + }, + "install": "composer require --dev infection/infection", + "long": "Run Infection mutation testing to measure test suite quality.\n\nMutation testing modifies your code and checks if tests catch\nthe changes. High mutation score = high quality tests.\n\nWarning: This can be slow on large codebases.", + "not_found": "Infection not found", + "note": "This may take a while...", + "running": "Running mutation testing", + "short": "Mutation testing for test quality" + }, + "label": { + "app_url": "App URL:", + "audit": "Audit:", + "branch": "Branch:", + "commit": "Commit:", + "completed": "Completed:", + "deploy": "Deploy:", + "done": "Done:", + "duration": "Duration:", + "error": "Error:", + "fix": "Fix:", + "id": "ID:", + "infection": "Infection:", + "info": "Info:", + "install": "Install:", + "message": "Message:", + "php": "PHP:", + "psalm": "Psalm:", + "qa": "QA:", + "rector": "Rector:", + "running": "Running:", + "security": "Security:", + "services": "Services:", + "setup": "Setup:", + "skip": "Skip:", + "started": "Started:", + "status": "Status:", + "summary": "Summary:", + "url": "URL:", + "vite": "Vite:", + "warning": "Warning:" + }, + "logs": { + "flag": { + "follow": "Follow log output", + "service": "Specific service (default: all)" + }, + "long": "Stream logs from Laravel services.\n\nServices: frankenphp, vite, horizon, reverb, redis", + "short": "View service logs" + }, + "long": "Manage Laravel development environment with FrankenPHP.\n\nServices orchestrated:\n - FrankenPHP/Octane (port 8000, HTTPS on 443)\n - Vite dev server (port 5173)\n - Laravel Horizon (queue workers)\n - Laravel Reverb (WebSocket, port 8080)\n - Redis (port 6379)", + "packages": { + "link": { + "done": "Packages linked. Run 'composer update' to install.", + "linking": "Linking packages...", + "long": "Link local PHP packages for development.\n\nAdds path repositories to composer.json with symlink enabled.\nThe package name is auto-detected from each path's composer.json.", + "short": "Link local packages" + }, + "list": { + "linked": "Linked packages:", + "long": "List all locally linked packages.\n\nShows package name, path, and version for each linked package.", + "none_found": "No linked packages found", + "path": "Path:", + "short": "List linked packages", + "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.", + "short": "Manage local PHP packages", + "unlink": { + "done": "Packages unlinked. Run 'composer update' to remove.", + "long": "Remove linked packages from composer.json.\n\nRemoves path repositories by package name.", + "short": "Unlink packages", + "unlinking": "Unlinking packages..." + }, + "update": { + "done": "Packages updated", + "long": "Run composer update for linked packages.\n\nIf no packages specified, updates all packages.", + "short": "Update linked packages", + "updating": "Updating packages..." + } + }, + "psalm": { + "analysing": "Analysing code with Psalm", + "analysing_fixing": "Analysing and fixing code with Psalm", + "flag": { + "baseline": "Generate/update baseline file", + "fix": "Auto-fix issues where possible", + "level": "Error level (1=strictest, 8=most lenient)", + "show_info": "Show info-level issues" + }, + "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.", + "no_issues": "No issues found", + "not_found": "Psalm not found", + "setup": "./vendor/bin/psalm --init", + "short": "Run Psalm static analysis" + }, + "qa": { + "all_passed": "All checks passed ({{.Passed}}/{{.Total}})", + "failed": "failed", + "fix_audit": "composer update && npm update", + "fix_infection": "Improve test coverage for mutated code", + "fix_phpstan": "Fix PHPStan errors shown above", + "fix_psalm": "Fix Psalm errors shown above", + "fix_tests": "Fix failing tests shown above", + "flag": { + "fix": "Auto-fix issues where possible", + "full": "Run all stages including slow checks", + "quick": "Only run quick checks" + }, + "issue_analysis": "Static analysis errors", + "issue_mutation": "Mutation score below threshold", + "issue_rector": "Code improvements available", + "issue_style": "Code style issues found", + "issue_tests": "Test failures", + "issue_types": "Type errors found", + "issue_vulns": "vulnerabilities", + "long": "Run the complete quality assurance pipeline.\n\nStages:\n quick: Security audit, code style, PHPStan\n standard: Psalm, tests\n full: Rector dry-run, mutation testing (slow)", + "no_checks": "No checks available", + "passed": "passed", + "pipeline_failed": "QA pipeline failed", + "running": "Running QA pipeline ({{.Stages}})", + "short": "Run full QA pipeline", + "some_failed": "Some checks failed ({{.Passed}}/{{.Total}} passed)", + "stage_prefix": "═══ ", + "stage_suffix": " STAGE ═══", + "to_fix": "To fix:" + }, + "rector": { + "analysing": "Analysing code with Rector", + "changes_suggested": "Changes suggested (use --fix to apply)", + "flag": { + "clear_cache": "Clear Rector cache before running", + "diff": "Show detailed diff of changes", + "fix": "Apply changes (default is dry-run)" + }, + "install": "composer require --dev rector/rector", + "long": "Run Rector for automated code improvements and PHP upgrades.\n\nRector can automatically upgrade PHP syntax, improve code quality,\nand apply framework-specific refactorings.", + "no_changes": "No changes needed", + "not_found": "Rector not found", + "refactored": "Code refactored successfully", + "refactoring": "Refactoring code with Rector", + "setup": "./vendor/bin/rector init", + "short": "Automated code refactoring" + }, + "security": { + "checks_suffix": " CHECKS:", + "critical": "Critical:", + "fix_label": "Fix:", + "flag": { + "json": "Output in JSON format", + "sarif": "Output in SARIF format (for GitHub Security)", + "severity": "Minimum severity (critical, high, medium, low)", + "url": "URL to check HTTP headers (optional)" + }, + "high": "High:", + "long": "Scan for security vulnerabilities in configuration and code.\n\nChecks environment config, file permissions, code patterns,\nand runs security-focused static analysis.", + "low": "Low:", + "medium": "Medium:", + "passed": "Passed:", + "running": "Running security checks", + "short": "Security vulnerability scanning", + "summary": "Security scan complete" + }, + "serve": { + "flag": { + "container": "Container name", + "detach": "Run in detached mode", + "env_file": "Path to environment file", + "https_port": "HTTPS port (default: 443)", + "name": "Docker image name (required)", + "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.", + "name_required": "--name is required: specify the Docker image name", + "ports": "Ports:", + "running": "Running production container...", + "short": "Run production container", + "stopped": "Container stopped" + }, + "shell": { + "long": "Open an interactive shell in a running PHP container.", + "opening": "Opening shell in container {{.Container}}...", + "short": "Open shell in running container" + }, + "short": "Laravel/PHP development tools", + "ssl": { + "cert_label": "Cert:", + "certs_created": "SSL certificates created", + "certs_exist": "Certificates already exist", + "flag": { + "domain": "Domain for certificate (default: from APP_URL)" + }, + "install_linux": "Linux: see https://github.com/FiloSottile/mkcert", + "install_macos": "macOS: brew install mkcert", + "install_with": "Install with:", + "key_label": "Key:", + "mkcert_not_installed": "mkcert is not installed", + "setting_up": "Setting up SSL for {{.Domain}}", + "short": "Setup SSL certificates with mkcert" + }, + "status": { + "detected_services": "Detected services:", + "error": "error: {{.Error}}", + "octane_server": "Octane server:", + "package_manager": "Package manager:", + "pid": "pid {{.PID}}", + "port": "port {{.Port}}", + "project": "Project:", + "running": "running", + "short": "Show service status", + "ssl_certs": "SSL certificates:", + "ssl_installed": "installed", + "ssl_not_setup": "not setup", + "stopped": "stopped" + }, + "stop": { + "short": "Stop all Laravel services", + "stopping": "Stopping services..." + }, + "test": { + "failed": "Some tests failed", + "flag": { + "coverage": "Generate code coverage", + "filter": "Filter tests by name pattern", + "group": "Run only tests in specified group", + "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.", + "passed": "All tests passed", + "running": "Running tests with {{.Runner}}", + "short": "Run PHP tests (PHPUnit/Pest)" + } + }, + "pkg": { + "error": { + "auth_failed": "authentication failed - try: unset GH_TOKEN && gh auth login", + "create_directory": "failed to create directory: %w", + "gh_not_authenticated": "gh CLI not authenticated. Run: gh auth login", + "invalid_repo_format": "invalid repo format: use org/repo (e.g., host-uk/core-php)", + "load_registry": "failed to load registry: %w", + "no_repos_yaml": "no repos.yaml found", + "no_repos_yaml_workspace": "no repos.yaml found - run from workspace directory", + "parse_results": "failed to parse results: %w", + "repo_required": "repository is required (e.g., core pkg install host-uk/core-php)", + "search_failed": "search failed: %s", + "specify_package": "specify package name or use --all" + }, + "install": { + "add_to_registry": "add to registry", + "added_to_registry": "added to repos.yaml", + "already_exists": "{{.Name}} already exists at {{.Path}}", + "cloning": "Cloning", + "done_label": "Done:", + "flag": { + "add": "Add to repos.yaml registry", + "dir": "Target directory (default: ./packages or current dir)" + }, + "installed": "Installed {{.Name}}", + "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", + "short": "Clone a package from GitHub", + "skip_label": "Skip:", + "target_label": "Target:" + }, + "list": { + "install_missing": "Install missing:", + "long": "Lists all packages in the current workspace.\n\nReads from repos.yaml or scans for git repositories.\n\nExamples:\n core pkg list", + "no_packages": "No packages in registry.", + "short": "List installed packages", + "summary": "{{.Installed}} installed, {{.Missing}} missing", + "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", + "no_description": "(no description)", + "outdated": { + "all_up_to_date": "All packages up to date", + "checking": "Checking for updates...", + "commits_behind": "{{.Count}} commits behind", + "done_label": "Done:", + "long": "Checks which packages have unpulled commits.\n\nExamples:\n core pkg outdated", + "outdated_label": "Outdated:", + "short": "Check for outdated packages", + "summary": "{{.Outdated}} outdated, {{.UpToDate}} up to date", + "summary_label": "Summary:", + "update_with": "Update with:" + }, + "search": { + "cache_label": "Cache:", + "fetching_label": "Fetching:", + "flag": { + "limit": "Max results (default 50)", + "org": "GitHub organization (default: host-uk)", + "pattern": "Repo name pattern (* for wildcard)", + "refresh": "Bypass cache and fetch fresh data", + "type": "Filter by type in name (mod, services, plug, website)" + }, + "found_repos": "Found {{.Count}} repositories:", + "gh_token_unset": "Unset it with: unset GH_TOKEN", + "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", + "no_repos_found": "No repositories found matching pattern.", + "note_label": "Note:", + "private_label": "[private]", + "short": "Search GitHub for packages" + }, + "short": "Package management for core-* repos", + "update": { + "done_label": "Done:", + "flag": { + "all": "Update all packages" + }, + "long": "Pulls latest changes for installed packages.\n\nExamples:\n core pkg update core-php # Update specific package\n core pkg update --all # Update all packages", + "not_installed": "not installed", + "short": "Update installed packages", + "summary": "{{.Updated}} updated, {{.Skipped}} skipped, {{.Failed}} failed", + "up_to_date": "up to date", + "update_label": "Update:", + "updating": "Updating {{.Count}} package(s)" + } + }, + "sdk": { + "diff": { + "base_label": "Base:", + "breaking": "Breaking:", + "checking": "Checking for breaking changes", + "current_label": "Current:", + "error": { + "base_required": "--base is required (version tag or file path)" + }, + "flag": { + "base": "Base spec (version tag or file)", + "spec": "Current spec file" + }, + "label": "SDK Diff:", + "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" + }, + "error": { + "working_dir": "failed to get working directory" + }, + "label": { + "error": "Error:", + "ok": "OK:", + "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", + "short": "SDK validation and API compatibility tools", + "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.", + "short": "Validate OpenAPI spec", + "spec_label": "Spec:", + "valid": "Spec is valid", + "validating": "Validating OpenAPI spec" + } + }, + "setup": { + "already_exist_count": "{{.Count}} already exist", + "already_exists": "already exists", + "bootstrap_mode": "Bootstrap mode (no repos.yaml found)", + "cancelled": "Cancelled.", + "cloned": "cloned", + "cloned_count": "{{.Count}} cloned", + "cloning": "Cloning", + "cloning_current_dir": "Cloning into current directory", + "complete": "Setup complete", + "creating_project_dir": "Creating project directory", + "done": "done", + "done_label": "Done:", + "error": { + "build_failed": "build failed" + }, + "exist": "{{.Count}} exist", + "failed_count": "{{.Count}} failed", + "filter_label": "Filter:", + "flag": { + "all": "Skip wizard, clone all packages (non-interactive)", + "build": "Run build after cloning", + "dry_run": "Show what would be cloned without cloning", + "name": "Project directory name for bootstrap mode", + "only": "Only clone repos of these types (comma-separated: foundation,module,product)", + "registry": "Path to repos.yaml (auto-detected if not specified)" + }, + "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.", + "org_label": "Org:", + "registry_label": "Registry:", + "repo": { + "created": "Created", + "detected_type": "Detected project type", + "setting_up": "Setting up repository", + "would_create": "Would create" + }, + "running_build": "Running build...", + "short": "Bootstrap workspace or clone packages from registry", + "skipped": "{{.Count}} skipped", + "target_label": "Target:", + "to_clone": "{{.Count}} to clone", + "wizard": { + "confirm_cancel": "Cancel", + "confirm_clone": "Clone {{.Count}} packages to {{.Target}}?", + "confirm_yes": "Yes, clone", + "git_repo_title": "This directory is a git repository", + "option_package": "Create Package (clone repos into subdirectory)", + "option_setup": "Setup Working Directory", + "package_selection": "Package Selection", + "project_name_desc": "Enter the name for your new workspace directory", + "project_name_title": "Project directory name", + "select_packages": "Select packages to clone", + "selection_hint": "Use space to select/deselect, enter to confirm", + "what_to_do": "What would you like to do?" + }, + "would_clone": "Would clone", + "would_clone_list": "Would clone:", + "would_load_registry": "Would load registry from" + }, + "test": { + "all_passed": "All tests passed", + "coverage_by_package": "Coverage by package:", + "error": { + "no_go_mod": "no go.mod found - run from a Go project directory", + "tests_failed": "tests failed" + }, + "failed": "{{.Count}} failed", + "failed_packages": "Failed packages:", + "flag": { + "coverage": "Show detailed per-package coverage", + "json": "Output JSON for CI/agents", + "pkg": "Package pattern to test (default: ./...)", + "race": "Enable race detector (-race)", + "run": "Run only tests matching this regex (-run)", + "short": "Skip long-running tests (-short)", + "verbose": "Show test output as it runs (-v)" + }, + "label": { + "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", + "passed": "{{.Count}} passed", + "running": "Running tests", + "short": "Run tests with coverage", + "skipped": "{{.Count}} skipped", + "tests_failed": "Tests failed" + }, + "vm": { + "error": { + "apply_template": "failed to apply template", + "build_image": "failed to build image", + "create_temp": "failed to create temp directory", + "get_logs": "failed to get logs", + "id_and_cmd_required": "container ID and command are required", + "id_required": "container ID is required", + "init_manager": "failed to initialize container manager", + "linuxkit_not_found": "linuxkit not found. Install with: brew install linuxkit (macOS) or see https://github.com/linuxkit/linuxkit", + "list_containers": "failed to list containers", + "multiple_match": "multiple containers match '{{.ID}}', be more specific", + "no_image_found": "no image found after build", + "no_match": "no container found matching: {{.ID}}", + "run_container": "failed to run container", + "stop_container": "failed to stop container", + "template_required": "template name is required", + "write_template": "failed to write template" + }, + "exec": { + "long": "Execute a command inside a running VM via SSH.\n\nExamples:\n core vm exec abc12345 ls -la\n core vm exec abc1 /bin/sh", + "short": "Execute a command in a VM" + }, + "hint": { + "stop": "Use 'core vm stop {{.ID}}' to stop", + "view_logs": "Use 'core vm logs {{.ID}}' to view output" + }, + "label": { + "building": "Building:", + "container_stopped": "Container stopped:", + "hypervisor": "Hypervisor:", + "image": "Image:", + "name": "Name:", + "pid": "PID:", + "started": "Started:", + "template": "Template:" + }, + "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", + "short": "View VM logs" + }, + "long": "Manage LinuxKit virtual machines.\n\nLinuxKit VMs are lightweight, immutable VMs built from YAML templates.\nThey run using qemu or hyperkit depending on your system.\n\nCommands:\n run Run a VM from image or template\n ps List running VMs\n stop Stop a running VM\n logs View VM logs\n exec Execute command in VM\n templates Manage LinuxKit templates", + "ps": { + "flag": { + "all": "Show all containers (including stopped)" + }, + "header": "ID\tNAME\tIMAGE\tSTATUS\tSTARTED\tPID", + "long": "Lists all VMs. By default, only shows running VMs.\n\nExamples:\n core vm ps\n core vm ps -a", + "no_containers": "No containers", + "no_running": "No running containers", + "short": "List running VMs" + }, + "run": { + "error": { + "image_required": "image path is required (or use --template)" + }, + "flag": { + "cpus": "Number of CPUs (default: 1)", + "detach": "Run in detached mode (background)", + "memory": "Memory in MB (default: 1024)", + "name": "Name for the container", + "ssh_port": "SSH port for exec commands (default: 2222)", + "template": "Run from a LinuxKit template (build + run)", + "var": "Template variable in KEY=VALUE format (can be repeated)" + }, + "long": "Runs a LinuxKit image as a VM using the available hypervisor.\n\nSupported image formats: .iso, .qcow2, .vmdk, .raw\n\nYou can also run from a template using --template, which will build and run\nthe image automatically. Use --var to set template variables.\n\nExamples:\n core vm run image.iso\n core vm run -d image.qcow2\n core vm run --name myvm --memory 2048 --cpus 4 image.iso\n core vm run --template core-dev --var SSH_KEY=\"ssh-rsa AAAA...\"\n core vm run --template server-php --var SSH_KEY=\"...\" --var DOMAIN=example.com", + "short": "Run a LinuxKit image or template" + }, + "short": "LinuxKit VM management", + "stop": { + "long": "Stops a running VM by ID.\n\nExamples:\n core vm stop abc12345\n core vm stop abc1", + "short": "Stop a running VM", + "stopped": "Stopped", + "stopping": "Stopping:" + }, + "templates": { + "header": "NAME\tDESCRIPTION", + "hint": { + "run": "Run from template:", + "show": "Show template:", + "vars": "Show variables:" + }, + "long": "Manage LinuxKit YAML templates for building VMs.\n\nTemplates provide pre-configured LinuxKit configurations for common use cases.\nThey support variable substitution with ${VAR} and ${VAR:-default} syntax.\n\nExamples:\n core vm templates # List available templates\n core vm templates show core-dev # Show template content\n core vm templates vars server-php # Show template variables", + "no_templates": "No templates available.", + "short": "Manage LinuxKit templates", + "show": { + "long": "Display the content of a LinuxKit template.\n\nExamples:\n core templates show core-dev\n core templates show server-php", + "short": "Display template content" + }, + "title": "Available LinuxKit Templates", + "vars": { + "long": "Display all variables used in a template.\n\nShows required variables (no default) and optional variables (with defaults).\n\nExamples:\n core templates vars core-dev\n core templates vars server-php", + "none": "No variables in this template.", + "optional": "Optional Variables (with defaults):", + "required": "Required Variables (no default):", + "short": "Show template variables" + } + } + } }, - "cli.count.repos": { - "one": "{{.Count}} repo", - "other": "{{.Count}} repos" + "error": { + "gh_not_found": "'gh' CLI not found. Install from https://cli.github.com/", + "invalid": "Invalid: {{.Item}}", + "network": "Network error: {{.Message}}", + "not_found": "Not found: {{.Item}}", + "permission": "Permission denied: {{.Item}}", + "registry_not_found": "No repos.yaml found", + "repo_not_found": "Repository '{{.Name}}' not found", + "timeout": "Operation timed out" }, - "cli.count.commits": { - "one": "{{.Count}} commit", - "other": "{{.Count}} commits" + "label": { + "author": "Author", + "branch": "Branch", + "commit": "Commit", + "coverage": "Coverage", + "date": "Date", + "duration": "Duration", + "message": "Message", + "package": "Package", + "registry": "Registry", + "scanning": "Scanning", + "status": "Status", + "total": "Total" }, - - "cmd.dev.short": "Multi-repo development workflow", - "cmd.dev.long": "Manage multiple git repositories and GitHub integration.\n\nUses repos.yaml to discover repositories. Falls back to scanning\nthe current directory if no registry is found.\n\nGit Operations:\n work Combined status -> commit -> push workflow\n health Quick repo health summary\n commit Claude-assisted commit messages\n push Push repos with unpushed commits\n pull Pull repos behind remote\n\nGitHub Integration (requires gh CLI):\n issues List open issues across repos\n reviews List PRs awaiting review\n ci Check GitHub Actions status\n impact Analyse dependency impact\n\nDev Environment:\n install Download dev environment image\n boot Start dev environment VM\n stop Stop dev environment VM\n shell Open shell in dev VM\n status Check dev VM status", - - "cmd.dev.work.short": "Multi-repo git operations", - "cmd.dev.work.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.", - "cmd.dev.work.flag.status": "Show status only, don't push", - "cmd.dev.work.flag.commit": "Use Claude to commit dirty repos before pushing", - "cmd.dev.work.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - - "cmd.dev.health.short": "Quick health check across all repos", - "cmd.dev.health.long": "Shows a summary of repository health:\ntotal repos, dirty repos, unpushed commits, etc.", - "cmd.dev.health.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.health.flag.verbose": "Show detailed breakdown", - - "cmd.dev.commit.short": "Claude-assisted commits across repos", - "cmd.dev.commit.long": "Uses Claude to create commits for dirty repos.\nShows uncommitted changes and invokes Claude to generate commit messages.", - "cmd.dev.commit.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.commit.flag.all": "Commit all dirty repos without prompting", - - "cmd.dev.push.short": "Push commits across all repos", - "cmd.dev.push.long": "Pushes unpushed commits for all repos.\nShows repos with commits to push and confirms before pushing.", - "cmd.dev.push.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.push.flag.force": "Skip confirmation prompt", - - "cmd.dev.pull.short": "Pull updates across all repos", - "cmd.dev.pull.long": "Pulls updates for all repos.\nBy default only pulls repos that are behind. Use --all to pull all repos.", - "cmd.dev.pull.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.pull.flag.all": "Pull all repos, not just those behind", - - "cmd.dev.issues.short": "List open issues across all repos", - "cmd.dev.issues.long": "Fetches open issues from GitHub for all repos in the registry.\nRequires the 'gh' CLI to be installed and authenticated.", - "cmd.dev.issues.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.issues.flag.limit": "Max issues per repo", - "cmd.dev.issues.flag.assignee": "Filter by assignee (use @me for yourself)", - - "cmd.dev.reviews.short": "List PRs needing review across all repos", - "cmd.dev.reviews.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.", - "cmd.dev.reviews.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.reviews.flag.author": "Filter by PR author", - "cmd.dev.reviews.flag.all": "Show all PRs including drafts", - - "cmd.dev.ci.short": "Check CI status across all repos", - "cmd.dev.ci.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.", - "cmd.dev.ci.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.dev.ci.flag.branch": "Filter by branch", - "cmd.dev.ci.flag.failed": "Show only failed runs", - - "cmd.dev.impact.short": "Show impact of changing a repo", - "cmd.dev.impact.long": "Analyzes the dependency graph to show which repos\nwould be affected by changes to the specified repo.", - "cmd.dev.impact.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - - "cmd.dev.api.short": "Tools for managing service APIs", - "cmd.dev.sync.short": "Synchronizes public service APIs with internal implementations", - "cmd.dev.sync.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.", - - "cmd.dev.vm.install.short": "Download and install the dev environment image", - "cmd.dev.vm.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", - - "cmd.dev.vm.boot.short": "Start the dev environment", - "cmd.dev.vm.boot.long": "Boots the dev environment VM.\n\nExamples:\n core dev boot\n core dev boot --memory 8192 --cpus 4\n core dev boot --fresh", - "cmd.dev.vm.boot.flag.memory": "Memory in MB (default: 4096)", - "cmd.dev.vm.boot.flag.cpus": "Number of CPUs (default: 2)", - "cmd.dev.vm.boot.flag.fresh": "Stop existing and start fresh", - - "cmd.dev.vm.stop.short": "Stop the dev environment", - "cmd.dev.vm.stop.long": "Stops the running dev environment VM.\n\nExamples:\n core dev stop", - - "cmd.dev.vm.status.short": "Show dev environment status", - "cmd.dev.vm.status.long": "Shows the current status of the dev environment.\n\nExamples:\n core dev vm-status", - - "cmd.dev.vm.shell.short": "Connect to the dev environment", - "cmd.dev.vm.shell.long": "Opens an interactive shell in the dev environment.\n\nUses SSH by default, or serial console with --console.\n\nExamples:\n core dev shell\n core dev shell --console\n core dev shell -- ls -la", - "cmd.dev.vm.shell.flag.console": "Use serial console instead of SSH", - - "cmd.dev.vm.serve.short": "Mount project and start dev server", - "cmd.dev.vm.serve.long": "Mounts the current project into the dev environment and starts a dev server.\n\nAuto-detects the appropriate serve command based on project files.\n\nExamples:\n core dev serve\n core dev serve --port 3000\n core dev serve --path public", - "cmd.dev.vm.serve.flag.port": "Port to serve on (default: 8000)", - "cmd.dev.vm.serve.flag.path": "Subdirectory to serve", - - "cmd.dev.vm.test.short": "Run tests in the dev environment", - "cmd.dev.vm.test.long": "Runs tests in the dev environment.\n\nAuto-detects the test command based on project files, or uses .core/test.yaml.\n\nExamples:\n core dev test\n core dev test --name integration\n core dev test -- go test -v ./...", - "cmd.dev.vm.test.flag.name": "Run named test command from .core/test.yaml", - - "cmd.dev.vm.claude.short": "Start sandboxed Claude session", - "cmd.dev.vm.claude.long": "Starts a Claude Code session inside the dev environment sandbox.\n\nProvides isolation while forwarding selected credentials.\nAuto-boots the dev environment if not running.\n\nAuth options (default: all):\n gh - GitHub CLI auth\n anthropic - Anthropic API key\n ssh - SSH agent forwarding\n git - Git config (name, email)\n\nExamples:\n core dev claude\n core dev claude --model opus\n core dev claude --auth gh,anthropic\n core dev claude --no-auth", - "cmd.dev.vm.claude.flag.no_auth": "Don't forward any auth credentials", - "cmd.dev.vm.claude.flag.model": "Model to use (opus, sonnet)", - "cmd.dev.vm.claude.flag.auth": "Selective auth forwarding (gh,anthropic,ssh,git)", - - "cmd.dev.vm.update.short": "Check for and apply updates", - "cmd.dev.vm.update.long": "Checks for dev environment updates and optionally applies them.\n\nExamples:\n core dev update\n core dev update --apply", - "cmd.dev.vm.update.flag.apply": "Download and apply the update", - - "cmd.dev.status.dirty": "dirty", - "cmd.dev.status.clean": "clean", - "cmd.dev.status.ahead": "ahead", - "cmd.dev.status.behind": "behind", - "cmd.dev.status.synced": "synced", - "cmd.dev.status.diverged": "diverged", - "cmd.dev.status.conflict": "conflict", - - "cmd.dev.push.confirm": "Push all?", - "cmd.dev.push.success": "Pushed successfully", - "cmd.dev.push.failed": "Push failed", - "cmd.dev.push.nothing": "Nothing to push", - - "cmd.dev.commit.committing": "Committing dirty repos with Claude...", - "cmd.dev.commit.success": "Committed successfully", - "cmd.dev.commit.failed": "Commit failed", - - "cmd.dev.registry_label": "Registry:", - "cmd.dev.scanning_label": "Scanning:", - "cmd.dev.no_git_repos": "No git repositories found.", - "cmd.dev.no_changes": "No uncommitted changes found.", - "cmd.dev.repos_with_changes": "{{.Count}} repo(s) with uncommitted changes:", - "cmd.dev.modified": "{{.Count}} modified", - "cmd.dev.untracked": "{{.Count}} untracked", - "cmd.dev.staged": "{{.Count}} staged", - "cmd.dev.confirm_claude_commit": "Have Claude commit these repos?", - "cmd.dev.committing": "Committing", - "cmd.dev.committed": "committed", - "cmd.dev.done_succeeded": "Done: {{.Count}} succeeded", - "cmd.dev.count_failed": "{{.Count}} failed", - - "cmd.dev.push.all_up_to_date": "All repos up to date. Nothing to push.", - "cmd.dev.push.repos_with_unpushed": "{{.Count}} repo(s) with unpushed commits:", - "cmd.dev.push.commits_count": "{{.Count}} commit(s)", - "cmd.dev.push.confirm_push": "Push {{.Commits}} commit(s) to {{.Repos}} repo(s)?", - "cmd.dev.push.done_pushed": "Done: {{.Count}} pushed", - "cmd.dev.push.diverged": "branch has diverged from remote", - "cmd.dev.push.diverged_help": "Some repos have diverged (local and remote have different commits).", - "cmd.dev.push.pull_and_retry": "Pull changes and retry push?", - "cmd.dev.push.uncommitted_changes_commit": "You have uncommitted changes. Commit with Claude first?", - - "cmd.dev.pull.all_up_to_date": "All repos up to date. Nothing to pull.", - "cmd.dev.pull.pulling_repos": "Pulling {{.Count}} repo(s):", - "cmd.dev.pull.repos_behind": "{{.Count}} repo(s) behind upstream:", - "cmd.dev.pull.commits_behind": "{{.Count}} commit(s) behind", - "cmd.dev.pull.pulling": "Pulling", - "cmd.dev.pull.done_pulled": "Done: {{.Count}} pulled", - - "cmd.dev.health.dirty_label": "Dirty:", - "cmd.dev.health.ahead_label": "Ahead:", - "cmd.dev.health.behind_label": "Behind:", - "cmd.dev.health.errors_label": "Errors:", - "cmd.dev.health.repos": "repos", - "cmd.dev.health.dirty": "dirty", - "cmd.dev.health.to_push": "to push", - "cmd.dev.health.synced": "synced", - "cmd.dev.health.up_to_date": "up to date", - "cmd.dev.health.to_pull": "to pull", - "cmd.dev.health.errors": "errors", - "cmd.dev.health.more": "+{{.Count}} more", - - "cmd.dev.work.table_repo": "Repo", - "cmd.dev.work.table_modified": "Modified", - "cmd.dev.work.table_untracked": "Untracked", - "cmd.dev.work.table_staged": "Staged", - "cmd.dev.work.table_ahead": "Ahead", - "cmd.dev.work.error_prefix": "error:", - "cmd.dev.work.use_commit_flag": "Use --commit to have Claude create commits", - "cmd.dev.work.all_up_to_date": "All repos up to date.", - "cmd.dev.work.repos_with_unpushed": "{{.Count}} repo(s) with unpushed commits:", - "cmd.dev.work.commits_count": "{{.Count}} commit(s)", - - "cmd.dev.issues.no_issues": "No open issues found.", - "cmd.dev.issues.open_issues": "{{.Count}} open issue(s):", - "cmd.dev.issues.error_label": "Error:", - - "cmd.dev.reviews.no_prs": "No open PRs found.", - "cmd.dev.reviews.open_prs": "{{.Count}} open PR(s)", - "cmd.dev.reviews.pending": "{{.Count}} pending", - "cmd.dev.reviews.approved": "{{.Count}} approved", - "cmd.dev.reviews.changes_requested": "{{.Count}} changes requested", - "cmd.dev.reviews.status_approved": "v approved", - "cmd.dev.reviews.status_changes": "* changes requested", - "cmd.dev.reviews.status_pending": "o pending review", - "cmd.dev.reviews.draft": "[draft]", - - "cmd.dev.ci.repos_checked": "{{.Count}} repos checked", - "cmd.dev.ci.passing": "{{.Count}} passing", - "cmd.dev.ci.failing": "{{.Count}} failing", - "cmd.dev.ci.pending": "{{.Count}} pending", - "cmd.dev.ci.no_ci": "{{.Count}} no CI", - "cmd.dev.ci.error_label": "Error:", - - "cmd.dev.impact.analysis_for": "Impact analysis for", - "cmd.dev.impact.no_dependents": "No repos depend on {{.Name}}", - "cmd.dev.impact.direct_dependents": "{{.Count}} direct dependent(s):", - "cmd.dev.impact.transitive_dependents": "{{.Count}} transitive dependent(s):", - "cmd.dev.impact.summary": "Summary:", - "cmd.dev.impact.changes_affect": "Changes to {{.Repo}} affect {{.Affected}}/{{.Total}} repos", - "cmd.dev.impact.requires_registry": "impact analysis requires repos.yaml with dependency information", - - "cmd.dev.sync.success": "Public APIs synchronized successfully.", - "cmd.dev.sync.error_prefix": "Error:", - - "cmd.dev.vm.already_installed": "Dev environment already installed", - "cmd.dev.vm.check_updates": "Use {{.Command}} to check for updates", - "cmd.dev.vm.image_label": "Image:", - "cmd.dev.vm.downloading": "Downloading dev environment...", - "cmd.dev.vm.progress_label": "Progress:", - "cmd.dev.vm.installed_in": "Installed in {{.Duration}}", - "cmd.dev.vm.start_with": "Start with: {{.Command}}", - "cmd.dev.vm.not_installed": "dev environment not installed (run 'core dev install' first)", - "cmd.dev.vm.config_label": "Config:", - "cmd.dev.vm.config_value": "{{.Memory}}MB, {{.CPUs}} CPUs", - "cmd.dev.vm.booting": "Booting dev environment...", - "cmd.dev.vm.running": "Dev environment running", - "cmd.dev.vm.connect_with": "Connect with: {{.Command}}", - "cmd.dev.vm.ssh_port": "SSH port:", - "cmd.dev.vm.not_running": "Dev environment is not running", - "cmd.dev.vm.stopping": "Stopping dev environment...", - "cmd.dev.vm.stopped": "Stopped", - "cmd.dev.vm.status_title": "Dev Environment Status", - "cmd.dev.vm.installed_label": "Installed:", - "cmd.dev.vm.installed_yes": "Yes", - "cmd.dev.vm.installed_no": "No", - "cmd.dev.vm.version_label": "Version:", - "cmd.dev.vm.install_with": "Install with: {{.Command}}", - "cmd.dev.vm.status_label": "Status:", - "cmd.dev.vm.status_running": "Running", - "cmd.dev.vm.status_stopped": "Stopped", - "cmd.dev.vm.container_label": "Container:", - "cmd.dev.vm.memory_label": "Memory:", - "cmd.dev.vm.cpus_label": "CPUs:", - "cmd.dev.vm.uptime_label": "Uptime:", - "cmd.dev.vm.checking_updates": "Checking for updates...", - "cmd.dev.vm.current_label": "Current:", - "cmd.dev.vm.latest_label": "Latest:", - "cmd.dev.vm.up_to_date": "Already up to date", - "cmd.dev.vm.update_available": "Update available", - "cmd.dev.vm.run_to_update": "Run {{.Command}} to update", - "cmd.dev.vm.stopping_current": "Stopping current instance...", - "cmd.dev.vm.downloading_update": "Downloading update...", - "cmd.dev.vm.updated_in": "Updated in {{.Duration}}", - - "cmd.php.short": "Laravel/PHP development tools", - "cmd.php.long": "Manage Laravel development environment with FrankenPHP.\n\nServices orchestrated:\n - FrankenPHP/Octane (port 8000, HTTPS on 443)\n - Vite dev server (port 5173)\n - Laravel Horizon (queue workers)\n - Laravel Reverb (WebSocket, port 8080)\n - Redis (port 6379)", - - "cmd.php.dev.short": "Start Laravel development environment", - "cmd.php.dev.long": "Starts all detected Laravel services.\n\nAuto-detects:\n - Vite (vite.config.js/ts)\n - Horizon (config/horizon.php)\n - Reverb (config/reverb.php)\n - Redis (from .env)", - "cmd.php.dev.starting": "Starting {{.AppName}} development environment", - "cmd.php.dev.detected_services": "Detected services:", - "cmd.php.dev.services_started": "Services started:", - "cmd.php.dev.shutting_down": "Shutting down...", - "cmd.php.dev.all_stopped": "All services stopped", - "cmd.php.dev.press_ctrl_c": "Press Ctrl+C to stop all services", - "cmd.php.dev.logs_failed": "Failed to get logs: {{.Error}}", - "cmd.php.dev.stop_error": "Error stopping services: {{.Error}}", - - "cmd.php.logs.short": "View service logs", - "cmd.php.logs.long": "Stream logs from Laravel services.\n\nServices: frankenphp, vite, horizon, reverb, redis", - - "cmd.php.stop.short": "Stop all Laravel services", - "cmd.php.stop.stopping": "Stopping services...", - - "cmd.php.status.short": "Show service status", - "cmd.php.status.project": "Project:", - "cmd.php.status.detected_services": "Detected services:", - "cmd.php.status.package_manager": "Package manager:", - "cmd.php.status.octane_server": "Octane server:", - "cmd.php.status.ssl_certs": "SSL certificates:", - "cmd.php.status.ssl_installed": "installed", - "cmd.php.status.ssl_not_setup": "not setup", - "cmd.php.status.running": "running", - "cmd.php.status.stopped": "stopped", - "cmd.php.status.error": "error: {{.Error}}", - "cmd.php.status.port": "port {{.Port}}", - "cmd.php.status.pid": "pid {{.PID}}", - - "cmd.php.ssl.short": "Setup SSL certificates with mkcert", - "cmd.php.ssl.setting_up": "Setting up SSL for {{.Domain}}", - "cmd.php.ssl.mkcert_not_installed": "mkcert is not installed", - "cmd.php.ssl.install_with": "Install with:", - "cmd.php.ssl.install_macos": "macOS: brew install mkcert", - "cmd.php.ssl.install_linux": "Linux: see https://github.com/FiloSottile/mkcert", - "cmd.php.ssl.certs_exist": "Certificates already exist", - "cmd.php.ssl.certs_created": "SSL certificates created", - "cmd.php.ssl.cert_label": "Cert:", - "cmd.php.ssl.key_label": "Key:", - "cmd.php.ssl.flag.domain": "Domain for certificate (default: from APP_URL)", - - "cmd.php.dev.flag.no_vite": "Skip Vite dev server", - "cmd.php.dev.flag.no_horizon": "Skip Laravel Horizon", - "cmd.php.dev.flag.no_reverb": "Skip Laravel Reverb", - "cmd.php.dev.flag.no_redis": "Skip Redis server", - "cmd.php.dev.flag.https": "Enable HTTPS with mkcert", - "cmd.php.dev.flag.domain": "Domain for SSL certificate (default: from APP_URL or localhost)", - "cmd.php.dev.flag.port": "FrankenPHP port (default: 8000)", - - "cmd.php.logs.flag.follow": "Follow log output", - "cmd.php.logs.flag.service": "Specific service (default: all)", - - "cmd.php.build.short": "Build Docker or LinuxKit image", - "cmd.php.build.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.", - "cmd.php.build.building_docker": "Building Docker image...", - "cmd.php.build.building_linuxkit": "Building LinuxKit image...", - "cmd.php.build.php_version": "PHP Version:", - "cmd.php.build.laravel": "Laravel:", - "cmd.php.build.octane": "Octane:", - "cmd.php.build.frontend": "Frontend:", - "cmd.php.build.extensions": "Extensions:", - "cmd.php.build.image": "Image:", - "cmd.php.build.platform": "Platform:", - "cmd.php.build.template": "Template:", - "cmd.php.build.format": "Format:", - "cmd.php.build.docker_success": "Docker image built successfully", - "cmd.php.build.docker_run_with": "Run with:", - "cmd.php.build.linuxkit_success": "LinuxKit image built successfully", - "cmd.php.build.flag.type": "Build type: docker (default) or linuxkit", - "cmd.php.build.flag.name": "Image name (default: project directory name)", - "cmd.php.build.flag.tag": "Image tag (default: latest)", - "cmd.php.build.flag.platform": "Target platform (e.g., linux/amd64, linux/arm64)", - "cmd.php.build.flag.dockerfile": "Path to custom Dockerfile", - "cmd.php.build.flag.output": "Output path for LinuxKit image", - "cmd.php.build.flag.format": "LinuxKit output format: qcow2 (default), iso, raw, vmdk", - "cmd.php.build.flag.template": "LinuxKit template name (default: server-php)", - "cmd.php.build.flag.no_cache": "Build without cache", - - "cmd.php.serve.short": "Run production container", - "cmd.php.serve.long": "Run a production PHP container.\n\nThis starts the built Docker image in production mode.", - "cmd.php.serve.running": "Running production container...", - "cmd.php.serve.ports": "Ports:", - "cmd.php.serve.stopped": "Container stopped", - "cmd.php.serve.name_required": "--name is required: specify the Docker image name", - "cmd.php.serve.flag.name": "Docker image name (required)", - "cmd.php.serve.flag.tag": "Image tag (default: latest)", - "cmd.php.serve.flag.container": "Container name", - "cmd.php.serve.flag.port": "HTTP port (default: 80)", - "cmd.php.serve.flag.https_port": "HTTPS port (default: 443)", - "cmd.php.serve.flag.detach": "Run in detached mode", - "cmd.php.serve.flag.env_file": "Path to environment file", - - "cmd.php.shell.short": "Open shell in running container", - "cmd.php.shell.long": "Open an interactive shell in a running PHP container.", - "cmd.php.shell.opening": "Opening shell in container {{.Container}}...", - - "cmd.php.packages.short": "Manage local PHP packages", - "cmd.php.packages.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.", - "cmd.php.packages.link.short": "Link local packages", - "cmd.php.packages.link.long": "Link local PHP packages for development.\n\nAdds path repositories to composer.json with symlink enabled.\nThe package name is auto-detected from each path's composer.json.", - "cmd.php.packages.link.linking": "Linking packages...", - "cmd.php.packages.link.done": "Packages linked. Run 'composer update' to install.", - "cmd.php.packages.unlink.short": "Unlink packages", - "cmd.php.packages.unlink.long": "Remove linked packages from composer.json.\n\nRemoves path repositories by package name.", - "cmd.php.packages.unlink.unlinking": "Unlinking packages...", - "cmd.php.packages.unlink.done": "Packages unlinked. Run 'composer update' to remove.", - "cmd.php.packages.update.short": "Update linked packages", - "cmd.php.packages.update.long": "Run composer update for linked packages.\n\nIf no packages specified, updates all packages.", - "cmd.php.packages.update.updating": "Updating packages...", - "cmd.php.packages.update.done": "Packages updated", - "cmd.php.packages.list.short": "List linked packages", - "cmd.php.packages.list.long": "List all locally linked packages.\n\nShows package name, path, and version for each linked package.", - "cmd.php.packages.list.none_found": "No linked packages found", - "cmd.php.packages.list.linked": "Linked packages:", - "cmd.php.packages.list.unknown": "(unknown)", - "cmd.php.packages.list.path": "Path:", - "cmd.php.packages.list.version": "Version:", - - "cmd.php.test.short": "Run PHP tests (PHPUnit/Pest)", - "cmd.php.test.long": "Run PHP tests using PHPUnit or Pest.\n\nAuto-detects Pest if tests/Pest.php exists, otherwise uses PHPUnit.", - "cmd.php.test.running": "Running tests with {{.Runner}}", - "cmd.php.test.passed": "All tests passed", - "cmd.php.test.failed": "Some tests failed", - "cmd.php.test.flag.parallel": "Run tests in parallel", - "cmd.php.test.flag.coverage": "Generate code coverage", - "cmd.php.test.flag.filter": "Filter tests by name pattern", - "cmd.php.test.flag.group": "Run only tests in specified group", - - "cmd.php.fmt.short": "Format PHP code with Laravel Pint", - "cmd.php.fmt.long": "Format PHP code using Laravel Pint.", - "cmd.php.fmt.checking": "Checking code with {{.Formatter}}", - "cmd.php.fmt.formatting": "Formatting code with {{.Formatter}}", - "cmd.php.fmt.no_formatter": "no formatter found (install Laravel Pint: composer require laravel/pint --dev)", - "cmd.php.fmt.success": "Code formatted successfully", - "cmd.php.fmt.no_issues": "No formatting issues found", - "cmd.php.fmt.flag.fix": "Auto-fix formatting issues", - "cmd.php.fmt.flag.diff": "Show diff of changes", - - "cmd.php.analyse.short": "Run PHPStan static analysis", - "cmd.php.analyse.long": "Run PHPStan or Larastan static analysis.\n\nAuto-detects Larastan if installed, otherwise uses PHPStan.", - "cmd.php.analyse.running": "Running static analysis with {{.Analyser}}", - "cmd.php.analyse.no_analyser": "no static analyser found (install PHPStan: composer require phpstan/phpstan --dev)", - "cmd.php.analyse.no_issues": "No issues found", - "cmd.php.analyse.flag.level": "PHPStan analysis level (0-9)", - "cmd.php.analyse.flag.memory": "Memory limit (e.g., 2G)", - - "cmd.php.psalm.short": "Run Psalm static analysis", - "cmd.php.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.", - "cmd.php.psalm.not_found": "Psalm not found", - "cmd.php.psalm.install": "composer require --dev vimeo/psalm", - "cmd.php.psalm.setup": "./vendor/bin/psalm --init", - "cmd.php.psalm.analysing": "Analysing code with Psalm", - "cmd.php.psalm.analysing_fixing": "Analysing and fixing code with Psalm", - "cmd.php.psalm.no_issues": "No issues found", - "cmd.php.psalm.flag.level": "Error level (1=strictest, 8=most lenient)", - "cmd.php.psalm.flag.fix": "Auto-fix issues where possible", - "cmd.php.psalm.flag.baseline": "Generate/update baseline file", - "cmd.php.psalm.flag.show_info": "Show info-level issues", - - "cmd.php.audit.short": "Security audit for dependencies", - "cmd.php.audit.long": "Check PHP and JavaScript dependencies for known vulnerabilities.\n\nRuns composer audit and npm audit (if package.json exists).", - "cmd.php.audit.scanning": "Scanning dependencies for vulnerabilities", - "cmd.php.audit.secure": "secure", - "cmd.php.audit.error": "error", - "cmd.php.audit.vulnerabilities": "{{.Count}} vulnerabilities", - "cmd.php.audit.found_vulns": "Found {{.Count}} vulnerabilities across dependencies", - "cmd.php.audit.fix_hint": "composer update && npm update", - "cmd.php.audit.completed_errors": "audit completed with errors", - "cmd.php.audit.all_secure": "All dependencies are secure", - "cmd.php.audit.flag.json": "Output in JSON format", - "cmd.php.audit.flag.fix": "Auto-fix vulnerabilities (npm only)", - - "cmd.php.security.short": "Security vulnerability scanning", - "cmd.php.security.long": "Scan for security vulnerabilities in configuration and code.\n\nChecks environment config, file permissions, code patterns,\nand runs security-focused static analysis.", - "cmd.php.security.running": "Running security checks", - "cmd.php.security.checks_suffix": " CHECKS:", - "cmd.php.security.summary": "Security scan complete", - "cmd.php.security.passed": "Passed:", - "cmd.php.security.critical": "Critical:", - "cmd.php.security.high": "High:", - "cmd.php.security.medium": "Medium:", - "cmd.php.security.low": "Low:", - "cmd.php.security.fix_label": "Fix:", - "cmd.php.security.flag.severity": "Minimum severity (critical, high, medium, low)", - "cmd.php.security.flag.json": "Output in JSON format", - "cmd.php.security.flag.sarif": "Output in SARIF format (for GitHub Security)", - "cmd.php.security.flag.url": "URL to check HTTP headers (optional)", - - "cmd.php.qa.short": "Run full QA pipeline", - "cmd.php.qa.long": "Run the complete quality assurance pipeline.\n\nStages:\n quick: Security audit, code style, PHPStan\n standard: Psalm, tests\n full: Rector dry-run, mutation testing (slow)", - "cmd.php.qa.running": "Running QA pipeline ({{.Stages}})", - "cmd.php.qa.no_checks": "No checks available", - "cmd.php.qa.stage_prefix": "═══ ", - "cmd.php.qa.stage_suffix": " STAGE ═══", - "cmd.php.qa.passed": "passed", - "cmd.php.qa.failed": "failed", - "cmd.php.qa.all_passed": "All checks passed ({{.Passed}}/{{.Total}})", - "cmd.php.qa.some_failed": "Some checks failed ({{.Passed}}/{{.Total}} passed)", - "cmd.php.qa.to_fix": "To fix:", - "cmd.php.qa.pipeline_failed": "QA pipeline failed", - "cmd.php.qa.fix_audit": "composer update && npm update", - "cmd.php.qa.fix_phpstan": "Fix PHPStan errors shown above", - "cmd.php.qa.fix_psalm": "Fix Psalm errors shown above", - "cmd.php.qa.fix_tests": "Fix failing tests shown above", - "cmd.php.qa.fix_infection": "Improve test coverage for mutated code", - "cmd.php.qa.issue_vulns": "vulnerabilities", - "cmd.php.qa.issue_style": "Code style issues found", - "cmd.php.qa.issue_analysis": "Static analysis errors", - "cmd.php.qa.issue_types": "Type errors found", - "cmd.php.qa.issue_tests": "Test failures", - "cmd.php.qa.issue_rector": "Code improvements available", - "cmd.php.qa.issue_mutation": "Mutation score below threshold", - "cmd.php.qa.flag.quick": "Only run quick checks", - "cmd.php.qa.flag.full": "Run all stages including slow checks", - "cmd.php.qa.flag.fix": "Auto-fix issues where possible", - - "cmd.php.rector.short": "Automated code refactoring", - "cmd.php.rector.long": "Run Rector for automated code improvements and PHP upgrades.\n\nRector can automatically upgrade PHP syntax, improve code quality,\nand apply framework-specific refactorings.", - "cmd.php.rector.not_found": "Rector not found", - "cmd.php.rector.install": "composer require --dev rector/rector", - "cmd.php.rector.setup": "./vendor/bin/rector init", - "cmd.php.rector.analysing": "Analysing code with Rector", - "cmd.php.rector.refactoring": "Refactoring code with Rector", - "cmd.php.rector.changes_suggested": "Changes suggested (use --fix to apply)", - "cmd.php.rector.refactored": "Code refactored successfully", - "cmd.php.rector.no_changes": "No changes needed", - "cmd.php.rector.flag.fix": "Apply changes (default is dry-run)", - "cmd.php.rector.flag.diff": "Show detailed diff of changes", - "cmd.php.rector.flag.clear_cache": "Clear Rector cache before running", - - "cmd.php.infection.short": "Mutation testing for test quality", - "cmd.php.infection.long": "Run Infection mutation testing to measure test suite quality.\n\nMutation testing modifies your code and checks if tests catch\nthe changes. High mutation score = high quality tests.\n\nWarning: This can be slow on large codebases.", - "cmd.php.infection.not_found": "Infection not found", - "cmd.php.infection.install": "composer require --dev infection/infection", - "cmd.php.infection.running": "Running mutation testing", - "cmd.php.infection.note": "This may take a while...", - "cmd.php.infection.complete": "Mutation testing complete", - "cmd.php.infection.flag.min_msi": "Minimum mutation score indicator (0-100, default: 50)", - "cmd.php.infection.flag.min_covered_msi": "Minimum covered mutation score (0-100, default: 70)", - "cmd.php.infection.flag.threads": "Number of parallel threads (default: 4)", - "cmd.php.infection.flag.filter": "Filter files by pattern", - "cmd.php.infection.flag.only_covered": "Only mutate covered code", - - "cmd.php.deploy.short": "Deploy to Coolify", - "cmd.php.deploy.long": "Deploy the PHP application to Coolify.\n\nRequires configuration in .env:\n COOLIFY_URL=https://coolify.example.com\n COOLIFY_TOKEN=your-api-token\n COOLIFY_APP_ID=production-app-id\n COOLIFY_STAGING_APP_ID=staging-app-id (optional)", - "cmd.php.deploy.deploying": "Deploying to {{.Environment}}...", - "cmd.php.deploy.success": "Deployment completed successfully", - "cmd.php.deploy.warning_status": "Deployment ended with status: {{.Status}}", - "cmd.php.deploy.triggered": "Deployment triggered. Use 'core php deploy:status' to check progress.", - "cmd.php.deploy.flag.staging": "Deploy to staging environment", - "cmd.php.deploy.flag.force": "Force deployment even if no changes detected", - "cmd.php.deploy.flag.wait": "Wait for deployment to complete", - - "cmd.php.deploy_status.short": "Show deployment status", - "cmd.php.deploy_status.long": "Show the status of a deployment.", - "cmd.php.deploy_status.checking": "Checking {{.Environment}} deployment status...", - "cmd.php.deploy_status.flag.staging": "Check staging environment", - "cmd.php.deploy_status.flag.id": "Specific deployment ID", - - "cmd.php.deploy_rollback.short": "Rollback to previous deployment", - "cmd.php.deploy_rollback.long": "Rollback to a previous deployment.\n\nIf no deployment ID is specified, rolls back to the most recent\nsuccessful deployment.", - "cmd.php.deploy_rollback.rolling_back": "Rolling back {{.Environment}}...", - "cmd.php.deploy_rollback.success": "Rollback completed successfully", - "cmd.php.deploy_rollback.warning_status": "Rollback ended with status: {{.Status}}", - "cmd.php.deploy_rollback.triggered": "Rollback triggered. Use 'core php deploy:status' to check progress.", - "cmd.php.deploy_rollback.flag.staging": "Rollback staging environment", - "cmd.php.deploy_rollback.flag.id": "Specific deployment ID to rollback to", - "cmd.php.deploy_rollback.flag.wait": "Wait for rollback to complete", - - "cmd.php.deploy_list.short": "List recent deployments", - "cmd.php.deploy_list.long": "List recent deployments.", - "cmd.php.deploy_list.recent": "Recent {{.Environment}} deployments:", - "cmd.php.deploy_list.none_found": "No deployments found", - "cmd.php.deploy_list.flag.staging": "List staging deployments", - "cmd.php.deploy_list.flag.limit": "Number of deployments to list (default: 10)", - - "cmd.php.label.php": "PHP:", - "cmd.php.label.services": "Services:", - "cmd.php.label.running": "Running:", - "cmd.php.label.app_url": "App URL:", - "cmd.php.label.vite": "Vite:", - "cmd.php.label.warning": "Warning:", - "cmd.php.label.error": "Error:", - "cmd.php.label.done": "Done:", - "cmd.php.label.skip": "Skip:", - "cmd.php.label.info": "Info:", - "cmd.php.label.install": "Install:", - "cmd.php.label.setup": "Setup:", - "cmd.php.label.fix": "Fix:", - "cmd.php.label.audit": "Audit:", - "cmd.php.label.security": "Security:", - "cmd.php.label.summary": "Summary:", - "cmd.php.label.qa": "QA:", - "cmd.php.label.psalm": "Psalm:", - "cmd.php.label.rector": "Rector:", - "cmd.php.label.infection": "Infection:", - "cmd.php.label.deploy": "Deploy:", - "cmd.php.label.status": "Status:", - "cmd.php.label.id": "ID:", - "cmd.php.label.url": "URL:", - "cmd.php.label.branch": "Branch:", - "cmd.php.label.commit": "Commit:", - "cmd.php.label.message": "Message:", - "cmd.php.label.started": "Started:", - "cmd.php.label.completed": "Completed:", - "cmd.php.label.duration": "Duration:", - - "cmd.php.error.not_laravel": "not a Laravel project (missing artisan or laravel/framework)", - "cmd.php.error.not_laravel_short": "not a Laravel project", - "cmd.php.error.not_php": "not a PHP project (missing composer.json)", - "cmd.php.error.working_dir": "failed to get working directory", - "cmd.php.error.start_services": "failed to start services", - "cmd.php.error.stop_services": "failed to stop services", - "cmd.php.error.get_logs": "failed to get logs", - "cmd.php.error.detect_config": "failed to detect project configuration", - "cmd.php.error.build_failed": "build failed", - "cmd.php.error.start_container": "failed to start container", - "cmd.php.error.open_shell": "failed to open shell", - "cmd.php.error.link_packages": "failed to link packages", - "cmd.php.error.unlink_packages": "failed to unlink packages", - "cmd.php.error.update_packages": "composer update failed", - "cmd.php.error.list_packages": "failed to list packages", - "cmd.php.error.tests_failed": "tests failed", - "cmd.php.error.fmt_failed": "formatting failed", - "cmd.php.error.fmt_issues": "formatting issues found", - "cmd.php.error.analysis_issues": "analysis found issues", - "cmd.php.error.psalm_issues": "psalm found issues", - "cmd.php.error.psalm_not_installed": "psalm not installed", - "cmd.php.error.audit_failed": "audit failed", - "cmd.php.error.vulns_found": "vulnerabilities found", - "cmd.php.error.security_failed": "security check failed", - "cmd.php.error.critical_high_issues": "critical or high severity issues found", - "cmd.php.error.rector_failed": "rector failed", - "cmd.php.error.rector_not_installed": "rector not installed", - "cmd.php.error.infection_failed": "mutation testing failed", - "cmd.php.error.infection_not_installed": "infection not installed", - "cmd.php.error.mkcert_not_installed": "mkcert not installed", - "cmd.php.error.ssl_setup": "failed to setup SSL", - "cmd.php.error.deploy_failed": "deployment failed", - "cmd.php.error.status_failed": "failed to get status", - "cmd.php.error.rollback_failed": "rollback failed", - "cmd.php.error.list_deployments": "failed to list deployments", - - "cmd.go.short": "Go development tools", - "cmd.go.long": "Go development tools with enhanced output and environment setup.\n\nCommands:\n test Run tests\n cov Run tests with coverage report\n fmt Format Go code\n lint Run golangci-lint\n install Install Go binary\n mod Module management (tidy, download, verify)\n work Workspace management", - - "cmd.go.test.short": "Run tests with coverage", - "cmd.go.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", - "cmd.go.test.label": "Test:", - "cmd.go.test.running": "Running tests", - "cmd.go.test.package_label": "Package:", - "cmd.go.test.passed": "{{.Count}} passed", - "cmd.go.test.passed_failed": "{{.Passed}} passed, {{.Failed}} failed", - "cmd.go.test.all_passed": "PASS All tests passed", - "cmd.go.test.some_failed": "FAIL Some tests failed", - "cmd.go.test.coverage": "Coverage", - "cmd.go.test.flag.coverage": "Show detailed per-package coverage", - "cmd.go.test.flag.pkg": "Package to test (default: ./...)", - "cmd.go.test.flag.run": "Run only tests matching regexp", - "cmd.go.test.flag.short": "Run only short tests", - "cmd.go.test.flag.race": "Enable race detector", - "cmd.go.test.flag.json": "Output JSON results", - "cmd.go.test.flag.verbose": "Verbose output", - - "cmd.go.cov.short": "Run tests with coverage report", - "cmd.go.cov.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%", - "cmd.go.cov.label": "Coverage:", - "cmd.go.cov.running": "Running tests with coverage", - "cmd.go.cov.html_label": "HTML:", - "cmd.go.cov.open_manually": "(open manually)", - "cmd.go.cov.below_threshold": "FAIL Coverage {{.Actual}}% is below threshold {{.Threshold}}%", - "cmd.go.cov.error.discover": "failed to discover test packages", - "cmd.go.cov.error.no_packages": "no test packages found", - "cmd.go.cov.error.create_file": "failed to create coverage file", - "cmd.go.cov.error.get_coverage": "failed to get coverage", - "cmd.go.cov.error.generate_html": "failed to generate HTML", - "cmd.go.cov.error.below_threshold": "coverage below threshold", - "cmd.go.cov.flag.pkg": "Package to test (default: ./...)", - "cmd.go.cov.flag.html": "Generate HTML coverage report", - "cmd.go.cov.flag.open": "Generate and open HTML report in browser", - "cmd.go.cov.flag.threshold": "Minimum coverage percentage (exit 1 if below)", - - "cmd.go.fmt.short": "Format Go code", - "cmd.go.fmt.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", - "cmd.go.fmt.flag.fix": "Fix formatting in place", - "cmd.go.fmt.flag.diff": "Show diff of changes", - "cmd.go.fmt.flag.check": "Check only, exit 1 if not formatted", - - "cmd.go.lint.short": "Run golangci-lint", - "cmd.go.lint.long": "Run golangci-lint on the codebase.\n\nExamples:\n core go lint\n core go lint --fix", - "cmd.go.lint.flag.fix": "Fix issues automatically", - - "cmd.go.install.short": "Install Go binary", - "cmd.go.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", - "cmd.go.install.label": "Install:", - "cmd.go.install.installing": "Installing", - "cmd.go.install.path_label": "Path:", - "cmd.go.install.cgo_label": "CGO:", - "cmd.go.install.cgo_disabled": "disabled", - "cmd.go.install.failed": "FAIL Install failed", - "cmd.go.install.success": "OK", - "cmd.go.install.installed_to": "Installed to {{.Path}}", - "cmd.go.install.flag.verbose": "Verbose output", - "cmd.go.install.flag.no_cgo": "Disable CGO (CGO_ENABLED=0)", - - "cmd.go.mod.short": "Module management", - "cmd.go.mod.long": "Go module management commands.\n\nCommands:\n tidy Add missing and remove unused modules\n download Download modules to local cache\n verify Verify dependencies\n graph Print module dependency graph", - "cmd.go.mod.tidy.short": "Tidy go.mod", - "cmd.go.mod.download.short": "Download modules", - "cmd.go.mod.verify.short": "Verify dependencies", - "cmd.go.mod.graph.short": "Print dependency graph", - - "cmd.go.work.short": "Workspace management", - "cmd.go.work.long": "Go workspace management commands.\n\nCommands:\n sync Sync go.work with modules\n init Initialize go.work\n use Add module to workspace", - "cmd.go.work.sync.short": "Sync workspace", - "cmd.go.work.init.short": "Initialize workspace", - "cmd.go.work.use.short": "Add module to workspace", - "cmd.go.work.added": "Added {{.Module}}", - "cmd.go.work.error.no_modules": "no go.mod files found", - - "cmd.go.build.short": "Build Go binaries", - - "cmd.doctor.short": "Check development environment", - "cmd.doctor.long": "Checks that all required tools are installed and configured.\nRun this before 'core setup' to ensure your environment is ready.", - "cmd.doctor.checking": "Checking development environment...", - "cmd.doctor.required": "Required:", - "cmd.doctor.optional": "Optional:", - "cmd.doctor.github": "GitHub Access:", - "cmd.doctor.workspace": "Workspace:", - "cmd.doctor.ready": "Doctor: Environment ready", - "cmd.doctor.issues": "Doctor: {{.Count}} issues found", - "cmd.doctor.issues_error": "{{.Count}} required tools missing", - "cmd.doctor.install_missing": "Install missing tools:", - "cmd.doctor.verbose_flag": "Show detailed version information", - "cmd.doctor.ssh_found": "SSH key found", - "cmd.doctor.ssh_missing": "SSH key missing - run: ssh-keygen && gh ssh-key add", - "cmd.doctor.cli_auth": "CLI authenticated", - "cmd.doctor.cli_auth_missing": "CLI authentication - run: gh auth login", - "cmd.doctor.repos_yaml_found": "Found repos.yaml at {{.Path}}", - "cmd.doctor.repos_cloned": "{{.Cloned}}/{{.Total}} repos cloned", - "cmd.doctor.no_repos_yaml": "No repos.yaml found (run from workspace directory)", - "cmd.doctor.install_macos": "brew install git gh php composer node pnpm docker", - "cmd.doctor.install_macos_cask": "brew install --cask claude", - "cmd.doctor.install_linux_header": "# Install via your package manager or:", - "cmd.doctor.install_linux_git": "# Git: apt install git", - "cmd.doctor.install_linux_gh": "# GitHub CLI: https://cli.github.com/", - "cmd.doctor.install_linux_php": "# PHP: apt install php8.3-cli", - "cmd.doctor.install_linux_node": "# Node: https://nodejs.org/", - "cmd.doctor.install_linux_pnpm": "# pnpm: npm install -g pnpm", - "cmd.doctor.install_other": "See documentation for your OS", - - "cmd.doctor.check.git.name": "Git", - "cmd.doctor.check.git.description": "Version control", - "cmd.doctor.check.gh.name": "GitHub CLI", - "cmd.doctor.check.gh.description": "GitHub integration (issues, PRs, CI)", - "cmd.doctor.check.php.name": "PHP", - "cmd.doctor.check.php.description": "Laravel packages", - "cmd.doctor.check.composer.name": "Composer", - "cmd.doctor.check.composer.description": "PHP dependencies", - "cmd.doctor.check.node.name": "Node.js", - "cmd.doctor.check.node.description": "Frontend builds", - "cmd.doctor.check.pnpm.name": "pnpm", - "cmd.doctor.check.pnpm.description": "Fast package manager", - "cmd.doctor.check.claude.name": "Claude Code", - "cmd.doctor.check.claude.description": "AI-assisted development", - "cmd.doctor.check.docker.name": "Docker", - "cmd.doctor.check.docker.description": "Container runtime", - - "cmd.setup.short": "Bootstrap workspace or clone packages from registry", - "cmd.setup.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.", - - "cmd.setup.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.setup.flag.only": "Only clone repos of these types (comma-separated: foundation,module,product)", - "cmd.setup.flag.dry_run": "Show what would be cloned without cloning", - "cmd.setup.flag.all": "Skip wizard, clone all packages (non-interactive)", - "cmd.setup.flag.name": "Project directory name for bootstrap mode", - "cmd.setup.flag.build": "Run build after cloning", - - "cmd.setup.bootstrap_mode": "Bootstrap mode (no repos.yaml found)", - "cmd.setup.cloning_current_dir": "Cloning into current directory", - "cmd.setup.creating_project_dir": "Creating project directory", - "cmd.setup.cloning": "Cloning", - "cmd.setup.cloned": "cloned", - "cmd.setup.would_clone": "Would clone", - "cmd.setup.already_exists": "already exists", - "cmd.setup.would_load_registry": "Would load registry from", - - "cmd.setup.registry_label": "Registry:", - "cmd.setup.org_label": "Org:", - "cmd.setup.target_label": "Target:", - "cmd.setup.filter_label": "Filter:", - - "cmd.setup.to_clone": "{{.Count}} to clone", - "cmd.setup.exist": "{{.Count}} exist", - "cmd.setup.skipped": "{{.Count}} skipped", - "cmd.setup.nothing_to_clone": "Nothing to clone.", - "cmd.setup.would_clone_list": "Would clone:", - "cmd.setup.cancelled": "Cancelled.", - "cmd.setup.done": "done", - "cmd.setup.done_label": "Done:", - "cmd.setup.cloned_count": "{{.Count}} cloned", - "cmd.setup.failed_count": "{{.Count}} failed", - "cmd.setup.already_exist_count": "{{.Count}} already exist", - "cmd.setup.running_build": "Running build...", - "cmd.setup.complete": "Setup complete", - - "cmd.setup.repo.setting_up": "Setting up repository", - "cmd.setup.repo.detected_type": "Detected project type", - "cmd.setup.repo.would_create": "Would create", - "cmd.setup.repo.created": "Created", - - "cmd.setup.wizard.git_repo_title": "This directory is a git repository", - "cmd.setup.wizard.what_to_do": "What would you like to do?", - "cmd.setup.wizard.option_setup": "Setup Working Directory", - "cmd.setup.wizard.option_package": "Create Package (clone repos into subdirectory)", - "cmd.setup.wizard.project_name_title": "Project directory name", - "cmd.setup.wizard.project_name_desc": "Enter the name for your new workspace directory", - "cmd.setup.wizard.package_selection": "Package Selection", - "cmd.setup.wizard.selection_hint": "Use space to select/deselect, enter to confirm", - "cmd.setup.wizard.select_packages": "Select packages to clone", - "cmd.setup.wizard.confirm_clone": "Clone {{.Count}} packages to {{.Target}}?", - "cmd.setup.wizard.confirm_yes": "Yes, clone", - "cmd.setup.wizard.confirm_cancel": "Cancel", - - "cmd.setup.error.build_failed": "build failed", - - "cmd.build.short": "Build projects with auto-detection and cross-compilation", - "cmd.build.long": "Builds the current project with automatic type detection.\nSupports Go, Wails, Docker, LinuxKit, and Taskfile projects.\nConfiguration can be provided via .core/build.yaml or command-line flags.\n\nExamples:\n core build # Auto-detect and build\n core build --type docker # Build Docker image\n core build --type linuxkit # Build LinuxKit image\n core build --type linuxkit --config linuxkit.yml --format qcow2-bios", - - "cmd.build.from_path.short": "Build from a local directory", - "cmd.build.from_path.starting": "Starting build from path:", - "cmd.build.from_path.generating_template": "Generating application from template...", - "cmd.build.from_path.copying_files": "Copying application files...", - "cmd.build.from_path.compiling": "Compiling application...", - "cmd.build.from_path.success": "Build successful! Executable created at:", - "cmd.build.from_path.flag.path": "The path to the static web application files", - "cmd.build.from_path.error.invalid_path": "invalid path specified", - "cmd.build.from_path.error.must_be_directory": "path specified must be a directory", - "cmd.build.from_path.error.clean_build_dir": "failed to clean build directory", - "cmd.build.from_path.error.anchor_template": "failed to anchor template filesystem", - "cmd.build.from_path.error.create_sod": "failed to create new sod instance", - "cmd.build.from_path.error.extract_template": "failed to extract template", - "cmd.build.from_path.error.copy_files": "failed to copy application files", - "cmd.build.from_path.error.go_mod_tidy": "go mod tidy failed", - "cmd.build.from_path.error.go_build": "go build failed", - - "cmd.build.pwa.short": "Build from a live PWA URL", - "cmd.build.pwa.starting": "Starting PWA build from URL:", - "cmd.build.pwa.downloading_to": "Downloading PWA to temporary directory:", - "cmd.build.pwa.found_manifest": "Found manifest:", - "cmd.build.pwa.download_complete": "PWA download complete.", - "cmd.build.pwa.warning": "Warning:", - "cmd.build.pwa.no_manifest": "no manifest file found. Proceeding with basic site download.", - "cmd.build.pwa.asset_download_failed": "failed to download asset", - "cmd.build.pwa.flag.url": "The URL of the PWA to build", - "cmd.build.pwa.error.create_temp_dir": "failed to create temporary directory", - "cmd.build.pwa.error.download_failed": "failed to download PWA", - "cmd.build.pwa.error.fetch_url": "failed to fetch URL", - "cmd.build.pwa.error.read_response": "failed to read response body", - "cmd.build.pwa.error.write_index": "failed to write index.html", - "cmd.build.pwa.error.fetch_manifest": "failed to fetch or parse manifest", - "cmd.build.pwa.error.no_manifest_tag": "no tag found", - - "cmd.build.sdk.short": "Generate API SDKs from OpenAPI spec", - "cmd.build.sdk.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", - "cmd.build.sdk.label": "Build SDK:", - "cmd.build.sdk.generating": "Generating SDKs", - "cmd.build.sdk.dry_run_mode": "(dry-run mode)", - "cmd.build.sdk.spec_label": "Spec:", - "cmd.build.sdk.language_label": "Language:", - "cmd.build.sdk.languages_label": "Languages:", - "cmd.build.sdk.generated_label": "Generated:", - "cmd.build.sdk.would_generate": "Would generate SDKs (dry-run)", - "cmd.build.sdk.complete": "SDK generation complete", - "cmd.build.sdk.flag.spec": "Path to OpenAPI spec file", - "cmd.build.sdk.flag.lang": "Generate only this language (typescript, python, go, php)", - "cmd.build.sdk.flag.version": "Version to embed in generated SDKs", - "cmd.build.sdk.flag.dry_run": "Show what would be generated without writing files", - - "cmd.build.flag.type": "Builder type (go, wails, docker, linuxkit, taskfile) - auto-detected if not specified", - "cmd.build.flag.ci": "CI mode - minimal output with JSON artifact list at the end", - "cmd.build.flag.targets": "Comma-separated OS/arch pairs (e.g., linux/amd64,darwin/arm64)", - "cmd.build.flag.output": "Output directory for artifacts (default: dist)", - "cmd.build.flag.archive": "Create archives (tar.gz for linux/darwin, zip for windows)", - "cmd.build.flag.checksum": "Generate SHA256 checksums and CHECKSUMS.txt", - "cmd.build.flag.config": "Config file path (for linuxkit: YAML config, for docker: Dockerfile)", - "cmd.build.flag.format": "Output format for linuxkit (iso-bios, qcow2-bios, raw, vmdk)", - "cmd.build.flag.push": "Push Docker image after build", - "cmd.build.flag.image": "Docker image name (e.g., host-uk/core-devops)", - "cmd.build.flag.no_sign": "Skip all code signing", - "cmd.build.flag.notarize": "Enable macOS notarization (requires Apple credentials)", - - "cmd.build.label.build": "Build:", - "cmd.build.label.type": "Type:", - "cmd.build.label.output": "Output:", - "cmd.build.label.binary": "Binary:", - "cmd.build.label.targets": "Targets:", - "cmd.build.label.error": "Error:", - "cmd.build.label.success": "Success:", - "cmd.build.label.sign": "Sign:", - "cmd.build.label.archive": "Archive:", - "cmd.build.label.checksum": "Checksum:", - "cmd.build.label.ok": "OK:", - - "cmd.build.building_project": "Building project", - "cmd.build.built_artifacts": "Built {{.Count}} artifact(s)", - "cmd.build.signing_binaries": "Signing binaries...", - "cmd.build.creating_archives": "Creating archives...", - "cmd.build.computing_checksums": "Computing checksums...", - - "cmd.build.error.working_dir": "failed to get working directory", - "cmd.build.error.load_config": "failed to load config", - "cmd.build.error.detect_type": "failed to detect project type", - "cmd.build.error.no_project_type": "no supported project type detected in {{.Dir}}\nSupported types: go (go.mod), wails (wails.json), node (package.json), php (composer.json)", - "cmd.build.error.build_failed": "build failed", - "cmd.build.error.signing_failed": "signing failed", - "cmd.build.error.notarization_failed": "notarization failed", - "cmd.build.error.archive_failed": "archive failed", - "cmd.build.error.marshal_artifacts": "failed to marshal artifacts", - "cmd.build.error.checksum_failed": "checksum failed", - "cmd.build.error.write_checksums": "failed to write CHECKSUMS.txt", - "cmd.build.error.gpg_signing_failed": "GPG signing failed", - "cmd.build.error.invalid_target": "invalid target format \"{{.Target}}\", expected OS/arch (e.g., linux/amd64)", - "cmd.build.error.no_targets": "no valid targets specified", - "cmd.build.error.node_not_implemented": "Node.js builder not yet implemented", - "cmd.build.error.php_not_implemented": "PHP builder not yet implemented", - "cmd.build.error.unsupported_type": "unsupported project type", - - "cmd.ai.short": "AI agent task management", - "cmd.ai.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 -m 'msg' # Commit with task reference\n core ai task:complete # Mark task done", - - "cmd.ai.claude.short": "Claude Code integration", - "cmd.ai.claude.long": "Tools for working with Claude Code.\n\nCommands:\n run Run Claude in the current directory\n config Manage Claude configuration", - "cmd.ai.claude.run.short": "Run Claude Code in the current directory", - "cmd.ai.claude.config.short": "Manage Claude configuration", - - "cmd.ai.tasks.short": "List available tasks from core-agentic", - "cmd.ai.tasks.long": "Lists tasks from the core-agentic service.\n\nConfiguration is loaded from:\n 1. Environment variables (AGENTIC_TOKEN, AGENTIC_BASE_URL)\n 2. .env file in current directory\n 3. ~/.core/agentic.yaml\n\nExamples:\n core ai tasks\n core ai tasks --status pending --priority high\n core ai tasks --labels bug,urgent", - "cmd.ai.tasks.none_found": "No tasks found.", - "cmd.ai.tasks.found": "{{.Count}} task(s) found:", - "cmd.ai.tasks.hint": "Use 'core ai task ' to view details", - "cmd.ai.tasks.flag.status": "Filter by status (pending, in_progress, completed, blocked)", - "cmd.ai.tasks.flag.priority": "Filter by priority (critical, high, medium, low)", - "cmd.ai.tasks.flag.labels": "Filter by labels (comma-separated)", - "cmd.ai.tasks.flag.limit": "Max number of tasks to return", - "cmd.ai.tasks.flag.project": "Filter by project", - - "cmd.ai.task.short": "Show task details or auto-select a task", - "cmd.ai.task.long": "Shows details of a specific task or auto-selects the highest priority task.\n\nExamples:\n core ai task abc123 # Show task details\n core ai task abc123 --claim # Show and claim the task\n core ai task abc123 --context # Show task with gathered context\n core ai task --auto # Auto-select highest priority pending task", - "cmd.ai.task.no_pending": "No pending tasks available.", - "cmd.ai.task.id_required": "task ID required (or use --auto)", - "cmd.ai.task.context_failed": "Failed to build context", - "cmd.ai.task.claiming": "Claiming task...", - "cmd.ai.task.claimed": "Task claimed successfully!", - "cmd.ai.task.flag.auto": "Auto-select highest priority pending task", - "cmd.ai.task.flag.claim": "Claim the task after showing details", - "cmd.ai.task.flag.context": "Show gathered context for AI collaboration", - - "cmd.ai.task_update.short": "Update task status or progress", - "cmd.ai.task_update.long": "Updates a task's status, progress, or adds notes.\n\nExamples:\n core ai task:update abc123 --status in_progress\n core ai task:update abc123 --progress 50 --notes 'Halfway done'", - "cmd.ai.task_update.flag_required": "at least one of --status, --progress, or --notes required", - "cmd.ai.task_update.success": "Task {{.ID}} updated successfully", - "cmd.ai.task_update.flag.status": "New status (pending, in_progress, completed, blocked)", - "cmd.ai.task_update.flag.progress": "Progress percentage (0-100)", - "cmd.ai.task_update.flag.notes": "Notes about the update", - - "cmd.ai.task_complete.short": "Mark a task as completed", - "cmd.ai.task_complete.long": "Marks a task as completed with optional output and artifacts.\n\nExamples:\n core ai task:complete abc123 --output 'Feature implemented'\n core ai task:complete abc123 --failed --error 'Build failed'", - "cmd.ai.task_complete.success": "Task {{.ID}} completed successfully", - "cmd.ai.task_complete.failed": "Task {{.ID}} marked as failed", - "cmd.ai.task_complete.flag.output": "Summary of the completed work", - "cmd.ai.task_complete.flag.failed": "Mark the task as failed", - "cmd.ai.task_complete.flag.error": "Error message if failed", - - "cmd.ai.task_commit.short": "Auto-commit changes with task reference", - "cmd.ai.task_commit.long": "Creates a git commit with a task reference and co-author attribution.\n\nCommit message format:\n feat(scope): description\n\n Task: #123\n Co-Authored-By: Claude \n\nExamples:\n core ai task:commit abc123 --message 'add user authentication'\n core ai task:commit abc123 -m 'fix login bug' --scope auth\n core ai task:commit abc123 -m 'update docs' --push", - "cmd.ai.task_commit.message_required": "commit message required (--message or -m)", - "cmd.ai.task_commit.no_changes": "No uncommitted changes to commit.", - "cmd.ai.task_commit.creating": "Creating commit for task {{.ID}}...", - "cmd.ai.task_commit.committed": "Committed:", - "cmd.ai.task_commit.pushing": "Pushing changes...", - "cmd.ai.task_commit.pushed": "Changes pushed successfully", - "cmd.ai.task_commit.flag.message": "Commit message (without task reference)", - "cmd.ai.task_commit.flag.scope": "Scope for the commit type (e.g., auth, api, ui)", - "cmd.ai.task_commit.flag.push": "Push changes after committing", - - "cmd.ai.task_pr.short": "Create a pull request for a task", - "cmd.ai.task_pr.long": "Creates a GitHub pull request linked to a task.\n\nRequires the GitHub CLI (gh) to be installed and authenticated.\n\nExamples:\n core ai task:pr abc123\n core ai task:pr abc123 --title 'Add authentication feature'\n core ai task:pr abc123 --draft --labels 'enhancement,needs-review'\n core ai task:pr abc123 --base develop", - "cmd.ai.task_pr.branch_error": "cannot create PR from {{.Branch}} branch; create a feature branch first", - "cmd.ai.task_pr.pushing_branch": "Pushing branch {{.Branch}}...", - "cmd.ai.task_pr.creating": "Creating pull request...", - "cmd.ai.task_pr.created": "Pull request created!", - "cmd.ai.task_pr.flag.title": "PR title (defaults to task title)", - "cmd.ai.task_pr.flag.draft": "Create as draft PR", - "cmd.ai.task_pr.flag.labels": "Labels to add (comma-separated)", - "cmd.ai.task_pr.flag.base": "Base branch (defaults to main)", - - "cmd.ai.priority.critical": "CRITICAL", - "cmd.ai.priority.high": "HIGH", - "cmd.ai.priority.medium": "MEDIUM", - "cmd.ai.priority.low": "LOW", - - "cmd.ai.status.pending": "pending", - "cmd.ai.status.in_progress": "in_progress", - "cmd.ai.status.completed": "completed", - "cmd.ai.status.blocked": "blocked", - - "cmd.ai.label.id": "ID:", - "cmd.ai.label.title": "Title:", - "cmd.ai.label.priority": "Priority:", - "cmd.ai.label.status": "Status:", - "cmd.ai.label.project": "Project:", - "cmd.ai.label.labels": "Labels:", - "cmd.ai.label.claimed_by": "Claimed by:", - "cmd.ai.label.created": "Created:", - "cmd.ai.label.description": "Description:", - "cmd.ai.label.related_files": "Related files:", - "cmd.ai.label.blocked_by": "Blocked by:", - "cmd.ai.label.url": "URL:", - - "cmd.ai.error.load_config": "failed to load config", - "cmd.ai.error.list_tasks": "failed to list tasks", - "cmd.ai.error.get_task": "failed to get task", - "cmd.ai.error.claim_task": "failed to claim task", - "cmd.ai.error.update_task": "failed to update task", - "cmd.ai.error.complete_task": "failed to complete task", - "cmd.ai.error.working_dir": "failed to get working directory", - "cmd.ai.error.git_status": "failed to check git status", - "cmd.ai.error.commit": "failed to commit", - "cmd.ai.error.push": "failed to push", - "cmd.ai.error.get_branch": "failed to get current branch", - "cmd.ai.error.push_branch": "failed to push branch", - "cmd.ai.error.create_pr": "failed to create PR", - - "cmd.vm.short": "LinuxKit VM management", - "cmd.vm.long": "Manage LinuxKit virtual machines.\n\nLinuxKit VMs are lightweight, immutable VMs built from YAML templates.\nThey run using qemu or hyperkit depending on your system.\n\nCommands:\n run Run a VM from image or template\n ps List running VMs\n stop Stop a running VM\n logs View VM logs\n exec Execute command in VM\n templates Manage LinuxKit templates", - - "cmd.vm.run.short": "Run a LinuxKit image or template", - "cmd.vm.run.long": "Runs a LinuxKit image as a VM using the available hypervisor.\n\nSupported image formats: .iso, .qcow2, .vmdk, .raw\n\nYou can also run from a template using --template, which will build and run\nthe image automatically. Use --var to set template variables.\n\nExamples:\n core vm run image.iso\n core vm run -d image.qcow2\n core vm run --name myvm --memory 2048 --cpus 4 image.iso\n core vm run --template core-dev --var SSH_KEY=\"ssh-rsa AAAA...\"\n core vm run --template server-php --var SSH_KEY=\"...\" --var DOMAIN=example.com", - "cmd.vm.run.flag.name": "Name for the container", - "cmd.vm.run.flag.detach": "Run in detached mode (background)", - "cmd.vm.run.flag.memory": "Memory in MB (default: 1024)", - "cmd.vm.run.flag.cpus": "Number of CPUs (default: 1)", - "cmd.vm.run.flag.ssh_port": "SSH port for exec commands (default: 2222)", - "cmd.vm.run.flag.template": "Run from a LinuxKit template (build + run)", - "cmd.vm.run.flag.var": "Template variable in KEY=VALUE format (can be repeated)", - "cmd.vm.run.error.image_required": "image path is required (or use --template)", - - "cmd.vm.ps.short": "List running VMs", - "cmd.vm.ps.long": "Lists all VMs. By default, only shows running VMs.\n\nExamples:\n core vm ps\n core vm ps -a", - "cmd.vm.ps.flag.all": "Show all containers (including stopped)", - "cmd.vm.ps.header": "ID\tNAME\tIMAGE\tSTATUS\tSTARTED\tPID", - "cmd.vm.ps.no_containers": "No containers", - "cmd.vm.ps.no_running": "No running containers", - - "cmd.vm.stop.short": "Stop a running VM", - "cmd.vm.stop.long": "Stops a running VM by ID.\n\nExamples:\n core vm stop abc12345\n core vm stop abc1", - "cmd.vm.stop.stopping": "Stopping:", - "cmd.vm.stop.stopped": "Stopped", - - "cmd.vm.logs.short": "View VM logs", - "cmd.vm.logs.long": "View logs from a VM.\n\nExamples:\n core vm logs abc12345\n core vm logs -f abc1", - "cmd.vm.logs.flag.follow": "Follow log output", - - "cmd.vm.exec.short": "Execute a command in a VM", - "cmd.vm.exec.long": "Execute a command inside a running VM via SSH.\n\nExamples:\n core vm exec abc12345 ls -la\n core vm exec abc1 /bin/sh", - - "cmd.vm.templates.short": "Manage LinuxKit templates", - "cmd.vm.templates.long": "Manage LinuxKit YAML templates for building VMs.\n\nTemplates provide pre-configured LinuxKit configurations for common use cases.\nThey support variable substitution with ${VAR} and ${VAR:-default} syntax.\n\nExamples:\n core vm templates # List available templates\n core vm templates show core-dev # Show template content\n core vm templates vars server-php # Show template variables", - "cmd.vm.templates.title": "Available LinuxKit Templates", - "cmd.vm.templates.header": "NAME\tDESCRIPTION", - "cmd.vm.templates.no_templates": "No templates available.", - "cmd.vm.templates.hint.show": "Show template:", - "cmd.vm.templates.hint.vars": "Show variables:", - "cmd.vm.templates.hint.run": "Run from template:", - - "cmd.vm.templates.show.short": "Display template content", - "cmd.vm.templates.show.long": "Display the content of a LinuxKit template.\n\nExamples:\n core templates show core-dev\n core templates show server-php", - - "cmd.vm.templates.vars.short": "Show template variables", - "cmd.vm.templates.vars.long": "Display all variables used in a template.\n\nShows required variables (no default) and optional variables (with defaults).\n\nExamples:\n core templates vars core-dev\n core templates vars server-php", - "cmd.vm.templates.vars.required": "Required Variables (no default):", - "cmd.vm.templates.vars.optional": "Optional Variables (with defaults):", - "cmd.vm.templates.vars.none": "No variables in this template.", - - "cmd.vm.label.image": "Image:", - "cmd.vm.label.name": "Name:", - "cmd.vm.label.hypervisor": "Hypervisor:", - "cmd.vm.label.started": "Started:", - "cmd.vm.label.pid": "PID:", - "cmd.vm.label.container_stopped": "Container stopped:", - "cmd.vm.label.template": "Template:", - "cmd.vm.label.building": "Building:", - - "cmd.vm.hint.view_logs": "Use 'core vm logs {{.ID}}' to view output", - "cmd.vm.hint.stop": "Use 'core vm stop {{.ID}}' to stop", - - "cmd.vm.error.init_manager": "failed to initialize container manager", - "cmd.vm.error.run_container": "failed to run container", - "cmd.vm.error.list_containers": "failed to list containers", - "cmd.vm.error.stop_container": "failed to stop container", - "cmd.vm.error.get_logs": "failed to get logs", - "cmd.vm.error.id_required": "container ID is required", - "cmd.vm.error.id_and_cmd_required": "container ID and command are required", - "cmd.vm.error.no_match": "no container found matching: {{.ID}}", - "cmd.vm.error.multiple_match": "multiple containers match '{{.ID}}', be more specific", - "cmd.vm.error.template_required": "template name is required", - "cmd.vm.error.apply_template": "failed to apply template", - "cmd.vm.error.create_temp": "failed to create temp directory", - "cmd.vm.error.write_template": "failed to write template", - "cmd.vm.error.build_image": "failed to build image", - "cmd.vm.error.no_image_found": "no image found after build", - "cmd.vm.error.linuxkit_not_found": "linuxkit not found. Install with: brew install linuxkit (macOS) or see https://github.com/linuxkit/linuxkit", - - "cmd.docs.short": "Documentation management", - "cmd.docs.long": "Manage documentation across all repos.\nScan for docs, check coverage, and sync to core-php/docs/packages/.", - - "cmd.docs.list.short": "List documentation across repos", - "cmd.docs.list.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.", - "cmd.docs.list.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.docs.list.header.repo": "Repo", - "cmd.docs.list.header.readme": "README", - "cmd.docs.list.header.claude": "CLAUDE", - "cmd.docs.list.header.changelog": "CHANGELOG", - "cmd.docs.list.header.docs": "docs/", - "cmd.docs.list.files_count": "{{.Count}} files", - "cmd.docs.list.coverage_label": "Coverage", - "cmd.docs.list.coverage_summary": "{{.WithDocs}} with docs, {{.WithoutDocs}} without", - - "cmd.docs.sync.short": "Sync documentation to core-php/docs/packages/", - "cmd.docs.sync.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.", - "cmd.docs.sync.flag.registry": "Path to repos.yaml (auto-detected if not specified)", - "cmd.docs.sync.flag.dry_run": "Show what would be synced without copying", - "cmd.docs.sync.flag.output": "Output directory (default: core-php/docs/packages)", - "cmd.docs.sync.no_docs_found": "No documentation found in any repos.", - "cmd.docs.sync.found_label": "Found", - "cmd.docs.sync.repos_with_docs": "{{.Count}} repo(s) with docs/ directories", - "cmd.docs.sync.files_count": "({{.Count}} files)", - "cmd.docs.sync.total_label": "Total:", - "cmd.docs.sync.total_summary": "{{.Files}} files from {{.Repos}} repos → {{.Output}}", - "cmd.docs.sync.dry_run_notice": "Dry run - no files copied", - "cmd.docs.sync.confirm": "Sync?", - "cmd.docs.sync.done_label": "Done:", - "cmd.docs.sync.synced_packages": "Synced {{.Count}} packages", - - "cmd.docs.error.load_registry": "failed to load registry", - "cmd.docs.error.scan_directory": "failed to scan directory", - - "cmd.pkg.short": "Package management for core-* repos", - "cmd.pkg.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", - "cmd.pkg.no_description": "(no description)", - - "cmd.pkg.search.short": "Search GitHub for packages", - "cmd.pkg.search.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", - "cmd.pkg.search.flag.org": "GitHub organization (default: host-uk)", - "cmd.pkg.search.flag.pattern": "Repo name pattern (* for wildcard)", - "cmd.pkg.search.flag.type": "Filter by type in name (mod, services, plug, website)", - "cmd.pkg.search.flag.limit": "Max results (default 50)", - "cmd.pkg.search.flag.refresh": "Bypass cache and fetch fresh data", - "cmd.pkg.search.cache_label": "Cache:", - "cmd.pkg.search.note_label": "Note:", - "cmd.pkg.search.fetching_label": "Fetching:", - "cmd.pkg.search.gh_token_warning": "GH_TOKEN env var is set - this may cause auth issues", - "cmd.pkg.search.gh_token_unset": "Unset it with: unset GH_TOKEN", - "cmd.pkg.search.no_repos_found": "No repositories found matching pattern.", - "cmd.pkg.search.found_repos": "Found {{.Count}} repositories:", - "cmd.pkg.search.private_label": "[private]", - "cmd.pkg.search.install_with": "Install with:", - - "cmd.pkg.install.short": "Clone a package from GitHub", - "cmd.pkg.install.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", - "cmd.pkg.install.flag.dir": "Target directory (default: ./packages or current dir)", - "cmd.pkg.install.flag.add": "Add to repos.yaml registry", - "cmd.pkg.install.skip_label": "Skip:", - "cmd.pkg.install.already_exists": "{{.Name}} already exists at {{.Path}}", - "cmd.pkg.install.installing_label": "Installing:", - "cmd.pkg.install.target_label": "Target:", - "cmd.pkg.install.cloning": "Cloning", - "cmd.pkg.install.add_to_registry": "add to registry", - "cmd.pkg.install.added_to_registry": "added to repos.yaml", - "cmd.pkg.install.done_label": "Done:", - "cmd.pkg.install.installed": "Installed {{.Name}}", - - "cmd.pkg.list.short": "List installed packages", - "cmd.pkg.list.long": "Lists all packages in the current workspace.\n\nReads from repos.yaml or scans for git repositories.\n\nExamples:\n core pkg list", - "cmd.pkg.list.title": "Installed Packages", - "cmd.pkg.list.no_packages": "No packages in registry.", - "cmd.pkg.list.total_label": "Total:", - "cmd.pkg.list.summary": "{{.Installed}} installed, {{.Missing}} missing", - "cmd.pkg.list.install_missing": "Install missing:", - - "cmd.pkg.update.short": "Update installed packages", - "cmd.pkg.update.long": "Pulls latest changes for installed packages.\n\nExamples:\n core pkg update core-php # Update specific package\n core pkg update --all # Update all packages", - "cmd.pkg.update.flag.all": "Update all packages", - "cmd.pkg.update.update_label": "Update:", - "cmd.pkg.update.updating": "Updating {{.Count}} package(s)", - "cmd.pkg.update.not_installed": "not installed", - "cmd.pkg.update.up_to_date": "up to date", - "cmd.pkg.update.done_label": "Done:", - "cmd.pkg.update.summary": "{{.Updated}} updated, {{.Skipped}} skipped, {{.Failed}} failed", - - "cmd.pkg.outdated.short": "Check for outdated packages", - "cmd.pkg.outdated.long": "Checks which packages have unpulled commits.\n\nExamples:\n core pkg outdated", - "cmd.pkg.outdated.outdated_label": "Outdated:", - "cmd.pkg.outdated.checking": "Checking for updates...", - "cmd.pkg.outdated.commits_behind": "{{.Count}} commits behind", - "cmd.pkg.outdated.done_label": "Done:", - "cmd.pkg.outdated.all_up_to_date": "All packages up to date", - "cmd.pkg.outdated.summary_label": "Summary:", - "cmd.pkg.outdated.summary": "{{.Outdated}} outdated, {{.UpToDate}} up to date", - "cmd.pkg.outdated.update_with": "Update with:", - - "cmd.pkg.error.gh_not_authenticated": "gh CLI not authenticated. Run: gh auth login", - "cmd.pkg.error.auth_failed": "authentication failed - try: unset GH_TOKEN && gh auth login", - "cmd.pkg.error.search_failed": "search failed: %s", - "cmd.pkg.error.parse_results": "failed to parse results: %w", - "cmd.pkg.error.repo_required": "repository is required (e.g., core pkg install host-uk/core-php)", - "cmd.pkg.error.invalid_repo_format": "invalid repo format: use org/repo (e.g., host-uk/core-php)", - "cmd.pkg.error.create_directory": "failed to create directory: %w", - "cmd.pkg.error.no_repos_yaml": "no repos.yaml found", - "cmd.pkg.error.no_repos_yaml_workspace": "no repos.yaml found - run from workspace directory", - "cmd.pkg.error.load_registry": "failed to load registry: %w", - "cmd.pkg.error.specify_package": "specify package name or use --all", - - "cmd.ci.short": "Publish releases (dry-run by default)", - "cmd.ci.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", - - "cmd.ci.init.short": "Initialize release configuration", - "cmd.ci.init.long": "Creates a .core/release.yaml configuration file interactively.", - "cmd.ci.init.config_exists": "Configuration already exists at", - "cmd.ci.init.overwrite_prompt": "Overwrite? [y/N]: ", - "cmd.ci.init.creating": "Creating release configuration", - "cmd.ci.init.project_name": "Project name", - "cmd.ci.init.github_repo": "GitHub repository (owner/repo):", - "cmd.ci.init.config_written": "Configuration written to", - - "cmd.ci.changelog.short": "Generate changelog", - "cmd.ci.changelog.long": "Generates a changelog from conventional commits.", - "cmd.ci.changelog.flag.from": "Starting ref (default: previous tag)", - "cmd.ci.changelog.flag.to": "Ending ref (default: HEAD)", - - "cmd.ci.version.short": "Show or set version", - "cmd.ci.version.long": "Shows the determined version or validates a version string.", - - "cmd.ci.release.short": "Create a release", - - "cmd.ci.flag.go_for_launch": "Actually publish (default is dry-run for safety)", - "cmd.ci.flag.version": "Version to release (e.g., v1.2.3)", - "cmd.ci.flag.draft": "Create release as a draft", - "cmd.ci.flag.prerelease": "Mark release as a prerelease", - - "cmd.ci.publishing": "Publishing release", - "cmd.ci.dry_run_hint": "(dry-run) use --we-are-go-for-launch to publish", - "cmd.ci.go_for_launch": "GO FOR LAUNCH", - "cmd.ci.publish_completed": "Publish completed!", - - "cmd.ci.label.ci": "CI:", - "cmd.ci.label.init": "Init:", - "cmd.ci.label.note": "Note:", - "cmd.ci.label.error": "Error:", - "cmd.ci.label.success": "Success:", - "cmd.ci.label.version": "Version:", - "cmd.ci.label.artifacts": "Artifacts:", - "cmd.ci.label.published": "Published:", - - "cmd.ci.error.working_dir": "failed to get working directory", - "cmd.ci.error.load_config": "failed to load config", - "cmd.ci.error.write_config": "failed to write config", - "cmd.ci.error.no_publishers": "no publishers configured in .core/release.yaml", - "cmd.ci.error.generate_changelog": "failed to generate changelog", - "cmd.ci.error.determine_version": "failed to determine version", - - "cmd.sdk.short": "SDK validation and API compatibility tools", - "cmd.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", - - "cmd.sdk.diff.short": "Check for breaking API changes", - "cmd.sdk.diff.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.", - "cmd.sdk.diff.flag.base": "Base spec (version tag or file)", - "cmd.sdk.diff.flag.spec": "Current spec file", - "cmd.sdk.diff.label": "SDK Diff:", - "cmd.sdk.diff.checking": "Checking for breaking changes", - "cmd.sdk.diff.base_label": "Base:", - "cmd.sdk.diff.current_label": "Current:", - "cmd.sdk.diff.breaking": "Breaking:", - "cmd.sdk.diff.error.base_required": "--base is required (version tag or file path)", - - "cmd.sdk.validate.short": "Validate OpenAPI spec", - "cmd.sdk.validate.long": "Validate OpenAPI spec syntax.\n\nChecks that the OpenAPI specification file is valid and well-formed.", - "cmd.sdk.validate.flag.spec": "Path to OpenAPI spec file", - "cmd.sdk.validate.validating": "Validating OpenAPI spec", - "cmd.sdk.validate.spec_label": "Spec:", - "cmd.sdk.validate.valid": "Spec is valid", - - "cmd.sdk.label.sdk": "SDK:", - "cmd.sdk.label.ok": "OK:", - "cmd.sdk.label.error": "Error:", - "cmd.sdk.error.working_dir": "failed to get working directory", - - "cmd.test.short": "Run tests with coverage", - "cmd.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", - "cmd.test.running": "Running tests", - "cmd.test.all_passed": "All tests passed", - "cmd.test.tests_failed": "Tests failed", - "cmd.test.passed": "{{.Count}} passed", - "cmd.test.failed": "{{.Count}} failed", - "cmd.test.skipped": "{{.Count}} skipped", - "cmd.test.failed_packages": "Failed packages:", - "cmd.test.coverage_by_package": "Coverage by package:", - - "cmd.test.flag.verbose": "Show test output as it runs (-v)", - "cmd.test.flag.coverage": "Show detailed per-package coverage", - "cmd.test.flag.short": "Skip long-running tests (-short)", - "cmd.test.flag.pkg": "Package pattern to test (default: ./...)", - "cmd.test.flag.run": "Run only tests matching this regex (-run)", - "cmd.test.flag.race": "Enable race detector (-race)", - "cmd.test.flag.json": "Output JSON for CI/agents", - - "cmd.test.label.test": "Test:", - "cmd.test.label.package": "Package:", - "cmd.test.label.filter": "Filter:", - "cmd.test.label.coverage": "Coverage:", - "cmd.test.label.average": "Average", - - "cmd.test.error.no_go_mod": "no go.mod found - run from a Go project directory", - "cmd.test.error.tests_failed": "tests failed", - - "error.not_found": "Not found: {{.Item}}", - "error.invalid": "Invalid: {{.Item}}", - "error.permission": "Permission denied: {{.Item}}", - "error.timeout": "Operation timed out", - "error.network": "Network error: {{.Message}}", - "error.gh_not_found": "'gh' CLI not found. Install from https://cli.github.com/", - "error.registry_not_found": "No repos.yaml found", - "error.repo_not_found": "Repository '{{.Name}}' not found", - - "label.status": "Status", - "label.branch": "Branch", - "label.commit": "Commit", - "label.message": "Message", - "label.author": "Author", - "label.date": "Date", - "label.duration": "Duration", - "label.coverage": "Coverage", - "label.package": "Package", - "label.registry": "Registry", - "label.scanning": "Scanning", - "label.total": "Total", - - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.zh": "Chinese" + "lang": { + "de": "German", + "en": "English", + "es": "Spanish", + "fr": "French", + "zh": "Chinese" + } }