@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,367 @@
1
+ /**
2
+ * Git Tools Client
3
+ *
4
+ * REST client for communicating with the Git Tools Service
5
+ */
6
+ import { RestClient, ServiceURLs } from '.';
7
+ /**
8
+ * Client for Git Tools Service
9
+ */
10
+ export class GitClient {
11
+ client;
12
+ constructor(baseUrl) {
13
+ this.client = new RestClient(baseUrl || ServiceURLs.GIT_TOOLS);
14
+ }
15
+ /**
16
+ * Get git status
17
+ */
18
+ async status(directory) {
19
+ const params = new URLSearchParams();
20
+ if (directory) {
21
+ params.set('directory', directory);
22
+ }
23
+ const response = await this.client.get(`/api/git/status?${params.toString()}`);
24
+ if (response.success && response.data) {
25
+ return response.data;
26
+ }
27
+ return {
28
+ success: false,
29
+ status: {
30
+ branch: '',
31
+ ahead: 0,
32
+ behind: 0,
33
+ staged: [],
34
+ modified: [],
35
+ untracked: [],
36
+ deleted: [],
37
+ },
38
+ error: response.error?.message || 'Unknown error',
39
+ };
40
+ }
41
+ /**
42
+ * Stage files
43
+ */
44
+ async add(files, options) {
45
+ const response = await this.client.post('/api/git/add', { files, ...options });
46
+ if (response.success && response.data) {
47
+ return response.data;
48
+ }
49
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
50
+ }
51
+ /**
52
+ * Create a commit
53
+ */
54
+ async commit(message, options) {
55
+ const response = await this.client.post('/api/git/commit', { message, ...options });
56
+ if (response.success && response.data) {
57
+ return response.data;
58
+ }
59
+ return {
60
+ success: false,
61
+ commit: { hash: '', shortHash: '', message: '', author: '', date: '' },
62
+ error: response.error?.message || 'Unknown error',
63
+ };
64
+ }
65
+ /**
66
+ * Push to remote
67
+ */
68
+ async push(options) {
69
+ const response = await this.client.post('/api/git/push', options || {});
70
+ if (response.success && response.data) {
71
+ return response.data;
72
+ }
73
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
74
+ }
75
+ /**
76
+ * Pull from remote
77
+ */
78
+ async pull(options) {
79
+ const response = await this.client.post('/api/git/pull', options || {});
80
+ if (response.success && response.data) {
81
+ return response.data;
82
+ }
83
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
84
+ }
85
+ /**
86
+ * Fetch from remote
87
+ */
88
+ async fetch(options) {
89
+ const response = await this.client.post('/api/git/fetch', options || {});
90
+ if (response.success && response.data) {
91
+ return response.data;
92
+ }
93
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
94
+ }
95
+ /**
96
+ * Get commit log
97
+ */
98
+ async log(options) {
99
+ const params = new URLSearchParams();
100
+ if (options?.directory) {
101
+ params.set('directory', options.directory);
102
+ }
103
+ if (options?.limit) {
104
+ params.set('limit', String(options.limit));
105
+ }
106
+ if (options?.branch) {
107
+ params.set('branch', options.branch);
108
+ }
109
+ const response = await this.client.get(`/api/git/log?${params.toString()}`);
110
+ if (response.success && response.data) {
111
+ return response.data;
112
+ }
113
+ return { success: false, commits: [], error: response.error?.message || 'Unknown error' };
114
+ }
115
+ /**
116
+ * List branches
117
+ */
118
+ async branches(options) {
119
+ const params = new URLSearchParams();
120
+ if (options?.directory) {
121
+ params.set('directory', options.directory);
122
+ }
123
+ if (options?.all) {
124
+ params.set('all', 'true');
125
+ }
126
+ const response = await this.client.get(`/api/git/branches?${params.toString()}`);
127
+ if (response.success && response.data) {
128
+ return response.data;
129
+ }
130
+ return { success: false, branches: [], error: response.error?.message || 'Unknown error' };
131
+ }
132
+ /**
133
+ * Checkout branch or file
134
+ */
135
+ async checkout(target, options) {
136
+ const response = await this.client.post('/api/git/checkout', { target, ...options });
137
+ if (response.success && response.data) {
138
+ return response.data;
139
+ }
140
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
141
+ }
142
+ /**
143
+ * Get diff
144
+ */
145
+ async diff(options) {
146
+ const params = new URLSearchParams();
147
+ if (options?.directory) {
148
+ params.set('directory', options.directory);
149
+ }
150
+ if (options?.staged) {
151
+ params.set('staged', 'true');
152
+ }
153
+ if (options?.file) {
154
+ params.set('file', options.file);
155
+ }
156
+ const response = await this.client.get(`/api/git/diff?${params.toString()}`);
157
+ if (response.success && response.data) {
158
+ return response.data;
159
+ }
160
+ return { success: false, diff: '', error: response.error?.message || 'Unknown error' };
161
+ }
162
+ /**
163
+ * Merge a branch
164
+ */
165
+ async merge(branch, options) {
166
+ const response = await this.client.post('/api/git/merge', { branch, ...options });
167
+ if (response.success && response.data) {
168
+ return response.data;
169
+ }
170
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
171
+ }
172
+ /**
173
+ * Stash operations
174
+ */
175
+ async stash(command, options) {
176
+ const response = await this.client.post('/api/git/stash', { command, ...options });
177
+ if (response.success && response.data) {
178
+ return response.data;
179
+ }
180
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
181
+ }
182
+ /**
183
+ * Clone a repository
184
+ */
185
+ async clone(url, targetPath, options) {
186
+ const response = await this.client.post('/api/git/clone', { url, path: targetPath, ...options });
187
+ if (response.success && response.data) {
188
+ return response.data;
189
+ }
190
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
191
+ }
192
+ /**
193
+ * Tag operations
194
+ */
195
+ async tagCreate(name, options) {
196
+ const response = await this.client.post('/api/git/tag', { name, path: options?.directory, ...options });
197
+ if (response.success && response.data) {
198
+ return response.data;
199
+ }
200
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
201
+ }
202
+ async tagDelete(name, options) {
203
+ const params = new URLSearchParams();
204
+ params.set('name', name);
205
+ if (options?.directory) {
206
+ params.set('path', options.directory);
207
+ }
208
+ const response = await this.client.delete(`/api/git/tag?${params.toString()}`);
209
+ if (response.success && response.data) {
210
+ return response.data;
211
+ }
212
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
213
+ }
214
+ async tagList(options) {
215
+ const params = new URLSearchParams();
216
+ if (options?.directory) {
217
+ params.set('path', options.directory);
218
+ }
219
+ if (options?.pattern) {
220
+ params.set('pattern', options.pattern);
221
+ }
222
+ const response = await this.client.get(`/api/git/tags?${params.toString()}`);
223
+ if (response.success && response.data) {
224
+ const data = response.data;
225
+ return { success: true, tags: data?.data?.tags || data?.tags || [] };
226
+ }
227
+ return { success: false, tags: [], error: response.error?.message || 'Unknown error' };
228
+ }
229
+ async tagPush(options) {
230
+ const response = await this.client.post('/api/git/tag/push', { path: options?.directory, remote: options?.remote, tagName: options?.tagName });
231
+ if (response.success && response.data) {
232
+ return response.data;
233
+ }
234
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
235
+ }
236
+ async tagShow(name, options) {
237
+ const params = new URLSearchParams();
238
+ params.set('name', name);
239
+ if (options?.directory) {
240
+ params.set('path', options.directory);
241
+ }
242
+ const response = await this.client.get(`/api/git/tag/show?${params.toString()}`);
243
+ if (response.success && response.data) {
244
+ return response.data;
245
+ }
246
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
247
+ }
248
+ /**
249
+ * Get remote URL
250
+ */
251
+ async remote(remoteName, options) {
252
+ const params = new URLSearchParams();
253
+ if (options?.directory) {
254
+ params.set('path', options.directory);
255
+ }
256
+ if (remoteName) {
257
+ params.set('name', remoteName);
258
+ }
259
+ const response = await this.client.get(`/api/git/remote?${params.toString()}`);
260
+ if (response.success && response.data) {
261
+ const data = response.data;
262
+ return {
263
+ success: true,
264
+ remote: data?.data?.remote || data?.remote || remoteName || 'origin',
265
+ url: data?.data?.url !== undefined ? data.data.url : data?.url,
266
+ };
267
+ }
268
+ return {
269
+ success: false,
270
+ remote: remoteName || 'origin',
271
+ url: null,
272
+ error: response.error?.message || 'Unknown error',
273
+ };
274
+ }
275
+ /**
276
+ * Reset to a commit
277
+ */
278
+ async reset(target, options) {
279
+ const response = await this.client.post('/api/git/reset', { target, path: options?.directory, mode: options?.mode });
280
+ if (response.success && response.data) {
281
+ return response.data;
282
+ }
283
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
284
+ }
285
+ /**
286
+ * Revert a commit
287
+ */
288
+ async revert(commit, options) {
289
+ const response = await this.client.post('/api/git/revert', { commit, cwd: options?.directory, noCommit: options?.noCommit, noEdit: options?.noEdit });
290
+ if (response.success && response.data) {
291
+ return response.data;
292
+ }
293
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
294
+ }
295
+ /**
296
+ * Cherry-pick operations
297
+ */
298
+ async cherryPick(commit, options) {
299
+ const response = await this.client.post('/api/git/cherry-pick', { commit, path: options?.directory, noCommit: options?.noCommit });
300
+ if (response.success && response.data) {
301
+ return response.data;
302
+ }
303
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
304
+ }
305
+ async cherryPickAbort(options) {
306
+ const response = await this.client.post('/api/git/cherry-pick/abort', { path: options?.directory });
307
+ if (response.success && response.data) {
308
+ return response.data;
309
+ }
310
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
311
+ }
312
+ async cherryPickContinue(options) {
313
+ const response = await this.client.post('/api/git/cherry-pick/continue', { path: options?.directory });
314
+ if (response.success && response.data) {
315
+ return response.data;
316
+ }
317
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
318
+ }
319
+ /**
320
+ * Blame a file
321
+ */
322
+ async blame(file, options) {
323
+ const params = new URLSearchParams();
324
+ params.set('file', file);
325
+ if (options?.directory) {
326
+ params.set('path', options.directory);
327
+ }
328
+ if (options?.lineRange) {
329
+ const parts = options.lineRange.split(',');
330
+ if (parts[0]) {
331
+ params.set('startLine', parts[0].trim());
332
+ }
333
+ if (parts[1]) {
334
+ params.set('endLine', parts[1].trim());
335
+ }
336
+ }
337
+ const response = await this.client.get(`/api/git/blame?${params.toString()}`);
338
+ if (response.success && response.data) {
339
+ const data = response.data;
340
+ return { success: true, blame: data?.data?.blame || data?.blame || [] };
341
+ }
342
+ return { success: false, blame: [], error: response.error?.message || 'Unknown error' };
343
+ }
344
+ /**
345
+ * Initialize a repository
346
+ */
347
+ async init(options) {
348
+ const response = await this.client.post('/api/git/init', { path: options?.directory, bare: options?.bare });
349
+ if (response.success && response.data) {
350
+ return response.data;
351
+ }
352
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
353
+ }
354
+ /**
355
+ * Check if service is available
356
+ */
357
+ async isAvailable() {
358
+ try {
359
+ const response = await this.client.get('/health');
360
+ return response.success && response.data?.status === 'healthy';
361
+ }
362
+ catch {
363
+ return false;
364
+ }
365
+ }
366
+ }
367
+ export const gitClient = new GitClient();
@@ -0,0 +1,229 @@
1
+ /**
2
+ * GitHub Tools Client
3
+ *
4
+ * REST client for communicating with the GitHub Tools Service
5
+ */
6
+ import { RestClient, ServiceURLs } from '.';
7
+ import { authStore } from '../auth/store';
8
+ /**
9
+ * Client for GitHub Tools Service
10
+ */
11
+ export class GitHubClient {
12
+ client;
13
+ baseUrl;
14
+ constructor(baseUrl) {
15
+ this.baseUrl = baseUrl || ServiceURLs.GITHUB_TOOLS;
16
+ this.client = new RestClient(this.baseUrl);
17
+ }
18
+ /**
19
+ * Get authorization header from stored GitHub identity
20
+ */
21
+ getAuthHeader() {
22
+ const identity = authStore.getIdentity();
23
+ if (identity?.accessToken) {
24
+ return { Authorization: `Bearer ${identity.accessToken}` };
25
+ }
26
+ return {};
27
+ }
28
+ /**
29
+ * Create a REST client with auth headers
30
+ */
31
+ getAuthClient() {
32
+ const authHeaders = this.getAuthHeader();
33
+ return new RestClient(this.baseUrl, {
34
+ headers: authHeaders,
35
+ });
36
+ }
37
+ /**
38
+ * Get authenticated user info
39
+ */
40
+ async getUser() {
41
+ const client = this.getAuthClient();
42
+ const response = await client.get('/api/github/user');
43
+ if (response.success && response.data) {
44
+ return response.data;
45
+ }
46
+ return { success: false, error: response.error?.message || 'Unknown error' };
47
+ }
48
+ /**
49
+ * List pull requests
50
+ */
51
+ async listPRs(owner, repo, options) {
52
+ const client = this.getAuthClient();
53
+ const params = new URLSearchParams();
54
+ params.set('owner', owner);
55
+ params.set('repo', repo);
56
+ if (options?.state) {
57
+ params.set('state', options.state);
58
+ }
59
+ if (options?.perPage) {
60
+ params.set('per_page', String(options.perPage));
61
+ }
62
+ const response = await client.get(`/api/github/prs?${params.toString()}`);
63
+ if (response.success && response.data) {
64
+ return response.data;
65
+ }
66
+ return { success: false, error: response.error?.message || 'Unknown error' };
67
+ }
68
+ /**
69
+ * Get a single pull request
70
+ */
71
+ async getPR(owner, repo, prNumber) {
72
+ const client = this.getAuthClient();
73
+ const params = new URLSearchParams();
74
+ params.set('owner', owner);
75
+ params.set('repo', repo);
76
+ const response = await client.get(`/api/github/prs/${prNumber}?${params.toString()}`);
77
+ if (response.success && response.data) {
78
+ return response.data;
79
+ }
80
+ return { success: false, error: response.error?.message || 'Unknown error' };
81
+ }
82
+ /**
83
+ * Create a pull request
84
+ */
85
+ async createPR(owner, repo, params) {
86
+ const client = this.getAuthClient();
87
+ const response = await client.post('/api/github/prs', { owner, repo, ...params });
88
+ if (response.success && response.data) {
89
+ return response.data;
90
+ }
91
+ return { success: false, error: response.error?.message || 'Unknown error' };
92
+ }
93
+ /**
94
+ * Merge a pull request
95
+ */
96
+ async mergePR(owner, repo, prNumber, options) {
97
+ const client = this.getAuthClient();
98
+ const response = await client.post(`/api/github/prs/${prNumber}/merge`, { owner, repo, ...options });
99
+ if (response.success && response.data) {
100
+ return response.data;
101
+ }
102
+ return { success: false, error: response.error?.message || 'Unknown error' };
103
+ }
104
+ /**
105
+ * Create a review on a pull request
106
+ */
107
+ async createPRReview(owner, repo, prNumber, event, body) {
108
+ const client = this.getAuthClient();
109
+ const response = await client.post(`/api/github/prs/${prNumber}/reviews`, { owner, repo, event, body });
110
+ if (response.success && response.data) {
111
+ return response.data;
112
+ }
113
+ return { success: false, error: response.error?.message || 'Unknown error' };
114
+ }
115
+ /**
116
+ * List issues
117
+ */
118
+ async listIssues(owner, repo, options) {
119
+ const client = this.getAuthClient();
120
+ const params = new URLSearchParams();
121
+ params.set('owner', owner);
122
+ params.set('repo', repo);
123
+ if (options?.state) {
124
+ params.set('state', options.state);
125
+ }
126
+ if (options?.perPage) {
127
+ params.set('per_page', String(options.perPage));
128
+ }
129
+ const response = await client.get(`/api/github/issues?${params.toString()}`);
130
+ if (response.success && response.data) {
131
+ return response.data;
132
+ }
133
+ return { success: false, error: response.error?.message || 'Unknown error' };
134
+ }
135
+ /**
136
+ * Get a single issue
137
+ */
138
+ async getIssue(owner, repo, issueNumber) {
139
+ const client = this.getAuthClient();
140
+ const params = new URLSearchParams();
141
+ params.set('owner', owner);
142
+ params.set('repo', repo);
143
+ const response = await client.get(`/api/github/issues/${issueNumber}?${params.toString()}`);
144
+ if (response.success && response.data) {
145
+ return response.data;
146
+ }
147
+ return { success: false, error: response.error?.message || 'Unknown error' };
148
+ }
149
+ /**
150
+ * Create an issue
151
+ */
152
+ async createIssue(owner, repo, params) {
153
+ const client = this.getAuthClient();
154
+ const response = await client.post('/api/github/issues', { owner, repo, ...params });
155
+ if (response.success && response.data) {
156
+ return response.data;
157
+ }
158
+ return { success: false, error: response.error?.message || 'Unknown error' };
159
+ }
160
+ /**
161
+ * Close an issue
162
+ */
163
+ async closeIssue(owner, repo, issueNumber) {
164
+ const client = this.getAuthClient();
165
+ const params = new URLSearchParams();
166
+ params.set('owner', owner);
167
+ params.set('repo', repo);
168
+ const response = await client.put(`/api/github/issues/${issueNumber}/close?${params.toString()}`, {});
169
+ if (response.success && response.data) {
170
+ return response.data;
171
+ }
172
+ return { success: false, error: response.error?.message || 'Unknown error' };
173
+ }
174
+ /**
175
+ * Add a comment to an issue or PR
176
+ */
177
+ async addComment(owner, repo, issueNumber, body) {
178
+ const client = this.getAuthClient();
179
+ const response = await client.post(`/api/github/issues/${issueNumber}/comments`, { owner, repo, body });
180
+ if (response.success && response.data) {
181
+ return response.data;
182
+ }
183
+ return { success: false, error: response.error?.message || 'Unknown error' };
184
+ }
185
+ /**
186
+ * Get repository info
187
+ */
188
+ async getRepo(owner, repo) {
189
+ const client = this.getAuthClient();
190
+ const params = new URLSearchParams();
191
+ params.set('owner', owner);
192
+ params.set('repo', repo);
193
+ const response = await client.get(`/api/github/repos?${params.toString()}`);
194
+ if (response.success && response.data) {
195
+ return response.data;
196
+ }
197
+ return { success: false, error: response.error?.message || 'Unknown error' };
198
+ }
199
+ /**
200
+ * List branches
201
+ */
202
+ async listBranches(owner, repo, options) {
203
+ const client = this.getAuthClient();
204
+ const params = new URLSearchParams();
205
+ params.set('owner', owner);
206
+ params.set('repo', repo);
207
+ if (options?.perPage) {
208
+ params.set('per_page', String(options.perPage));
209
+ }
210
+ const response = await client.get(`/api/github/repos/branches?${params.toString()}`);
211
+ if (response.success && response.data) {
212
+ return response.data;
213
+ }
214
+ return { success: false, error: response.error?.message || 'Unknown error' };
215
+ }
216
+ /**
217
+ * Check if service is available
218
+ */
219
+ async isAvailable() {
220
+ try {
221
+ const response = await this.client.get('/health');
222
+ return response.success && response.data?.status === 'healthy';
223
+ }
224
+ catch {
225
+ return false;
226
+ }
227
+ }
228
+ }
229
+ export const githubClient = new GitHubClient();