@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,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Command
|
|
3
|
+
*
|
|
4
|
+
* Display CLI and component version information
|
|
5
|
+
*
|
|
6
|
+
* Usage: nimbus version [options]
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from '../utils';
|
|
9
|
+
import { ui } from '../wizard';
|
|
10
|
+
/**
|
|
11
|
+
* Get the CLI version from package.json or environment
|
|
12
|
+
*/
|
|
13
|
+
function getCliVersion() {
|
|
14
|
+
// Try environment variable first (set during build)
|
|
15
|
+
if (process.env.NIMBUS_VERSION) {
|
|
16
|
+
return process.env.NIMBUS_VERSION;
|
|
17
|
+
}
|
|
18
|
+
// Try npm_package_version (available when run via npm/bun)
|
|
19
|
+
if (process.env.npm_package_version) {
|
|
20
|
+
return process.env.npm_package_version;
|
|
21
|
+
}
|
|
22
|
+
// Fallback to reading package.json
|
|
23
|
+
try {
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
25
|
+
const pkg = require('../../package.json');
|
|
26
|
+
return pkg.version || '0.1.0';
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return '0.1.0';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get Bun version if running under Bun
|
|
34
|
+
*/
|
|
35
|
+
function getBunVersion() {
|
|
36
|
+
// Check for Bun global
|
|
37
|
+
const globalAny = globalThis;
|
|
38
|
+
if (typeof globalAny.Bun !== 'undefined') {
|
|
39
|
+
return globalAny.Bun.version;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Fetch DevOps CLI tool versions (for verbose mode)
|
|
45
|
+
*/
|
|
46
|
+
async function fetchDevOpsVersions() {
|
|
47
|
+
const { execFileSync } = await import('child_process');
|
|
48
|
+
const tools = [
|
|
49
|
+
{ name: 'terraform', args: ['version', '-json'] },
|
|
50
|
+
{ name: 'kubectl', args: ['version', '--client', '--output=json'] },
|
|
51
|
+
{ name: 'helm', args: ['version', '--short'] },
|
|
52
|
+
{ name: 'aws', args: ['--version'] },
|
|
53
|
+
{ name: 'gcloud', args: ['version'] },
|
|
54
|
+
{ name: 'az', args: ['version'] },
|
|
55
|
+
];
|
|
56
|
+
const versions = {};
|
|
57
|
+
for (const tool of tools) {
|
|
58
|
+
try {
|
|
59
|
+
const output = execFileSync(tool.name, tool.args, {
|
|
60
|
+
encoding: 'utf-8',
|
|
61
|
+
timeout: 5000,
|
|
62
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
63
|
+
});
|
|
64
|
+
// Try to parse version string from JSON output
|
|
65
|
+
let version = 'installed';
|
|
66
|
+
try {
|
|
67
|
+
const parsed = JSON.parse(output);
|
|
68
|
+
version =
|
|
69
|
+
parsed.terraform_version ||
|
|
70
|
+
parsed.clientVersion?.gitVersion ||
|
|
71
|
+
'installed';
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
const match = output.match(/[\d]+\.[\d]+\.[\d]+/);
|
|
75
|
+
if (match)
|
|
76
|
+
version = `v${match[0]}`;
|
|
77
|
+
}
|
|
78
|
+
versions[tool.name] = version;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
versions[tool.name] = 'not installed';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return versions;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Run the version command
|
|
88
|
+
*/
|
|
89
|
+
export async function versionCommand(options = {}) {
|
|
90
|
+
logger.debug('Running version command', { options });
|
|
91
|
+
const cliVersion = getCliVersion();
|
|
92
|
+
const versionInfo = {
|
|
93
|
+
cli: cliVersion,
|
|
94
|
+
node: process.version,
|
|
95
|
+
bun: getBunVersion(),
|
|
96
|
+
platform: process.platform,
|
|
97
|
+
arch: process.arch,
|
|
98
|
+
};
|
|
99
|
+
// Fetch DevOps tool versions in verbose mode
|
|
100
|
+
if (options.verbose) {
|
|
101
|
+
ui.startSpinner({ message: 'Checking DevOps tool versions...' });
|
|
102
|
+
versionInfo.components = await fetchDevOpsVersions();
|
|
103
|
+
ui.stopSpinnerSuccess('');
|
|
104
|
+
}
|
|
105
|
+
// JSON output — expose `version` field (alias for `cli`) for L3 compatibility
|
|
106
|
+
if (options.json) {
|
|
107
|
+
const jsonOutput = {
|
|
108
|
+
version: cliVersion,
|
|
109
|
+
node: versionInfo.node,
|
|
110
|
+
platform: versionInfo.platform,
|
|
111
|
+
arch: versionInfo.arch,
|
|
112
|
+
cli: versionInfo.cli,
|
|
113
|
+
};
|
|
114
|
+
if (versionInfo.bun)
|
|
115
|
+
jsonOutput.bun = versionInfo.bun;
|
|
116
|
+
if (versionInfo.components)
|
|
117
|
+
jsonOutput.components = versionInfo.components;
|
|
118
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
119
|
+
process.exit(0);
|
|
120
|
+
}
|
|
121
|
+
// Human-readable output
|
|
122
|
+
ui.print(`nimbus version ${versionInfo.cli}`);
|
|
123
|
+
if (options.verbose) {
|
|
124
|
+
ui.newLine();
|
|
125
|
+
ui.print(`Runtime:`);
|
|
126
|
+
if (versionInfo.bun) {
|
|
127
|
+
ui.print(` Bun: ${versionInfo.bun}`);
|
|
128
|
+
}
|
|
129
|
+
ui.print(` Node: ${versionInfo.node}`);
|
|
130
|
+
ui.print(` Platform: ${versionInfo.platform}`);
|
|
131
|
+
ui.print(` Arch: ${versionInfo.arch}`);
|
|
132
|
+
if (versionInfo.components) {
|
|
133
|
+
ui.newLine();
|
|
134
|
+
ui.print(`DevOps Tools:`);
|
|
135
|
+
for (const [name, version] of Object.entries(versionInfo.components)) {
|
|
136
|
+
const isInstalled = version !== 'not installed';
|
|
137
|
+
const icon = isInstalled ? '[+]' : '[-]';
|
|
138
|
+
const color = isInstalled ? 'green' : 'red';
|
|
139
|
+
ui.print(` ${ui.color(icon, color)} ${name.padEnd(12)} ${version}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Export as default command
|
|
145
|
+
export default versionCommand;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nimbus watch — Watch files and trigger agent runs on change (M3)
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* nimbus watch "*.tf" --run "validate the terraform changes"
|
|
6
|
+
* nimbus watch "src/**" --run "run tests" --debounce 2000
|
|
7
|
+
*/
|
|
8
|
+
import { basename } from 'node:path';
|
|
9
|
+
import { watch as fsWatch } from 'node:fs';
|
|
10
|
+
/**
|
|
11
|
+
* Simple glob pattern matching without external dependencies.
|
|
12
|
+
* Supports: *.ext, *.*, prefix/**, prefix/name.ext
|
|
13
|
+
*/
|
|
14
|
+
function matchGlob(filename, pattern) {
|
|
15
|
+
// Normalize separators
|
|
16
|
+
const f = filename.replace(/\\/g, '/');
|
|
17
|
+
const p = pattern.replace(/\\/g, '/');
|
|
18
|
+
// Convert glob pattern to regex
|
|
19
|
+
const regexStr = p
|
|
20
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&') // escape regex special chars (but not * and ?)
|
|
21
|
+
.replace(/\*\*/g, '__GLOBSTAR__')
|
|
22
|
+
.replace(/\*/g, '[^/]*')
|
|
23
|
+
.replace(/\?/g, '[^/]')
|
|
24
|
+
.replace(/__GLOBSTAR__/g, '.*');
|
|
25
|
+
const re = new RegExp(`^${regexStr}$`);
|
|
26
|
+
// Also match against basename for simple patterns like "*.tf"
|
|
27
|
+
const base = basename(f);
|
|
28
|
+
return re.test(f) || (!/\//.test(p) && re.test(base));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Start watching files matching the glob pattern.
|
|
32
|
+
* On change, triggers an agent run with the configured prompt.
|
|
33
|
+
*/
|
|
34
|
+
export async function watchCommand(options) {
|
|
35
|
+
const { glob, run, debounce = 500, autoApprove = false, maxRuns = 0 } = options;
|
|
36
|
+
if (!glob) {
|
|
37
|
+
console.error('Usage: nimbus watch <glob> --run "prompt"');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
if (!run) {
|
|
41
|
+
console.error('Error: --run "prompt" is required for watch command');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const cwd = process.cwd();
|
|
45
|
+
console.log(`Watching ${glob} in ${cwd}...`);
|
|
46
|
+
console.log(`On change, will run: "${run}"`);
|
|
47
|
+
console.log('Press Ctrl+C to stop.\n');
|
|
48
|
+
let debounceTimer = null;
|
|
49
|
+
let runCount = 0;
|
|
50
|
+
let isRunning = false;
|
|
51
|
+
async function triggerRun(changedFile) {
|
|
52
|
+
if (isRunning) {
|
|
53
|
+
return; // Skip concurrent runs
|
|
54
|
+
}
|
|
55
|
+
if (maxRuns > 0 && runCount >= maxRuns) {
|
|
56
|
+
console.log(`\nMaximum runs (${maxRuns}) reached. Stopping watcher.`);
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
runCount++;
|
|
60
|
+
isRunning = true;
|
|
61
|
+
const prompt = `${run}\n\nChanged file: ${changedFile}`;
|
|
62
|
+
try {
|
|
63
|
+
console.log(`\n[${new Date().toLocaleTimeString()}] Change detected: ${changedFile}`);
|
|
64
|
+
console.log(`Running: nimbus run "${run}"\n`);
|
|
65
|
+
const { initApp } = await import('../app');
|
|
66
|
+
const { executeRun } = await import('../cli/run');
|
|
67
|
+
const { router } = await initApp();
|
|
68
|
+
await executeRun(router, {
|
|
69
|
+
prompt,
|
|
70
|
+
format: 'text',
|
|
71
|
+
autoApprove,
|
|
72
|
+
stdin: false,
|
|
73
|
+
stdinJson: false,
|
|
74
|
+
mode: 'build',
|
|
75
|
+
maxTurns: 10,
|
|
76
|
+
rawToolOutput: false,
|
|
77
|
+
schema: false,
|
|
78
|
+
dryRun: false,
|
|
79
|
+
exitOnError: false,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error(`Run failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
isRunning = false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function onChange(filename) {
|
|
90
|
+
if (!filename)
|
|
91
|
+
return;
|
|
92
|
+
// Check if the file matches the glob pattern
|
|
93
|
+
if (!matchGlob(filename, glob))
|
|
94
|
+
return;
|
|
95
|
+
// Debounce rapid successive changes
|
|
96
|
+
if (debounceTimer)
|
|
97
|
+
clearTimeout(debounceTimer);
|
|
98
|
+
debounceTimer = setTimeout(() => {
|
|
99
|
+
debounceTimer = null;
|
|
100
|
+
triggerRun(filename).catch(err => {
|
|
101
|
+
console.error('Watch trigger error:', err);
|
|
102
|
+
});
|
|
103
|
+
}, debounce);
|
|
104
|
+
}
|
|
105
|
+
let watcher;
|
|
106
|
+
try {
|
|
107
|
+
watcher = fsWatch(cwd, { recursive: true }, (_eventType, filename) => {
|
|
108
|
+
onChange(filename);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(`Failed to start watcher: ${error instanceof Error ? error.message : String(error)}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
// Handle shutdown gracefully
|
|
116
|
+
process.on('SIGINT', () => {
|
|
117
|
+
console.log('\nWatcher stopped.');
|
|
118
|
+
watcher.close();
|
|
119
|
+
process.exit(0);
|
|
120
|
+
});
|
|
121
|
+
process.on('SIGTERM', () => {
|
|
122
|
+
watcher.close();
|
|
123
|
+
process.exit(0);
|
|
124
|
+
});
|
|
125
|
+
// Keep process alive
|
|
126
|
+
await new Promise(() => { });
|
|
127
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Compatibility Layer
|
|
3
|
+
*
|
|
4
|
+
* Detects whether we're running under Bun or Node.js and provides
|
|
5
|
+
* compatibility shims for Bun-specific APIs when running under Node.
|
|
6
|
+
*/
|
|
7
|
+
/** Whether the current runtime is Bun. */
|
|
8
|
+
export const isBun = typeof globalThis.Bun !== 'undefined';
|
|
9
|
+
/** Whether the current runtime is Node.js (without Bun). */
|
|
10
|
+
export const isNode = !isBun && typeof process !== 'undefined' && !!process.versions?.node;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Compatibility Layer
|
|
3
|
+
*
|
|
4
|
+
* Uses bun:sqlite when running under Bun, falls back to better-sqlite3
|
|
5
|
+
* under Node.js. Both libraries have nearly identical APIs.
|
|
6
|
+
*
|
|
7
|
+
* Exports:
|
|
8
|
+
* - `Database` (value) -- the constructor, usable as `new Database(path)`
|
|
9
|
+
* - `Database` (type) -- the instance interface, usable as `db: Database`
|
|
10
|
+
*
|
|
11
|
+
* This dual export mirrors how a native `class` declaration works in
|
|
12
|
+
* TypeScript: the same identifier serves as both a value and a type.
|
|
13
|
+
*/
|
|
14
|
+
import { isBun } from './runtime';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Runtime selection
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Re-export the Database class from the appropriate backend.
|
|
19
|
+
// Both bun:sqlite and better-sqlite3 expose a compatible API:
|
|
20
|
+
// new Database(path), db.exec(sql), db.prepare(sql).run/get/all, db.close()
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
let _Impl;
|
|
23
|
+
if (isBun) {
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
25
|
+
_Impl = require('bun:sqlite').Database;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
try {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
30
|
+
const BetterSqlite3 = require('better-sqlite3');
|
|
31
|
+
// Polyfill bun:sqlite-compatible methods on better-sqlite3 instances
|
|
32
|
+
const OrigProto = BetterSqlite3.prototype;
|
|
33
|
+
if (!OrigProto.run) {
|
|
34
|
+
OrigProto.run = function (sql, params) {
|
|
35
|
+
const stmt = this.prepare(sql);
|
|
36
|
+
return params ? stmt.run(...params) : stmt.run();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (!OrigProto.query) {
|
|
40
|
+
OrigProto.query = function (sql) {
|
|
41
|
+
return this.prepare(sql);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
_Impl = BetterSqlite3;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// G1: Path 3 — sql.js fallback (pure WASM, no native build required)
|
|
48
|
+
try {
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
50
|
+
const initSqlJs = require('sql.js');
|
|
51
|
+
process.stderr.write('[nimbus] WARNING: Running in in-memory SQLite mode (no persistence).\n' +
|
|
52
|
+
'[nimbus] Install better-sqlite3 for full functionality: npm install better-sqlite3\n');
|
|
53
|
+
let sqlJsDb = null;
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
const getSqlJsDb = () => {
|
|
56
|
+
if (!sqlJsDb)
|
|
57
|
+
throw new Error('sql.js database not yet initialised — call new Database() first');
|
|
58
|
+
return sqlJsDb;
|
|
59
|
+
};
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
class SqlJsDatabase {
|
|
62
|
+
constructor(_path) {
|
|
63
|
+
// Synchronously initialise — sql.js init is async but we use a trick:
|
|
64
|
+
// initSqlJs() returns a promise; we store a sentinel and resolve lazily.
|
|
65
|
+
// For simplicity, initialise synchronously with the default WASM bundle.
|
|
66
|
+
try {
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
const SQL = initSqlJs({ locateFile: () => '' });
|
|
69
|
+
if (SQL && SQL.then) {
|
|
70
|
+
// async — best-effort; DB will be ready after first await
|
|
71
|
+
SQL.then((s) => { sqlJsDb = new s.Database(); });
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
sqlJsDb = new SQL.Database();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// fallback: leave sqlJsDb null, operations will throw with clear message
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exec(sql) { getSqlJsDb().run(sql); }
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
prepare(sql) {
|
|
84
|
+
const db = getSqlJsDb();
|
|
85
|
+
const stmt = db.prepare(sql);
|
|
86
|
+
return {
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
run: (...params) => { stmt.run(params); return {}; },
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
get: (...params) => { stmt.bind(params); return stmt.step() ? stmt.getAsObject() : undefined; },
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
all: (...params) => { const rows = []; stmt.bind(params); while (stmt.step())
|
|
93
|
+
rows.push(stmt.getAsObject()); return rows; },
|
|
94
|
+
finalize: () => stmt.free(),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
close() { getSqlJsDb().close(); sqlJsDb = null; }
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
99
|
+
transaction(fn) {
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
101
|
+
return (...args) => {
|
|
102
|
+
getSqlJsDb().run('BEGIN');
|
|
103
|
+
try {
|
|
104
|
+
const r = fn(...args);
|
|
105
|
+
getSqlJsDb().run('COMMIT');
|
|
106
|
+
return r;
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
try {
|
|
110
|
+
getSqlJsDb().run('ROLLBACK');
|
|
111
|
+
}
|
|
112
|
+
catch { /* ignore */ }
|
|
113
|
+
throw e;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
run(sql, params) {
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
return params ? getSqlJsDb().run(sql, params) : getSqlJsDb().run(sql);
|
|
120
|
+
}
|
|
121
|
+
query(sql) { return this.prepare(sql); }
|
|
122
|
+
}
|
|
123
|
+
_Impl = SqlJsDatabase;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
throw new Error('Nimbus requires either the Bun runtime (bun:sqlite) or the better-sqlite3 package.\n' +
|
|
127
|
+
'Install better-sqlite3: npm install better-sqlite3\n' +
|
|
128
|
+
'Or install Bun: curl -fsSL https://bun.sh/install | bash');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Dual export: value + type under the same name
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
/**
|
|
136
|
+
* The Database constructor at runtime.
|
|
137
|
+
*
|
|
138
|
+
* TypeScript resolves `Database` to either the *value* (constructor) or
|
|
139
|
+
* the *type* (instance interface) depending on context:
|
|
140
|
+
* - `new Database(path)` -- uses the value
|
|
141
|
+
* - `db: Database` -- uses the type (the interface below)
|
|
142
|
+
*/
|
|
143
|
+
const Database = _Impl;
|
|
144
|
+
export { Database };
|