@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
package/src/cli.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { analytics } from './utils';
8
+ import { VERSION } from './version';
8
9
  import {
9
10
  generateTerraformCommand,
10
11
  type GenerateTerraformOptions,
@@ -103,6 +104,9 @@ import {
103
104
  authProfileCommand,
104
105
  } from './commands';
105
106
  import { upgradeCommand, type UpgradeOptions } from './commands/upgrade';
107
+ import { statusCommand, type StatusOptions } from './commands/status';
108
+ import { rollbackCommand, type RollbackOptions } from './commands/rollback';
109
+ import { rolloutCommand, type RolloutOptions } from './commands/rollout';
106
110
  import { requiresAuth, type LLMProviderName } from './auth';
107
111
 
108
112
  /** Top-level command aliases for convenience shortcuts. */
@@ -120,6 +124,47 @@ const COMMAND_ALIASES: Record<string, string[]> = {
120
124
  h: ['helm'],
121
125
  };
122
126
 
127
+ async function showSubcommandHelp(command: string, _args: string[]): Promise<void> {
128
+ const { helpCommand } = await import('./commands/help');
129
+ // Print command-specific help based on command name
130
+ const COMMAND_HELP: Record<string, string> = {
131
+ chat: 'Usage: nimbus chat [--model <model>] [--mode plan|build|deploy] [--continue]\n Start interactive AI chat session.',
132
+ run: 'Usage: nimbus run "<prompt>" [--auto-approve] [--format json|text] [--model <model>]\n Run a non-interactive agent task.',
133
+ init: 'Usage: nimbus init [--cwd <dir>] [--quiet]\n Generate NIMBUS.md with detected project context.',
134
+ login: 'Usage: nimbus login [--provider <name>]\n Configure LLM provider credentials.',
135
+ logout: 'Usage: nimbus logout [--provider <name>]\n Remove stored credentials.',
136
+ doctor: 'Usage: nimbus doctor [--fix] [--verbose] [--json] [--metrics]\n Run diagnostic checks on Nimbus installation.',
137
+ cost: 'Usage: nimbus cost [--days <n>] [--json]\n Show LLM usage costs.',
138
+ sessions: 'Usage: nimbus sessions [list|resume|delete] [<id>]\n Manage chat sessions.',
139
+ audit: 'Usage: nimbus audit [--format json|text]\n Run security and compliance audit.',
140
+ share: 'Usage: nimbus share [--session <id>] [--ttl <hours>]\n Share a session.',
141
+ upgrade: 'Usage: nimbus upgrade\n Upgrade Nimbus to the latest version.',
142
+ serve: 'Usage: nimbus serve [--port <port>] [--auth <user:pass>]\n Start HTTP API server with SSE streaming.',
143
+ web: 'Usage: nimbus web [--port <port>]\n Open Web UI in browser.',
144
+ 'auth-refresh': 'Usage: nimbus auth-refresh [--provider aws|gcp|azure]\n Refresh cloud provider credentials.',
145
+ completions: 'Usage: nimbus completions <install|uninstall>\n Manage shell tab completions.',
146
+ alias: 'Usage: nimbus alias <list|create|remove> [<name>] [<expansion>]\n Manage command aliases.',
147
+ logs: 'Usage: nimbus logs [--tail <n>] [--follow] [--namespace <ns>]\n Stream Kubernetes/cloud logs.',
148
+ pipeline: 'Usage: nimbus pipeline [list|trigger|status] [<args>]\n Manage CI/CD pipelines.',
149
+ drift: 'Usage: nimbus drift [--notify slack|email]\n Detect infrastructure drift.',
150
+ deploy: 'Usage: nimbus deploy [--auto-approve] [--workspace <ws>] [--namespace <ns>] [--dry-run] [--no-apply]\n Orchestrate full terraform plan + apply + kubectl rollout workflow.',
151
+ rollback: 'Usage: nimbus rollback [<resource>] [--dry-run]\n Safely roll back infrastructure.',
152
+ profile: 'Usage: nimbus profile <name>\n Set AWS_PROFILE for current session.',
153
+ schedule: 'Usage: nimbus schedule [list|add|remove] [<args>]\n Manage scheduled agent tasks.',
154
+ incident: 'Usage: nimbus incident [create|list|update] [<args>]\n Manage incidents.',
155
+ status: 'Usage: nimbus status [--json]\n Show Nimbus and infra status.',
156
+ export: 'Usage: nimbus export [--session <id>] [--output <file>]\n Export session as Markdown runbook.',
157
+ plugin: 'Usage: nimbus plugin <install|uninstall|list> [<name>]\n Manage MCP plugins.',
158
+ runbook: 'Usage: nimbus runbook <file> [--dry-run]\n Execute a runbook YAML file.',
159
+ };
160
+ const help = COMMAND_HELP[command];
161
+ if (help) {
162
+ process.stdout.write(help + '\n');
163
+ } else {
164
+ await helpCommand({});
165
+ }
166
+ }
167
+
123
168
  /**
124
169
  * Run a CLI command directly.
125
170
  *
@@ -133,9 +178,32 @@ export async function runCommand(args: string[]): Promise<void> {
133
178
  args = [...COMMAND_ALIASES[args[0]], ...args.slice(1)];
134
179
  }
135
180
 
181
+ // --profile <name> global flag: load and apply a named config profile before
182
+ // dispatching to the subcommand. Non-critical — errors are silently swallowed.
183
+ const profileIdx = args.indexOf('--profile');
184
+ if (profileIdx !== -1 && args[profileIdx + 1]) {
185
+ const profileName = args[profileIdx + 1];
186
+ try {
187
+ const { loadProfile, applyProfile } = await import('./config/profiles');
188
+ const profile = loadProfile(profileName);
189
+ if (profile) {
190
+ applyProfile(profile);
191
+ } else {
192
+ process.stderr.write(`Profile not found: ${profileName}\n`);
193
+ }
194
+ } catch { /* non-critical */ }
195
+ args = [...args.slice(0, profileIdx), ...args.slice(profileIdx + 2)];
196
+ }
197
+
136
198
  const command = args[0];
137
199
  const subcommand = args[1];
138
200
 
201
+ // GAP-15: --help/-h flag on any subcommand
202
+ if (args.includes('--help') || args.includes('-h')) {
203
+ await showSubcommandHelp(command, args);
204
+ return;
205
+ }
206
+
139
207
  // Fire-and-forget analytics tracking for every CLI command invocation.
140
208
  // This is a no-op when POSTHOG_API_KEY is not set.
141
209
  const commandName =
@@ -148,6 +216,17 @@ export async function runCommand(args: string[]): Promise<void> {
148
216
 
149
217
  // nimbus login
150
218
  if (command === 'login') {
219
+ // G8: --cloud <provider> flag for cloud provider login
220
+ const cloudIdx = args.findIndex(a => a === '--cloud');
221
+ if (cloudIdx !== -1 && args[cloudIdx + 1]) {
222
+ const cloudProvider = args[cloudIdx + 1] as 'aws' | 'gcp' | 'azure';
223
+ if (['aws', 'gcp', 'azure'].includes(cloudProvider)) {
224
+ const { loginCloudCommand } = await import('./commands/login');
225
+ await loginCloudCommand(cloudProvider);
226
+ return;
227
+ }
228
+ }
229
+
151
230
  const options: LoginOptions = {};
152
231
 
153
232
  for (let i = 1; i < args.length; i++) {
@@ -319,6 +398,10 @@ export async function runCommand(args: string[]): Promise<void> {
319
398
  options.force = true;
320
399
  } else if (arg === '--check' || arg === '-c') {
321
400
  options.check = true;
401
+ } else if (arg === '--dry-run') {
402
+ options.dryRun = true;
403
+ } else if (arg === '--changelog') {
404
+ options.changelog = true;
322
405
  }
323
406
  }
324
407
 
@@ -343,6 +426,8 @@ export async function runCommand(args: string[]): Promise<void> {
343
426
  options.output = args[++i];
344
427
  } else if (arg === '--non-interactive') {
345
428
  options.nonInteractive = true;
429
+ } else if (arg === '--merge') {
430
+ options.merge = true;
346
431
  }
347
432
  }
348
433
 
@@ -353,7 +438,14 @@ export async function runCommand(args: string[]): Promise<void> {
353
438
  // nimbus serve — headless API server (no auth guard)
354
439
  if (command === 'serve') {
355
440
  const { serveCommand } = await import('./cli/serve');
356
- const serveOptions: { port?: number; host?: string; auth?: string } = {};
441
+ const serveOptions: { port?: number; host?: string; auth?: string; background?: boolean; stop?: boolean } = {};
442
+
443
+ // M1: nimbus serve stop
444
+ if (subcommand === 'stop') {
445
+ serveOptions.stop = true;
446
+ await serveCommand(serveOptions);
447
+ return;
448
+ }
357
449
 
358
450
  for (let i = 1; i < args.length; i++) {
359
451
  const arg = args[i];
@@ -364,6 +456,8 @@ export async function runCommand(args: string[]): Promise<void> {
364
456
  serveOptions.host = args[++i];
365
457
  } else if (arg === '--auth' && args[i + 1]) {
366
458
  serveOptions.auth = args[++i];
459
+ } else if (arg === '--background' || arg === '-b') {
460
+ serveOptions.background = true;
367
461
  }
368
462
  }
369
463
 
@@ -379,10 +473,69 @@ export async function runCommand(args: string[]): Promise<void> {
379
473
  host: args.includes('--host') ? args[args.indexOf('--host') + 1] : undefined,
380
474
  auth: args.includes('--auth') ? args[args.indexOf('--auth') + 1] : undefined,
381
475
  uiUrl: args.includes('--ui-url') ? args[args.indexOf('--ui-url') + 1] : undefined,
476
+ noOpen: args.includes('--no-open'),
382
477
  });
383
478
  return;
384
479
  }
385
480
 
481
+ // nimbus logs <pod> — H1 shorthand
482
+ if (command === 'logs') {
483
+ const { logsCommand, parseLogsArgs } = await import('./commands/logs');
484
+ const { pod, options: logsOpts } = parseLogsArgs(args.slice(1));
485
+ await logsCommand(pod, logsOpts);
486
+ return;
487
+ }
488
+
489
+ // nimbus pipeline [subcommand] — H2
490
+ if (command === 'pipeline') {
491
+ const { pipelineCommand } = await import('./commands/pipeline');
492
+ await pipelineCommand(subcommand || 'status', args.slice(2));
493
+ return;
494
+ }
495
+
496
+ // nimbus alias — L2
497
+ if (command === 'alias') {
498
+ const { aliasCommand } = await import('./commands/alias');
499
+ await aliasCommand(subcommand || 'list', args.slice(2));
500
+ return;
501
+ }
502
+
503
+ // nimbus incident <url-or-id> [--notes "..."] — G14
504
+ if (command === 'incident') {
505
+ const { incidentCommand } = await import('./commands/incident');
506
+ const incidentInput = args[1] ?? '';
507
+ const notesIdx = args.indexOf('--notes');
508
+ const notes = notesIdx !== -1 ? args[notesIdx + 1] : undefined;
509
+ await incidentCommand(incidentInput, { notes });
510
+ return;
511
+ }
512
+
513
+ // nimbus runbook <list|run|create> — G15
514
+ if (command === 'runbook') {
515
+ const { runbookCommand } = await import('./commands/runbook');
516
+ await runbookCommand(subcommand || 'list', args.slice(2));
517
+ return;
518
+ }
519
+
520
+ // nimbus schedule <list|add|remove|run-now> — G13
521
+ if (command === 'schedule') {
522
+ const { scheduleCommand } = await import('./commands/schedule');
523
+ await scheduleCommand(subcommand || 'list', args.slice(2));
524
+ return;
525
+ }
526
+
527
+ // nimbus export [session-id] [--format md|html|json] [--output file] — G19
528
+ if (command === 'export') {
529
+ const { exportCommand } = await import('./commands/export');
530
+ const formatIdx = args.indexOf('--format');
531
+ const format = formatIdx !== -1 ? (args[formatIdx + 1] as 'md' | 'html' | 'json') : 'md';
532
+ const outputIdx = args.indexOf('--output');
533
+ const output = outputIdx !== -1 ? args[outputIdx + 1] : undefined;
534
+ const sessionId = args.slice(1).find(a => !a.startsWith('-') && a !== args[formatIdx + 1] && a !== args[outputIdx + 1]);
535
+ await exportCommand({ format, output, sessionId });
536
+ return;
537
+ }
538
+
386
539
  // ==========================================
387
540
  // Auth guard - check authentication for other commands
388
541
  // ==========================================
@@ -946,6 +1099,10 @@ export async function runCommand(args: string[]): Promise<void> {
946
1099
 
947
1100
  // nimbus tf <subcommand>
948
1101
  if (command === 'tf') {
1102
+ if (subcommand === '--version' || subcommand === '-v') {
1103
+ console.log(`nimbus ${VERSION}`);
1104
+ return;
1105
+ }
949
1106
  if (!subcommand) {
950
1107
  console.error('Usage: nimbus tf <subcommand>');
951
1108
  console.log('');
@@ -969,6 +1126,10 @@ export async function runCommand(args: string[]): Promise<void> {
969
1126
 
970
1127
  // nimbus k8s <subcommand>
971
1128
  if (command === 'k8s') {
1129
+ if (subcommand === '--version' || subcommand === '-v') {
1130
+ console.log(`nimbus ${VERSION}`);
1131
+ return;
1132
+ }
972
1133
  if (!subcommand) {
973
1134
  console.error('Usage: nimbus k8s <subcommand>');
974
1135
  console.log('');
@@ -990,6 +1151,10 @@ export async function runCommand(args: string[]): Promise<void> {
990
1151
 
991
1152
  // nimbus helm <subcommand>
992
1153
  if (command === 'helm') {
1154
+ if (subcommand === '--version' || subcommand === '-v') {
1155
+ console.log(`nimbus ${VERSION}`);
1156
+ return;
1157
+ }
993
1158
  if (!subcommand) {
994
1159
  console.error('Usage: nimbus helm <subcommand>');
995
1160
  console.log('');
@@ -1133,6 +1298,12 @@ export async function runCommand(args: string[]): Promise<void> {
1133
1298
  return;
1134
1299
  }
1135
1300
 
1301
+ // nimbus diff — top-level alias for nimbus fs diff (M1)
1302
+ if (command === 'diff') {
1303
+ await fsCommand('diff', args.slice(1));
1304
+ return;
1305
+ }
1306
+
1136
1307
  // nimbus fs <subcommand>
1137
1308
  if (command === 'fs' || command === 'files') {
1138
1309
  if (!subcommand) {
@@ -1278,6 +1449,145 @@ export async function runCommand(args: string[]): Promise<void> {
1278
1449
  return;
1279
1450
  }
1280
1451
 
1452
+ // nimbus watch <glob> --run "prompt" (M3)
1453
+ if (command === 'watch') {
1454
+ const { watchCommand } = await import('./commands/watch');
1455
+ const watchOptions: import('./commands/watch').WatchOptions = { glob: subcommand ?? '' };
1456
+ for (let i = 1; i < args.length; i++) {
1457
+ const arg = args[i];
1458
+ if (arg === '--run' && args[i + 1]) {
1459
+ watchOptions.run = args[++i];
1460
+ } else if (arg === '--debounce' && args[i + 1]) {
1461
+ watchOptions.debounce = parseInt(args[++i], 10);
1462
+ } else if (arg === '--auto-approve' || arg === '-y') {
1463
+ watchOptions.autoApprove = true;
1464
+ } else if (arg === '--max-runs' && args[i + 1]) {
1465
+ watchOptions.maxRuns = parseInt(args[++i], 10);
1466
+ } else if (!arg.startsWith('--') && !watchOptions.glob) {
1467
+ watchOptions.glob = arg;
1468
+ }
1469
+ }
1470
+ await watchCommand(watchOptions);
1471
+ return;
1472
+ }
1473
+
1474
+ // nimbus whoami — shorthand for auth status (H5)
1475
+ if (command === 'whoami') {
1476
+ await authStatusCommand({});
1477
+ return;
1478
+ }
1479
+
1480
+ // nimbus auth-refresh [--provider aws|gcp|azure]
1481
+ if (command === 'auth-refresh') {
1482
+ const { authRefreshCommand } = await import('./commands/auth-refresh');
1483
+ const refreshOptions: { provider?: 'aws' | 'gcp' | 'azure' | 'all' } = {};
1484
+
1485
+ for (let i = 1; i < args.length; i++) {
1486
+ const arg = args[i];
1487
+ if (arg === '--provider' && args[i + 1]) {
1488
+ refreshOptions.provider = args[++i] as 'aws' | 'gcp' | 'azure' | 'all';
1489
+ }
1490
+ }
1491
+
1492
+ await authRefreshCommand(refreshOptions);
1493
+ return;
1494
+ }
1495
+
1496
+ // nimbus plugin <list|add|remove|init> (L3)
1497
+ if (command === 'plugin') {
1498
+ const { pluginCommand } = await import('./commands/plugin');
1499
+ await pluginCommand(subcommand ?? 'list', args.slice(2));
1500
+ return;
1501
+ }
1502
+
1503
+ // nimbus mcp <list|add|remove|test> (M5) — MCP server management
1504
+ if (command === 'mcp') {
1505
+ const { mcpCommand } = await import('./commands/plugin');
1506
+ await mcpCommand(subcommand ?? 'list', args.slice(2));
1507
+ return;
1508
+ }
1509
+
1510
+ // nimbus completions <install|uninstall> (L7)
1511
+ if (command === 'completions') {
1512
+ const { completionsCommand } = await import('./commands/completions');
1513
+ await completionsCommand(subcommand ?? 'install');
1514
+ return;
1515
+ }
1516
+
1517
+ // nimbus team-context <push|pull> (L6)
1518
+ if (command === 'team-context') {
1519
+ const { teamContextCommand } = await import('./commands/team-context');
1520
+ await teamContextCommand(subcommand ?? 'push', args.slice(2));
1521
+ return;
1522
+ }
1523
+
1524
+ // nimbus profile <list|create|set|delete|show> (H1)
1525
+ if (command === 'profile') {
1526
+ const { profileCommand } = await import('./commands/profile');
1527
+ await profileCommand(subcommand ?? 'list', args.slice(2));
1528
+ return;
1529
+ }
1530
+
1531
+ // nimbus status — infrastructure status dashboard (G18)
1532
+ if (command === 'status') {
1533
+ const statusOptions: StatusOptions = {};
1534
+ for (let i = 1; i < args.length; i++) {
1535
+ if (args[i] === '--json') statusOptions.json = true;
1536
+ }
1537
+ await statusCommand(statusOptions);
1538
+ return;
1539
+ }
1540
+
1541
+ // nimbus context — full context snapshot (L3): alias for status with verbose details
1542
+ if (command === 'context') {
1543
+ const contextOptions: StatusOptions = { verbose: true };
1544
+ for (let i = 1; i < args.length; i++) {
1545
+ if (args[i] === '--json') contextOptions.json = true;
1546
+ }
1547
+ await statusCommand(contextOptions);
1548
+ return;
1549
+ }
1550
+
1551
+ // nimbus rollout — watch Kubernetes deployment rollout (L1)
1552
+ if (command === 'rollout') {
1553
+ const deployment = args[0];
1554
+ if (!deployment) {
1555
+ console.error('Usage: nimbus rollout <deployment> [--namespace <ns>] [--timeout <duration>]');
1556
+ process.exit(1);
1557
+ }
1558
+ const rolloutOptions: RolloutOptions = { deployment };
1559
+ for (let i = 1; i < args.length; i++) {
1560
+ const arg = args[i];
1561
+ if ((arg === '--namespace' || arg === '-n') && args[i + 1]) rolloutOptions.namespace = args[++i];
1562
+ else if (arg === '--timeout' && args[i + 1]) rolloutOptions.timeout = args[++i];
1563
+ }
1564
+ await rolloutCommand(rolloutOptions);
1565
+ return;
1566
+ }
1567
+
1568
+ // nimbus rollback — guided infrastructure rollback (G20)
1569
+ if (command === 'rollback') {
1570
+ const rollbackOptions: RollbackOptions = {};
1571
+ for (let i = 1; i < args.length; i++) {
1572
+ const arg = args[i];
1573
+ if (arg === '--helm' && args[i + 1]) rollbackOptions.helm = args[++i];
1574
+ else if (arg === '--k8s' && args[i + 1]) rollbackOptions.k8s = args[++i];
1575
+ else if (arg === '--namespace' && args[i + 1]) rollbackOptions.namespace = args[++i];
1576
+ else if (arg === '--tf') rollbackOptions.tf = true;
1577
+ else if (arg === '--terraform') rollbackOptions.terraform = true;
1578
+ else if (arg === '--tf-dir' && args[i + 1]) rollbackOptions.tfDir = args[++i];
1579
+ }
1580
+ await rollbackCommand(rollbackOptions);
1581
+ return;
1582
+ }
1583
+
1584
+ // nimbus deploy — orchestrate full terraform + kubectl deployment workflow (C1)
1585
+ if (command === 'deploy') {
1586
+ const { deployCommand } = await import('./commands/deploy');
1587
+ await deployCommand(args.slice(1));
1588
+ return;
1589
+ }
1590
+
1281
1591
  // Unknown command
1282
1592
  console.error(`Unknown command: ${command} ${subcommand || ''}`);
1283
1593
  console.log('');
@@ -1306,6 +1616,7 @@ export async function runCommand(args: string[]): Promise<void> {
1306
1616
  console.log(' nimbus logout - Clear all credentials');
1307
1617
  console.log(' nimbus auth status - Show current authentication status');
1308
1618
  console.log(' nimbus auth list - List all available providers');
1619
+ console.log(' nimbus auth-refresh - Re-validate and refresh cloud credentials');
1309
1620
  console.log('');
1310
1621
  console.log(' Infrastructure Generation:');
1311
1622
  console.log(
@@ -1,33 +1,38 @@
1
- import { getEnv } from '../utils';
2
-
3
1
  /**
4
- * Service Discovery
5
- * Provides URLs for all microservices based on environment
2
+ * Service Discovery (stub)
3
+ *
4
+ * Previously held URLs for 18 microservices. Nimbus is now a standalone binary —
5
+ * all services run in-process. These constants are kept for legacy import
6
+ * compatibility only. No HTTP services listen on these ports.
6
7
  */
7
8
 
9
+ function getEnvOrDefault(key: string, defaultVal: string): string {
10
+ return process.env[key] ?? defaultVal;
11
+ }
12
+
8
13
  export const ServiceURLs = {
9
- CLI: getEnv('CLI_SERVICE_URL', 'http://localhost:3000'),
10
- CORE_ENGINE: getEnv('CORE_ENGINE_SERVICE_URL', 'http://localhost:3001'),
11
- LLM: getEnv('LLM_SERVICE_URL', 'http://localhost:3002'),
12
- GENERATOR: getEnv('GENERATOR_SERVICE_URL', 'http://localhost:3003'),
13
- GIT_TOOLS: getEnv('GIT_TOOLS_SERVICE_URL', 'http://localhost:3004'),
14
- FS_TOOLS: getEnv('FS_TOOLS_SERVICE_URL', 'http://localhost:3005'),
15
- TERRAFORM_TOOLS: getEnv('TERRAFORM_TOOLS_SERVICE_URL', 'http://localhost:3006'),
16
- K8S_TOOLS: getEnv('K8S_TOOLS_SERVICE_URL', 'http://localhost:3007'),
17
- HELM_TOOLS: getEnv('HELM_TOOLS_SERVICE_URL', 'http://localhost:3008'),
18
- AWS_TOOLS: getEnv('AWS_TOOLS_SERVICE_URL', 'http://localhost:3009'),
19
- GITHUB_TOOLS: getEnv('GITHUB_TOOLS_SERVICE_URL', 'http://localhost:3010'),
20
- STATE: getEnv('STATE_SERVICE_URL', 'http://localhost:3011'),
21
- AUTH: getEnv('AUTH_SERVICE_URL', 'http://localhost:3012'),
22
- TEAM: getEnv('TEAM_SERVICE_URL', 'http://localhost:3013'),
23
- BILLING: getEnv('BILLING_SERVICE_URL', 'http://localhost:3014'),
24
- AUDIT: getEnv('AUDIT_SERVICE_URL', 'http://localhost:3015'),
25
- GCP_TOOLS: getEnv('GCP_TOOLS_URL', 'http://localhost:3016'),
26
- AZURE_TOOLS: getEnv('AZURE_TOOLS_URL', 'http://localhost:3017'),
14
+ CLI: getEnvOrDefault('CLI_SERVICE_URL', 'http://localhost:3000'),
15
+ CORE_ENGINE: getEnvOrDefault('CORE_ENGINE_SERVICE_URL', 'http://localhost:3001'),
16
+ LLM: getEnvOrDefault('LLM_SERVICE_URL', 'http://localhost:3002'),
17
+ GENERATOR: getEnvOrDefault('GENERATOR_SERVICE_URL', 'http://localhost:3003'),
18
+ GIT_TOOLS: getEnvOrDefault('GIT_TOOLS_SERVICE_URL', 'http://localhost:3004'),
19
+ FS_TOOLS: getEnvOrDefault('FS_TOOLS_SERVICE_URL', 'http://localhost:3005'),
20
+ TERRAFORM_TOOLS: getEnvOrDefault('TERRAFORM_TOOLS_SERVICE_URL', 'http://localhost:3006'),
21
+ K8S_TOOLS: getEnvOrDefault('K8S_TOOLS_SERVICE_URL', 'http://localhost:3007'),
22
+ HELM_TOOLS: getEnvOrDefault('HELM_TOOLS_SERVICE_URL', 'http://localhost:3008'),
23
+ AWS_TOOLS: getEnvOrDefault('AWS_TOOLS_SERVICE_URL', 'http://localhost:3009'),
24
+ GITHUB_TOOLS: getEnvOrDefault('GITHUB_TOOLS_SERVICE_URL', 'http://localhost:3010'),
25
+ STATE: getEnvOrDefault('STATE_SERVICE_URL', 'http://localhost:3011'),
26
+ AUTH: getEnvOrDefault('AUTH_SERVICE_URL', 'http://localhost:3012'),
27
+ TEAM: getEnvOrDefault('TEAM_SERVICE_URL', 'http://localhost:3013'),
28
+ BILLING: getEnvOrDefault('BILLING_SERVICE_URL', 'http://localhost:3014'),
29
+ AUDIT: getEnvOrDefault('AUDIT_SERVICE_URL', 'http://localhost:3015'),
30
+ GCP_TOOLS: getEnvOrDefault('GCP_TOOLS_URL', 'http://localhost:3016'),
31
+ AZURE_TOOLS: getEnvOrDefault('AZURE_TOOLS_URL', 'http://localhost:3017'),
27
32
  } as const;
28
33
 
29
34
  export const WebSocketURLs = {
30
- CORE_ENGINE: getEnv('CORE_ENGINE_WS_URL', 'ws://localhost:3101'),
31
- LLM: getEnv('LLM_WS_URL', 'ws://localhost:3102'),
32
- GENERATOR: getEnv('GENERATOR_WS_URL', 'ws://localhost:3103'),
35
+ CORE_ENGINE: getEnvOrDefault('CORE_ENGINE_WS_URL', 'ws://localhost:3101'),
36
+ LLM: getEnvOrDefault('LLM_WS_URL', 'ws://localhost:3102'),
37
+ GENERATOR: getEnvOrDefault('GENERATOR_WS_URL', 'ws://localhost:3103'),
33
38
  } as const;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Alias Command — L2
3
+ *
4
+ * Create, list, and remove command aliases stored in ~/.nimbus/aliases.json.
5
+ *
6
+ * Usage:
7
+ * nimbus alias deploy=run --auto-approve "deploy staging"
8
+ * nimbus alias list
9
+ * nimbus alias remove deploy
10
+ */
11
+
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import * as os from 'node:os';
15
+ import { ui } from '../wizard/ui';
16
+
17
+ const ALIASES_FILE = path.join(os.homedir(), '.nimbus', 'aliases.json');
18
+
19
+ function loadAliases(): Record<string, string> {
20
+ try {
21
+ return JSON.parse(fs.readFileSync(ALIASES_FILE, 'utf-8')) as Record<string, string>;
22
+ } catch {
23
+ return {};
24
+ }
25
+ }
26
+
27
+ function saveAliases(aliases: Record<string, string>): void {
28
+ const dir = path.dirname(ALIASES_FILE);
29
+ fs.mkdirSync(dir, { recursive: true });
30
+ fs.writeFileSync(ALIASES_FILE, JSON.stringify(aliases, null, 2), 'utf-8');
31
+ }
32
+
33
+ /**
34
+ * Resolve the first arg as an alias if one exists.
35
+ * Returns the original args unchanged if no alias matches.
36
+ */
37
+ export function resolveAlias(args: string[]): string[] {
38
+ if (!args.length) return args;
39
+ const aliases = loadAliases();
40
+ const expanded = aliases[args[0]];
41
+ if (!expanded) return args;
42
+ // Split the alias value on spaces and prepend to remaining args
43
+ return [...expanded.split(' '), ...args.slice(1)];
44
+ }
45
+
46
+ /**
47
+ * Alias command handler.
48
+ */
49
+ export async function aliasCommand(subcommand: string, args: string[]): Promise<void> {
50
+ const aliases = loadAliases();
51
+
52
+ if (subcommand === 'list' || (!subcommand && args.length === 0)) {
53
+ ui.header('Command Aliases');
54
+ const entries = Object.entries(aliases);
55
+ if (entries.length === 0) {
56
+ ui.info('No aliases defined. Create one: nimbus alias <name>=<command>');
57
+ return;
58
+ }
59
+ for (const [name, cmd] of entries) {
60
+ ui.print(` ${ui.color(name, 'green')} = ${cmd}`);
61
+ }
62
+ return;
63
+ }
64
+
65
+ if (subcommand === 'remove' || subcommand === 'rm') {
66
+ const name = args[0];
67
+ if (!name) {
68
+ ui.error('Usage: nimbus alias remove <name>');
69
+ process.exit(1);
70
+ }
71
+ if (!(name in aliases)) {
72
+ ui.warning(`Alias "${name}" not found`);
73
+ return;
74
+ }
75
+ delete aliases[name];
76
+ saveAliases(aliases);
77
+ ui.success(`Removed alias: ${name}`);
78
+ return;
79
+ }
80
+
81
+ // Create alias: subcommand is "<name>=<rest>" or subcommand is the name and args hold the expansion
82
+ const raw = subcommand + (args.length ? ' ' + args.join(' ') : '');
83
+ const eqIdx = raw.indexOf('=');
84
+ if (eqIdx === -1) {
85
+ ui.error('Usage: nimbus alias <name>=<command> or nimbus alias list or nimbus alias remove <name>');
86
+ process.exit(1);
87
+ }
88
+
89
+ const name = raw.slice(0, eqIdx).trim();
90
+ const cmd = raw.slice(eqIdx + 1).trim();
91
+
92
+ if (!name || !cmd) {
93
+ ui.error('Alias name and command must not be empty');
94
+ process.exit(1);
95
+ }
96
+
97
+ aliases[name] = cmd;
98
+ saveAliases(aliases);
99
+ ui.success(`Alias set: ${ui.color(name, 'green')} = ${cmd}`);
100
+ }