@build-astron-co/nimbus 0.3.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 (441) hide show
  1. package/bin/nimbus.cmd +41 -0
  2. package/bin/nimbus.mjs +70 -0
  3. package/completions/nimbus.bash +38 -0
  4. package/completions/nimbus.fish +48 -0
  5. package/completions/nimbus.zsh +81 -0
  6. package/dist/src/agent/compaction-agent.js +215 -0
  7. package/dist/src/agent/context-manager.js +385 -0
  8. package/dist/src/agent/context.js +322 -0
  9. package/dist/src/agent/deploy-preview.js +395 -0
  10. package/dist/src/agent/expand-files.js +95 -0
  11. package/dist/src/agent/index.js +18 -0
  12. package/dist/src/agent/loop.js +1535 -0
  13. package/dist/src/agent/modes.js +347 -0
  14. package/dist/src/agent/permissions.js +396 -0
  15. package/dist/src/agent/subagents/base.js +67 -0
  16. package/dist/src/agent/subagents/cost.js +45 -0
  17. package/dist/src/agent/subagents/explore.js +36 -0
  18. package/dist/src/agent/subagents/general.js +41 -0
  19. package/dist/src/agent/subagents/index.js +88 -0
  20. package/dist/src/agent/subagents/infra.js +52 -0
  21. package/dist/src/agent/subagents/security.js +60 -0
  22. package/dist/src/agent/system-prompt.js +860 -0
  23. package/dist/src/app.js +152 -0
  24. package/dist/src/audit/activity-log.js +209 -0
  25. package/dist/src/audit/compliance-checker.js +419 -0
  26. package/dist/src/audit/cost-tracker.js +231 -0
  27. package/dist/src/audit/index.js +10 -0
  28. package/dist/src/audit/security-scanner.js +490 -0
  29. package/dist/src/auth/guard.js +64 -0
  30. package/dist/src/auth/index.js +19 -0
  31. package/dist/src/auth/keychain.js +79 -0
  32. package/dist/src/auth/oauth.js +389 -0
  33. package/dist/src/auth/providers.js +415 -0
  34. package/dist/src/auth/sso.js +87 -0
  35. package/dist/src/auth/store.js +424 -0
  36. package/dist/src/auth/types.js +5 -0
  37. package/dist/src/cli/index.js +8 -0
  38. package/dist/src/cli/init.js +1048 -0
  39. package/dist/src/cli/openapi-spec.js +346 -0
  40. package/dist/src/cli/run.js +505 -0
  41. package/dist/src/cli/serve-auth.js +56 -0
  42. package/dist/src/cli/serve.js +432 -0
  43. package/dist/src/cli/web.js +50 -0
  44. package/dist/src/cli.js +1574 -0
  45. package/dist/src/clients/core-engine-client.js +156 -0
  46. package/dist/src/clients/enterprise-client.js +246 -0
  47. package/dist/src/clients/generator-client.js +219 -0
  48. package/dist/src/clients/git-client.js +367 -0
  49. package/dist/src/clients/github-client.js +229 -0
  50. package/dist/src/clients/helm-client.js +299 -0
  51. package/dist/src/clients/index.js +18 -0
  52. package/dist/src/clients/k8s-client.js +270 -0
  53. package/dist/src/clients/llm-client.js +119 -0
  54. package/dist/src/clients/rest-client.js +104 -0
  55. package/dist/src/clients/service-discovery.js +35 -0
  56. package/dist/src/clients/terraform-client.js +302 -0
  57. package/dist/src/clients/tools-client.js +1227 -0
  58. package/dist/src/clients/ws-client.js +93 -0
  59. package/dist/src/commands/alias.js +91 -0
  60. package/dist/src/commands/analyze/index.js +313 -0
  61. package/dist/src/commands/apply/helm.js +375 -0
  62. package/dist/src/commands/apply/index.js +176 -0
  63. package/dist/src/commands/apply/k8s.js +350 -0
  64. package/dist/src/commands/apply/terraform.js +465 -0
  65. package/dist/src/commands/ask.js +137 -0
  66. package/dist/src/commands/audit/index.js +322 -0
  67. package/dist/src/commands/auth-cloud.js +345 -0
  68. package/dist/src/commands/auth-list.js +112 -0
  69. package/dist/src/commands/auth-profile.js +104 -0
  70. package/dist/src/commands/auth-refresh.js +161 -0
  71. package/dist/src/commands/auth-status.js +122 -0
  72. package/dist/src/commands/aws/ec2.js +402 -0
  73. package/dist/src/commands/aws/iam.js +304 -0
  74. package/dist/src/commands/aws/index.js +108 -0
  75. package/dist/src/commands/aws/lambda.js +317 -0
  76. package/dist/src/commands/aws/rds.js +345 -0
  77. package/dist/src/commands/aws/s3.js +346 -0
  78. package/dist/src/commands/aws/vpc.js +302 -0
  79. package/dist/src/commands/aws-discover.js +413 -0
  80. package/dist/src/commands/aws-terraform.js +618 -0
  81. package/dist/src/commands/azure/aks.js +305 -0
  82. package/dist/src/commands/azure/functions.js +200 -0
  83. package/dist/src/commands/azure/index.js +93 -0
  84. package/dist/src/commands/azure/storage.js +378 -0
  85. package/dist/src/commands/azure/vm.js +291 -0
  86. package/dist/src/commands/billing/index.js +224 -0
  87. package/dist/src/commands/chat.js +259 -0
  88. package/dist/src/commands/completions.js +255 -0
  89. package/dist/src/commands/config.js +291 -0
  90. package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
  91. package/dist/src/commands/cost/estimator.js +73 -0
  92. package/dist/src/commands/cost/index.js +625 -0
  93. package/dist/src/commands/cost/parsers/terraform.js +234 -0
  94. package/dist/src/commands/cost/parsers/types.js +4 -0
  95. package/dist/src/commands/cost/pricing/aws.js +501 -0
  96. package/dist/src/commands/cost/pricing/azure.js +462 -0
  97. package/dist/src/commands/cost/pricing/gcp.js +359 -0
  98. package/dist/src/commands/cost/pricing/index.js +24 -0
  99. package/dist/src/commands/demo.js +196 -0
  100. package/dist/src/commands/deploy.js +215 -0
  101. package/dist/src/commands/doctor.js +1291 -0
  102. package/dist/src/commands/drift/index.js +674 -0
  103. package/dist/src/commands/explain.js +235 -0
  104. package/dist/src/commands/export.js +120 -0
  105. package/dist/src/commands/feedback.js +319 -0
  106. package/dist/src/commands/fix.js +263 -0
  107. package/dist/src/commands/fs/index.js +338 -0
  108. package/dist/src/commands/gcp/compute.js +266 -0
  109. package/dist/src/commands/gcp/functions.js +221 -0
  110. package/dist/src/commands/gcp/gke.js +357 -0
  111. package/dist/src/commands/gcp/iam.js +295 -0
  112. package/dist/src/commands/gcp/index.js +105 -0
  113. package/dist/src/commands/gcp/storage.js +232 -0
  114. package/dist/src/commands/generate-helm.js +1026 -0
  115. package/dist/src/commands/generate-k8s.js +1263 -0
  116. package/dist/src/commands/generate-terraform.js +1058 -0
  117. package/dist/src/commands/gh/index.js +663 -0
  118. package/dist/src/commands/git/index.js +1208 -0
  119. package/dist/src/commands/helm/index.js +985 -0
  120. package/dist/src/commands/help.js +639 -0
  121. package/dist/src/commands/history.js +120 -0
  122. package/dist/src/commands/import.js +782 -0
  123. package/dist/src/commands/incident.js +144 -0
  124. package/dist/src/commands/index.js +109 -0
  125. package/dist/src/commands/init.js +955 -0
  126. package/dist/src/commands/k8s/index.js +979 -0
  127. package/dist/src/commands/login.js +588 -0
  128. package/dist/src/commands/logout.js +61 -0
  129. package/dist/src/commands/logs.js +160 -0
  130. package/dist/src/commands/onboarding.js +382 -0
  131. package/dist/src/commands/pipeline.js +153 -0
  132. package/dist/src/commands/plan/display.js +216 -0
  133. package/dist/src/commands/plan/index.js +525 -0
  134. package/dist/src/commands/plugin.js +325 -0
  135. package/dist/src/commands/preview.js +356 -0
  136. package/dist/src/commands/profile.js +297 -0
  137. package/dist/src/commands/questionnaire.js +1021 -0
  138. package/dist/src/commands/resume.js +35 -0
  139. package/dist/src/commands/rollback.js +259 -0
  140. package/dist/src/commands/rollout.js +74 -0
  141. package/dist/src/commands/runbook.js +307 -0
  142. package/dist/src/commands/schedule.js +202 -0
  143. package/dist/src/commands/status.js +213 -0
  144. package/dist/src/commands/team/index.js +309 -0
  145. package/dist/src/commands/team-context.js +200 -0
  146. package/dist/src/commands/template.js +204 -0
  147. package/dist/src/commands/tf/index.js +989 -0
  148. package/dist/src/commands/upgrade.js +515 -0
  149. package/dist/src/commands/usage/index.js +118 -0
  150. package/dist/src/commands/version.js +145 -0
  151. package/dist/src/commands/watch.js +127 -0
  152. package/dist/src/compat/index.js +2 -0
  153. package/dist/src/compat/runtime.js +10 -0
  154. package/dist/src/compat/sqlite.js +144 -0
  155. package/dist/src/config/index.js +6 -0
  156. package/dist/src/config/manager.js +469 -0
  157. package/dist/src/config/mode-store.js +57 -0
  158. package/dist/src/config/profiles.js +66 -0
  159. package/dist/src/config/safety-policy.js +251 -0
  160. package/dist/src/config/schema.js +107 -0
  161. package/dist/src/config/types.js +311 -0
  162. package/dist/src/config/workspace-state.js +38 -0
  163. package/dist/src/context/context-db.js +138 -0
  164. package/dist/src/demo/index.js +295 -0
  165. package/dist/src/demo/scenarios/full-journey.js +226 -0
  166. package/dist/src/demo/scenarios/getting-started.js +124 -0
  167. package/dist/src/demo/scenarios/helm-release.js +334 -0
  168. package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
  169. package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
  170. package/dist/src/demo/types.js +6 -0
  171. package/dist/src/engine/cost-estimator.js +334 -0
  172. package/dist/src/engine/diagram-generator.js +192 -0
  173. package/dist/src/engine/drift-detector.js +688 -0
  174. package/dist/src/engine/executor.js +832 -0
  175. package/dist/src/engine/index.js +39 -0
  176. package/dist/src/engine/orchestrator.js +436 -0
  177. package/dist/src/engine/planner.js +616 -0
  178. package/dist/src/engine/safety.js +609 -0
  179. package/dist/src/engine/verifier.js +664 -0
  180. package/dist/src/enterprise/audit.js +241 -0
  181. package/dist/src/enterprise/auth.js +189 -0
  182. package/dist/src/enterprise/billing.js +512 -0
  183. package/dist/src/enterprise/index.js +16 -0
  184. package/dist/src/enterprise/teams.js +315 -0
  185. package/dist/src/generator/best-practices.js +1375 -0
  186. package/dist/src/generator/helm.js +495 -0
  187. package/dist/src/generator/index.js +11 -0
  188. package/dist/src/generator/intent-parser.js +420 -0
  189. package/dist/src/generator/kubernetes.js +773 -0
  190. package/dist/src/generator/terraform.js +1472 -0
  191. package/dist/src/history/index.js +6 -0
  192. package/dist/src/history/manager.js +199 -0
  193. package/dist/src/history/types.js +6 -0
  194. package/dist/src/hooks/config.js +318 -0
  195. package/dist/src/hooks/engine.js +317 -0
  196. package/dist/src/hooks/index.js +2 -0
  197. package/dist/src/llm/auth-bridge.js +157 -0
  198. package/dist/src/llm/circuit-breaker.js +116 -0
  199. package/dist/src/llm/config-loader.js +172 -0
  200. package/dist/src/llm/cost-calculator.js +137 -0
  201. package/dist/src/llm/index.js +7 -0
  202. package/dist/src/llm/model-aliases.js +99 -0
  203. package/dist/src/llm/provider-registry.js +57 -0
  204. package/dist/src/llm/providers/anthropic.js +430 -0
  205. package/dist/src/llm/providers/bedrock.js +409 -0
  206. package/dist/src/llm/providers/google.js +344 -0
  207. package/dist/src/llm/providers/ollama.js +661 -0
  208. package/dist/src/llm/providers/openai-compatible.js +289 -0
  209. package/dist/src/llm/providers/openai.js +284 -0
  210. package/dist/src/llm/providers/openrouter.js +293 -0
  211. package/dist/src/llm/router.js +844 -0
  212. package/dist/src/llm/types.js +69 -0
  213. package/dist/src/lsp/client.js +239 -0
  214. package/dist/src/lsp/languages.js +95 -0
  215. package/dist/src/lsp/manager.js +243 -0
  216. package/dist/src/mcp/client.js +289 -0
  217. package/dist/src/mcp/index.js +5 -0
  218. package/dist/src/mcp/manager.js +113 -0
  219. package/dist/src/nimbus.js +212 -0
  220. package/dist/src/plugins/index.js +13 -0
  221. package/dist/src/plugins/loader.js +280 -0
  222. package/dist/src/plugins/manager.js +282 -0
  223. package/dist/src/plugins/types.js +23 -0
  224. package/dist/src/scanners/cicd-scanner.js +230 -0
  225. package/dist/src/scanners/cloud-scanner.js +415 -0
  226. package/dist/src/scanners/framework-scanner.js +430 -0
  227. package/dist/src/scanners/iac-scanner.js +350 -0
  228. package/dist/src/scanners/index.js +454 -0
  229. package/dist/src/scanners/language-scanner.js +258 -0
  230. package/dist/src/scanners/package-manager-scanner.js +252 -0
  231. package/dist/src/scanners/types.js +6 -0
  232. package/dist/src/sessions/manager.js +395 -0
  233. package/dist/src/sessions/types.js +4 -0
  234. package/dist/src/sharing/sync.js +238 -0
  235. package/dist/src/sharing/viewer.js +131 -0
  236. package/dist/src/snapshots/index.js +1 -0
  237. package/dist/src/snapshots/manager.js +432 -0
  238. package/dist/src/state/artifacts.js +94 -0
  239. package/dist/src/state/audit.js +73 -0
  240. package/dist/src/state/billing.js +126 -0
  241. package/dist/src/state/checkpoints.js +81 -0
  242. package/dist/src/state/config.js +58 -0
  243. package/dist/src/state/conversations.js +7 -0
  244. package/dist/src/state/credentials.js +96 -0
  245. package/dist/src/state/db.js +53 -0
  246. package/dist/src/state/index.js +23 -0
  247. package/dist/src/state/messages.js +76 -0
  248. package/dist/src/state/projects.js +92 -0
  249. package/dist/src/state/schema.js +233 -0
  250. package/dist/src/state/sessions.js +79 -0
  251. package/dist/src/state/teams.js +131 -0
  252. package/dist/src/telemetry.js +91 -0
  253. package/dist/src/tools/aws-ops.js +747 -0
  254. package/dist/src/tools/azure-ops.js +491 -0
  255. package/dist/src/tools/file-ops.js +451 -0
  256. package/dist/src/tools/gcp-ops.js +559 -0
  257. package/dist/src/tools/git-ops.js +557 -0
  258. package/dist/src/tools/github-ops.js +460 -0
  259. package/dist/src/tools/helm-ops.js +634 -0
  260. package/dist/src/tools/index.js +16 -0
  261. package/dist/src/tools/k8s-ops.js +579 -0
  262. package/dist/src/tools/schemas/converter.js +129 -0
  263. package/dist/src/tools/schemas/devops.js +3319 -0
  264. package/dist/src/tools/schemas/index.js +19 -0
  265. package/dist/src/tools/schemas/standard.js +966 -0
  266. package/dist/src/tools/schemas/types.js +409 -0
  267. package/dist/src/tools/spawn-exec.js +109 -0
  268. package/dist/src/tools/terraform-ops.js +627 -0
  269. package/dist/src/types/config.js +1 -0
  270. package/dist/src/types/drift.js +4 -0
  271. package/dist/src/types/enterprise.js +5 -0
  272. package/dist/src/types/index.js +14 -0
  273. package/dist/src/types/plan.js +1 -0
  274. package/dist/src/types/request.js +1 -0
  275. package/dist/src/types/response.js +1 -0
  276. package/dist/src/types/service.js +1 -0
  277. package/dist/src/ui/App.js +1672 -0
  278. package/dist/src/ui/DeployPreview.js +60 -0
  279. package/dist/src/ui/FileDiffModal.js +108 -0
  280. package/dist/src/ui/Header.js +46 -0
  281. package/dist/src/ui/HelpModal.js +9 -0
  282. package/dist/src/ui/InputBox.js +408 -0
  283. package/dist/src/ui/MessageList.js +795 -0
  284. package/dist/src/ui/PermissionPrompt.js +72 -0
  285. package/dist/src/ui/StatusBar.js +109 -0
  286. package/dist/src/ui/TerminalPane.js +31 -0
  287. package/dist/src/ui/ToolCallDisplay.js +303 -0
  288. package/dist/src/ui/TreePane.js +83 -0
  289. package/dist/src/ui/chat-ui.js +721 -0
  290. package/dist/src/ui/index.js +11 -0
  291. package/dist/src/ui/ink/index.js +1325 -0
  292. package/dist/src/ui/streaming.js +137 -0
  293. package/dist/src/ui/theme.js +78 -0
  294. package/dist/src/ui/types.js +7 -0
  295. package/dist/src/utils/analytics.js +61 -0
  296. package/dist/src/utils/cost-warning.js +25 -0
  297. package/dist/src/utils/env.js +42 -0
  298. package/dist/src/utils/errors.js +54 -0
  299. package/dist/src/utils/event-bus.js +22 -0
  300. package/dist/src/utils/index.js +16 -0
  301. package/dist/src/utils/logger.js +150 -0
  302. package/dist/src/utils/rate-limiter.js +90 -0
  303. package/dist/src/utils/service-auth.js +36 -0
  304. package/dist/src/utils/validation.js +39 -0
  305. package/dist/src/version.js +3 -0
  306. package/dist/src/watcher/index.js +192 -0
  307. package/dist/src/wizard/approval.js +275 -0
  308. package/dist/src/wizard/index.js +13 -0
  309. package/dist/src/wizard/prompts.js +273 -0
  310. package/dist/src/wizard/types.js +4 -0
  311. package/dist/src/wizard/ui.js +453 -0
  312. package/dist/src/wizard/wizard.js +227 -0
  313. package/package.json +22 -15
  314. package/src/__tests__/alias.test.ts +133 -0
  315. package/src/__tests__/cli-run.test.ts +237 -1
  316. package/src/__tests__/compat-sqlite.test.ts +68 -0
  317. package/src/__tests__/context-manager.test.ts +130 -0
  318. package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
  319. package/src/__tests__/doctor.test.ts +48 -0
  320. package/src/__tests__/export.test.ts +236 -0
  321. package/src/__tests__/gap-11-18-20.test.ts +958 -0
  322. package/src/__tests__/helm-streaming.test.ts +127 -0
  323. package/src/__tests__/incident.test.ts +179 -0
  324. package/src/__tests__/init.test.ts +54 -3
  325. package/src/__tests__/logs.test.ts +107 -0
  326. package/src/__tests__/loop-errors.test.ts +244 -0
  327. package/src/__tests__/perf-optimizations.test.ts +847 -0
  328. package/src/__tests__/pipeline.test.ts +50 -0
  329. package/src/__tests__/polish-phase3.test.ts +340 -0
  330. package/src/__tests__/profile.test.ts +237 -0
  331. package/src/__tests__/rollback.test.ts +83 -0
  332. package/src/__tests__/runbook.test.ts +219 -0
  333. package/src/__tests__/schedule.test.ts +206 -0
  334. package/src/__tests__/sessions.test.ts +95 -0
  335. package/src/__tests__/standalone-migration.test.ts +199 -0
  336. package/src/__tests__/status.test.ts +158 -0
  337. package/src/__tests__/stream-with-tools.test.ts +49 -1
  338. package/src/__tests__/system-prompt.test.ts +81 -2
  339. package/src/__tests__/terminal-gap-v2.test.ts +395 -0
  340. package/src/__tests__/terminal-parity.test.ts +393 -0
  341. package/src/__tests__/tf-apply.test.ts +187 -0
  342. package/src/__tests__/tool-schemas.test.ts +209 -4
  343. package/src/__tests__/version-json.test.ts +184 -0
  344. package/src/__tests__/watch.test.ts +129 -0
  345. package/src/agent/compaction-agent.ts +40 -1
  346. package/src/agent/context-manager.ts +67 -3
  347. package/src/agent/deploy-preview.ts +62 -1
  348. package/src/agent/expand-files.ts +108 -0
  349. package/src/agent/loop.ts +1312 -31
  350. package/src/agent/permissions.ts +51 -4
  351. package/src/agent/system-prompt.ts +573 -19
  352. package/src/app.ts +58 -0
  353. package/src/audit/security-scanner.ts +45 -0
  354. package/src/auth/keychain.ts +82 -0
  355. package/src/cli/init.ts +378 -5
  356. package/src/cli/run.ts +407 -16
  357. package/src/cli/serve.ts +78 -1
  358. package/src/cli/web.ts +10 -6
  359. package/src/cli.ts +312 -1
  360. package/src/clients/service-discovery.ts +30 -25
  361. package/src/commands/alias.ts +100 -0
  362. package/src/commands/audit/index.ts +121 -2
  363. package/src/commands/auth-cloud.ts +113 -0
  364. package/src/commands/auth-refresh.ts +187 -0
  365. package/src/commands/aws-discover.ts +144 -251
  366. package/src/commands/aws-terraform.ts +68 -118
  367. package/src/commands/chat.ts +9 -3
  368. package/src/commands/completions.ts +268 -0
  369. package/src/commands/config.ts +26 -0
  370. package/src/commands/cost/index.ts +218 -2
  371. package/src/commands/deploy.ts +260 -0
  372. package/src/commands/doctor.ts +744 -152
  373. package/src/commands/drift/index.ts +371 -23
  374. package/src/commands/export.ts +146 -0
  375. package/src/commands/generate-k8s.ts +9 -61
  376. package/src/commands/generate-terraform.ts +191 -449
  377. package/src/commands/help.ts +212 -36
  378. package/src/commands/history.ts +8 -1
  379. package/src/commands/incident.ts +166 -0
  380. package/src/commands/init.ts +5 -0
  381. package/src/commands/login.ts +86 -1
  382. package/src/commands/logs.ts +167 -0
  383. package/src/commands/onboarding.ts +211 -34
  384. package/src/commands/pipeline.ts +186 -0
  385. package/src/commands/plugin.ts +398 -0
  386. package/src/commands/profile.ts +342 -0
  387. package/src/commands/questionnaire.ts +0 -98
  388. package/src/commands/resume.ts +26 -34
  389. package/src/commands/rollback.ts +315 -0
  390. package/src/commands/rollout.ts +88 -0
  391. package/src/commands/runbook.ts +346 -0
  392. package/src/commands/schedule.ts +236 -0
  393. package/src/commands/status.ts +252 -0
  394. package/src/commands/team-context.ts +220 -0
  395. package/src/commands/template.ts +58 -57
  396. package/src/commands/tf/index.ts +70 -11
  397. package/src/commands/upgrade.ts +57 -0
  398. package/src/commands/version.ts +54 -50
  399. package/src/commands/watch.ts +153 -0
  400. package/src/compat/sqlite.ts +75 -5
  401. package/src/config/mode-store.ts +62 -0
  402. package/src/config/profiles.ts +84 -0
  403. package/src/config/types.ts +83 -1
  404. package/src/config/workspace-state.ts +53 -0
  405. package/src/engine/cost-estimator.ts +52 -10
  406. package/src/engine/executor.ts +33 -2
  407. package/src/engine/planner.ts +68 -1
  408. package/src/generator/terraform.ts +8 -0
  409. package/src/history/manager.ts +2 -74
  410. package/src/llm/cost-calculator.ts +2 -2
  411. package/src/llm/providers/anthropic.ts +50 -21
  412. package/src/llm/router.ts +76 -7
  413. package/src/lsp/languages.ts +3 -0
  414. package/src/lsp/manager.ts +20 -4
  415. package/src/nimbus.ts +34 -1
  416. package/src/sessions/manager.ts +108 -1
  417. package/src/sharing/viewer.ts +66 -0
  418. package/src/tools/file-ops.ts +22 -0
  419. package/src/tools/schemas/devops.ts +3007 -117
  420. package/src/tools/schemas/standard.ts +5 -1
  421. package/src/tools/schemas/types.ts +31 -1
  422. package/src/tools/spawn-exec.ts +148 -0
  423. package/src/ui/App.tsx +1183 -66
  424. package/src/ui/DeployPreview.tsx +62 -57
  425. package/src/ui/FileDiffModal.tsx +162 -0
  426. package/src/ui/Header.tsx +87 -24
  427. package/src/ui/HelpModal.tsx +57 -0
  428. package/src/ui/InputBox.tsx +163 -10
  429. package/src/ui/MessageList.tsx +487 -40
  430. package/src/ui/PermissionPrompt.tsx +17 -5
  431. package/src/ui/StatusBar.tsx +122 -3
  432. package/src/ui/TerminalPane.tsx +84 -0
  433. package/src/ui/ToolCallDisplay.tsx +252 -18
  434. package/src/ui/TreePane.tsx +132 -0
  435. package/src/ui/chat-ui.ts +41 -44
  436. package/src/ui/ink/index.ts +771 -38
  437. package/src/ui/theme.ts +104 -0
  438. package/src/ui/types.ts +18 -0
  439. package/src/version.ts +1 -1
  440. package/src/watcher/index.ts +66 -15
  441. package/src/wizard/types.ts +1 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Schedule Command (G13)
3
+ *
4
+ * Manage periodic DevOps automation tasks (drift checks, cert expiry,
5
+ * cost reports) via a local schedule file.
6
+ *
7
+ * Usage:
8
+ * nimbus schedule list
9
+ * nimbus schedule add "0 8 * * *" "check for infra drift" [--name daily-drift]
10
+ * nimbus schedule remove <id-or-name>
11
+ * nimbus schedule run-now <id-or-name>
12
+ */
13
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { homedir } from 'node:os';
16
+ import { randomBytes } from 'node:crypto';
17
+ // ---------------------------------------------------------------------------
18
+ // Storage
19
+ // ---------------------------------------------------------------------------
20
+ const SCHEDULE_FILE = join(homedir(), '.nimbus', 'schedules.json');
21
+ function loadSchedules() {
22
+ if (!existsSync(SCHEDULE_FILE))
23
+ return [];
24
+ try {
25
+ return JSON.parse(readFileSync(SCHEDULE_FILE, 'utf-8'));
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ function saveSchedules(schedules) {
32
+ mkdirSync(join(homedir(), '.nimbus'), { recursive: true });
33
+ writeFileSync(SCHEDULE_FILE, JSON.stringify(schedules, null, 2), 'utf-8');
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Cron validation (5-field: min hour dom month dow)
37
+ // ---------------------------------------------------------------------------
38
+ function isValidCron(cron) {
39
+ const parts = cron.trim().split(/\s+/);
40
+ if (parts.length !== 5)
41
+ return false;
42
+ const validPart = /^(\*|\d+(-\d+)?(\/\d+)?)(,(\*|\d+(-\d+)?(\/\d+)?))*$/;
43
+ return parts.every(p => validPart.test(p));
44
+ }
45
+ /**
46
+ * Estimate next run time in human-readable form (best-effort).
47
+ */
48
+ function describeNextRun(cron) {
49
+ const [min, hour, dom, month, dow] = cron.split(/\s+/);
50
+ if (hour === '*' && min === '0')
51
+ return 'every hour at :00';
52
+ if (dom === '*' && month === '*' && dow === '*') {
53
+ if (hour !== '*' && min !== '*')
54
+ return `daily at ${hour}:${min.padStart(2, '0')}`;
55
+ }
56
+ if (dow !== '*') {
57
+ const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
58
+ const dayName = days[parseInt(dow, 10)];
59
+ if (dayName && hour !== '*')
60
+ return `weekly on ${dayName} at ${hour}:${(min ?? '0').padStart(2, '0')}`;
61
+ }
62
+ return `cron: ${cron}`;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Subcommands
66
+ // ---------------------------------------------------------------------------
67
+ function scheduleList() {
68
+ const schedules = loadSchedules();
69
+ if (schedules.length === 0) {
70
+ console.log('No schedules configured.');
71
+ console.log('\nAdd one with:');
72
+ console.log(' nimbus schedule add "0 8 * * *" "check for infrastructure drift" --name daily-drift');
73
+ return;
74
+ }
75
+ console.log('Configured schedules:\n');
76
+ for (const s of schedules) {
77
+ console.log(` ID: ${s.id}`);
78
+ console.log(` Name: ${s.name}`);
79
+ console.log(` Runs: ${describeNextRun(s.cron)} (${s.cron})`);
80
+ console.log(` Prompt: ${s.prompt.slice(0, 80)}${s.prompt.length > 80 ? '...' : ''}`);
81
+ console.log('');
82
+ }
83
+ console.log('To activate, add to crontab (crontab -e):');
84
+ for (const s of schedules) {
85
+ console.log(` ${s.cron} nimbus schedule run-now ${s.id}`);
86
+ }
87
+ }
88
+ function scheduleAdd(cron, prompt, name) {
89
+ if (!cron || !prompt) {
90
+ console.error('Usage: nimbus schedule add "<cron>" "<prompt>" [--name <name>]');
91
+ process.exit(1);
92
+ }
93
+ if (!isValidCron(cron)) {
94
+ console.error(`Invalid cron expression: "${cron}"`);
95
+ console.error('Expected 5 fields: min hour day-of-month month day-of-week');
96
+ console.error('Example: "0 8 * * *" (daily at 8am)');
97
+ process.exit(1);
98
+ }
99
+ const schedules = loadSchedules();
100
+ const id = randomBytes(4).toString('hex');
101
+ const entryName = name ?? `schedule-${id}`;
102
+ const entry = {
103
+ id,
104
+ name: entryName,
105
+ cron,
106
+ prompt,
107
+ createdAt: new Date().toISOString(),
108
+ };
109
+ schedules.push(entry);
110
+ saveSchedules(schedules);
111
+ console.log(`Schedule added: ${entryName} (ID: ${id})`);
112
+ console.log(`Runs: ${describeNextRun(cron)}`);
113
+ console.log('');
114
+ console.log('To activate, add to crontab (crontab -e):');
115
+ console.log(` ${cron} nimbus schedule run-now ${id}`);
116
+ }
117
+ function scheduleRemove(idOrName) {
118
+ const schedules = loadSchedules();
119
+ const idx = schedules.findIndex(s => s.id === idOrName || s.name === idOrName);
120
+ if (idx === -1) {
121
+ console.error(`Schedule not found: ${idOrName}`);
122
+ process.exit(1);
123
+ }
124
+ const removed = schedules.splice(idx, 1)[0];
125
+ saveSchedules(schedules);
126
+ console.log(`Removed schedule: ${removed.name} (${removed.id})`);
127
+ }
128
+ async function scheduleRunNow(idOrName) {
129
+ const schedules = loadSchedules();
130
+ const entry = schedules.find(s => s.id === idOrName || s.name === idOrName);
131
+ if (!entry) {
132
+ console.error(`Schedule not found: ${idOrName}`);
133
+ process.exit(1);
134
+ }
135
+ console.log(`Running schedule: ${entry.name}`);
136
+ console.log(`Prompt: ${entry.prompt}`);
137
+ console.log('');
138
+ const { executeRun, parseRunArgs } = await import('../cli/run');
139
+ const { getAppContext } = await import('../app');
140
+ const ctx = getAppContext();
141
+ if (!ctx) {
142
+ console.error('Error: App not initialised. Make sure credentials are configured.');
143
+ process.exit(1);
144
+ }
145
+ const runOptions = parseRunArgs(['--auto-approve', '--mode', 'build', entry.prompt]);
146
+ await executeRun(ctx.router, runOptions);
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // Main export
150
+ // ---------------------------------------------------------------------------
151
+ export async function scheduleCommand(subcommand, args) {
152
+ switch (subcommand) {
153
+ case 'list':
154
+ case 'ls':
155
+ scheduleList();
156
+ break;
157
+ case 'add': {
158
+ // nimbus schedule add "<cron>" "<prompt>" [--name <name>]
159
+ const cron = args[0] ?? '';
160
+ const prompt = args[1] ?? '';
161
+ const nameIdx = args.indexOf('--name');
162
+ const name = nameIdx !== -1 ? args[nameIdx + 1] : undefined;
163
+ scheduleAdd(cron, prompt, name);
164
+ break;
165
+ }
166
+ case 'remove':
167
+ case 'rm':
168
+ case 'delete': {
169
+ const idOrName = args[0];
170
+ if (!idOrName) {
171
+ console.error('Usage: nimbus schedule remove <id-or-name>');
172
+ process.exit(1);
173
+ }
174
+ scheduleRemove(idOrName);
175
+ break;
176
+ }
177
+ case 'run-now':
178
+ case 'run': {
179
+ const idOrName = args[0];
180
+ if (!idOrName) {
181
+ console.error('Usage: nimbus schedule run-now <id-or-name>');
182
+ process.exit(1);
183
+ }
184
+ await scheduleRunNow(idOrName);
185
+ break;
186
+ }
187
+ default:
188
+ console.log('Usage: nimbus schedule <list|add|remove|run-now>');
189
+ console.log('');
190
+ console.log(' list List configured schedules');
191
+ console.log(' add "<cron>" "<prompt>" Add a new schedule');
192
+ console.log(' remove <id-or-name> Remove a schedule');
193
+ console.log(' run-now <id-or-name> Execute a schedule immediately');
194
+ console.log('');
195
+ console.log('Examples:');
196
+ console.log(' nimbus schedule add "0 8 * * *" "check for infrastructure drift" --name daily-drift');
197
+ console.log(' nimbus schedule add "0 9 * * 1" "generate weekly cost report"');
198
+ console.log(' nimbus schedule list');
199
+ console.log(' nimbus schedule run-now daily-drift');
200
+ break;
201
+ }
202
+ }
@@ -0,0 +1,213 @@
1
+ /**
2
+ * nimbus status — Infrastructure Status Dashboard
3
+ *
4
+ * Runs concurrent checks against common DevOps CLIs and shows a dashboard
5
+ * of the current cloud/infra context.
6
+ *
7
+ * G18: New command added to the gap fix plan.
8
+ *
9
+ * Usage:
10
+ * nimbus status
11
+ * nimbus status --json
12
+ */
13
+ import { ui } from '../wizard';
14
+ /**
15
+ * Run the nimbus status command.
16
+ * Checks k8s context, tf workspace, AWS identity, and GCP project concurrently.
17
+ */
18
+ export async function statusCommand(options = {}) {
19
+ const { execFileSync } = await import('node:child_process');
20
+ const { existsSync, statSync, readFileSync } = await import('node:fs');
21
+ const { join } = await import('node:path');
22
+ const { homedir } = await import('node:os');
23
+ const info = { errors: [] };
24
+ const run = (cmd, args) => {
25
+ try {
26
+ return execFileSync(cmd, args, {
27
+ encoding: 'utf-8',
28
+ timeout: 8000,
29
+ stdio: ['pipe', 'pipe', 'pipe'],
30
+ }).trim();
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ };
36
+ // Run all checks concurrently (M1: add helm + pod health)
37
+ const [k8sCtx, tfWs, awsIdentityRaw, gcpProject, helmListRaw, podUnhealthyRaw] = await Promise.allSettled([
38
+ Promise.resolve(run('kubectl', ['config', 'current-context'])),
39
+ Promise.resolve(run('terraform', ['workspace', 'show'])),
40
+ Promise.resolve(run('aws', ['sts', 'get-caller-identity', '--output', 'json'])),
41
+ Promise.resolve(run('gcloud', ['config', 'get-value', 'project'])),
42
+ Promise.resolve(run('helm', ['list', '-A', '--output', 'json'])),
43
+ Promise.resolve(run('kubectl', ['get', 'pods', '-A', '--field-selector=status.phase!=Running', '--no-headers'])),
44
+ ]);
45
+ if (k8sCtx.status === 'fulfilled' && k8sCtx.value) {
46
+ info.k8sContext = k8sCtx.value;
47
+ }
48
+ if (tfWs.status === 'fulfilled' && tfWs.value) {
49
+ info.tfWorkspace = tfWs.value;
50
+ }
51
+ if (awsIdentityRaw.status === 'fulfilled' && awsIdentityRaw.value) {
52
+ try {
53
+ const identity = JSON.parse(awsIdentityRaw.value);
54
+ info.awsAccount = identity.Account;
55
+ // Try to get region separately
56
+ const region = run('aws', ['configure', 'get', 'region']);
57
+ if (region)
58
+ info.awsRegion = region;
59
+ }
60
+ catch {
61
+ // Could not parse AWS identity
62
+ }
63
+ }
64
+ if (gcpProject.status === 'fulfilled' && gcpProject.value && gcpProject.value !== '(unset)') {
65
+ info.gcpProject = gcpProject.value;
66
+ }
67
+ // M1: Parse helm release health
68
+ if (helmListRaw.status === 'fulfilled' && helmListRaw.value) {
69
+ try {
70
+ const releases = JSON.parse(helmListRaw.value);
71
+ info.helmTotalCount = releases.length;
72
+ info.helmFailedCount = releases.filter(r => r.status !== 'deployed').length;
73
+ }
74
+ catch { /* non-critical */ }
75
+ }
76
+ // M1: Parse unhealthy pod count
77
+ if (podUnhealthyRaw.status === 'fulfilled' && podUnhealthyRaw.value) {
78
+ const lines = podUnhealthyRaw.value.trim().split('\n').filter(Boolean);
79
+ info.unhealthyPodCount = lines.length;
80
+ }
81
+ // Check last drift scan from SQLite + session count
82
+ try {
83
+ const { getDb } = await import('../state/db');
84
+ const db = getDb();
85
+ const row = db.prepare(`
86
+ SELECT created_at FROM sessions
87
+ ORDER BY created_at DESC LIMIT 1
88
+ `).get();
89
+ if (row?.created_at) {
90
+ info.lastDriftScan = row.created_at;
91
+ }
92
+ // C2: Count sessions
93
+ const countRow = db.prepare('SELECT COUNT(*) as cnt FROM sessions').get();
94
+ info.sessionCount = countRow?.cnt ?? 0;
95
+ }
96
+ catch {
97
+ // DB not available
98
+ info.sessionCount = 'N/A';
99
+ }
100
+ // C2: Read model and provider from ~/.nimbus/config.json
101
+ const configJsonPath = join(homedir(), '.nimbus', 'config.json');
102
+ try {
103
+ if (existsSync(configJsonPath)) {
104
+ const configRaw = readFileSync(configJsonPath, 'utf-8');
105
+ const config = JSON.parse(configRaw);
106
+ info.model = typeof config.model === 'string' ? config.model : 'claude-sonnet-4-6';
107
+ info.provider = typeof config.provider === 'string' ? config.provider : 'anthropic';
108
+ }
109
+ else {
110
+ info.model = 'claude-sonnet-4-6';
111
+ info.provider = 'anthropic';
112
+ }
113
+ }
114
+ catch {
115
+ info.model = 'claude-sonnet-4-6';
116
+ info.provider = 'anthropic';
117
+ }
118
+ // C2: Check NIMBUS.md in cwd
119
+ const nimbusMdPaths = [
120
+ join(process.cwd(), 'NIMBUS.md'),
121
+ join(process.cwd(), '.nimbus', 'NIMBUS.md'),
122
+ ];
123
+ for (const p of nimbusMdPaths) {
124
+ try {
125
+ if (existsSync(p)) {
126
+ const stat = statSync(p);
127
+ info.nimbusMdFound = true;
128
+ info.nimbusMdSize = stat.size;
129
+ break;
130
+ }
131
+ }
132
+ catch { /* skip */ }
133
+ }
134
+ // C2: Get DB file size
135
+ const dbPath = join(homedir(), '.nimbus', 'nimbus.db');
136
+ try {
137
+ if (existsSync(dbPath)) {
138
+ const stat = statSync(dbPath);
139
+ info.dbSizeMB = Math.round((stat.size / (1024 * 1024)) * 10) / 10;
140
+ }
141
+ }
142
+ catch { /* skip */ }
143
+ if (options.json) {
144
+ console.log(JSON.stringify(info, null, 2));
145
+ return;
146
+ }
147
+ // Pretty-print dashboard
148
+ // Build session line
149
+ const sessionLine = typeof info.sessionCount === 'number'
150
+ ? `${info.sessionCount} sessions`
151
+ : 'N/A';
152
+ // Build NIMBUS.md line
153
+ const nimbusMdLine = info.nimbusMdFound && info.nimbusMdSize !== undefined
154
+ ? ` loaded (${info.nimbusMdSize >= 1024
155
+ ? `${(info.nimbusMdSize / 1024).toFixed(1)}KB`
156
+ : `${info.nimbusMdSize}B`})`
157
+ : ' not found';
158
+ // Build DB size line
159
+ const dbLine = info.dbSizeMB !== undefined
160
+ ? `~/.nimbus/nimbus.db (${info.dbSizeMB}MB)`
161
+ : '~/.nimbus/nimbus.db (not found)';
162
+ ui.newLine();
163
+ ui.box({
164
+ title: 'Nimbus Infrastructure Status',
165
+ content: [
166
+ '',
167
+ ` Session: ${sessionLine}`,
168
+ ` Model: ${info.model ?? 'claude-sonnet-4-6'}`,
169
+ ` Provider: ${info.provider ?? 'anthropic'} \u2713`,
170
+ '',
171
+ ' Infrastructure:',
172
+ info.k8sContext
173
+ ? ` Kubernetes: context=${info.k8sContext}`
174
+ : ' Kubernetes: (not configured)',
175
+ info.tfWorkspace
176
+ ? ` Terraform: workspace=${info.tfWorkspace} \u2713 initialized`
177
+ : ' Terraform: (not in a terraform directory)',
178
+ info.awsAccount
179
+ ? ` AWS: account=${info.awsAccount}${info.awsRegion ? ` region=${info.awsRegion}` : ''}`
180
+ : ' AWS: (not configured)',
181
+ info.gcpProject
182
+ ? ` GCP: project=${info.gcpProject}`
183
+ : '',
184
+ // M1: Helm release health
185
+ ...(info.helmTotalCount !== undefined
186
+ ? [
187
+ info.helmFailedCount && info.helmFailedCount > 0
188
+ ? ` [!] ${info.helmFailedCount} Helm release(s) in failed state (${info.helmTotalCount} total)`
189
+ : ` Helm: ${info.helmTotalCount} release(s) deployed`,
190
+ ]
191
+ : []),
192
+ // M1: Pod health warnings
193
+ ...(info.unhealthyPodCount !== undefined && info.unhealthyPodCount > 0
194
+ ? [` [!] ${info.unhealthyPodCount} pod(s) not running`]
195
+ : []),
196
+ '',
197
+ ` NIMBUS.md:${nimbusMdLine}`,
198
+ ` DB: ${dbLine}`,
199
+ '',
200
+ info.lastDriftScan
201
+ ? ` Last session: ${new Date(info.lastDriftScan).toLocaleString()}`
202
+ : ' Last session: (none)',
203
+ '',
204
+ ' Quick actions: nimbus plan | nimbus apply | nimbus logs',
205
+ '',
206
+ ].filter(line => line !== undefined),
207
+ style: 'rounded',
208
+ borderColor: 'cyan',
209
+ padding: 0,
210
+ });
211
+ ui.newLine();
212
+ }
213
+ export default statusCommand;