@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,145 @@
1
+ /**
2
+ * Version Command
3
+ *
4
+ * Display CLI and component version information
5
+ *
6
+ * Usage: nimbus version [options]
7
+ */
8
+ import { logger } from '../utils';
9
+ import { ui } from '../wizard';
10
+ /**
11
+ * Get the CLI version from package.json or environment
12
+ */
13
+ function getCliVersion() {
14
+ // Try environment variable first (set during build)
15
+ if (process.env.NIMBUS_VERSION) {
16
+ return process.env.NIMBUS_VERSION;
17
+ }
18
+ // Try npm_package_version (available when run via npm/bun)
19
+ if (process.env.npm_package_version) {
20
+ return process.env.npm_package_version;
21
+ }
22
+ // Fallback to reading package.json
23
+ try {
24
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
25
+ const pkg = require('../../package.json');
26
+ return pkg.version || '0.1.0';
27
+ }
28
+ catch {
29
+ return '0.1.0';
30
+ }
31
+ }
32
+ /**
33
+ * Get Bun version if running under Bun
34
+ */
35
+ function getBunVersion() {
36
+ // Check for Bun global
37
+ const globalAny = globalThis;
38
+ if (typeof globalAny.Bun !== 'undefined') {
39
+ return globalAny.Bun.version;
40
+ }
41
+ return undefined;
42
+ }
43
+ /**
44
+ * Fetch DevOps CLI tool versions (for verbose mode)
45
+ */
46
+ async function fetchDevOpsVersions() {
47
+ const { execFileSync } = await import('child_process');
48
+ const tools = [
49
+ { name: 'terraform', args: ['version', '-json'] },
50
+ { name: 'kubectl', args: ['version', '--client', '--output=json'] },
51
+ { name: 'helm', args: ['version', '--short'] },
52
+ { name: 'aws', args: ['--version'] },
53
+ { name: 'gcloud', args: ['version'] },
54
+ { name: 'az', args: ['version'] },
55
+ ];
56
+ const versions = {};
57
+ for (const tool of tools) {
58
+ try {
59
+ const output = execFileSync(tool.name, tool.args, {
60
+ encoding: 'utf-8',
61
+ timeout: 5000,
62
+ stdio: ['pipe', 'pipe', 'pipe'],
63
+ });
64
+ // Try to parse version string from JSON output
65
+ let version = 'installed';
66
+ try {
67
+ const parsed = JSON.parse(output);
68
+ version =
69
+ parsed.terraform_version ||
70
+ parsed.clientVersion?.gitVersion ||
71
+ 'installed';
72
+ }
73
+ catch {
74
+ const match = output.match(/[\d]+\.[\d]+\.[\d]+/);
75
+ if (match)
76
+ version = `v${match[0]}`;
77
+ }
78
+ versions[tool.name] = version;
79
+ }
80
+ catch {
81
+ versions[tool.name] = 'not installed';
82
+ }
83
+ }
84
+ return versions;
85
+ }
86
+ /**
87
+ * Run the version command
88
+ */
89
+ export async function versionCommand(options = {}) {
90
+ logger.debug('Running version command', { options });
91
+ const cliVersion = getCliVersion();
92
+ const versionInfo = {
93
+ cli: cliVersion,
94
+ node: process.version,
95
+ bun: getBunVersion(),
96
+ platform: process.platform,
97
+ arch: process.arch,
98
+ };
99
+ // Fetch DevOps tool versions in verbose mode
100
+ if (options.verbose) {
101
+ ui.startSpinner({ message: 'Checking DevOps tool versions...' });
102
+ versionInfo.components = await fetchDevOpsVersions();
103
+ ui.stopSpinnerSuccess('');
104
+ }
105
+ // JSON output — expose `version` field (alias for `cli`) for L3 compatibility
106
+ if (options.json) {
107
+ const jsonOutput = {
108
+ version: cliVersion,
109
+ node: versionInfo.node,
110
+ platform: versionInfo.platform,
111
+ arch: versionInfo.arch,
112
+ cli: versionInfo.cli,
113
+ };
114
+ if (versionInfo.bun)
115
+ jsonOutput.bun = versionInfo.bun;
116
+ if (versionInfo.components)
117
+ jsonOutput.components = versionInfo.components;
118
+ console.log(JSON.stringify(jsonOutput, null, 2));
119
+ process.exit(0);
120
+ }
121
+ // Human-readable output
122
+ ui.print(`nimbus version ${versionInfo.cli}`);
123
+ if (options.verbose) {
124
+ ui.newLine();
125
+ ui.print(`Runtime:`);
126
+ if (versionInfo.bun) {
127
+ ui.print(` Bun: ${versionInfo.bun}`);
128
+ }
129
+ ui.print(` Node: ${versionInfo.node}`);
130
+ ui.print(` Platform: ${versionInfo.platform}`);
131
+ ui.print(` Arch: ${versionInfo.arch}`);
132
+ if (versionInfo.components) {
133
+ ui.newLine();
134
+ ui.print(`DevOps Tools:`);
135
+ for (const [name, version] of Object.entries(versionInfo.components)) {
136
+ const isInstalled = version !== 'not installed';
137
+ const icon = isInstalled ? '[+]' : '[-]';
138
+ const color = isInstalled ? 'green' : 'red';
139
+ ui.print(` ${ui.color(icon, color)} ${name.padEnd(12)} ${version}`);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ // Export as default command
145
+ export default versionCommand;
@@ -0,0 +1,127 @@
1
+ /**
2
+ * nimbus watch — Watch files and trigger agent runs on change (M3)
3
+ *
4
+ * Usage:
5
+ * nimbus watch "*.tf" --run "validate the terraform changes"
6
+ * nimbus watch "src/**" --run "run tests" --debounce 2000
7
+ */
8
+ import { basename } from 'node:path';
9
+ import { watch as fsWatch } from 'node:fs';
10
+ /**
11
+ * Simple glob pattern matching without external dependencies.
12
+ * Supports: *.ext, *.*, prefix/**, prefix/name.ext
13
+ */
14
+ function matchGlob(filename, pattern) {
15
+ // Normalize separators
16
+ const f = filename.replace(/\\/g, '/');
17
+ const p = pattern.replace(/\\/g, '/');
18
+ // Convert glob pattern to regex
19
+ const regexStr = p
20
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&') // escape regex special chars (but not * and ?)
21
+ .replace(/\*\*/g, '__GLOBSTAR__')
22
+ .replace(/\*/g, '[^/]*')
23
+ .replace(/\?/g, '[^/]')
24
+ .replace(/__GLOBSTAR__/g, '.*');
25
+ const re = new RegExp(`^${regexStr}$`);
26
+ // Also match against basename for simple patterns like "*.tf"
27
+ const base = basename(f);
28
+ return re.test(f) || (!/\//.test(p) && re.test(base));
29
+ }
30
+ /**
31
+ * Start watching files matching the glob pattern.
32
+ * On change, triggers an agent run with the configured prompt.
33
+ */
34
+ export async function watchCommand(options) {
35
+ const { glob, run, debounce = 500, autoApprove = false, maxRuns = 0 } = options;
36
+ if (!glob) {
37
+ console.error('Usage: nimbus watch <glob> --run "prompt"');
38
+ process.exit(1);
39
+ }
40
+ if (!run) {
41
+ console.error('Error: --run "prompt" is required for watch command');
42
+ process.exit(1);
43
+ }
44
+ const cwd = process.cwd();
45
+ console.log(`Watching ${glob} in ${cwd}...`);
46
+ console.log(`On change, will run: "${run}"`);
47
+ console.log('Press Ctrl+C to stop.\n');
48
+ let debounceTimer = null;
49
+ let runCount = 0;
50
+ let isRunning = false;
51
+ async function triggerRun(changedFile) {
52
+ if (isRunning) {
53
+ return; // Skip concurrent runs
54
+ }
55
+ if (maxRuns > 0 && runCount >= maxRuns) {
56
+ console.log(`\nMaximum runs (${maxRuns}) reached. Stopping watcher.`);
57
+ process.exit(0);
58
+ }
59
+ runCount++;
60
+ isRunning = true;
61
+ const prompt = `${run}\n\nChanged file: ${changedFile}`;
62
+ try {
63
+ console.log(`\n[${new Date().toLocaleTimeString()}] Change detected: ${changedFile}`);
64
+ console.log(`Running: nimbus run "${run}"\n`);
65
+ const { initApp } = await import('../app');
66
+ const { executeRun } = await import('../cli/run');
67
+ const { router } = await initApp();
68
+ await executeRun(router, {
69
+ prompt,
70
+ format: 'text',
71
+ autoApprove,
72
+ stdin: false,
73
+ stdinJson: false,
74
+ mode: 'build',
75
+ maxTurns: 10,
76
+ rawToolOutput: false,
77
+ schema: false,
78
+ dryRun: false,
79
+ exitOnError: false,
80
+ });
81
+ }
82
+ catch (error) {
83
+ console.error(`Run failed: ${error instanceof Error ? error.message : String(error)}`);
84
+ }
85
+ finally {
86
+ isRunning = false;
87
+ }
88
+ }
89
+ function onChange(filename) {
90
+ if (!filename)
91
+ return;
92
+ // Check if the file matches the glob pattern
93
+ if (!matchGlob(filename, glob))
94
+ return;
95
+ // Debounce rapid successive changes
96
+ if (debounceTimer)
97
+ clearTimeout(debounceTimer);
98
+ debounceTimer = setTimeout(() => {
99
+ debounceTimer = null;
100
+ triggerRun(filename).catch(err => {
101
+ console.error('Watch trigger error:', err);
102
+ });
103
+ }, debounce);
104
+ }
105
+ let watcher;
106
+ try {
107
+ watcher = fsWatch(cwd, { recursive: true }, (_eventType, filename) => {
108
+ onChange(filename);
109
+ });
110
+ }
111
+ catch (error) {
112
+ console.error(`Failed to start watcher: ${error instanceof Error ? error.message : String(error)}`);
113
+ process.exit(1);
114
+ }
115
+ // Handle shutdown gracefully
116
+ process.on('SIGINT', () => {
117
+ console.log('\nWatcher stopped.');
118
+ watcher.close();
119
+ process.exit(0);
120
+ });
121
+ process.on('SIGTERM', () => {
122
+ watcher.close();
123
+ process.exit(0);
124
+ });
125
+ // Keep process alive
126
+ await new Promise(() => { });
127
+ }
@@ -0,0 +1,2 @@
1
+ export { isBun, isNode } from './runtime';
2
+ export { Database } from './sqlite';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Runtime Compatibility Layer
3
+ *
4
+ * Detects whether we're running under Bun or Node.js and provides
5
+ * compatibility shims for Bun-specific APIs when running under Node.
6
+ */
7
+ /** Whether the current runtime is Bun. */
8
+ export const isBun = typeof globalThis.Bun !== 'undefined';
9
+ /** Whether the current runtime is Node.js (without Bun). */
10
+ export const isNode = !isBun && typeof process !== 'undefined' && !!process.versions?.node;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * SQLite Compatibility Layer
3
+ *
4
+ * Uses bun:sqlite when running under Bun, falls back to better-sqlite3
5
+ * under Node.js. Both libraries have nearly identical APIs.
6
+ *
7
+ * Exports:
8
+ * - `Database` (value) -- the constructor, usable as `new Database(path)`
9
+ * - `Database` (type) -- the instance interface, usable as `db: Database`
10
+ *
11
+ * This dual export mirrors how a native `class` declaration works in
12
+ * TypeScript: the same identifier serves as both a value and a type.
13
+ */
14
+ import { isBun } from './runtime';
15
+ // ---------------------------------------------------------------------------
16
+ // Runtime selection
17
+ // ---------------------------------------------------------------------------
18
+ // Re-export the Database class from the appropriate backend.
19
+ // Both bun:sqlite and better-sqlite3 expose a compatible API:
20
+ // new Database(path), db.exec(sql), db.prepare(sql).run/get/all, db.close()
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ let _Impl;
23
+ if (isBun) {
24
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
25
+ _Impl = require('bun:sqlite').Database;
26
+ }
27
+ else {
28
+ try {
29
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
30
+ const BetterSqlite3 = require('better-sqlite3');
31
+ // Polyfill bun:sqlite-compatible methods on better-sqlite3 instances
32
+ const OrigProto = BetterSqlite3.prototype;
33
+ if (!OrigProto.run) {
34
+ OrigProto.run = function (sql, params) {
35
+ const stmt = this.prepare(sql);
36
+ return params ? stmt.run(...params) : stmt.run();
37
+ };
38
+ }
39
+ if (!OrigProto.query) {
40
+ OrigProto.query = function (sql) {
41
+ return this.prepare(sql);
42
+ };
43
+ }
44
+ _Impl = BetterSqlite3;
45
+ }
46
+ catch {
47
+ // G1: Path 3 — sql.js fallback (pure WASM, no native build required)
48
+ try {
49
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
50
+ const initSqlJs = require('sql.js');
51
+ process.stderr.write('[nimbus] WARNING: Running in in-memory SQLite mode (no persistence).\n' +
52
+ '[nimbus] Install better-sqlite3 for full functionality: npm install better-sqlite3\n');
53
+ let sqlJsDb = null;
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
+ const getSqlJsDb = () => {
56
+ if (!sqlJsDb)
57
+ throw new Error('sql.js database not yet initialised — call new Database() first');
58
+ return sqlJsDb;
59
+ };
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ class SqlJsDatabase {
62
+ constructor(_path) {
63
+ // Synchronously initialise — sql.js init is async but we use a trick:
64
+ // initSqlJs() returns a promise; we store a sentinel and resolve lazily.
65
+ // For simplicity, initialise synchronously with the default WASM bundle.
66
+ try {
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ const SQL = initSqlJs({ locateFile: () => '' });
69
+ if (SQL && SQL.then) {
70
+ // async — best-effort; DB will be ready after first await
71
+ SQL.then((s) => { sqlJsDb = new s.Database(); });
72
+ }
73
+ else {
74
+ sqlJsDb = new SQL.Database();
75
+ }
76
+ }
77
+ catch {
78
+ // fallback: leave sqlJsDb null, operations will throw with clear message
79
+ }
80
+ }
81
+ exec(sql) { getSqlJsDb().run(sql); }
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ prepare(sql) {
84
+ const db = getSqlJsDb();
85
+ const stmt = db.prepare(sql);
86
+ return {
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ run: (...params) => { stmt.run(params); return {}; },
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ get: (...params) => { stmt.bind(params); return stmt.step() ? stmt.getAsObject() : undefined; },
91
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ all: (...params) => { const rows = []; stmt.bind(params); while (stmt.step())
93
+ rows.push(stmt.getAsObject()); return rows; },
94
+ finalize: () => stmt.free(),
95
+ };
96
+ }
97
+ close() { getSqlJsDb().close(); sqlJsDb = null; }
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ transaction(fn) {
100
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ return (...args) => {
102
+ getSqlJsDb().run('BEGIN');
103
+ try {
104
+ const r = fn(...args);
105
+ getSqlJsDb().run('COMMIT');
106
+ return r;
107
+ }
108
+ catch (e) {
109
+ try {
110
+ getSqlJsDb().run('ROLLBACK');
111
+ }
112
+ catch { /* ignore */ }
113
+ throw e;
114
+ }
115
+ };
116
+ }
117
+ run(sql, params) {
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ return params ? getSqlJsDb().run(sql, params) : getSqlJsDb().run(sql);
120
+ }
121
+ query(sql) { return this.prepare(sql); }
122
+ }
123
+ _Impl = SqlJsDatabase;
124
+ }
125
+ catch {
126
+ throw new Error('Nimbus requires either the Bun runtime (bun:sqlite) or the better-sqlite3 package.\n' +
127
+ 'Install better-sqlite3: npm install better-sqlite3\n' +
128
+ 'Or install Bun: curl -fsSL https://bun.sh/install | bash');
129
+ }
130
+ }
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // Dual export: value + type under the same name
134
+ // ---------------------------------------------------------------------------
135
+ /**
136
+ * The Database constructor at runtime.
137
+ *
138
+ * TypeScript resolves `Database` to either the *value* (constructor) or
139
+ * the *type* (instance interface) depending on context:
140
+ * - `new Database(path)` -- uses the value
141
+ * - `db: Database` -- uses the type (the interface below)
142
+ */
143
+ const Database = _Impl;
144
+ export { Database };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Configuration Module
3
+ *
4
+ * Exports configuration management utilities
5
+ */
6
+ export { ConfigManager, configManager, CONFIG_KEYS } from './manager';