@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.
Files changed (469) hide show
  1. package/bin/nimbus +26 -10
  2. package/bin/nimbus.cmd +41 -0
  3. package/bin/nimbus.mjs +70 -0
  4. package/completions/nimbus.bash +38 -0
  5. package/completions/nimbus.fish +48 -0
  6. package/completions/nimbus.zsh +81 -0
  7. package/dist/src/agent/compaction-agent.js +215 -0
  8. package/dist/src/agent/context-manager.js +385 -0
  9. package/dist/src/agent/context.js +322 -0
  10. package/dist/src/agent/deploy-preview.js +395 -0
  11. package/dist/src/agent/expand-files.js +95 -0
  12. package/dist/src/agent/index.js +18 -0
  13. package/dist/src/agent/loop.js +1535 -0
  14. package/dist/src/agent/modes.js +347 -0
  15. package/dist/src/agent/permissions.js +396 -0
  16. package/dist/src/agent/subagents/base.js +67 -0
  17. package/dist/src/agent/subagents/cost.js +45 -0
  18. package/dist/src/agent/subagents/explore.js +36 -0
  19. package/dist/src/agent/subagents/general.js +41 -0
  20. package/dist/src/agent/subagents/index.js +88 -0
  21. package/dist/src/agent/subagents/infra.js +52 -0
  22. package/dist/src/agent/subagents/security.js +60 -0
  23. package/dist/src/agent/system-prompt.js +860 -0
  24. package/dist/src/app.js +152 -0
  25. package/dist/src/audit/activity-log.js +209 -0
  26. package/dist/src/audit/compliance-checker.js +419 -0
  27. package/dist/src/audit/cost-tracker.js +231 -0
  28. package/dist/src/audit/index.js +10 -0
  29. package/dist/src/audit/security-scanner.js +490 -0
  30. package/dist/src/auth/guard.js +64 -0
  31. package/dist/src/auth/index.js +19 -0
  32. package/dist/src/auth/keychain.js +79 -0
  33. package/dist/src/auth/oauth.js +389 -0
  34. package/dist/src/auth/providers.js +415 -0
  35. package/dist/src/auth/sso.js +87 -0
  36. package/dist/src/auth/store.js +424 -0
  37. package/dist/src/auth/types.js +5 -0
  38. package/dist/src/cli/index.js +8 -0
  39. package/dist/src/cli/init.js +1048 -0
  40. package/dist/src/cli/openapi-spec.js +346 -0
  41. package/dist/src/cli/run.js +505 -0
  42. package/dist/src/cli/serve-auth.js +56 -0
  43. package/dist/src/cli/serve.js +432 -0
  44. package/dist/src/cli/web.js +50 -0
  45. package/dist/src/cli.js +1574 -0
  46. package/dist/src/clients/core-engine-client.js +156 -0
  47. package/dist/src/clients/enterprise-client.js +246 -0
  48. package/dist/src/clients/generator-client.js +219 -0
  49. package/dist/src/clients/git-client.js +367 -0
  50. package/dist/src/clients/github-client.js +229 -0
  51. package/dist/src/clients/helm-client.js +299 -0
  52. package/dist/src/clients/index.js +18 -0
  53. package/dist/src/clients/k8s-client.js +270 -0
  54. package/dist/src/clients/llm-client.js +119 -0
  55. package/dist/src/clients/rest-client.js +104 -0
  56. package/dist/src/clients/service-discovery.js +35 -0
  57. package/dist/src/clients/terraform-client.js +302 -0
  58. package/dist/src/clients/tools-client.js +1227 -0
  59. package/dist/src/clients/ws-client.js +93 -0
  60. package/dist/src/commands/alias.js +91 -0
  61. package/dist/src/commands/analyze/index.js +313 -0
  62. package/dist/src/commands/apply/helm.js +375 -0
  63. package/dist/src/commands/apply/index.js +176 -0
  64. package/dist/src/commands/apply/k8s.js +350 -0
  65. package/dist/src/commands/apply/terraform.js +465 -0
  66. package/dist/src/commands/ask.js +137 -0
  67. package/dist/src/commands/audit/index.js +322 -0
  68. package/dist/src/commands/auth-cloud.js +345 -0
  69. package/dist/src/commands/auth-list.js +112 -0
  70. package/dist/src/commands/auth-profile.js +104 -0
  71. package/dist/src/commands/auth-refresh.js +161 -0
  72. package/dist/src/commands/auth-status.js +122 -0
  73. package/dist/src/commands/aws/ec2.js +402 -0
  74. package/dist/src/commands/aws/iam.js +304 -0
  75. package/dist/src/commands/aws/index.js +108 -0
  76. package/dist/src/commands/aws/lambda.js +317 -0
  77. package/dist/src/commands/aws/rds.js +345 -0
  78. package/dist/src/commands/aws/s3.js +346 -0
  79. package/dist/src/commands/aws/vpc.js +302 -0
  80. package/dist/src/commands/aws-discover.js +413 -0
  81. package/dist/src/commands/aws-terraform.js +618 -0
  82. package/dist/src/commands/azure/aks.js +305 -0
  83. package/dist/src/commands/azure/functions.js +200 -0
  84. package/dist/src/commands/azure/index.js +93 -0
  85. package/dist/src/commands/azure/storage.js +378 -0
  86. package/dist/src/commands/azure/vm.js +291 -0
  87. package/dist/src/commands/billing/index.js +224 -0
  88. package/dist/src/commands/chat.js +259 -0
  89. package/dist/src/commands/completions.js +255 -0
  90. package/dist/src/commands/config.js +291 -0
  91. package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
  92. package/dist/src/commands/cost/estimator.js +73 -0
  93. package/dist/src/commands/cost/index.js +625 -0
  94. package/dist/src/commands/cost/parsers/terraform.js +234 -0
  95. package/dist/src/commands/cost/parsers/types.js +4 -0
  96. package/dist/src/commands/cost/pricing/aws.js +501 -0
  97. package/dist/src/commands/cost/pricing/azure.js +462 -0
  98. package/dist/src/commands/cost/pricing/gcp.js +359 -0
  99. package/dist/src/commands/cost/pricing/index.js +24 -0
  100. package/dist/src/commands/demo.js +196 -0
  101. package/dist/src/commands/deploy.js +215 -0
  102. package/dist/src/commands/doctor.js +1291 -0
  103. package/dist/src/commands/drift/index.js +674 -0
  104. package/dist/src/commands/explain.js +235 -0
  105. package/dist/src/commands/export.js +120 -0
  106. package/dist/src/commands/feedback.js +319 -0
  107. package/dist/src/commands/fix.js +263 -0
  108. package/dist/src/commands/fs/index.js +338 -0
  109. package/dist/src/commands/gcp/compute.js +266 -0
  110. package/dist/src/commands/gcp/functions.js +221 -0
  111. package/dist/src/commands/gcp/gke.js +357 -0
  112. package/dist/src/commands/gcp/iam.js +295 -0
  113. package/dist/src/commands/gcp/index.js +105 -0
  114. package/dist/src/commands/gcp/storage.js +232 -0
  115. package/dist/src/commands/generate-helm.js +1026 -0
  116. package/dist/src/commands/generate-k8s.js +1263 -0
  117. package/dist/src/commands/generate-terraform.js +1058 -0
  118. package/dist/src/commands/gh/index.js +663 -0
  119. package/dist/src/commands/git/index.js +1208 -0
  120. package/dist/src/commands/helm/index.js +985 -0
  121. package/dist/src/commands/help.js +639 -0
  122. package/dist/src/commands/history.js +120 -0
  123. package/dist/src/commands/import.js +782 -0
  124. package/dist/src/commands/incident.js +144 -0
  125. package/dist/src/commands/index.js +109 -0
  126. package/dist/src/commands/init.js +955 -0
  127. package/dist/src/commands/k8s/index.js +979 -0
  128. package/dist/src/commands/login.js +588 -0
  129. package/dist/src/commands/logout.js +61 -0
  130. package/dist/src/commands/logs.js +160 -0
  131. package/dist/src/commands/onboarding.js +382 -0
  132. package/dist/src/commands/pipeline.js +153 -0
  133. package/dist/src/commands/plan/display.js +216 -0
  134. package/dist/src/commands/plan/index.js +525 -0
  135. package/dist/src/commands/plugin.js +325 -0
  136. package/dist/src/commands/preview.js +356 -0
  137. package/dist/src/commands/profile.js +297 -0
  138. package/dist/src/commands/questionnaire.js +1021 -0
  139. package/dist/src/commands/resume.js +35 -0
  140. package/dist/src/commands/rollback.js +259 -0
  141. package/dist/src/commands/rollout.js +74 -0
  142. package/dist/src/commands/runbook.js +307 -0
  143. package/dist/src/commands/schedule.js +202 -0
  144. package/dist/src/commands/status.js +213 -0
  145. package/dist/src/commands/team/index.js +309 -0
  146. package/dist/src/commands/team-context.js +200 -0
  147. package/dist/src/commands/template.js +204 -0
  148. package/dist/src/commands/tf/index.js +989 -0
  149. package/dist/src/commands/upgrade.js +515 -0
  150. package/dist/src/commands/usage/index.js +118 -0
  151. package/dist/src/commands/version.js +145 -0
  152. package/dist/src/commands/watch.js +127 -0
  153. package/dist/src/compat/index.js +2 -0
  154. package/dist/src/compat/runtime.js +10 -0
  155. package/dist/src/compat/sqlite.js +144 -0
  156. package/dist/src/config/index.js +6 -0
  157. package/dist/src/config/manager.js +469 -0
  158. package/dist/src/config/mode-store.js +57 -0
  159. package/dist/src/config/profiles.js +66 -0
  160. package/dist/src/config/safety-policy.js +251 -0
  161. package/dist/src/config/schema.js +107 -0
  162. package/dist/src/config/types.js +311 -0
  163. package/dist/src/config/workspace-state.js +38 -0
  164. package/dist/src/context/context-db.js +138 -0
  165. package/dist/src/demo/index.js +295 -0
  166. package/dist/src/demo/scenarios/full-journey.js +226 -0
  167. package/dist/src/demo/scenarios/getting-started.js +124 -0
  168. package/dist/src/demo/scenarios/helm-release.js +334 -0
  169. package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
  170. package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
  171. package/dist/src/demo/types.js +6 -0
  172. package/dist/src/engine/cost-estimator.js +334 -0
  173. package/dist/src/engine/diagram-generator.js +192 -0
  174. package/dist/src/engine/drift-detector.js +688 -0
  175. package/dist/src/engine/executor.js +832 -0
  176. package/dist/src/engine/index.js +39 -0
  177. package/dist/src/engine/orchestrator.js +436 -0
  178. package/dist/src/engine/planner.js +616 -0
  179. package/dist/src/engine/safety.js +609 -0
  180. package/dist/src/engine/verifier.js +664 -0
  181. package/dist/src/enterprise/audit.js +241 -0
  182. package/dist/src/enterprise/auth.js +189 -0
  183. package/dist/src/enterprise/billing.js +512 -0
  184. package/dist/src/enterprise/index.js +16 -0
  185. package/dist/src/enterprise/teams.js +315 -0
  186. package/dist/src/generator/best-practices.js +1375 -0
  187. package/dist/src/generator/helm.js +495 -0
  188. package/dist/src/generator/index.js +11 -0
  189. package/dist/src/generator/intent-parser.js +420 -0
  190. package/dist/src/generator/kubernetes.js +773 -0
  191. package/dist/src/generator/terraform.js +1472 -0
  192. package/dist/src/history/index.js +6 -0
  193. package/dist/src/history/manager.js +199 -0
  194. package/dist/src/history/types.js +6 -0
  195. package/dist/src/hooks/config.js +318 -0
  196. package/dist/src/hooks/engine.js +317 -0
  197. package/dist/src/hooks/index.js +2 -0
  198. package/dist/src/llm/auth-bridge.js +157 -0
  199. package/dist/src/llm/circuit-breaker.js +116 -0
  200. package/dist/src/llm/config-loader.js +172 -0
  201. package/dist/src/llm/cost-calculator.js +137 -0
  202. package/dist/src/llm/index.js +7 -0
  203. package/dist/src/llm/model-aliases.js +99 -0
  204. package/dist/src/llm/provider-registry.js +57 -0
  205. package/dist/src/llm/providers/anthropic.js +430 -0
  206. package/dist/src/llm/providers/bedrock.js +409 -0
  207. package/dist/src/llm/providers/google.js +344 -0
  208. package/dist/src/llm/providers/ollama.js +661 -0
  209. package/dist/src/llm/providers/openai-compatible.js +289 -0
  210. package/dist/src/llm/providers/openai.js +284 -0
  211. package/dist/src/llm/providers/openrouter.js +293 -0
  212. package/dist/src/llm/router.js +844 -0
  213. package/dist/src/llm/types.js +69 -0
  214. package/dist/src/lsp/client.js +239 -0
  215. package/dist/src/lsp/languages.js +95 -0
  216. package/dist/src/lsp/manager.js +243 -0
  217. package/dist/src/mcp/client.js +289 -0
  218. package/dist/src/mcp/index.js +5 -0
  219. package/dist/src/mcp/manager.js +113 -0
  220. package/dist/src/nimbus.js +212 -0
  221. package/dist/src/plugins/index.js +13 -0
  222. package/dist/src/plugins/loader.js +280 -0
  223. package/dist/src/plugins/manager.js +282 -0
  224. package/dist/src/plugins/types.js +23 -0
  225. package/dist/src/scanners/cicd-scanner.js +230 -0
  226. package/dist/src/scanners/cloud-scanner.js +415 -0
  227. package/dist/src/scanners/framework-scanner.js +430 -0
  228. package/dist/src/scanners/iac-scanner.js +350 -0
  229. package/dist/src/scanners/index.js +454 -0
  230. package/dist/src/scanners/language-scanner.js +258 -0
  231. package/dist/src/scanners/package-manager-scanner.js +252 -0
  232. package/dist/src/scanners/types.js +6 -0
  233. package/dist/src/sessions/manager.js +395 -0
  234. package/dist/src/sessions/types.js +4 -0
  235. package/dist/src/sharing/sync.js +238 -0
  236. package/dist/src/sharing/viewer.js +131 -0
  237. package/dist/src/snapshots/index.js +1 -0
  238. package/dist/src/snapshots/manager.js +432 -0
  239. package/dist/src/state/artifacts.js +94 -0
  240. package/dist/src/state/audit.js +73 -0
  241. package/dist/src/state/billing.js +126 -0
  242. package/dist/src/state/checkpoints.js +81 -0
  243. package/dist/src/state/config.js +58 -0
  244. package/dist/src/state/conversations.js +7 -0
  245. package/dist/src/state/credentials.js +96 -0
  246. package/dist/src/state/db.js +53 -0
  247. package/dist/src/state/index.js +23 -0
  248. package/dist/src/state/messages.js +76 -0
  249. package/dist/src/state/projects.js +92 -0
  250. package/dist/src/state/schema.js +233 -0
  251. package/dist/src/state/sessions.js +79 -0
  252. package/dist/src/state/teams.js +131 -0
  253. package/dist/src/telemetry.js +91 -0
  254. package/dist/src/tools/aws-ops.js +747 -0
  255. package/dist/src/tools/azure-ops.js +491 -0
  256. package/dist/src/tools/file-ops.js +451 -0
  257. package/dist/src/tools/gcp-ops.js +559 -0
  258. package/dist/src/tools/git-ops.js +557 -0
  259. package/dist/src/tools/github-ops.js +460 -0
  260. package/dist/src/tools/helm-ops.js +634 -0
  261. package/dist/src/tools/index.js +16 -0
  262. package/dist/src/tools/k8s-ops.js +579 -0
  263. package/dist/src/tools/schemas/converter.js +129 -0
  264. package/dist/src/tools/schemas/devops.js +3319 -0
  265. package/dist/src/tools/schemas/index.js +19 -0
  266. package/dist/src/tools/schemas/standard.js +966 -0
  267. package/dist/src/tools/schemas/types.js +409 -0
  268. package/dist/src/tools/spawn-exec.js +109 -0
  269. package/dist/src/tools/terraform-ops.js +627 -0
  270. package/dist/src/types/config.js +1 -0
  271. package/dist/src/types/drift.js +4 -0
  272. package/dist/src/types/enterprise.js +5 -0
  273. package/dist/src/types/index.js +14 -0
  274. package/dist/src/types/plan.js +1 -0
  275. package/dist/src/types/request.js +1 -0
  276. package/dist/src/types/response.js +1 -0
  277. package/dist/src/types/service.js +1 -0
  278. package/dist/src/ui/App.js +1672 -0
  279. package/dist/src/ui/DeployPreview.js +60 -0
  280. package/dist/src/ui/FileDiffModal.js +108 -0
  281. package/dist/src/ui/Header.js +46 -0
  282. package/dist/src/ui/HelpModal.js +9 -0
  283. package/dist/src/ui/InputBox.js +408 -0
  284. package/dist/src/ui/MessageList.js +795 -0
  285. package/dist/src/ui/PermissionPrompt.js +72 -0
  286. package/dist/src/ui/StatusBar.js +109 -0
  287. package/dist/src/ui/TerminalPane.js +31 -0
  288. package/dist/src/ui/ToolCallDisplay.js +303 -0
  289. package/dist/src/ui/TreePane.js +83 -0
  290. package/dist/src/ui/chat-ui.js +721 -0
  291. package/dist/src/ui/index.js +11 -0
  292. package/dist/src/ui/ink/index.js +1325 -0
  293. package/dist/src/ui/streaming.js +137 -0
  294. package/dist/src/ui/theme.js +78 -0
  295. package/dist/src/ui/types.js +7 -0
  296. package/dist/src/utils/analytics.js +61 -0
  297. package/dist/src/utils/cost-warning.js +25 -0
  298. package/dist/src/utils/env.js +42 -0
  299. package/dist/src/utils/errors.js +54 -0
  300. package/dist/src/utils/event-bus.js +22 -0
  301. package/dist/src/utils/index.js +16 -0
  302. package/dist/src/utils/logger.js +150 -0
  303. package/dist/src/utils/rate-limiter.js +90 -0
  304. package/dist/src/utils/service-auth.js +36 -0
  305. package/dist/src/utils/validation.js +39 -0
  306. package/dist/src/version.js +3 -0
  307. package/dist/src/watcher/index.js +192 -0
  308. package/dist/src/wizard/approval.js +275 -0
  309. package/dist/src/wizard/index.js +13 -0
  310. package/dist/src/wizard/prompts.js +273 -0
  311. package/dist/src/wizard/types.js +4 -0
  312. package/dist/src/wizard/ui.js +453 -0
  313. package/dist/src/wizard/wizard.js +227 -0
  314. package/package.json +31 -23
  315. package/src/__tests__/alias.test.ts +133 -0
  316. package/src/__tests__/app.test.ts +1 -1
  317. package/src/__tests__/audit.test.ts +1 -1
  318. package/src/__tests__/circuit-breaker.test.ts +1 -1
  319. package/src/__tests__/cli-run.test.ts +237 -1
  320. package/src/__tests__/compat-sqlite.test.ts +68 -0
  321. package/src/__tests__/context-manager.test.ts +131 -1
  322. package/src/__tests__/context.test.ts +1 -1
  323. package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
  324. package/src/__tests__/doctor.test.ts +48 -0
  325. package/src/__tests__/enterprise.test.ts +1 -1
  326. package/src/__tests__/export.test.ts +236 -0
  327. package/src/__tests__/gap-11-18-20.test.ts +958 -0
  328. package/src/__tests__/generator.test.ts +1 -1
  329. package/src/__tests__/helm-streaming.test.ts +127 -0
  330. package/src/__tests__/hooks.test.ts +1 -1
  331. package/src/__tests__/incident.test.ts +179 -0
  332. package/src/__tests__/init.test.ts +55 -4
  333. package/src/__tests__/intent-parser.test.ts +1 -1
  334. package/src/__tests__/llm-router.test.ts +1 -1
  335. package/src/__tests__/logs.test.ts +107 -0
  336. package/src/__tests__/loop-errors.test.ts +244 -0
  337. package/src/__tests__/lsp.test.ts +1 -1
  338. package/src/__tests__/modes.test.ts +1 -1
  339. package/src/__tests__/perf-optimizations.test.ts +847 -0
  340. package/src/__tests__/permissions.test.ts +1 -1
  341. package/src/__tests__/pipeline.test.ts +50 -0
  342. package/src/__tests__/polish-phase3.test.ts +340 -0
  343. package/src/__tests__/profile.test.ts +237 -0
  344. package/src/__tests__/rollback.test.ts +83 -0
  345. package/src/__tests__/runbook.test.ts +219 -0
  346. package/src/__tests__/schedule.test.ts +206 -0
  347. package/src/__tests__/serve.test.ts +1 -1
  348. package/src/__tests__/sessions.test.ts +96 -1
  349. package/src/__tests__/sharing.test.ts +53 -1
  350. package/src/__tests__/snapshots.test.ts +1 -1
  351. package/src/__tests__/standalone-migration.test.ts +199 -0
  352. package/src/__tests__/state-db.test.ts +1 -1
  353. package/src/__tests__/status.test.ts +158 -0
  354. package/src/__tests__/stream-with-tools.test.ts +71 -25
  355. package/src/__tests__/subagents.test.ts +1 -1
  356. package/src/__tests__/system-prompt.test.ts +82 -3
  357. package/src/__tests__/terminal-gap-v2.test.ts +395 -0
  358. package/src/__tests__/terminal-parity.test.ts +393 -0
  359. package/src/__tests__/tf-apply.test.ts +187 -0
  360. package/src/__tests__/tool-converter.test.ts +1 -1
  361. package/src/__tests__/tool-schemas.test.ts +209 -4
  362. package/src/__tests__/tools.test.ts +4 -3
  363. package/src/__tests__/version-json.test.ts +184 -0
  364. package/src/__tests__/version.test.ts +1 -1
  365. package/src/__tests__/watch.test.ts +129 -0
  366. package/src/agent/compaction-agent.ts +40 -1
  367. package/src/agent/context-manager.ts +67 -3
  368. package/src/agent/deploy-preview.ts +62 -1
  369. package/src/agent/expand-files.ts +108 -0
  370. package/src/agent/loop.ts +1312 -31
  371. package/src/agent/permissions.ts +51 -4
  372. package/src/agent/system-prompt.ts +573 -19
  373. package/src/app.ts +58 -0
  374. package/src/audit/security-scanner.ts +45 -0
  375. package/src/auth/keychain.ts +82 -0
  376. package/src/auth/oauth.ts +15 -5
  377. package/src/cli/init.ts +378 -5
  378. package/src/cli/run.ts +407 -16
  379. package/src/cli/serve.ts +78 -1
  380. package/src/cli/web.ts +10 -6
  381. package/src/cli.ts +312 -1
  382. package/src/clients/service-discovery.ts +30 -25
  383. package/src/commands/alias.ts +100 -0
  384. package/src/commands/audit/index.ts +121 -2
  385. package/src/commands/auth-cloud.ts +113 -0
  386. package/src/commands/auth-refresh.ts +187 -0
  387. package/src/commands/aws-discover.ts +144 -251
  388. package/src/commands/aws-terraform.ts +68 -118
  389. package/src/commands/chat.ts +9 -3
  390. package/src/commands/completions.ts +268 -0
  391. package/src/commands/config.ts +26 -0
  392. package/src/commands/cost/index.ts +218 -2
  393. package/src/commands/deploy.ts +260 -0
  394. package/src/commands/doctor.ts +744 -152
  395. package/src/commands/drift/index.ts +371 -23
  396. package/src/commands/export.ts +146 -0
  397. package/src/commands/generate-k8s.ts +9 -61
  398. package/src/commands/generate-terraform.ts +191 -449
  399. package/src/commands/help.ts +212 -36
  400. package/src/commands/history.ts +8 -1
  401. package/src/commands/incident.ts +166 -0
  402. package/src/commands/init.ts +5 -0
  403. package/src/commands/login.ts +86 -1
  404. package/src/commands/logs.ts +167 -0
  405. package/src/commands/onboarding.ts +211 -34
  406. package/src/commands/pipeline.ts +186 -0
  407. package/src/commands/plugin.ts +398 -0
  408. package/src/commands/profile.ts +342 -0
  409. package/src/commands/questionnaire.ts +0 -98
  410. package/src/commands/resume.ts +26 -34
  411. package/src/commands/rollback.ts +315 -0
  412. package/src/commands/rollout.ts +88 -0
  413. package/src/commands/runbook.ts +346 -0
  414. package/src/commands/schedule.ts +236 -0
  415. package/src/commands/status.ts +252 -0
  416. package/src/commands/team-context.ts +220 -0
  417. package/src/commands/template.ts +58 -57
  418. package/src/commands/tf/index.ts +70 -11
  419. package/src/commands/upgrade.ts +57 -0
  420. package/src/commands/version.ts +54 -50
  421. package/src/commands/watch.ts +153 -0
  422. package/src/compat/runtime.ts +1 -1
  423. package/src/compat/sqlite.ts +75 -5
  424. package/src/config/mode-store.ts +62 -0
  425. package/src/config/profiles.ts +84 -0
  426. package/src/config/types.ts +83 -1
  427. package/src/config/workspace-state.ts +53 -0
  428. package/src/engine/cost-estimator.ts +52 -10
  429. package/src/engine/executor.ts +33 -2
  430. package/src/engine/planner.ts +68 -1
  431. package/src/generator/terraform.ts +8 -0
  432. package/src/history/manager.ts +2 -74
  433. package/src/hooks/engine.ts +5 -4
  434. package/src/llm/cost-calculator.ts +2 -2
  435. package/src/llm/providers/anthropic.ts +50 -21
  436. package/src/llm/router.ts +76 -7
  437. package/src/lsp/languages.ts +3 -0
  438. package/src/lsp/manager.ts +21 -5
  439. package/src/nimbus.ts +37 -18
  440. package/src/sessions/manager.ts +108 -1
  441. package/src/sharing/sync.ts +4 -0
  442. package/src/sharing/viewer.ts +66 -0
  443. package/src/tools/file-ops.ts +22 -0
  444. package/src/tools/schemas/devops.ts +3007 -117
  445. package/src/tools/schemas/standard.ts +5 -1
  446. package/src/tools/schemas/types.ts +31 -1
  447. package/src/tools/spawn-exec.ts +148 -0
  448. package/src/ui/App.tsx +1183 -66
  449. package/src/ui/DeployPreview.tsx +62 -57
  450. package/src/ui/FileDiffModal.tsx +162 -0
  451. package/src/ui/Header.tsx +87 -24
  452. package/src/ui/HelpModal.tsx +57 -0
  453. package/src/ui/InputBox.tsx +163 -10
  454. package/src/ui/MessageList.tsx +487 -40
  455. package/src/ui/PermissionPrompt.tsx +17 -5
  456. package/src/ui/StatusBar.tsx +122 -3
  457. package/src/ui/TerminalPane.tsx +84 -0
  458. package/src/ui/ToolCallDisplay.tsx +252 -18
  459. package/src/ui/TreePane.tsx +132 -0
  460. package/src/ui/chat-ui.ts +41 -44
  461. package/src/ui/ink/index.ts +771 -38
  462. package/src/ui/streaming.ts +1 -1
  463. package/src/ui/theme.ts +104 -0
  464. package/src/ui/types.ts +18 -0
  465. package/src/version.ts +1 -1
  466. package/src/watcher/index.ts +66 -15
  467. package/src/wizard/types.ts +1 -0
  468. package/src/wizard/ui.ts +1 -1
  469. package/tsconfig.json +2 -2
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Apply Helm Command
3
+ *
4
+ * Install or upgrade Helm releases
5
+ *
6
+ * Usage: nimbus apply helm <release> <chart> [options]
7
+ */
8
+ import { logger } from '../../utils';
9
+ import { ui, confirm, input } from '../../wizard';
10
+ import { helmClient } from '../../clients';
11
+ import { loadSafetyPolicy, evaluateSafety, } from '../../config/safety-policy';
12
+ import { promptForApproval, displaySafetySummary } from '../../wizard/approval';
13
+ /**
14
+ * Run helm install/upgrade command
15
+ */
16
+ export async function applyHelmCommand(options = {}) {
17
+ logger.info('Running helm apply', { options });
18
+ // Validate required options
19
+ let releaseName = options.releaseName;
20
+ let chart = options.chart;
21
+ if (!releaseName) {
22
+ releaseName = await input({
23
+ message: 'Release name:',
24
+ validate: value => {
25
+ if (!value) {
26
+ return 'Release name is required';
27
+ }
28
+ return true;
29
+ },
30
+ });
31
+ if (!releaseName) {
32
+ ui.error('Release name is required');
33
+ process.exit(1);
34
+ }
35
+ }
36
+ if (!chart) {
37
+ chart = await input({
38
+ message: 'Chart (path or name):',
39
+ defaultValue: '.',
40
+ validate: value => {
41
+ if (!value) {
42
+ return 'Chart is required';
43
+ }
44
+ return true;
45
+ },
46
+ });
47
+ if (!chart) {
48
+ ui.error('Chart is required');
49
+ process.exit(1);
50
+ }
51
+ }
52
+ ui.header('Helm Apply');
53
+ ui.info(`Release: ${releaseName}`);
54
+ ui.info(`Chart: ${chart}`);
55
+ if (options.namespace) {
56
+ ui.info(`Namespace: ${options.namespace}`);
57
+ }
58
+ ui.newLine();
59
+ // Check if helm client is available
60
+ const clientAvailable = await helmClient.isAvailable();
61
+ if (clientAvailable) {
62
+ // Use Helm tools service
63
+ await applyWithService(releaseName, chart, options);
64
+ }
65
+ else {
66
+ // Fall back to local helm CLI
67
+ await applyWithLocalCLI(releaseName, chart, options);
68
+ }
69
+ }
70
+ /**
71
+ * Apply using Helm Tools Service
72
+ */
73
+ async function applyWithService(releaseName, chart, options) {
74
+ // Check if release already exists
75
+ ui.startSpinner({ message: 'Checking existing releases...' });
76
+ const listResult = await helmClient.list({
77
+ namespace: options.namespace,
78
+ });
79
+ const existingRelease = listResult.releases.find(r => r.name === releaseName);
80
+ ui.stopSpinnerSuccess('');
81
+ const isUpgrade = !!existingRelease;
82
+ if (isUpgrade) {
83
+ ui.info(`Upgrading existing release (revision ${existingRelease.revision})`);
84
+ }
85
+ else {
86
+ ui.info('Installing new release');
87
+ }
88
+ ui.newLine();
89
+ // Dry run mode
90
+ if (options.dryRun) {
91
+ ui.startSpinner({ message: 'Running dry-run...' });
92
+ if (isUpgrade) {
93
+ const result = await helmClient.upgrade(releaseName, chart, {
94
+ namespace: options.namespace,
95
+ valuesFile: options.values,
96
+ version: options.version,
97
+ dryRun: true,
98
+ });
99
+ ui.stopSpinnerSuccess('Dry-run complete');
100
+ if (!result.success) {
101
+ ui.error(result.error || 'Unknown error');
102
+ process.exit(1);
103
+ }
104
+ if (result.output) {
105
+ ui.newLine();
106
+ ui.print(result.output);
107
+ }
108
+ }
109
+ else {
110
+ const result = await helmClient.install(releaseName, chart, {
111
+ namespace: options.namespace,
112
+ valuesFile: options.values,
113
+ version: options.version,
114
+ createNamespace: options.createNamespace,
115
+ dryRun: true,
116
+ });
117
+ ui.stopSpinnerSuccess('Dry-run complete');
118
+ if (!result.success) {
119
+ ui.error(result.error || 'Unknown error');
120
+ process.exit(1);
121
+ }
122
+ if (result.output) {
123
+ ui.newLine();
124
+ ui.print(result.output);
125
+ }
126
+ }
127
+ ui.newLine();
128
+ ui.info('No changes applied (dry-run mode)');
129
+ return;
130
+ }
131
+ // Run safety checks if not skipped
132
+ if (!options.skipSafety) {
133
+ const operation = isUpgrade ? 'upgrade' : 'install';
134
+ const safetyResult = await runHelmSafetyChecks(operation, releaseName, chart, options);
135
+ if (!safetyResult.passed) {
136
+ ui.newLine();
137
+ ui.error('Safety checks failed - operation blocked');
138
+ for (const blocker of safetyResult.blockers) {
139
+ ui.print(` ${ui.color('✗', 'red')} ${blocker.message}`);
140
+ }
141
+ process.exit(1);
142
+ }
143
+ // If safety requires approval, prompt for it
144
+ if (safetyResult.requiresApproval) {
145
+ const approvalResult = await promptForApproval({
146
+ title: `Helm ${isUpgrade ? 'Upgrade' : 'Install'}`,
147
+ operation: `helm ${operation}`,
148
+ risks: safetyResult.risks,
149
+ environment: options.environment,
150
+ affectedResources: [`${releaseName} (${chart})`],
151
+ });
152
+ if (!approvalResult.approved) {
153
+ ui.newLine();
154
+ ui.info(`Apply cancelled: ${approvalResult.reason || 'User declined'}`);
155
+ return;
156
+ }
157
+ }
158
+ else {
159
+ // Show safety summary and simple confirm
160
+ displaySafetySummary({
161
+ operation: `helm ${operation}`,
162
+ risks: safetyResult.risks,
163
+ passed: safetyResult.passed,
164
+ });
165
+ ui.newLine();
166
+ const proceed = await confirm({
167
+ message: isUpgrade
168
+ ? `Upgrade release '${releaseName}'?`
169
+ : `Install release '${releaseName}'?`,
170
+ defaultValue: true,
171
+ });
172
+ if (!proceed) {
173
+ ui.info('Apply cancelled');
174
+ return;
175
+ }
176
+ }
177
+ }
178
+ else {
179
+ // Simple confirmation when safety is skipped
180
+ const proceed = await confirm({
181
+ message: isUpgrade
182
+ ? `Upgrade release '${releaseName}'?`
183
+ : `Install release '${releaseName}'?`,
184
+ defaultValue: true,
185
+ });
186
+ if (!proceed) {
187
+ ui.info('Apply cancelled');
188
+ return;
189
+ }
190
+ }
191
+ // Install or upgrade
192
+ ui.newLine();
193
+ ui.startSpinner({
194
+ message: isUpgrade ? 'Upgrading release...' : 'Installing release...',
195
+ });
196
+ let result;
197
+ if (isUpgrade) {
198
+ result = await helmClient.upgrade(releaseName, chart, {
199
+ namespace: options.namespace,
200
+ valuesFile: options.values,
201
+ version: options.version,
202
+ wait: options.wait,
203
+ timeout: options.timeout,
204
+ });
205
+ }
206
+ else {
207
+ result = await helmClient.install(releaseName, chart, {
208
+ namespace: options.namespace,
209
+ valuesFile: options.values,
210
+ version: options.version,
211
+ createNamespace: options.createNamespace ?? true,
212
+ wait: options.wait,
213
+ timeout: options.timeout,
214
+ });
215
+ }
216
+ if (!result.success) {
217
+ ui.stopSpinnerFail(isUpgrade ? 'Upgrade failed' : 'Installation failed');
218
+ ui.error(result.error || 'Unknown error');
219
+ process.exit(1);
220
+ }
221
+ ui.stopSpinnerSuccess(isUpgrade ? 'Upgrade complete!' : 'Installation complete!');
222
+ // Track successful helm apply
223
+ try {
224
+ const { trackGeneration } = await import('../../telemetry');
225
+ trackGeneration('helm-apply', ['helm']);
226
+ }
227
+ catch {
228
+ /* telemetry failure is non-critical */
229
+ }
230
+ // Display release info
231
+ ui.newLine();
232
+ ui.print('Release Info:');
233
+ ui.print(` Name: ${result.release.name}`);
234
+ ui.print(` Namespace: ${result.release.namespace}`);
235
+ ui.print(` Revision: ${result.release.revision}`);
236
+ ui.print(` Status: ${result.release.status}`);
237
+ ui.print(` Chart: ${result.release.chart}`);
238
+ if (result.output) {
239
+ ui.newLine();
240
+ ui.print('Notes:');
241
+ ui.print(result.output);
242
+ }
243
+ }
244
+ /**
245
+ * Apply using local helm CLI
246
+ */
247
+ async function applyWithLocalCLI(releaseName, chart, options) {
248
+ const { spawn, execFileSync } = await import('child_process');
249
+ // Check if release exists (use execFileSync with args array to prevent shell injection)
250
+ let isUpgrade = false;
251
+ try {
252
+ const statusArgs = ['status', releaseName];
253
+ if (options.namespace) {
254
+ statusArgs.push('-n', options.namespace);
255
+ }
256
+ execFileSync('helm', statusArgs, { stdio: 'pipe' });
257
+ isUpgrade = true;
258
+ ui.info('Upgrading existing release');
259
+ }
260
+ catch {
261
+ ui.info('Installing new release');
262
+ }
263
+ ui.newLine();
264
+ // Build helm command
265
+ const command = isUpgrade ? 'upgrade' : 'install';
266
+ const args = [command, releaseName, chart];
267
+ if (options.namespace) {
268
+ args.push('-n', options.namespace);
269
+ }
270
+ if (options.values) {
271
+ args.push('-f', options.values);
272
+ }
273
+ if (options.valuesFiles) {
274
+ for (const vf of options.valuesFiles) {
275
+ args.push('-f', vf);
276
+ }
277
+ }
278
+ if (options.set) {
279
+ for (const [key, value] of Object.entries(options.set)) {
280
+ args.push('--set', `${key}=${value}`);
281
+ }
282
+ }
283
+ if (options.version) {
284
+ args.push('--version', options.version);
285
+ }
286
+ if (!isUpgrade && (options.createNamespace ?? true)) {
287
+ args.push('--create-namespace');
288
+ }
289
+ if (options.wait) {
290
+ args.push('--wait');
291
+ }
292
+ if (options.timeout) {
293
+ args.push('--timeout', options.timeout);
294
+ }
295
+ if (options.dryRun) {
296
+ args.push('--dry-run');
297
+ }
298
+ if (options.atomic) {
299
+ args.push('--atomic');
300
+ }
301
+ if (options.force) {
302
+ args.push('--force');
303
+ }
304
+ // For upgrade, always use --install flag
305
+ if (isUpgrade) {
306
+ args.push('--install');
307
+ }
308
+ // Redact sensitive values from --set flags before logging
309
+ const redactedArgs = [...args];
310
+ for (let i = 0; i < redactedArgs.length; i++) {
311
+ if ((redactedArgs[i] === '--set' ||
312
+ redactedArgs[i] === '--set-string' ||
313
+ redactedArgs[i] === '--set-file') &&
314
+ redactedArgs[i + 1]) {
315
+ const raw = redactedArgs[i + 1];
316
+ const eq = raw.indexOf('=');
317
+ redactedArgs[i + 1] = eq >= 0 ? `${raw.slice(0, eq + 1)}<REDACTED>` : '<REDACTED>';
318
+ }
319
+ }
320
+ ui.info(`Running: helm ${redactedArgs.join(' ')}`);
321
+ ui.newLine();
322
+ // Run helm
323
+ return new Promise((resolve, _reject) => {
324
+ const proc = spawn('helm', args, {
325
+ stdio: 'inherit',
326
+ });
327
+ proc.on('error', error => {
328
+ ui.error(`Failed to run helm: ${error.message}`);
329
+ ui.info('Make sure helm is installed and in your PATH');
330
+ process.exit(1);
331
+ });
332
+ proc.on('close', code => {
333
+ if (code === 0) {
334
+ ui.newLine();
335
+ ui.success(`Helm ${isUpgrade ? 'upgrade' : 'install'} completed successfully`);
336
+ // Track successful helm apply
337
+ try {
338
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
339
+ const { trackGeneration } = require('../../telemetry');
340
+ trackGeneration('helm-apply', ['helm']);
341
+ }
342
+ catch {
343
+ /* telemetry failure is non-critical */
344
+ }
345
+ resolve();
346
+ }
347
+ else {
348
+ ui.newLine();
349
+ ui.error(`Helm ${isUpgrade ? 'upgrade' : 'install'} failed with exit code ${code}`);
350
+ process.exit(code || 1);
351
+ }
352
+ });
353
+ });
354
+ }
355
+ /**
356
+ * Run safety checks for the operation
357
+ */
358
+ async function runHelmSafetyChecks(operation, releaseName, chart, options) {
359
+ const policy = loadSafetyPolicy();
360
+ const context = {
361
+ operation,
362
+ type: 'helm',
363
+ environment: options.environment,
364
+ resources: [`${releaseName}:${chart}`],
365
+ metadata: {
366
+ releaseName,
367
+ chart,
368
+ namespace: options.namespace,
369
+ version: options.version,
370
+ },
371
+ };
372
+ return evaluateSafety(context, policy);
373
+ }
374
+ // Export as default
375
+ export default applyHelmCommand;
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Apply Command
3
+ *
4
+ * Apply infrastructure changes for Terraform, Kubernetes, and Helm
5
+ *
6
+ * Usage: nimbus apply <type> [target] [options]
7
+ */
8
+ import { logger } from '../../utils';
9
+ import { ui } from '../../wizard';
10
+ import { applyTerraformCommand } from './terraform';
11
+ import { applyK8sCommand } from './k8s';
12
+ import { applyHelmCommand } from './helm';
13
+ /**
14
+ * Parse common apply options from args
15
+ */
16
+ export function parseApplyOptions(args) {
17
+ const options = {};
18
+ for (let i = 0; i < args.length; i++) {
19
+ const arg = args[i];
20
+ if (arg === '--dry-run') {
21
+ options.dryRun = true;
22
+ }
23
+ else if (arg === '--auto-approve' || arg === '-y' || arg === '--yes') {
24
+ options.autoApprove = true;
25
+ }
26
+ else if ((arg === '--target' || arg === '-t') && args[i + 1]) {
27
+ options.target = args[++i];
28
+ }
29
+ else if (arg === '--var' && args[i + 1]) {
30
+ const varArg = args[++i];
31
+ const [key, ...valueParts] = varArg.split('=');
32
+ options.var = options.var || {};
33
+ options.var[key] = valueParts.join('=');
34
+ }
35
+ else if (arg === '--var-file' && args[i + 1]) {
36
+ options.varFile = args[++i];
37
+ }
38
+ else if ((arg === '--namespace' || arg === '-n') && args[i + 1]) {
39
+ options.namespace = args[++i];
40
+ }
41
+ else if (arg === '--wait') {
42
+ options.wait = true;
43
+ }
44
+ else if (arg === '--timeout' && args[i + 1]) {
45
+ options.timeout = args[++i];
46
+ }
47
+ }
48
+ return options;
49
+ }
50
+ /**
51
+ * Detect infrastructure type from current directory
52
+ */
53
+ async function detectInfraType() {
54
+ const fs = await import('fs/promises');
55
+ // Check for Terraform files
56
+ try {
57
+ const files = await fs.readdir('.');
58
+ if (files.some(f => f.endsWith('.tf'))) {
59
+ return 'terraform';
60
+ }
61
+ }
62
+ catch {
63
+ // Ignore
64
+ }
65
+ // Check for Kubernetes manifests
66
+ try {
67
+ const files = await fs.readdir('.');
68
+ const yamlFiles = files.filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
69
+ for (const file of yamlFiles) {
70
+ const content = await fs.readFile(file, 'utf-8');
71
+ if (content.includes('apiVersion:') && content.includes('kind:')) {
72
+ return 'k8s';
73
+ }
74
+ }
75
+ }
76
+ catch {
77
+ // Ignore
78
+ }
79
+ // Check for Helm chart
80
+ try {
81
+ await fs.access('./Chart.yaml');
82
+ return 'helm';
83
+ }
84
+ catch {
85
+ // Ignore
86
+ }
87
+ // Check for values files (Helm)
88
+ try {
89
+ const files = await fs.readdir('.');
90
+ if (files.some(f => f.startsWith('values') && (f.endsWith('.yaml') || f.endsWith('.yml')))) {
91
+ return 'helm';
92
+ }
93
+ }
94
+ catch {
95
+ // Ignore
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Run the apply command
101
+ */
102
+ export async function applyCommand(type, args) {
103
+ logger.info('Running apply command', { type, args });
104
+ // Parse common options
105
+ const options = parseApplyOptions(args);
106
+ // Get positional arguments (after type)
107
+ const positionalArgs = args.filter(arg => !arg.startsWith('-') && !arg.includes('='));
108
+ // Auto-detect type if not provided
109
+ if (!type || type.startsWith('-')) {
110
+ ui.startSpinner({ message: 'Detecting infrastructure type...' });
111
+ const detectedType = await detectInfraType();
112
+ ui.stopSpinnerSuccess('');
113
+ if (!detectedType) {
114
+ ui.error('Could not detect infrastructure type');
115
+ ui.newLine();
116
+ ui.info('Usage: nimbus apply <type> [target] [options]');
117
+ ui.info('');
118
+ ui.info('Types:');
119
+ ui.info(' terraform Apply Terraform configuration');
120
+ ui.info(' k8s Apply Kubernetes manifests');
121
+ ui.info(' helm Install/upgrade Helm release');
122
+ process.exit(1);
123
+ }
124
+ type = detectedType;
125
+ ui.info(`Detected infrastructure type: ${type}`);
126
+ ui.newLine();
127
+ }
128
+ switch (type) {
129
+ case 'terraform':
130
+ case 'tf':
131
+ await applyTerraformCommand({
132
+ directory: positionalArgs[0] || options.target || '.',
133
+ dryRun: options.dryRun,
134
+ autoApprove: options.autoApprove,
135
+ var: options.var,
136
+ varFile: options.varFile,
137
+ target: options.target,
138
+ });
139
+ break;
140
+ case 'k8s':
141
+ case 'kubernetes':
142
+ await applyK8sCommand({
143
+ manifests: positionalArgs[0] || options.target || '.',
144
+ namespace: options.namespace,
145
+ dryRun: options.dryRun,
146
+ wait: options.wait,
147
+ });
148
+ break;
149
+ case 'helm': {
150
+ // For Helm, we need release name and chart
151
+ const releaseName = positionalArgs[0];
152
+ const chartPath = positionalArgs[1] || '.';
153
+ await applyHelmCommand({
154
+ releaseName,
155
+ chart: chartPath,
156
+ namespace: options.namespace,
157
+ dryRun: options.dryRun,
158
+ wait: options.wait,
159
+ timeout: options.timeout,
160
+ values: options.varFile,
161
+ });
162
+ break;
163
+ }
164
+ default:
165
+ ui.error(`Unknown apply type: ${type}`);
166
+ ui.newLine();
167
+ ui.info('Supported types: terraform, k8s, helm');
168
+ process.exit(1);
169
+ }
170
+ }
171
+ // Export subcommands
172
+ export { applyTerraformCommand } from './terraform';
173
+ export { applyK8sCommand } from './k8s';
174
+ export { applyHelmCommand } from './helm';
175
+ // Export as default
176
+ export default applyCommand;