@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,359 @@
1
+ /**
2
+ * GCP Static Pricing Lookup
3
+ *
4
+ * Monthly on-demand pricing based on us-central1 as of 2024.
5
+ * These are approximate list prices used for quick estimation.
6
+ * Install Infracost for real-time, region-aware pricing.
7
+ */
8
+ const HOURS_PER_MONTH = 730;
9
+ // ------------------------------------------------------------------
10
+ // Compute Engine machine type pricing (on-demand, us-central1)
11
+ // ------------------------------------------------------------------
12
+ const GCE_PRICING = {
13
+ // E2 shared-core
14
+ 'e2-micro': 6.11,
15
+ 'e2-small': 12.23,
16
+ 'e2-medium': 24.46,
17
+ // E2 standard
18
+ 'e2-standard-2': 48.92,
19
+ 'e2-standard-4': 97.83,
20
+ 'e2-standard-8': 195.67,
21
+ 'e2-standard-16': 391.34,
22
+ // N1 standard
23
+ 'n1-standard-1': 34.67,
24
+ 'n1-standard-2': 69.35,
25
+ 'n1-standard-4': 138.7,
26
+ 'n1-standard-8': 277.4,
27
+ 'n1-standard-16': 554.79,
28
+ // N2 standard
29
+ 'n2-standard-2': 71.54,
30
+ 'n2-standard-4': 143.08,
31
+ 'n2-standard-8': 286.16,
32
+ 'n2-standard-16': 572.32,
33
+ // N2D standard (AMD)
34
+ 'n2d-standard-2': 62.27,
35
+ 'n2d-standard-4': 124.54,
36
+ 'n2d-standard-8': 249.08,
37
+ // C2 compute-optimized
38
+ 'c2-standard-4': 152.44,
39
+ 'c2-standard-8': 304.88,
40
+ 'c2-standard-16': 609.77,
41
+ // M1 memory-optimized
42
+ 'm1-megamem-96': 7636.69,
43
+ // N1 highmem
44
+ 'n1-highmem-2': 93.46,
45
+ 'n1-highmem-4': 186.93,
46
+ 'n1-highmem-8': 373.85,
47
+ // F1/G1 (micro/small)
48
+ 'f1-micro': 3.88,
49
+ 'g1-small': 13.13,
50
+ };
51
+ // ------------------------------------------------------------------
52
+ // Cloud SQL pricing (on-demand, us-central1)
53
+ // ------------------------------------------------------------------
54
+ const CLOUD_SQL_PRICING = {
55
+ 'db-f1-micro': 7.67,
56
+ 'db-g1-small': 25.55,
57
+ 'db-n1-standard-1': 51.1,
58
+ 'db-n1-standard-2': 102.2,
59
+ 'db-n1-standard-4': 204.4,
60
+ 'db-n1-standard-8': 408.8,
61
+ 'db-n1-standard-16': 817.6,
62
+ 'db-n1-highmem-2': 117.8,
63
+ 'db-n1-highmem-4': 235.61,
64
+ 'db-n1-highmem-8': 471.22,
65
+ 'db-custom-1-3840': 51.1,
66
+ 'db-custom-2-7680': 102.2,
67
+ 'db-custom-4-15360': 204.4,
68
+ };
69
+ // ------------------------------------------------------------------
70
+ // Persistent Disk pricing (per GB/month, us-central1)
71
+ // ------------------------------------------------------------------
72
+ const DISK_PRICING = {
73
+ 'pd-standard': 0.04,
74
+ 'pd-balanced': 0.1,
75
+ 'pd-ssd': 0.17,
76
+ 'pd-extreme': 0.125,
77
+ };
78
+ /**
79
+ * Look up the estimated monthly price for a GCP Terraform resource.
80
+ */
81
+ export function getGCPPrice(resource) {
82
+ const { type, attributes } = resource;
83
+ switch (type) {
84
+ // ----- Compute -----
85
+ case 'google_compute_instance': {
86
+ const machineType = attributes.machine_type || 'e2-medium';
87
+ // machine_type can be a full URL or just the name
88
+ const typeName = machineType.split('/').pop() || machineType;
89
+ const price = GCE_PRICING[typeName];
90
+ if (!price) {
91
+ return {
92
+ monthlyCost: 24.46,
93
+ hourlyCost: 24.46 / HOURS_PER_MONTH,
94
+ description: `GCE ${typeName} (estimated, type not in lookup table)`,
95
+ };
96
+ }
97
+ return {
98
+ monthlyCost: price,
99
+ hourlyCost: price / HOURS_PER_MONTH,
100
+ unit: 'hours',
101
+ description: `GCE ${typeName}`,
102
+ };
103
+ }
104
+ case 'google_compute_instance_template': {
105
+ const machineType = attributes.machine_type || 'e2-medium';
106
+ const typeName = machineType.split('/').pop() || machineType;
107
+ return {
108
+ monthlyCost: 0,
109
+ hourlyCost: 0,
110
+ description: `Instance template ${typeName} (cost depends on instance group)`,
111
+ };
112
+ }
113
+ case 'google_compute_instance_group_manager':
114
+ case 'google_compute_region_instance_group_manager': {
115
+ const targetSize = attributes.target_size || 1;
116
+ const perInstance = 24.46; // default e2-medium
117
+ return {
118
+ monthlyCost: targetSize * perInstance,
119
+ hourlyCost: (targetSize * perInstance) / HOURS_PER_MONTH,
120
+ quantity: targetSize,
121
+ unit: 'instances',
122
+ description: `Instance group manager (${targetSize} instances, estimated e2-medium)`,
123
+ };
124
+ }
125
+ // ----- Database -----
126
+ case 'google_sql_database_instance': {
127
+ const tier = attributes.tier || attributes['settings.tier'] || 'db-n1-standard-1';
128
+ const price = CLOUD_SQL_PRICING[tier] || 51.1;
129
+ const diskSize = attributes.disk_size || attributes['settings.disk_size'] || 10;
130
+ const diskType = attributes.disk_type || attributes['settings.disk_type'] || 'PD_SSD';
131
+ const diskRate = diskType === 'PD_HDD' ? 0.09 : 0.17;
132
+ const diskCost = diskSize * diskRate;
133
+ const ha = attributes.availability_type === 'REGIONAL' ||
134
+ attributes['settings.availability_type'] === 'REGIONAL';
135
+ const multiplier = ha ? 2 : 1;
136
+ return {
137
+ monthlyCost: price * multiplier + diskCost,
138
+ hourlyCost: (price * multiplier) / HOURS_PER_MONTH,
139
+ description: `Cloud SQL ${tier}${ha ? ' HA' : ''} + ${diskSize}GB`,
140
+ };
141
+ }
142
+ case 'google_sql_database': {
143
+ return {
144
+ monthlyCost: 0,
145
+ hourlyCost: 0,
146
+ description: 'Cloud SQL database (no additional cost)',
147
+ };
148
+ }
149
+ case 'google_spanner_instance': {
150
+ const numNodes = attributes.num_nodes || 1;
151
+ // $0.90/node-hour
152
+ const cost = numNodes * 0.9 * HOURS_PER_MONTH;
153
+ return {
154
+ monthlyCost: cost,
155
+ hourlyCost: numNodes * 0.9,
156
+ quantity: numNodes,
157
+ unit: 'nodes',
158
+ description: `Cloud Spanner (${numNodes} nodes)`,
159
+ };
160
+ }
161
+ // ----- Storage -----
162
+ case 'google_storage_bucket': {
163
+ // GCS standard: ~$0.020/GB, estimate 100GB
164
+ return {
165
+ monthlyCost: 2.0,
166
+ hourlyCost: 0,
167
+ unit: 'GB',
168
+ description: 'GCS Standard (estimated 100GB baseline)',
169
+ };
170
+ }
171
+ case 'google_compute_disk': {
172
+ const diskType = attributes.type || 'pd-balanced';
173
+ const size = attributes.size || 10;
174
+ const pricePerGB = DISK_PRICING[diskType] || 0.1;
175
+ return {
176
+ monthlyCost: size * pricePerGB,
177
+ hourlyCost: 0,
178
+ quantity: size,
179
+ unit: 'GB',
180
+ description: `Persistent Disk ${diskType} ${size}GB`,
181
+ };
182
+ }
183
+ // ----- Networking -----
184
+ case 'google_compute_forwarding_rule':
185
+ case 'google_compute_global_forwarding_rule': {
186
+ // Forwarding rule: ~$0.025/hr
187
+ return {
188
+ monthlyCost: 18.25,
189
+ hourlyCost: 0.025,
190
+ description: 'Forwarding rule',
191
+ };
192
+ }
193
+ case 'google_compute_router_nat': {
194
+ // Cloud NAT: ~$0.044/hr per gateway + data processing
195
+ const fixedCost = 0.044 * HOURS_PER_MONTH;
196
+ return {
197
+ monthlyCost: fixedCost + 32.12,
198
+ hourlyCost: 0.044,
199
+ description: 'Cloud NAT (fixed + estimated data processing)',
200
+ };
201
+ }
202
+ case 'google_compute_address':
203
+ case 'google_compute_global_address': {
204
+ // Static IP: free when in use, $0.010/hr when idle
205
+ return {
206
+ monthlyCost: 7.3,
207
+ hourlyCost: 0.01,
208
+ description: 'Static IP (cost if unused)',
209
+ };
210
+ }
211
+ // ----- Containers -----
212
+ case 'google_container_cluster': {
213
+ // GKE Autopilot: variable; Standard: $0.10/hr cluster management
214
+ const isAutopilot = attributes.enable_autopilot === true;
215
+ if (isAutopilot) {
216
+ return {
217
+ monthlyCost: 73.0,
218
+ hourlyCost: 0.1,
219
+ description: 'GKE Autopilot cluster management',
220
+ };
221
+ }
222
+ return {
223
+ monthlyCost: 73.0,
224
+ hourlyCost: 0.1,
225
+ description: 'GKE Standard cluster management',
226
+ };
227
+ }
228
+ case 'google_container_node_pool': {
229
+ const nodeCount = attributes.node_count || attributes.initial_node_count || 1;
230
+ const machineType = attributes['node_config.machine_type'] || 'e2-medium';
231
+ const price = GCE_PRICING[machineType] || 24.46;
232
+ return {
233
+ monthlyCost: price * nodeCount,
234
+ hourlyCost: (price * nodeCount) / HOURS_PER_MONTH,
235
+ quantity: nodeCount,
236
+ unit: 'nodes',
237
+ description: `GKE node pool (${nodeCount}x ${machineType})`,
238
+ };
239
+ }
240
+ case 'google_cloud_run_service':
241
+ case 'google_cloud_run_v2_service': {
242
+ return {
243
+ monthlyCost: 0,
244
+ hourlyCost: 0,
245
+ description: 'Cloud Run (usage-based, $0 at rest)',
246
+ };
247
+ }
248
+ case 'google_artifact_registry_repository': {
249
+ return {
250
+ monthlyCost: 1.0,
251
+ hourlyCost: 0,
252
+ description: 'Artifact Registry (estimated 10GB images)',
253
+ };
254
+ }
255
+ // ----- Serverless -----
256
+ case 'google_cloudfunctions_function':
257
+ case 'google_cloudfunctions2_function': {
258
+ return {
259
+ monthlyCost: 0,
260
+ hourlyCost: 0,
261
+ description: 'Cloud Function (usage-based, $0 at rest)',
262
+ };
263
+ }
264
+ case 'google_pubsub_topic': {
265
+ return {
266
+ monthlyCost: 0,
267
+ hourlyCost: 0,
268
+ description: 'Pub/Sub topic (usage-based, first 10GB free)',
269
+ };
270
+ }
271
+ case 'google_pubsub_subscription': {
272
+ return {
273
+ monthlyCost: 0,
274
+ hourlyCost: 0,
275
+ description: 'Pub/Sub subscription (usage-based)',
276
+ };
277
+ }
278
+ // ----- Data -----
279
+ case 'google_bigquery_dataset': {
280
+ return {
281
+ monthlyCost: 0,
282
+ hourlyCost: 0,
283
+ description: 'BigQuery dataset (storage/query usage-based)',
284
+ };
285
+ }
286
+ case 'google_bigquery_table': {
287
+ return {
288
+ monthlyCost: 0,
289
+ hourlyCost: 0,
290
+ description: 'BigQuery table (storage/query usage-based)',
291
+ };
292
+ }
293
+ case 'google_dataflow_job': {
294
+ // Highly variable; estimate a small job
295
+ return {
296
+ monthlyCost: 50.0,
297
+ hourlyCost: 50.0 / HOURS_PER_MONTH,
298
+ description: 'Dataflow job (estimated small workload)',
299
+ };
300
+ }
301
+ case 'google_redis_instance': {
302
+ const memorySizeGb = attributes.memory_size_gb || 1;
303
+ // Basic tier: ~$0.049/GB-hour
304
+ const cost = memorySizeGb * 0.049 * HOURS_PER_MONTH;
305
+ return {
306
+ monthlyCost: cost,
307
+ hourlyCost: memorySizeGb * 0.049,
308
+ quantity: memorySizeGb,
309
+ unit: 'GB',
310
+ description: `Memorystore Redis (${memorySizeGb}GB)`,
311
+ };
312
+ }
313
+ // ----- Monitoring / Logging -----
314
+ case 'google_monitoring_alert_policy': {
315
+ return { monthlyCost: 0, hourlyCost: 0, description: 'Monitoring alert (no direct cost)' };
316
+ }
317
+ case 'google_logging_metric': {
318
+ return { monthlyCost: 0, hourlyCost: 0, description: 'Logging metric (no direct cost)' };
319
+ }
320
+ // ----- Identity / Security (no direct cost) -----
321
+ case 'google_compute_network':
322
+ case 'google_compute_subnetwork':
323
+ case 'google_compute_firewall':
324
+ case 'google_compute_route':
325
+ case 'google_compute_router':
326
+ case 'google_project_iam_member':
327
+ case 'google_project_iam_binding':
328
+ case 'google_project_iam_policy':
329
+ case 'google_service_account':
330
+ case 'google_service_account_iam_member':
331
+ case 'google_kms_key_ring':
332
+ case 'google_kms_crypto_key':
333
+ case 'google_dns_managed_zone':
334
+ case 'google_dns_record_set':
335
+ case 'google_project_service': {
336
+ return { monthlyCost: 0, hourlyCost: 0, description: 'No direct cost' };
337
+ }
338
+ // ----- VPN -----
339
+ case 'google_compute_vpn_gateway':
340
+ case 'google_compute_ha_vpn_gateway': {
341
+ // VPN gateway: ~$0.075/hr
342
+ return {
343
+ monthlyCost: 0.075 * HOURS_PER_MONTH,
344
+ hourlyCost: 0.075,
345
+ description: 'Cloud VPN gateway',
346
+ };
347
+ }
348
+ case 'google_compute_vpn_tunnel': {
349
+ // VPN tunnel: ~$0.075/hr
350
+ return {
351
+ monthlyCost: 0.075 * HOURS_PER_MONTH,
352
+ hourlyCost: 0.075,
353
+ description: 'VPN tunnel',
354
+ };
355
+ }
356
+ default:
357
+ return null;
358
+ }
359
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Unified Pricing Lookup
3
+ *
4
+ * Routes resource pricing lookups to the appropriate cloud provider module.
5
+ */
6
+ import { getAWSPrice } from './aws';
7
+ import { getGCPPrice } from './gcp';
8
+ import { getAzurePrice } from './azure';
9
+ /**
10
+ * Get the estimated price for a Terraform resource.
11
+ * Returns null if the resource type is not recognized by any provider module.
12
+ */
13
+ export function getResourcePrice(resource) {
14
+ switch (resource.provider) {
15
+ case 'aws':
16
+ return getAWSPrice(resource);
17
+ case 'gcp':
18
+ return getGCPPrice(resource);
19
+ case 'azure':
20
+ return getAzurePrice(resource);
21
+ default:
22
+ return null;
23
+ }
24
+ }
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Demo Command
3
+ *
4
+ * Run demo scenarios for presentations and tutorials
5
+ */
6
+ import { logger } from '../utils';
7
+ import { ui } from '../wizard/ui';
8
+ import { select } from '../wizard/prompts';
9
+ import { getScenarios, getScenario, runScenario, } from '../demo';
10
+ /**
11
+ * Parse demo command options from args
12
+ */
13
+ export function parseDemoOptions(args) {
14
+ const options = {};
15
+ for (let i = 0; i < args.length; i++) {
16
+ const arg = args[i];
17
+ if (arg === '--list' || arg === '-l') {
18
+ options.list = true;
19
+ }
20
+ else if (arg === '--interactive' || arg === '-i') {
21
+ options.interactive = true;
22
+ }
23
+ else if (arg === '--dry-run' || arg === '-n') {
24
+ options.dryRun = true;
25
+ }
26
+ else if (arg === '--verbose' || arg === '-v') {
27
+ options.verbose = true;
28
+ }
29
+ else if (arg === '--speed' || arg === '-s') {
30
+ const speed = args[++i];
31
+ if (speed === 'slow' || speed === 'normal' || speed === 'fast') {
32
+ options.speed = speed;
33
+ }
34
+ }
35
+ else if (arg === '--category' || arg === '-c') {
36
+ options.category = args[++i];
37
+ }
38
+ else if (arg === '--tag' || arg === '-t') {
39
+ options.tag = args[++i];
40
+ }
41
+ else if (!arg.startsWith('-') && !options.scenario) {
42
+ options.scenario = arg;
43
+ }
44
+ }
45
+ return options;
46
+ }
47
+ /**
48
+ * Main demo command
49
+ */
50
+ export async function demoCommand(options) {
51
+ logger.info('Running demo command', { options });
52
+ try {
53
+ // Auto-configure when NIMBUS_DEMO_MODE is set
54
+ if (process.env.NIMBUS_DEMO_MODE === 'true') {
55
+ ui.info('Demo mode enabled via NIMBUS_DEMO_MODE');
56
+ options.dryRun = true;
57
+ options.speed = options.speed || 'fast';
58
+ }
59
+ // Get all scenarios
60
+ let scenarios = getScenarios();
61
+ // Filter by category
62
+ if (options.category) {
63
+ scenarios = scenarios.filter(s => s.category === options.category);
64
+ }
65
+ // Filter by tag
66
+ if (options.tag) {
67
+ scenarios = scenarios.filter(s => s.tags?.includes(options.tag));
68
+ }
69
+ // List scenarios
70
+ if (options.list) {
71
+ displayScenarioList(scenarios);
72
+ return;
73
+ }
74
+ // If no scenario specified, show interactive picker
75
+ if (!options.scenario) {
76
+ if (scenarios.length === 0) {
77
+ ui.warning('No scenarios available');
78
+ return;
79
+ }
80
+ const selectedId = await select({
81
+ message: 'Select a demo scenario:',
82
+ options: scenarios.map(s => ({
83
+ label: s.name,
84
+ value: s.id,
85
+ description: `${s.category} - ${s.description}`,
86
+ })),
87
+ });
88
+ if (!selectedId) {
89
+ ui.warning('No scenario selected');
90
+ return;
91
+ }
92
+ options.scenario = selectedId;
93
+ }
94
+ // Get the scenario
95
+ const scenario = getScenario(options.scenario);
96
+ if (!scenario) {
97
+ ui.error(`Scenario not found: ${options.scenario}`);
98
+ ui.newLine();
99
+ ui.info('Available scenarios:');
100
+ displayScenarioList(scenarios);
101
+ return;
102
+ }
103
+ // Run the scenario
104
+ const runOptions = {
105
+ interactive: options.interactive ?? true,
106
+ speed: options.speed ?? 'normal',
107
+ dryRun: options.dryRun ?? true, // Default to dry run for safety
108
+ verbose: options.verbose ?? false,
109
+ };
110
+ await runScenario(scenario, runOptions);
111
+ }
112
+ catch (error) {
113
+ const message = error instanceof Error ? error.message : 'Unknown error';
114
+ logger.error('Demo command failed', { error: message });
115
+ ui.error(`Demo failed: ${message}`);
116
+ }
117
+ }
118
+ /**
119
+ * Display list of available scenarios
120
+ */
121
+ function displayScenarioList(scenarios) {
122
+ ui.newLine();
123
+ ui.print(ui.bold('Available Demo Scenarios'));
124
+ ui.newLine();
125
+ if (scenarios.length === 0) {
126
+ ui.print(' No scenarios found');
127
+ return;
128
+ }
129
+ // Group by category
130
+ const byCategory = new Map();
131
+ for (const scenario of scenarios) {
132
+ const list = byCategory.get(scenario.category) || [];
133
+ list.push(scenario);
134
+ byCategory.set(scenario.category, list);
135
+ }
136
+ // Display each category
137
+ for (const [category, categoryScenarios] of byCategory) {
138
+ ui.print(ui.color(` ${formatCategory(category)}`, 'cyan'));
139
+ for (const scenario of categoryScenarios) {
140
+ const duration = scenario.duration ? `${scenario.duration} min` : '';
141
+ const tags = scenario.tags?.length ? ui.dim(`[${scenario.tags.join(', ')}]`) : '';
142
+ ui.print(` ${ui.bold(scenario.id)}`);
143
+ ui.print(` ${scenario.name}`);
144
+ ui.print(` ${ui.dim(scenario.description)}`);
145
+ if (duration || tags) {
146
+ ui.print(` ${duration} ${tags}`);
147
+ }
148
+ ui.newLine();
149
+ }
150
+ }
151
+ ui.newLine();
152
+ ui.print('Usage:');
153
+ ui.print(' nimbus demo <scenario-id> Run a specific scenario');
154
+ ui.print(' nimbus demo --interactive Interactive mode (pause between steps)');
155
+ ui.print(' nimbus demo --dry-run Show commands without executing');
156
+ ui.print(' nimbus demo --speed slow|fast Control demo speed');
157
+ ui.print(' nimbus demo --category terraform Filter by category');
158
+ ui.print(' nimbus demo --tag aws Filter by tag');
159
+ ui.newLine();
160
+ }
161
+ /**
162
+ * Format category name for display
163
+ */
164
+ function formatCategory(category) {
165
+ const categoryNames = {
166
+ terraform: 'Terraform Demos',
167
+ kubernetes: 'Kubernetes Demos',
168
+ helm: 'Helm Demos',
169
+ aws: 'AWS Demos',
170
+ 'full-journey': 'Full Journey Demos',
171
+ tutorial: 'Tutorials',
172
+ };
173
+ return categoryNames[category] || category;
174
+ }
175
+ /**
176
+ * Run a specific demo scenario by ID
177
+ */
178
+ export async function runDemoScenario(scenarioId, options = {}) {
179
+ const scenario = getScenario(scenarioId);
180
+ if (!scenario) {
181
+ throw new Error(`Scenario not found: ${scenarioId}`);
182
+ }
183
+ const runOptions = {
184
+ interactive: options.interactive ?? true,
185
+ speed: options.speed ?? 'normal',
186
+ dryRun: options.dryRun ?? true,
187
+ verbose: options.verbose ?? false,
188
+ };
189
+ await runScenario(scenario, runOptions);
190
+ }
191
+ /**
192
+ * List all demo scenario IDs
193
+ */
194
+ export function listDemoScenarios() {
195
+ return getScenarios().map(s => s.id);
196
+ }