@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,93 @@
1
+ import { logger } from '../utils';
2
+ /**
3
+ * WebSocket Client for streaming communication
4
+ */
5
+ export class WebSocketClient {
6
+ url;
7
+ ws = null;
8
+ options;
9
+ reconnectAttempts = 0;
10
+ messageHandlers = new Set();
11
+ errorHandlers = new Set();
12
+ closeHandlers = new Set();
13
+ constructor(url, options = {}) {
14
+ this.url = url;
15
+ this.options = {
16
+ reconnect: options.reconnect ?? true,
17
+ reconnectInterval: options.reconnectInterval ?? 3000,
18
+ maxReconnectAttempts: options.maxReconnectAttempts ?? 5,
19
+ };
20
+ }
21
+ connect() {
22
+ return new Promise((resolve, reject) => {
23
+ try {
24
+ this.ws = new WebSocket(this.url);
25
+ this.ws.onopen = () => {
26
+ logger.info(`WebSocket connected to ${this.url}`);
27
+ this.reconnectAttempts = 0;
28
+ resolve();
29
+ };
30
+ this.ws.onmessage = event => {
31
+ try {
32
+ const data = JSON.parse(event.data);
33
+ this.messageHandlers.forEach(handler => handler(data));
34
+ }
35
+ catch (error) {
36
+ logger.error('Failed to parse WebSocket message', error);
37
+ }
38
+ };
39
+ this.ws.onerror = event => {
40
+ logger.error('WebSocket error', event);
41
+ this.errorHandlers.forEach(handler => handler(event));
42
+ reject(event);
43
+ };
44
+ this.ws.onclose = () => {
45
+ logger.warn(`WebSocket disconnected from ${this.url}`);
46
+ this.closeHandlers.forEach(handler => handler());
47
+ // Auto-reconnect
48
+ if (this.options.reconnect &&
49
+ this.reconnectAttempts < this.options.maxReconnectAttempts) {
50
+ this.reconnectAttempts++;
51
+ logger.info(`Attempting to reconnect (${this.reconnectAttempts}/${this.options.maxReconnectAttempts})...`);
52
+ setTimeout(() => {
53
+ this.connect().catch(() => {
54
+ // Ignore, will retry or give up
55
+ });
56
+ }, this.options.reconnectInterval);
57
+ }
58
+ };
59
+ }
60
+ catch (error) {
61
+ reject(error);
62
+ }
63
+ });
64
+ }
65
+ send(data) {
66
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
67
+ throw new Error('WebSocket is not connected');
68
+ }
69
+ this.ws.send(JSON.stringify(data));
70
+ }
71
+ onMessage(handler) {
72
+ this.messageHandlers.add(handler);
73
+ return () => this.messageHandlers.delete(handler);
74
+ }
75
+ onError(handler) {
76
+ this.errorHandlers.add(handler);
77
+ return () => this.errorHandlers.delete(handler);
78
+ }
79
+ onClose(handler) {
80
+ this.closeHandlers.add(handler);
81
+ return () => this.closeHandlers.delete(handler);
82
+ }
83
+ close() {
84
+ if (this.ws) {
85
+ this.options.reconnect = false; // Prevent auto-reconnect
86
+ this.ws.close();
87
+ this.ws = null;
88
+ }
89
+ }
90
+ isConnected() {
91
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
92
+ }
93
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Alias Command — L2
3
+ *
4
+ * Create, list, and remove command aliases stored in ~/.nimbus/aliases.json.
5
+ *
6
+ * Usage:
7
+ * nimbus alias deploy=run --auto-approve "deploy staging"
8
+ * nimbus alias list
9
+ * nimbus alias remove deploy
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import * as os from 'node:os';
14
+ import { ui } from '../wizard/ui';
15
+ const ALIASES_FILE = path.join(os.homedir(), '.nimbus', 'aliases.json');
16
+ function loadAliases() {
17
+ try {
18
+ return JSON.parse(fs.readFileSync(ALIASES_FILE, 'utf-8'));
19
+ }
20
+ catch {
21
+ return {};
22
+ }
23
+ }
24
+ function saveAliases(aliases) {
25
+ const dir = path.dirname(ALIASES_FILE);
26
+ fs.mkdirSync(dir, { recursive: true });
27
+ fs.writeFileSync(ALIASES_FILE, JSON.stringify(aliases, null, 2), 'utf-8');
28
+ }
29
+ /**
30
+ * Resolve the first arg as an alias if one exists.
31
+ * Returns the original args unchanged if no alias matches.
32
+ */
33
+ export function resolveAlias(args) {
34
+ if (!args.length)
35
+ return args;
36
+ const aliases = loadAliases();
37
+ const expanded = aliases[args[0]];
38
+ if (!expanded)
39
+ return args;
40
+ // Split the alias value on spaces and prepend to remaining args
41
+ return [...expanded.split(' '), ...args.slice(1)];
42
+ }
43
+ /**
44
+ * Alias command handler.
45
+ */
46
+ export async function aliasCommand(subcommand, args) {
47
+ const aliases = loadAliases();
48
+ if (subcommand === 'list' || (!subcommand && args.length === 0)) {
49
+ ui.header('Command Aliases');
50
+ const entries = Object.entries(aliases);
51
+ if (entries.length === 0) {
52
+ ui.info('No aliases defined. Create one: nimbus alias <name>=<command>');
53
+ return;
54
+ }
55
+ for (const [name, cmd] of entries) {
56
+ ui.print(` ${ui.color(name, 'green')} = ${cmd}`);
57
+ }
58
+ return;
59
+ }
60
+ if (subcommand === 'remove' || subcommand === 'rm') {
61
+ const name = args[0];
62
+ if (!name) {
63
+ ui.error('Usage: nimbus alias remove <name>');
64
+ process.exit(1);
65
+ }
66
+ if (!(name in aliases)) {
67
+ ui.warning(`Alias "${name}" not found`);
68
+ return;
69
+ }
70
+ delete aliases[name];
71
+ saveAliases(aliases);
72
+ ui.success(`Removed alias: ${name}`);
73
+ return;
74
+ }
75
+ // Create alias: subcommand is "<name>=<rest>" or subcommand is the name and args hold the expansion
76
+ const raw = subcommand + (args.length ? ' ' + args.join(' ') : '');
77
+ const eqIdx = raw.indexOf('=');
78
+ if (eqIdx === -1) {
79
+ ui.error('Usage: nimbus alias <name>=<command> or nimbus alias list or nimbus alias remove <name>');
80
+ process.exit(1);
81
+ }
82
+ const name = raw.slice(0, eqIdx).trim();
83
+ const cmd = raw.slice(eqIdx + 1).trim();
84
+ if (!name || !cmd) {
85
+ ui.error('Alias name and command must not be empty');
86
+ process.exit(1);
87
+ }
88
+ aliases[name] = cmd;
89
+ saveAliases(aliases);
90
+ ui.success(`Alias set: ${ui.color(name, 'green')} = ${cmd}`);
91
+ }
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Analyze Command
3
+ * Codebase analysis and refactoring suggestions
4
+ */
5
+ import { ui } from '../../wizard/ui';
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ /**
9
+ * Parse analyze options
10
+ */
11
+ export function parseAnalyzeOptions(args) {
12
+ const options = {
13
+ type: 'all',
14
+ };
15
+ for (let i = 0; i < args.length; i++) {
16
+ const arg = args[i];
17
+ if (arg === '--type' && args[i + 1]) {
18
+ options.type = args[++i];
19
+ }
20
+ else if (arg === '--path' && args[i + 1]) {
21
+ options.path = args[++i];
22
+ }
23
+ else if (arg === '--json') {
24
+ options.json = true;
25
+ }
26
+ else if (arg === '--security') {
27
+ // Shortcut for --type security
28
+ options.type = 'security';
29
+ }
30
+ else if (arg === '--compliance' && args[i + 1]) {
31
+ // Set compliance standard (soc2, hipaa, pci)
32
+ options.type = 'security';
33
+ options.compliance = args[++i];
34
+ }
35
+ else if (!arg.startsWith('-') && !options.path) {
36
+ options.path = arg;
37
+ }
38
+ }
39
+ return options;
40
+ }
41
+ /**
42
+ * Get files to analyze
43
+ */
44
+ function getFilesToAnalyze(basePath, extensions) {
45
+ const files = [];
46
+ function walk(dir) {
47
+ try {
48
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
49
+ for (const entry of entries) {
50
+ const fullPath = path.join(dir, entry.name);
51
+ // Skip node_modules, .git, etc.
52
+ if (entry.isDirectory()) {
53
+ if (!['node_modules', '.git', 'dist', 'build', 'coverage'].includes(entry.name)) {
54
+ walk(fullPath);
55
+ }
56
+ }
57
+ else if (entry.isFile()) {
58
+ const ext = path.extname(entry.name);
59
+ if (extensions.includes(ext)) {
60
+ files.push(fullPath);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // Ignore permission errors
67
+ }
68
+ }
69
+ walk(basePath);
70
+ return files;
71
+ }
72
+ /**
73
+ * Analyze a single file for potential improvements
74
+ */
75
+ function analyzeFile(filePath, type) {
76
+ const suggestions = [];
77
+ try {
78
+ const content = fs.readFileSync(filePath, 'utf-8');
79
+ const lines = content.split('\n');
80
+ const relativePath = path.relative(process.cwd(), filePath);
81
+ // Simple pattern-based analysis
82
+ lines.forEach((line, index) => {
83
+ const lineNum = index + 1;
84
+ // Complexity: Long lines
85
+ if (type === 'all' || type === 'refactor') {
86
+ if (line.length > 120) {
87
+ suggestions.push({
88
+ file: relativePath,
89
+ line: lineNum,
90
+ type: 'style',
91
+ severity: 'info',
92
+ explanation: `Line exceeds 120 characters (${line.length}). Consider breaking it up.`,
93
+ });
94
+ }
95
+ // Nested callbacks (callback hell indicator)
96
+ const nestedCallbacks = (line.match(/\)\s*=>\s*\{/g) || []).length;
97
+ if (nestedCallbacks >= 2) {
98
+ suggestions.push({
99
+ file: relativePath,
100
+ line: lineNum,
101
+ type: 'complexity',
102
+ severity: 'warning',
103
+ explanation: 'Multiple nested arrow functions detected. Consider extracting to named functions.',
104
+ });
105
+ }
106
+ // TODO/FIXME comments
107
+ if (/\/\/\s*(TODO|FIXME|HACK|XXX)/i.test(line)) {
108
+ suggestions.push({
109
+ file: relativePath,
110
+ line: lineNum,
111
+ type: 'style',
112
+ severity: 'info',
113
+ explanation: 'TODO/FIXME comment found. Consider addressing or tracking this.',
114
+ });
115
+ }
116
+ }
117
+ // Security checks
118
+ if (type === 'all' || type === 'security') {
119
+ // Hardcoded secrets patterns (variable names or quoted strings)
120
+ if (/\b(?:password|secret|api[_-]?key|token)\b\s*[:=]/i.test(line)) {
121
+ suggestions.push({
122
+ file: relativePath,
123
+ line: lineNum,
124
+ type: 'security',
125
+ severity: 'error',
126
+ explanation: 'Potential hardcoded credential detected. Use environment variables instead.',
127
+ });
128
+ }
129
+ // eval() usage
130
+ if (/\beval\s*\(/.test(line)) {
131
+ suggestions.push({
132
+ file: relativePath,
133
+ line: lineNum,
134
+ type: 'security',
135
+ severity: 'error',
136
+ explanation: 'eval() usage detected. This can lead to code injection vulnerabilities.',
137
+ });
138
+ }
139
+ // SQL injection potential
140
+ if (/\$\{.*\}.*(?:SELECT|INSERT|UPDATE|DELETE|FROM|WHERE)/i.test(line)) {
141
+ suggestions.push({
142
+ file: relativePath,
143
+ line: lineNum,
144
+ type: 'security',
145
+ severity: 'warning',
146
+ explanation: 'Potential SQL injection. Use parameterized queries instead of string interpolation.',
147
+ });
148
+ }
149
+ }
150
+ // Documentation checks
151
+ if (type === 'all' || type === 'docs') {
152
+ // Functions without JSDoc
153
+ if (/^(?:export\s+)?(?:async\s+)?function\s+\w+/.test(line)) {
154
+ const prevLine = index > 0 ? lines[index - 1] : '';
155
+ if (!/\*\/\s*$/.test(prevLine)) {
156
+ suggestions.push({
157
+ file: relativePath,
158
+ line: lineNum,
159
+ type: 'style',
160
+ severity: 'info',
161
+ explanation: 'Function lacks JSDoc documentation.',
162
+ });
163
+ }
164
+ }
165
+ }
166
+ });
167
+ // File-level checks
168
+ if (type === 'all' || type === 'refactor') {
169
+ // Large file
170
+ if (lines.length > 500) {
171
+ suggestions.push({
172
+ file: relativePath,
173
+ line: 1,
174
+ type: 'complexity',
175
+ severity: 'warning',
176
+ explanation: `File has ${lines.length} lines. Consider splitting into smaller modules.`,
177
+ });
178
+ }
179
+ }
180
+ }
181
+ catch {
182
+ // Skip files we can't read
183
+ }
184
+ return suggestions;
185
+ }
186
+ /**
187
+ * Display severity with color
188
+ */
189
+ function formatSeverity(severity) {
190
+ switch (severity) {
191
+ case 'error':
192
+ return ui.color('ERROR', 'red');
193
+ case 'warning':
194
+ return ui.color('WARN', 'yellow');
195
+ case 'info':
196
+ default:
197
+ return ui.color('INFO', 'blue');
198
+ }
199
+ }
200
+ /**
201
+ * Analyze command
202
+ */
203
+ export async function analyzeCommand(options) {
204
+ const targetPath = options.path || process.cwd();
205
+ if (!fs.existsSync(targetPath)) {
206
+ ui.error(`Path not found: ${targetPath}`);
207
+ return;
208
+ }
209
+ ui.header('Nimbus Analyze', targetPath);
210
+ ui.startSpinner({ message: 'Analyzing codebase...' });
211
+ // Get files to analyze
212
+ const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs'];
213
+ const files = getFilesToAnalyze(targetPath, extensions);
214
+ if (files.length === 0) {
215
+ ui.stopSpinnerSuccess('No files found to analyze');
216
+ return;
217
+ }
218
+ // Analyze files
219
+ const allSuggestions = [];
220
+ for (const file of files) {
221
+ const suggestions = analyzeFile(file, options.type);
222
+ allSuggestions.push(...suggestions);
223
+ }
224
+ ui.stopSpinnerSuccess(`Analyzed ${files.length} files`);
225
+ // Track analysis completion
226
+ try {
227
+ const { trackEvent } = await import('../../telemetry');
228
+ trackEvent('analysis_completed', {
229
+ filesAnalyzed: files.length,
230
+ suggestionsCount: allSuggestions.length,
231
+ });
232
+ }
233
+ catch {
234
+ /* telemetry failure is non-critical */
235
+ }
236
+ // Build analysis result
237
+ const byType = {};
238
+ const bySeverity = {};
239
+ for (const s of allSuggestions) {
240
+ byType[s.type] = (byType[s.type] || 0) + 1;
241
+ bySeverity[s.severity] = (bySeverity[s.severity] || 0) + 1;
242
+ }
243
+ const analysis = {
244
+ path: targetPath,
245
+ analyzedAt: new Date().toISOString(),
246
+ summary: {
247
+ filesAnalyzed: files.length,
248
+ suggestionsCount: allSuggestions.length,
249
+ byType,
250
+ bySeverity,
251
+ },
252
+ suggestions: allSuggestions,
253
+ };
254
+ if (options.json) {
255
+ console.log(JSON.stringify(analysis, null, 2));
256
+ return;
257
+ }
258
+ // Display results
259
+ ui.newLine();
260
+ ui.section('Summary');
261
+ ui.print(` Files analyzed: ${analysis.summary.filesAnalyzed}`);
262
+ ui.print(` Total suggestions: ${analysis.summary.suggestionsCount}`);
263
+ if (analysis.summary.suggestionsCount > 0) {
264
+ ui.newLine();
265
+ ui.print(' By severity:');
266
+ if (bySeverity.error) {
267
+ ui.print(` ${ui.color('Errors:', 'red')} ${bySeverity.error}`);
268
+ }
269
+ if (bySeverity.warning) {
270
+ ui.print(` ${ui.color('Warnings:', 'yellow')} ${bySeverity.warning}`);
271
+ }
272
+ if (bySeverity.info) {
273
+ ui.print(` ${ui.color('Info:', 'blue')} ${bySeverity.info}`);
274
+ }
275
+ ui.newLine();
276
+ ui.print(' By type:');
277
+ for (const [type, count] of Object.entries(byType)) {
278
+ ui.print(` ${type}: ${count}`);
279
+ }
280
+ }
281
+ // Show top suggestions
282
+ if (allSuggestions.length > 0) {
283
+ ui.section('Suggestions');
284
+ // Sort by severity (error > warning > info)
285
+ const sorted = allSuggestions.sort((a, b) => {
286
+ const order = { error: 0, warning: 1, info: 2 };
287
+ return order[a.severity] - order[b.severity];
288
+ });
289
+ // Show top 20
290
+ const toShow = sorted.slice(0, 20);
291
+ for (const suggestion of toShow) {
292
+ ui.newLine();
293
+ ui.print(` ${formatSeverity(suggestion.severity)} ${suggestion.file}:${suggestion.line}`);
294
+ ui.print(` ${ui.dim(suggestion.type)}: ${suggestion.explanation}`);
295
+ if (suggestion.diff) {
296
+ ui.sideBySideDiff({
297
+ original: suggestion.original || '',
298
+ modified: suggestion.suggested || '',
299
+ });
300
+ }
301
+ }
302
+ if (allSuggestions.length > 20) {
303
+ ui.newLine();
304
+ ui.dim(` ... and ${allSuggestions.length - 20} more suggestions`);
305
+ ui.dim(` Use --json for full output`);
306
+ }
307
+ }
308
+ else {
309
+ ui.newLine();
310
+ ui.success('No issues found!');
311
+ }
312
+ ui.newLine();
313
+ }