@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,138 @@
1
+ /**
2
+ * Context Database
3
+ *
4
+ * Lightweight SQLite wrapper for .nimbus/context.db that stores:
5
+ * - Recent commands and their results
6
+ * - File change tracking for project context
7
+ * - AI conversation context across sessions
8
+ */
9
+ import { Database } from '../compat/sqlite';
10
+ import * as path from 'path';
11
+ import * as fs from 'fs';
12
+ const CONTEXT_DB_NAME = 'context.db';
13
+ const SCHEMA = `
14
+ CREATE TABLE IF NOT EXISTS command_history (
15
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
16
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
17
+ command TEXT NOT NULL,
18
+ args TEXT,
19
+ status TEXT NOT NULL DEFAULT 'success',
20
+ duration_ms INTEGER,
21
+ output_summary TEXT
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS file_changes (
25
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
26
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
27
+ file_path TEXT NOT NULL,
28
+ change_type TEXT NOT NULL,
29
+ content_hash TEXT,
30
+ metadata TEXT
31
+ );
32
+
33
+ CREATE TABLE IF NOT EXISTS conversation_context (
34
+ id TEXT PRIMARY KEY,
35
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
36
+ title TEXT,
37
+ messages TEXT NOT NULL,
38
+ model TEXT,
39
+ token_count INTEGER,
40
+ metadata TEXT
41
+ );
42
+
43
+ CREATE INDEX IF NOT EXISTS idx_cmd_history_ts ON command_history(timestamp);
44
+ CREATE INDEX IF NOT EXISTS idx_file_changes_path ON file_changes(file_path);
45
+ CREATE INDEX IF NOT EXISTS idx_file_changes_ts ON file_changes(timestamp);
46
+ CREATE INDEX IF NOT EXISTS idx_conversation_ts ON conversation_context(timestamp);
47
+ `;
48
+ export class ContextDatabase {
49
+ db;
50
+ dbPath;
51
+ constructor(projectDir) {
52
+ const nimbusDir = path.join(projectDir, '.nimbus');
53
+ this.dbPath = path.join(nimbusDir, CONTEXT_DB_NAME);
54
+ if (!fs.existsSync(nimbusDir)) {
55
+ fs.mkdirSync(nimbusDir, { recursive: true });
56
+ }
57
+ this.db = new Database(this.dbPath);
58
+ this.db.exec(SCHEMA);
59
+ }
60
+ recordCommand(command, args, status = 'success', durationMs, outputSummary) {
61
+ const stmt = this.db.prepare(`
62
+ INSERT INTO command_history (command, args, status, duration_ms, output_summary)
63
+ VALUES (?, ?, ?, ?, ?)
64
+ `);
65
+ stmt.run(command, args || null, status, durationMs || null, outputSummary || null);
66
+ }
67
+ getRecentCommands(limit = 20) {
68
+ const stmt = this.db.prepare(`
69
+ SELECT * FROM command_history ORDER BY timestamp DESC LIMIT ?
70
+ `);
71
+ return stmt.all(limit).map(row => ({
72
+ id: row.id,
73
+ timestamp: row.timestamp,
74
+ command: row.command,
75
+ args: row.args,
76
+ status: row.status,
77
+ durationMs: row.duration_ms,
78
+ }));
79
+ }
80
+ trackFileChange(filePath, changeType, contentHash, metadata) {
81
+ const stmt = this.db.prepare(`
82
+ INSERT INTO file_changes (file_path, change_type, content_hash, metadata)
83
+ VALUES (?, ?, ?, ?)
84
+ `);
85
+ stmt.run(filePath, changeType, contentHash || null, metadata ? JSON.stringify(metadata) : null);
86
+ }
87
+ getRecentFileChanges(limit = 50) {
88
+ const stmt = this.db.prepare(`
89
+ SELECT * FROM file_changes ORDER BY timestamp DESC LIMIT ?
90
+ `);
91
+ return stmt.all(limit).map(row => ({
92
+ filePath: row.file_path,
93
+ changeType: row.change_type,
94
+ timestamp: row.timestamp,
95
+ }));
96
+ }
97
+ saveConversation(id, title, messages, model, tokenCount, metadata) {
98
+ const stmt = this.db.prepare(`
99
+ INSERT OR REPLACE INTO conversation_context (id, title, messages, model, token_count, metadata)
100
+ VALUES (?, ?, ?, ?, ?, ?)
101
+ `);
102
+ stmt.run(id, title, JSON.stringify(messages), model || null, tokenCount || null, metadata ? JSON.stringify(metadata) : null);
103
+ }
104
+ getConversation(id) {
105
+ const stmt = this.db.prepare('SELECT * FROM conversation_context WHERE id = ?');
106
+ const row = stmt.get(id);
107
+ if (!row) {
108
+ return null;
109
+ }
110
+ return {
111
+ id: row.id,
112
+ title: row.title,
113
+ messages: JSON.parse(row.messages),
114
+ model: row.model,
115
+ tokenCount: row.token_count,
116
+ };
117
+ }
118
+ listConversations(limit = 20) {
119
+ const stmt = this.db.prepare(`
120
+ SELECT id, title, timestamp, model FROM conversation_context ORDER BY timestamp DESC LIMIT ?
121
+ `);
122
+ return stmt.all(limit).map(row => ({
123
+ id: row.id,
124
+ title: row.title,
125
+ timestamp: row.timestamp,
126
+ model: row.model,
127
+ }));
128
+ }
129
+ close() {
130
+ this.db.close();
131
+ }
132
+ getPath() {
133
+ return this.dbPath;
134
+ }
135
+ }
136
+ export function initContextDatabase(projectDir) {
137
+ return new ContextDatabase(projectDir);
138
+ }
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Demo Framework
3
+ *
4
+ * Orchestrates demo scenarios for presentations and tutorials
5
+ */
6
+ import { logger } from '../utils';
7
+ import { ui } from '../wizard/ui';
8
+ import { confirm } from '../wizard/prompts';
9
+ import { terraformVpcScenario } from './scenarios/terraform-vpc';
10
+ import { fullJourneyScenario } from './scenarios/full-journey';
11
+ import { gettingStartedScenario } from './scenarios/getting-started';
12
+ import { k8sDeploymentScenario } from './scenarios/k8s-deployment';
13
+ import { helmReleaseScenario } from './scenarios/helm-release';
14
+ // All available scenarios
15
+ const scenarios = [
16
+ gettingStartedScenario,
17
+ terraformVpcScenario,
18
+ k8sDeploymentScenario,
19
+ helmReleaseScenario,
20
+ fullJourneyScenario,
21
+ ];
22
+ /**
23
+ * Get all available demo scenarios
24
+ */
25
+ export function getScenarios() {
26
+ return scenarios;
27
+ }
28
+ /**
29
+ * Get a scenario by ID
30
+ */
31
+ export function getScenario(id) {
32
+ return scenarios.find(s => s.id === id);
33
+ }
34
+ /**
35
+ * Run a demo scenario
36
+ */
37
+ export async function runScenario(scenario, options = {}) {
38
+ logger.info(`Running demo scenario: ${scenario.name}`);
39
+ const startedAt = new Date();
40
+ const stepResults = [];
41
+ let totalDuration = 0;
42
+ let success = true;
43
+ // Show scenario header
44
+ displayScenarioHeader(scenario);
45
+ // Check prerequisites
46
+ if (scenario.prerequisites && scenario.prerequisites.length > 0) {
47
+ ui.newLine();
48
+ ui.print(ui.bold('Prerequisites:'));
49
+ for (const prereq of scenario.prerequisites) {
50
+ ui.print(` - ${prereq}`);
51
+ }
52
+ ui.newLine();
53
+ if (options.interactive) {
54
+ const proceed = await confirm({
55
+ message: 'Have you met all prerequisites?',
56
+ defaultValue: true,
57
+ });
58
+ if (!proceed) {
59
+ ui.warning('Demo cancelled - prerequisites not met');
60
+ return {
61
+ scenario,
62
+ steps: [],
63
+ success: false,
64
+ totalDuration: 0,
65
+ startedAt,
66
+ completedAt: new Date(),
67
+ };
68
+ }
69
+ }
70
+ }
71
+ // Run each step
72
+ for (let i = 0; i < scenario.steps.length; i++) {
73
+ const step = scenario.steps[i];
74
+ // Wait before step if interactive
75
+ if (options.interactive && i > 0) {
76
+ const proceed = await confirm({
77
+ message: 'Continue to next step?',
78
+ defaultValue: true,
79
+ });
80
+ if (!proceed) {
81
+ ui.info('Demo paused');
82
+ break;
83
+ }
84
+ }
85
+ const result = await runStep(step, options, i + 1, scenario.steps.length);
86
+ stepResults.push(result);
87
+ totalDuration += result.duration;
88
+ if (!result.success) {
89
+ success = false;
90
+ if (!options.interactive) {
91
+ ui.error('Step failed, stopping demo');
92
+ break;
93
+ }
94
+ }
95
+ // Add delay based on speed
96
+ const delay = getDelay(options.speed, step.delay);
97
+ if (delay > 0) {
98
+ await sleep(delay);
99
+ }
100
+ }
101
+ const completedAt = new Date();
102
+ // Show summary
103
+ displaySummary(scenario, stepResults, success, totalDuration);
104
+ return {
105
+ scenario,
106
+ steps: stepResults,
107
+ success,
108
+ totalDuration,
109
+ startedAt,
110
+ completedAt,
111
+ };
112
+ }
113
+ /**
114
+ * Run a single demo step
115
+ */
116
+ async function runStep(step, options, current, total) {
117
+ const startTime = Date.now();
118
+ // Display step header
119
+ ui.newLine();
120
+ ui.print(ui.color(`Step ${current}/${total}`, 'cyan'));
121
+ ui.print(ui.bold(step.title));
122
+ if (step.description) {
123
+ ui.print(ui.dim(step.description));
124
+ }
125
+ ui.newLine();
126
+ // Show command
127
+ ui.print(` ${ui.color('$', 'green')} ${ui.color(step.command, 'yellow')}`);
128
+ ui.newLine();
129
+ // Execute or mock
130
+ let output = '';
131
+ let error = '';
132
+ let success = true;
133
+ if (options.dryRun) {
134
+ // Use mock response in dry run mode
135
+ if (step.mockResponse) {
136
+ output = step.mockResponse;
137
+ if (step.showOutput !== false) {
138
+ displayOutput(output);
139
+ }
140
+ }
141
+ else {
142
+ ui.dim(' [Dry run - command not executed]');
143
+ }
144
+ }
145
+ else {
146
+ // Actually execute the command
147
+ try {
148
+ const result = await executeCommand(step.command);
149
+ output = result.stdout;
150
+ error = result.stderr;
151
+ success = result.exitCode === 0;
152
+ if (step.showOutput !== false && output) {
153
+ displayOutput(output);
154
+ }
155
+ if (error && options.verbose) {
156
+ ui.print(ui.color(error, 'red'));
157
+ }
158
+ }
159
+ catch (e) {
160
+ success = false;
161
+ error = e.message;
162
+ ui.error(`Failed: ${error}`);
163
+ }
164
+ }
165
+ // Verify expected output
166
+ if (success && step.expectedOutput) {
167
+ const regex = new RegExp(step.expectedOutput);
168
+ if (!regex.test(output)) {
169
+ success = false;
170
+ error = 'Output did not match expected pattern';
171
+ }
172
+ }
173
+ const duration = Date.now() - startTime;
174
+ // Show result
175
+ if (success) {
176
+ ui.success('Step completed');
177
+ }
178
+ else {
179
+ ui.error('Step failed');
180
+ }
181
+ return {
182
+ step,
183
+ success,
184
+ output,
185
+ error: error || undefined,
186
+ duration,
187
+ };
188
+ }
189
+ /**
190
+ * Execute a command and return result
191
+ */
192
+ async function executeCommand(command) {
193
+ const { exec } = await import('child_process');
194
+ const { promisify } = await import('util');
195
+ const execAsync = promisify(exec);
196
+ try {
197
+ const { stdout, stderr } = await execAsync(command, {
198
+ maxBuffer: 10 * 1024 * 1024, // 10MB
199
+ });
200
+ return { stdout, stderr, exitCode: 0 };
201
+ }
202
+ catch (error) {
203
+ return {
204
+ stdout: error.stdout || '',
205
+ stderr: error.stderr || error.message,
206
+ exitCode: error.code || 1,
207
+ };
208
+ }
209
+ }
210
+ /**
211
+ * Display scenario header
212
+ */
213
+ function displayScenarioHeader(scenario) {
214
+ ui.newLine();
215
+ ui.print(`╔${'═'.repeat(58)}╗`);
216
+ ui.print(`║${' '.repeat(58)}║`);
217
+ ui.print(`║${centerText(scenario.name, 58)}║`);
218
+ ui.print(`║${centerText(scenario.description, 58)}║`);
219
+ ui.print(`║${' '.repeat(58)}║`);
220
+ ui.print(`║${centerText(`${scenario.steps.length} steps`, 58)}║`);
221
+ ui.print(`╚${'═'.repeat(58)}╝`);
222
+ ui.newLine();
223
+ }
224
+ /**
225
+ * Display execution summary
226
+ */
227
+ function displaySummary(scenario, results, success, duration) {
228
+ ui.newLine();
229
+ ui.print('─'.repeat(60));
230
+ ui.print(ui.bold('Demo Summary'));
231
+ ui.newLine();
232
+ const passed = results.filter(r => r.success).length;
233
+ const failed = results.filter(r => !r.success).length;
234
+ ui.print(` Scenario: ${scenario.name}`);
235
+ ui.print(` Steps: ${ui.color(`${passed} passed`, 'green')}, ${failed > 0 ? ui.color(`${failed} failed`, 'red') : '0 failed'}`);
236
+ ui.print(` Duration: ${(duration / 1000).toFixed(1)}s`);
237
+ ui.newLine();
238
+ if (success) {
239
+ ui.success('Demo completed successfully!');
240
+ }
241
+ else {
242
+ ui.error('Demo completed with errors');
243
+ }
244
+ }
245
+ /**
246
+ * Display command output with formatting
247
+ */
248
+ function displayOutput(output) {
249
+ const lines = output.split('\n');
250
+ for (const line of lines) {
251
+ // Color terraform output
252
+ if (line.startsWith('+')) {
253
+ ui.print(` ${ui.color(line, 'green')}`);
254
+ }
255
+ else if (line.startsWith('-')) {
256
+ ui.print(` ${ui.color(line, 'red')}`);
257
+ }
258
+ else if (line.startsWith('~')) {
259
+ ui.print(` ${ui.color(line, 'yellow')}`);
260
+ }
261
+ else {
262
+ ui.print(` ${line}`);
263
+ }
264
+ }
265
+ }
266
+ /**
267
+ * Get delay based on speed setting
268
+ */
269
+ function getDelay(speed, stepDelay) {
270
+ const baseDelay = stepDelay || 500;
271
+ switch (speed) {
272
+ case 'slow':
273
+ return baseDelay * 2;
274
+ case 'fast':
275
+ return baseDelay / 2;
276
+ default:
277
+ return baseDelay;
278
+ }
279
+ }
280
+ /**
281
+ * Center text in a given width
282
+ */
283
+ function centerText(text, width) {
284
+ const leftPadding = Math.max(0, Math.floor((width - text.length) / 2));
285
+ const rightPadding = Math.max(0, width - leftPadding - text.length);
286
+ return ' '.repeat(leftPadding) + text + ' '.repeat(rightPadding);
287
+ }
288
+ /**
289
+ * Sleep for specified milliseconds
290
+ */
291
+ function sleep(ms) {
292
+ return new Promise(resolve => setTimeout(resolve, ms));
293
+ }
294
+ // Re-export types
295
+ export * from './types';
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Full Journey Demo Scenario
3
+ *
4
+ * End-to-end demo from discovery to deployment
5
+ */
6
+ export const fullJourneyScenario = {
7
+ id: 'full-journey',
8
+ name: 'Full Infrastructure Journey',
9
+ description: 'Complete workflow: Discovery → Generation → Preview → Deploy',
10
+ category: 'full-journey',
11
+ duration: 15,
12
+ prerequisites: [
13
+ 'AWS CLI configured with credentials',
14
+ 'Terraform installed (v1.0+)',
15
+ 'kubectl configured (for K8s steps)',
16
+ 'Nimbus CLI installed',
17
+ ],
18
+ tags: ['full-demo', 'aws', 'terraform', 'kubernetes'],
19
+ steps: [
20
+ {
21
+ id: 'init',
22
+ title: 'Initialize Nimbus Project',
23
+ description: 'Set up Nimbus in the current project',
24
+ command: 'nimbus init',
25
+ showOutput: true,
26
+ waitForInput: true,
27
+ mockResponse: `
28
+ Nimbus Initialization
29
+
30
+ Scanning project...
31
+
32
+ Detected:
33
+ ✓ Languages: TypeScript, Python
34
+ ✓ Frameworks: Next.js, FastAPI
35
+ ✓ Package Managers: npm, pip
36
+ ✓ IaC: Terraform
37
+ ✓ CI/CD: GitHub Actions
38
+ ✓ Cloud: AWS
39
+
40
+ Created .nimbus/project.yaml
41
+
42
+ Project initialized successfully!
43
+ `.trim(),
44
+ },
45
+ {
46
+ id: 'discover-aws',
47
+ title: 'Discover AWS Resources',
48
+ description: 'Scan your AWS account for existing infrastructure',
49
+ command: 'nimbus aws discover --regions us-east-1',
50
+ showOutput: true,
51
+ waitForInput: true,
52
+ mockResponse: `
53
+ AWS Discovery
54
+
55
+ Scanning AWS account...
56
+ Region: us-east-1
57
+
58
+ Discovery Summary:
59
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
60
+ EC2 Instances: 3
61
+ VPCs: 2
62
+ S3 Buckets: 5
63
+ RDS Instances: 1
64
+ Lambda Functions: 8
65
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
66
+
67
+ Resources discovered and saved to .nimbus/inventory.yaml
68
+ `.trim(),
69
+ },
70
+ {
71
+ id: 'generate-terraform',
72
+ title: 'Generate Terraform from Inventory',
73
+ description: 'Create Terraform code from discovered resources',
74
+ command: 'nimbus generate terraform --from-inventory',
75
+ showOutput: true,
76
+ waitForInput: true,
77
+ mockResponse: `
78
+ Generate Terraform
79
+
80
+ Generating from .nimbus/inventory.yaml...
81
+
82
+ Generated files:
83
+ ● terraform/main.tf
84
+ ● terraform/vpc.tf
85
+ ● terraform/ec2.tf
86
+ ● terraform/rds.tf
87
+ ● terraform/s3.tf
88
+ ● terraform/variables.tf
89
+ ● terraform/outputs.tf
90
+
91
+ Output directory: ./terraform
92
+
93
+ Generation complete!
94
+ Run 'nimbus preview terraform' to see the plan.
95
+ `.trim(),
96
+ },
97
+ {
98
+ id: 'preview',
99
+ title: 'Preview Infrastructure Changes',
100
+ description: 'Review what will be created/modified',
101
+ command: 'nimbus preview terraform ./terraform',
102
+ showOutput: true,
103
+ waitForInput: true,
104
+ mockResponse: `
105
+ Preview Terraform Changes
106
+
107
+ Directory: ./terraform
108
+
109
+ Creating execution plan...
110
+ Plan created
111
+
112
+ Plan Summary:
113
+
114
+ + 12 to add
115
+ ~ 0 to change
116
+ - 0 to destroy
117
+
118
+ Resources to be created:
119
+ + aws_vpc.main
120
+ + aws_subnet.private[0-2]
121
+ + aws_subnet.public[0-2]
122
+ + aws_security_group.main
123
+ + aws_instance.app
124
+ + aws_db_instance.main
125
+ + aws_s3_bucket.assets
126
+
127
+ Safety Check Summary:
128
+
129
+ 🟡 [MEDIUM] This operation will modify infrastructure
130
+
131
+ All safety checks passed
132
+ `.trim(),
133
+ },
134
+ {
135
+ id: 'apply',
136
+ title: 'Apply Infrastructure',
137
+ description: 'Deploy the infrastructure with safety approval',
138
+ command: 'nimbus apply terraform ./terraform',
139
+ showOutput: true,
140
+ waitForInput: true,
141
+ mockResponse: `
142
+ Terraform Apply
143
+
144
+ Creating execution plan...
145
+ Plan created
146
+
147
+ ╔══════════════════════════════════════════════════════════╗
148
+ ║ APPROVAL REQUIRED ║
149
+ ╠══════════════════════════════════════════════════════════╣
150
+ ║ Operation: terraform apply ║
151
+ ╚══════════════════════════════════════════════════════════╝
152
+
153
+ Identified Risks:
154
+ 🟡 [MEDIUM] This operation will modify infrastructure
155
+
156
+ Do you want to proceed? Yes
157
+
158
+ Applying changes...
159
+
160
+ Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
161
+ `.trim(),
162
+ },
163
+ {
164
+ id: 'generate-k8s',
165
+ title: 'Generate Kubernetes Manifests',
166
+ description: 'Create K8s deployment for the application',
167
+ command: 'nimbus questionnaire kubernetes',
168
+ showOutput: true,
169
+ waitForInput: true,
170
+ mockResponse: `
171
+ Kubernetes Configuration Wizard
172
+
173
+ Step 1/4: Application Info
174
+ Name: my-app
175
+ Image: my-registry/my-app:latest
176
+
177
+ Step 2/4: Deployment Settings
178
+ Replicas: 3
179
+ Port: 8080
180
+
181
+ Step 3/4: Resource Limits
182
+ CPU Request: 100m
183
+ Memory Request: 128Mi
184
+
185
+ Step 4/4: Service Configuration
186
+ Type: ClusterIP
187
+ Port: 80
188
+
189
+ Generated files:
190
+ ● k8s/deployment.yaml
191
+ ● k8s/service.yaml
192
+
193
+ Output directory: ./k8s
194
+ `.trim(),
195
+ },
196
+ {
197
+ id: 'deploy-k8s',
198
+ title: 'Deploy to Kubernetes',
199
+ description: 'Apply K8s manifests to the cluster',
200
+ command: 'nimbus apply k8s ./k8s',
201
+ showOutput: true,
202
+ waitForInput: false,
203
+ mockResponse: `
204
+ Kubernetes Apply
205
+
206
+ Manifests: ./k8s
207
+ Namespace: default
208
+
209
+ Found 2 manifest file(s)
210
+
211
+ Resources to apply:
212
+ - Deployment/my-app
213
+ - Service/my-app
214
+
215
+ Apply 2 resource(s)? Yes
216
+
217
+ Applying manifests...
218
+ Apply complete!
219
+
220
+ Created:
221
+ + Deployment/my-app
222
+ + Service/my-app
223
+ `.trim(),
224
+ },
225
+ ],
226
+ };