@build-astron-co/nimbus 0.2.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 (313) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +628 -0
  3. package/bin/nimbus +38 -0
  4. package/package.json +80 -0
  5. package/src/__tests__/app.test.ts +76 -0
  6. package/src/__tests__/audit.test.ts +877 -0
  7. package/src/__tests__/circuit-breaker.test.ts +116 -0
  8. package/src/__tests__/cli-run.test.ts +115 -0
  9. package/src/__tests__/context-manager.test.ts +502 -0
  10. package/src/__tests__/context.test.ts +242 -0
  11. package/src/__tests__/enterprise.test.ts +401 -0
  12. package/src/__tests__/generator.test.ts +433 -0
  13. package/src/__tests__/hooks.test.ts +582 -0
  14. package/src/__tests__/init.test.ts +436 -0
  15. package/src/__tests__/intent-parser.test.ts +229 -0
  16. package/src/__tests__/llm-router.test.ts +209 -0
  17. package/src/__tests__/lsp.test.ts +293 -0
  18. package/src/__tests__/modes.test.ts +336 -0
  19. package/src/__tests__/permissions.test.ts +338 -0
  20. package/src/__tests__/serve.test.ts +275 -0
  21. package/src/__tests__/sessions.test.ts +227 -0
  22. package/src/__tests__/sharing.test.ts +288 -0
  23. package/src/__tests__/snapshots.test.ts +581 -0
  24. package/src/__tests__/state-db.test.ts +334 -0
  25. package/src/__tests__/stream-with-tools.test.ts +732 -0
  26. package/src/__tests__/subagents.test.ts +176 -0
  27. package/src/__tests__/system-prompt.test.ts +169 -0
  28. package/src/__tests__/tool-converter.test.ts +256 -0
  29. package/src/__tests__/tool-schemas.test.ts +397 -0
  30. package/src/__tests__/tools.test.ts +143 -0
  31. package/src/__tests__/version.test.ts +49 -0
  32. package/src/agent/compaction-agent.ts +227 -0
  33. package/src/agent/context-manager.ts +435 -0
  34. package/src/agent/context.ts +427 -0
  35. package/src/agent/deploy-preview.ts +426 -0
  36. package/src/agent/index.ts +68 -0
  37. package/src/agent/loop.ts +717 -0
  38. package/src/agent/modes.ts +429 -0
  39. package/src/agent/permissions.ts +466 -0
  40. package/src/agent/subagents/base.ts +116 -0
  41. package/src/agent/subagents/cost.ts +51 -0
  42. package/src/agent/subagents/explore.ts +42 -0
  43. package/src/agent/subagents/general.ts +54 -0
  44. package/src/agent/subagents/index.ts +102 -0
  45. package/src/agent/subagents/infra.ts +59 -0
  46. package/src/agent/subagents/security.ts +69 -0
  47. package/src/agent/system-prompt.ts +436 -0
  48. package/src/app.ts +122 -0
  49. package/src/audit/activity-log.ts +290 -0
  50. package/src/audit/compliance-checker.ts +540 -0
  51. package/src/audit/cost-tracker.ts +318 -0
  52. package/src/audit/index.ts +23 -0
  53. package/src/audit/security-scanner.ts +596 -0
  54. package/src/auth/guard.ts +75 -0
  55. package/src/auth/index.ts +56 -0
  56. package/src/auth/oauth.ts +455 -0
  57. package/src/auth/providers.ts +470 -0
  58. package/src/auth/sso.ts +113 -0
  59. package/src/auth/store.ts +505 -0
  60. package/src/auth/types.ts +187 -0
  61. package/src/build.ts +141 -0
  62. package/src/cli/index.ts +16 -0
  63. package/src/cli/init.ts +854 -0
  64. package/src/cli/openapi-spec.ts +356 -0
  65. package/src/cli/run.ts +237 -0
  66. package/src/cli/serve-auth.ts +80 -0
  67. package/src/cli/serve.ts +462 -0
  68. package/src/cli/web.ts +67 -0
  69. package/src/cli.ts +1417 -0
  70. package/src/clients/core-engine-client.ts +227 -0
  71. package/src/clients/enterprise-client.ts +334 -0
  72. package/src/clients/generator-client.ts +351 -0
  73. package/src/clients/git-client.ts +627 -0
  74. package/src/clients/github-client.ts +410 -0
  75. package/src/clients/helm-client.ts +504 -0
  76. package/src/clients/index.ts +80 -0
  77. package/src/clients/k8s-client.ts +497 -0
  78. package/src/clients/llm-client.ts +161 -0
  79. package/src/clients/rest-client.ts +130 -0
  80. package/src/clients/service-discovery.ts +33 -0
  81. package/src/clients/terraform-client.ts +482 -0
  82. package/src/clients/tools-client.ts +1843 -0
  83. package/src/clients/ws-client.ts +115 -0
  84. package/src/commands/analyze/index.ts +352 -0
  85. package/src/commands/apply/helm.ts +473 -0
  86. package/src/commands/apply/index.ts +213 -0
  87. package/src/commands/apply/k8s.ts +454 -0
  88. package/src/commands/apply/terraform.ts +582 -0
  89. package/src/commands/ask.ts +167 -0
  90. package/src/commands/audit/index.ts +238 -0
  91. package/src/commands/auth-cloud.ts +294 -0
  92. package/src/commands/auth-list.ts +134 -0
  93. package/src/commands/auth-profile.ts +121 -0
  94. package/src/commands/auth-status.ts +141 -0
  95. package/src/commands/aws/ec2.ts +501 -0
  96. package/src/commands/aws/iam.ts +397 -0
  97. package/src/commands/aws/index.ts +133 -0
  98. package/src/commands/aws/lambda.ts +396 -0
  99. package/src/commands/aws/rds.ts +439 -0
  100. package/src/commands/aws/s3.ts +439 -0
  101. package/src/commands/aws/vpc.ts +393 -0
  102. package/src/commands/aws-discover.ts +649 -0
  103. package/src/commands/aws-terraform.ts +805 -0
  104. package/src/commands/azure/aks.ts +376 -0
  105. package/src/commands/azure/functions.ts +253 -0
  106. package/src/commands/azure/index.ts +116 -0
  107. package/src/commands/azure/storage.ts +478 -0
  108. package/src/commands/azure/vm.ts +355 -0
  109. package/src/commands/billing/index.ts +256 -0
  110. package/src/commands/chat.ts +314 -0
  111. package/src/commands/config.ts +346 -0
  112. package/src/commands/cost/cloud-cost-estimator.ts +266 -0
  113. package/src/commands/cost/estimator.ts +79 -0
  114. package/src/commands/cost/index.ts +594 -0
  115. package/src/commands/cost/parsers/terraform.ts +273 -0
  116. package/src/commands/cost/parsers/types.ts +25 -0
  117. package/src/commands/cost/pricing/aws.ts +544 -0
  118. package/src/commands/cost/pricing/azure.ts +499 -0
  119. package/src/commands/cost/pricing/gcp.ts +396 -0
  120. package/src/commands/cost/pricing/index.ts +40 -0
  121. package/src/commands/demo.ts +250 -0
  122. package/src/commands/doctor.ts +794 -0
  123. package/src/commands/drift/index.ts +439 -0
  124. package/src/commands/explain.ts +277 -0
  125. package/src/commands/feedback.ts +389 -0
  126. package/src/commands/fix.ts +324 -0
  127. package/src/commands/fs/index.ts +402 -0
  128. package/src/commands/gcp/compute.ts +325 -0
  129. package/src/commands/gcp/functions.ts +271 -0
  130. package/src/commands/gcp/gke.ts +438 -0
  131. package/src/commands/gcp/iam.ts +344 -0
  132. package/src/commands/gcp/index.ts +129 -0
  133. package/src/commands/gcp/storage.ts +284 -0
  134. package/src/commands/generate-helm.ts +1249 -0
  135. package/src/commands/generate-k8s.ts +1560 -0
  136. package/src/commands/generate-terraform.ts +1460 -0
  137. package/src/commands/gh/index.ts +863 -0
  138. package/src/commands/git/index.ts +1343 -0
  139. package/src/commands/helm/index.ts +1126 -0
  140. package/src/commands/help.ts +539 -0
  141. package/src/commands/history.ts +142 -0
  142. package/src/commands/import.ts +868 -0
  143. package/src/commands/index.ts +367 -0
  144. package/src/commands/init.ts +1046 -0
  145. package/src/commands/k8s/index.ts +1137 -0
  146. package/src/commands/login.ts +631 -0
  147. package/src/commands/logout.ts +83 -0
  148. package/src/commands/onboarding.ts +228 -0
  149. package/src/commands/plan/display.ts +279 -0
  150. package/src/commands/plan/index.ts +599 -0
  151. package/src/commands/preview.ts +452 -0
  152. package/src/commands/questionnaire.ts +1270 -0
  153. package/src/commands/resume.ts +55 -0
  154. package/src/commands/team/index.ts +346 -0
  155. package/src/commands/template.ts +232 -0
  156. package/src/commands/tf/index.ts +1034 -0
  157. package/src/commands/upgrade.ts +550 -0
  158. package/src/commands/usage/index.ts +134 -0
  159. package/src/commands/version.ts +170 -0
  160. package/src/compat/index.ts +2 -0
  161. package/src/compat/runtime.ts +12 -0
  162. package/src/compat/sqlite.ts +107 -0
  163. package/src/config/index.ts +17 -0
  164. package/src/config/manager.ts +530 -0
  165. package/src/config/safety-policy.ts +358 -0
  166. package/src/config/schema.ts +125 -0
  167. package/src/config/types.ts +527 -0
  168. package/src/context/context-db.ts +199 -0
  169. package/src/demo/index.ts +349 -0
  170. package/src/demo/scenarios/full-journey.ts +229 -0
  171. package/src/demo/scenarios/getting-started.ts +127 -0
  172. package/src/demo/scenarios/helm-release.ts +341 -0
  173. package/src/demo/scenarios/k8s-deployment.ts +194 -0
  174. package/src/demo/scenarios/terraform-vpc.ts +170 -0
  175. package/src/demo/types.ts +92 -0
  176. package/src/engine/cost-estimator.ts +438 -0
  177. package/src/engine/diagram-generator.ts +256 -0
  178. package/src/engine/drift-detector.ts +902 -0
  179. package/src/engine/executor.ts +1035 -0
  180. package/src/engine/index.ts +76 -0
  181. package/src/engine/orchestrator.ts +636 -0
  182. package/src/engine/planner.ts +720 -0
  183. package/src/engine/safety.ts +743 -0
  184. package/src/engine/verifier.ts +770 -0
  185. package/src/enterprise/audit.ts +348 -0
  186. package/src/enterprise/auth.ts +270 -0
  187. package/src/enterprise/billing.ts +822 -0
  188. package/src/enterprise/index.ts +17 -0
  189. package/src/enterprise/teams.ts +443 -0
  190. package/src/generator/best-practices.ts +1608 -0
  191. package/src/generator/helm.ts +630 -0
  192. package/src/generator/index.ts +37 -0
  193. package/src/generator/intent-parser.ts +514 -0
  194. package/src/generator/kubernetes.ts +976 -0
  195. package/src/generator/terraform.ts +1867 -0
  196. package/src/history/index.ts +8 -0
  197. package/src/history/manager.ts +322 -0
  198. package/src/history/types.ts +34 -0
  199. package/src/hooks/config.ts +432 -0
  200. package/src/hooks/engine.ts +391 -0
  201. package/src/hooks/index.ts +4 -0
  202. package/src/llm/auth-bridge.ts +198 -0
  203. package/src/llm/circuit-breaker.ts +140 -0
  204. package/src/llm/config-loader.ts +201 -0
  205. package/src/llm/cost-calculator.ts +171 -0
  206. package/src/llm/index.ts +8 -0
  207. package/src/llm/model-aliases.ts +115 -0
  208. package/src/llm/provider-registry.ts +63 -0
  209. package/src/llm/providers/anthropic.ts +433 -0
  210. package/src/llm/providers/bedrock.ts +477 -0
  211. package/src/llm/providers/google.ts +405 -0
  212. package/src/llm/providers/ollama.ts +767 -0
  213. package/src/llm/providers/openai-compatible.ts +340 -0
  214. package/src/llm/providers/openai.ts +328 -0
  215. package/src/llm/providers/openrouter.ts +338 -0
  216. package/src/llm/router.ts +1035 -0
  217. package/src/llm/types.ts +232 -0
  218. package/src/lsp/client.ts +298 -0
  219. package/src/lsp/languages.ts +116 -0
  220. package/src/lsp/manager.ts +278 -0
  221. package/src/mcp/client.ts +402 -0
  222. package/src/mcp/index.ts +5 -0
  223. package/src/mcp/manager.ts +133 -0
  224. package/src/nimbus.ts +214 -0
  225. package/src/plugins/index.ts +27 -0
  226. package/src/plugins/loader.ts +334 -0
  227. package/src/plugins/manager.ts +376 -0
  228. package/src/plugins/types.ts +284 -0
  229. package/src/scanners/cicd-scanner.ts +258 -0
  230. package/src/scanners/cloud-scanner.ts +466 -0
  231. package/src/scanners/framework-scanner.ts +469 -0
  232. package/src/scanners/iac-scanner.ts +388 -0
  233. package/src/scanners/index.ts +539 -0
  234. package/src/scanners/language-scanner.ts +276 -0
  235. package/src/scanners/package-manager-scanner.ts +277 -0
  236. package/src/scanners/types.ts +172 -0
  237. package/src/sessions/manager.ts +365 -0
  238. package/src/sessions/types.ts +44 -0
  239. package/src/sharing/sync.ts +296 -0
  240. package/src/sharing/viewer.ts +97 -0
  241. package/src/snapshots/index.ts +2 -0
  242. package/src/snapshots/manager.ts +530 -0
  243. package/src/state/artifacts.ts +147 -0
  244. package/src/state/audit.ts +137 -0
  245. package/src/state/billing.ts +240 -0
  246. package/src/state/checkpoints.ts +117 -0
  247. package/src/state/config.ts +67 -0
  248. package/src/state/conversations.ts +14 -0
  249. package/src/state/credentials.ts +154 -0
  250. package/src/state/db.ts +58 -0
  251. package/src/state/index.ts +26 -0
  252. package/src/state/messages.ts +115 -0
  253. package/src/state/projects.ts +123 -0
  254. package/src/state/schema.ts +236 -0
  255. package/src/state/sessions.ts +147 -0
  256. package/src/state/teams.ts +200 -0
  257. package/src/telemetry.ts +108 -0
  258. package/src/tools/aws-ops.ts +952 -0
  259. package/src/tools/azure-ops.ts +579 -0
  260. package/src/tools/file-ops.ts +593 -0
  261. package/src/tools/gcp-ops.ts +625 -0
  262. package/src/tools/git-ops.ts +773 -0
  263. package/src/tools/github-ops.ts +799 -0
  264. package/src/tools/helm-ops.ts +943 -0
  265. package/src/tools/index.ts +17 -0
  266. package/src/tools/k8s-ops.ts +819 -0
  267. package/src/tools/schemas/converter.ts +184 -0
  268. package/src/tools/schemas/devops.ts +612 -0
  269. package/src/tools/schemas/index.ts +73 -0
  270. package/src/tools/schemas/standard.ts +1144 -0
  271. package/src/tools/schemas/types.ts +705 -0
  272. package/src/tools/terraform-ops.ts +862 -0
  273. package/src/types/ambient.d.ts +193 -0
  274. package/src/types/config.ts +83 -0
  275. package/src/types/drift.ts +116 -0
  276. package/src/types/enterprise.ts +335 -0
  277. package/src/types/index.ts +20 -0
  278. package/src/types/plan.ts +44 -0
  279. package/src/types/request.ts +65 -0
  280. package/src/types/response.ts +54 -0
  281. package/src/types/service.ts +51 -0
  282. package/src/ui/App.tsx +997 -0
  283. package/src/ui/DeployPreview.tsx +169 -0
  284. package/src/ui/Header.tsx +68 -0
  285. package/src/ui/InputBox.tsx +350 -0
  286. package/src/ui/MessageList.tsx +585 -0
  287. package/src/ui/PermissionPrompt.tsx +151 -0
  288. package/src/ui/StatusBar.tsx +158 -0
  289. package/src/ui/ToolCallDisplay.tsx +409 -0
  290. package/src/ui/chat-ui.ts +853 -0
  291. package/src/ui/index.ts +33 -0
  292. package/src/ui/ink/index.ts +711 -0
  293. package/src/ui/streaming.ts +176 -0
  294. package/src/ui/types.ts +57 -0
  295. package/src/utils/analytics.ts +72 -0
  296. package/src/utils/cost-warning.ts +27 -0
  297. package/src/utils/env.ts +46 -0
  298. package/src/utils/errors.ts +69 -0
  299. package/src/utils/event-bus.ts +38 -0
  300. package/src/utils/index.ts +24 -0
  301. package/src/utils/logger.ts +171 -0
  302. package/src/utils/rate-limiter.ts +121 -0
  303. package/src/utils/service-auth.ts +49 -0
  304. package/src/utils/validation.ts +53 -0
  305. package/src/version.ts +4 -0
  306. package/src/watcher/index.ts +163 -0
  307. package/src/wizard/approval.ts +383 -0
  308. package/src/wizard/index.ts +25 -0
  309. package/src/wizard/prompts.ts +338 -0
  310. package/src/wizard/types.ts +171 -0
  311. package/src/wizard/ui.ts +556 -0
  312. package/src/wizard/wizard.ts +304 -0
  313. package/tsconfig.json +24 -0
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Helm Tools Client
3
+ *
4
+ * REST client for communicating with the Helm Tools Service
5
+ */
6
+
7
+ import { RestClient, ServiceURLs } from '.';
8
+
9
+ export interface HelmRelease {
10
+ name: string;
11
+ namespace: string;
12
+ revision: number;
13
+ status: string;
14
+ chart: string;
15
+ appVersion: string;
16
+ updated: string;
17
+ }
18
+
19
+ export interface HelmChart {
20
+ name: string;
21
+ version: string;
22
+ appVersion: string;
23
+ description: string;
24
+ }
25
+
26
+ export interface HelmInstallResult {
27
+ success: boolean;
28
+ release: HelmRelease;
29
+ output: string;
30
+ error?: string;
31
+ }
32
+
33
+ export interface HelmUpgradeResult {
34
+ success: boolean;
35
+ release: HelmRelease;
36
+ output: string;
37
+ error?: string;
38
+ }
39
+
40
+ /**
41
+ * Client for Helm Tools Service
42
+ */
43
+ export class HelmClient {
44
+ private client: RestClient;
45
+
46
+ constructor(baseUrl?: string) {
47
+ this.client = new RestClient(baseUrl || ServiceURLs.HELM_TOOLS);
48
+ }
49
+
50
+ /**
51
+ * List Helm releases
52
+ */
53
+ async list(options?: {
54
+ namespace?: string;
55
+ allNamespaces?: boolean;
56
+ }): Promise<{ success: boolean; releases: HelmRelease[]; error?: string }> {
57
+ const params = new URLSearchParams();
58
+ if (options?.namespace) {
59
+ params.set('namespace', options.namespace);
60
+ }
61
+ if (options?.allNamespaces) {
62
+ params.set('all-namespaces', 'true');
63
+ }
64
+
65
+ const response = await this.client.get<{
66
+ success: boolean;
67
+ releases: HelmRelease[];
68
+ error?: string;
69
+ }>(`/api/helm/list?${params.toString()}`);
70
+ if (response.success && response.data) {
71
+ return response.data;
72
+ }
73
+ return { success: false, releases: [], error: response.error?.message || 'Unknown error' };
74
+ }
75
+
76
+ /**
77
+ * Install a Helm chart
78
+ */
79
+ async install(
80
+ releaseName: string,
81
+ chart: string,
82
+ options?: {
83
+ namespace?: string;
84
+ values?: Record<string, any>;
85
+ valuesFile?: string;
86
+ version?: string;
87
+ wait?: boolean;
88
+ timeout?: string;
89
+ createNamespace?: boolean;
90
+ dryRun?: boolean;
91
+ }
92
+ ): Promise<HelmInstallResult> {
93
+ const response = await this.client.post<HelmInstallResult>('/api/helm/install', {
94
+ releaseName,
95
+ chart,
96
+ ...options,
97
+ });
98
+ if (response.success && response.data) {
99
+ return response.data;
100
+ }
101
+ return {
102
+ success: false,
103
+ release: {
104
+ name: '',
105
+ namespace: '',
106
+ revision: 0,
107
+ status: '',
108
+ chart: '',
109
+ appVersion: '',
110
+ updated: '',
111
+ },
112
+ output: '',
113
+ error: response.error?.message || 'Unknown error',
114
+ };
115
+ }
116
+
117
+ /**
118
+ * Upgrade a Helm release
119
+ */
120
+ async upgrade(
121
+ releaseName: string,
122
+ chart: string,
123
+ options?: {
124
+ namespace?: string;
125
+ values?: Record<string, any>;
126
+ valuesFile?: string;
127
+ version?: string;
128
+ wait?: boolean;
129
+ timeout?: string;
130
+ install?: boolean;
131
+ dryRun?: boolean;
132
+ }
133
+ ): Promise<HelmUpgradeResult> {
134
+ const response = await this.client.post<HelmUpgradeResult>('/api/helm/upgrade', {
135
+ releaseName,
136
+ chart,
137
+ ...options,
138
+ });
139
+ if (response.success && response.data) {
140
+ return response.data;
141
+ }
142
+ return {
143
+ success: false,
144
+ release: {
145
+ name: '',
146
+ namespace: '',
147
+ revision: 0,
148
+ status: '',
149
+ chart: '',
150
+ appVersion: '',
151
+ updated: '',
152
+ },
153
+ output: '',
154
+ error: response.error?.message || 'Unknown error',
155
+ };
156
+ }
157
+
158
+ /**
159
+ * Uninstall a Helm release
160
+ */
161
+ async uninstall(
162
+ releaseName: string,
163
+ options?: {
164
+ namespace?: string;
165
+ keepHistory?: boolean;
166
+ dryRun?: boolean;
167
+ }
168
+ ): Promise<{ success: boolean; output: string; error?: string }> {
169
+ const response = await this.client.post<{ success: boolean; output: string; error?: string }>(
170
+ '/api/helm/uninstall',
171
+ { releaseName, ...options }
172
+ );
173
+ if (response.success && response.data) {
174
+ return response.data;
175
+ }
176
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
177
+ }
178
+
179
+ /**
180
+ * Rollback a Helm release
181
+ */
182
+ async rollback(
183
+ releaseName: string,
184
+ revision: number,
185
+ options?: {
186
+ namespace?: string;
187
+ wait?: boolean;
188
+ dryRun?: boolean;
189
+ }
190
+ ): Promise<{ success: boolean; output: string; error?: string }> {
191
+ const response = await this.client.post<{ success: boolean; output: string; error?: string }>(
192
+ '/api/helm/rollback',
193
+ { releaseName, revision, ...options }
194
+ );
195
+ if (response.success && response.data) {
196
+ return response.data;
197
+ }
198
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
199
+ }
200
+
201
+ /**
202
+ * Get release history
203
+ */
204
+ async history(
205
+ releaseName: string,
206
+ options?: { namespace?: string }
207
+ ): Promise<{ success: boolean; history: any[]; error?: string }> {
208
+ const params = new URLSearchParams();
209
+ params.set('release', releaseName);
210
+ if (options?.namespace) {
211
+ params.set('namespace', options.namespace);
212
+ }
213
+
214
+ const response = await this.client.get<{ success: boolean; history: any[]; error?: string }>(
215
+ `/api/helm/history?${params.toString()}`
216
+ );
217
+ if (response.success && response.data) {
218
+ return response.data;
219
+ }
220
+ return { success: false, history: [], error: response.error?.message || 'Unknown error' };
221
+ }
222
+
223
+ /**
224
+ * Search for Helm charts
225
+ */
226
+ async search(
227
+ keyword: string,
228
+ options?: { repo?: string }
229
+ ): Promise<{ success: boolean; charts: HelmChart[]; error?: string }> {
230
+ const params = new URLSearchParams();
231
+ params.set('keyword', keyword);
232
+ if (options?.repo) {
233
+ params.set('repo', options.repo);
234
+ }
235
+
236
+ const response = await this.client.get<{
237
+ success: boolean;
238
+ charts: HelmChart[];
239
+ error?: string;
240
+ }>(`/api/helm/search?${params.toString()}`);
241
+ if (response.success && response.data) {
242
+ return response.data;
243
+ }
244
+ return { success: false, charts: [], error: response.error?.message || 'Unknown error' };
245
+ }
246
+
247
+ /**
248
+ * Add a Helm repository
249
+ */
250
+ async repoAdd(
251
+ name: string,
252
+ url: string
253
+ ): Promise<{ success: boolean; output: string; error?: string }> {
254
+ const response = await this.client.post<{ success: boolean; output: string; error?: string }>(
255
+ '/api/helm/repo/add',
256
+ { name, url }
257
+ );
258
+ if (response.success && response.data) {
259
+ return response.data;
260
+ }
261
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
262
+ }
263
+
264
+ /**
265
+ * Update Helm repositories
266
+ */
267
+ async repoUpdate(): Promise<{ success: boolean; output: string; error?: string }> {
268
+ const response = await this.client.post<{ success: boolean; output: string; error?: string }>(
269
+ '/api/helm/repo/update',
270
+ {}
271
+ );
272
+ if (response.success && response.data) {
273
+ return response.data;
274
+ }
275
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
276
+ }
277
+
278
+ /**
279
+ * Show chart information
280
+ */
281
+ async show(
282
+ chart: string,
283
+ options?: {
284
+ subcommand?: 'all' | 'chart' | 'readme' | 'values' | 'crds';
285
+ version?: string;
286
+ }
287
+ ): Promise<{ success: boolean; output: string; error?: string }> {
288
+ const params = new URLSearchParams();
289
+ params.set('chart', chart);
290
+ if (options?.subcommand) {
291
+ params.set('subcommand', options.subcommand);
292
+ }
293
+ if (options?.version) {
294
+ params.set('version', options.version);
295
+ }
296
+
297
+ const response = await this.client.get<{ success: boolean; output: string; error?: string }>(
298
+ `/api/helm/show?${params.toString()}`
299
+ );
300
+ if (response.success && response.data) {
301
+ return response.data;
302
+ }
303
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
304
+ }
305
+
306
+ /**
307
+ * Lint a Helm chart
308
+ */
309
+ async lint(
310
+ chartPath: string,
311
+ options?: {
312
+ strict?: boolean;
313
+ valuesFiles?: string[];
314
+ namespace?: string;
315
+ }
316
+ ): Promise<{ success: boolean; data?: any; error?: string }> {
317
+ const response = await this.client.post<{ success: boolean; data?: any; error?: string }>(
318
+ '/api/helm/lint',
319
+ {
320
+ chartPath,
321
+ ...options,
322
+ }
323
+ );
324
+ if (response.success && response.data) {
325
+ return response.data;
326
+ }
327
+ return { success: false, error: response.error?.message || 'Unknown error' };
328
+ }
329
+
330
+ /**
331
+ * Get status of a Helm release
332
+ */
333
+ async status(
334
+ releaseName: string,
335
+ options?: { namespace?: string }
336
+ ): Promise<{ success: boolean; release?: HelmRelease; error?: string }> {
337
+ const params = new URLSearchParams();
338
+ params.set('release', releaseName);
339
+ if (options?.namespace) {
340
+ params.set('namespace', options.namespace);
341
+ }
342
+
343
+ const response = await this.client.get<{
344
+ success: boolean;
345
+ release?: HelmRelease;
346
+ error?: string;
347
+ }>(`/api/helm/status?${params.toString()}`);
348
+ if (response.success && response.data) {
349
+ return response.data;
350
+ }
351
+ return { success: false, error: response.error?.message || 'Unknown error' };
352
+ }
353
+
354
+ /**
355
+ * Show chart values
356
+ */
357
+ async showValues(
358
+ chart: string,
359
+ options?: { version?: string }
360
+ ): Promise<{ success: boolean; values: string; error?: string }> {
361
+ const params = new URLSearchParams();
362
+ params.set('chart', chart);
363
+ if (options?.version) {
364
+ params.set('version', options.version);
365
+ }
366
+
367
+ const response = await this.client.get<{ success: boolean; values: string; error?: string }>(
368
+ `/api/helm/show/values?${params.toString()}`
369
+ );
370
+ if (response.success && response.data) {
371
+ return response.data;
372
+ }
373
+ return { success: false, values: '', error: response.error?.message || 'Unknown error' };
374
+ }
375
+
376
+ /**
377
+ * Render chart templates locally without installing
378
+ */
379
+ async template(
380
+ releaseName: string,
381
+ chart: string,
382
+ options?: {
383
+ namespace?: string;
384
+ values?: Record<string, any>;
385
+ valuesFile?: string;
386
+ set?: Record<string, string>;
387
+ version?: string;
388
+ }
389
+ ): Promise<{ success: boolean; manifests?: string; error?: string }> {
390
+ const response = await this.client.post<{
391
+ success: boolean;
392
+ manifests?: string;
393
+ error?: string;
394
+ }>('/api/helm/template', {
395
+ name: releaseName,
396
+ chart,
397
+ ...options,
398
+ });
399
+ if (response.success && response.data) {
400
+ return response.data;
401
+ }
402
+ return { success: false, error: response.error?.message || 'Unknown error' };
403
+ }
404
+
405
+ /**
406
+ * Package a chart directory into a chart archive
407
+ */
408
+ async package(
409
+ chartPath: string,
410
+ options?: {
411
+ destination?: string;
412
+ version?: string;
413
+ appVersion?: string;
414
+ dependencyUpdate?: boolean;
415
+ }
416
+ ): Promise<{ success: boolean; output?: string; error?: string }> {
417
+ const response = await this.client.post<{ success: boolean; output?: string; error?: string }>(
418
+ '/api/helm/package',
419
+ {
420
+ chartPath,
421
+ ...options,
422
+ }
423
+ );
424
+ if (response.success && response.data) {
425
+ return response.data;
426
+ }
427
+ return { success: false, error: response.error?.message || 'Unknown error' };
428
+ }
429
+
430
+ /**
431
+ * Update chart dependencies
432
+ */
433
+ async dependencyUpdate(
434
+ chartPath: string
435
+ ): Promise<{ success: boolean; output?: string; error?: string }> {
436
+ const response = await this.client.post<{ success: boolean; output?: string; error?: string }>(
437
+ '/api/helm/dependency/update',
438
+ {
439
+ chartPath,
440
+ }
441
+ );
442
+ if (response.success && response.data) {
443
+ return response.data;
444
+ }
445
+ return { success: false, error: response.error?.message || 'Unknown error' };
446
+ }
447
+
448
+ /**
449
+ * Build chart dependencies
450
+ */
451
+ async dependencyBuild(
452
+ chartPath: string
453
+ ): Promise<{ success: boolean; output?: string; error?: string }> {
454
+ const response = await this.client.post<{ success: boolean; output?: string; error?: string }>(
455
+ '/api/helm/dependency/build',
456
+ {
457
+ chartPath,
458
+ }
459
+ );
460
+ if (response.success && response.data) {
461
+ return response.data;
462
+ }
463
+ return { success: false, error: response.error?.message || 'Unknown error' };
464
+ }
465
+
466
+ /**
467
+ * Get detailed status of a Helm release with optional revision
468
+ */
469
+ async statusDetailed(
470
+ releaseName: string,
471
+ options?: { namespace?: string; revision?: number }
472
+ ): Promise<{ success: boolean; status?: any; error?: string }> {
473
+ const params = new URLSearchParams();
474
+ params.set('name', releaseName);
475
+ if (options?.namespace) {
476
+ params.set('namespace', options.namespace);
477
+ }
478
+ if (options?.revision !== undefined) {
479
+ params.set('revision', options.revision.toString());
480
+ }
481
+
482
+ const response = await this.client.get<{ success: boolean; status?: any; error?: string }>(
483
+ `/api/helm/status?${params.toString()}`
484
+ );
485
+ if (response.success && response.data) {
486
+ return response.data;
487
+ }
488
+ return { success: false, error: response.error?.message || 'Unknown error' };
489
+ }
490
+
491
+ /**
492
+ * Check if service is available
493
+ */
494
+ async isAvailable(): Promise<boolean> {
495
+ try {
496
+ const response = await this.client.get<{ status: string }>('/health');
497
+ return response.success && response.data?.status === 'healthy';
498
+ } catch {
499
+ return false;
500
+ }
501
+ }
502
+ }
503
+
504
+ export const helmClient = new HelmClient();
@@ -0,0 +1,80 @@
1
+ /**
2
+ * CLI Service Clients
3
+ *
4
+ * Exports clients for communicating with backend services
5
+ */
6
+
7
+ // Low-level shared clients
8
+ export { RestClient } from './rest-client';
9
+ export type { RestClientOptions } from './rest-client';
10
+ export { WebSocketClient } from './ws-client';
11
+ export type { WebSocketClientOptions } from './ws-client';
12
+ export { ServiceURLs, WebSocketURLs } from './service-discovery';
13
+ export { ToolsClient } from './tools-client';
14
+
15
+ // High-level service clients
16
+ export {
17
+ LLMClient,
18
+ llmClient,
19
+ type ChatMessage,
20
+ type StreamingChunk,
21
+ type ChatOptions,
22
+ } from './llm-client';
23
+
24
+ export {
25
+ TerraformClient,
26
+ terraformClient,
27
+ type TerraformInitResult,
28
+ type TerraformPlanResult,
29
+ type TerraformApplyResult,
30
+ type TerraformValidateResult,
31
+ type TerraformFmtResult,
32
+ type TerraformOutputResult,
33
+ type TerraformWorkspaceResult,
34
+ type TerraformImportResult,
35
+ } from './terraform-client';
36
+
37
+ export {
38
+ K8sClient,
39
+ k8sClient,
40
+ type K8sResource,
41
+ type K8sGetResult,
42
+ type K8sApplyResult,
43
+ type K8sDeleteResult,
44
+ type K8sLogsResult,
45
+ } from './k8s-client';
46
+
47
+ export {
48
+ HelmClient,
49
+ helmClient,
50
+ type HelmRelease,
51
+ type HelmChart,
52
+ type HelmInstallResult,
53
+ type HelmUpgradeResult,
54
+ } from './helm-client';
55
+
56
+ export {
57
+ GitClient,
58
+ gitClient,
59
+ type GitStatus,
60
+ type GitCommit,
61
+ type GitBranch,
62
+ type GitRemote,
63
+ } from './git-client';
64
+
65
+ export {
66
+ GeneratorClient,
67
+ generatorClient,
68
+ type ConversationResult,
69
+ type GeneratedFile,
70
+ type GenerationResult,
71
+ type QuestionnaireResponse,
72
+ } from './generator-client';
73
+
74
+ export {
75
+ CoreEngineClient,
76
+ type DriftDetectParams,
77
+ type DriftFixParams,
78
+ type RollbackParams,
79
+ type RollbackResult,
80
+ } from './core-engine-client';