@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
|
@@ -203,18 +203,130 @@ export async function auditExportCommand(options: AuditExportCommandOptions): Pr
|
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
/** Options for the audit scan subcommand */
|
|
207
|
+
export interface AuditScanOptions {
|
|
208
|
+
/** Compliance framework filter */
|
|
209
|
+
framework?: 'soc2' | 'hipaa' | 'pci' | 'iso27001';
|
|
210
|
+
/** Write JSON report to this file */
|
|
211
|
+
output?: string;
|
|
212
|
+
/** Directory to scan (default: cwd) */
|
|
213
|
+
dir?: string;
|
|
214
|
+
/** Exit code 1 if findings exceed this count */
|
|
215
|
+
threshold?: number;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Parse audit scan options from CLI args
|
|
220
|
+
*/
|
|
221
|
+
export function parseAuditScanOptions(args: string[]): AuditScanOptions {
|
|
222
|
+
const options: AuditScanOptions = {};
|
|
223
|
+
|
|
224
|
+
for (let i = 0; i < args.length; i++) {
|
|
225
|
+
const arg = args[i];
|
|
226
|
+
if (arg === '--framework' && args[i + 1]) {
|
|
227
|
+
options.framework = args[++i] as AuditScanOptions['framework'];
|
|
228
|
+
} else if ((arg === '--output' || arg === '-o') && args[i + 1]) {
|
|
229
|
+
options.output = args[++i];
|
|
230
|
+
} else if ((arg === '--dir' || arg === '-d') && args[i + 1]) {
|
|
231
|
+
options.dir = args[++i];
|
|
232
|
+
} else if (arg === '--threshold' && args[i + 1]) {
|
|
233
|
+
options.threshold = parseInt(args[++i], 10);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return options;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Audit scan subcommand — runs the local security scanner
|
|
242
|
+
*/
|
|
243
|
+
export async function auditScanCommand(options: AuditScanOptions): Promise<void> {
|
|
244
|
+
const { scanSecurity } = await import('../../audit/security-scanner');
|
|
245
|
+
const dir = options.dir ?? process.cwd();
|
|
246
|
+
|
|
247
|
+
ui.startSpinner({ message: `Scanning ${dir} for security issues...` });
|
|
248
|
+
|
|
249
|
+
let result;
|
|
250
|
+
try {
|
|
251
|
+
result = await scanSecurity({ dir });
|
|
252
|
+
} catch (e: any) {
|
|
253
|
+
ui.stopSpinnerFail('Scan failed');
|
|
254
|
+
ui.error(e.message);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
ui.stopSpinnerSuccess(
|
|
259
|
+
`Scan complete: ${result.findings.length} finding(s) in ${result.scannedFiles} file(s)`
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
// Filter by framework if provided (maps framework to relevant finding IDs)
|
|
263
|
+
let findings = result.findings;
|
|
264
|
+
if (options.framework) {
|
|
265
|
+
// Each framework maps loosely to severity thresholds
|
|
266
|
+
const frameworkSeverityMap: Record<string, string[]> = {
|
|
267
|
+
soc2: ['CRITICAL', 'HIGH', 'MEDIUM'],
|
|
268
|
+
hipaa: ['CRITICAL', 'HIGH', 'MEDIUM'],
|
|
269
|
+
pci: ['CRITICAL', 'HIGH'],
|
|
270
|
+
iso27001: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'],
|
|
271
|
+
};
|
|
272
|
+
const allowedSeverities = frameworkSeverityMap[options.framework] ?? [];
|
|
273
|
+
findings = findings.filter((f: { severity: string }) => allowedSeverities.includes(f.severity));
|
|
274
|
+
ui.dim(`Framework filter (${options.framework}): showing ${findings.length} relevant finding(s)`);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (findings.length === 0) {
|
|
278
|
+
ui.info('No findings. Scan clean.');
|
|
279
|
+
} else {
|
|
280
|
+
ui.newLine();
|
|
281
|
+
for (const finding of findings) {
|
|
282
|
+
const severityColor = finding.severity === 'CRITICAL' || finding.severity === 'HIGH'
|
|
283
|
+
? 'red'
|
|
284
|
+
: finding.severity === 'MEDIUM'
|
|
285
|
+
? 'yellow'
|
|
286
|
+
: 'white';
|
|
287
|
+
ui.print(`[${ui.color(finding.severity, severityColor)}] ${finding.id}: ${finding.title}`);
|
|
288
|
+
if (finding.file) ui.dim(` File: ${finding.file}${finding.line ? `:${finding.line}` : ''}`);
|
|
289
|
+
ui.dim(` ${finding.recommendation}`);
|
|
290
|
+
ui.newLine();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Write JSON report to file if requested
|
|
295
|
+
if (options.output) {
|
|
296
|
+
const report = {
|
|
297
|
+
timestamp: result.timestamp.toISOString(),
|
|
298
|
+
scannedFiles: result.scannedFiles,
|
|
299
|
+
scanDuration: result.scanDuration,
|
|
300
|
+
framework: options.framework ?? null,
|
|
301
|
+
findingsCount: findings.length,
|
|
302
|
+
findings,
|
|
303
|
+
};
|
|
304
|
+
fs.writeFileSync(options.output, JSON.stringify(report, null, 2), 'utf-8');
|
|
305
|
+
ui.print(`Report written to ${options.output}`);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Threshold check — exit code 1 if too many findings
|
|
309
|
+
if (options.threshold !== undefined && findings.length > options.threshold) {
|
|
310
|
+
ui.error(`Findings (${findings.length}) exceeded threshold (${options.threshold}). Exiting with code 1.`);
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
206
315
|
/**
|
|
207
316
|
* Main audit command dispatcher
|
|
208
317
|
*/
|
|
209
318
|
export async function auditCommand(subcommand: string, args: string[]): Promise<void> {
|
|
210
319
|
switch (subcommand) {
|
|
211
320
|
case 'list':
|
|
212
|
-
case
|
|
321
|
+
case '':
|
|
213
322
|
await auditListCommand(parseAuditListOptions(args));
|
|
214
323
|
break;
|
|
215
324
|
case 'export':
|
|
216
325
|
await auditExportCommand(parseAuditExportOptions(args));
|
|
217
326
|
break;
|
|
327
|
+
case 'scan':
|
|
328
|
+
await auditScanCommand(parseAuditScanOptions(args));
|
|
329
|
+
break;
|
|
218
330
|
default:
|
|
219
331
|
ui.error(`Unknown audit command: ${subcommand}`);
|
|
220
332
|
ui.newLine();
|
|
@@ -222,8 +334,9 @@ export async function auditCommand(subcommand: string, args: string[]): Promise<
|
|
|
222
334
|
ui.print(' nimbus audit - List audit logs');
|
|
223
335
|
ui.print(' nimbus audit list - List audit logs');
|
|
224
336
|
ui.print(' nimbus audit export - Export audit logs');
|
|
337
|
+
ui.print(' nimbus audit scan - Scan directory for security issues');
|
|
225
338
|
ui.newLine();
|
|
226
|
-
ui.info('Options:');
|
|
339
|
+
ui.info('Options (list):');
|
|
227
340
|
ui.print(' --since <time> Filter logs since (e.g., 7d, 24h, 2024-01-01)');
|
|
228
341
|
ui.print(' --until <time> Filter logs until');
|
|
229
342
|
ui.print(' --action <type> Filter by action type');
|
|
@@ -231,6 +344,12 @@ export async function auditCommand(subcommand: string, args: string[]): Promise<
|
|
|
231
344
|
ui.print(' --limit <n> Number of logs to show');
|
|
232
345
|
ui.print(' --json Output as JSON');
|
|
233
346
|
ui.newLine();
|
|
347
|
+
ui.info('Options (scan):');
|
|
348
|
+
ui.print(' --framework <f> Compliance framework: soc2|hipaa|pci|iso27001');
|
|
349
|
+
ui.print(' --output <file> Write JSON report to file');
|
|
350
|
+
ui.print(' --dir <path> Directory to scan (default: cwd)');
|
|
351
|
+
ui.print(' --threshold <n> Exit code 1 if findings exceed this count');
|
|
352
|
+
ui.newLine();
|
|
234
353
|
ui.info('Export options:');
|
|
235
354
|
ui.print(' --format <type> Export format (csv|json)');
|
|
236
355
|
ui.print(' --output <file> Output file path');
|
|
@@ -265,6 +265,91 @@ export async function authAzureCommand(options: AuthCloudOptions = {}): Promise<
|
|
|
265
265
|
ui.success('Azure credentials are configured and valid');
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
+
/**
|
|
269
|
+
* H1: AWS SSO Login — delegates to `aws sso login` so the CLI handles the browser flow.
|
|
270
|
+
* spawnSync with stdio: 'inherit' so device codes / browser prompts appear in terminal.
|
|
271
|
+
*/
|
|
272
|
+
export async function loginAwsCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
273
|
+
const installed = await isCliInstalled('aws');
|
|
274
|
+
if (!installed) {
|
|
275
|
+
ui.error('AWS CLI is not installed. Install from https://aws.amazon.com/cli/');
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
ui.info('Launching AWS SSO login...');
|
|
280
|
+
ui.print(ui.dim('The browser (or device code) flow is handled by the AWS CLI.'));
|
|
281
|
+
ui.newLine();
|
|
282
|
+
|
|
283
|
+
const { spawnSync } = await import('child_process');
|
|
284
|
+
const args = ['sso', 'login'];
|
|
285
|
+
if (options.profile) {
|
|
286
|
+
args.push('--profile', options.profile);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const result = spawnSync('aws', args, { stdio: 'inherit' });
|
|
290
|
+
if (result.status === 0) {
|
|
291
|
+
ui.success('AWS SSO login completed successfully.');
|
|
292
|
+
} else {
|
|
293
|
+
ui.error('AWS SSO login failed or was cancelled.');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* H1: GCP Login — delegates to `gcloud auth login --no-launch-browser` (device code flow).
|
|
299
|
+
*/
|
|
300
|
+
export async function loginGcpCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
301
|
+
const installed = await isCliInstalled('gcloud');
|
|
302
|
+
if (!installed) {
|
|
303
|
+
ui.error('Google Cloud SDK not installed. See https://cloud.google.com/sdk/docs/install');
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
ui.info('Launching GCP device-code login...');
|
|
308
|
+
ui.print(ui.dim('Follow the URL and code shown below to complete authentication.'));
|
|
309
|
+
ui.newLine();
|
|
310
|
+
|
|
311
|
+
const { spawnSync } = await import('child_process');
|
|
312
|
+
const args = ['auth', 'login', '--no-launch-browser'];
|
|
313
|
+
if (options.project) {
|
|
314
|
+
args.push('--project', options.project);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const result = spawnSync('gcloud', args, { stdio: 'inherit' });
|
|
318
|
+
if (result.status === 0) {
|
|
319
|
+
ui.success('GCP login completed successfully.');
|
|
320
|
+
} else {
|
|
321
|
+
ui.error('GCP login failed or was cancelled.');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* H1: Azure Login — delegates to `az login --use-device-code`.
|
|
327
|
+
*/
|
|
328
|
+
export async function loginAzureCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
329
|
+
const installed = await isCliInstalled('az');
|
|
330
|
+
if (!installed) {
|
|
331
|
+
ui.error('Azure CLI not installed. See https://learn.microsoft.com/en-us/cli/azure/install-azure-cli');
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
ui.info('Launching Azure device-code login...');
|
|
336
|
+
ui.print(ui.dim('Follow the URL and code shown below to complete authentication.'));
|
|
337
|
+
ui.newLine();
|
|
338
|
+
|
|
339
|
+
const { spawnSync } = await import('child_process');
|
|
340
|
+
const args = ['login', '--use-device-code'];
|
|
341
|
+
if (options.subscription) {
|
|
342
|
+
args.push('--subscription', options.subscription);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const result = spawnSync('az', args, { stdio: 'inherit' });
|
|
346
|
+
if (result.status === 0) {
|
|
347
|
+
ui.success('Azure login completed successfully.');
|
|
348
|
+
} else {
|
|
349
|
+
ui.error('Azure login failed or was cancelled.');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
268
353
|
/**
|
|
269
354
|
* Cloud auth parent command router
|
|
270
355
|
*/
|
|
@@ -292,3 +377,31 @@ export async function authCloudCommand(
|
|
|
292
377
|
ui.print(' nimbus auth azure — Validate Azure credentials');
|
|
293
378
|
}
|
|
294
379
|
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Cloud login command router — delegates to CLI tools for SSO/OAuth flows (H1).
|
|
383
|
+
*/
|
|
384
|
+
export async function loginCloudCommand(
|
|
385
|
+
provider: string,
|
|
386
|
+
options: AuthCloudOptions = {}
|
|
387
|
+
): Promise<void> {
|
|
388
|
+
switch (provider) {
|
|
389
|
+
case 'aws':
|
|
390
|
+
await loginAwsCommand(options);
|
|
391
|
+
break;
|
|
392
|
+
case 'gcp':
|
|
393
|
+
case 'google':
|
|
394
|
+
await loginGcpCommand(options);
|
|
395
|
+
break;
|
|
396
|
+
case 'azure':
|
|
397
|
+
await loginAzureCommand(options);
|
|
398
|
+
break;
|
|
399
|
+
default:
|
|
400
|
+
ui.error(`Unknown cloud provider: ${provider}`);
|
|
401
|
+
ui.newLine();
|
|
402
|
+
ui.print('Supported providers:');
|
|
403
|
+
ui.print(' nimbus auth login aws — AWS SSO login (browser/device code)');
|
|
404
|
+
ui.print(' nimbus auth login gcp — GCP device-code login');
|
|
405
|
+
ui.print(' nimbus auth login azure — Azure device-code login');
|
|
406
|
+
}
|
|
407
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Refresh Command
|
|
3
|
+
*
|
|
4
|
+
* Re-validate and refresh cloud provider credentials:
|
|
5
|
+
* - AWS: re-run SSO login or warn about expired temporary credentials
|
|
6
|
+
* - GCP: re-run gcloud auth application-default login
|
|
7
|
+
* - Azure: re-run az login
|
|
8
|
+
*
|
|
9
|
+
* Usage: nimbus auth-refresh [--provider aws|gcp|azure]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { ui } from '../wizard';
|
|
13
|
+
import { exec } from 'node:child_process';
|
|
14
|
+
import { promisify } from 'node:util';
|
|
15
|
+
|
|
16
|
+
const execAsync = promisify(exec);
|
|
17
|
+
|
|
18
|
+
export interface AuthRefreshOptions {
|
|
19
|
+
provider?: 'aws' | 'gcp' | 'azure' | 'all';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Check if AWS credentials are valid and not expired */
|
|
23
|
+
async function checkAWSCredentials(): Promise<{ valid: boolean; message: string; sso: boolean }> {
|
|
24
|
+
try {
|
|
25
|
+
const { stdout } = await execAsync('aws sts get-caller-identity --output json', {
|
|
26
|
+
timeout: 10_000,
|
|
27
|
+
});
|
|
28
|
+
const identity = JSON.parse(stdout);
|
|
29
|
+
const isSso = identity.UserId?.includes(':') || false;
|
|
30
|
+
return {
|
|
31
|
+
valid: true,
|
|
32
|
+
message: `Account: ${identity.Account} | User: ${identity.UserId}`,
|
|
33
|
+
sso: isSso,
|
|
34
|
+
};
|
|
35
|
+
} catch (e: any) {
|
|
36
|
+
const msg = e.message || String(e);
|
|
37
|
+
const isExpired =
|
|
38
|
+
msg.includes('ExpiredToken') || msg.includes('expired') || msg.includes('token');
|
|
39
|
+
return { valid: false, message: isExpired ? 'Token expired' : msg, sso: false };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Refresh AWS SSO credentials */
|
|
44
|
+
async function refreshAWS(options: AuthRefreshOptions): Promise<void> {
|
|
45
|
+
ui.header('AWS Credentials');
|
|
46
|
+
|
|
47
|
+
const check = await checkAWSCredentials();
|
|
48
|
+
|
|
49
|
+
if (check.valid) {
|
|
50
|
+
ui.success(`Credentials valid: ${check.message}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
ui.warning(`Credentials invalid: ${check.message}`);
|
|
55
|
+
|
|
56
|
+
// G18: Guide user through AWS SSO login if SSO profile detected
|
|
57
|
+
const awsSsoProfile = process.env.AWS_PROFILE;
|
|
58
|
+
if (awsSsoProfile) {
|
|
59
|
+
ui.info(`AWS SSO profile detected: ${awsSsoProfile}`);
|
|
60
|
+
ui.info(`Run in another terminal: aws sso login --profile ${awsSsoProfile}`);
|
|
61
|
+
ui.info('Then press Enter here to retry...');
|
|
62
|
+
// Wait for user to press Enter
|
|
63
|
+
await new Promise<void>(resolve => {
|
|
64
|
+
const readline = require('readline') as typeof import('readline');
|
|
65
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
66
|
+
rl.question('', () => { rl.close(); resolve(); });
|
|
67
|
+
});
|
|
68
|
+
// Retry the credentials check
|
|
69
|
+
try {
|
|
70
|
+
const { execFileSync } = await import('node:child_process');
|
|
71
|
+
execFileSync('aws', ['sts', 'get-caller-identity'], {
|
|
72
|
+
encoding: 'utf-8', timeout: 8000, stdio: ['pipe', 'pipe', 'pipe'],
|
|
73
|
+
});
|
|
74
|
+
ui.success('AWS credentials refreshed successfully.');
|
|
75
|
+
return;
|
|
76
|
+
} catch {
|
|
77
|
+
ui.warning('AWS credentials still invalid. You may need to re-run aws sso login.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Determine refresh method
|
|
82
|
+
try {
|
|
83
|
+
// Check if SSO is configured
|
|
84
|
+
const { stdout: ssoCheck } = await execAsync(
|
|
85
|
+
'aws configure list-profiles 2>/dev/null || echo ""',
|
|
86
|
+
{ timeout: 5000 }
|
|
87
|
+
);
|
|
88
|
+
const profiles = ssoCheck.trim().split('\n').filter(Boolean);
|
|
89
|
+
|
|
90
|
+
if (profiles.length > 0) {
|
|
91
|
+
ui.info('Refreshing AWS SSO credentials...');
|
|
92
|
+
ui.info(`Run: aws sso login --profile ${profiles[0]}`);
|
|
93
|
+
ui.info('Or set a new profile: aws configure sso');
|
|
94
|
+
} else {
|
|
95
|
+
ui.info('To refresh AWS credentials:');
|
|
96
|
+
ui.info(' 1. aws configure (for long-term credentials)');
|
|
97
|
+
ui.info(' 2. aws sso configure (for SSO)');
|
|
98
|
+
ui.info(' 3. aws sts assume-role (for role assumption)');
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
ui.info('To configure AWS credentials: aws configure');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Refresh GCP credentials */
|
|
106
|
+
async function refreshGCP(_options: AuthRefreshOptions): Promise<void> {
|
|
107
|
+
ui.header('GCP Credentials');
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const { stdout } = await execAsync('gcloud auth print-access-token 2>/dev/null', {
|
|
111
|
+
timeout: 5000,
|
|
112
|
+
});
|
|
113
|
+
if (stdout.trim().length > 10) {
|
|
114
|
+
try {
|
|
115
|
+
const { stdout: proj } = await execAsync('gcloud config get-value project 2>/dev/null', {
|
|
116
|
+
timeout: 3000,
|
|
117
|
+
});
|
|
118
|
+
ui.success(`Credentials valid. Project: ${proj.trim() || '(not set)'}`);
|
|
119
|
+
return;
|
|
120
|
+
} catch {
|
|
121
|
+
ui.success('Credentials valid');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
} catch {
|
|
126
|
+
// Not valid
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
ui.warning('GCP credentials expired or not configured');
|
|
130
|
+
ui.info('To refresh: gcloud auth application-default login');
|
|
131
|
+
ui.info('For service accounts: gcloud auth activate-service-account --key-file=SA_KEY.json');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Refresh Azure credentials */
|
|
135
|
+
async function refreshAzure(_options: AuthRefreshOptions): Promise<void> {
|
|
136
|
+
ui.header('Azure Credentials');
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
const { stdout } = await execAsync('az account show --output json 2>/dev/null', {
|
|
140
|
+
timeout: 10_000,
|
|
141
|
+
});
|
|
142
|
+
const account = JSON.parse(stdout);
|
|
143
|
+
ui.success(
|
|
144
|
+
`Credentials valid. Subscription: ${account.name || account.id} (${account.state})`
|
|
145
|
+
);
|
|
146
|
+
if (account.state !== 'Enabled') {
|
|
147
|
+
ui.warning('Subscription is not in Enabled state');
|
|
148
|
+
}
|
|
149
|
+
return;
|
|
150
|
+
} catch {
|
|
151
|
+
// Not valid
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
ui.warning('Azure credentials expired or not configured');
|
|
155
|
+
ui.info('To refresh: az login');
|
|
156
|
+
ui.info('For service principals: az login --service-principal -u CLIENT_ID -p CLIENT_SECRET --tenant TENANT_ID');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Run the auth-refresh command
|
|
161
|
+
*/
|
|
162
|
+
export async function authRefreshCommand(options: AuthRefreshOptions = {}): Promise<void> {
|
|
163
|
+
const provider = options.provider ?? 'all';
|
|
164
|
+
|
|
165
|
+
ui.header('Nimbus Auth Refresh');
|
|
166
|
+
ui.info('Checking and refreshing cloud provider credentials...');
|
|
167
|
+
ui.newLine();
|
|
168
|
+
|
|
169
|
+
if (provider === 'all' || provider === 'aws') {
|
|
170
|
+
await refreshAWS(options);
|
|
171
|
+
ui.newLine();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (provider === 'all' || provider === 'gcp') {
|
|
175
|
+
await refreshGCP(options);
|
|
176
|
+
ui.newLine();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (provider === 'all' || provider === 'azure') {
|
|
180
|
+
await refreshAzure(options);
|
|
181
|
+
ui.newLine();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
ui.info('Tip: Run "nimbus doctor" for a full system check');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export default authRefreshCommand;
|