@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
@@ -99,70 +99,75 @@ export function DeployPreview({ preview, onDecide }: DeployPreviewProps) {
99
99
  const counts = summaryCounts(preview.changes);
100
100
 
101
101
  return (
102
- <Box flexDirection="column" borderStyle="double" borderColor="yellow" paddingX={1} paddingY={1}>
103
- {/* Title */}
104
- <Box marginBottom={1}>
105
- <Text bold color="yellow">
106
- Deploy Preview
107
- </Text>
108
- <Text dimColor> ({preview.tool})</Text>
109
- </Box>
110
-
111
- {/* Summary counts */}
112
- <Box marginBottom={1}>
113
- <Text color="green">+{counts.add} to add</Text>
114
- <Text> </Text>
115
- <Text color="yellow">~{counts.change} to change</Text>
116
- <Text> </Text>
117
- <Text color="red">-{counts.destroy} to destroy</Text>
118
- </Box>
102
+ <Box flexDirection="column">
103
+ {/* G20: Tip line before the main content box */}
104
+ <Text dimColor>Tip: Run /plan to review changes in detail before applying.</Text>
119
105
 
120
- {/* Change table */}
121
- <Box flexDirection="column" marginBottom={1}>
122
- {preview.changes.map((change, idx) => (
123
- <ChangeRow key={idx} change={change} />
124
- ))}
125
- {preview.changes.length === 0 && <Text dimColor>No resource changes detected.</Text>}
126
- </Box>
106
+ <Box flexDirection="column" borderStyle="double" borderColor="yellow" paddingX={1} paddingY={1}>
107
+ {/* Title */}
108
+ <Box marginBottom={1}>
109
+ <Text bold color="yellow">
110
+ Deploy Preview
111
+ </Text>
112
+ <Text dimColor> ({preview.tool})</Text>
113
+ </Box>
127
114
 
128
- {/* Cost impact */}
129
- {preview.costImpact && (
130
- <Box>
131
- <Text dimColor>Cost impact: </Text>
132
- <Text>{preview.costImpact}</Text>
115
+ {/* Summary counts */}
116
+ <Box marginBottom={1}>
117
+ <Text color="green">+{counts.add} to add</Text>
118
+ <Text> </Text>
119
+ <Text color="yellow">~{counts.change} to change</Text>
120
+ <Text> </Text>
121
+ <Text color="red">-{counts.destroy} to destroy</Text>
133
122
  </Box>
134
- )}
135
123
 
136
- {/* Blast radius */}
137
- {preview.blastRadius && (
138
- <Box>
139
- <Text dimColor>Blast radius: </Text>
140
- <Text color="yellow">{preview.blastRadius}</Text>
124
+ {/* Change table */}
125
+ <Box flexDirection="column" marginBottom={1}>
126
+ {preview.changes.map((change, idx) => (
127
+ <ChangeRow key={idx} change={change} />
128
+ ))}
129
+ {preview.changes.length === 0 && <Text dimColor>No resource changes detected.</Text>}
141
130
  </Box>
142
- )}
143
131
 
144
- {/* Affected services */}
145
- {preview.affectedServices && preview.affectedServices.length > 0 && (
146
- <Box>
147
- <Text dimColor>Affected services: </Text>
148
- <Text>{preview.affectedServices.join(', ')}</Text>
132
+ {/* Cost impact */}
133
+ {preview.costImpact && (
134
+ <Box>
135
+ <Text dimColor>Cost impact: </Text>
136
+ <Text>{preview.costImpact}</Text>
137
+ </Box>
138
+ )}
139
+
140
+ {/* Blast radius */}
141
+ {preview.blastRadius && (
142
+ <Box>
143
+ <Text dimColor>Blast radius: </Text>
144
+ <Text color="yellow">{preview.blastRadius}</Text>
145
+ </Box>
146
+ )}
147
+
148
+ {/* Affected services */}
149
+ {preview.affectedServices && preview.affectedServices.length > 0 && (
150
+ <Box>
151
+ <Text dimColor>Affected services: </Text>
152
+ <Text>{preview.affectedServices.join(', ')}</Text>
153
+ </Box>
154
+ )}
155
+
156
+ {/* Action keys */}
157
+ <Box marginTop={1}>
158
+ <Text color="green" bold>
159
+ [a]
160
+ </Text>
161
+ <Text> Approve </Text>
162
+ <Text color="red" bold>
163
+ [r]
164
+ </Text>
165
+ <Text> Reject </Text>
166
+ <Text color="cyan" bold>
167
+ [p]
168
+ </Text>
169
+ <Text> Show full plan</Text>
149
170
  </Box>
150
- )}
151
-
152
- {/* Action keys */}
153
- <Box marginTop={1}>
154
- <Text color="green" bold>
155
- [a]
156
- </Text>
157
- <Text> Approve </Text>
158
- <Text color="red" bold>
159
- [r]
160
- </Text>
161
- <Text> Reject </Text>
162
- <Text color="cyan" bold>
163
- [p]
164
- </Text>
165
- <Text> Show full plan</Text>
166
171
  </Box>
167
172
  </Box>
168
173
  );
@@ -0,0 +1,162 @@
1
+ /**
2
+ * FileDiffModal Component
3
+ *
4
+ * Shows a proposed file change as a unified diff and waits for the user
5
+ * to approve or reject before the agent applies the change.
6
+ */
7
+
8
+ import React, { useState } from 'react';
9
+ import { Box, Text, useInput } from 'ink';
10
+
11
+ /** Decision returned by the file diff modal. */
12
+ export type FileDiffDecision = 'apply' | 'reject' | 'apply-all' | 'reject-all';
13
+
14
+ /**
15
+ * G9: A batch of file diffs to review sequentially.
16
+ *
17
+ * Use `queueFileDiffBatch` to present multiple diffs one at a time through
18
+ * the existing FileDiffModal, collecting per-file decisions.
19
+ */
20
+ export interface FileDiffBatch {
21
+ /** The diffs to review, in order. */
22
+ files: Array<{ filePath: string; diff: string; toolName: string }>;
23
+ /** Called when the user has decided on every file. */
24
+ onComplete: (decisions: FileDiffDecision[]) => void;
25
+ }
26
+
27
+ /**
28
+ * G9: Process a FileDiffBatch sequentially, presenting each diff via the
29
+ * provided `showDiff` callback (which renders a `FileDiffRequest`).
30
+ *
31
+ * The caller supplies `showDiff` which wires into App state. Each file is
32
+ * presented in order; 'apply-all' or 'reject-all' short-circuits the rest.
33
+ */
34
+ export function queueFileDiffBatch(
35
+ batch: FileDiffBatch,
36
+ showDiff: (req: FileDiffRequest) => void
37
+ ): void {
38
+ const decisions: FileDiffDecision[] = [];
39
+
40
+ function processNext(index: number): void {
41
+ if (index >= batch.files.length) {
42
+ batch.onComplete(decisions);
43
+ return;
44
+ }
45
+
46
+ const file = batch.files[index];
47
+ showDiff({
48
+ toolName: file.toolName,
49
+ filePath: file.filePath,
50
+ diff: file.diff,
51
+ currentIndex: index + 1,
52
+ totalCount: batch.files.length,
53
+ onDecide: (decision) => {
54
+ decisions.push(decision);
55
+ if (decision === 'apply-all') {
56
+ // Fill remaining with 'apply'
57
+ for (let i = index + 1; i < batch.files.length; i++) {
58
+ decisions.push('apply');
59
+ }
60
+ batch.onComplete(decisions);
61
+ } else if (decision === 'reject-all') {
62
+ // Fill remaining with 'reject'
63
+ for (let i = index + 1; i < batch.files.length; i++) {
64
+ decisions.push('reject');
65
+ }
66
+ batch.onComplete(decisions);
67
+ } else {
68
+ processNext(index + 1);
69
+ }
70
+ },
71
+ });
72
+ }
73
+
74
+ processNext(0);
75
+ }
76
+
77
+ /** A pending file diff request. */
78
+ export interface FileDiffRequest {
79
+ /** Tool that wants to modify the file. */
80
+ toolName: string;
81
+ /** Absolute or relative path of the file being changed. */
82
+ filePath: string;
83
+ /** Unified diff string (--- / +++ / @@ lines). */
84
+ diff: string;
85
+ /** 1-based index of this diff in the current batch (for progress display). */
86
+ currentIndex?: number;
87
+ /** Total number of diffs in the current batch (for progress display). */
88
+ totalCount?: number;
89
+ /** Callback invoked with the user's decision. */
90
+ onDecide: (d: FileDiffDecision) => void;
91
+ }
92
+
93
+ /** Props for the FileDiffModal component. */
94
+ export interface FileDiffModalProps {
95
+ request: FileDiffRequest;
96
+ }
97
+
98
+ const VISIBLE_LINES = 30;
99
+
100
+ /**
101
+ * Modal overlay that displays a proposed file diff and collects user approval.
102
+ *
103
+ * Keyboard bindings:
104
+ * a — Apply this change
105
+ * r — Reject this change
106
+ * A — Apply this and all remaining changes (skip future prompts)
107
+ * R — Reject this and all remaining changes
108
+ * ↑/↓ — Scroll up/down one line
109
+ * PgUp/PgDn — Scroll up/down one page
110
+ */
111
+ export function FileDiffModal({ request }: FileDiffModalProps) {
112
+ const [scrollOffset, setScrollOffset] = useState(0);
113
+
114
+ const diffLines = request.diff.split('\n');
115
+ const total = diffLines.length;
116
+ const maxOffset = Math.max(0, total - VISIBLE_LINES);
117
+
118
+ useInput((input, key) => {
119
+ if (input === 'a') request.onDecide('apply');
120
+ if (input === 'r') request.onDecide('reject');
121
+ if (input === 'A') request.onDecide('apply-all');
122
+ if (input === 'R') request.onDecide('reject-all');
123
+ if (key.upArrow) setScrollOffset(o => Math.max(0, o - 1));
124
+ if (key.downArrow) setScrollOffset(o => Math.min(maxOffset, o + 1));
125
+ if (key.pageUp) setScrollOffset(o => Math.max(0, o - VISIBLE_LINES));
126
+ if (key.pageDown) setScrollOffset(o => Math.min(maxOffset, o + VISIBLE_LINES));
127
+ });
128
+
129
+ const endLine = Math.min(scrollOffset + VISIBLE_LINES, total);
130
+ const displayLines = diffLines.slice(scrollOffset, endLine);
131
+
132
+ const progress =
133
+ request.totalCount && request.currentIndex
134
+ ? ` (${request.currentIndex}/${request.totalCount})`
135
+ : '';
136
+
137
+ const scrollIndicator = total > VISIBLE_LINES
138
+ ? ` [${scrollOffset + 1}–${endLine} of ${total} lines]`
139
+ : '';
140
+
141
+ return (
142
+ <Box flexDirection="column" borderStyle="round" borderColor="yellow" paddingX={1}>
143
+ <Text bold color="yellow">
144
+ {request.toolName}{progress}: {request.filePath}{scrollIndicator}
145
+ </Text>
146
+ <Box flexDirection="column" marginY={1}>
147
+ {displayLines.map((line, i) => {
148
+ let color: string | undefined;
149
+ if (line.startsWith('+') && !line.startsWith('+++')) color = 'green';
150
+ else if (line.startsWith('-') && !line.startsWith('---')) color = 'red';
151
+ else if (line.startsWith('@@')) color = 'cyan';
152
+ return (
153
+ <Text key={i} color={color} dimColor={!color}>
154
+ {line}
155
+ </Text>
156
+ );
157
+ })}
158
+ </Box>
159
+ <Text dimColor> [a] Apply [r] Reject [A] Apply all [R] Reject all [↑/↓] Scroll [PgUp/PgDn] Page</Text>
160
+ </Box>
161
+ );
162
+ }
package/src/ui/Header.tsx CHANGED
@@ -22,6 +22,13 @@ const MODE_COLORS: Record<AgentMode, string> = {
22
22
  deploy: 'red',
23
23
  };
24
24
 
25
+ /** Prominent mode labels for visual distinction (Gap 11). */
26
+ const MODE_LABELS: Record<AgentMode, string> = {
27
+ plan: '[P] PLAN',
28
+ build: '[B] BUILD',
29
+ deploy: '[D] DEPLOY',
30
+ };
31
+
25
32
  /**
26
33
  * Truncate a session ID to a short prefix for display purposes.
27
34
  */
@@ -29,40 +36,96 @@ function shortId(id: string): string {
29
36
  return id.length > 8 ? id.slice(0, 8) : id;
30
37
  }
31
38
 
39
+ /**
40
+ * Determine if an environment name is production-like.
41
+ */
42
+ function isProdEnvironment(name: string): boolean {
43
+ return /prod|production|live/i.test(name);
44
+ }
45
+
32
46
  /**
33
47
  * Header renders a single-line banner containing the CLI version, the model
34
48
  * name, the abbreviated session ID, and a colour-coded mode badge.
35
49
  */
36
50
  export function Header({ session }: HeaderProps) {
37
51
  const modeColor = MODE_COLORS[session.mode];
52
+ const modeLabel = MODE_LABELS[session.mode];
53
+ // Gap 11: deploy mode gets a red border on the entire header for visual urgency
54
+ const borderColor = session.mode === 'deploy' ? 'red' : 'cyan';
55
+
56
+ const tfColor = session.terraformWorkspace && isProdEnvironment(session.terraformWorkspace)
57
+ ? 'yellow'
58
+ : 'green';
59
+ const k8sColor = session.kubectlContext && isProdEnvironment(session.kubectlContext)
60
+ ? 'yellow'
61
+ : 'green';
62
+
63
+ const isProd = isProdEnvironment(session.terraformWorkspace ?? '') || isProdEnvironment(session.kubectlContext ?? '');
64
+ const showProdWarning = session.mode === 'deploy' && isProd;
38
65
 
39
66
  return (
40
- <Box
41
- borderStyle="round"
42
- borderColor="cyan"
43
- paddingX={1}
44
- justifyContent="space-between"
45
- width="100%"
46
- >
47
- {/* Left: branding + version */}
48
- <Box>
49
- <Text bold color="cyan">
50
- nimbus
51
- </Text>
52
- <Text dimColor> v{VERSION}</Text>
53
- <Text dimColor> {' \u2014 '}</Text>
54
- <Text>{session.model}</Text>
55
- <Text dimColor> {' \u2014 '}</Text>
56
- <Text dimColor>session: {shortId(session.id)}</Text>
57
- </Box>
67
+ <Box flexDirection="column" width="100%">
68
+ <Box
69
+ borderStyle="round"
70
+ borderColor={borderColor}
71
+ paddingX={1}
72
+ justifyContent="space-between"
73
+ width="100%"
74
+ >
75
+ {/* Left: branding + version */}
76
+ <Box>
77
+ <Text bold color="cyan">
78
+ nimbus
79
+ </Text>
80
+ <Text dimColor> v{VERSION}</Text>
81
+ <Text dimColor> {' -- '}</Text>
82
+ <Text>{session.model}</Text>
83
+ <Text dimColor> {' -- '}</Text>
84
+ <Text dimColor>session: {shortId(session.id)}</Text>
85
+ </Box>
86
+
87
+ {/* Center: infra context badges */}
88
+ <Box>
89
+ {session.llmHealth === 'checking' && <Text color="yellow" dimColor> [~] </Text>}
90
+ {session.llmHealth === 'ok' && <Text color="green"> [+] </Text>}
91
+ {session.llmHealth === 'error' && <Text color="red"> [-] no LLM</Text>}
92
+ {session.terraformWorkspace && (
93
+ <>
94
+ <Text> </Text>
95
+ <Text color={tfColor} bold>tf:{session.terraformWorkspace}</Text>
96
+ {isProdEnvironment(session.terraformWorkspace) && (
97
+ <Text color="red" bold> [PROD]</Text>
98
+ )}
99
+ </>
100
+ )}
101
+ {session.kubectlContext && (
102
+ <>
103
+ <Text> </Text>
104
+ <Text color={k8sColor} bold>k8s:{session.kubectlContext}</Text>
105
+ {isProdEnvironment(session.kubectlContext) && (
106
+ <Text color="red" bold> [PROD]</Text>
107
+ )}
108
+ </>
109
+ )}
110
+ {/* M2: Context switcher shortcut hint when context is active */}
111
+ {(session.terraformWorkspace || session.kubectlContext) && (
112
+ <Text dimColor> [/k8s-ctx | /tf-ws to switch]</Text>
113
+ )}
114
+ </Box>
58
115
 
59
- {/* Right: mode badge */}
60
- <Box>
61
- <Text color={modeColor} bold inverse>
62
- {' '}
63
- {session.mode.toUpperCase()}{' '}
64
- </Text>
116
+ {/* Right: mode badge */}
117
+ <Box>
118
+ <Text color={modeColor} bold inverse>
119
+ {' '}
120
+ {modeLabel}{' '}
121
+ </Text>
122
+ </Box>
65
123
  </Box>
124
+ {showProdWarning && (
125
+ <Box paddingX={2}>
126
+ <Text color="red" bold>!! DEPLOY MODE — targeting production environment !!</Text>
127
+ </Box>
128
+ )}
66
129
  </Box>
67
130
  );
68
131
  }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * HelpModal Component
3
+ *
4
+ * Dismissable overlay that shows all available slash commands and keyboard
5
+ * shortcuts without polluting the conversation history.
6
+ */
7
+
8
+ import React from 'react';
9
+ import { Box, Text, useInput } from 'ink';
10
+
11
+ interface HelpModalProps {
12
+ onClose: () => void;
13
+ }
14
+
15
+ export function HelpModal({ onClose }: HelpModalProps) {
16
+ useInput((input, key) => {
17
+ if (key.escape || input === 'q' || input === '?') onClose();
18
+ });
19
+
20
+ return (
21
+ <Box flexDirection="column" borderStyle="round" borderColor="cyan" padding={1} marginY={1}>
22
+ <Text bold color="cyan"> Nimbus DevOps Agent — Help </Text>
23
+ <Text> </Text>
24
+ <Text bold>Slash Commands:</Text>
25
+ <Text> /help Show this help</Text>
26
+ <Text> /mode plan Switch to plan mode (read-only tools)</Text>
27
+ <Text> /mode build Switch to build mode (file + infra tools)</Text>
28
+ <Text> /mode deploy Switch to deploy mode (all tools + previews)</Text>
29
+ <Text> /clear Clear conversation history</Text>
30
+ <Text> /compact Compress context to free tokens</Text>
31
+ <Text> /context Show context window usage</Text>
32
+ <Text> /cost Show token usage and cost</Text>
33
+ <Text> /diff Show unstaged git diff</Text>
34
+ <Text> /init Regenerate NIMBUS.md project context</Text>
35
+ <Text> /model [name] Show or switch the active model</Text>
36
+ <Text> /models List all available provider models</Text>
37
+ <Text> /undo Undo last file change (snapshot)</Text>
38
+ <Text> /redo Redo last undone change</Text>
39
+ <Text> /sessions List active sessions</Text>
40
+ <Text> /new [name] Create a new session</Text>
41
+ <Text> /switch {'<id>'} Switch to a different session</Text>
42
+ <Text> </Text>
43
+ <Text bold>DevOps Tools Available:</Text>
44
+ <Text> terraform, kubectl, helm, cloud_discover, cost_estimate,</Text>
45
+ <Text> drift_detect, deploy_preview, git, task (subagent)</Text>
46
+ <Text> </Text>
47
+ <Text bold>Keyboard Shortcuts:</Text>
48
+ <Text> ? Open this help panel</Text>
49
+ <Text> Tab Cycle mode (plan → build → deploy)</Text>
50
+ <Text> Ctrl+R Search input history</Text>
51
+ <Text> Ctrl+C Interrupt or exit</Text>
52
+ <Text> Esc / q / ? Close this help</Text>
53
+ <Text> </Text>
54
+ <Text dimColor>Press Esc, q, or ? to close</Text>
55
+ </Box>
56
+ );
57
+ }