@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/commands/help.ts
CHANGED
|
@@ -39,9 +39,29 @@ interface CommandDoc {
|
|
|
39
39
|
* Command documentation
|
|
40
40
|
*/
|
|
41
41
|
const COMMANDS: Record<string, CommandDoc> = {
|
|
42
|
+
run: {
|
|
43
|
+
name: 'run',
|
|
44
|
+
description: 'Run the Nimbus DevOps agent non-interactively with a prompt',
|
|
45
|
+
usage: 'nimbus run "<prompt>" [options]',
|
|
46
|
+
options: [
|
|
47
|
+
{ flag: '--mode <mode>', description: 'Agent mode: plan, build, deploy', default: 'build' },
|
|
48
|
+
{ flag: '--format <fmt>', description: 'Output format: text, json', default: 'text' },
|
|
49
|
+
{ flag: '--auto-approve, -y', description: 'Auto-approve all tool permissions' },
|
|
50
|
+
{ flag: '--stdin', description: 'Read prompt from stdin (pipe support)' },
|
|
51
|
+
{ flag: '--model <model>', description: 'Override LLM model' },
|
|
52
|
+
{ flag: '--max-turns <n>', description: 'Maximum agent turns', default: '50' },
|
|
53
|
+
],
|
|
54
|
+
examples: [
|
|
55
|
+
'nimbus run "run terraform plan and summarize changes"',
|
|
56
|
+
'nimbus run "check for k8s pod restarts in production" --mode plan',
|
|
57
|
+
'nimbus run "apply the staging deployment" --mode deploy --auto-approve',
|
|
58
|
+
'echo "review my IAM policies" | nimbus run --stdin --format json',
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
|
|
42
62
|
chat: {
|
|
43
63
|
name: 'chat',
|
|
44
|
-
description: 'Interactive
|
|
64
|
+
description: 'Interactive DevOps agent — Terraform, Kubernetes, Helm, AWS, GCP, Azure',
|
|
45
65
|
usage: 'nimbus chat [options]',
|
|
46
66
|
options: [
|
|
47
67
|
{ flag: '-m, --message <text>', description: 'Send a single message (non-interactive)' },
|
|
@@ -298,10 +318,22 @@ const COMMANDS: Record<string, CommandDoc> = {
|
|
|
298
318
|
{ name: 'init', description: 'Initialize configuration interactively' },
|
|
299
319
|
{ name: 'reset', description: 'Reset configuration to defaults' },
|
|
300
320
|
],
|
|
321
|
+
options: [
|
|
322
|
+
{ flag: 'default-model <model>', description: 'Default LLM model to use', default: 'anthropic/claude-sonnet-4-6' },
|
|
323
|
+
{ flag: 'default-mode <mode>', description: 'Default agent mode: plan | build | deploy', default: 'build' },
|
|
324
|
+
{ flag: 'theme <theme>', description: 'TUI color theme: default | dark | light', default: 'default' },
|
|
325
|
+
{ flag: 'auto-approve <bool>', description: 'Auto-approve all tool permissions (true/false)', default: 'false' },
|
|
326
|
+
{ flag: 'max-tokens <n>', description: 'Maximum output tokens per LLM response', default: '8192' },
|
|
327
|
+
{ flag: 'telemetry <bool>', description: 'Enable anonymous usage analytics (true/false)', default: 'true' },
|
|
328
|
+
{ flag: 'serve.port <port>', description: 'Default port for nimbus serve', default: '4200' },
|
|
329
|
+
{ flag: 'serve.auth <user:pass>', description: 'HTTP Basic Auth for nimbus serve (user:password)' },
|
|
330
|
+
],
|
|
301
331
|
examples: [
|
|
302
332
|
'nimbus config list',
|
|
303
|
-
'nimbus config get
|
|
304
|
-
'nimbus config set
|
|
333
|
+
'nimbus config get default-model',
|
|
334
|
+
'nimbus config set default-model anthropic/claude-opus-4-6',
|
|
335
|
+
'nimbus config set auto-approve true',
|
|
336
|
+
'nimbus config set serve.port 8080',
|
|
305
337
|
],
|
|
306
338
|
},
|
|
307
339
|
|
|
@@ -406,6 +438,134 @@ const COMMANDS: Record<string, CommandDoc> = {
|
|
|
406
438
|
'nimbus team members',
|
|
407
439
|
],
|
|
408
440
|
},
|
|
441
|
+
|
|
442
|
+
drift: {
|
|
443
|
+
name: 'drift',
|
|
444
|
+
description: 'Detect infrastructure drift between desired state (IaC) and actual cloud state',
|
|
445
|
+
usage: 'nimbus drift [options]',
|
|
446
|
+
options: [
|
|
447
|
+
{ flag: '--provider <type>', description: 'IaC provider: terraform, kubernetes, helm', default: 'terraform' },
|
|
448
|
+
{ flag: '--workdir <path>', description: 'Working directory with IaC configs', default: '.' },
|
|
449
|
+
],
|
|
450
|
+
examples: [
|
|
451
|
+
'nimbus drift',
|
|
452
|
+
'nimbus drift --provider kubernetes',
|
|
453
|
+
'nimbus run "check for infrastructure drift" --mode plan',
|
|
454
|
+
],
|
|
455
|
+
},
|
|
456
|
+
|
|
457
|
+
cost: {
|
|
458
|
+
name: 'cost',
|
|
459
|
+
description: 'Estimate infrastructure costs from Terraform plans or working directory',
|
|
460
|
+
usage: 'nimbus cost [options]',
|
|
461
|
+
options: [
|
|
462
|
+
{ flag: '--plan-file <file>', description: 'Path to a saved Terraform plan file' },
|
|
463
|
+
{ flag: '--workdir <path>', description: 'Working directory containing Terraform config', default: '.' },
|
|
464
|
+
],
|
|
465
|
+
examples: [
|
|
466
|
+
'nimbus cost',
|
|
467
|
+
'nimbus cost --plan-file tfplan.json',
|
|
468
|
+
'nimbus run "estimate monthly cost for this infrastructure"',
|
|
469
|
+
],
|
|
470
|
+
},
|
|
471
|
+
|
|
472
|
+
'auth-refresh': {
|
|
473
|
+
name: 'auth-refresh',
|
|
474
|
+
description: 'Re-validate and refresh cloud provider credentials (AWS SSO, GCP, Azure)',
|
|
475
|
+
usage: 'nimbus auth-refresh [options]',
|
|
476
|
+
options: [
|
|
477
|
+
{ flag: '--provider <name>', description: 'Provider to refresh: aws, gcp, azure, all', default: 'all' },
|
|
478
|
+
],
|
|
479
|
+
examples: [
|
|
480
|
+
'nimbus auth-refresh',
|
|
481
|
+
'nimbus auth-refresh --provider aws',
|
|
482
|
+
'nimbus auth-refresh --provider gcp',
|
|
483
|
+
],
|
|
484
|
+
},
|
|
485
|
+
|
|
486
|
+
profile: {
|
|
487
|
+
name: 'profile',
|
|
488
|
+
description: 'Manage per-project credential profiles (AWS, kubectl, Terraform, GCP)',
|
|
489
|
+
usage: 'nimbus profile <list|create|set|delete|show> [name]',
|
|
490
|
+
subcommands: [
|
|
491
|
+
{ name: 'list', description: 'Show all profiles (current marked with *)' },
|
|
492
|
+
{ name: 'create <name>', description: 'Create a new profile (interactive wizard)' },
|
|
493
|
+
{ name: 'set <name>', description: 'Switch to a profile atomically (sets AWS_PROFILE, kubectl context, TF workspace)' },
|
|
494
|
+
{ name: 'delete <name>', description: 'Delete a profile' },
|
|
495
|
+
{ name: 'show [name]', description: 'Display profile details' },
|
|
496
|
+
],
|
|
497
|
+
examples: [
|
|
498
|
+
'nimbus profile list',
|
|
499
|
+
'nimbus profile create prod',
|
|
500
|
+
'nimbus profile set prod',
|
|
501
|
+
'nimbus profile delete staging',
|
|
502
|
+
],
|
|
503
|
+
},
|
|
504
|
+
|
|
505
|
+
incident: {
|
|
506
|
+
name: 'incident',
|
|
507
|
+
description: 'Launch an incident response session pre-loaded with alert context (G14)',
|
|
508
|
+
usage: 'nimbus incident <pagerduty-url-or-id|description> [--notes "observed behavior"]',
|
|
509
|
+
options: [
|
|
510
|
+
{ flag: '--notes <text>', description: 'Observed behavior or additional context' },
|
|
511
|
+
],
|
|
512
|
+
examples: [
|
|
513
|
+
'nimbus incident https://example.pagerduty.com/incidents/P1234',
|
|
514
|
+
'nimbus incident "high CPU on api-service pods" --notes "started after deploy at 14:00"',
|
|
515
|
+
'nimbus incident PABC123',
|
|
516
|
+
],
|
|
517
|
+
},
|
|
518
|
+
|
|
519
|
+
runbook: {
|
|
520
|
+
name: 'runbook',
|
|
521
|
+
description: 'Load and execute operational runbooks as agent prompts (G15)',
|
|
522
|
+
usage: 'nimbus runbook <list|run|create> [name]',
|
|
523
|
+
subcommands: [
|
|
524
|
+
{ name: 'list', description: 'List available runbooks' },
|
|
525
|
+
{ name: 'run <name>', description: 'Execute a runbook as an agent session' },
|
|
526
|
+
{ name: 'create <name>', description: 'Create a new runbook interactively' },
|
|
527
|
+
],
|
|
528
|
+
examples: [
|
|
529
|
+
'nimbus runbook list',
|
|
530
|
+
'nimbus runbook run rotate-certs',
|
|
531
|
+
'nimbus runbook run cert-rotation --auto',
|
|
532
|
+
'nimbus runbook create db-backup',
|
|
533
|
+
],
|
|
534
|
+
},
|
|
535
|
+
|
|
536
|
+
schedule: {
|
|
537
|
+
name: 'schedule',
|
|
538
|
+
description: 'Manage periodic DevOps automation tasks (G13)',
|
|
539
|
+
usage: 'nimbus schedule <list|add|remove|run-now>',
|
|
540
|
+
subcommands: [
|
|
541
|
+
{ name: 'list', description: 'List configured schedules with next-run times' },
|
|
542
|
+
{ name: 'add "<cron>" "<prompt>"', description: 'Add a new periodic task' },
|
|
543
|
+
{ name: 'remove <id-or-name>', description: 'Remove a schedule' },
|
|
544
|
+
{ name: 'run-now <id-or-name>', description: 'Execute a schedule immediately' },
|
|
545
|
+
],
|
|
546
|
+
examples: [
|
|
547
|
+
'nimbus schedule list',
|
|
548
|
+
'nimbus schedule add "0 8 * * *" "check for infrastructure drift" --name daily-drift',
|
|
549
|
+
'nimbus schedule add "0 9 * * 1" "generate weekly cost report"',
|
|
550
|
+
'nimbus schedule run-now daily-drift',
|
|
551
|
+
'nimbus schedule remove daily-drift',
|
|
552
|
+
],
|
|
553
|
+
},
|
|
554
|
+
|
|
555
|
+
export: {
|
|
556
|
+
name: 'export',
|
|
557
|
+
description: 'Export session conversation to markdown, HTML, or JSON (G19)',
|
|
558
|
+
usage: 'nimbus export [session-id] [--format md|html|json] [--output file]',
|
|
559
|
+
options: [
|
|
560
|
+
{ flag: '--format <fmt>', description: 'Output format: md, html, json', default: 'md' },
|
|
561
|
+
{ flag: '--output <file>', description: 'Save to file instead of stdout' },
|
|
562
|
+
],
|
|
563
|
+
examples: [
|
|
564
|
+
'nimbus export',
|
|
565
|
+
'nimbus export abc123 --format html --output session.html',
|
|
566
|
+
'nimbus export --format json > session.json',
|
|
567
|
+
],
|
|
568
|
+
},
|
|
409
569
|
};
|
|
410
570
|
|
|
411
571
|
/**
|
|
@@ -462,59 +622,75 @@ function showCommandHelp(commandName: string): void {
|
|
|
462
622
|
* Show general help
|
|
463
623
|
*/
|
|
464
624
|
function showGeneralHelp(): void {
|
|
465
|
-
ui.header('Nimbus
|
|
466
|
-
ui.print('
|
|
625
|
+
ui.header('Nimbus — AI-Powered DevOps Terminal');
|
|
626
|
+
ui.print('Plan, apply, and manage Terraform, Kubernetes, Helm, AWS, GCP, Azure with natural language.');
|
|
627
|
+
ui.print('Type a DevOps request directly or use any command below.');
|
|
467
628
|
ui.newLine();
|
|
468
629
|
|
|
469
630
|
ui.print('Usage:');
|
|
470
631
|
ui.print(' nimbus <command> [options]');
|
|
632
|
+
ui.print(' nimbus Open interactive DevOps agent TUI');
|
|
633
|
+
ui.print(' nimbus run "<prompt>" Run agent non-interactively');
|
|
634
|
+
ui.newLine();
|
|
635
|
+
|
|
636
|
+
ui.print('DevOps Operations:');
|
|
637
|
+
ui.print(' plan Preview infrastructure changes (tf/k8s/helm)');
|
|
638
|
+
ui.print(' apply Apply infrastructure changes');
|
|
639
|
+
ui.print(' tf <cmd> Terraform init/plan/apply/validate/destroy');
|
|
640
|
+
ui.print(' k8s <cmd> Kubernetes get/apply/delete/logs/scale');
|
|
641
|
+
ui.print(' helm <cmd> Helm install/upgrade/rollback/list');
|
|
642
|
+
ui.print(' drift Detect infrastructure drift (IaC vs actual)');
|
|
643
|
+
ui.print(' cost Estimate infrastructure costs');
|
|
644
|
+
ui.print(' status Live infra health dashboard (TF + K8s + Helm)');
|
|
471
645
|
ui.newLine();
|
|
472
646
|
|
|
473
|
-
ui.print('
|
|
474
|
-
ui.print('
|
|
475
|
-
ui.print('
|
|
476
|
-
ui.print('
|
|
477
|
-
ui.print('
|
|
647
|
+
ui.print('Incident & Automation:');
|
|
648
|
+
ui.print(' incident Incident response session with alert pre-loading');
|
|
649
|
+
ui.print(' runbook Load and execute operational runbooks');
|
|
650
|
+
ui.print(' schedule Manage periodic DevOps automation tasks');
|
|
651
|
+
ui.print(' rollout Safe rolling deployment management');
|
|
478
652
|
ui.newLine();
|
|
479
653
|
|
|
480
654
|
ui.print('Infrastructure Generation:');
|
|
481
|
-
ui.print(' generate terraform Generate Terraform from AWS infrastructure');
|
|
482
|
-
ui.print(' generate k8s Generate Kubernetes manifests');
|
|
655
|
+
ui.print(' generate terraform Generate Terraform from live AWS infrastructure');
|
|
656
|
+
ui.print(' generate k8s Generate Kubernetes manifests for your app');
|
|
483
657
|
ui.print(' generate helm Generate Helm values files');
|
|
484
658
|
ui.newLine();
|
|
485
659
|
|
|
486
|
-
ui.print('
|
|
487
|
-
ui.print('
|
|
488
|
-
ui.print('
|
|
489
|
-
ui.print('
|
|
490
|
-
ui.print('
|
|
491
|
-
ui.print(' helm <cmd> Helm operations');
|
|
660
|
+
ui.print('Cloud Auth & Profiles:');
|
|
661
|
+
ui.print(' auth-refresh Refresh AWS SSO, GCP, Azure credentials');
|
|
662
|
+
ui.print(' profile Manage per-project profiles (AWS, kubectl, TF, GCP)');
|
|
663
|
+
ui.print(' login Set up LLM provider authentication');
|
|
664
|
+
ui.print(' logout Clear stored credentials');
|
|
492
665
|
ui.newLine();
|
|
493
666
|
|
|
494
|
-
ui.print('
|
|
495
|
-
ui.print('
|
|
496
|
-
ui.print('
|
|
497
|
-
ui.print(' logout Clear credentials');
|
|
498
|
-
ui.print(' config Manage configuration');
|
|
667
|
+
ui.print('AI Agent:');
|
|
668
|
+
ui.print(' chat Interactive DevOps agent TUI (same as nimbus)');
|
|
669
|
+
ui.print(' run Run agent non-interactively with a prompt');
|
|
499
670
|
ui.newLine();
|
|
500
671
|
|
|
501
|
-
ui.print('
|
|
672
|
+
ui.print('Setup & Config:');
|
|
673
|
+
ui.print(' init Initialize Nimbus workspace (generates NIMBUS.md)');
|
|
674
|
+
ui.print(' config Manage global configuration');
|
|
675
|
+
ui.print(' doctor Run diagnostic checks on your installation');
|
|
502
676
|
ui.print(' history View command history');
|
|
503
|
-
ui.print('
|
|
677
|
+
ui.print(' export Export session to markdown/HTML/JSON');
|
|
504
678
|
ui.print(' version Show version info');
|
|
505
|
-
ui.print('
|
|
506
|
-
ui.newLine();
|
|
507
|
-
|
|
508
|
-
ui.print('Git & GitHub:');
|
|
509
|
-
ui.print(' git <cmd> Git operations');
|
|
510
|
-
ui.print(' gh <cmd> GitHub operations');
|
|
679
|
+
ui.print(' audit View audit logs');
|
|
511
680
|
ui.newLine();
|
|
512
681
|
|
|
513
|
-
ui.print('
|
|
514
|
-
ui.print('
|
|
515
|
-
ui.print('
|
|
516
|
-
ui.print('
|
|
517
|
-
ui.print('
|
|
682
|
+
ui.print('Slash Commands (in TUI):');
|
|
683
|
+
ui.print(' /plan Run infrastructure plan');
|
|
684
|
+
ui.print(' /apply Apply infrastructure changes (deploy mode)');
|
|
685
|
+
ui.print(' /k8s-ctx Switch Kubernetes context');
|
|
686
|
+
ui.print(' /tf-ws Switch Terraform workspace');
|
|
687
|
+
ui.print(' /mode Switch agent mode (plan/build/deploy)');
|
|
688
|
+
ui.print(' /model Switch LLM model');
|
|
689
|
+
ui.print(' /cost Show session cost');
|
|
690
|
+
ui.print(' /diff Show file diff modal');
|
|
691
|
+
ui.print(' /tree Toggle file tree sidebar');
|
|
692
|
+
ui.print(' /terminal Toggle terminal output pane');
|
|
693
|
+
ui.print(' ? Open keyboard shortcuts help');
|
|
518
694
|
ui.newLine();
|
|
519
695
|
|
|
520
696
|
ui.print('Get detailed help for a command:');
|
package/src/commands/history.ts
CHANGED
|
@@ -55,7 +55,7 @@ export async function historyCommand(options: HistoryOptions = {}): Promise<void
|
|
|
55
55
|
|
|
56
56
|
ui.header('Command History');
|
|
57
57
|
|
|
58
|
-
// Build query options
|
|
58
|
+
// Build query options — support tool=<name> and last=<N> filter shorthands (L1)
|
|
59
59
|
const queryOptions: HistoryQueryOptions = {
|
|
60
60
|
limit: options.limit || 20,
|
|
61
61
|
command: options.filter,
|
|
@@ -64,6 +64,13 @@ export async function historyCommand(options: HistoryOptions = {}): Promise<void
|
|
|
64
64
|
status: options.status,
|
|
65
65
|
};
|
|
66
66
|
|
|
67
|
+
if (options.filter?.startsWith('tool=')) {
|
|
68
|
+
queryOptions.command = options.filter.slice(5);
|
|
69
|
+
} else if (options.filter?.startsWith('last=')) {
|
|
70
|
+
queryOptions.limit = parseInt(options.filter.slice(5), 10) || queryOptions.limit;
|
|
71
|
+
queryOptions.command = undefined; // clear the default filter pass-through
|
|
72
|
+
}
|
|
73
|
+
|
|
67
74
|
const entries = await historyManager.getEntries(queryOptions);
|
|
68
75
|
|
|
69
76
|
if (entries.length === 0) {
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incident Command (G14)
|
|
3
|
+
*
|
|
4
|
+
* Pre-loads incident context (PagerDuty/Opsgenie alert, recent deployments,
|
|
5
|
+
* pod logs) and launches a focused TUI agent session.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* nimbus incident <pagerduty-url-or-id> [--notes "observed behavior"]
|
|
9
|
+
* nimbus incident "high CPU on api-service pod"
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { execSync } from 'node:child_process';
|
|
13
|
+
|
|
14
|
+
export interface IncidentOptions {
|
|
15
|
+
notes?: string;
|
|
16
|
+
autoApprove?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type AlertSource = 'pagerduty' | 'opsgenie' | 'plain';
|
|
20
|
+
|
|
21
|
+
interface ParsedIncident {
|
|
22
|
+
source: AlertSource;
|
|
23
|
+
id: string;
|
|
24
|
+
rawInput: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Detect incident source from URL or plain text.
|
|
29
|
+
*/
|
|
30
|
+
function parseIncidentInput(input: string): ParsedIncident {
|
|
31
|
+
if (/pagerduty\.com/i.test(input)) {
|
|
32
|
+
const match = input.match(/incidents?\/(P[A-Z0-9]+)/i);
|
|
33
|
+
return { source: 'pagerduty', id: match?.[1] ?? input, rawInput: input };
|
|
34
|
+
}
|
|
35
|
+
if (/opsgenie\.com/i.test(input) || /app\.opsgenie\.com/i.test(input)) {
|
|
36
|
+
const match = input.match(/alert\/([a-f0-9-]{36})/i);
|
|
37
|
+
return { source: 'opsgenie', id: match?.[1] ?? input, rawInput: input };
|
|
38
|
+
}
|
|
39
|
+
// Plain text description — use as-is
|
|
40
|
+
return { source: 'plain', id: input, rawInput: input };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Attempt to fetch PagerDuty incident details via API (if PD_API_TOKEN is set).
|
|
45
|
+
*/
|
|
46
|
+
async function fetchPagerDutyDetails(incidentId: string): Promise<string | null> {
|
|
47
|
+
const token = process.env.PD_API_TOKEN;
|
|
48
|
+
if (!token) return null;
|
|
49
|
+
try {
|
|
50
|
+
const curlCmd = `curl -sf -H "Authorization: Token token=${token}" -H "Accept: application/vnd.pagerduty+json;version=2" "https://api.pagerduty.com/incidents/${incidentId}"`;
|
|
51
|
+
const output = execSync(curlCmd, { encoding: 'utf-8', timeout: 10_000 });
|
|
52
|
+
const data = JSON.parse(output) as { incident?: { title?: string; service?: { summary?: string }; urgency?: string; status?: string; created_at?: string } };
|
|
53
|
+
if (data.incident) {
|
|
54
|
+
const inc = data.incident;
|
|
55
|
+
return [
|
|
56
|
+
`Title: ${inc.title ?? 'N/A'}`,
|
|
57
|
+
`Service: ${inc.service?.summary ?? 'N/A'}`,
|
|
58
|
+
`Urgency: ${inc.urgency ?? 'N/A'}`,
|
|
59
|
+
`Status: ${inc.status ?? 'N/A'}`,
|
|
60
|
+
`Created: ${inc.created_at ?? 'N/A'}`,
|
|
61
|
+
].join('\n');
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
// Non-critical — API fetch failure should not block the incident session
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Try to detect the service name from the incident description.
|
|
71
|
+
*/
|
|
72
|
+
function detectServiceName(incident: ParsedIncident): string | null {
|
|
73
|
+
// Common patterns: "api-service", "payment-worker", "nginx deployment"
|
|
74
|
+
const match = incident.rawInput.match(/\b([\w-]+(?:service|worker|api|pod|deploy(?:ment)?|ingress|controller)[\w-]*)\b/i);
|
|
75
|
+
return match?.[1] ?? null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Get last 3 Helm releases for a service (best-effort).
|
|
80
|
+
*/
|
|
81
|
+
function getRecentHelmHistory(serviceName: string): string {
|
|
82
|
+
try {
|
|
83
|
+
const out = execSync(`helm history ${serviceName} --max 3 --output json 2>/dev/null`, {
|
|
84
|
+
encoding: 'utf-8', timeout: 10_000,
|
|
85
|
+
});
|
|
86
|
+
const history = JSON.parse(out) as Array<{ revision: number; updated: string; status: string; chart: string; description: string }>;
|
|
87
|
+
if (history.length === 0) return '';
|
|
88
|
+
const lines = history.map(h => ` Rev ${h.revision}: ${h.chart} [${h.status}] ${h.updated} — ${h.description}`);
|
|
89
|
+
return `\nRecent Helm releases for ${serviceName}:\n${lines.join('\n')}`;
|
|
90
|
+
} catch {
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get recent pod logs for a service (best-effort).
|
|
97
|
+
*/
|
|
98
|
+
function getRecentPodLogs(serviceName: string): string {
|
|
99
|
+
try {
|
|
100
|
+
const out = execSync(
|
|
101
|
+
`kubectl logs -l app=${serviceName} --tail=50 --since=30m --all-containers 2>/dev/null | head -c 4096`,
|
|
102
|
+
{ encoding: 'utf-8', timeout: 15_000 }
|
|
103
|
+
);
|
|
104
|
+
if (!out.trim()) return '';
|
|
105
|
+
return `\nRecent pod logs (last 30m, ${serviceName}):\n${out.trim()}`;
|
|
106
|
+
} catch {
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Run the incident command — builds incident context and launches the agent.
|
|
113
|
+
*/
|
|
114
|
+
export async function incidentCommand(
|
|
115
|
+
incidentInput: string,
|
|
116
|
+
options: IncidentOptions = {}
|
|
117
|
+
): Promise<void> {
|
|
118
|
+
if (!incidentInput) {
|
|
119
|
+
console.error('Usage: nimbus incident <pagerduty-url-or-id|description> [--notes "observed behavior"]');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const incident = parseIncidentInput(incidentInput);
|
|
124
|
+
const contextParts: string[] = ['# Incident Response Session'];
|
|
125
|
+
|
|
126
|
+
// PD API details
|
|
127
|
+
if (incident.source === 'pagerduty') {
|
|
128
|
+
console.log(`Fetching PagerDuty incident ${incident.id}...`);
|
|
129
|
+
const pdDetails = await fetchPagerDutyDetails(incident.id);
|
|
130
|
+
if (pdDetails) {
|
|
131
|
+
contextParts.push(`\n## PagerDuty Alert (${incident.id})\n${pdDetails}`);
|
|
132
|
+
} else {
|
|
133
|
+
contextParts.push(`\n## Alert\nPagerDuty incident: ${incident.id}`);
|
|
134
|
+
if (!process.env.PD_API_TOKEN) {
|
|
135
|
+
contextParts.push('(Set PD_API_TOKEN env var to fetch full alert details)');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} else if (incident.source === 'opsgenie') {
|
|
139
|
+
contextParts.push(`\n## Alert\nOpsgenie incident: ${incident.id}`);
|
|
140
|
+
} else {
|
|
141
|
+
contextParts.push(`\n## Alert\n${incident.rawInput}`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Notes
|
|
145
|
+
if (options.notes) {
|
|
146
|
+
contextParts.push(`\n## Observed Behavior\n${options.notes}`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Service auto-detection + recent history
|
|
150
|
+
const serviceName = detectServiceName(incident);
|
|
151
|
+
if (serviceName) {
|
|
152
|
+
contextParts.push(`\n## Detected Service: ${serviceName}`);
|
|
153
|
+
const helmHistory = getRecentHelmHistory(serviceName);
|
|
154
|
+
if (helmHistory) contextParts.push(helmHistory);
|
|
155
|
+
const podLogs = getRecentPodLogs(serviceName);
|
|
156
|
+
if (podLogs) contextParts.push(podLogs);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
contextParts.push('\n## Your Task\nHelp resolve this incident. Start by diagnosing root cause from the context above, then suggest and (with permission) execute remediation steps.');
|
|
160
|
+
|
|
161
|
+
const initialPrompt = contextParts.join('\n');
|
|
162
|
+
|
|
163
|
+
// Launch the TUI chat session with the pre-loaded incident prompt
|
|
164
|
+
const { chatCommand } = await import('./chat');
|
|
165
|
+
await chatCommand({ initialPrompt, mode: 'deploy' });
|
|
166
|
+
}
|
package/src/commands/init.ts
CHANGED
|
@@ -44,6 +44,11 @@ export interface InitOptions {
|
|
|
44
44
|
fromExisting?: string;
|
|
45
45
|
/** Maximum directory depth for project scanning */
|
|
46
46
|
maxDepth?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Merge mode (M2): append ## Local Overrides to existing NIMBUS.md
|
|
49
|
+
* instead of overwriting it.
|
|
50
|
+
*/
|
|
51
|
+
merge?: boolean;
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
const NIMBUS_DIR = '.nimbus';
|
package/src/commands/login.ts
CHANGED
|
@@ -132,7 +132,7 @@ async function welcomeStep(_ctx: LoginWizardContext): Promise<StepResult> {
|
|
|
132
132
|
ui.box({
|
|
133
133
|
title: 'Welcome to Nimbus',
|
|
134
134
|
content: [
|
|
135
|
-
'AI-Powered
|
|
135
|
+
'AI-Powered DevOps Engineering Agent',
|
|
136
136
|
'',
|
|
137
137
|
"Let's get you set up with authentication",
|
|
138
138
|
'and LLM provider configuration.',
|
|
@@ -628,4 +628,89 @@ async function runNonInteractive(options: LoginOptions): Promise<boolean> {
|
|
|
628
628
|
return true;
|
|
629
629
|
}
|
|
630
630
|
|
|
631
|
+
/**
|
|
632
|
+
* Login to a cloud provider (AWS, GCP, Azure) via their CLI tools.
|
|
633
|
+
* G8: Guided cloud provider login flow.
|
|
634
|
+
*/
|
|
635
|
+
export async function loginCloudCommand(provider: 'aws' | 'gcp' | 'azure'): Promise<void> {
|
|
636
|
+
const { execFileSync } = await import('node:child_process');
|
|
637
|
+
const { existsSync } = await import('node:fs');
|
|
638
|
+
const { execSync } = await import('node:child_process');
|
|
639
|
+
|
|
640
|
+
const checkInPath = (cmd: string): boolean => {
|
|
641
|
+
try {
|
|
642
|
+
execSync(`which ${cmd}`, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
643
|
+
return true;
|
|
644
|
+
} catch {
|
|
645
|
+
return false;
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
if (provider === 'aws') {
|
|
650
|
+
if (!checkInPath('aws')) {
|
|
651
|
+
ui.error('AWS CLI not found in PATH.');
|
|
652
|
+
ui.print('Install it:');
|
|
653
|
+
if (process.platform === 'darwin') {
|
|
654
|
+
ui.print(' brew install awscli');
|
|
655
|
+
} else {
|
|
656
|
+
ui.print(' https://aws.amazon.com/cli/');
|
|
657
|
+
}
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
ui.info('Starting AWS credential configuration...');
|
|
661
|
+
ui.newLine();
|
|
662
|
+
try {
|
|
663
|
+
execFileSync('aws', ['configure'], { stdio: 'inherit' });
|
|
664
|
+
ui.newLine();
|
|
665
|
+
ui.success('AWS credentials configured.');
|
|
666
|
+
ui.print('For SSO login, run: aws sso login --profile <profile>');
|
|
667
|
+
} catch (e: unknown) {
|
|
668
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
669
|
+
ui.error(`AWS configure failed: ${msg}`);
|
|
670
|
+
}
|
|
671
|
+
} else if (provider === 'gcp') {
|
|
672
|
+
if (!checkInPath('gcloud')) {
|
|
673
|
+
ui.error('gcloud CLI not found in PATH.');
|
|
674
|
+
ui.print('Install it:');
|
|
675
|
+
if (process.platform === 'darwin') {
|
|
676
|
+
ui.print(' brew install --cask google-cloud-sdk');
|
|
677
|
+
} else {
|
|
678
|
+
ui.print(' https://cloud.google.com/sdk/docs/install');
|
|
679
|
+
}
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
ui.info('Starting GCP application default credentials login...');
|
|
683
|
+
ui.newLine();
|
|
684
|
+
try {
|
|
685
|
+
execFileSync('gcloud', ['auth', 'application-default', 'login'], { stdio: 'inherit' });
|
|
686
|
+
ui.newLine();
|
|
687
|
+
ui.success('GCP credentials configured.');
|
|
688
|
+
} catch (e: unknown) {
|
|
689
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
690
|
+
ui.error(`GCP login failed: ${msg}`);
|
|
691
|
+
}
|
|
692
|
+
} else if (provider === 'azure') {
|
|
693
|
+
if (!checkInPath('az')) {
|
|
694
|
+
ui.error('Azure CLI not found in PATH.');
|
|
695
|
+
ui.print('Install it:');
|
|
696
|
+
if (process.platform === 'darwin') {
|
|
697
|
+
ui.print(' brew install azure-cli');
|
|
698
|
+
} else {
|
|
699
|
+
ui.print(' https://learn.microsoft.com/en-us/cli/azure/install-azure-cli');
|
|
700
|
+
}
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
ui.info('Starting Azure login...');
|
|
704
|
+
ui.newLine();
|
|
705
|
+
try {
|
|
706
|
+
execFileSync('az', ['login'], { stdio: 'inherit' });
|
|
707
|
+
ui.newLine();
|
|
708
|
+
ui.success('Azure credentials configured.');
|
|
709
|
+
} catch (e: unknown) {
|
|
710
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
711
|
+
ui.error(`Azure login failed: ${msg}`);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
631
716
|
export default loginCommand;
|