@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,255 @@
1
+ /**
2
+ * Shell Completion Auto-Installer (L7)
3
+ *
4
+ * Installs shell completions for bash, zsh, and fish.
5
+ * Completion scripts are generated dynamically from the CLI command list.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import * as os from 'node:os';
10
+ import { ui } from '../wizard/ui';
11
+ const COMMANDS = [
12
+ 'chat', 'run', 'init', 'login', 'logout', 'doctor', 'cost',
13
+ 'sessions', 'audit', 'share', 'upgrade', 'serve', 'web',
14
+ 'auth-refresh', 'plugin', 'completions', 'team-context',
15
+ 'logs', 'pipeline', 'alias',
16
+ ];
17
+ /**
18
+ * L4: Get available kubectl contexts for shell completion.
19
+ */
20
+ function getKubeContexts() {
21
+ try {
22
+ const { execFileSync } = require('node:child_process');
23
+ return execFileSync('kubectl', ['config', 'get-contexts', '--no-headers', '-o', 'name'], { encoding: 'utf-8', timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'] })
24
+ .trim()
25
+ .split('\n')
26
+ .filter(Boolean);
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ /**
33
+ * L2: Get terraform workspaces for dynamic shell completion.
34
+ */
35
+ function getTerraformWorkspaces() {
36
+ try {
37
+ const { execFileSync } = require('node:child_process');
38
+ return execFileSync('terraform', ['workspace', 'list'], {
39
+ encoding: 'utf-8',
40
+ timeout: 3000,
41
+ stdio: ['pipe', 'pipe', 'pipe'],
42
+ })
43
+ .split('\n')
44
+ .map((l) => l.replace(/^\*?\s*/, '').trim())
45
+ .filter(Boolean);
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ /**
52
+ * L2: Get helm releases for dynamic shell completion.
53
+ */
54
+ function getHelmReleases() {
55
+ try {
56
+ const { execFileSync } = require('node:child_process');
57
+ return execFileSync('helm', ['list', '--short'], {
58
+ encoding: 'utf-8',
59
+ timeout: 3000,
60
+ stdio: ['pipe', 'pipe', 'pipe'],
61
+ })
62
+ .trim()
63
+ .split('\n')
64
+ .filter(Boolean);
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ }
70
+ /**
71
+ * L2: Dynamic completion dispatcher.
72
+ * Called from shell with: nimbus __complete <prev_word> <curr_word>
73
+ */
74
+ export function dynamicComplete(prevWord, _currWord) {
75
+ let suggestions = [];
76
+ if (prevWord === 'workspace' || prevWord === 'ws') {
77
+ suggestions = getTerraformWorkspaces();
78
+ }
79
+ else if (prevWord === 'switch' || prevWord === 'context') {
80
+ suggestions = getKubeContexts();
81
+ }
82
+ else if (prevWord === 'upgrade' || prevWord === 'rollback') {
83
+ suggestions = getHelmReleases();
84
+ }
85
+ if (suggestions.length > 0) {
86
+ process.stdout.write(suggestions.join('\n') + '\n');
87
+ }
88
+ }
89
+ const FLAGS = [
90
+ '--help', '--version', '--model', '--mode', '--auto-approve',
91
+ '--format', '--verbose', '--json', '--fix',
92
+ ];
93
+ function generateBashCompletion() {
94
+ return `# Nimbus bash completion
95
+ _nimbus_completions() {
96
+ local cur prev
97
+ COMPREPLY=()
98
+ cur="\${COMP_WORDS[COMP_CWORD]}"
99
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
100
+
101
+ local commands="${COMMANDS.join(' ')}"
102
+ local flags="${FLAGS.join(' ')}"
103
+
104
+ if [ \$COMP_CWORD -eq 1 ]; then
105
+ COMPREPLY=( \$(compgen -W "\$commands" -- "\$cur") )
106
+ else
107
+ COMPREPLY=( \$(compgen -W "\$flags" -- "\$cur") )
108
+ fi
109
+ }
110
+
111
+ complete -F _nimbus_completions nimbus
112
+ `;
113
+ }
114
+ function generateZshCompletion() {
115
+ const commandDefs = COMMANDS.map(c => ` '${c}:${c} command'`).join('\n');
116
+ const kubeContexts = getKubeContexts();
117
+ const contextCompletion = kubeContexts.length > 0
118
+ ? `\n '--context[kubectl context]:context:(${kubeContexts.join(' ')})' \\`
119
+ : '';
120
+ return `#compdef nimbus
121
+ # Nimbus zsh completion
122
+
123
+ _nimbus() {
124
+ local state
125
+
126
+ _arguments \\
127
+ '1: :->command' \\${contextCompletion}
128
+ '*: :->args'
129
+
130
+ case \$state in
131
+ command)
132
+ _describe 'nimbus commands' \\
133
+ (
134
+ ${commandDefs}
135
+ )
136
+ ;;
137
+ args)
138
+ _arguments \\
139
+ '--help[Show help]' \\
140
+ '--version[Show version]' \\
141
+ '--model[Specify LLM model]:model:' \\
142
+ '--mode[Agent mode (plan/build/deploy)]:mode:(plan build deploy)' \\
143
+ '--auto-approve[Auto-approve all actions]' \\
144
+ '--format[Output format]:format:(json text)'
145
+ ;;
146
+ esac
147
+ }
148
+
149
+ _nimbus
150
+ `;
151
+ }
152
+ function generateFishCompletion() {
153
+ const cmdCompletions = COMMANDS.map(c => `complete -c nimbus -f -n '__fish_use_subcommand' -a '${c}'`).join('\n');
154
+ return `# Nimbus fish completion
155
+
156
+ ${cmdCompletions}
157
+
158
+ complete -c nimbus -l help -d 'Show help'
159
+ complete -c nimbus -l version -d 'Show version'
160
+ complete -c nimbus -l model -d 'Specify LLM model' -r
161
+ complete -c nimbus -l mode -d 'Agent mode' -r -a 'plan build deploy'
162
+ complete -c nimbus -l auto-approve -d 'Auto-approve all actions'
163
+ complete -c nimbus -l format -d 'Output format' -r -a 'json text'
164
+ `;
165
+ }
166
+ export async function completionsCommand(subcommand) {
167
+ switch (subcommand) {
168
+ case 'install': {
169
+ const shell = path.basename(process.env.SHELL ?? '/bin/bash');
170
+ ui.info(`Detected shell: ${shell}`);
171
+ if (shell === 'bash') {
172
+ const dir = path.join(os.homedir(), '.bash_completion.d');
173
+ const file = path.join(dir, 'nimbus.bash');
174
+ fs.mkdirSync(dir, { recursive: true });
175
+ fs.writeFileSync(file, generateBashCompletion(), 'utf-8');
176
+ // Add source to .bashrc if not already there
177
+ const bashrc = path.join(os.homedir(), '.bashrc');
178
+ const sourceLine = `\n# Nimbus completions\n[ -f "${file}" ] && source "${file}"\n`;
179
+ let alreadyConfigured = false;
180
+ try {
181
+ const existing = fs.readFileSync(bashrc, 'utf-8');
182
+ if (!existing.includes('nimbus.bash')) {
183
+ fs.appendFileSync(bashrc, sourceLine);
184
+ }
185
+ else {
186
+ alreadyConfigured = true;
187
+ }
188
+ }
189
+ catch {
190
+ fs.appendFileSync(bashrc, sourceLine);
191
+ }
192
+ ui.print(`${ui.color('✓', 'green')} Installed bash completions to ${file}`);
193
+ if (alreadyConfigured) {
194
+ ui.print(' Already configured, skipping.');
195
+ }
196
+ else {
197
+ ui.print(' Restart your shell or run: source ~/.bashrc');
198
+ }
199
+ }
200
+ else if (shell === 'zsh') {
201
+ const dir = path.join(os.homedir(), '.zsh', 'completions');
202
+ const file = path.join(dir, '_nimbus');
203
+ fs.mkdirSync(dir, { recursive: true });
204
+ fs.writeFileSync(file, generateZshCompletion(), 'utf-8');
205
+ ui.print(`${ui.color('✓', 'green')} Installed zsh completions to ${file}`);
206
+ ui.print(' Add to .zshrc: fpath=(~/.zsh/completions $fpath) && autoload -U compinit && compinit');
207
+ ui.print(' Restart your shell or run: source ~/.zshrc');
208
+ }
209
+ else if (shell === 'fish') {
210
+ const dir = path.join(os.homedir(), '.config', 'fish', 'completions');
211
+ const file = path.join(dir, 'nimbus.fish');
212
+ fs.mkdirSync(dir, { recursive: true });
213
+ fs.writeFileSync(file, generateFishCompletion(), 'utf-8');
214
+ ui.print(`${ui.color('✓', 'green')} Installed fish completions to ${file}`);
215
+ ui.print(' Fish completions are active immediately. Restart your shell to confirm.');
216
+ }
217
+ else {
218
+ ui.warning(`Shell "${shell}" not supported. Supported: bash, zsh, fish`);
219
+ }
220
+ break;
221
+ }
222
+ case 'uninstall': {
223
+ const shell = path.basename(process.env.SHELL ?? '/bin/bash');
224
+ const files = [
225
+ path.join(os.homedir(), '.bash_completion.d', 'nimbus.bash'),
226
+ path.join(os.homedir(), '.zsh', 'completions', '_nimbus'),
227
+ path.join(os.homedir(), '.config', 'fish', 'completions', 'nimbus.fish'),
228
+ ];
229
+ let removed = 0;
230
+ for (const f of files) {
231
+ if (fs.existsSync(f)) {
232
+ fs.unlinkSync(f);
233
+ ui.print(`${ui.color('✓', 'green')} Removed ${f}`);
234
+ removed++;
235
+ }
236
+ }
237
+ if (removed === 0) {
238
+ ui.info('No completion files found to remove.');
239
+ }
240
+ else {
241
+ ui.info(`Removed ${removed} completion file(s). Reload your shell.`);
242
+ }
243
+ void shell; // suppress unused warning
244
+ break;
245
+ }
246
+ case '__complete': {
247
+ // L2: Dynamic completion dispatcher — called from shell completion scripts
248
+ // Usage: nimbus completions __complete <prev_word> <curr_word>
249
+ // (args passed as positional args by the shell)
250
+ break;
251
+ }
252
+ default:
253
+ ui.print('Usage: nimbus completions <install|uninstall>');
254
+ }
255
+ }
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Config Command
3
+ *
4
+ * Manage Nimbus configuration
5
+ */
6
+ import { ui } from '../wizard/ui';
7
+ import { select, input, confirm } from '../wizard/prompts';
8
+ import { ConfigManager, CONFIG_KEYS } from '../config';
9
+ /**
10
+ * Config set command
11
+ */
12
+ export async function configSetCommand(options) {
13
+ const configManager = new ConfigManager();
14
+ let key = options.key;
15
+ let value = options.value;
16
+ // Interactive mode - select key if not provided
17
+ if (!key && !options.nonInteractive) {
18
+ const keyOptions = CONFIG_KEYS.map(k => ({
19
+ label: k.key,
20
+ value: k.key,
21
+ description: k.description,
22
+ }));
23
+ key = (await select({
24
+ message: 'Select configuration key to set:',
25
+ options: keyOptions,
26
+ }));
27
+ }
28
+ if (!key) {
29
+ ui.error('Configuration key is required.');
30
+ process.exit(1);
31
+ }
32
+ // Validate key
33
+ const keyInfo = configManager.getKeyInfo(key);
34
+ if (!keyInfo) {
35
+ ui.warning(`Unknown configuration key: ${key}`);
36
+ ui.info('Use "nimbus config list" to see available keys.');
37
+ if (!options.nonInteractive) {
38
+ const proceed = await confirm({
39
+ message: 'Set this key anyway?',
40
+ defaultValue: false,
41
+ });
42
+ if (!proceed) {
43
+ return;
44
+ }
45
+ }
46
+ }
47
+ // Get value if not provided
48
+ if (value === undefined && !options.nonInteractive) {
49
+ const currentValue = configManager.get(key);
50
+ const defaultValue = keyInfo?.defaultValue;
51
+ let placeholder = '';
52
+ if (currentValue !== undefined) {
53
+ placeholder = String(currentValue);
54
+ }
55
+ else if (defaultValue !== undefined) {
56
+ placeholder = `default: ${defaultValue}`;
57
+ }
58
+ if (keyInfo?.type === 'boolean') {
59
+ const boolValue = await confirm({
60
+ message: `Set ${key}:`,
61
+ defaultValue: currentValue ?? defaultValue ?? false,
62
+ });
63
+ value = String(boolValue);
64
+ }
65
+ else {
66
+ value = await input({
67
+ message: `Enter value for ${key}:`,
68
+ defaultValue: currentValue !== undefined ? String(currentValue) : undefined,
69
+ placeholder,
70
+ });
71
+ }
72
+ }
73
+ if (value === undefined) {
74
+ ui.error('Configuration value is required.');
75
+ process.exit(1);
76
+ }
77
+ // M4: Validate model key against known model IDs
78
+ if (key === 'model' || key === 'llm.defaultModel') {
79
+ const knownModels = [
80
+ 'claude-opus-4-6',
81
+ 'claude-sonnet-4-6',
82
+ 'claude-haiku-4-5-20251001',
83
+ 'claude-opus-4-20250514',
84
+ 'claude-sonnet-4-20250514',
85
+ 'claude-haiku-4-5',
86
+ 'anthropic/claude-opus-4-6',
87
+ 'anthropic/claude-sonnet-4-6',
88
+ 'anthropic/claude-haiku-4-5-20251001',
89
+ 'anthropic/claude-opus-4-20250514',
90
+ 'anthropic/claude-sonnet-4-20250514',
91
+ ];
92
+ if (!knownModels.includes(value)) {
93
+ ui.warning(`"${value}" is not a recognized Nimbus model ID.`);
94
+ ui.info('Known models: ' + knownModels.slice(0, 6).join(', '));
95
+ if (!options.nonInteractive) {
96
+ const { confirm: confirmPrompt } = await import('../wizard/prompts');
97
+ const proceed = await confirmPrompt({ message: 'Set this model anyway?', defaultValue: false });
98
+ if (!proceed)
99
+ return;
100
+ }
101
+ }
102
+ }
103
+ // Parse and set value
104
+ const parsedValue = configManager.parseValue(key, value);
105
+ configManager.set(key, parsedValue);
106
+ ui.success(`Configuration updated: ${key} = ${parsedValue}`);
107
+ }
108
+ /**
109
+ * Config get command
110
+ */
111
+ export async function configGetCommand(options) {
112
+ const configManager = new ConfigManager();
113
+ let key = options.key;
114
+ // Interactive mode - select key if not provided
115
+ if (!key && !options.nonInteractive) {
116
+ const keyOptions = CONFIG_KEYS.map(k => ({
117
+ label: k.key,
118
+ value: k.key,
119
+ description: k.description,
120
+ }));
121
+ key = (await select({
122
+ message: 'Select configuration key to view:',
123
+ options: keyOptions,
124
+ }));
125
+ }
126
+ if (!key) {
127
+ ui.error('Configuration key is required.');
128
+ process.exit(1);
129
+ }
130
+ const value = configManager.get(key);
131
+ if (value === undefined) {
132
+ const keyInfo = configManager.getKeyInfo(key);
133
+ if (keyInfo?.defaultValue !== undefined) {
134
+ ui.print(`${ui.color(key, 'cyan')}: ${keyInfo.defaultValue} ${ui.dim('(default)')}`);
135
+ }
136
+ else {
137
+ ui.print(`${ui.color(key, 'cyan')}: ${ui.dim('(not set)')}`);
138
+ }
139
+ }
140
+ else {
141
+ ui.print(`${ui.color(key, 'cyan')}: ${value}`);
142
+ }
143
+ }
144
+ /**
145
+ * Config list command
146
+ */
147
+ export async function configListCommand(options) {
148
+ const configManager = new ConfigManager();
149
+ const allConfig = configManager.getAllFlat();
150
+ if (options.json) {
151
+ console.log(JSON.stringify(allConfig, null, 2));
152
+ return;
153
+ }
154
+ ui.newLine();
155
+ ui.header('Nimbus Configuration', configManager.getConfigPath());
156
+ // Group by section
157
+ const sections = {};
158
+ for (const keyInfo of CONFIG_KEYS) {
159
+ const [section] = keyInfo.key.split('.');
160
+ if (!sections[section]) {
161
+ sections[section] = [];
162
+ }
163
+ const value = allConfig[keyInfo.key];
164
+ const isDefault = value === undefined || value === keyInfo.defaultValue;
165
+ if (options.changed && isDefault) {
166
+ continue;
167
+ }
168
+ sections[section].push({
169
+ key: keyInfo.key,
170
+ value: value !== undefined ? value : keyInfo.defaultValue,
171
+ info: keyInfo,
172
+ });
173
+ }
174
+ for (const [section, items] of Object.entries(sections)) {
175
+ if (items.length === 0) {
176
+ continue;
177
+ }
178
+ ui.section(section.charAt(0).toUpperCase() + section.slice(1));
179
+ for (const item of items) {
180
+ const isDefault = item.value === item.info?.defaultValue;
181
+ const valueStr = item.value !== undefined ? String(item.value) : ui.dim('(not set)');
182
+ const defaultMarker = isDefault ? ui.dim(' (default)') : '';
183
+ ui.print(` ${ui.color(item.key, 'cyan')}: ${valueStr}${defaultMarker}`);
184
+ if (item.info?.description) {
185
+ ui.print(` ${ui.dim(item.info.description)}`);
186
+ }
187
+ }
188
+ ui.newLine();
189
+ }
190
+ }
191
+ /**
192
+ * Config init command
193
+ */
194
+ export async function configInitCommand(options) {
195
+ const configManager = new ConfigManager();
196
+ if (configManager.exists() && !options.force) {
197
+ ui.warning(`Configuration file already exists at: ${configManager.getConfigPath()}`);
198
+ if (!options.nonInteractive) {
199
+ const overwrite = await confirm({
200
+ message: 'Overwrite existing configuration?',
201
+ defaultValue: false,
202
+ });
203
+ if (!overwrite) {
204
+ ui.info('Configuration unchanged.');
205
+ return;
206
+ }
207
+ }
208
+ else {
209
+ ui.info('Use --force to overwrite.');
210
+ return;
211
+ }
212
+ }
213
+ // Interactive configuration setup
214
+ if (!options.nonInteractive) {
215
+ ui.newLine();
216
+ ui.header('Nimbus Configuration Setup', "Let's configure your Nimbus CLI");
217
+ // Workspace settings
218
+ ui.section('Workspace');
219
+ const defaultProvider = await select({
220
+ message: 'Default cloud provider:',
221
+ options: [
222
+ { label: 'AWS', value: 'aws', description: 'Amazon Web Services' },
223
+ { label: 'GCP', value: 'gcp', description: 'Google Cloud Platform' },
224
+ { label: 'Azure', value: 'azure', description: 'Microsoft Azure' },
225
+ ],
226
+ });
227
+ const outputDir = await input({
228
+ message: 'Default output directory for generated code:',
229
+ defaultValue: './infrastructure',
230
+ });
231
+ // LLM settings
232
+ ui.section('LLM');
233
+ const temperature = await input({
234
+ message: 'LLM temperature (0-1):',
235
+ defaultValue: '0.7',
236
+ validate: val => {
237
+ const num = Number(val);
238
+ if (isNaN(num) || num < 0 || num > 1) {
239
+ return 'Temperature must be a number between 0 and 1';
240
+ }
241
+ return true;
242
+ },
243
+ });
244
+ // Safety settings
245
+ ui.section('Safety');
246
+ const requireConfirmation = await confirm({
247
+ message: 'Require confirmation for destructive operations?',
248
+ defaultValue: true,
249
+ });
250
+ // Save configuration
251
+ configManager.set('workspace.defaultProvider', defaultProvider);
252
+ configManager.set('workspace.outputDirectory', outputDir);
253
+ configManager.set('llm.temperature', Number(temperature));
254
+ configManager.set('safety.requireConfirmation', requireConfirmation);
255
+ ui.newLine();
256
+ ui.success(`Configuration saved to: ${configManager.getConfigPath()}`);
257
+ }
258
+ else {
259
+ // Non-interactive - just create default config
260
+ configManager.reset();
261
+ ui.success(`Default configuration created at: ${configManager.getConfigPath()}`);
262
+ }
263
+ }
264
+ /**
265
+ * Config reset command
266
+ */
267
+ export async function configResetCommand(options) {
268
+ const configManager = new ConfigManager();
269
+ if (!options.nonInteractive) {
270
+ const confirm_reset = await confirm({
271
+ message: 'Reset all configuration to defaults?',
272
+ defaultValue: false,
273
+ });
274
+ if (!confirm_reset) {
275
+ ui.info('Configuration unchanged.');
276
+ return;
277
+ }
278
+ }
279
+ configManager.reset();
280
+ ui.success('Configuration reset to defaults.');
281
+ }
282
+ /**
283
+ * Main config command dispatcher
284
+ */
285
+ export const configCommand = {
286
+ set: configSetCommand,
287
+ get: configGetCommand,
288
+ list: configListCommand,
289
+ init: configInitCommand,
290
+ reset: configResetCommand,
291
+ };