@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,112 @@
1
+ /**
2
+ * Auth List Command
3
+ *
4
+ * Display all available providers and their configuration status
5
+ *
6
+ * Usage: nimbus auth list
7
+ */
8
+ import { logger } from '../utils';
9
+ import { ui } from '../wizard';
10
+ import { authStore, AuthStore, getProviderNames, getProviderInfo } from '../auth';
11
+ /**
12
+ * Run the auth list command
13
+ */
14
+ export async function authListCommand(options = {}) {
15
+ logger.info('Listing auth providers');
16
+ const providerNames = getProviderNames();
17
+ const status = authStore.getStatus();
18
+ const configuredProviders = new Set(status.providers.map(p => p.name));
19
+ // Build provider data
20
+ const providerData = providerNames.map(name => {
21
+ const info = getProviderInfo(name);
22
+ const credential = authStore.getProvider(name);
23
+ const isConfigured = configuredProviders.has(name);
24
+ const isDefault = status.defaultProvider === name;
25
+ return {
26
+ name,
27
+ displayName: info.displayName,
28
+ description: info.description,
29
+ isConfigured,
30
+ isDefault,
31
+ model: credential?.model || info.models.find(m => m.isDefault)?.id || info.models[0].id,
32
+ apiKey: credential?.apiKey,
33
+ baseUrl: credential?.baseUrl,
34
+ requiresApiKey: info.requiresApiKey,
35
+ apiKeyUrl: info.apiKeyUrl,
36
+ };
37
+ });
38
+ // JSON output mode
39
+ if (options.json) {
40
+ const safeOutput = providerData.map(p => ({
41
+ name: p.name,
42
+ displayName: p.displayName,
43
+ description: p.description,
44
+ isConfigured: p.isConfigured,
45
+ isDefault: p.isDefault,
46
+ model: p.model,
47
+ apiKey: p.apiKey ? AuthStore.maskApiKey(p.apiKey) : null,
48
+ baseUrl: p.baseUrl,
49
+ requiresApiKey: p.requiresApiKey,
50
+ }));
51
+ // Output sanitized JSON (API keys are already masked above)
52
+ ui.print(JSON.stringify(safeOutput, null, 2));
53
+ return;
54
+ }
55
+ // Human-readable table output
56
+ ui.newLine();
57
+ ui.section('LLM Providers');
58
+ // Build table data
59
+ const tableData = [];
60
+ for (const provider of providerData) {
61
+ const statusIcon = provider.isConfigured ? ui.color('✓', 'green') : ui.dim('—');
62
+ const statusText = provider.isConfigured ? 'Configured' : 'Not configured';
63
+ let apiKeyDisplay;
64
+ if (provider.isConfigured && provider.apiKey) {
65
+ apiKeyDisplay = AuthStore.maskApiKey(provider.apiKey);
66
+ }
67
+ else if (!provider.requiresApiKey) {
68
+ apiKeyDisplay = ui.dim('(not needed)');
69
+ }
70
+ else if (provider.isConfigured) {
71
+ apiKeyDisplay = ui.dim('(from env)');
72
+ }
73
+ else {
74
+ apiKeyDisplay = ui.dim('—');
75
+ }
76
+ const modelDisplay = provider.isConfigured ? provider.model : ui.dim(provider.model);
77
+ const defaultDisplay = provider.isDefault ? ui.color('★', 'yellow') : '';
78
+ tableData.push({
79
+ provider: `${statusIcon} ${provider.displayName}`,
80
+ status: statusText,
81
+ apiKey: apiKeyDisplay,
82
+ model: modelDisplay,
83
+ default: defaultDisplay,
84
+ });
85
+ }
86
+ // Display table
87
+ ui.table({
88
+ columns: [
89
+ { key: 'provider', header: 'Provider', width: 25 },
90
+ { key: 'status', header: 'Status', width: 15 },
91
+ { key: 'apiKey', header: 'API Key', width: 20 },
92
+ { key: 'model', header: 'Model', width: 30 },
93
+ { key: 'default', header: 'Default', width: 8 },
94
+ ],
95
+ data: tableData,
96
+ });
97
+ ui.newLine();
98
+ // Show hints for unconfigured providers
99
+ const unconfigured = providerData.filter(p => !p.isConfigured);
100
+ if (unconfigured.length > 0) {
101
+ ui.print(ui.dim('To configure a provider, run `nimbus login`'));
102
+ ui.newLine();
103
+ ui.print(ui.dim('API key URLs:'));
104
+ for (const provider of unconfigured) {
105
+ if (provider.apiKeyUrl) {
106
+ ui.print(ui.dim(` ${provider.displayName}: ${provider.apiKeyUrl}`));
107
+ }
108
+ }
109
+ ui.newLine();
110
+ }
111
+ }
112
+ export default authListCommand;
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Auth Profile Commands
3
+ *
4
+ * CLI commands for managing authentication profiles and switching providers
5
+ */
6
+ import { AuthStore } from '../auth/store';
7
+ import { ui } from '../wizard/ui';
8
+ /**
9
+ * List all configured providers
10
+ */
11
+ async function authProfileListCommand() {
12
+ ui.header('Auth Profiles');
13
+ const authStore = new AuthStore();
14
+ const status = authStore.getStatus();
15
+ if (!status.hasProviders) {
16
+ ui.warning('No providers configured. Run "nimbus login" to set up authentication.');
17
+ return;
18
+ }
19
+ ui.table({
20
+ columns: [
21
+ { key: 'name', header: 'Provider' },
22
+ { key: 'model', header: 'Model' },
23
+ { key: 'default', header: 'Default' },
24
+ { key: 'validatedAt', header: 'Validated' },
25
+ ],
26
+ data: status.providers.map(p => ({
27
+ name: p.name,
28
+ model: p.model || '-',
29
+ default: p.isDefault ? 'Yes' : '',
30
+ validatedAt: p.validatedAt ? new Date(p.validatedAt).toLocaleDateString() : '-',
31
+ })),
32
+ });
33
+ }
34
+ /**
35
+ * Show the current default provider
36
+ */
37
+ async function authProfileShowCommand() {
38
+ ui.header('Current Auth Profile');
39
+ const authStore = new AuthStore();
40
+ const defaultProvider = authStore.getDefaultProvider();
41
+ if (!defaultProvider) {
42
+ ui.warning('No default provider set. Run "nimbus login" to configure.');
43
+ return;
44
+ }
45
+ const status = authStore.getStatus();
46
+ const providerInfo = status.providers.find(p => p.name === defaultProvider);
47
+ ui.print(` ${ui.color('Provider:', 'cyan')} ${defaultProvider}`);
48
+ if (providerInfo) {
49
+ ui.print(` ${ui.color('Model:', 'cyan')} ${providerInfo.model || '-'}`);
50
+ ui.print(` ${ui.color('Validated:', 'cyan')} ${providerInfo.validatedAt ? new Date(providerInfo.validatedAt).toLocaleDateString() : '-'}`);
51
+ }
52
+ }
53
+ /**
54
+ * Switch the default provider
55
+ */
56
+ async function authProfileSwitchCommand(provider) {
57
+ ui.header(`Switch Auth Profile`);
58
+ const authStore = new AuthStore();
59
+ try {
60
+ authStore.setDefaultProvider(provider);
61
+ ui.success(`Default provider switched to "${provider}"`);
62
+ ui.info(`Persisted to ${authStore.getAuthPath()}`);
63
+ }
64
+ catch (error) {
65
+ ui.error(error.message);
66
+ ui.info('Available providers:');
67
+ const status = authStore.getStatus();
68
+ status.providers.forEach(p => {
69
+ ui.print(` - ${p.name}${p.isDefault ? ' (current default)' : ''}`);
70
+ });
71
+ }
72
+ }
73
+ /**
74
+ * Main auth-profile command router
75
+ */
76
+ export async function authProfileCommand(subcommand, args) {
77
+ const positionalArgs = [];
78
+ for (let i = 0; i < args.length; i++) {
79
+ const arg = args[i];
80
+ if (!arg.startsWith('-')) {
81
+ positionalArgs.push(arg);
82
+ }
83
+ }
84
+ switch (subcommand) {
85
+ case 'list':
86
+ case 'ls':
87
+ await authProfileListCommand();
88
+ break;
89
+ case 'show':
90
+ await authProfileShowCommand();
91
+ break;
92
+ case 'switch':
93
+ if (positionalArgs.length < 1) {
94
+ ui.error('Usage: nimbus auth-profile switch <provider>');
95
+ ui.info('Example: nimbus auth-profile switch openai');
96
+ return;
97
+ }
98
+ await authProfileSwitchCommand(positionalArgs[0]);
99
+ break;
100
+ default:
101
+ ui.error(`Unknown auth-profile subcommand: ${subcommand || '(none)'}`);
102
+ ui.info('Available commands: list, show, switch <provider>');
103
+ }
104
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Auth Refresh Command
3
+ *
4
+ * Re-validate and refresh cloud provider credentials:
5
+ * - AWS: re-run SSO login or warn about expired temporary credentials
6
+ * - GCP: re-run gcloud auth application-default login
7
+ * - Azure: re-run az login
8
+ *
9
+ * Usage: nimbus auth-refresh [--provider aws|gcp|azure]
10
+ */
11
+ import { ui } from '../wizard';
12
+ import { exec } from 'node:child_process';
13
+ import { promisify } from 'node:util';
14
+ const execAsync = promisify(exec);
15
+ /** Check if AWS credentials are valid and not expired */
16
+ async function checkAWSCredentials() {
17
+ try {
18
+ const { stdout } = await execAsync('aws sts get-caller-identity --output json', {
19
+ timeout: 10_000,
20
+ });
21
+ const identity = JSON.parse(stdout);
22
+ const isSso = identity.UserId?.includes(':') || false;
23
+ return {
24
+ valid: true,
25
+ message: `Account: ${identity.Account} | User: ${identity.UserId}`,
26
+ sso: isSso,
27
+ };
28
+ }
29
+ catch (e) {
30
+ const msg = e.message || String(e);
31
+ const isExpired = msg.includes('ExpiredToken') || msg.includes('expired') || msg.includes('token');
32
+ return { valid: false, message: isExpired ? 'Token expired' : msg, sso: false };
33
+ }
34
+ }
35
+ /** Refresh AWS SSO credentials */
36
+ async function refreshAWS(options) {
37
+ ui.header('AWS Credentials');
38
+ const check = await checkAWSCredentials();
39
+ if (check.valid) {
40
+ ui.success(`Credentials valid: ${check.message}`);
41
+ return;
42
+ }
43
+ ui.warning(`Credentials invalid: ${check.message}`);
44
+ // G18: Guide user through AWS SSO login if SSO profile detected
45
+ const awsSsoProfile = process.env.AWS_PROFILE;
46
+ if (awsSsoProfile) {
47
+ ui.info(`AWS SSO profile detected: ${awsSsoProfile}`);
48
+ ui.info(`Run in another terminal: aws sso login --profile ${awsSsoProfile}`);
49
+ ui.info('Then press Enter here to retry...');
50
+ // Wait for user to press Enter
51
+ await new Promise(resolve => {
52
+ const readline = require('readline');
53
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
54
+ rl.question('', () => { rl.close(); resolve(); });
55
+ });
56
+ // Retry the credentials check
57
+ try {
58
+ const { execFileSync } = await import('node:child_process');
59
+ execFileSync('aws', ['sts', 'get-caller-identity'], {
60
+ encoding: 'utf-8', timeout: 8000, stdio: ['pipe', 'pipe', 'pipe'],
61
+ });
62
+ ui.success('AWS credentials refreshed successfully.');
63
+ return;
64
+ }
65
+ catch {
66
+ ui.warning('AWS credentials still invalid. You may need to re-run aws sso login.');
67
+ }
68
+ }
69
+ // Determine refresh method
70
+ try {
71
+ // Check if SSO is configured
72
+ const { stdout: ssoCheck } = await execAsync('aws configure list-profiles 2>/dev/null || echo ""', { timeout: 5000 });
73
+ const profiles = ssoCheck.trim().split('\n').filter(Boolean);
74
+ if (profiles.length > 0) {
75
+ ui.info('Refreshing AWS SSO credentials...');
76
+ ui.info(`Run: aws sso login --profile ${profiles[0]}`);
77
+ ui.info('Or set a new profile: aws configure sso');
78
+ }
79
+ else {
80
+ ui.info('To refresh AWS credentials:');
81
+ ui.info(' 1. aws configure (for long-term credentials)');
82
+ ui.info(' 2. aws sso configure (for SSO)');
83
+ ui.info(' 3. aws sts assume-role (for role assumption)');
84
+ }
85
+ }
86
+ catch {
87
+ ui.info('To configure AWS credentials: aws configure');
88
+ }
89
+ }
90
+ /** Refresh GCP credentials */
91
+ async function refreshGCP(_options) {
92
+ ui.header('GCP Credentials');
93
+ try {
94
+ const { stdout } = await execAsync('gcloud auth print-access-token 2>/dev/null', {
95
+ timeout: 5000,
96
+ });
97
+ if (stdout.trim().length > 10) {
98
+ try {
99
+ const { stdout: proj } = await execAsync('gcloud config get-value project 2>/dev/null', {
100
+ timeout: 3000,
101
+ });
102
+ ui.success(`Credentials valid. Project: ${proj.trim() || '(not set)'}`);
103
+ return;
104
+ }
105
+ catch {
106
+ ui.success('Credentials valid');
107
+ return;
108
+ }
109
+ }
110
+ }
111
+ catch {
112
+ // Not valid
113
+ }
114
+ ui.warning('GCP credentials expired or not configured');
115
+ ui.info('To refresh: gcloud auth application-default login');
116
+ ui.info('For service accounts: gcloud auth activate-service-account --key-file=SA_KEY.json');
117
+ }
118
+ /** Refresh Azure credentials */
119
+ async function refreshAzure(_options) {
120
+ ui.header('Azure Credentials');
121
+ try {
122
+ const { stdout } = await execAsync('az account show --output json 2>/dev/null', {
123
+ timeout: 10_000,
124
+ });
125
+ const account = JSON.parse(stdout);
126
+ ui.success(`Credentials valid. Subscription: ${account.name || account.id} (${account.state})`);
127
+ if (account.state !== 'Enabled') {
128
+ ui.warning('Subscription is not in Enabled state');
129
+ }
130
+ return;
131
+ }
132
+ catch {
133
+ // Not valid
134
+ }
135
+ ui.warning('Azure credentials expired or not configured');
136
+ ui.info('To refresh: az login');
137
+ ui.info('For service principals: az login --service-principal -u CLIENT_ID -p CLIENT_SECRET --tenant TENANT_ID');
138
+ }
139
+ /**
140
+ * Run the auth-refresh command
141
+ */
142
+ export async function authRefreshCommand(options = {}) {
143
+ const provider = options.provider ?? 'all';
144
+ ui.header('Nimbus Auth Refresh');
145
+ ui.info('Checking and refreshing cloud provider credentials...');
146
+ ui.newLine();
147
+ if (provider === 'all' || provider === 'aws') {
148
+ await refreshAWS(options);
149
+ ui.newLine();
150
+ }
151
+ if (provider === 'all' || provider === 'gcp') {
152
+ await refreshGCP(options);
153
+ ui.newLine();
154
+ }
155
+ if (provider === 'all' || provider === 'azure') {
156
+ await refreshAzure(options);
157
+ ui.newLine();
158
+ }
159
+ ui.info('Tip: Run "nimbus doctor" for a full system check');
160
+ }
161
+ export default authRefreshCommand;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Auth Status Command
3
+ *
4
+ * Display current authentication status
5
+ *
6
+ * Usage: nimbus auth status
7
+ */
8
+ import { logger } from '../utils';
9
+ import { ui } from '../wizard';
10
+ import { authStore, AuthStore, getProviderInfo } from '../auth';
11
+ /**
12
+ * Run the auth status command
13
+ */
14
+ export async function authStatusCommand(options = {}) {
15
+ logger.info('Checking auth status');
16
+ const status = authStore.getStatus();
17
+ // JSON output mode
18
+ if (options.json) {
19
+ // Build safe JSON output (no raw API keys)
20
+ const safeOutput = {
21
+ isConfigured: status.isConfigured,
22
+ identity: status.identity
23
+ ? {
24
+ provider: status.identity.provider,
25
+ username: status.identity.username,
26
+ name: status.identity.name,
27
+ authenticatedAt: status.identity.authenticatedAt,
28
+ }
29
+ : null,
30
+ providers: status.providers.map(p => ({
31
+ name: p.name,
32
+ model: p.model,
33
+ isDefault: p.isDefault,
34
+ validatedAt: p.validatedAt,
35
+ })),
36
+ defaultProvider: status.defaultProvider,
37
+ };
38
+ // Output sanitized JSON (no sensitive data included)
39
+ ui.print(JSON.stringify(safeOutput, null, 2));
40
+ return;
41
+ }
42
+ // Human-readable output
43
+ ui.newLine();
44
+ ui.section('Authentication Status');
45
+ // Overall status
46
+ if (status.isConfigured) {
47
+ ui.success('Nimbus is configured and ready to use');
48
+ }
49
+ else {
50
+ ui.warning('Nimbus is not configured. Run `nimbus login` to get started.');
51
+ }
52
+ ui.newLine();
53
+ // Identity section
54
+ ui.print(ui.bold('Identity'));
55
+ if (status.identity) {
56
+ const identity = status.identity;
57
+ ui.print(` Provider: GitHub`);
58
+ ui.print(` Username: ${identity.username}`);
59
+ if (identity.name) {
60
+ ui.print(` Name: ${identity.name}`);
61
+ }
62
+ ui.print(` Signed in: ${formatDate(identity.authenticatedAt)}`);
63
+ }
64
+ else {
65
+ ui.print(ui.dim(' Not signed in'));
66
+ ui.print(ui.dim(' Run `nimbus login` to sign in with GitHub'));
67
+ }
68
+ ui.newLine();
69
+ // Providers section
70
+ ui.print(ui.bold('LLM Providers'));
71
+ if (status.providers.length > 0) {
72
+ for (const provider of status.providers) {
73
+ const info = getProviderInfo(provider.name);
74
+ const defaultMarker = provider.isDefault ? ui.color(' (default)', 'green') : '';
75
+ ui.print(` ${info.displayName}${defaultMarker}`);
76
+ ui.print(` Model: ${provider.model}`);
77
+ // Get the actual credential to show masked key
78
+ const credential = authStore.getProvider(provider.name);
79
+ if (credential?.apiKey) {
80
+ ui.print(` API Key: ${AuthStore.maskApiKey(credential.apiKey)}`);
81
+ }
82
+ else if (!info.requiresApiKey) {
83
+ ui.print(` API Key: ${ui.dim('(not required)')}`);
84
+ }
85
+ else {
86
+ ui.print(` API Key: ${ui.dim('(from environment)')}`);
87
+ }
88
+ if (credential?.baseUrl) {
89
+ ui.print(` Base URL: ${credential.baseUrl}`);
90
+ }
91
+ if (provider.validatedAt) {
92
+ ui.print(` Validated: ${formatDate(provider.validatedAt)}`);
93
+ }
94
+ ui.newLine();
95
+ }
96
+ }
97
+ else {
98
+ ui.print(ui.dim(' No providers configured'));
99
+ ui.print(ui.dim(' Run `nimbus login` to configure LLM providers'));
100
+ ui.newLine();
101
+ }
102
+ // Auth file location
103
+ ui.print(ui.dim(`Config: ${authStore.getAuthPath()}`));
104
+ ui.newLine();
105
+ }
106
+ /**
107
+ * Format ISO date string for display
108
+ */
109
+ function formatDate(isoString) {
110
+ try {
111
+ const date = new Date(isoString);
112
+ // Check if date is valid (NaN check)
113
+ if (isNaN(date.getTime())) {
114
+ return isoString;
115
+ }
116
+ return date.toLocaleString();
117
+ }
118
+ catch {
119
+ return isoString;
120
+ }
121
+ }
122
+ export default authStatusCommand;