@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,266 @@
1
+ /**
2
+ * GCP Compute Engine CLI Commands
3
+ *
4
+ * Operations for Compute Engine instances
5
+ */
6
+ import { execFile } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import { logger } from '../../utils';
9
+ import { ui } from '../../wizard/ui';
10
+ import { loadSafetyPolicy, evaluateSafety, } from '../../config/safety-policy';
11
+ import { promptForApproval, displaySafetySummary } from '../../wizard/approval';
12
+ const execFileAsync = promisify(execFile);
13
+ /**
14
+ * Run Compute Engine safety checks
15
+ */
16
+ async function runComputeSafetyChecks(action, instanceId, options) {
17
+ const safetyPolicy = loadSafetyPolicy();
18
+ const context = {
19
+ operation: action,
20
+ type: 'gcp',
21
+ environment: options.project || 'default',
22
+ resources: [instanceId],
23
+ metadata: {
24
+ resourceType: 'compute-instance',
25
+ resourceId: instanceId,
26
+ },
27
+ };
28
+ return evaluateSafety(context, safetyPolicy);
29
+ }
30
+ /**
31
+ * Main Compute Engine command router
32
+ */
33
+ export async function computeCommand(action, args, options) {
34
+ logger.info('Running GCP Compute command', { action, args, options });
35
+ switch (action) {
36
+ case 'list':
37
+ await listInstances(options);
38
+ break;
39
+ case 'describe':
40
+ if (!args[0]) {
41
+ ui.error('Instance name required');
42
+ return;
43
+ }
44
+ await describeInstance(args[0], options);
45
+ break;
46
+ case 'start':
47
+ if (!args[0]) {
48
+ ui.error('Instance name required');
49
+ return;
50
+ }
51
+ await startInstance(args[0], options);
52
+ break;
53
+ case 'stop':
54
+ if (!args[0]) {
55
+ ui.error('Instance name required');
56
+ return;
57
+ }
58
+ await stopInstance(args[0], options);
59
+ break;
60
+ case 'delete':
61
+ if (!args[0]) {
62
+ ui.error('Instance name required');
63
+ return;
64
+ }
65
+ await deleteInstance(args[0], options);
66
+ break;
67
+ default:
68
+ showComputeHelp();
69
+ break;
70
+ }
71
+ }
72
+ /**
73
+ * List Compute Engine instances
74
+ */
75
+ async function listInstances(options) {
76
+ ui.header('Compute Engine Instances');
77
+ ui.newLine();
78
+ const gcloudArgs = ['compute', 'instances', 'list', '--format=json'];
79
+ if (options.project) {
80
+ gcloudArgs.push(`--project=${options.project}`);
81
+ }
82
+ if (options.zone) {
83
+ gcloudArgs.push(`--zones=${options.zone}`);
84
+ }
85
+ try {
86
+ ui.startSpinner({ message: 'Fetching instances...' });
87
+ const { stdout } = await execFileAsync('gcloud', gcloudArgs);
88
+ ui.stopSpinnerSuccess('Instances fetched');
89
+ const instances = JSON.parse(stdout || '[]');
90
+ if (instances.length === 0) {
91
+ ui.info('No instances found');
92
+ return;
93
+ }
94
+ ui.print(`Found ${instances.length} instance(s)\n`);
95
+ // Display table
96
+ ui.print(ui.color(`${'Name'.padEnd(25) + 'Zone'.padEnd(25) + 'Machine Type'.padEnd(20) + 'Status'.padEnd(12)}External IP`, 'cyan'));
97
+ ui.print('─'.repeat(100));
98
+ for (const instance of instances) {
99
+ const name = instance.name?.substring(0, 24) || '';
100
+ const zone = instance.zone?.split('/').pop()?.substring(0, 24) || '';
101
+ const machineType = instance.machineType?.split('/').pop()?.substring(0, 19) || '';
102
+ const status = instance.status || '';
103
+ const externalIp = instance.networkInterfaces?.[0]?.accessConfigs?.[0]?.natIP || 'None';
104
+ const statusColor = status === 'RUNNING'
105
+ ? 'green'
106
+ : status === 'TERMINATED'
107
+ ? 'red'
108
+ : status === 'STOPPING'
109
+ ? 'yellow'
110
+ : 'white';
111
+ ui.print(`${name.padEnd(25)}${zone.padEnd(25)}${machineType.padEnd(20)}${ui.color(status.padEnd(12), statusColor)}${externalIp}`);
112
+ }
113
+ }
114
+ catch (error) {
115
+ ui.stopSpinnerFail('Failed to fetch instances');
116
+ const message = error instanceof Error ? error.message : 'Unknown error';
117
+ logger.error('Failed to list instances', { error: message });
118
+ ui.error(`Failed to list instances: ${message}`);
119
+ }
120
+ }
121
+ /**
122
+ * Describe a specific instance
123
+ */
124
+ async function describeInstance(instanceName, options) {
125
+ ui.header(`Instance: ${instanceName}`);
126
+ ui.newLine();
127
+ const gcloudArgs = ['compute', 'instances', 'describe', instanceName, '--format=json'];
128
+ if (options.project) {
129
+ gcloudArgs.push(`--project=${options.project}`);
130
+ }
131
+ if (options.zone) {
132
+ gcloudArgs.push(`--zone=${options.zone}`);
133
+ }
134
+ try {
135
+ ui.startSpinner({ message: 'Fetching instance details...' });
136
+ const { stdout } = await execFileAsync('gcloud', gcloudArgs);
137
+ ui.stopSpinnerSuccess('Details fetched');
138
+ const instance = JSON.parse(stdout);
139
+ ui.print(ui.bold('Basic Information:'));
140
+ ui.print(` Name: ${instance.name}`);
141
+ ui.print(` Zone: ${instance.zone?.split('/').pop()}`);
142
+ ui.print(` Machine Type: ${instance.machineType?.split('/').pop()}`);
143
+ ui.print(` Status: ${instance.status}`);
144
+ ui.print(` Created: ${instance.creationTimestamp}`);
145
+ ui.newLine();
146
+ ui.print(ui.bold('Network:'));
147
+ for (const nic of instance.networkInterfaces || []) {
148
+ ui.print(` Network: ${nic.network?.split('/').pop()}`);
149
+ ui.print(` Internal IP: ${nic.networkIP}`);
150
+ if (nic.accessConfigs?.[0]?.natIP) {
151
+ ui.print(` External IP: ${nic.accessConfigs[0].natIP}`);
152
+ }
153
+ }
154
+ ui.newLine();
155
+ ui.print(ui.bold('Disks:'));
156
+ for (const disk of instance.disks || []) {
157
+ ui.print(` Name: ${disk.source?.split('/').pop()}`);
158
+ ui.print(` Boot: ${disk.boot ? 'Yes' : 'No'}`);
159
+ ui.print(` Size: ${disk.diskSizeGb} GB`);
160
+ }
161
+ }
162
+ catch (error) {
163
+ ui.stopSpinnerFail('Failed to fetch details');
164
+ const message = error instanceof Error ? error.message : 'Unknown error';
165
+ logger.error('Failed to describe instance', { error: message });
166
+ ui.error(`Failed to describe instance: ${message}`);
167
+ }
168
+ }
169
+ /**
170
+ * Start an instance
171
+ */
172
+ async function startInstance(instanceName, options) {
173
+ const gcloudArgs = ['compute', 'instances', 'start', instanceName];
174
+ if (options.project) {
175
+ gcloudArgs.push(`--project=${options.project}`);
176
+ }
177
+ if (options.zone) {
178
+ gcloudArgs.push(`--zone=${options.zone}`);
179
+ }
180
+ try {
181
+ ui.startSpinner({ message: `Starting instance ${instanceName}...` });
182
+ await execFileAsync('gcloud', gcloudArgs);
183
+ ui.stopSpinnerSuccess(`Instance ${instanceName} started`);
184
+ }
185
+ catch (error) {
186
+ ui.stopSpinnerFail(`Failed to start instance`);
187
+ const message = error instanceof Error ? error.message : 'Unknown error';
188
+ logger.error('Failed to start instance', { error: message });
189
+ ui.error(`Failed to start instance: ${message}`);
190
+ }
191
+ }
192
+ /**
193
+ * Stop an instance
194
+ */
195
+ async function stopInstance(instanceName, options) {
196
+ const gcloudArgs = ['compute', 'instances', 'stop', instanceName];
197
+ if (options.project) {
198
+ gcloudArgs.push(`--project=${options.project}`);
199
+ }
200
+ if (options.zone) {
201
+ gcloudArgs.push(`--zone=${options.zone}`);
202
+ }
203
+ try {
204
+ ui.startSpinner({ message: `Stopping instance ${instanceName}...` });
205
+ await execFileAsync('gcloud', gcloudArgs);
206
+ ui.stopSpinnerSuccess(`Instance ${instanceName} stopped`);
207
+ }
208
+ catch (error) {
209
+ ui.stopSpinnerFail(`Failed to stop instance`);
210
+ const message = error instanceof Error ? error.message : 'Unknown error';
211
+ logger.error('Failed to stop instance', { error: message });
212
+ ui.error(`Failed to stop instance: ${message}`);
213
+ }
214
+ }
215
+ /**
216
+ * Delete an instance (requires safety approval)
217
+ */
218
+ async function deleteInstance(instanceName, options) {
219
+ // Run safety checks
220
+ const safetyResult = await runComputeSafetyChecks('delete', instanceName, options);
221
+ displaySafetySummary({
222
+ operation: `delete ${instanceName}`,
223
+ risks: safetyResult.risks,
224
+ passed: safetyResult.passed,
225
+ });
226
+ if (safetyResult.requiresApproval) {
227
+ const result = await promptForApproval({
228
+ title: 'Delete Compute Engine Instance',
229
+ operation: `gcloud compute instances delete ${instanceName}`,
230
+ risks: safetyResult.risks,
231
+ });
232
+ if (!result.approved) {
233
+ ui.warning('Operation cancelled');
234
+ return;
235
+ }
236
+ }
237
+ const gcloudArgs = ['compute', 'instances', 'delete', instanceName, '--quiet'];
238
+ if (options.project) {
239
+ gcloudArgs.push(`--project=${options.project}`);
240
+ }
241
+ if (options.zone) {
242
+ gcloudArgs.push(`--zone=${options.zone}`);
243
+ }
244
+ try {
245
+ ui.startSpinner({ message: `Deleting instance ${instanceName}...` });
246
+ await execFileAsync('gcloud', gcloudArgs);
247
+ ui.stopSpinnerSuccess(`Instance ${instanceName} deleted`);
248
+ }
249
+ catch (error) {
250
+ ui.stopSpinnerFail(`Failed to delete instance`);
251
+ const message = error instanceof Error ? error.message : 'Unknown error';
252
+ logger.error('Failed to delete instance', { error: message });
253
+ ui.error(`Failed to delete instance: ${message}`);
254
+ }
255
+ }
256
+ /**
257
+ * Show Compute help
258
+ */
259
+ function showComputeHelp() {
260
+ ui.print(ui.bold('Compute Engine Commands:'));
261
+ ui.print(' list List all instances');
262
+ ui.print(' describe <name> Show instance details');
263
+ ui.print(' start <name> Start an instance');
264
+ ui.print(' stop <name> Stop an instance');
265
+ ui.print(' delete <name> Delete an instance (requires approval)');
266
+ }
@@ -0,0 +1,221 @@
1
+ /**
2
+ * GCP Cloud Functions CLI Commands
3
+ *
4
+ * Operations for Cloud Functions
5
+ */
6
+ import { execFile } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import { logger } from '../../utils';
9
+ import { ui } from '../../wizard/ui';
10
+ const execFileAsync = promisify(execFile);
11
+ /**
12
+ * Main Cloud Functions command router
13
+ */
14
+ export async function functionsCommand(action, args, options) {
15
+ logger.info('Running GCP Functions command', { action, args, options });
16
+ switch (action) {
17
+ case 'list':
18
+ await listFunctions(options);
19
+ break;
20
+ case 'describe':
21
+ if (!args[0]) {
22
+ ui.error('Function name required');
23
+ return;
24
+ }
25
+ await describeFunction(args[0], options);
26
+ break;
27
+ case 'call':
28
+ if (!args[0]) {
29
+ ui.error('Function name required');
30
+ return;
31
+ }
32
+ await callFunction(args[0], args[1], options);
33
+ break;
34
+ case 'logs':
35
+ if (!args[0]) {
36
+ ui.error('Function name required');
37
+ return;
38
+ }
39
+ await getFunctionLogs(args[0], options);
40
+ break;
41
+ default:
42
+ showFunctionsHelp();
43
+ break;
44
+ }
45
+ }
46
+ /**
47
+ * List Cloud Functions
48
+ */
49
+ async function listFunctions(options) {
50
+ ui.header('Cloud Functions');
51
+ ui.newLine();
52
+ const gcloudArgs = ['functions', 'list', '--format=json'];
53
+ if (options.project) {
54
+ gcloudArgs.push(`--project=${options.project}`);
55
+ }
56
+ if (options.region) {
57
+ gcloudArgs.push(`--regions=${options.region}`);
58
+ }
59
+ try {
60
+ ui.startSpinner({ message: 'Fetching functions...' });
61
+ const { stdout } = await execFileAsync('gcloud', gcloudArgs);
62
+ ui.stopSpinnerSuccess('Functions fetched');
63
+ const functions = JSON.parse(stdout || '[]');
64
+ if (functions.length === 0) {
65
+ ui.info('No functions found');
66
+ return;
67
+ }
68
+ ui.print(`Found ${functions.length} function(s)\n`);
69
+ // Display table
70
+ ui.print(ui.color(`${'Name'.padEnd(30) + 'Region'.padEnd(15) + 'Runtime'.padEnd(15) + 'Trigger'.padEnd(15)}State`, 'cyan'));
71
+ ui.print('─'.repeat(90));
72
+ for (const fn of functions) {
73
+ const name = fn.name?.split('/').pop()?.substring(0, 29) || '';
74
+ const region = fn.name?.split('/')[3]?.substring(0, 14) || '';
75
+ const runtime = fn.runtime?.substring(0, 14) || '';
76
+ const trigger = fn.httpsTrigger ? 'HTTP' : fn.eventTrigger ? 'Event' : 'Unknown';
77
+ const state = fn.state || '';
78
+ const stateColor = state === 'ACTIVE'
79
+ ? 'green'
80
+ : state === 'DEPLOYING'
81
+ ? 'yellow'
82
+ : state === 'FAILED'
83
+ ? 'red'
84
+ : 'white';
85
+ ui.print(`${name.padEnd(30)}${region.padEnd(15)}${runtime.padEnd(15)}${trigger.padEnd(15)}${ui.color(state, stateColor)}`);
86
+ }
87
+ }
88
+ catch (error) {
89
+ ui.stopSpinnerFail('Failed to fetch functions');
90
+ const message = error instanceof Error ? error.message : 'Unknown error';
91
+ logger.error('Failed to list functions', { error: message });
92
+ ui.error(`Failed to list functions: ${message}`);
93
+ }
94
+ }
95
+ /**
96
+ * Describe a specific function
97
+ */
98
+ async function describeFunction(functionName, options) {
99
+ ui.header(`Function: ${functionName}`);
100
+ ui.newLine();
101
+ const gcloudArgs = ['functions', 'describe', functionName, '--format=json'];
102
+ if (options.project) {
103
+ gcloudArgs.push(`--project=${options.project}`);
104
+ }
105
+ if (options.region) {
106
+ gcloudArgs.push(`--region=${options.region}`);
107
+ }
108
+ try {
109
+ ui.startSpinner({ message: 'Fetching function details...' });
110
+ const { stdout } = await execFileAsync('gcloud', gcloudArgs);
111
+ ui.stopSpinnerSuccess('Details fetched');
112
+ const fn = JSON.parse(stdout);
113
+ ui.print(ui.bold('Basic Information:'));
114
+ ui.print(` Name: ${fn.name?.split('/').pop()}`);
115
+ ui.print(` Region: ${fn.name?.split('/')[3]}`);
116
+ ui.print(` State: ${fn.state}`);
117
+ ui.print(` Runtime: ${fn.runtime}`);
118
+ ui.print(` Entry Point: ${fn.entryPoint}`);
119
+ ui.newLine();
120
+ ui.print(ui.bold('Resources:'));
121
+ ui.print(` Memory: ${fn.availableMemoryMb} MB`);
122
+ ui.print(` Timeout: ${fn.timeout}`);
123
+ ui.print(` Max Instances: ${fn.maxInstances || 'default'}`);
124
+ ui.newLine();
125
+ ui.print(ui.bold('Trigger:'));
126
+ if (fn.httpsTrigger) {
127
+ ui.print(` Type: HTTP`);
128
+ ui.print(` URL: ${fn.httpsTrigger.url}`);
129
+ }
130
+ else if (fn.eventTrigger) {
131
+ ui.print(` Type: Event`);
132
+ ui.print(` Event Type: ${fn.eventTrigger.eventType}`);
133
+ ui.print(` Resource: ${fn.eventTrigger.resource}`);
134
+ }
135
+ ui.newLine();
136
+ ui.print(ui.bold('Timestamps:'));
137
+ ui.print(` Created: ${fn.buildId ? `Build ID: ${fn.buildId}` : 'N/A'}`);
138
+ ui.print(` Updated: ${fn.updateTime}`);
139
+ }
140
+ catch (error) {
141
+ ui.stopSpinnerFail('Failed to fetch details');
142
+ const message = error instanceof Error ? error.message : 'Unknown error';
143
+ logger.error('Failed to describe function', { error: message });
144
+ ui.error(`Failed to describe function: ${message}`);
145
+ }
146
+ }
147
+ /**
148
+ * Call a function
149
+ */
150
+ async function callFunction(functionName, data, options) {
151
+ const gcloudArgs = ['functions', 'call', functionName];
152
+ if (data) {
153
+ gcloudArgs.push('--data', data);
154
+ }
155
+ if (options.project) {
156
+ gcloudArgs.push(`--project=${options.project}`);
157
+ }
158
+ if (options.region) {
159
+ gcloudArgs.push(`--region=${options.region}`);
160
+ }
161
+ try {
162
+ ui.startSpinner({ message: `Calling function ${functionName}...` });
163
+ const { stdout, stderr } = await execFileAsync('gcloud', gcloudArgs);
164
+ ui.stopSpinnerSuccess('Function invoked');
165
+ ui.newLine();
166
+ if (stdout) {
167
+ ui.print(ui.bold('Response:'));
168
+ ui.print(stdout);
169
+ }
170
+ if (stderr) {
171
+ ui.print(ui.bold('Execution ID:'));
172
+ ui.print(stderr);
173
+ }
174
+ }
175
+ catch (error) {
176
+ ui.stopSpinnerFail('Failed to call function');
177
+ const message = error instanceof Error ? error.message : 'Unknown error';
178
+ logger.error('Failed to call function', { error: message });
179
+ ui.error(`Failed to call function: ${message}`);
180
+ }
181
+ }
182
+ /**
183
+ * Get function logs
184
+ */
185
+ async function getFunctionLogs(functionName, options) {
186
+ ui.header(`Logs for ${functionName}`);
187
+ ui.newLine();
188
+ const gcloudArgs = ['functions', 'logs', 'read', functionName, '--limit=50'];
189
+ if (options.project) {
190
+ gcloudArgs.push(`--project=${options.project}`);
191
+ }
192
+ if (options.region) {
193
+ gcloudArgs.push(`--region=${options.region}`);
194
+ }
195
+ try {
196
+ ui.startSpinner({ message: 'Fetching logs...' });
197
+ const { stdout } = await execFileAsync('gcloud', gcloudArgs);
198
+ ui.stopSpinnerSuccess('Logs fetched');
199
+ if (!stdout.trim()) {
200
+ ui.info('No logs found');
201
+ return;
202
+ }
203
+ ui.print(stdout);
204
+ }
205
+ catch (error) {
206
+ ui.stopSpinnerFail('Failed to fetch logs');
207
+ const message = error instanceof Error ? error.message : 'Unknown error';
208
+ logger.error('Failed to get logs', { error: message });
209
+ ui.error(`Failed to get logs: ${message}`);
210
+ }
211
+ }
212
+ /**
213
+ * Show Functions help
214
+ */
215
+ function showFunctionsHelp() {
216
+ ui.print(ui.bold('Cloud Functions Commands:'));
217
+ ui.print(' list List all functions');
218
+ ui.print(' describe <name> Show function details');
219
+ ui.print(' call <name> [data] Invoke a function');
220
+ ui.print(' logs <name> View function logs');
221
+ }