2026-01-30 01:42:53 +00:00
{
2026-01-30 13:28:29 +00:00
"gram" : {
2026-01-30 13:11:58 +00:00
"verb" : {
"be" : { "base" : "be" , "past" : "was" , "gerund" : "being" } ,
"go" : { "base" : "go" , "past" : "went" , "gerund" : "going" } ,
"do" : { "base" : "do" , "past" : "did" , "gerund" : "doing" } ,
"have" : { "base" : "have" , "past" : "had" , "gerund" : "having" } ,
"make" : { "base" : "make" , "past" : "made" , "gerund" : "making" } ,
"get" : { "base" : "get" , "past" : "got" , "gerund" : "getting" } ,
"run" : { "base" : "run" , "past" : "ran" , "gerund" : "running" } ,
"write" : { "base" : "write" , "past" : "wrote" , "gerund" : "writing" } ,
"build" : { "base" : "build" , "past" : "built" , "gerund" : "building" } ,
"send" : { "base" : "send" , "past" : "sent" , "gerund" : "sending" } ,
"find" : { "base" : "find" , "past" : "found" , "gerund" : "finding" } ,
"take" : { "base" : "take" , "past" : "took" , "gerund" : "taking" } ,
"begin" : { "base" : "begin" , "past" : "began" , "gerund" : "beginning" } ,
"keep" : { "base" : "keep" , "past" : "kept" , "gerund" : "keeping" } ,
"hold" : { "base" : "hold" , "past" : "held" , "gerund" : "holding" } ,
"bring" : { "base" : "bring" , "past" : "brought" , "gerund" : "bringing" } ,
"think" : { "base" : "think" , "past" : "thought" , "gerund" : "thinking" } ,
"buy" : { "base" : "buy" , "past" : "bought" , "gerund" : "buying" } ,
"catch" : { "base" : "catch" , "past" : "caught" , "gerund" : "catching" } ,
"choose" : { "base" : "choose" , "past" : "chose" , "gerund" : "choosing" } ,
"lose" : { "base" : "lose" , "past" : "lost" , "gerund" : "losing" } ,
"win" : { "base" : "win" , "past" : "won" , "gerund" : "winning" } ,
"meet" : { "base" : "meet" , "past" : "met" , "gerund" : "meeting" } ,
"lead" : { "base" : "lead" , "past" : "led" , "gerund" : "leading" } ,
"leave" : { "base" : "leave" , "past" : "left" , "gerund" : "leaving" } ,
"spend" : { "base" : "spend" , "past" : "spent" , "gerund" : "spending" } ,
"pay" : { "base" : "pay" , "past" : "paid" , "gerund" : "paying" } ,
2026-01-30 14:24:23 +00:00
"sell" : { "base" : "sell" , "past" : "sold" , "gerund" : "selling" } ,
"commit" : { "base" : "commit" , "past" : "committed" , "gerund" : "committing" } ,
"stop" : { "base" : "stop" , "past" : "stopped" , "gerund" : "stopping" } ,
"scan" : { "base" : "scan" , "past" : "scanned" , "gerund" : "scanning" } ,
"format" : { "base" : "format" , "past" : "formatted" , "gerund" : "formatting" } ,
"set" : { "base" : "set" , "past" : "set" , "gerund" : "setting" } ,
"put" : { "base" : "put" , "past" : "put" , "gerund" : "putting" } ,
"cut" : { "base" : "cut" , "past" : "cut" , "gerund" : "cutting" } ,
"hit" : { "base" : "hit" , "past" : "hit" , "gerund" : "hitting" } ,
"sit" : { "base" : "sit" , "past" : "sat" , "gerund" : "sitting" } ,
"split" : { "base" : "split" , "past" : "split" , "gerund" : "splitting" } ,
"shut" : { "base" : "shut" , "past" : "shut" , "gerund" : "shutting" }
2026-01-30 13:11:58 +00:00
} ,
"noun" : {
2026-01-30 14:24:23 +00:00
"file" : { "one" : "file" , "other" : "files" } ,
"repo" : { "one" : "repo" , "other" : "repos" } ,
"repository" : { "one" : "repository" , "other" : "repositories" } ,
"commit" : { "one" : "commit" , "other" : "commits" } ,
"branch" : { "one" : "branch" , "other" : "branches" } ,
"change" : { "one" : "change" , "other" : "changes" } ,
"item" : { "one" : "item" , "other" : "items" } ,
"issue" : { "one" : "issue" , "other" : "issues" } ,
"task" : { "one" : "task" , "other" : "tasks" } ,
"person" : { "one" : "person" , "other" : "people" } ,
"child" : { "one" : "child" , "other" : "children" } ,
"package" : { "one" : "package" , "other" : "packages" } ,
"artifact" : { "one" : "artifact" , "other" : "artifacts" } ,
"vulnerability" : { "one" : "vulnerability" , "other" : "vulnerabilities" } ,
"dependency" : { "one" : "dependency" , "other" : "dependencies" } ,
"directory" : { "one" : "directory" , "other" : "directories" } ,
"category" : { "one" : "category" , "other" : "categories" } ,
"query" : { "one" : "query" , "other" : "queries" }
2026-01-30 13:11:58 +00:00
} ,
"article" : {
"indefinite" : { "default" : "a" , "vowel" : "an" } ,
"definite" : "the"
refactor(i18n): use grammar engine for progress messages
- Replace cli.progress.* keys with i18n.P() dynamic generation
- Remove 7 static progress keys from en_GB.json (building, checking, etc.)
- Add additional core.* intents (format, analyse, link, unlink, fetch, etc.)
- Add grammar helpers: Progress(), ProgressSubject(), ActionResult(), Label()
- Add package-level convenience functions: P(), PS(), L()
- Update commands to use common.prompt.abort instead of cli.confirm.abort
The grammar engine now generates progress messages dynamically:
i18n.P("check") → "Checking..."
i18n.P("fetch") → "Fetching..."
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 12:43:03 +00:00
} ,
2026-01-30 14:24:23 +00:00
"word" : {
"url" : "URL" ,
"id" : "ID" ,
"ok" : "OK" ,
"ci" : "CI" ,
"qa" : "QA" ,
"php" : "PHP" ,
"sdk" : "SDK" ,
"html" : "HTML" ,
"cgo" : "CGO" ,
"pid" : "PID" ,
"cpus" : "CPUs" ,
"ssh" : "SSH" ,
"ssl" : "SSL" ,
"api" : "API" ,
"pr" : "PR" ,
"vite" : "Vite" ,
"pnpm" : "pnpm" ,
"app_url" : "app URL" ,
"blocked_by" : "blocked by" ,
"claimed_by" : "claimed by" ,
"related_files" : "related files" ,
refactor(i18n): consolidate duplicate translation keys into common section
Add common.* keys for reusable translations:
- common.label.* - UI labels (error, done, status, version, etc.)
- common.status.* - status words (running, stopped, dirty, synced)
- common.error.* - error messages (failed, not_found, working_dir)
- common.flag.* - CLI flag descriptions (registry, verbose, etc.)
- common.count.* - count templates (failed, passed, skipped)
- common.result.* - result messages (all_passed, no_issues)
- common.progress.* - progress messages (running, checking)
- common.hint.* - help hints (install_with, fix_deps)
Update all cmd/* files to use common keys instead of duplicated
command-specific keys. Reduces translation maintenance burden
and ensures consistency across the CLI.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:32:25 +00:00
"up_to_date" : "up to date" ,
2026-01-30 14:24:23 +00:00
"dry_run" : "dry run" ,
"go_mod" : "go.mod"
refactor(i18n): consolidate duplicate translation keys into common section
Add common.* keys for reusable translations:
- common.label.* - UI labels (error, done, status, version, etc.)
- common.status.* - status words (running, stopped, dirty, synced)
- common.error.* - error messages (failed, not_found, working_dir)
- common.flag.* - CLI flag descriptions (registry, verbose, etc.)
- common.count.* - count templates (failed, passed, skipped)
- common.result.* - result messages (all_passed, no_issues)
- common.progress.* - progress messages (running, checking)
- common.hint.* - help hints (install_with, fix_deps)
Update all cmd/* files to use common keys instead of duplicated
command-specific keys. Reduces translation maintenance burden
and ensures consistency across the CLI.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:32:25 +00:00
} ,
2026-01-30 14:24:23 +00:00
"punct" : {
"label" : ":" ,
"progress" : "..."
feat(i18n): add localized number formatting helpers
New i18n.* namespace patterns for number formatting:
- T("i18n.number", 1234567) → "1,234,567" (en) / "1.234.567" (de)
- T("i18n.decimal", 1234.56) → "1,234.56" (en) / "1.234,56" (de)
- T("i18n.percent", 0.85) → "85%" (en) / "85 %" (de)
- T("i18n.bytes", 1536000) → "1.5 MB" (en) / "1,5 MB" (de)
- T("i18n.ordinal", 3) → "3rd" (en) / "3." (de)
Also available as direct functions:
- FormatNumber(n), FormatDecimal(f), FormatPercent(f)
- FormatBytes(n), FormatOrdinal(n)
Language-aware formatting for en, de, fr, es, zh.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:39:15 +00:00
} ,
"number" : {
"thousands" : "," ,
"decimal" : "." ,
"percent" : "%s%%"
refactor(i18n): consolidate duplicate translation keys into common section
Add common.* keys for reusable translations:
- common.label.* - UI labels (error, done, status, version, etc.)
- common.status.* - status words (running, stopped, dirty, synced)
- common.error.* - error messages (failed, not_found, working_dir)
- common.flag.* - CLI flag descriptions (registry, verbose, etc.)
- common.count.* - count templates (failed, passed, skipped)
- common.result.* - result messages (all_passed, no_issues)
- common.progress.* - progress messages (running, checking)
- common.hint.* - help hints (install_with, fix_deps)
Update all cmd/* files to use common keys instead of duplicated
command-specific keys. Reduces translation maintenance burden
and ensures consistency across the CLI.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:32:25 +00:00
}
} ,
2026-01-30 14:24:23 +00:00
"prompt" : {
"yes" : "y" ,
"no" : "n" ,
"continue" : "Continue?" ,
"proceed" : "Proceed?" ,
"confirm" : "Are you sure?" ,
"overwrite" : "Overwrite?" ,
"discard" : "Discard changes?"
} ,
"time" : {
"just_now" : "just now" ,
"ago" : {
"second" : { "one" : "{{.Count}} second ago" , "other" : "{{.Count}} seconds ago" } ,
"minute" : { "one" : "{{.Count}} minute ago" , "other" : "{{.Count}} minutes ago" } ,
"hour" : { "one" : "{{.Count}} hour ago" , "other" : "{{.Count}} hours ago" } ,
"day" : { "one" : "{{.Count}} day ago" , "other" : "{{.Count}} days ago" } ,
"week" : { "one" : "{{.Count}} week ago" , "other" : "{{.Count}} weeks ago" }
}
2026-01-30 01:42:53 +00:00
} ,
2026-01-30 11:11:07 +00:00
"cmd" : {
"ai" : {
"short" : "AI agent task management" ,
2026-01-30 14:24:23 +00:00
"claude.short" : "Claude Code integration" ,
"task.short" : "Show task details or auto-select a task" ,
"task.id_required" : "task ID required (or use --auto)" ,
"task.no_pending" : "No pending tasks available." ,
"tasks.short" : "List available tasks from core-agentic" ,
"task_commit.short" : "Auto-commit changes with task reference" ,
"task_commit.no_changes" : "No uncommitted changes to commit." ,
"task_complete.short" : "Mark a task as completed" ,
"task_pr.short" : "Create a pull request for a task" ,
"task_pr.branch_error" : "cannot create PR from {{.Branch}} branch; create a feature branch first" ,
"task_update.short" : "Update task status or progress"
2026-01-30 11:11:07 +00:00
} ,
"build" : {
"short" : "Build projects with auto-detection and cross-compilation" ,
2026-01-30 14:24:23 +00:00
"error.invalid_target" : "invalid target format \"{{.Target}}\", expected OS/arch (e.g., linux/amd64)" ,
"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)" ,
"from_path.short" : "Build from a local directory" ,
"pwa.short" : "Build from a live PWA URL" ,
"sdk.short" : "Generate API SDKs from OpenAPI spec"
2026-01-30 11:11:07 +00:00
} ,
"ci" : {
2026-01-30 14:24:23 +00:00
"short" : "Publish releases (dry-run by default)" ,
2026-01-30 11:11:07 +00:00
"dry_run_hint" : "(dry-run) use --we-are-go-for-launch to publish" ,
"go_for_launch" : "GO FOR LAUNCH" ,
2026-01-30 14:24:23 +00:00
"init.short" : "Initialize release configuration" ,
"changelog.short" : "Generate changelog" ,
"version.short" : "Show or set version"
2026-01-30 11:11:07 +00:00
} ,
"dev" : {
2026-01-30 14:24:23 +00:00
"short" : "Multi-repo development workflow" ,
2026-01-30 11:11:07 +00:00
"no_changes" : "No uncommitted changes found." ,
"no_git_repos" : "No git repositories found." ,
2026-01-30 14:24:23 +00:00
"confirm_claude_commit" : "Have Claude commit these repos?" ,
"health.short" : "Quick health check across all repos" ,
2026-02-01 03:55:01 +00:00
"health.long" : "Shows a summary of repository health across all repos in the workspace." ,
"health.flag.verbose" : "Show detailed breakdown" ,
"health.repos" : "repos" ,
"health.to_push" : "to push" ,
"health.to_pull" : "to pull" ,
"health.errors" : "errors" ,
"health.more" : "+{{.Count}} more" ,
"health.dirty_label" : "Dirty:" ,
"health.ahead_label" : "Ahead:" ,
"health.behind_label" : "Behind:" ,
"health.errors_label" : "Errors:" ,
"status.clean" : "clean" ,
2026-01-30 14:24:23 +00:00
"commit.short" : "Claude-assisted commits across repos" ,
"push.short" : "Push commits across all repos" ,
"push.diverged" : "branch has diverged from remote" ,
"push.diverged_help" : "Some repos have diverged (local and remote have different commits)." ,
"push.uncommitted_changes_commit" : "You have uncommitted changes. Commit with Claude first?" ,
"pull.short" : "Pull updates across all repos" ,
"work.short" : "Multi-repo git operations" ,
"work.use_commit_flag" : "Use --commit to have Claude create commits" ,
"issues.short" : "List open issues across all repos" ,
"reviews.short" : "List PRs needing review across all repos" ,
"ci.short" : "Check CI status across all repos" ,
"impact.short" : "Show impact of changing a repo" ,
"impact.requires_registry" : "impact analysis requires repos.yaml with dependency information" ,
"sync.short" : "Synchronizes public service APIs with internal implementations" ,
"vm.short" : "Dev environment commands" ,
"vm.not_installed" : "dev environment not installed (run 'core dev install' first)" ,
2026-02-01 06:11:24 +00:00
"vm.not_running" : "Dev environment is not running" ,
"file_sync.short" : "Sync files across repos (agent-safe)" ,
"file_sync.long" : "Safely sync files or directories across multiple repositories with automatic pull/commit/push. Designed for AI agents to avoid common git pitfalls." ,
"file_sync.flag.to" : "Target repos pattern (e.g., packages/core-*)" ,
"file_sync.flag.message" : "Commit message for the sync" ,
"file_sync.flag.co_author" : "Co-author for commit (e.g., 'Name <email>')" ,
"file_sync.flag.dry_run" : "Show what would be done without making changes" ,
"file_sync.flag.push" : "Push after committing" ,
"file_sync.source" : "Source" ,
"file_sync.targets" : "Targets" ,
"file_sync.summary" : "Summary" ,
"file_sync.no_changes" : "no changes" ,
"file_sync.dry_run_mode" : "(dry run)" ,
"file_sync.error.source_not_found" : "Source not found: {{.Path}}" ,
"file_sync.error.no_targets" : "No target repos matched the pattern" ,
"file_sync.error.no_registry" : "No repos.yaml found" ,
"apply.short" : "Run command or script across repos (agent-safe)" ,
"apply.long" : "Run a command or script across multiple repositories with optional commit and push. Designed for AI agents to safely apply changes at scale." ,
"apply.flag.command" : "Shell command to run in each repo" ,
"apply.flag.script" : "Script file to run in each repo" ,
"apply.flag.repos" : "Comma-separated list of repo names (default: all)" ,
"apply.flag.commit" : "Commit changes after running" ,
"apply.flag.message" : "Commit message (required with --commit)" ,
"apply.flag.co_author" : "Co-author for commit" ,
"apply.flag.dry_run" : "Show what would be done without making changes" ,
"apply.flag.push" : "Push after committing" ,
"apply.flag.continue" : "Continue on error instead of stopping" ,
"apply.action" : "Action" ,
"apply.targets" : "Targets" ,
"apply.summary" : "Summary" ,
"apply.no_changes" : "no changes" ,
"apply.dry_run_mode" : "(dry run)" ,
"apply.error.no_command" : "Either --command or --script is required" ,
"apply.error.both_command_script" : "Cannot use both --command and --script" ,
"apply.error.commit_needs_message" : "--commit requires --message" ,
"apply.error.script_not_found" : "Script not found: {{.Path}}" ,
"apply.error.no_repos" : "No repos found" ,
"apply.error.no_registry" : "No repos.yaml found" ,
"apply.error.command_failed" : "Command failed (use --continue to skip failures)"
2026-01-30 11:11:07 +00:00
} ,
"docs" : {
"short" : "Documentation management" ,
2026-01-30 14:24:23 +00:00
"list.short" : "List documentation across repos" ,
"sync.short" : "Sync documentation to core-php/docs/packages/"
2026-01-30 11:11:07 +00:00
} ,
"doctor" : {
"short" : "Check development environment" ,
2026-01-30 14:24:23 +00:00
"ready" : "Doctor: Environment ready" ,
"no_repos_yaml" : "No repos.yaml found (run from workspace directory)" ,
"install_missing" : "Install missing tools:" ,
"install_macos" : "brew install git gh php composer node pnpm docker" ,
"ssh_missing" : "SSH key missing - run: ssh-keygen && gh ssh-key add"
2026-01-30 11:11:07 +00:00
} ,
"go" : {
"short" : "Go development tools" ,
2026-01-30 14:24:23 +00:00
"test.short" : "Run Go tests" ,
"cov.short" : "Run tests with coverage report" ,
"fmt.short" : "Format Go code" ,
"lint.short" : "Run golangci-lint" ,
"install.short" : "Install Go binary" ,
"mod.short" : "Module management" ,
"work.short" : "Workspace management"
2026-01-30 11:11:07 +00:00
} ,
"php" : {
"short" : "Laravel/PHP development tools" ,
2026-01-30 14:24:23 +00:00
"dev.short" : "Start Laravel development environment" ,
"dev.press_ctrl_c" : "Press Ctrl+C to stop all services" ,
"test.short" : "Run PHP tests (PHPUnit/Pest)" ,
"fmt.short" : "Format PHP code with Laravel Pint" ,
"analyse.short" : "Run PHPStan static analysis" ,
"audit.short" : "Security audit for dependencies" ,
"psalm.short" : "Run Psalm static analysis" ,
"rector.short" : "Automated code refactoring" ,
"infection.short" : "Mutation testing for test quality" ,
"security.short" : "Security vulnerability scanning" ,
"qa.short" : "Run full QA pipeline" ,
"build.short" : "Build Docker or LinuxKit image" ,
"deploy.short" : "Deploy to Coolify" ,
"serve.short" : "Run production container" ,
"ssl.short" : "Setup SSL certificates with mkcert" ,
2026-02-01 06:11:00 +00:00
"packages.short" : "Manage local PHP packages" ,
"ci.short" : "Run CI/CD pipeline with combined reporting" ,
"ci.long" : "Run all QA checks in optimal order and generate combined reports in JSON, markdown, or SARIF format for CI/CD integration." ,
"ci.flag.json" : "Output combined JSON report" ,
"ci.flag.summary" : "Output markdown summary (for PR comments)" ,
"ci.flag.sarif" : "Generate SARIF files for static analysis" ,
"ci.flag.upload_sarif" : "Upload SARIF to GitHub Security tab" ,
"ci.flag.fail_on" : "Severity level to fail on (critical, high, warning)"
2026-01-30 11:11:07 +00:00
} ,
"pkg" : {
"short" : "Package management for core-* repos" ,
2026-01-30 14:24:23 +00:00
"install.short" : "Clone a package from GitHub" ,
"list.short" : "List installed packages" ,
"update.short" : "Update installed packages" ,
"outdated.short" : "Check for outdated packages" ,
"search.short" : "Search GitHub for packages" ,
"error.invalid_repo_format" : "invalid repo format: use org/repo (e.g., host-uk/core-php)"
2026-01-30 11:11:07 +00:00
} ,
"sdk" : {
"short" : "SDK validation and API compatibility tools" ,
2026-01-30 14:24:23 +00:00
"diff.short" : "Check for breaking API changes" ,
"validate.short" : "Validate OpenAPI spec"
2026-01-30 11:11:07 +00:00
} ,
"setup" : {
2026-01-30 14:24:23 +00:00
"short" : "Bootstrap workspace or clone packages from registry" ,
2026-01-30 11:11:07 +00:00
"complete" : "Setup complete" ,
2026-01-30 14:24:23 +00:00
"bootstrap_mode" : "Bootstrap mode (no repos.yaml found)" ,
2026-01-30 11:11:07 +00:00
"nothing_to_clone" : "Nothing to clone." ,
2026-01-30 14:24:23 +00:00
"wizard.select_packages" : "Select packages to clone" ,
2026-02-01 03:37:06 +00:00
"wizard.what_to_do" : "What would you like to do?" ,
"github.short" : "Configure GitHub repos with org standards" ,
"github.long" : "Configure GitHub repositories with organisation standards including labels, webhooks, branch protection, and security settings." ,
"github.flag.repo" : "Specific repo to setup" ,
"github.flag.all" : "Setup all repos in registry" ,
"github.flag.labels" : "Only sync labels" ,
"github.flag.webhooks" : "Only sync webhooks" ,
"github.flag.protection" : "Only sync branch protection" ,
"github.flag.security" : "Only sync security settings" ,
"github.flag.check" : "Dry-run: show what would change" ,
"github.flag.config" : "Path to github.yaml config" ,
"github.dry_run_mode" : "(dry run) no changes will be made" ,
"github.no_repos_specified" : "No repos specified." ,
"github.usage_hint" : "Use --repo <name> for a single repo, or --all for all repos" ,
"github.no_changes" : "no changes needed" ,
"github.repos_checked" : "Repos checked" ,
"github.repos_with_changes" : "Repos with changes" ,
"github.all_up_to_date" : "All repos are up to date" ,
"github.to_create" : "To create" ,
"github.to_update" : "To update" ,
"github.to_delete" : "To delete" ,
"github.run_without_check" : "Run without --check to apply changes" ,
"github.error.not_authenticated" : "GitHub CLI not authenticated. Run: gh auth login" ,
"github.error.config_not_found" : "GitHub config file not found" ,
"github.error.conflicting_flags" : "Cannot use --repo and --all together"
2026-01-30 11:11:07 +00:00
} ,
2026-02-01 06:04:21 +00:00
"security" : {
"short" : "Security alerts and vulnerability scanning" ,
"long" : "View security alerts from Dependabot, code scanning, and secret scanning across repositories." ,
"alerts.short" : "List all security alerts across repos" ,
"alerts.long" : "List security alerts from Dependabot, code scanning, and secret scanning. Aggregates alerts across all repos in the registry." ,
"deps.short" : "List Dependabot vulnerability alerts" ,
"deps.long" : "List vulnerable dependencies detected by Dependabot with upgrade recommendations." ,
"deps.flag.vulnerable" : "Show only vulnerable dependencies" ,
"scan.short" : "List code scanning alerts" ,
"scan.long" : "List code scanning alerts from tools like CodeQL, Semgrep, etc." ,
"scan.flag.tool" : "Filter by tool name (e.g., codeql, semgrep)" ,
"secrets.short" : "List exposed secrets" ,
"secrets.long" : "List secrets detected by GitHub secret scanning." ,
"flag.repo" : "Specific repo to check" ,
"flag.severity" : "Filter by severity (critical,high,medium,low)"
} ,
2026-02-01 03:37:16 +00:00
"qa" : {
"short" : "Quality assurance workflows" ,
"long" : "Quality assurance commands for verifying work - CI status, reviews, issues." ,
"watch.short" : "Watch GitHub Actions after a push" ,
"watch.long" : "Monitor GitHub Actions workflow runs triggered by a commit, showing live progress and actionable failure details." ,
"watch.flag.repo" : "Repository to watch (default: current)" ,
"watch.flag.commit" : "Commit SHA to watch (default: HEAD)" ,
"watch.flag.timeout" : "Timeout duration (default: 10m)" ,
"watch.commit" : "Commit:" ,
"watch.waiting_for_workflows" : "Waiting for workflows to start..." ,
"watch.timeout" : "Timeout after {{.Duration}} waiting for workflows" ,
"watch.workflows_failed" : "{{.Count}} workflow(s) failed" ,
"watch.all_passed" : "All workflows passed" ,
"watch.error.not_git_repo" : "Not in a git repository" ,
feat(qa): add review command for PR status (#64)
* feat(qa): add qa watch command for CI monitoring (#47)
Implements `core qa watch` to monitor GitHub Actions after a push:
- Polls workflow runs for a commit until completion
- Shows live progress with pass/fail counts
- On failure, shows job name, failed step, and link to logs
- Exits with appropriate code (0 = passed, 1 = failed)
Usage:
core qa watch # Watch current repo's HEAD
core qa watch --repo X # Watch specific repo
core qa watch --timeout 5m # Custom timeout
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(qa): address CodeRabbit feedback on watch command
- Add length check before slicing commitSha to prevent panic on short SHAs
- Count all non-success conclusions as failures (cancelled, timed_out, etc.)
- Use errors.E/Wrap pattern for consistent error handling with operation context
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(qa): add context-aware commands and log parsing
- Use exec.CommandContext with timeout context for all gh invocations
so commands are cancelled when deadline expires
- Implement fetchErrorFromLogs using 'gh run view --log-failed'
to extract first meaningful error line from failed workflows
- Pass context through call chain for proper timeout propagation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(qa): add review command for PR status (#62)
Add `core qa review` command to show PR review status with actionable
next steps. Answers: "What do I need to do to get my PRs merged?"
and "What reviews am I blocking?"
Features:
- Shows your open PRs with merge status (CI, reviews, conflicts)
- Shows PRs where your review is requested
- Provides actionable suggestions (rebase, address feedback, etc.)
- Flags: --mine, --requested, --repo
Closes #62
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(qa): add review command for PR status (#62)
Add `core qa review` command to show PR review status with actionable
next steps. Answers: "What do I need to do to get my PRs merged?"
and "What reviews am I blocking?"
Features:
- Shows your open PRs with merge status (CI, reviews, conflicts)
- Shows PRs where your review is requested
- Provides actionable suggestions (rebase, address feedback, etc.)
- Flags: --mine, --requested, --repo
Closes #62
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(qa): address CodeRabbit feedback on review command
- Fix truncate to use runes for UTF-8 safe string slicing
- Remove unused user parameter from showMyPRs and showRequestedReviews
- Remove unused getCurrentUser function
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(qa): remove duplicate i18n block and improve error handling
- Remove duplicate cmd.qa block in en_GB.json
- Use errors.E consistently for error wrapping
- Require --repo flag when not in a git repository
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 03:56:48 +00:00
"watch.error.repo_format" : "Invalid repo format. Use --repo org/name or run from a git repo" ,
"review.short" : "Check PR review status" ,
"review.long" : "Show PR review status with actionable next steps. Answers: What do I need to do to get my PRs merged? What reviews am I blocking?" ,
"review.flag.mine" : "Show only your open PRs" ,
"review.flag.requested" : "Show only PRs where your review is requested" ,
"review.flag.repo" : "Specific repository (default: current)" ,
"review.your_prs" : "Your PRs" ,
"review.review_requested" : "Review Requested" ,
"review.no_prs" : "No open PRs" ,
"review.no_reviews" : "No reviews requested" ,
2026-02-01 05:20:46 +00:00
"review.error.no_repo" : "Not in a git repository. Use --repo to specify one" ,
"health.short" : "Aggregate CI health across all repos" ,
"health.long" : "Shows CI health summary across all repos with focus on problems that need attention." ,
"health.flag.problems" : "Show only repos with problems" ,
"health.summary" : "CI Health" ,
"health.all_healthy" : "All repos are healthy" ,
"health.passing" : "Passing" ,
"health.tests_failing" : "Tests failing" ,
"health.running" : "Running" ,
"health.cancelled" : "Cancelled" ,
"health.skipped" : "Skipped" ,
"health.no_ci_configured" : "No CI configured" ,
"health.workflow_disabled" : "Workflow disabled" ,
"health.fetch_error" : "Failed to fetch status" ,
"health.parse_error" : "Failed to parse response" ,
"health.count_passing" : "Passing" ,
"health.count_failing" : "Failing" ,
"health.count_pending" : "Pending" ,
"health.count_no_ci" : "No CI" ,
"health.count_disabled" : "Disabled" ,
"issues.short" : "Intelligent issue triage" ,
"issues.long" : "Show prioritised, actionable issues across all repos. Groups by: needs response, ready to work, blocked, and needs triage." ,
"issues.flag.mine" : "Show only issues assigned to you" ,
"issues.flag.triage" : "Show only issues needing triage" ,
"issues.flag.blocked" : "Show only blocked issues" ,
"issues.flag.limit" : "Maximum issues per repo" ,
"issues.fetching" : "Fetching..." ,
"issues.no_issues" : "No open issues found" ,
"issues.category.needs_response" : "Needs Response" ,
"issues.category.ready" : "Ready to Work" ,
"issues.category.blocked" : "Blocked" ,
"issues.category.triage" : "Needs Triage" ,
"issues.hint.needs_response" : "commented recently" ,
"issues.hint.blocked" : "Waiting on dependency" ,
"issues.hint.triage" : "Add labels and assignee"
2026-02-01 03:37:16 +00:00
} ,
2026-01-30 11:11:07 +00:00
"test" : {
2026-01-30 14:24:23 +00:00
"short" : "Run Go tests with coverage"
2026-01-30 11:11:07 +00:00
} ,
"vm" : {
"short" : "LinuxKit VM management" ,
2026-01-30 14:24:23 +00:00
"run.short" : "Run a LinuxKit image or template" ,
"ps.short" : "List running VMs" ,
"stop.short" : "Stop a running VM" ,
"logs.short" : "View VM logs" ,
"exec.short" : "Execute a command in a VM" ,
"templates.short" : "Manage LinuxKit templates"
2026-02-01 05:44:46 +00:00
} ,
"monitor" : {
"short" : "Aggregate security findings from GitHub" ,
"long" : "Monitor GitHub Security Tab, Dependabot, and secret scanning for actionable findings. Aggregates results from free tier scanners (Semgrep, Trivy, Gitleaks, OSV-Scanner, Checkov, CodeQL)." ,
"flag.repo" : "Specific repository to scan" ,
"flag.severity" : "Filter by severity (critical, high, medium, low)" ,
"flag.json" : "Output as JSON for piping to other tools" ,
"flag.all" : "Scan all repos in registry" ,
"scanning" : "Scanning" ,
"found" : "Found" ,
"no_findings" : "No security findings" ,
"error.no_repos" : "No repositories to scan. Use --repo, --all, or run from a git repo" ,
"error.not_git_repo" : "Not in a git repository. Use --repo to specify one"
2026-01-30 11:11:07 +00:00
}
2026-01-30 01:42:53 +00:00
} ,
2026-01-30 20:51:32 +00:00
"common" : {
2026-02-01 03:55:01 +00:00
"status" : {
"dirty" : "dirty" ,
"clean" : "clean" ,
"synced" : "synced" ,
"up_to_date" : "up to date"
} ,
2026-01-30 20:51:32 +00:00
"label" : {
"done" : "Done" ,
"error" : "Error" ,
"warning" : "Warning" ,
"info" : "Info" ,
"fix" : "Fix:" ,
"install" : "Install:" ,
"summary" : "Summary:" ,
2026-02-01 03:37:06 +00:00
"setup" : "Setup:" ,
"config" : "Config:" ,
"repo" : "Repo:"
2026-01-30 20:51:32 +00:00
} ,
"flag" : {
"fix" : "Auto-fix issues where possible" ,
"diff" : "Show diff of changes" ,
2026-02-01 03:37:06 +00:00
"json" : "Output as JSON" ,
2026-02-01 03:55:01 +00:00
"verbose" : "Show detailed output" ,
"registry" : "Path to repos.yaml registry file"
2026-01-30 20:51:32 +00:00
} ,
"progress" : {
"running" : "Running {{.Task}}..." ,
"checking" : "Checking {{.Item}}..."
} ,
"result" : {
"no_issues" : "No issues found"
} ,
"success" : {
"completed" : "{{.Action}} successfully"
} ,
"error" : {
"failed" : "Failed to {{.Action}}"
} ,
"hint" : {
"fix_deps" : "Update dependencies to fix vulnerabilities"
2026-02-01 06:11:24 +00:00
} ,
"count" : {
"succeeded" : "{{.Count}} succeeded" ,
"failed" : "{{.Count}} failed" ,
"skipped" : "{{.Count}} skipped"
2026-01-30 20:51:32 +00:00
}
} ,
2026-01-30 11:11:07 +00:00
"error" : {
"gh_not_found" : "'gh' CLI not found. Install from https://cli.github.com/" ,
"registry_not_found" : "No repos.yaml found" ,
2026-01-30 14:24:23 +00:00
"repo_not_found" : "Repository '{{.Name}}' not found"
2026-01-30 01:42:53 +00:00
} ,
2026-01-30 11:11:07 +00:00
"lang" : {
"de" : "German" ,
"en" : "English" ,
"es" : "Spanish" ,
"fr" : "French" ,
"zh" : "Chinese"
}
2026-01-30 01:42:53 +00:00
}