@build-astron-co/nimbus 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/nimbus +26 -10
- package/bin/nimbus.cmd +41 -0
- package/bin/nimbus.mjs +70 -0
- package/completions/nimbus.bash +38 -0
- package/completions/nimbus.fish +48 -0
- package/completions/nimbus.zsh +81 -0
- package/dist/src/agent/compaction-agent.js +215 -0
- package/dist/src/agent/context-manager.js +385 -0
- package/dist/src/agent/context.js +322 -0
- package/dist/src/agent/deploy-preview.js +395 -0
- package/dist/src/agent/expand-files.js +95 -0
- package/dist/src/agent/index.js +18 -0
- package/dist/src/agent/loop.js +1535 -0
- package/dist/src/agent/modes.js +347 -0
- package/dist/src/agent/permissions.js +396 -0
- package/dist/src/agent/subagents/base.js +67 -0
- package/dist/src/agent/subagents/cost.js +45 -0
- package/dist/src/agent/subagents/explore.js +36 -0
- package/dist/src/agent/subagents/general.js +41 -0
- package/dist/src/agent/subagents/index.js +88 -0
- package/dist/src/agent/subagents/infra.js +52 -0
- package/dist/src/agent/subagents/security.js +60 -0
- package/dist/src/agent/system-prompt.js +860 -0
- package/dist/src/app.js +152 -0
- package/dist/src/audit/activity-log.js +209 -0
- package/dist/src/audit/compliance-checker.js +419 -0
- package/dist/src/audit/cost-tracker.js +231 -0
- package/dist/src/audit/index.js +10 -0
- package/dist/src/audit/security-scanner.js +490 -0
- package/dist/src/auth/guard.js +64 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/keychain.js +79 -0
- package/dist/src/auth/oauth.js +389 -0
- package/dist/src/auth/providers.js +415 -0
- package/dist/src/auth/sso.js +87 -0
- package/dist/src/auth/store.js +424 -0
- package/dist/src/auth/types.js +5 -0
- package/dist/src/cli/index.js +8 -0
- package/dist/src/cli/init.js +1048 -0
- package/dist/src/cli/openapi-spec.js +346 -0
- package/dist/src/cli/run.js +505 -0
- package/dist/src/cli/serve-auth.js +56 -0
- package/dist/src/cli/serve.js +432 -0
- package/dist/src/cli/web.js +50 -0
- package/dist/src/cli.js +1574 -0
- package/dist/src/clients/core-engine-client.js +156 -0
- package/dist/src/clients/enterprise-client.js +246 -0
- package/dist/src/clients/generator-client.js +219 -0
- package/dist/src/clients/git-client.js +367 -0
- package/dist/src/clients/github-client.js +229 -0
- package/dist/src/clients/helm-client.js +299 -0
- package/dist/src/clients/index.js +18 -0
- package/dist/src/clients/k8s-client.js +270 -0
- package/dist/src/clients/llm-client.js +119 -0
- package/dist/src/clients/rest-client.js +104 -0
- package/dist/src/clients/service-discovery.js +35 -0
- package/dist/src/clients/terraform-client.js +302 -0
- package/dist/src/clients/tools-client.js +1227 -0
- package/dist/src/clients/ws-client.js +93 -0
- package/dist/src/commands/alias.js +91 -0
- package/dist/src/commands/analyze/index.js +313 -0
- package/dist/src/commands/apply/helm.js +375 -0
- package/dist/src/commands/apply/index.js +176 -0
- package/dist/src/commands/apply/k8s.js +350 -0
- package/dist/src/commands/apply/terraform.js +465 -0
- package/dist/src/commands/ask.js +137 -0
- package/dist/src/commands/audit/index.js +322 -0
- package/dist/src/commands/auth-cloud.js +345 -0
- package/dist/src/commands/auth-list.js +112 -0
- package/dist/src/commands/auth-profile.js +104 -0
- package/dist/src/commands/auth-refresh.js +161 -0
- package/dist/src/commands/auth-status.js +122 -0
- package/dist/src/commands/aws/ec2.js +402 -0
- package/dist/src/commands/aws/iam.js +304 -0
- package/dist/src/commands/aws/index.js +108 -0
- package/dist/src/commands/aws/lambda.js +317 -0
- package/dist/src/commands/aws/rds.js +345 -0
- package/dist/src/commands/aws/s3.js +346 -0
- package/dist/src/commands/aws/vpc.js +302 -0
- package/dist/src/commands/aws-discover.js +413 -0
- package/dist/src/commands/aws-terraform.js +618 -0
- package/dist/src/commands/azure/aks.js +305 -0
- package/dist/src/commands/azure/functions.js +200 -0
- package/dist/src/commands/azure/index.js +93 -0
- package/dist/src/commands/azure/storage.js +378 -0
- package/dist/src/commands/azure/vm.js +291 -0
- package/dist/src/commands/billing/index.js +224 -0
- package/dist/src/commands/chat.js +259 -0
- package/dist/src/commands/completions.js +255 -0
- package/dist/src/commands/config.js +291 -0
- package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
- package/dist/src/commands/cost/estimator.js +73 -0
- package/dist/src/commands/cost/index.js +625 -0
- package/dist/src/commands/cost/parsers/terraform.js +234 -0
- package/dist/src/commands/cost/parsers/types.js +4 -0
- package/dist/src/commands/cost/pricing/aws.js +501 -0
- package/dist/src/commands/cost/pricing/azure.js +462 -0
- package/dist/src/commands/cost/pricing/gcp.js +359 -0
- package/dist/src/commands/cost/pricing/index.js +24 -0
- package/dist/src/commands/demo.js +196 -0
- package/dist/src/commands/deploy.js +215 -0
- package/dist/src/commands/doctor.js +1291 -0
- package/dist/src/commands/drift/index.js +674 -0
- package/dist/src/commands/explain.js +235 -0
- package/dist/src/commands/export.js +120 -0
- package/dist/src/commands/feedback.js +319 -0
- package/dist/src/commands/fix.js +263 -0
- package/dist/src/commands/fs/index.js +338 -0
- package/dist/src/commands/gcp/compute.js +266 -0
- package/dist/src/commands/gcp/functions.js +221 -0
- package/dist/src/commands/gcp/gke.js +357 -0
- package/dist/src/commands/gcp/iam.js +295 -0
- package/dist/src/commands/gcp/index.js +105 -0
- package/dist/src/commands/gcp/storage.js +232 -0
- package/dist/src/commands/generate-helm.js +1026 -0
- package/dist/src/commands/generate-k8s.js +1263 -0
- package/dist/src/commands/generate-terraform.js +1058 -0
- package/dist/src/commands/gh/index.js +663 -0
- package/dist/src/commands/git/index.js +1208 -0
- package/dist/src/commands/helm/index.js +985 -0
- package/dist/src/commands/help.js +639 -0
- package/dist/src/commands/history.js +120 -0
- package/dist/src/commands/import.js +782 -0
- package/dist/src/commands/incident.js +144 -0
- package/dist/src/commands/index.js +109 -0
- package/dist/src/commands/init.js +955 -0
- package/dist/src/commands/k8s/index.js +979 -0
- package/dist/src/commands/login.js +588 -0
- package/dist/src/commands/logout.js +61 -0
- package/dist/src/commands/logs.js +160 -0
- package/dist/src/commands/onboarding.js +382 -0
- package/dist/src/commands/pipeline.js +153 -0
- package/dist/src/commands/plan/display.js +216 -0
- package/dist/src/commands/plan/index.js +525 -0
- package/dist/src/commands/plugin.js +325 -0
- package/dist/src/commands/preview.js +356 -0
- package/dist/src/commands/profile.js +297 -0
- package/dist/src/commands/questionnaire.js +1021 -0
- package/dist/src/commands/resume.js +35 -0
- package/dist/src/commands/rollback.js +259 -0
- package/dist/src/commands/rollout.js +74 -0
- package/dist/src/commands/runbook.js +307 -0
- package/dist/src/commands/schedule.js +202 -0
- package/dist/src/commands/status.js +213 -0
- package/dist/src/commands/team/index.js +309 -0
- package/dist/src/commands/team-context.js +200 -0
- package/dist/src/commands/template.js +204 -0
- package/dist/src/commands/tf/index.js +989 -0
- package/dist/src/commands/upgrade.js +515 -0
- package/dist/src/commands/usage/index.js +118 -0
- package/dist/src/commands/version.js +145 -0
- package/dist/src/commands/watch.js +127 -0
- package/dist/src/compat/index.js +2 -0
- package/dist/src/compat/runtime.js +10 -0
- package/dist/src/compat/sqlite.js +144 -0
- package/dist/src/config/index.js +6 -0
- package/dist/src/config/manager.js +469 -0
- package/dist/src/config/mode-store.js +57 -0
- package/dist/src/config/profiles.js +66 -0
- package/dist/src/config/safety-policy.js +251 -0
- package/dist/src/config/schema.js +107 -0
- package/dist/src/config/types.js +311 -0
- package/dist/src/config/workspace-state.js +38 -0
- package/dist/src/context/context-db.js +138 -0
- package/dist/src/demo/index.js +295 -0
- package/dist/src/demo/scenarios/full-journey.js +226 -0
- package/dist/src/demo/scenarios/getting-started.js +124 -0
- package/dist/src/demo/scenarios/helm-release.js +334 -0
- package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
- package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
- package/dist/src/demo/types.js +6 -0
- package/dist/src/engine/cost-estimator.js +334 -0
- package/dist/src/engine/diagram-generator.js +192 -0
- package/dist/src/engine/drift-detector.js +688 -0
- package/dist/src/engine/executor.js +832 -0
- package/dist/src/engine/index.js +39 -0
- package/dist/src/engine/orchestrator.js +436 -0
- package/dist/src/engine/planner.js +616 -0
- package/dist/src/engine/safety.js +609 -0
- package/dist/src/engine/verifier.js +664 -0
- package/dist/src/enterprise/audit.js +241 -0
- package/dist/src/enterprise/auth.js +189 -0
- package/dist/src/enterprise/billing.js +512 -0
- package/dist/src/enterprise/index.js +16 -0
- package/dist/src/enterprise/teams.js +315 -0
- package/dist/src/generator/best-practices.js +1375 -0
- package/dist/src/generator/helm.js +495 -0
- package/dist/src/generator/index.js +11 -0
- package/dist/src/generator/intent-parser.js +420 -0
- package/dist/src/generator/kubernetes.js +773 -0
- package/dist/src/generator/terraform.js +1472 -0
- package/dist/src/history/index.js +6 -0
- package/dist/src/history/manager.js +199 -0
- package/dist/src/history/types.js +6 -0
- package/dist/src/hooks/config.js +318 -0
- package/dist/src/hooks/engine.js +317 -0
- package/dist/src/hooks/index.js +2 -0
- package/dist/src/llm/auth-bridge.js +157 -0
- package/dist/src/llm/circuit-breaker.js +116 -0
- package/dist/src/llm/config-loader.js +172 -0
- package/dist/src/llm/cost-calculator.js +137 -0
- package/dist/src/llm/index.js +7 -0
- package/dist/src/llm/model-aliases.js +99 -0
- package/dist/src/llm/provider-registry.js +57 -0
- package/dist/src/llm/providers/anthropic.js +430 -0
- package/dist/src/llm/providers/bedrock.js +409 -0
- package/dist/src/llm/providers/google.js +344 -0
- package/dist/src/llm/providers/ollama.js +661 -0
- package/dist/src/llm/providers/openai-compatible.js +289 -0
- package/dist/src/llm/providers/openai.js +284 -0
- package/dist/src/llm/providers/openrouter.js +293 -0
- package/dist/src/llm/router.js +844 -0
- package/dist/src/llm/types.js +69 -0
- package/dist/src/lsp/client.js +239 -0
- package/dist/src/lsp/languages.js +95 -0
- package/dist/src/lsp/manager.js +243 -0
- package/dist/src/mcp/client.js +289 -0
- package/dist/src/mcp/index.js +5 -0
- package/dist/src/mcp/manager.js +113 -0
- package/dist/src/nimbus.js +212 -0
- package/dist/src/plugins/index.js +13 -0
- package/dist/src/plugins/loader.js +280 -0
- package/dist/src/plugins/manager.js +282 -0
- package/dist/src/plugins/types.js +23 -0
- package/dist/src/scanners/cicd-scanner.js +230 -0
- package/dist/src/scanners/cloud-scanner.js +415 -0
- package/dist/src/scanners/framework-scanner.js +430 -0
- package/dist/src/scanners/iac-scanner.js +350 -0
- package/dist/src/scanners/index.js +454 -0
- package/dist/src/scanners/language-scanner.js +258 -0
- package/dist/src/scanners/package-manager-scanner.js +252 -0
- package/dist/src/scanners/types.js +6 -0
- package/dist/src/sessions/manager.js +395 -0
- package/dist/src/sessions/types.js +4 -0
- package/dist/src/sharing/sync.js +238 -0
- package/dist/src/sharing/viewer.js +131 -0
- package/dist/src/snapshots/index.js +1 -0
- package/dist/src/snapshots/manager.js +432 -0
- package/dist/src/state/artifacts.js +94 -0
- package/dist/src/state/audit.js +73 -0
- package/dist/src/state/billing.js +126 -0
- package/dist/src/state/checkpoints.js +81 -0
- package/dist/src/state/config.js +58 -0
- package/dist/src/state/conversations.js +7 -0
- package/dist/src/state/credentials.js +96 -0
- package/dist/src/state/db.js +53 -0
- package/dist/src/state/index.js +23 -0
- package/dist/src/state/messages.js +76 -0
- package/dist/src/state/projects.js +92 -0
- package/dist/src/state/schema.js +233 -0
- package/dist/src/state/sessions.js +79 -0
- package/dist/src/state/teams.js +131 -0
- package/dist/src/telemetry.js +91 -0
- package/dist/src/tools/aws-ops.js +747 -0
- package/dist/src/tools/azure-ops.js +491 -0
- package/dist/src/tools/file-ops.js +451 -0
- package/dist/src/tools/gcp-ops.js +559 -0
- package/dist/src/tools/git-ops.js +557 -0
- package/dist/src/tools/github-ops.js +460 -0
- package/dist/src/tools/helm-ops.js +634 -0
- package/dist/src/tools/index.js +16 -0
- package/dist/src/tools/k8s-ops.js +579 -0
- package/dist/src/tools/schemas/converter.js +129 -0
- package/dist/src/tools/schemas/devops.js +3319 -0
- package/dist/src/tools/schemas/index.js +19 -0
- package/dist/src/tools/schemas/standard.js +966 -0
- package/dist/src/tools/schemas/types.js +409 -0
- package/dist/src/tools/spawn-exec.js +109 -0
- package/dist/src/tools/terraform-ops.js +627 -0
- package/dist/src/types/config.js +1 -0
- package/dist/src/types/drift.js +4 -0
- package/dist/src/types/enterprise.js +5 -0
- package/dist/src/types/index.js +14 -0
- package/dist/src/types/plan.js +1 -0
- package/dist/src/types/request.js +1 -0
- package/dist/src/types/response.js +1 -0
- package/dist/src/types/service.js +1 -0
- package/dist/src/ui/App.js +1672 -0
- package/dist/src/ui/DeployPreview.js +60 -0
- package/dist/src/ui/FileDiffModal.js +108 -0
- package/dist/src/ui/Header.js +46 -0
- package/dist/src/ui/HelpModal.js +9 -0
- package/dist/src/ui/InputBox.js +408 -0
- package/dist/src/ui/MessageList.js +795 -0
- package/dist/src/ui/PermissionPrompt.js +72 -0
- package/dist/src/ui/StatusBar.js +109 -0
- package/dist/src/ui/TerminalPane.js +31 -0
- package/dist/src/ui/ToolCallDisplay.js +303 -0
- package/dist/src/ui/TreePane.js +83 -0
- package/dist/src/ui/chat-ui.js +721 -0
- package/dist/src/ui/index.js +11 -0
- package/dist/src/ui/ink/index.js +1325 -0
- package/dist/src/ui/streaming.js +137 -0
- package/dist/src/ui/theme.js +78 -0
- package/dist/src/ui/types.js +7 -0
- package/dist/src/utils/analytics.js +61 -0
- package/dist/src/utils/cost-warning.js +25 -0
- package/dist/src/utils/env.js +42 -0
- package/dist/src/utils/errors.js +54 -0
- package/dist/src/utils/event-bus.js +22 -0
- package/dist/src/utils/index.js +16 -0
- package/dist/src/utils/logger.js +150 -0
- package/dist/src/utils/rate-limiter.js +90 -0
- package/dist/src/utils/service-auth.js +36 -0
- package/dist/src/utils/validation.js +39 -0
- package/dist/src/version.js +3 -0
- package/dist/src/watcher/index.js +192 -0
- package/dist/src/wizard/approval.js +275 -0
- package/dist/src/wizard/index.js +13 -0
- package/dist/src/wizard/prompts.js +273 -0
- package/dist/src/wizard/types.js +4 -0
- package/dist/src/wizard/ui.js +453 -0
- package/dist/src/wizard/wizard.js +227 -0
- package/package.json +31 -23
- package/src/__tests__/alias.test.ts +133 -0
- package/src/__tests__/app.test.ts +1 -1
- package/src/__tests__/audit.test.ts +1 -1
- package/src/__tests__/circuit-breaker.test.ts +1 -1
- package/src/__tests__/cli-run.test.ts +237 -1
- package/src/__tests__/compat-sqlite.test.ts +68 -0
- package/src/__tests__/context-manager.test.ts +131 -1
- package/src/__tests__/context.test.ts +1 -1
- package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
- package/src/__tests__/doctor.test.ts +48 -0
- package/src/__tests__/enterprise.test.ts +1 -1
- package/src/__tests__/export.test.ts +236 -0
- package/src/__tests__/gap-11-18-20.test.ts +958 -0
- package/src/__tests__/generator.test.ts +1 -1
- package/src/__tests__/helm-streaming.test.ts +127 -0
- package/src/__tests__/hooks.test.ts +1 -1
- package/src/__tests__/incident.test.ts +179 -0
- package/src/__tests__/init.test.ts +55 -4
- package/src/__tests__/intent-parser.test.ts +1 -1
- package/src/__tests__/llm-router.test.ts +1 -1
- package/src/__tests__/logs.test.ts +107 -0
- package/src/__tests__/loop-errors.test.ts +244 -0
- package/src/__tests__/lsp.test.ts +1 -1
- package/src/__tests__/modes.test.ts +1 -1
- package/src/__tests__/perf-optimizations.test.ts +847 -0
- package/src/__tests__/permissions.test.ts +1 -1
- package/src/__tests__/pipeline.test.ts +50 -0
- package/src/__tests__/polish-phase3.test.ts +340 -0
- package/src/__tests__/profile.test.ts +237 -0
- package/src/__tests__/rollback.test.ts +83 -0
- package/src/__tests__/runbook.test.ts +219 -0
- package/src/__tests__/schedule.test.ts +206 -0
- package/src/__tests__/serve.test.ts +1 -1
- package/src/__tests__/sessions.test.ts +96 -1
- package/src/__tests__/sharing.test.ts +53 -1
- package/src/__tests__/snapshots.test.ts +1 -1
- package/src/__tests__/standalone-migration.test.ts +199 -0
- package/src/__tests__/state-db.test.ts +1 -1
- package/src/__tests__/status.test.ts +158 -0
- package/src/__tests__/stream-with-tools.test.ts +71 -25
- package/src/__tests__/subagents.test.ts +1 -1
- package/src/__tests__/system-prompt.test.ts +82 -3
- package/src/__tests__/terminal-gap-v2.test.ts +395 -0
- package/src/__tests__/terminal-parity.test.ts +393 -0
- package/src/__tests__/tf-apply.test.ts +187 -0
- package/src/__tests__/tool-converter.test.ts +1 -1
- package/src/__tests__/tool-schemas.test.ts +209 -4
- package/src/__tests__/tools.test.ts +4 -3
- package/src/__tests__/version-json.test.ts +184 -0
- package/src/__tests__/version.test.ts +1 -1
- package/src/__tests__/watch.test.ts +129 -0
- package/src/agent/compaction-agent.ts +40 -1
- package/src/agent/context-manager.ts +67 -3
- package/src/agent/deploy-preview.ts +62 -1
- package/src/agent/expand-files.ts +108 -0
- package/src/agent/loop.ts +1312 -31
- package/src/agent/permissions.ts +51 -4
- package/src/agent/system-prompt.ts +573 -19
- package/src/app.ts +58 -0
- package/src/audit/security-scanner.ts +45 -0
- package/src/auth/keychain.ts +82 -0
- package/src/auth/oauth.ts +15 -5
- package/src/cli/init.ts +378 -5
- package/src/cli/run.ts +407 -16
- package/src/cli/serve.ts +78 -1
- package/src/cli/web.ts +10 -6
- package/src/cli.ts +312 -1
- package/src/clients/service-discovery.ts +30 -25
- package/src/commands/alias.ts +100 -0
- package/src/commands/audit/index.ts +121 -2
- package/src/commands/auth-cloud.ts +113 -0
- package/src/commands/auth-refresh.ts +187 -0
- package/src/commands/aws-discover.ts +144 -251
- package/src/commands/aws-terraform.ts +68 -118
- package/src/commands/chat.ts +9 -3
- package/src/commands/completions.ts +268 -0
- package/src/commands/config.ts +26 -0
- package/src/commands/cost/index.ts +218 -2
- package/src/commands/deploy.ts +260 -0
- package/src/commands/doctor.ts +744 -152
- package/src/commands/drift/index.ts +371 -23
- package/src/commands/export.ts +146 -0
- package/src/commands/generate-k8s.ts +9 -61
- package/src/commands/generate-terraform.ts +191 -449
- package/src/commands/help.ts +212 -36
- package/src/commands/history.ts +8 -1
- package/src/commands/incident.ts +166 -0
- package/src/commands/init.ts +5 -0
- package/src/commands/login.ts +86 -1
- package/src/commands/logs.ts +167 -0
- package/src/commands/onboarding.ts +211 -34
- package/src/commands/pipeline.ts +186 -0
- package/src/commands/plugin.ts +398 -0
- package/src/commands/profile.ts +342 -0
- package/src/commands/questionnaire.ts +0 -98
- package/src/commands/resume.ts +26 -34
- package/src/commands/rollback.ts +315 -0
- package/src/commands/rollout.ts +88 -0
- package/src/commands/runbook.ts +346 -0
- package/src/commands/schedule.ts +236 -0
- package/src/commands/status.ts +252 -0
- package/src/commands/team-context.ts +220 -0
- package/src/commands/template.ts +58 -57
- package/src/commands/tf/index.ts +70 -11
- package/src/commands/upgrade.ts +57 -0
- package/src/commands/version.ts +54 -50
- package/src/commands/watch.ts +153 -0
- package/src/compat/runtime.ts +1 -1
- package/src/compat/sqlite.ts +75 -5
- package/src/config/mode-store.ts +62 -0
- package/src/config/profiles.ts +84 -0
- package/src/config/types.ts +83 -1
- package/src/config/workspace-state.ts +53 -0
- package/src/engine/cost-estimator.ts +52 -10
- package/src/engine/executor.ts +33 -2
- package/src/engine/planner.ts +68 -1
- package/src/generator/terraform.ts +8 -0
- package/src/history/manager.ts +2 -74
- package/src/hooks/engine.ts +5 -4
- package/src/llm/cost-calculator.ts +2 -2
- package/src/llm/providers/anthropic.ts +50 -21
- package/src/llm/router.ts +76 -7
- package/src/lsp/languages.ts +3 -0
- package/src/lsp/manager.ts +21 -5
- package/src/nimbus.ts +37 -18
- package/src/sessions/manager.ts +108 -1
- package/src/sharing/sync.ts +4 -0
- package/src/sharing/viewer.ts +66 -0
- package/src/tools/file-ops.ts +22 -0
- package/src/tools/schemas/devops.ts +3007 -117
- package/src/tools/schemas/standard.ts +5 -1
- package/src/tools/schemas/types.ts +31 -1
- package/src/tools/spawn-exec.ts +148 -0
- package/src/ui/App.tsx +1183 -66
- package/src/ui/DeployPreview.tsx +62 -57
- package/src/ui/FileDiffModal.tsx +162 -0
- package/src/ui/Header.tsx +87 -24
- package/src/ui/HelpModal.tsx +57 -0
- package/src/ui/InputBox.tsx +163 -10
- package/src/ui/MessageList.tsx +487 -40
- package/src/ui/PermissionPrompt.tsx +17 -5
- package/src/ui/StatusBar.tsx +122 -3
- package/src/ui/TerminalPane.tsx +84 -0
- package/src/ui/ToolCallDisplay.tsx +252 -18
- package/src/ui/TreePane.tsx +132 -0
- package/src/ui/chat-ui.ts +41 -44
- package/src/ui/ink/index.ts +771 -38
- package/src/ui/streaming.ts +1 -1
- package/src/ui/theme.ts +104 -0
- package/src/ui/types.ts +18 -0
- package/src/version.ts +1 -1
- package/src/watcher/index.ts +66 -15
- package/src/wizard/types.ts +1 -0
- package/src/wizard/ui.ts +1 -1
- package/tsconfig.json +2 -2
package/src/cli.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { analytics } from './utils';
|
|
8
|
+
import { VERSION } from './version';
|
|
8
9
|
import {
|
|
9
10
|
generateTerraformCommand,
|
|
10
11
|
type GenerateTerraformOptions,
|
|
@@ -103,6 +104,9 @@ import {
|
|
|
103
104
|
authProfileCommand,
|
|
104
105
|
} from './commands';
|
|
105
106
|
import { upgradeCommand, type UpgradeOptions } from './commands/upgrade';
|
|
107
|
+
import { statusCommand, type StatusOptions } from './commands/status';
|
|
108
|
+
import { rollbackCommand, type RollbackOptions } from './commands/rollback';
|
|
109
|
+
import { rolloutCommand, type RolloutOptions } from './commands/rollout';
|
|
106
110
|
import { requiresAuth, type LLMProviderName } from './auth';
|
|
107
111
|
|
|
108
112
|
/** Top-level command aliases for convenience shortcuts. */
|
|
@@ -120,6 +124,47 @@ const COMMAND_ALIASES: Record<string, string[]> = {
|
|
|
120
124
|
h: ['helm'],
|
|
121
125
|
};
|
|
122
126
|
|
|
127
|
+
async function showSubcommandHelp(command: string, _args: string[]): Promise<void> {
|
|
128
|
+
const { helpCommand } = await import('./commands/help');
|
|
129
|
+
// Print command-specific help based on command name
|
|
130
|
+
const COMMAND_HELP: Record<string, string> = {
|
|
131
|
+
chat: 'Usage: nimbus chat [--model <model>] [--mode plan|build|deploy] [--continue]\n Start interactive AI chat session.',
|
|
132
|
+
run: 'Usage: nimbus run "<prompt>" [--auto-approve] [--format json|text] [--model <model>]\n Run a non-interactive agent task.',
|
|
133
|
+
init: 'Usage: nimbus init [--cwd <dir>] [--quiet]\n Generate NIMBUS.md with detected project context.',
|
|
134
|
+
login: 'Usage: nimbus login [--provider <name>]\n Configure LLM provider credentials.',
|
|
135
|
+
logout: 'Usage: nimbus logout [--provider <name>]\n Remove stored credentials.',
|
|
136
|
+
doctor: 'Usage: nimbus doctor [--fix] [--verbose] [--json] [--metrics]\n Run diagnostic checks on Nimbus installation.',
|
|
137
|
+
cost: 'Usage: nimbus cost [--days <n>] [--json]\n Show LLM usage costs.',
|
|
138
|
+
sessions: 'Usage: nimbus sessions [list|resume|delete] [<id>]\n Manage chat sessions.',
|
|
139
|
+
audit: 'Usage: nimbus audit [--format json|text]\n Run security and compliance audit.',
|
|
140
|
+
share: 'Usage: nimbus share [--session <id>] [--ttl <hours>]\n Share a session.',
|
|
141
|
+
upgrade: 'Usage: nimbus upgrade\n Upgrade Nimbus to the latest version.',
|
|
142
|
+
serve: 'Usage: nimbus serve [--port <port>] [--auth <user:pass>]\n Start HTTP API server with SSE streaming.',
|
|
143
|
+
web: 'Usage: nimbus web [--port <port>]\n Open Web UI in browser.',
|
|
144
|
+
'auth-refresh': 'Usage: nimbus auth-refresh [--provider aws|gcp|azure]\n Refresh cloud provider credentials.',
|
|
145
|
+
completions: 'Usage: nimbus completions <install|uninstall>\n Manage shell tab completions.',
|
|
146
|
+
alias: 'Usage: nimbus alias <list|create|remove> [<name>] [<expansion>]\n Manage command aliases.',
|
|
147
|
+
logs: 'Usage: nimbus logs [--tail <n>] [--follow] [--namespace <ns>]\n Stream Kubernetes/cloud logs.',
|
|
148
|
+
pipeline: 'Usage: nimbus pipeline [list|trigger|status] [<args>]\n Manage CI/CD pipelines.',
|
|
149
|
+
drift: 'Usage: nimbus drift [--notify slack|email]\n Detect infrastructure drift.',
|
|
150
|
+
deploy: 'Usage: nimbus deploy [--auto-approve] [--workspace <ws>] [--namespace <ns>] [--dry-run] [--no-apply]\n Orchestrate full terraform plan + apply + kubectl rollout workflow.',
|
|
151
|
+
rollback: 'Usage: nimbus rollback [<resource>] [--dry-run]\n Safely roll back infrastructure.',
|
|
152
|
+
profile: 'Usage: nimbus profile <name>\n Set AWS_PROFILE for current session.',
|
|
153
|
+
schedule: 'Usage: nimbus schedule [list|add|remove] [<args>]\n Manage scheduled agent tasks.',
|
|
154
|
+
incident: 'Usage: nimbus incident [create|list|update] [<args>]\n Manage incidents.',
|
|
155
|
+
status: 'Usage: nimbus status [--json]\n Show Nimbus and infra status.',
|
|
156
|
+
export: 'Usage: nimbus export [--session <id>] [--output <file>]\n Export session as Markdown runbook.',
|
|
157
|
+
plugin: 'Usage: nimbus plugin <install|uninstall|list> [<name>]\n Manage MCP plugins.',
|
|
158
|
+
runbook: 'Usage: nimbus runbook <file> [--dry-run]\n Execute a runbook YAML file.',
|
|
159
|
+
};
|
|
160
|
+
const help = COMMAND_HELP[command];
|
|
161
|
+
if (help) {
|
|
162
|
+
process.stdout.write(help + '\n');
|
|
163
|
+
} else {
|
|
164
|
+
await helpCommand({});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
123
168
|
/**
|
|
124
169
|
* Run a CLI command directly.
|
|
125
170
|
*
|
|
@@ -133,9 +178,32 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
133
178
|
args = [...COMMAND_ALIASES[args[0]], ...args.slice(1)];
|
|
134
179
|
}
|
|
135
180
|
|
|
181
|
+
// --profile <name> global flag: load and apply a named config profile before
|
|
182
|
+
// dispatching to the subcommand. Non-critical — errors are silently swallowed.
|
|
183
|
+
const profileIdx = args.indexOf('--profile');
|
|
184
|
+
if (profileIdx !== -1 && args[profileIdx + 1]) {
|
|
185
|
+
const profileName = args[profileIdx + 1];
|
|
186
|
+
try {
|
|
187
|
+
const { loadProfile, applyProfile } = await import('./config/profiles');
|
|
188
|
+
const profile = loadProfile(profileName);
|
|
189
|
+
if (profile) {
|
|
190
|
+
applyProfile(profile);
|
|
191
|
+
} else {
|
|
192
|
+
process.stderr.write(`Profile not found: ${profileName}\n`);
|
|
193
|
+
}
|
|
194
|
+
} catch { /* non-critical */ }
|
|
195
|
+
args = [...args.slice(0, profileIdx), ...args.slice(profileIdx + 2)];
|
|
196
|
+
}
|
|
197
|
+
|
|
136
198
|
const command = args[0];
|
|
137
199
|
const subcommand = args[1];
|
|
138
200
|
|
|
201
|
+
// GAP-15: --help/-h flag on any subcommand
|
|
202
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
203
|
+
await showSubcommandHelp(command, args);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
139
207
|
// Fire-and-forget analytics tracking for every CLI command invocation.
|
|
140
208
|
// This is a no-op when POSTHOG_API_KEY is not set.
|
|
141
209
|
const commandName =
|
|
@@ -148,6 +216,17 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
148
216
|
|
|
149
217
|
// nimbus login
|
|
150
218
|
if (command === 'login') {
|
|
219
|
+
// G8: --cloud <provider> flag for cloud provider login
|
|
220
|
+
const cloudIdx = args.findIndex(a => a === '--cloud');
|
|
221
|
+
if (cloudIdx !== -1 && args[cloudIdx + 1]) {
|
|
222
|
+
const cloudProvider = args[cloudIdx + 1] as 'aws' | 'gcp' | 'azure';
|
|
223
|
+
if (['aws', 'gcp', 'azure'].includes(cloudProvider)) {
|
|
224
|
+
const { loginCloudCommand } = await import('./commands/login');
|
|
225
|
+
await loginCloudCommand(cloudProvider);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
151
230
|
const options: LoginOptions = {};
|
|
152
231
|
|
|
153
232
|
for (let i = 1; i < args.length; i++) {
|
|
@@ -319,6 +398,10 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
319
398
|
options.force = true;
|
|
320
399
|
} else if (arg === '--check' || arg === '-c') {
|
|
321
400
|
options.check = true;
|
|
401
|
+
} else if (arg === '--dry-run') {
|
|
402
|
+
options.dryRun = true;
|
|
403
|
+
} else if (arg === '--changelog') {
|
|
404
|
+
options.changelog = true;
|
|
322
405
|
}
|
|
323
406
|
}
|
|
324
407
|
|
|
@@ -343,6 +426,8 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
343
426
|
options.output = args[++i];
|
|
344
427
|
} else if (arg === '--non-interactive') {
|
|
345
428
|
options.nonInteractive = true;
|
|
429
|
+
} else if (arg === '--merge') {
|
|
430
|
+
options.merge = true;
|
|
346
431
|
}
|
|
347
432
|
}
|
|
348
433
|
|
|
@@ -353,7 +438,14 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
353
438
|
// nimbus serve — headless API server (no auth guard)
|
|
354
439
|
if (command === 'serve') {
|
|
355
440
|
const { serveCommand } = await import('./cli/serve');
|
|
356
|
-
const serveOptions: { port?: number; host?: string; auth?: string } = {};
|
|
441
|
+
const serveOptions: { port?: number; host?: string; auth?: string; background?: boolean; stop?: boolean } = {};
|
|
442
|
+
|
|
443
|
+
// M1: nimbus serve stop
|
|
444
|
+
if (subcommand === 'stop') {
|
|
445
|
+
serveOptions.stop = true;
|
|
446
|
+
await serveCommand(serveOptions);
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
357
449
|
|
|
358
450
|
for (let i = 1; i < args.length; i++) {
|
|
359
451
|
const arg = args[i];
|
|
@@ -364,6 +456,8 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
364
456
|
serveOptions.host = args[++i];
|
|
365
457
|
} else if (arg === '--auth' && args[i + 1]) {
|
|
366
458
|
serveOptions.auth = args[++i];
|
|
459
|
+
} else if (arg === '--background' || arg === '-b') {
|
|
460
|
+
serveOptions.background = true;
|
|
367
461
|
}
|
|
368
462
|
}
|
|
369
463
|
|
|
@@ -379,10 +473,69 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
379
473
|
host: args.includes('--host') ? args[args.indexOf('--host') + 1] : undefined,
|
|
380
474
|
auth: args.includes('--auth') ? args[args.indexOf('--auth') + 1] : undefined,
|
|
381
475
|
uiUrl: args.includes('--ui-url') ? args[args.indexOf('--ui-url') + 1] : undefined,
|
|
476
|
+
noOpen: args.includes('--no-open'),
|
|
382
477
|
});
|
|
383
478
|
return;
|
|
384
479
|
}
|
|
385
480
|
|
|
481
|
+
// nimbus logs <pod> — H1 shorthand
|
|
482
|
+
if (command === 'logs') {
|
|
483
|
+
const { logsCommand, parseLogsArgs } = await import('./commands/logs');
|
|
484
|
+
const { pod, options: logsOpts } = parseLogsArgs(args.slice(1));
|
|
485
|
+
await logsCommand(pod, logsOpts);
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// nimbus pipeline [subcommand] — H2
|
|
490
|
+
if (command === 'pipeline') {
|
|
491
|
+
const { pipelineCommand } = await import('./commands/pipeline');
|
|
492
|
+
await pipelineCommand(subcommand || 'status', args.slice(2));
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// nimbus alias — L2
|
|
497
|
+
if (command === 'alias') {
|
|
498
|
+
const { aliasCommand } = await import('./commands/alias');
|
|
499
|
+
await aliasCommand(subcommand || 'list', args.slice(2));
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// nimbus incident <url-or-id> [--notes "..."] — G14
|
|
504
|
+
if (command === 'incident') {
|
|
505
|
+
const { incidentCommand } = await import('./commands/incident');
|
|
506
|
+
const incidentInput = args[1] ?? '';
|
|
507
|
+
const notesIdx = args.indexOf('--notes');
|
|
508
|
+
const notes = notesIdx !== -1 ? args[notesIdx + 1] : undefined;
|
|
509
|
+
await incidentCommand(incidentInput, { notes });
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// nimbus runbook <list|run|create> — G15
|
|
514
|
+
if (command === 'runbook') {
|
|
515
|
+
const { runbookCommand } = await import('./commands/runbook');
|
|
516
|
+
await runbookCommand(subcommand || 'list', args.slice(2));
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// nimbus schedule <list|add|remove|run-now> — G13
|
|
521
|
+
if (command === 'schedule') {
|
|
522
|
+
const { scheduleCommand } = await import('./commands/schedule');
|
|
523
|
+
await scheduleCommand(subcommand || 'list', args.slice(2));
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// nimbus export [session-id] [--format md|html|json] [--output file] — G19
|
|
528
|
+
if (command === 'export') {
|
|
529
|
+
const { exportCommand } = await import('./commands/export');
|
|
530
|
+
const formatIdx = args.indexOf('--format');
|
|
531
|
+
const format = formatIdx !== -1 ? (args[formatIdx + 1] as 'md' | 'html' | 'json') : 'md';
|
|
532
|
+
const outputIdx = args.indexOf('--output');
|
|
533
|
+
const output = outputIdx !== -1 ? args[outputIdx + 1] : undefined;
|
|
534
|
+
const sessionId = args.slice(1).find(a => !a.startsWith('-') && a !== args[formatIdx + 1] && a !== args[outputIdx + 1]);
|
|
535
|
+
await exportCommand({ format, output, sessionId });
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
|
|
386
539
|
// ==========================================
|
|
387
540
|
// Auth guard - check authentication for other commands
|
|
388
541
|
// ==========================================
|
|
@@ -946,6 +1099,10 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
946
1099
|
|
|
947
1100
|
// nimbus tf <subcommand>
|
|
948
1101
|
if (command === 'tf') {
|
|
1102
|
+
if (subcommand === '--version' || subcommand === '-v') {
|
|
1103
|
+
console.log(`nimbus ${VERSION}`);
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
949
1106
|
if (!subcommand) {
|
|
950
1107
|
console.error('Usage: nimbus tf <subcommand>');
|
|
951
1108
|
console.log('');
|
|
@@ -969,6 +1126,10 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
969
1126
|
|
|
970
1127
|
// nimbus k8s <subcommand>
|
|
971
1128
|
if (command === 'k8s') {
|
|
1129
|
+
if (subcommand === '--version' || subcommand === '-v') {
|
|
1130
|
+
console.log(`nimbus ${VERSION}`);
|
|
1131
|
+
return;
|
|
1132
|
+
}
|
|
972
1133
|
if (!subcommand) {
|
|
973
1134
|
console.error('Usage: nimbus k8s <subcommand>');
|
|
974
1135
|
console.log('');
|
|
@@ -990,6 +1151,10 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
990
1151
|
|
|
991
1152
|
// nimbus helm <subcommand>
|
|
992
1153
|
if (command === 'helm') {
|
|
1154
|
+
if (subcommand === '--version' || subcommand === '-v') {
|
|
1155
|
+
console.log(`nimbus ${VERSION}`);
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
993
1158
|
if (!subcommand) {
|
|
994
1159
|
console.error('Usage: nimbus helm <subcommand>');
|
|
995
1160
|
console.log('');
|
|
@@ -1133,6 +1298,12 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
1133
1298
|
return;
|
|
1134
1299
|
}
|
|
1135
1300
|
|
|
1301
|
+
// nimbus diff — top-level alias for nimbus fs diff (M1)
|
|
1302
|
+
if (command === 'diff') {
|
|
1303
|
+
await fsCommand('diff', args.slice(1));
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1136
1307
|
// nimbus fs <subcommand>
|
|
1137
1308
|
if (command === 'fs' || command === 'files') {
|
|
1138
1309
|
if (!subcommand) {
|
|
@@ -1278,6 +1449,145 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
1278
1449
|
return;
|
|
1279
1450
|
}
|
|
1280
1451
|
|
|
1452
|
+
// nimbus watch <glob> --run "prompt" (M3)
|
|
1453
|
+
if (command === 'watch') {
|
|
1454
|
+
const { watchCommand } = await import('./commands/watch');
|
|
1455
|
+
const watchOptions: import('./commands/watch').WatchOptions = { glob: subcommand ?? '' };
|
|
1456
|
+
for (let i = 1; i < args.length; i++) {
|
|
1457
|
+
const arg = args[i];
|
|
1458
|
+
if (arg === '--run' && args[i + 1]) {
|
|
1459
|
+
watchOptions.run = args[++i];
|
|
1460
|
+
} else if (arg === '--debounce' && args[i + 1]) {
|
|
1461
|
+
watchOptions.debounce = parseInt(args[++i], 10);
|
|
1462
|
+
} else if (arg === '--auto-approve' || arg === '-y') {
|
|
1463
|
+
watchOptions.autoApprove = true;
|
|
1464
|
+
} else if (arg === '--max-runs' && args[i + 1]) {
|
|
1465
|
+
watchOptions.maxRuns = parseInt(args[++i], 10);
|
|
1466
|
+
} else if (!arg.startsWith('--') && !watchOptions.glob) {
|
|
1467
|
+
watchOptions.glob = arg;
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1470
|
+
await watchCommand(watchOptions);
|
|
1471
|
+
return;
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
// nimbus whoami — shorthand for auth status (H5)
|
|
1475
|
+
if (command === 'whoami') {
|
|
1476
|
+
await authStatusCommand({});
|
|
1477
|
+
return;
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
// nimbus auth-refresh [--provider aws|gcp|azure]
|
|
1481
|
+
if (command === 'auth-refresh') {
|
|
1482
|
+
const { authRefreshCommand } = await import('./commands/auth-refresh');
|
|
1483
|
+
const refreshOptions: { provider?: 'aws' | 'gcp' | 'azure' | 'all' } = {};
|
|
1484
|
+
|
|
1485
|
+
for (let i = 1; i < args.length; i++) {
|
|
1486
|
+
const arg = args[i];
|
|
1487
|
+
if (arg === '--provider' && args[i + 1]) {
|
|
1488
|
+
refreshOptions.provider = args[++i] as 'aws' | 'gcp' | 'azure' | 'all';
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
await authRefreshCommand(refreshOptions);
|
|
1493
|
+
return;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
// nimbus plugin <list|add|remove|init> (L3)
|
|
1497
|
+
if (command === 'plugin') {
|
|
1498
|
+
const { pluginCommand } = await import('./commands/plugin');
|
|
1499
|
+
await pluginCommand(subcommand ?? 'list', args.slice(2));
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
// nimbus mcp <list|add|remove|test> (M5) — MCP server management
|
|
1504
|
+
if (command === 'mcp') {
|
|
1505
|
+
const { mcpCommand } = await import('./commands/plugin');
|
|
1506
|
+
await mcpCommand(subcommand ?? 'list', args.slice(2));
|
|
1507
|
+
return;
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
// nimbus completions <install|uninstall> (L7)
|
|
1511
|
+
if (command === 'completions') {
|
|
1512
|
+
const { completionsCommand } = await import('./commands/completions');
|
|
1513
|
+
await completionsCommand(subcommand ?? 'install');
|
|
1514
|
+
return;
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
// nimbus team-context <push|pull> (L6)
|
|
1518
|
+
if (command === 'team-context') {
|
|
1519
|
+
const { teamContextCommand } = await import('./commands/team-context');
|
|
1520
|
+
await teamContextCommand(subcommand ?? 'push', args.slice(2));
|
|
1521
|
+
return;
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
// nimbus profile <list|create|set|delete|show> (H1)
|
|
1525
|
+
if (command === 'profile') {
|
|
1526
|
+
const { profileCommand } = await import('./commands/profile');
|
|
1527
|
+
await profileCommand(subcommand ?? 'list', args.slice(2));
|
|
1528
|
+
return;
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
// nimbus status — infrastructure status dashboard (G18)
|
|
1532
|
+
if (command === 'status') {
|
|
1533
|
+
const statusOptions: StatusOptions = {};
|
|
1534
|
+
for (let i = 1; i < args.length; i++) {
|
|
1535
|
+
if (args[i] === '--json') statusOptions.json = true;
|
|
1536
|
+
}
|
|
1537
|
+
await statusCommand(statusOptions);
|
|
1538
|
+
return;
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
// nimbus context — full context snapshot (L3): alias for status with verbose details
|
|
1542
|
+
if (command === 'context') {
|
|
1543
|
+
const contextOptions: StatusOptions = { verbose: true };
|
|
1544
|
+
for (let i = 1; i < args.length; i++) {
|
|
1545
|
+
if (args[i] === '--json') contextOptions.json = true;
|
|
1546
|
+
}
|
|
1547
|
+
await statusCommand(contextOptions);
|
|
1548
|
+
return;
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
// nimbus rollout — watch Kubernetes deployment rollout (L1)
|
|
1552
|
+
if (command === 'rollout') {
|
|
1553
|
+
const deployment = args[0];
|
|
1554
|
+
if (!deployment) {
|
|
1555
|
+
console.error('Usage: nimbus rollout <deployment> [--namespace <ns>] [--timeout <duration>]');
|
|
1556
|
+
process.exit(1);
|
|
1557
|
+
}
|
|
1558
|
+
const rolloutOptions: RolloutOptions = { deployment };
|
|
1559
|
+
for (let i = 1; i < args.length; i++) {
|
|
1560
|
+
const arg = args[i];
|
|
1561
|
+
if ((arg === '--namespace' || arg === '-n') && args[i + 1]) rolloutOptions.namespace = args[++i];
|
|
1562
|
+
else if (arg === '--timeout' && args[i + 1]) rolloutOptions.timeout = args[++i];
|
|
1563
|
+
}
|
|
1564
|
+
await rolloutCommand(rolloutOptions);
|
|
1565
|
+
return;
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
// nimbus rollback — guided infrastructure rollback (G20)
|
|
1569
|
+
if (command === 'rollback') {
|
|
1570
|
+
const rollbackOptions: RollbackOptions = {};
|
|
1571
|
+
for (let i = 1; i < args.length; i++) {
|
|
1572
|
+
const arg = args[i];
|
|
1573
|
+
if (arg === '--helm' && args[i + 1]) rollbackOptions.helm = args[++i];
|
|
1574
|
+
else if (arg === '--k8s' && args[i + 1]) rollbackOptions.k8s = args[++i];
|
|
1575
|
+
else if (arg === '--namespace' && args[i + 1]) rollbackOptions.namespace = args[++i];
|
|
1576
|
+
else if (arg === '--tf') rollbackOptions.tf = true;
|
|
1577
|
+
else if (arg === '--terraform') rollbackOptions.terraform = true;
|
|
1578
|
+
else if (arg === '--tf-dir' && args[i + 1]) rollbackOptions.tfDir = args[++i];
|
|
1579
|
+
}
|
|
1580
|
+
await rollbackCommand(rollbackOptions);
|
|
1581
|
+
return;
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1584
|
+
// nimbus deploy — orchestrate full terraform + kubectl deployment workflow (C1)
|
|
1585
|
+
if (command === 'deploy') {
|
|
1586
|
+
const { deployCommand } = await import('./commands/deploy');
|
|
1587
|
+
await deployCommand(args.slice(1));
|
|
1588
|
+
return;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1281
1591
|
// Unknown command
|
|
1282
1592
|
console.error(`Unknown command: ${command} ${subcommand || ''}`);
|
|
1283
1593
|
console.log('');
|
|
@@ -1306,6 +1616,7 @@ export async function runCommand(args: string[]): Promise<void> {
|
|
|
1306
1616
|
console.log(' nimbus logout - Clear all credentials');
|
|
1307
1617
|
console.log(' nimbus auth status - Show current authentication status');
|
|
1308
1618
|
console.log(' nimbus auth list - List all available providers');
|
|
1619
|
+
console.log(' nimbus auth-refresh - Re-validate and refresh cloud credentials');
|
|
1309
1620
|
console.log('');
|
|
1310
1621
|
console.log(' Infrastructure Generation:');
|
|
1311
1622
|
console.log(
|
|
@@ -1,33 +1,38 @@
|
|
|
1
|
-
import { getEnv } from '../utils';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
* Service Discovery
|
|
5
|
-
*
|
|
2
|
+
* Service Discovery (stub)
|
|
3
|
+
*
|
|
4
|
+
* Previously held URLs for 18 microservices. Nimbus is now a standalone binary —
|
|
5
|
+
* all services run in-process. These constants are kept for legacy import
|
|
6
|
+
* compatibility only. No HTTP services listen on these ports.
|
|
6
7
|
*/
|
|
7
8
|
|
|
9
|
+
function getEnvOrDefault(key: string, defaultVal: string): string {
|
|
10
|
+
return process.env[key] ?? defaultVal;
|
|
11
|
+
}
|
|
12
|
+
|
|
8
13
|
export const ServiceURLs = {
|
|
9
|
-
CLI:
|
|
10
|
-
CORE_ENGINE:
|
|
11
|
-
LLM:
|
|
12
|
-
GENERATOR:
|
|
13
|
-
GIT_TOOLS:
|
|
14
|
-
FS_TOOLS:
|
|
15
|
-
TERRAFORM_TOOLS:
|
|
16
|
-
K8S_TOOLS:
|
|
17
|
-
HELM_TOOLS:
|
|
18
|
-
AWS_TOOLS:
|
|
19
|
-
GITHUB_TOOLS:
|
|
20
|
-
STATE:
|
|
21
|
-
AUTH:
|
|
22
|
-
TEAM:
|
|
23
|
-
BILLING:
|
|
24
|
-
AUDIT:
|
|
25
|
-
GCP_TOOLS:
|
|
26
|
-
AZURE_TOOLS:
|
|
14
|
+
CLI: getEnvOrDefault('CLI_SERVICE_URL', 'http://localhost:3000'),
|
|
15
|
+
CORE_ENGINE: getEnvOrDefault('CORE_ENGINE_SERVICE_URL', 'http://localhost:3001'),
|
|
16
|
+
LLM: getEnvOrDefault('LLM_SERVICE_URL', 'http://localhost:3002'),
|
|
17
|
+
GENERATOR: getEnvOrDefault('GENERATOR_SERVICE_URL', 'http://localhost:3003'),
|
|
18
|
+
GIT_TOOLS: getEnvOrDefault('GIT_TOOLS_SERVICE_URL', 'http://localhost:3004'),
|
|
19
|
+
FS_TOOLS: getEnvOrDefault('FS_TOOLS_SERVICE_URL', 'http://localhost:3005'),
|
|
20
|
+
TERRAFORM_TOOLS: getEnvOrDefault('TERRAFORM_TOOLS_SERVICE_URL', 'http://localhost:3006'),
|
|
21
|
+
K8S_TOOLS: getEnvOrDefault('K8S_TOOLS_SERVICE_URL', 'http://localhost:3007'),
|
|
22
|
+
HELM_TOOLS: getEnvOrDefault('HELM_TOOLS_SERVICE_URL', 'http://localhost:3008'),
|
|
23
|
+
AWS_TOOLS: getEnvOrDefault('AWS_TOOLS_SERVICE_URL', 'http://localhost:3009'),
|
|
24
|
+
GITHUB_TOOLS: getEnvOrDefault('GITHUB_TOOLS_SERVICE_URL', 'http://localhost:3010'),
|
|
25
|
+
STATE: getEnvOrDefault('STATE_SERVICE_URL', 'http://localhost:3011'),
|
|
26
|
+
AUTH: getEnvOrDefault('AUTH_SERVICE_URL', 'http://localhost:3012'),
|
|
27
|
+
TEAM: getEnvOrDefault('TEAM_SERVICE_URL', 'http://localhost:3013'),
|
|
28
|
+
BILLING: getEnvOrDefault('BILLING_SERVICE_URL', 'http://localhost:3014'),
|
|
29
|
+
AUDIT: getEnvOrDefault('AUDIT_SERVICE_URL', 'http://localhost:3015'),
|
|
30
|
+
GCP_TOOLS: getEnvOrDefault('GCP_TOOLS_URL', 'http://localhost:3016'),
|
|
31
|
+
AZURE_TOOLS: getEnvOrDefault('AZURE_TOOLS_URL', 'http://localhost:3017'),
|
|
27
32
|
} as const;
|
|
28
33
|
|
|
29
34
|
export const WebSocketURLs = {
|
|
30
|
-
CORE_ENGINE:
|
|
31
|
-
LLM:
|
|
32
|
-
GENERATOR:
|
|
35
|
+
CORE_ENGINE: getEnvOrDefault('CORE_ENGINE_WS_URL', 'ws://localhost:3101'),
|
|
36
|
+
LLM: getEnvOrDefault('LLM_WS_URL', 'ws://localhost:3102'),
|
|
37
|
+
GENERATOR: getEnvOrDefault('GENERATOR_WS_URL', 'ws://localhost:3103'),
|
|
33
38
|
} as const;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alias Command — L2
|
|
3
|
+
*
|
|
4
|
+
* Create, list, and remove command aliases stored in ~/.nimbus/aliases.json.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* nimbus alias deploy=run --auto-approve "deploy staging"
|
|
8
|
+
* nimbus alias list
|
|
9
|
+
* nimbus alias remove deploy
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import { ui } from '../wizard/ui';
|
|
16
|
+
|
|
17
|
+
const ALIASES_FILE = path.join(os.homedir(), '.nimbus', 'aliases.json');
|
|
18
|
+
|
|
19
|
+
function loadAliases(): Record<string, string> {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(fs.readFileSync(ALIASES_FILE, 'utf-8')) as Record<string, string>;
|
|
22
|
+
} catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function saveAliases(aliases: Record<string, string>): void {
|
|
28
|
+
const dir = path.dirname(ALIASES_FILE);
|
|
29
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
+
fs.writeFileSync(ALIASES_FILE, JSON.stringify(aliases, null, 2), 'utf-8');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the first arg as an alias if one exists.
|
|
35
|
+
* Returns the original args unchanged if no alias matches.
|
|
36
|
+
*/
|
|
37
|
+
export function resolveAlias(args: string[]): string[] {
|
|
38
|
+
if (!args.length) return args;
|
|
39
|
+
const aliases = loadAliases();
|
|
40
|
+
const expanded = aliases[args[0]];
|
|
41
|
+
if (!expanded) return args;
|
|
42
|
+
// Split the alias value on spaces and prepend to remaining args
|
|
43
|
+
return [...expanded.split(' '), ...args.slice(1)];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Alias command handler.
|
|
48
|
+
*/
|
|
49
|
+
export async function aliasCommand(subcommand: string, args: string[]): Promise<void> {
|
|
50
|
+
const aliases = loadAliases();
|
|
51
|
+
|
|
52
|
+
if (subcommand === 'list' || (!subcommand && args.length === 0)) {
|
|
53
|
+
ui.header('Command Aliases');
|
|
54
|
+
const entries = Object.entries(aliases);
|
|
55
|
+
if (entries.length === 0) {
|
|
56
|
+
ui.info('No aliases defined. Create one: nimbus alias <name>=<command>');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const [name, cmd] of entries) {
|
|
60
|
+
ui.print(` ${ui.color(name, 'green')} = ${cmd}`);
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (subcommand === 'remove' || subcommand === 'rm') {
|
|
66
|
+
const name = args[0];
|
|
67
|
+
if (!name) {
|
|
68
|
+
ui.error('Usage: nimbus alias remove <name>');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
if (!(name in aliases)) {
|
|
72
|
+
ui.warning(`Alias "${name}" not found`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
delete aliases[name];
|
|
76
|
+
saveAliases(aliases);
|
|
77
|
+
ui.success(`Removed alias: ${name}`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Create alias: subcommand is "<name>=<rest>" or subcommand is the name and args hold the expansion
|
|
82
|
+
const raw = subcommand + (args.length ? ' ' + args.join(' ') : '');
|
|
83
|
+
const eqIdx = raw.indexOf('=');
|
|
84
|
+
if (eqIdx === -1) {
|
|
85
|
+
ui.error('Usage: nimbus alias <name>=<command> or nimbus alias list or nimbus alias remove <name>');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const name = raw.slice(0, eqIdx).trim();
|
|
90
|
+
const cmd = raw.slice(eqIdx + 1).trim();
|
|
91
|
+
|
|
92
|
+
if (!name || !cmd) {
|
|
93
|
+
ui.error('Alias name and command must not be empty');
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
aliases[name] = cmd;
|
|
98
|
+
saveAliases(aliases);
|
|
99
|
+
ui.success(`Alias set: ${ui.color(name, 'green')} = ${cmd}`);
|
|
100
|
+
}
|