@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,557 @@
1
+ /**
2
+ * Git Operations — Embedded tool (stripped HTTP wrappers)
3
+ *
4
+ * Copied from services/git-tools-service/src/git/operations.ts
5
+ * Provides direct git operations for the embedded CLI binary.
6
+ */
7
+ import simpleGit from 'simple-git';
8
+ import { logger } from '../utils';
9
+ export class GitOperations {
10
+ git;
11
+ repoPath;
12
+ constructor(repoPath = process.cwd()) {
13
+ this.repoPath = repoPath;
14
+ const options = {
15
+ baseDir: repoPath,
16
+ binary: 'git',
17
+ maxConcurrentProcesses: 6,
18
+ trimmed: true,
19
+ };
20
+ this.git = simpleGit(options);
21
+ }
22
+ /**
23
+ * Clone a repository
24
+ */
25
+ async clone(options) {
26
+ logger.info(`Cloning repository from ${options.url} to ${options.path}`);
27
+ const cloneOptions = [];
28
+ if (options.branch) {
29
+ cloneOptions.push('--branch', options.branch);
30
+ }
31
+ if (options.depth) {
32
+ cloneOptions.push('--depth', options.depth.toString());
33
+ }
34
+ await simpleGit().clone(options.url, options.path, cloneOptions);
35
+ return { success: true, path: options.path };
36
+ }
37
+ /**
38
+ * Get repository status
39
+ */
40
+ async status() {
41
+ logger.info(`Getting git status for ${this.repoPath}`);
42
+ return await this.git.status();
43
+ }
44
+ /**
45
+ * Add files to staging
46
+ */
47
+ async add(files = '.') {
48
+ const fileList = Array.isArray(files) ? files : [files];
49
+ logger.info(`Staging files: ${fileList.join(', ')}`);
50
+ await this.git.add(fileList);
51
+ return { success: true, files: fileList };
52
+ }
53
+ /**
54
+ * Commit staged changes
55
+ */
56
+ async commit(options) {
57
+ logger.info(`Committing with message: ${options.message}`);
58
+ const commitOptions = [];
59
+ if (options.amend) {
60
+ commitOptions.push('--amend');
61
+ }
62
+ if (options.allowEmpty) {
63
+ commitOptions.push('--allow-empty');
64
+ }
65
+ const result = await this.git.commit(options.message, undefined, { '--': commitOptions });
66
+ return {
67
+ success: true,
68
+ hash: result.commit,
69
+ summary: result.summary
70
+ ? `${result.summary.changes} changes, ${result.summary.insertions} insertions, ${result.summary.deletions} deletions`
71
+ : 'Committed',
72
+ };
73
+ }
74
+ /**
75
+ * Push to remote
76
+ */
77
+ async push(options = {}) {
78
+ const remote = options.remote || 'origin';
79
+ logger.info(`Pushing to ${remote}${options.branch ? `/${options.branch}` : ''}`);
80
+ const pushOptions = [];
81
+ if (options.force) {
82
+ pushOptions.push('--force');
83
+ }
84
+ if (options.setUpstream) {
85
+ pushOptions.push('--set-upstream');
86
+ }
87
+ await this.git.push(remote, options.branch, pushOptions);
88
+ return { success: true, remote, branch: options.branch || 'current' };
89
+ }
90
+ /**
91
+ * Pull from remote
92
+ */
93
+ async pull(options = {}) {
94
+ const remote = options.remote || 'origin';
95
+ logger.info(`Pulling from ${remote}${options.branch ? `/${options.branch}` : ''}`);
96
+ const pullOptions = {};
97
+ if (options.rebase) {
98
+ pullOptions['--rebase'] = null;
99
+ }
100
+ const result = await this.git.pull(remote, options.branch, pullOptions);
101
+ return {
102
+ success: true,
103
+ summary: result.summary
104
+ ? `${result.summary.changes} changes, ${result.summary.insertions} insertions, ${result.summary.deletions} deletions`
105
+ : 'Already up to date',
106
+ };
107
+ }
108
+ /**
109
+ * Create a new branch
110
+ */
111
+ async createBranch(options) {
112
+ logger.info(`Creating branch: ${options.name}`);
113
+ if (options.checkout) {
114
+ if (options.startPoint) {
115
+ await this.git.checkoutBranch(options.name, options.startPoint);
116
+ }
117
+ else {
118
+ await this.git.checkoutLocalBranch(options.name);
119
+ }
120
+ }
121
+ else {
122
+ await this.git.branch([options.name, options.startPoint || 'HEAD']);
123
+ }
124
+ return { success: true, branch: options.name };
125
+ }
126
+ /**
127
+ * List branches
128
+ */
129
+ async listBranches(showRemote = false) {
130
+ logger.info('Listing branches');
131
+ const result = await this.git.branch(showRemote ? ['-a'] : []);
132
+ return {
133
+ current: result.current,
134
+ branches: result.all,
135
+ };
136
+ }
137
+ /**
138
+ * Checkout a branch or commit
139
+ */
140
+ async checkout(target, create = false) {
141
+ logger.info(`Checking out: ${target}`);
142
+ if (create) {
143
+ await this.git.checkoutLocalBranch(target);
144
+ }
145
+ else {
146
+ await this.git.checkout(target);
147
+ }
148
+ return { success: true, target };
149
+ }
150
+ /**
151
+ * Get diff
152
+ */
153
+ async diff(options = {}) {
154
+ logger.info('Getting diff');
155
+ const diffArgs = [];
156
+ if (options.cached) {
157
+ diffArgs.push('--cached');
158
+ }
159
+ if (options.nameOnly) {
160
+ diffArgs.push('--name-only');
161
+ }
162
+ if (options.from) {
163
+ diffArgs.push(options.from);
164
+ }
165
+ if (options.to) {
166
+ diffArgs.push(options.to);
167
+ }
168
+ const diff = await this.git.diff(diffArgs);
169
+ const files = options.nameOnly ? diff.split('\n').filter(f => f) : [];
170
+ return { diff, files };
171
+ }
172
+ /**
173
+ * Get commit log
174
+ */
175
+ async log(options = {}) {
176
+ logger.info('Getting commit log');
177
+ const logOptions = {};
178
+ if (options.maxCount) {
179
+ logOptions.maxCount = options.maxCount;
180
+ }
181
+ if (options.from) {
182
+ logOptions.from = options.from;
183
+ }
184
+ if (options.to) {
185
+ logOptions.to = options.to;
186
+ }
187
+ if (options.file) {
188
+ logOptions.file = options.file;
189
+ }
190
+ return await this.git.log(logOptions);
191
+ }
192
+ /**
193
+ * Merge a branch
194
+ */
195
+ async merge(options) {
196
+ logger.info(`Merging branch: ${options.branch}`);
197
+ const mergeArgs = [options.branch];
198
+ if (options.noFf) {
199
+ mergeArgs.unshift('--no-ff');
200
+ }
201
+ if (options.squash) {
202
+ mergeArgs.unshift('--squash');
203
+ }
204
+ if (options.message) {
205
+ mergeArgs.unshift('-m', options.message);
206
+ }
207
+ const result = await this.git.merge(mergeArgs);
208
+ return {
209
+ success: true,
210
+ result: result.result || 'Merged successfully',
211
+ };
212
+ }
213
+ /**
214
+ * Stash operations
215
+ */
216
+ async stash(options) {
217
+ logger.info(`Stash operation: ${options.command}`);
218
+ let result;
219
+ switch (options.command) {
220
+ case 'push': {
221
+ const pushArgs = options.message ? ['-m', options.message] : [];
222
+ result = await this.git.stash(['push', ...pushArgs]);
223
+ break;
224
+ }
225
+ case 'pop':
226
+ result = await this.git.stash([
227
+ 'pop',
228
+ ...(options.index !== undefined ? [options.index.toString()] : []),
229
+ ]);
230
+ break;
231
+ case 'apply':
232
+ result = await this.git.stash([
233
+ 'apply',
234
+ ...(options.index !== undefined ? [options.index.toString()] : []),
235
+ ]);
236
+ break;
237
+ case 'drop':
238
+ result = await this.git.stash([
239
+ 'drop',
240
+ ...(options.index !== undefined ? [options.index.toString()] : []),
241
+ ]);
242
+ break;
243
+ case 'list':
244
+ result = await this.git.stash(['list']);
245
+ break;
246
+ case 'clear':
247
+ result = await this.git.stash(['clear']);
248
+ break;
249
+ default:
250
+ throw new Error(`Unknown stash command: ${options.command}`);
251
+ }
252
+ return { success: true, result: result || 'Stash operation completed' };
253
+ }
254
+ /**
255
+ * Get current branch name
256
+ */
257
+ async currentBranch() {
258
+ const result = await this.git.revparse(['--abbrev-ref', 'HEAD']);
259
+ return result.trim();
260
+ }
261
+ /**
262
+ * Check if repository is clean
263
+ */
264
+ async isClean() {
265
+ const status = await this.status();
266
+ return status.isClean();
267
+ }
268
+ /**
269
+ * Reset to a commit
270
+ */
271
+ async reset(target, mode = 'mixed') {
272
+ logger.info(`Resetting to ${target} with mode ${mode}`);
273
+ await this.git.reset([`--${mode}`, target]);
274
+ return { success: true };
275
+ }
276
+ /**
277
+ * Fetch from remote
278
+ */
279
+ async fetch(remote = 'origin', prune = false) {
280
+ logger.info(`Fetching from ${remote}`);
281
+ if (prune) {
282
+ await this.git.fetch(remote, ['--prune']);
283
+ }
284
+ else {
285
+ await this.git.fetch(remote);
286
+ }
287
+ return { success: true };
288
+ }
289
+ /**
290
+ * Get remote URL
291
+ */
292
+ async getRemoteUrl(remote = 'origin') {
293
+ try {
294
+ const remotes = await this.git.getRemotes(true);
295
+ const targetRemote = remotes.find(r => r.name === remote);
296
+ return targetRemote?.refs?.fetch || null;
297
+ }
298
+ catch {
299
+ return null;
300
+ }
301
+ }
302
+ /**
303
+ * Check if path is a git repository
304
+ */
305
+ async isRepo() {
306
+ return await this.git.checkIsRepo();
307
+ }
308
+ /**
309
+ * Initialize a new repository
310
+ */
311
+ async init(bare = false) {
312
+ logger.info(`Initializing git repository in ${this.repoPath}`);
313
+ await this.git.init(bare);
314
+ return { success: true };
315
+ }
316
+ /**
317
+ * Cherry-pick a commit
318
+ */
319
+ async cherryPick(commit, options = {}) {
320
+ logger.info(`Cherry-picking commit: ${commit}`);
321
+ const cherryPickArgs = [commit];
322
+ if (options.noCommit) {
323
+ cherryPickArgs.unshift('--no-commit');
324
+ }
325
+ if (options.edit) {
326
+ cherryPickArgs.unshift('-e');
327
+ }
328
+ if (options.signoff) {
329
+ cherryPickArgs.unshift('-s');
330
+ }
331
+ if (options.strategy) {
332
+ cherryPickArgs.unshift('-X', options.strategy);
333
+ }
334
+ // Use raw to execute cherry-pick
335
+ const result = await this.git.raw(['cherry-pick', ...cherryPickArgs]);
336
+ return {
337
+ success: true,
338
+ result: result || 'Cherry-pick completed successfully',
339
+ };
340
+ }
341
+ /**
342
+ * Rebase onto a target branch
343
+ */
344
+ async rebase(target, options = {}) {
345
+ logger.info(`Rebasing onto: ${target}`);
346
+ const rebaseArgs = [];
347
+ if (options.interactive) {
348
+ // Note: Interactive rebase requires a terminal, so we skip it in automation
349
+ logger.warn('Interactive rebase not supported in automation mode');
350
+ }
351
+ if (options.onto) {
352
+ rebaseArgs.push('--onto', options.onto);
353
+ }
354
+ if (options.preserveMerges) {
355
+ rebaseArgs.push('--preserve-merges');
356
+ }
357
+ if (options.strategy) {
358
+ rebaseArgs.push('-s', options.strategy);
359
+ }
360
+ if (options.strategyOption) {
361
+ rebaseArgs.push('-X', options.strategyOption);
362
+ }
363
+ rebaseArgs.push(target);
364
+ const result = await this.git.rebase(rebaseArgs);
365
+ return {
366
+ success: true,
367
+ result: result || 'Rebase completed successfully',
368
+ };
369
+ }
370
+ /**
371
+ * Continue a rebase after resolving conflicts
372
+ */
373
+ async rebaseContinue() {
374
+ logger.info('Continuing rebase');
375
+ const result = await this.git.rebase(['--continue']);
376
+ return {
377
+ success: true,
378
+ result: result || 'Rebase continued successfully',
379
+ };
380
+ }
381
+ /**
382
+ * Abort a rebase in progress
383
+ */
384
+ async rebaseAbort() {
385
+ logger.info('Aborting rebase');
386
+ await this.git.rebase(['--abort']);
387
+ return { success: true };
388
+ }
389
+ /**
390
+ * Skip a commit during rebase
391
+ */
392
+ async rebaseSkip() {
393
+ logger.info('Skipping commit during rebase');
394
+ const result = await this.git.rebase(['--skip']);
395
+ return {
396
+ success: true,
397
+ result: result || 'Commit skipped',
398
+ };
399
+ }
400
+ /**
401
+ * Create a tag
402
+ */
403
+ async tag(name, options = {}) {
404
+ logger.info(`Creating tag: ${name}`);
405
+ const tagArgs = [];
406
+ if (options.annotated || options.message) {
407
+ tagArgs.push('-a');
408
+ }
409
+ if (options.message) {
410
+ tagArgs.push('-m', options.message);
411
+ }
412
+ if (options.force) {
413
+ tagArgs.push('-f');
414
+ }
415
+ tagArgs.push(name);
416
+ if (options.commit) {
417
+ tagArgs.push(options.commit);
418
+ }
419
+ await this.git.tag(tagArgs);
420
+ return { success: true, tag: name };
421
+ }
422
+ /**
423
+ * Delete a tag
424
+ */
425
+ async deleteTag(name, remote) {
426
+ logger.info(`Deleting tag: ${name}`);
427
+ // Delete locally
428
+ await this.git.tag(['-d', name]);
429
+ // Delete from remote if specified
430
+ if (remote) {
431
+ await this.git.push(remote, `:refs/tags/${name}`);
432
+ }
433
+ return { success: true };
434
+ }
435
+ /**
436
+ * List tags
437
+ */
438
+ async listTags(pattern) {
439
+ logger.info('Listing tags');
440
+ const args = pattern ? ['-l', pattern] : [];
441
+ const result = await this.git.tags(args);
442
+ return result.all;
443
+ }
444
+ /**
445
+ * Push tags to remote
446
+ */
447
+ async pushTags(remote = 'origin', tagName) {
448
+ logger.info(`Pushing tags to ${remote}`);
449
+ if (tagName) {
450
+ await this.git.push(remote, `refs/tags/${tagName}`);
451
+ }
452
+ else {
453
+ await this.git.pushTags(remote);
454
+ }
455
+ return { success: true };
456
+ }
457
+ /**
458
+ * Show information about a tag
459
+ */
460
+ async showTag(name) {
461
+ logger.info(`Showing tag: ${name}`);
462
+ const result = await this.git.show(['--no-patch', name]);
463
+ return { success: true, info: result };
464
+ }
465
+ /**
466
+ * Check if there are conflicts
467
+ */
468
+ async hasConflicts() {
469
+ const status = await this.status();
470
+ return status.conflicted.length > 0;
471
+ }
472
+ /**
473
+ * Get list of conflicted files
474
+ */
475
+ async getConflicts() {
476
+ const status = await this.status();
477
+ return status.conflicted;
478
+ }
479
+ /**
480
+ * Abort cherry-pick in progress
481
+ */
482
+ async cherryPickAbort() {
483
+ logger.info('Aborting cherry-pick');
484
+ await this.git.raw(['cherry-pick', '--abort']);
485
+ return { success: true };
486
+ }
487
+ /**
488
+ * Continue cherry-pick after resolving conflicts
489
+ */
490
+ async cherryPickContinue() {
491
+ logger.info('Continuing cherry-pick');
492
+ const result = await this.git.raw(['cherry-pick', '--continue']);
493
+ return {
494
+ success: true,
495
+ result: result || 'Cherry-pick continued',
496
+ };
497
+ }
498
+ /**
499
+ * Show a specific commit
500
+ */
501
+ async showCommit(commit) {
502
+ logger.info(`Showing commit: ${commit}`);
503
+ return await this.git.show([commit]);
504
+ }
505
+ /**
506
+ * Get the short hash for a ref
507
+ */
508
+ async getShortHash(ref = 'HEAD') {
509
+ const result = await this.git.revparse(['--short', ref]);
510
+ return result.trim();
511
+ }
512
+ /**
513
+ * Get the full hash for a ref
514
+ */
515
+ async getFullHash(ref = 'HEAD') {
516
+ const result = await this.git.revparse([ref]);
517
+ return result.trim();
518
+ }
519
+ /**
520
+ * Get the commit count between two refs
521
+ */
522
+ async getCommitCount(from, to = 'HEAD') {
523
+ const result = await this.git.raw(['rev-list', '--count', `${from}..${to}`]);
524
+ return parseInt(result.trim(), 10);
525
+ }
526
+ /**
527
+ * Revert a commit
528
+ */
529
+ async revert(commit, options = {}) {
530
+ logger.info(`Reverting commit: ${commit}`);
531
+ const revertArgs = [];
532
+ if (options.noCommit) {
533
+ revertArgs.push('--no-commit');
534
+ }
535
+ if (options.noEdit) {
536
+ revertArgs.push('--no-edit');
537
+ }
538
+ revertArgs.push(commit);
539
+ const result = await this.git.raw(['revert', ...revertArgs]);
540
+ return {
541
+ success: true,
542
+ result: result || 'Revert completed successfully',
543
+ };
544
+ }
545
+ /**
546
+ * Blame a file
547
+ */
548
+ async blame(file, options) {
549
+ logger.info(`Getting blame for: ${file}`);
550
+ const args = [];
551
+ if (options?.startLine && options?.endLine) {
552
+ args.push(`-L${options.startLine},${options.endLine}`);
553
+ }
554
+ args.push(file);
555
+ return await this.git.raw(['blame', ...args]);
556
+ }
557
+ }