@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
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Completion Auto-Installer (L7)
|
|
3
|
+
*
|
|
4
|
+
* Installs shell completions for bash, zsh, and fish.
|
|
5
|
+
* Completion scripts are generated dynamically from the CLI command list.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import { ui } from '../wizard/ui';
|
|
11
|
+
const COMMANDS = [
|
|
12
|
+
'chat', 'run', 'init', 'login', 'logout', 'doctor', 'cost',
|
|
13
|
+
'sessions', 'audit', 'share', 'upgrade', 'serve', 'web',
|
|
14
|
+
'auth-refresh', 'plugin', 'completions', 'team-context',
|
|
15
|
+
'logs', 'pipeline', 'alias',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* L4: Get available kubectl contexts for shell completion.
|
|
19
|
+
*/
|
|
20
|
+
function getKubeContexts() {
|
|
21
|
+
try {
|
|
22
|
+
const { execFileSync } = require('node:child_process');
|
|
23
|
+
return execFileSync('kubectl', ['config', 'get-contexts', '--no-headers', '-o', 'name'], { encoding: 'utf-8', timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'] })
|
|
24
|
+
.trim()
|
|
25
|
+
.split('\n')
|
|
26
|
+
.filter(Boolean);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* L2: Get terraform workspaces for dynamic shell completion.
|
|
34
|
+
*/
|
|
35
|
+
function getTerraformWorkspaces() {
|
|
36
|
+
try {
|
|
37
|
+
const { execFileSync } = require('node:child_process');
|
|
38
|
+
return execFileSync('terraform', ['workspace', 'list'], {
|
|
39
|
+
encoding: 'utf-8',
|
|
40
|
+
timeout: 3000,
|
|
41
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
42
|
+
})
|
|
43
|
+
.split('\n')
|
|
44
|
+
.map((l) => l.replace(/^\*?\s*/, '').trim())
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* L2: Get helm releases for dynamic shell completion.
|
|
53
|
+
*/
|
|
54
|
+
function getHelmReleases() {
|
|
55
|
+
try {
|
|
56
|
+
const { execFileSync } = require('node:child_process');
|
|
57
|
+
return execFileSync('helm', ['list', '--short'], {
|
|
58
|
+
encoding: 'utf-8',
|
|
59
|
+
timeout: 3000,
|
|
60
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
61
|
+
})
|
|
62
|
+
.trim()
|
|
63
|
+
.split('\n')
|
|
64
|
+
.filter(Boolean);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* L2: Dynamic completion dispatcher.
|
|
72
|
+
* Called from shell with: nimbus __complete <prev_word> <curr_word>
|
|
73
|
+
*/
|
|
74
|
+
export function dynamicComplete(prevWord, _currWord) {
|
|
75
|
+
let suggestions = [];
|
|
76
|
+
if (prevWord === 'workspace' || prevWord === 'ws') {
|
|
77
|
+
suggestions = getTerraformWorkspaces();
|
|
78
|
+
}
|
|
79
|
+
else if (prevWord === 'switch' || prevWord === 'context') {
|
|
80
|
+
suggestions = getKubeContexts();
|
|
81
|
+
}
|
|
82
|
+
else if (prevWord === 'upgrade' || prevWord === 'rollback') {
|
|
83
|
+
suggestions = getHelmReleases();
|
|
84
|
+
}
|
|
85
|
+
if (suggestions.length > 0) {
|
|
86
|
+
process.stdout.write(suggestions.join('\n') + '\n');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const FLAGS = [
|
|
90
|
+
'--help', '--version', '--model', '--mode', '--auto-approve',
|
|
91
|
+
'--format', '--verbose', '--json', '--fix',
|
|
92
|
+
];
|
|
93
|
+
function generateBashCompletion() {
|
|
94
|
+
return `# Nimbus bash completion
|
|
95
|
+
_nimbus_completions() {
|
|
96
|
+
local cur prev
|
|
97
|
+
COMPREPLY=()
|
|
98
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
99
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
100
|
+
|
|
101
|
+
local commands="${COMMANDS.join(' ')}"
|
|
102
|
+
local flags="${FLAGS.join(' ')}"
|
|
103
|
+
|
|
104
|
+
if [ \$COMP_CWORD -eq 1 ]; then
|
|
105
|
+
COMPREPLY=( \$(compgen -W "\$commands" -- "\$cur") )
|
|
106
|
+
else
|
|
107
|
+
COMPREPLY=( \$(compgen -W "\$flags" -- "\$cur") )
|
|
108
|
+
fi
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
complete -F _nimbus_completions nimbus
|
|
112
|
+
`;
|
|
113
|
+
}
|
|
114
|
+
function generateZshCompletion() {
|
|
115
|
+
const commandDefs = COMMANDS.map(c => ` '${c}:${c} command'`).join('\n');
|
|
116
|
+
const kubeContexts = getKubeContexts();
|
|
117
|
+
const contextCompletion = kubeContexts.length > 0
|
|
118
|
+
? `\n '--context[kubectl context]:context:(${kubeContexts.join(' ')})' \\`
|
|
119
|
+
: '';
|
|
120
|
+
return `#compdef nimbus
|
|
121
|
+
# Nimbus zsh completion
|
|
122
|
+
|
|
123
|
+
_nimbus() {
|
|
124
|
+
local state
|
|
125
|
+
|
|
126
|
+
_arguments \\
|
|
127
|
+
'1: :->command' \\${contextCompletion}
|
|
128
|
+
'*: :->args'
|
|
129
|
+
|
|
130
|
+
case \$state in
|
|
131
|
+
command)
|
|
132
|
+
_describe 'nimbus commands' \\
|
|
133
|
+
(
|
|
134
|
+
${commandDefs}
|
|
135
|
+
)
|
|
136
|
+
;;
|
|
137
|
+
args)
|
|
138
|
+
_arguments \\
|
|
139
|
+
'--help[Show help]' \\
|
|
140
|
+
'--version[Show version]' \\
|
|
141
|
+
'--model[Specify LLM model]:model:' \\
|
|
142
|
+
'--mode[Agent mode (plan/build/deploy)]:mode:(plan build deploy)' \\
|
|
143
|
+
'--auto-approve[Auto-approve all actions]' \\
|
|
144
|
+
'--format[Output format]:format:(json text)'
|
|
145
|
+
;;
|
|
146
|
+
esac
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
_nimbus
|
|
150
|
+
`;
|
|
151
|
+
}
|
|
152
|
+
function generateFishCompletion() {
|
|
153
|
+
const cmdCompletions = COMMANDS.map(c => `complete -c nimbus -f -n '__fish_use_subcommand' -a '${c}'`).join('\n');
|
|
154
|
+
return `# Nimbus fish completion
|
|
155
|
+
|
|
156
|
+
${cmdCompletions}
|
|
157
|
+
|
|
158
|
+
complete -c nimbus -l help -d 'Show help'
|
|
159
|
+
complete -c nimbus -l version -d 'Show version'
|
|
160
|
+
complete -c nimbus -l model -d 'Specify LLM model' -r
|
|
161
|
+
complete -c nimbus -l mode -d 'Agent mode' -r -a 'plan build deploy'
|
|
162
|
+
complete -c nimbus -l auto-approve -d 'Auto-approve all actions'
|
|
163
|
+
complete -c nimbus -l format -d 'Output format' -r -a 'json text'
|
|
164
|
+
`;
|
|
165
|
+
}
|
|
166
|
+
export async function completionsCommand(subcommand) {
|
|
167
|
+
switch (subcommand) {
|
|
168
|
+
case 'install': {
|
|
169
|
+
const shell = path.basename(process.env.SHELL ?? '/bin/bash');
|
|
170
|
+
ui.info(`Detected shell: ${shell}`);
|
|
171
|
+
if (shell === 'bash') {
|
|
172
|
+
const dir = path.join(os.homedir(), '.bash_completion.d');
|
|
173
|
+
const file = path.join(dir, 'nimbus.bash');
|
|
174
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
175
|
+
fs.writeFileSync(file, generateBashCompletion(), 'utf-8');
|
|
176
|
+
// Add source to .bashrc if not already there
|
|
177
|
+
const bashrc = path.join(os.homedir(), '.bashrc');
|
|
178
|
+
const sourceLine = `\n# Nimbus completions\n[ -f "${file}" ] && source "${file}"\n`;
|
|
179
|
+
let alreadyConfigured = false;
|
|
180
|
+
try {
|
|
181
|
+
const existing = fs.readFileSync(bashrc, 'utf-8');
|
|
182
|
+
if (!existing.includes('nimbus.bash')) {
|
|
183
|
+
fs.appendFileSync(bashrc, sourceLine);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
alreadyConfigured = true;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
fs.appendFileSync(bashrc, sourceLine);
|
|
191
|
+
}
|
|
192
|
+
ui.print(`${ui.color('✓', 'green')} Installed bash completions to ${file}`);
|
|
193
|
+
if (alreadyConfigured) {
|
|
194
|
+
ui.print(' Already configured, skipping.');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
ui.print(' Restart your shell or run: source ~/.bashrc');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else if (shell === 'zsh') {
|
|
201
|
+
const dir = path.join(os.homedir(), '.zsh', 'completions');
|
|
202
|
+
const file = path.join(dir, '_nimbus');
|
|
203
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
204
|
+
fs.writeFileSync(file, generateZshCompletion(), 'utf-8');
|
|
205
|
+
ui.print(`${ui.color('✓', 'green')} Installed zsh completions to ${file}`);
|
|
206
|
+
ui.print(' Add to .zshrc: fpath=(~/.zsh/completions $fpath) && autoload -U compinit && compinit');
|
|
207
|
+
ui.print(' Restart your shell or run: source ~/.zshrc');
|
|
208
|
+
}
|
|
209
|
+
else if (shell === 'fish') {
|
|
210
|
+
const dir = path.join(os.homedir(), '.config', 'fish', 'completions');
|
|
211
|
+
const file = path.join(dir, 'nimbus.fish');
|
|
212
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
213
|
+
fs.writeFileSync(file, generateFishCompletion(), 'utf-8');
|
|
214
|
+
ui.print(`${ui.color('✓', 'green')} Installed fish completions to ${file}`);
|
|
215
|
+
ui.print(' Fish completions are active immediately. Restart your shell to confirm.');
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
ui.warning(`Shell "${shell}" not supported. Supported: bash, zsh, fish`);
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'uninstall': {
|
|
223
|
+
const shell = path.basename(process.env.SHELL ?? '/bin/bash');
|
|
224
|
+
const files = [
|
|
225
|
+
path.join(os.homedir(), '.bash_completion.d', 'nimbus.bash'),
|
|
226
|
+
path.join(os.homedir(), '.zsh', 'completions', '_nimbus'),
|
|
227
|
+
path.join(os.homedir(), '.config', 'fish', 'completions', 'nimbus.fish'),
|
|
228
|
+
];
|
|
229
|
+
let removed = 0;
|
|
230
|
+
for (const f of files) {
|
|
231
|
+
if (fs.existsSync(f)) {
|
|
232
|
+
fs.unlinkSync(f);
|
|
233
|
+
ui.print(`${ui.color('✓', 'green')} Removed ${f}`);
|
|
234
|
+
removed++;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (removed === 0) {
|
|
238
|
+
ui.info('No completion files found to remove.');
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
ui.info(`Removed ${removed} completion file(s). Reload your shell.`);
|
|
242
|
+
}
|
|
243
|
+
void shell; // suppress unused warning
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case '__complete': {
|
|
247
|
+
// L2: Dynamic completion dispatcher — called from shell completion scripts
|
|
248
|
+
// Usage: nimbus completions __complete <prev_word> <curr_word>
|
|
249
|
+
// (args passed as positional args by the shell)
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
default:
|
|
253
|
+
ui.print('Usage: nimbus completions <install|uninstall>');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Command
|
|
3
|
+
*
|
|
4
|
+
* Manage Nimbus configuration
|
|
5
|
+
*/
|
|
6
|
+
import { ui } from '../wizard/ui';
|
|
7
|
+
import { select, input, confirm } from '../wizard/prompts';
|
|
8
|
+
import { ConfigManager, CONFIG_KEYS } from '../config';
|
|
9
|
+
/**
|
|
10
|
+
* Config set command
|
|
11
|
+
*/
|
|
12
|
+
export async function configSetCommand(options) {
|
|
13
|
+
const configManager = new ConfigManager();
|
|
14
|
+
let key = options.key;
|
|
15
|
+
let value = options.value;
|
|
16
|
+
// Interactive mode - select key if not provided
|
|
17
|
+
if (!key && !options.nonInteractive) {
|
|
18
|
+
const keyOptions = CONFIG_KEYS.map(k => ({
|
|
19
|
+
label: k.key,
|
|
20
|
+
value: k.key,
|
|
21
|
+
description: k.description,
|
|
22
|
+
}));
|
|
23
|
+
key = (await select({
|
|
24
|
+
message: 'Select configuration key to set:',
|
|
25
|
+
options: keyOptions,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
if (!key) {
|
|
29
|
+
ui.error('Configuration key is required.');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// Validate key
|
|
33
|
+
const keyInfo = configManager.getKeyInfo(key);
|
|
34
|
+
if (!keyInfo) {
|
|
35
|
+
ui.warning(`Unknown configuration key: ${key}`);
|
|
36
|
+
ui.info('Use "nimbus config list" to see available keys.');
|
|
37
|
+
if (!options.nonInteractive) {
|
|
38
|
+
const proceed = await confirm({
|
|
39
|
+
message: 'Set this key anyway?',
|
|
40
|
+
defaultValue: false,
|
|
41
|
+
});
|
|
42
|
+
if (!proceed) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Get value if not provided
|
|
48
|
+
if (value === undefined && !options.nonInteractive) {
|
|
49
|
+
const currentValue = configManager.get(key);
|
|
50
|
+
const defaultValue = keyInfo?.defaultValue;
|
|
51
|
+
let placeholder = '';
|
|
52
|
+
if (currentValue !== undefined) {
|
|
53
|
+
placeholder = String(currentValue);
|
|
54
|
+
}
|
|
55
|
+
else if (defaultValue !== undefined) {
|
|
56
|
+
placeholder = `default: ${defaultValue}`;
|
|
57
|
+
}
|
|
58
|
+
if (keyInfo?.type === 'boolean') {
|
|
59
|
+
const boolValue = await confirm({
|
|
60
|
+
message: `Set ${key}:`,
|
|
61
|
+
defaultValue: currentValue ?? defaultValue ?? false,
|
|
62
|
+
});
|
|
63
|
+
value = String(boolValue);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
value = await input({
|
|
67
|
+
message: `Enter value for ${key}:`,
|
|
68
|
+
defaultValue: currentValue !== undefined ? String(currentValue) : undefined,
|
|
69
|
+
placeholder,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (value === undefined) {
|
|
74
|
+
ui.error('Configuration value is required.');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
// M4: Validate model key against known model IDs
|
|
78
|
+
if (key === 'model' || key === 'llm.defaultModel') {
|
|
79
|
+
const knownModels = [
|
|
80
|
+
'claude-opus-4-6',
|
|
81
|
+
'claude-sonnet-4-6',
|
|
82
|
+
'claude-haiku-4-5-20251001',
|
|
83
|
+
'claude-opus-4-20250514',
|
|
84
|
+
'claude-sonnet-4-20250514',
|
|
85
|
+
'claude-haiku-4-5',
|
|
86
|
+
'anthropic/claude-opus-4-6',
|
|
87
|
+
'anthropic/claude-sonnet-4-6',
|
|
88
|
+
'anthropic/claude-haiku-4-5-20251001',
|
|
89
|
+
'anthropic/claude-opus-4-20250514',
|
|
90
|
+
'anthropic/claude-sonnet-4-20250514',
|
|
91
|
+
];
|
|
92
|
+
if (!knownModels.includes(value)) {
|
|
93
|
+
ui.warning(`"${value}" is not a recognized Nimbus model ID.`);
|
|
94
|
+
ui.info('Known models: ' + knownModels.slice(0, 6).join(', '));
|
|
95
|
+
if (!options.nonInteractive) {
|
|
96
|
+
const { confirm: confirmPrompt } = await import('../wizard/prompts');
|
|
97
|
+
const proceed = await confirmPrompt({ message: 'Set this model anyway?', defaultValue: false });
|
|
98
|
+
if (!proceed)
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Parse and set value
|
|
104
|
+
const parsedValue = configManager.parseValue(key, value);
|
|
105
|
+
configManager.set(key, parsedValue);
|
|
106
|
+
ui.success(`Configuration updated: ${key} = ${parsedValue}`);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Config get command
|
|
110
|
+
*/
|
|
111
|
+
export async function configGetCommand(options) {
|
|
112
|
+
const configManager = new ConfigManager();
|
|
113
|
+
let key = options.key;
|
|
114
|
+
// Interactive mode - select key if not provided
|
|
115
|
+
if (!key && !options.nonInteractive) {
|
|
116
|
+
const keyOptions = CONFIG_KEYS.map(k => ({
|
|
117
|
+
label: k.key,
|
|
118
|
+
value: k.key,
|
|
119
|
+
description: k.description,
|
|
120
|
+
}));
|
|
121
|
+
key = (await select({
|
|
122
|
+
message: 'Select configuration key to view:',
|
|
123
|
+
options: keyOptions,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
if (!key) {
|
|
127
|
+
ui.error('Configuration key is required.');
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
const value = configManager.get(key);
|
|
131
|
+
if (value === undefined) {
|
|
132
|
+
const keyInfo = configManager.getKeyInfo(key);
|
|
133
|
+
if (keyInfo?.defaultValue !== undefined) {
|
|
134
|
+
ui.print(`${ui.color(key, 'cyan')}: ${keyInfo.defaultValue} ${ui.dim('(default)')}`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
ui.print(`${ui.color(key, 'cyan')}: ${ui.dim('(not set)')}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
ui.print(`${ui.color(key, 'cyan')}: ${value}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Config list command
|
|
146
|
+
*/
|
|
147
|
+
export async function configListCommand(options) {
|
|
148
|
+
const configManager = new ConfigManager();
|
|
149
|
+
const allConfig = configManager.getAllFlat();
|
|
150
|
+
if (options.json) {
|
|
151
|
+
console.log(JSON.stringify(allConfig, null, 2));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
ui.newLine();
|
|
155
|
+
ui.header('Nimbus Configuration', configManager.getConfigPath());
|
|
156
|
+
// Group by section
|
|
157
|
+
const sections = {};
|
|
158
|
+
for (const keyInfo of CONFIG_KEYS) {
|
|
159
|
+
const [section] = keyInfo.key.split('.');
|
|
160
|
+
if (!sections[section]) {
|
|
161
|
+
sections[section] = [];
|
|
162
|
+
}
|
|
163
|
+
const value = allConfig[keyInfo.key];
|
|
164
|
+
const isDefault = value === undefined || value === keyInfo.defaultValue;
|
|
165
|
+
if (options.changed && isDefault) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
sections[section].push({
|
|
169
|
+
key: keyInfo.key,
|
|
170
|
+
value: value !== undefined ? value : keyInfo.defaultValue,
|
|
171
|
+
info: keyInfo,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
for (const [section, items] of Object.entries(sections)) {
|
|
175
|
+
if (items.length === 0) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
ui.section(section.charAt(0).toUpperCase() + section.slice(1));
|
|
179
|
+
for (const item of items) {
|
|
180
|
+
const isDefault = item.value === item.info?.defaultValue;
|
|
181
|
+
const valueStr = item.value !== undefined ? String(item.value) : ui.dim('(not set)');
|
|
182
|
+
const defaultMarker = isDefault ? ui.dim(' (default)') : '';
|
|
183
|
+
ui.print(` ${ui.color(item.key, 'cyan')}: ${valueStr}${defaultMarker}`);
|
|
184
|
+
if (item.info?.description) {
|
|
185
|
+
ui.print(` ${ui.dim(item.info.description)}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
ui.newLine();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Config init command
|
|
193
|
+
*/
|
|
194
|
+
export async function configInitCommand(options) {
|
|
195
|
+
const configManager = new ConfigManager();
|
|
196
|
+
if (configManager.exists() && !options.force) {
|
|
197
|
+
ui.warning(`Configuration file already exists at: ${configManager.getConfigPath()}`);
|
|
198
|
+
if (!options.nonInteractive) {
|
|
199
|
+
const overwrite = await confirm({
|
|
200
|
+
message: 'Overwrite existing configuration?',
|
|
201
|
+
defaultValue: false,
|
|
202
|
+
});
|
|
203
|
+
if (!overwrite) {
|
|
204
|
+
ui.info('Configuration unchanged.');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
ui.info('Use --force to overwrite.');
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Interactive configuration setup
|
|
214
|
+
if (!options.nonInteractive) {
|
|
215
|
+
ui.newLine();
|
|
216
|
+
ui.header('Nimbus Configuration Setup', "Let's configure your Nimbus CLI");
|
|
217
|
+
// Workspace settings
|
|
218
|
+
ui.section('Workspace');
|
|
219
|
+
const defaultProvider = await select({
|
|
220
|
+
message: 'Default cloud provider:',
|
|
221
|
+
options: [
|
|
222
|
+
{ label: 'AWS', value: 'aws', description: 'Amazon Web Services' },
|
|
223
|
+
{ label: 'GCP', value: 'gcp', description: 'Google Cloud Platform' },
|
|
224
|
+
{ label: 'Azure', value: 'azure', description: 'Microsoft Azure' },
|
|
225
|
+
],
|
|
226
|
+
});
|
|
227
|
+
const outputDir = await input({
|
|
228
|
+
message: 'Default output directory for generated code:',
|
|
229
|
+
defaultValue: './infrastructure',
|
|
230
|
+
});
|
|
231
|
+
// LLM settings
|
|
232
|
+
ui.section('LLM');
|
|
233
|
+
const temperature = await input({
|
|
234
|
+
message: 'LLM temperature (0-1):',
|
|
235
|
+
defaultValue: '0.7',
|
|
236
|
+
validate: val => {
|
|
237
|
+
const num = Number(val);
|
|
238
|
+
if (isNaN(num) || num < 0 || num > 1) {
|
|
239
|
+
return 'Temperature must be a number between 0 and 1';
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
// Safety settings
|
|
245
|
+
ui.section('Safety');
|
|
246
|
+
const requireConfirmation = await confirm({
|
|
247
|
+
message: 'Require confirmation for destructive operations?',
|
|
248
|
+
defaultValue: true,
|
|
249
|
+
});
|
|
250
|
+
// Save configuration
|
|
251
|
+
configManager.set('workspace.defaultProvider', defaultProvider);
|
|
252
|
+
configManager.set('workspace.outputDirectory', outputDir);
|
|
253
|
+
configManager.set('llm.temperature', Number(temperature));
|
|
254
|
+
configManager.set('safety.requireConfirmation', requireConfirmation);
|
|
255
|
+
ui.newLine();
|
|
256
|
+
ui.success(`Configuration saved to: ${configManager.getConfigPath()}`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
// Non-interactive - just create default config
|
|
260
|
+
configManager.reset();
|
|
261
|
+
ui.success(`Default configuration created at: ${configManager.getConfigPath()}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Config reset command
|
|
266
|
+
*/
|
|
267
|
+
export async function configResetCommand(options) {
|
|
268
|
+
const configManager = new ConfigManager();
|
|
269
|
+
if (!options.nonInteractive) {
|
|
270
|
+
const confirm_reset = await confirm({
|
|
271
|
+
message: 'Reset all configuration to defaults?',
|
|
272
|
+
defaultValue: false,
|
|
273
|
+
});
|
|
274
|
+
if (!confirm_reset) {
|
|
275
|
+
ui.info('Configuration unchanged.');
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
configManager.reset();
|
|
280
|
+
ui.success('Configuration reset to defaults.');
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Main config command dispatcher
|
|
284
|
+
*/
|
|
285
|
+
export const configCommand = {
|
|
286
|
+
set: configSetCommand,
|
|
287
|
+
get: configGetCommand,
|
|
288
|
+
list: configListCommand,
|
|
289
|
+
init: configInitCommand,
|
|
290
|
+
reset: configResetCommand,
|
|
291
|
+
};
|