@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
@@ -203,18 +203,130 @@ export async function auditExportCommand(options: AuditExportCommandOptions): Pr
203
203
  }
204
204
  }
205
205
 
206
+ /** Options for the audit scan subcommand */
207
+ export interface AuditScanOptions {
208
+ /** Compliance framework filter */
209
+ framework?: 'soc2' | 'hipaa' | 'pci' | 'iso27001';
210
+ /** Write JSON report to this file */
211
+ output?: string;
212
+ /** Directory to scan (default: cwd) */
213
+ dir?: string;
214
+ /** Exit code 1 if findings exceed this count */
215
+ threshold?: number;
216
+ }
217
+
218
+ /**
219
+ * Parse audit scan options from CLI args
220
+ */
221
+ export function parseAuditScanOptions(args: string[]): AuditScanOptions {
222
+ const options: AuditScanOptions = {};
223
+
224
+ for (let i = 0; i < args.length; i++) {
225
+ const arg = args[i];
226
+ if (arg === '--framework' && args[i + 1]) {
227
+ options.framework = args[++i] as AuditScanOptions['framework'];
228
+ } else if ((arg === '--output' || arg === '-o') && args[i + 1]) {
229
+ options.output = args[++i];
230
+ } else if ((arg === '--dir' || arg === '-d') && args[i + 1]) {
231
+ options.dir = args[++i];
232
+ } else if (arg === '--threshold' && args[i + 1]) {
233
+ options.threshold = parseInt(args[++i], 10);
234
+ }
235
+ }
236
+
237
+ return options;
238
+ }
239
+
240
+ /**
241
+ * Audit scan subcommand — runs the local security scanner
242
+ */
243
+ export async function auditScanCommand(options: AuditScanOptions): Promise<void> {
244
+ const { scanSecurity } = await import('../../audit/security-scanner');
245
+ const dir = options.dir ?? process.cwd();
246
+
247
+ ui.startSpinner({ message: `Scanning ${dir} for security issues...` });
248
+
249
+ let result;
250
+ try {
251
+ result = await scanSecurity({ dir });
252
+ } catch (e: any) {
253
+ ui.stopSpinnerFail('Scan failed');
254
+ ui.error(e.message);
255
+ return;
256
+ }
257
+
258
+ ui.stopSpinnerSuccess(
259
+ `Scan complete: ${result.findings.length} finding(s) in ${result.scannedFiles} file(s)`
260
+ );
261
+
262
+ // Filter by framework if provided (maps framework to relevant finding IDs)
263
+ let findings = result.findings;
264
+ if (options.framework) {
265
+ // Each framework maps loosely to severity thresholds
266
+ const frameworkSeverityMap: Record<string, string[]> = {
267
+ soc2: ['CRITICAL', 'HIGH', 'MEDIUM'],
268
+ hipaa: ['CRITICAL', 'HIGH', 'MEDIUM'],
269
+ pci: ['CRITICAL', 'HIGH'],
270
+ iso27001: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'],
271
+ };
272
+ const allowedSeverities = frameworkSeverityMap[options.framework] ?? [];
273
+ findings = findings.filter((f: { severity: string }) => allowedSeverities.includes(f.severity));
274
+ ui.dim(`Framework filter (${options.framework}): showing ${findings.length} relevant finding(s)`);
275
+ }
276
+
277
+ if (findings.length === 0) {
278
+ ui.info('No findings. Scan clean.');
279
+ } else {
280
+ ui.newLine();
281
+ for (const finding of findings) {
282
+ const severityColor = finding.severity === 'CRITICAL' || finding.severity === 'HIGH'
283
+ ? 'red'
284
+ : finding.severity === 'MEDIUM'
285
+ ? 'yellow'
286
+ : 'white';
287
+ ui.print(`[${ui.color(finding.severity, severityColor)}] ${finding.id}: ${finding.title}`);
288
+ if (finding.file) ui.dim(` File: ${finding.file}${finding.line ? `:${finding.line}` : ''}`);
289
+ ui.dim(` ${finding.recommendation}`);
290
+ ui.newLine();
291
+ }
292
+ }
293
+
294
+ // Write JSON report to file if requested
295
+ if (options.output) {
296
+ const report = {
297
+ timestamp: result.timestamp.toISOString(),
298
+ scannedFiles: result.scannedFiles,
299
+ scanDuration: result.scanDuration,
300
+ framework: options.framework ?? null,
301
+ findingsCount: findings.length,
302
+ findings,
303
+ };
304
+ fs.writeFileSync(options.output, JSON.stringify(report, null, 2), 'utf-8');
305
+ ui.print(`Report written to ${options.output}`);
306
+ }
307
+
308
+ // Threshold check — exit code 1 if too many findings
309
+ if (options.threshold !== undefined && findings.length > options.threshold) {
310
+ ui.error(`Findings (${findings.length}) exceeded threshold (${options.threshold}). Exiting with code 1.`);
311
+ process.exit(1);
312
+ }
313
+ }
314
+
206
315
  /**
207
316
  * Main audit command dispatcher
208
317
  */
209
318
  export async function auditCommand(subcommand: string, args: string[]): Promise<void> {
210
319
  switch (subcommand) {
211
320
  case 'list':
212
- case undefined:
321
+ case '':
213
322
  await auditListCommand(parseAuditListOptions(args));
214
323
  break;
215
324
  case 'export':
216
325
  await auditExportCommand(parseAuditExportOptions(args));
217
326
  break;
327
+ case 'scan':
328
+ await auditScanCommand(parseAuditScanOptions(args));
329
+ break;
218
330
  default:
219
331
  ui.error(`Unknown audit command: ${subcommand}`);
220
332
  ui.newLine();
@@ -222,8 +334,9 @@ export async function auditCommand(subcommand: string, args: string[]): Promise<
222
334
  ui.print(' nimbus audit - List audit logs');
223
335
  ui.print(' nimbus audit list - List audit logs');
224
336
  ui.print(' nimbus audit export - Export audit logs');
337
+ ui.print(' nimbus audit scan - Scan directory for security issues');
225
338
  ui.newLine();
226
- ui.info('Options:');
339
+ ui.info('Options (list):');
227
340
  ui.print(' --since <time> Filter logs since (e.g., 7d, 24h, 2024-01-01)');
228
341
  ui.print(' --until <time> Filter logs until');
229
342
  ui.print(' --action <type> Filter by action type');
@@ -231,6 +344,12 @@ export async function auditCommand(subcommand: string, args: string[]): Promise<
231
344
  ui.print(' --limit <n> Number of logs to show');
232
345
  ui.print(' --json Output as JSON');
233
346
  ui.newLine();
347
+ ui.info('Options (scan):');
348
+ ui.print(' --framework <f> Compliance framework: soc2|hipaa|pci|iso27001');
349
+ ui.print(' --output <file> Write JSON report to file');
350
+ ui.print(' --dir <path> Directory to scan (default: cwd)');
351
+ ui.print(' --threshold <n> Exit code 1 if findings exceed this count');
352
+ ui.newLine();
234
353
  ui.info('Export options:');
235
354
  ui.print(' --format <type> Export format (csv|json)');
236
355
  ui.print(' --output <file> Output file path');
@@ -265,6 +265,91 @@ export async function authAzureCommand(options: AuthCloudOptions = {}): Promise<
265
265
  ui.success('Azure credentials are configured and valid');
266
266
  }
267
267
 
268
+ /**
269
+ * H1: AWS SSO Login — delegates to `aws sso login` so the CLI handles the browser flow.
270
+ * spawnSync with stdio: 'inherit' so device codes / browser prompts appear in terminal.
271
+ */
272
+ export async function loginAwsCommand(options: AuthCloudOptions = {}): Promise<void> {
273
+ const installed = await isCliInstalled('aws');
274
+ if (!installed) {
275
+ ui.error('AWS CLI is not installed. Install from https://aws.amazon.com/cli/');
276
+ return;
277
+ }
278
+
279
+ ui.info('Launching AWS SSO login...');
280
+ ui.print(ui.dim('The browser (or device code) flow is handled by the AWS CLI.'));
281
+ ui.newLine();
282
+
283
+ const { spawnSync } = await import('child_process');
284
+ const args = ['sso', 'login'];
285
+ if (options.profile) {
286
+ args.push('--profile', options.profile);
287
+ }
288
+
289
+ const result = spawnSync('aws', args, { stdio: 'inherit' });
290
+ if (result.status === 0) {
291
+ ui.success('AWS SSO login completed successfully.');
292
+ } else {
293
+ ui.error('AWS SSO login failed or was cancelled.');
294
+ }
295
+ }
296
+
297
+ /**
298
+ * H1: GCP Login — delegates to `gcloud auth login --no-launch-browser` (device code flow).
299
+ */
300
+ export async function loginGcpCommand(options: AuthCloudOptions = {}): Promise<void> {
301
+ const installed = await isCliInstalled('gcloud');
302
+ if (!installed) {
303
+ ui.error('Google Cloud SDK not installed. See https://cloud.google.com/sdk/docs/install');
304
+ return;
305
+ }
306
+
307
+ ui.info('Launching GCP device-code login...');
308
+ ui.print(ui.dim('Follow the URL and code shown below to complete authentication.'));
309
+ ui.newLine();
310
+
311
+ const { spawnSync } = await import('child_process');
312
+ const args = ['auth', 'login', '--no-launch-browser'];
313
+ if (options.project) {
314
+ args.push('--project', options.project);
315
+ }
316
+
317
+ const result = spawnSync('gcloud', args, { stdio: 'inherit' });
318
+ if (result.status === 0) {
319
+ ui.success('GCP login completed successfully.');
320
+ } else {
321
+ ui.error('GCP login failed or was cancelled.');
322
+ }
323
+ }
324
+
325
+ /**
326
+ * H1: Azure Login — delegates to `az login --use-device-code`.
327
+ */
328
+ export async function loginAzureCommand(options: AuthCloudOptions = {}): Promise<void> {
329
+ const installed = await isCliInstalled('az');
330
+ if (!installed) {
331
+ ui.error('Azure CLI not installed. See https://learn.microsoft.com/en-us/cli/azure/install-azure-cli');
332
+ return;
333
+ }
334
+
335
+ ui.info('Launching Azure device-code login...');
336
+ ui.print(ui.dim('Follow the URL and code shown below to complete authentication.'));
337
+ ui.newLine();
338
+
339
+ const { spawnSync } = await import('child_process');
340
+ const args = ['login', '--use-device-code'];
341
+ if (options.subscription) {
342
+ args.push('--subscription', options.subscription);
343
+ }
344
+
345
+ const result = spawnSync('az', args, { stdio: 'inherit' });
346
+ if (result.status === 0) {
347
+ ui.success('Azure login completed successfully.');
348
+ } else {
349
+ ui.error('Azure login failed or was cancelled.');
350
+ }
351
+ }
352
+
268
353
  /**
269
354
  * Cloud auth parent command router
270
355
  */
@@ -292,3 +377,31 @@ export async function authCloudCommand(
292
377
  ui.print(' nimbus auth azure — Validate Azure credentials');
293
378
  }
294
379
  }
380
+
381
+ /**
382
+ * Cloud login command router — delegates to CLI tools for SSO/OAuth flows (H1).
383
+ */
384
+ export async function loginCloudCommand(
385
+ provider: string,
386
+ options: AuthCloudOptions = {}
387
+ ): Promise<void> {
388
+ switch (provider) {
389
+ case 'aws':
390
+ await loginAwsCommand(options);
391
+ break;
392
+ case 'gcp':
393
+ case 'google':
394
+ await loginGcpCommand(options);
395
+ break;
396
+ case 'azure':
397
+ await loginAzureCommand(options);
398
+ break;
399
+ default:
400
+ ui.error(`Unknown cloud provider: ${provider}`);
401
+ ui.newLine();
402
+ ui.print('Supported providers:');
403
+ ui.print(' nimbus auth login aws — AWS SSO login (browser/device code)');
404
+ ui.print(' nimbus auth login gcp — GCP device-code login');
405
+ ui.print(' nimbus auth login azure — Azure device-code login');
406
+ }
407
+ }
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Auth Refresh Command
3
+ *
4
+ * Re-validate and refresh cloud provider credentials:
5
+ * - AWS: re-run SSO login or warn about expired temporary credentials
6
+ * - GCP: re-run gcloud auth application-default login
7
+ * - Azure: re-run az login
8
+ *
9
+ * Usage: nimbus auth-refresh [--provider aws|gcp|azure]
10
+ */
11
+
12
+ import { ui } from '../wizard';
13
+ import { exec } from 'node:child_process';
14
+ import { promisify } from 'node:util';
15
+
16
+ const execAsync = promisify(exec);
17
+
18
+ export interface AuthRefreshOptions {
19
+ provider?: 'aws' | 'gcp' | 'azure' | 'all';
20
+ }
21
+
22
+ /** Check if AWS credentials are valid and not expired */
23
+ async function checkAWSCredentials(): Promise<{ valid: boolean; message: string; sso: boolean }> {
24
+ try {
25
+ const { stdout } = await execAsync('aws sts get-caller-identity --output json', {
26
+ timeout: 10_000,
27
+ });
28
+ const identity = JSON.parse(stdout);
29
+ const isSso = identity.UserId?.includes(':') || false;
30
+ return {
31
+ valid: true,
32
+ message: `Account: ${identity.Account} | User: ${identity.UserId}`,
33
+ sso: isSso,
34
+ };
35
+ } catch (e: any) {
36
+ const msg = e.message || String(e);
37
+ const isExpired =
38
+ msg.includes('ExpiredToken') || msg.includes('expired') || msg.includes('token');
39
+ return { valid: false, message: isExpired ? 'Token expired' : msg, sso: false };
40
+ }
41
+ }
42
+
43
+ /** Refresh AWS SSO credentials */
44
+ async function refreshAWS(options: AuthRefreshOptions): Promise<void> {
45
+ ui.header('AWS Credentials');
46
+
47
+ const check = await checkAWSCredentials();
48
+
49
+ if (check.valid) {
50
+ ui.success(`Credentials valid: ${check.message}`);
51
+ return;
52
+ }
53
+
54
+ ui.warning(`Credentials invalid: ${check.message}`);
55
+
56
+ // G18: Guide user through AWS SSO login if SSO profile detected
57
+ const awsSsoProfile = process.env.AWS_PROFILE;
58
+ if (awsSsoProfile) {
59
+ ui.info(`AWS SSO profile detected: ${awsSsoProfile}`);
60
+ ui.info(`Run in another terminal: aws sso login --profile ${awsSsoProfile}`);
61
+ ui.info('Then press Enter here to retry...');
62
+ // Wait for user to press Enter
63
+ await new Promise<void>(resolve => {
64
+ const readline = require('readline') as typeof import('readline');
65
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
66
+ rl.question('', () => { rl.close(); resolve(); });
67
+ });
68
+ // Retry the credentials check
69
+ try {
70
+ const { execFileSync } = await import('node:child_process');
71
+ execFileSync('aws', ['sts', 'get-caller-identity'], {
72
+ encoding: 'utf-8', timeout: 8000, stdio: ['pipe', 'pipe', 'pipe'],
73
+ });
74
+ ui.success('AWS credentials refreshed successfully.');
75
+ return;
76
+ } catch {
77
+ ui.warning('AWS credentials still invalid. You may need to re-run aws sso login.');
78
+ }
79
+ }
80
+
81
+ // Determine refresh method
82
+ try {
83
+ // Check if SSO is configured
84
+ const { stdout: ssoCheck } = await execAsync(
85
+ 'aws configure list-profiles 2>/dev/null || echo ""',
86
+ { timeout: 5000 }
87
+ );
88
+ const profiles = ssoCheck.trim().split('\n').filter(Boolean);
89
+
90
+ if (profiles.length > 0) {
91
+ ui.info('Refreshing AWS SSO credentials...');
92
+ ui.info(`Run: aws sso login --profile ${profiles[0]}`);
93
+ ui.info('Or set a new profile: aws configure sso');
94
+ } else {
95
+ ui.info('To refresh AWS credentials:');
96
+ ui.info(' 1. aws configure (for long-term credentials)');
97
+ ui.info(' 2. aws sso configure (for SSO)');
98
+ ui.info(' 3. aws sts assume-role (for role assumption)');
99
+ }
100
+ } catch {
101
+ ui.info('To configure AWS credentials: aws configure');
102
+ }
103
+ }
104
+
105
+ /** Refresh GCP credentials */
106
+ async function refreshGCP(_options: AuthRefreshOptions): Promise<void> {
107
+ ui.header('GCP Credentials');
108
+
109
+ try {
110
+ const { stdout } = await execAsync('gcloud auth print-access-token 2>/dev/null', {
111
+ timeout: 5000,
112
+ });
113
+ if (stdout.trim().length > 10) {
114
+ try {
115
+ const { stdout: proj } = await execAsync('gcloud config get-value project 2>/dev/null', {
116
+ timeout: 3000,
117
+ });
118
+ ui.success(`Credentials valid. Project: ${proj.trim() || '(not set)'}`);
119
+ return;
120
+ } catch {
121
+ ui.success('Credentials valid');
122
+ return;
123
+ }
124
+ }
125
+ } catch {
126
+ // Not valid
127
+ }
128
+
129
+ ui.warning('GCP credentials expired or not configured');
130
+ ui.info('To refresh: gcloud auth application-default login');
131
+ ui.info('For service accounts: gcloud auth activate-service-account --key-file=SA_KEY.json');
132
+ }
133
+
134
+ /** Refresh Azure credentials */
135
+ async function refreshAzure(_options: AuthRefreshOptions): Promise<void> {
136
+ ui.header('Azure Credentials');
137
+
138
+ try {
139
+ const { stdout } = await execAsync('az account show --output json 2>/dev/null', {
140
+ timeout: 10_000,
141
+ });
142
+ const account = JSON.parse(stdout);
143
+ ui.success(
144
+ `Credentials valid. Subscription: ${account.name || account.id} (${account.state})`
145
+ );
146
+ if (account.state !== 'Enabled') {
147
+ ui.warning('Subscription is not in Enabled state');
148
+ }
149
+ return;
150
+ } catch {
151
+ // Not valid
152
+ }
153
+
154
+ ui.warning('Azure credentials expired or not configured');
155
+ ui.info('To refresh: az login');
156
+ ui.info('For service principals: az login --service-principal -u CLIENT_ID -p CLIENT_SECRET --tenant TENANT_ID');
157
+ }
158
+
159
+ /**
160
+ * Run the auth-refresh command
161
+ */
162
+ export async function authRefreshCommand(options: AuthRefreshOptions = {}): Promise<void> {
163
+ const provider = options.provider ?? 'all';
164
+
165
+ ui.header('Nimbus Auth Refresh');
166
+ ui.info('Checking and refreshing cloud provider credentials...');
167
+ ui.newLine();
168
+
169
+ if (provider === 'all' || provider === 'aws') {
170
+ await refreshAWS(options);
171
+ ui.newLine();
172
+ }
173
+
174
+ if (provider === 'all' || provider === 'gcp') {
175
+ await refreshGCP(options);
176
+ ui.newLine();
177
+ }
178
+
179
+ if (provider === 'all' || provider === 'azure') {
180
+ await refreshAzure(options);
181
+ ui.newLine();
182
+ }
183
+
184
+ ui.info('Tip: Run "nimbus doctor" for a full system check');
185
+ }
186
+
187
+ export default authRefreshCommand;