@agentuity/cli 0.0.48 → 0.0.49

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 (256) hide show
  1. package/bin/cli.ts +26 -5
  2. package/dist/banner.d.ts +1 -1
  3. package/dist/banner.d.ts.map +1 -1
  4. package/dist/cli-logger.d.ts +27 -0
  5. package/dist/cli-logger.d.ts.map +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cmd/auth/index.d.ts.map +1 -1
  8. package/dist/cmd/auth/login.d.ts.map +1 -1
  9. package/dist/cmd/auth/logout.d.ts.map +1 -1
  10. package/dist/cmd/auth/signup.d.ts.map +1 -1
  11. package/dist/cmd/auth/ssh/add.d.ts.map +1 -1
  12. package/dist/cmd/auth/ssh/delete.d.ts.map +1 -1
  13. package/dist/cmd/auth/ssh/index.d.ts +1 -2
  14. package/dist/cmd/auth/ssh/index.d.ts.map +1 -1
  15. package/dist/cmd/auth/ssh/list.d.ts.map +1 -1
  16. package/dist/cmd/auth/whoami.d.ts.map +1 -1
  17. package/dist/cmd/bundle/ast.d.ts.map +1 -1
  18. package/dist/cmd/bundle/index.d.ts.map +1 -1
  19. package/dist/cmd/bundle/plugin.d.ts.map +1 -1
  20. package/dist/cmd/capabilities/index.d.ts +4 -0
  21. package/dist/cmd/capabilities/index.d.ts.map +1 -0
  22. package/dist/cmd/capabilities/show.d.ts +20 -0
  23. package/dist/cmd/capabilities/show.d.ts.map +1 -0
  24. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  25. package/dist/cmd/cloud/deployment/index.d.ts.map +1 -1
  26. package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
  27. package/dist/cmd/cloud/deployment/remove.d.ts.map +1 -1
  28. package/dist/cmd/cloud/deployment/rollback.d.ts.map +1 -1
  29. package/dist/cmd/cloud/deployment/show.d.ts.map +1 -1
  30. package/dist/cmd/cloud/deployment/undeploy.d.ts.map +1 -1
  31. package/dist/cmd/cloud/deployment/utils.d.ts +4 -2
  32. package/dist/cmd/cloud/deployment/utils.d.ts.map +1 -1
  33. package/dist/cmd/cloud/domain.d.ts.map +1 -1
  34. package/dist/cmd/cloud/index.d.ts.map +1 -1
  35. package/dist/cmd/cloud/resource/add.d.ts.map +1 -1
  36. package/dist/cmd/cloud/resource/delete.d.ts.map +1 -1
  37. package/dist/cmd/cloud/resource/index.d.ts +1 -2
  38. package/dist/cmd/cloud/resource/index.d.ts.map +1 -1
  39. package/dist/cmd/cloud/resource/list.d.ts.map +1 -1
  40. package/dist/cmd/cloud/scp/download.d.ts.map +1 -1
  41. package/dist/cmd/cloud/scp/index.d.ts +1 -2
  42. package/dist/cmd/cloud/scp/index.d.ts.map +1 -1
  43. package/dist/cmd/cloud/scp/upload.d.ts.map +1 -1
  44. package/dist/cmd/cloud/ssh.d.ts.map +1 -1
  45. package/dist/cmd/dev/index.d.ts.map +1 -1
  46. package/dist/cmd/env/delete.d.ts.map +1 -1
  47. package/dist/cmd/env/get.d.ts.map +1 -1
  48. package/dist/cmd/env/import.d.ts.map +1 -1
  49. package/dist/cmd/env/index.d.ts.map +1 -1
  50. package/dist/cmd/env/list.d.ts.map +1 -1
  51. package/dist/cmd/env/pull.d.ts.map +1 -1
  52. package/dist/cmd/env/push.d.ts.map +1 -1
  53. package/dist/cmd/env/set.d.ts.map +1 -1
  54. package/dist/cmd/index.d.ts.map +1 -1
  55. package/dist/cmd/kv/create-namespace.d.ts +3 -0
  56. package/dist/cmd/kv/create-namespace.d.ts.map +1 -0
  57. package/dist/cmd/kv/delete-namespace.d.ts +3 -0
  58. package/dist/cmd/kv/delete-namespace.d.ts.map +1 -0
  59. package/dist/cmd/kv/delete.d.ts +3 -0
  60. package/dist/cmd/kv/delete.d.ts.map +1 -0
  61. package/dist/cmd/kv/get.d.ts +3 -0
  62. package/dist/cmd/kv/get.d.ts.map +1 -0
  63. package/dist/cmd/kv/index.d.ts +2 -0
  64. package/dist/cmd/kv/index.d.ts.map +1 -0
  65. package/dist/cmd/kv/keys.d.ts +3 -0
  66. package/dist/cmd/kv/keys.d.ts.map +1 -0
  67. package/dist/cmd/kv/list-namespaces.d.ts +3 -0
  68. package/dist/cmd/kv/list-namespaces.d.ts.map +1 -0
  69. package/dist/cmd/kv/repl.d.ts +3 -0
  70. package/dist/cmd/kv/repl.d.ts.map +1 -0
  71. package/dist/cmd/kv/search.d.ts +3 -0
  72. package/dist/cmd/kv/search.d.ts.map +1 -0
  73. package/dist/cmd/kv/set.d.ts +3 -0
  74. package/dist/cmd/kv/set.d.ts.map +1 -0
  75. package/dist/cmd/kv/stats.d.ts +3 -0
  76. package/dist/cmd/kv/stats.d.ts.map +1 -0
  77. package/dist/cmd/kv/util.d.ts +8 -0
  78. package/dist/cmd/kv/util.d.ts.map +1 -0
  79. package/dist/cmd/objectstore/delete-bucket.d.ts +3 -0
  80. package/dist/cmd/objectstore/delete-bucket.d.ts.map +1 -0
  81. package/dist/cmd/objectstore/delete.d.ts +3 -0
  82. package/dist/cmd/objectstore/delete.d.ts.map +1 -0
  83. package/dist/cmd/objectstore/get.d.ts +3 -0
  84. package/dist/cmd/objectstore/get.d.ts.map +1 -0
  85. package/dist/cmd/objectstore/index.d.ts +2 -0
  86. package/dist/cmd/objectstore/index.d.ts.map +1 -0
  87. package/dist/cmd/objectstore/list-buckets.d.ts +3 -0
  88. package/dist/cmd/objectstore/list-buckets.d.ts.map +1 -0
  89. package/dist/cmd/objectstore/list-keys.d.ts +3 -0
  90. package/dist/cmd/objectstore/list-keys.d.ts.map +1 -0
  91. package/dist/cmd/objectstore/put.d.ts +3 -0
  92. package/dist/cmd/objectstore/put.d.ts.map +1 -0
  93. package/dist/cmd/objectstore/repl.d.ts +3 -0
  94. package/dist/cmd/objectstore/repl.d.ts.map +1 -0
  95. package/dist/cmd/objectstore/url.d.ts +3 -0
  96. package/dist/cmd/objectstore/url.d.ts.map +1 -0
  97. package/dist/cmd/objectstore/util.d.ts +8 -0
  98. package/dist/cmd/objectstore/util.d.ts.map +1 -0
  99. package/dist/cmd/profile/create.d.ts.map +1 -1
  100. package/dist/cmd/profile/delete.d.ts.map +1 -1
  101. package/dist/cmd/profile/index.d.ts.map +1 -1
  102. package/dist/cmd/profile/list.d.ts +1 -2
  103. package/dist/cmd/profile/list.d.ts.map +1 -1
  104. package/dist/cmd/profile/show.d.ts.map +1 -1
  105. package/dist/cmd/profile/use.d.ts.map +1 -1
  106. package/dist/cmd/project/create.d.ts.map +1 -1
  107. package/dist/cmd/project/delete.d.ts.map +1 -1
  108. package/dist/cmd/project/index.d.ts.map +1 -1
  109. package/dist/cmd/project/list.d.ts.map +1 -1
  110. package/dist/cmd/project/show.d.ts.map +1 -1
  111. package/dist/cmd/project/template-flow.d.ts +1 -1
  112. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  113. package/dist/cmd/prompt/index.d.ts +4 -0
  114. package/dist/cmd/prompt/index.d.ts.map +1 -0
  115. package/dist/cmd/prompt/llm.d.ts +3 -0
  116. package/dist/cmd/prompt/llm.d.ts.map +1 -0
  117. package/dist/cmd/repl/index.d.ts +3 -0
  118. package/dist/cmd/repl/index.d.ts.map +1 -0
  119. package/dist/cmd/schema/index.d.ts +4 -0
  120. package/dist/cmd/schema/index.d.ts.map +1 -0
  121. package/dist/cmd/schema/show.d.ts +3 -0
  122. package/dist/cmd/schema/show.d.ts.map +1 -0
  123. package/dist/cmd/secret/delete.d.ts.map +1 -1
  124. package/dist/cmd/secret/get.d.ts.map +1 -1
  125. package/dist/cmd/secret/import.d.ts.map +1 -1
  126. package/dist/cmd/secret/index.d.ts.map +1 -1
  127. package/dist/cmd/secret/list.d.ts.map +1 -1
  128. package/dist/cmd/secret/pull.d.ts.map +1 -1
  129. package/dist/cmd/secret/push.d.ts.map +1 -1
  130. package/dist/cmd/secret/set.d.ts.map +1 -1
  131. package/dist/cmd/version/index.d.ts.map +1 -1
  132. package/dist/config.d.ts +1 -1
  133. package/dist/config.d.ts.map +1 -1
  134. package/dist/errors.d.ts +83 -0
  135. package/dist/errors.d.ts.map +1 -0
  136. package/dist/explain.d.ts +47 -0
  137. package/dist/explain.d.ts.map +1 -0
  138. package/dist/index.d.ts +6 -0
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/json.d.ts +3 -0
  141. package/dist/json.d.ts.map +1 -0
  142. package/dist/output.d.ts +136 -0
  143. package/dist/output.d.ts.map +1 -0
  144. package/dist/repl.d.ts +124 -0
  145. package/dist/repl.d.ts.map +1 -0
  146. package/dist/schema-generator.d.ts +67 -0
  147. package/dist/schema-generator.d.ts.map +1 -0
  148. package/dist/tui.d.ts +11 -1
  149. package/dist/tui.d.ts.map +1 -1
  150. package/dist/types.d.ts +65 -6
  151. package/dist/types.d.ts.map +1 -1
  152. package/package.json +9 -4
  153. package/src/banner.ts +7 -7
  154. package/src/cli-logger.ts +80 -0
  155. package/src/cli.ts +186 -54
  156. package/src/cmd/auth/index.ts +1 -0
  157. package/src/cmd/auth/login.ts +7 -2
  158. package/src/cmd/auth/logout.ts +4 -0
  159. package/src/cmd/auth/signup.ts +7 -2
  160. package/src/cmd/auth/ssh/add.ts +20 -3
  161. package/src/cmd/auth/ssh/delete.ts +57 -4
  162. package/src/cmd/auth/ssh/index.ts +4 -3
  163. package/src/cmd/auth/ssh/list.ts +29 -12
  164. package/src/cmd/auth/whoami.ts +32 -21
  165. package/src/cmd/bundle/ast.ts +27 -5
  166. package/src/cmd/bundle/index.ts +20 -0
  167. package/src/cmd/bundle/plugin.ts +36 -12
  168. package/src/cmd/capabilities/index.ts +12 -0
  169. package/src/cmd/capabilities/show.ts +256 -0
  170. package/src/cmd/cloud/deploy.ts +54 -0
  171. package/src/cmd/cloud/deployment/index.ts +1 -0
  172. package/src/cmd/cloud/deployment/list.ts +50 -3
  173. package/src/cmd/cloud/deployment/remove.ts +26 -2
  174. package/src/cmd/cloud/deployment/rollback.ts +35 -4
  175. package/src/cmd/cloud/deployment/show.ts +37 -2
  176. package/src/cmd/cloud/deployment/undeploy.ts +12 -1
  177. package/src/cmd/cloud/deployment/utils.ts +5 -2
  178. package/src/cmd/cloud/domain.ts +3 -2
  179. package/src/cmd/cloud/index.ts +8 -1
  180. package/src/cmd/cloud/resource/add.ts +19 -0
  181. package/src/cmd/cloud/resource/delete.ts +24 -3
  182. package/src/cmd/cloud/resource/index.ts +4 -3
  183. package/src/cmd/cloud/resource/list.ts +36 -10
  184. package/src/cmd/cloud/scp/download.ts +27 -1
  185. package/src/cmd/cloud/scp/index.ts +4 -3
  186. package/src/cmd/cloud/scp/upload.ts +27 -1
  187. package/src/cmd/cloud/ssh.ts +12 -0
  188. package/src/cmd/dev/index.ts +11 -7
  189. package/src/cmd/dev/templates.ts +1 -1
  190. package/src/cmd/env/delete.ts +17 -0
  191. package/src/cmd/env/get.ts +17 -1
  192. package/src/cmd/env/import.ts +47 -3
  193. package/src/cmd/env/index.ts +1 -0
  194. package/src/cmd/env/list.ts +13 -1
  195. package/src/cmd/env/pull.ts +20 -0
  196. package/src/cmd/env/push.ts +33 -1
  197. package/src/cmd/env/set.ts +25 -1
  198. package/src/cmd/index.ts +9 -2
  199. package/src/cmd/kv/create-namespace.ts +45 -0
  200. package/src/cmd/kv/delete-namespace.ts +73 -0
  201. package/src/cmd/kv/delete.ts +51 -0
  202. package/src/cmd/kv/get.ts +65 -0
  203. package/src/cmd/kv/index.ts +31 -0
  204. package/src/cmd/kv/keys.ts +57 -0
  205. package/src/cmd/kv/list-namespaces.ts +43 -0
  206. package/src/cmd/kv/repl.ts +284 -0
  207. package/src/cmd/kv/search.ts +80 -0
  208. package/src/cmd/kv/set.ts +63 -0
  209. package/src/cmd/kv/stats.ts +96 -0
  210. package/src/cmd/kv/util.ts +32 -0
  211. package/src/cmd/objectstore/delete-bucket.ts +72 -0
  212. package/src/cmd/objectstore/delete.ts +59 -0
  213. package/src/cmd/objectstore/get.ts +64 -0
  214. package/src/cmd/objectstore/index.ts +27 -0
  215. package/src/cmd/objectstore/list-buckets.ts +45 -0
  216. package/src/cmd/objectstore/list-keys.ts +60 -0
  217. package/src/cmd/objectstore/put.ts +62 -0
  218. package/src/cmd/objectstore/repl.ts +235 -0
  219. package/src/cmd/objectstore/url.ts +59 -0
  220. package/src/cmd/objectstore/util.ts +28 -0
  221. package/src/cmd/profile/create.ts +28 -2
  222. package/src/cmd/profile/delete.ts +17 -2
  223. package/src/cmd/profile/index.ts +1 -0
  224. package/src/cmd/profile/list.ts +7 -3
  225. package/src/cmd/profile/show.ts +20 -5
  226. package/src/cmd/profile/use.ts +8 -0
  227. package/src/cmd/project/create.ts +31 -0
  228. package/src/cmd/project/delete.ts +24 -2
  229. package/src/cmd/project/index.ts +1 -0
  230. package/src/cmd/project/list.ts +23 -9
  231. package/src/cmd/project/show.ts +27 -8
  232. package/src/cmd/project/template-flow.ts +10 -6
  233. package/src/cmd/prompt/index.ts +12 -0
  234. package/src/cmd/prompt/llm.ts +368 -0
  235. package/src/cmd/repl/index.ts +477 -0
  236. package/src/cmd/schema/index.ts +12 -0
  237. package/src/cmd/schema/show.ts +27 -0
  238. package/src/cmd/secret/delete.ts +17 -0
  239. package/src/cmd/secret/get.ts +20 -1
  240. package/src/cmd/secret/import.ts +45 -2
  241. package/src/cmd/secret/index.ts +1 -0
  242. package/src/cmd/secret/list.ts +10 -1
  243. package/src/cmd/secret/pull.ts +20 -0
  244. package/src/cmd/secret/push.ts +33 -1
  245. package/src/cmd/secret/set.ts +20 -0
  246. package/src/cmd/version/index.ts +15 -2
  247. package/src/config.ts +17 -4
  248. package/src/errors.ts +222 -0
  249. package/src/explain.ts +126 -0
  250. package/src/index.ts +51 -0
  251. package/src/json.ts +28 -0
  252. package/src/output.ts +307 -0
  253. package/src/repl.ts +1517 -0
  254. package/src/schema-generator.ts +389 -0
  255. package/src/tui.ts +84 -13
  256. package/src/types.ts +62 -12
package/src/json.ts ADDED
@@ -0,0 +1,28 @@
1
+ export function isPossiblyJSON(val: unknown) {
2
+ if (val) {
3
+ if (typeof val === 'object') {
4
+ return true;
5
+ }
6
+ if (typeof val === 'string') {
7
+ const v = (val as string).trim();
8
+ if (v.startsWith('{') && v.endsWith('}')) {
9
+ return true;
10
+ }
11
+ if (v.startsWith('[') && v.endsWith(']')) {
12
+ return true;
13
+ }
14
+ }
15
+ }
16
+ return false;
17
+ }
18
+
19
+ export function tryParseJSON(val: string) {
20
+ if (isPossiblyJSON(val)) {
21
+ try {
22
+ return JSON.parse(val as string);
23
+ } catch {
24
+ /* */
25
+ }
26
+ }
27
+ return val;
28
+ }
package/src/output.ts ADDED
@@ -0,0 +1,307 @@
1
+ import type { GlobalOptions } from './types';
2
+
3
+ /**
4
+ * Output formatting utilities for agent-friendly CLI
5
+ */
6
+
7
+ // Store global options for access by output utilities
8
+ let globalOutputOptions: GlobalOptions | null = null;
9
+
10
+ /**
11
+ * Set global output options (called during CLI initialization)
12
+ */
13
+ export function setOutputOptions(options: GlobalOptions): void {
14
+ globalOutputOptions = options;
15
+ }
16
+
17
+ /**
18
+ * Get current global output options
19
+ */
20
+ export function getOutputOptions(): GlobalOptions | null {
21
+ return globalOutputOptions;
22
+ }
23
+
24
+ /**
25
+ * Check if JSON output mode is enabled
26
+ */
27
+ export function isJSONMode(options: GlobalOptions): boolean {
28
+ return options.json === true;
29
+ }
30
+
31
+ /**
32
+ * Check if quiet mode is enabled
33
+ */
34
+ export function isQuietMode(options: GlobalOptions): boolean {
35
+ return options.quiet === true;
36
+ }
37
+
38
+ /**
39
+ * Check if progress indicators should be disabled
40
+ */
41
+ export function shouldDisableProgress(options: GlobalOptions): boolean {
42
+ return options.noProgress === true || options.json === true || options.quiet === true;
43
+ }
44
+
45
+ /**
46
+ * Check if colors should be disabled
47
+ */
48
+ export function shouldDisableColors(options: GlobalOptions): boolean {
49
+ if (options.color === 'never') {
50
+ return true;
51
+ }
52
+ if (options.color === 'always') {
53
+ return false;
54
+ }
55
+ // auto mode - disable in JSON/quiet mode or non-TTY
56
+ return options.json === true || options.quiet === true || !process.stdout.isTTY;
57
+ }
58
+
59
+ /**
60
+ * Output JSON to stdout (for agent consumption)
61
+ */
62
+ export function outputJSON(data: unknown): void {
63
+ console.log(JSON.stringify(data, null, 2));
64
+ }
65
+
66
+ /**
67
+ * Output success message (respects quiet/json mode)
68
+ */
69
+ export function outputSuccess(message: string, options: GlobalOptions, jsonData?: unknown): void {
70
+ if (isJSONMode(options)) {
71
+ if (jsonData) {
72
+ outputJSON({ success: true, ...jsonData });
73
+ } else {
74
+ outputJSON({ success: true, message });
75
+ }
76
+ } else if (!isQuietMode(options)) {
77
+ console.log(message);
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Output info message (respects quiet/json mode)
83
+ */
84
+ export function outputInfo(message: string, options: GlobalOptions): void {
85
+ if (isJSONMode(options)) {
86
+ // In JSON mode, info messages are typically suppressed
87
+ // unless they're critical (use outputJSON directly for those)
88
+ return;
89
+ }
90
+ if (!isQuietMode(options)) {
91
+ console.log(message);
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Output warning message (respects json mode but not quiet - warnings should be seen)
97
+ */
98
+ export function outputWarning(message: string, options: GlobalOptions): void {
99
+ if (isJSONMode(options)) {
100
+ outputJSON({ warning: message });
101
+ } else {
102
+ console.warn(message);
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Check if interactive prompts should be allowed
108
+ */
109
+ export function canPrompt(options: GlobalOptions): boolean {
110
+ // Disable prompts in JSON mode, quiet mode, or non-TTY
111
+ return (
112
+ !isJSONMode(options) && !isQuietMode(options) && process.stdin.isTTY && process.stdout.isTTY
113
+ );
114
+ }
115
+
116
+ /**
117
+ * Check if validate mode is enabled
118
+ */
119
+ export function isValidateMode(options: GlobalOptions): boolean {
120
+ return options.validate === true;
121
+ }
122
+
123
+ /**
124
+ * Response metadata
125
+ */
126
+ export interface ResponseMetadata {
127
+ timestamp?: string;
128
+ executionTime?: string;
129
+ pagination?: {
130
+ total?: number;
131
+ limit?: number;
132
+ offset?: number;
133
+ hasMore?: boolean;
134
+ };
135
+ warnings?: string[];
136
+ }
137
+
138
+ /**
139
+ * Standard JSON response format
140
+ */
141
+ export interface JSONResponse<T = unknown> {
142
+ success: boolean;
143
+ data?: T;
144
+ message?: string;
145
+ metadata?: ResponseMetadata;
146
+ error?: {
147
+ code: string;
148
+ message: string;
149
+ details?: Record<string, unknown>;
150
+ };
151
+ }
152
+
153
+ /**
154
+ * Create a success JSON response
155
+ */
156
+ export function createSuccessResponse<T>(
157
+ data?: T,
158
+ message?: string,
159
+ metadata?: ResponseMetadata
160
+ ): JSONResponse<T> {
161
+ const response: JSONResponse<T> = { success: true };
162
+ if (data !== undefined) {
163
+ response.data = data;
164
+ }
165
+ if (message) {
166
+ response.message = message;
167
+ }
168
+ if (metadata) {
169
+ response.metadata = metadata;
170
+ }
171
+ return response;
172
+ }
173
+
174
+ /**
175
+ * Create an error JSON response
176
+ */
177
+ export function createErrorResponse(
178
+ code: string,
179
+ message: string,
180
+ details?: Record<string, unknown>,
181
+ metadata?: ResponseMetadata
182
+ ): JSONResponse {
183
+ const response: JSONResponse = {
184
+ success: false,
185
+ error: {
186
+ code,
187
+ message,
188
+ details,
189
+ },
190
+ };
191
+ if (metadata) {
192
+ response.metadata = metadata;
193
+ }
194
+ return response;
195
+ }
196
+
197
+ /**
198
+ * Create response metadata with timestamp and optional execution time
199
+ */
200
+ export function createMetadata(
201
+ startTime?: number,
202
+ extra?: Partial<ResponseMetadata>
203
+ ): ResponseMetadata {
204
+ const metadata: ResponseMetadata = {
205
+ timestamp: new Date().toISOString(),
206
+ ...extra,
207
+ };
208
+ if (startTime !== undefined) {
209
+ const duration = Date.now() - startTime;
210
+ metadata.executionTime = `${duration}ms`;
211
+ }
212
+ return metadata;
213
+ }
214
+
215
+ /**
216
+ * Batch operation result for a single item
217
+ */
218
+ export interface BatchItemResult<T = unknown> {
219
+ item: string;
220
+ success: boolean;
221
+ data?: T;
222
+ error?: {
223
+ code: string;
224
+ message: string;
225
+ };
226
+ }
227
+
228
+ /**
229
+ * Batch operation result
230
+ */
231
+ export interface BatchOperationResult<T = unknown> {
232
+ success: boolean;
233
+ totalItems: number;
234
+ succeeded: number;
235
+ failed: number;
236
+ results: BatchItemResult<T>[];
237
+ }
238
+
239
+ /**
240
+ * Create a batch operation result
241
+ */
242
+ export function createBatchResult<T = unknown>(
243
+ results: BatchItemResult<T>[]
244
+ ): BatchOperationResult<T> {
245
+ const succeeded = results.filter((r) => r.success).length;
246
+ const failed = results.filter((r) => !r.success).length;
247
+
248
+ return {
249
+ success: failed === 0,
250
+ totalItems: results.length,
251
+ succeeded,
252
+ failed,
253
+ results,
254
+ };
255
+ }
256
+
257
+ /**
258
+ * Output batch operation result
259
+ */
260
+ export function outputBatchResult<T = unknown>(
261
+ result: BatchOperationResult<T>,
262
+ options: GlobalOptions
263
+ ): void {
264
+ if (isJSONMode(options)) {
265
+ outputJSON(result);
266
+ } else {
267
+ console.log(
268
+ `Completed: ${result.succeeded}/${result.totalItems} succeeded, ${result.failed}/${result.totalItems} failed`
269
+ );
270
+ if (result.failed > 0) {
271
+ console.log('\nFailed items:');
272
+ for (const item of result.results.filter((r) => !r.success)) {
273
+ console.log(` ${item.item}: ${item.error?.message || 'Unknown error'}`);
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Validation result
281
+ */
282
+ export interface ValidationResult {
283
+ valid: boolean;
284
+ command: string;
285
+ errors?: Array<{ field: string; message: string }>;
286
+ warnings?: string[];
287
+ }
288
+
289
+ /**
290
+ * Output validation result
291
+ */
292
+ export function outputValidation(result: ValidationResult, options: GlobalOptions): void {
293
+ if (isJSONMode(options) || options.validate) {
294
+ outputJSON(result);
295
+ } else {
296
+ if (result.valid) {
297
+ console.log('✓ Validation passed');
298
+ } else {
299
+ console.log('✗ Validation failed');
300
+ if (result.errors) {
301
+ for (const err of result.errors) {
302
+ console.log(` ${err.field}: ${err.message}`);
303
+ }
304
+ }
305
+ }
306
+ }
307
+ }