@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
@@ -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 AI chat for cloud engineering assistance',
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 llm.provider',
304
- 'nimbus config set llm.model gpt-4',
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 CLI');
466
- ui.print('AI-powered Cloud Engineering Agent');
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('Chat & AI:');
474
- ui.print(' chat Interactive AI chat');
475
- ui.print(' ask Quick question/answer');
476
- ui.print(' explain Explain code or infrastructure');
477
- ui.print(' fix Fix errors with AI assistance');
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('Infrastructure Operations:');
487
- ui.print(' plan Preview infrastructure changes');
488
- ui.print(' apply Apply infrastructure changes');
489
- ui.print(' tf <cmd> Terraform operations');
490
- ui.print(' k8s <cmd> Kubernetes operations');
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('Setup & Configuration:');
495
- ui.print(' init Initialize Nimbus workspace');
496
- ui.print(' login Set up authentication');
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('Utilities:');
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(' doctor Run diagnostic checks');
677
+ ui.print(' export Export session to markdown/HTML/JSON');
504
678
  ui.print(' version Show version info');
505
- ui.print(' help Show this help message');
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('Enterprise:');
514
- ui.print(' team <cmd> Team management');
515
- ui.print(' billing <cmd> Billing management');
516
- ui.print(' usage Usage dashboard');
517
- ui.print(' audit Audit logs');
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:');
@@ -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
+ }
@@ -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';
@@ -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 Cloud Engineering Agent',
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;