@tolinax/ayoune-cli 2026.11.2 → 2026.11.4

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.
@@ -1,6 +1,6 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
2
  import { api } from "../api/apiClient.js";
3
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
3
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
4
4
  import { saveFile } from "../helpers/saveFile.js";
5
5
  import { secureStorage } from "../helpers/secureStorage.js";
6
6
  import { spinner } from "../../index.js";
@@ -41,9 +41,10 @@ export function createAiCommand(program) {
41
41
  payload: actions,
42
42
  meta: { responseTime: 0, pageInfo: { totalEntries: actions.length, page: 1, totalPages: 1 } },
43
43
  };
44
- handleResponseFormatOptions(opts, formattedRes);
44
+ const _formatted = handleResponseFormatOptions(opts, formattedRes, { noPrint: true });
45
45
  spinner.success({ text: `Found ${actions.length} AI actions` });
46
46
  spinner.stop();
47
+ printFormattedResponse(opts, _formatted);
47
48
  }
48
49
  catch (e) {
49
50
  cliError(e.message || "Failed to fetch AI actions", EXIT_GENERAL_ERROR);
@@ -129,9 +130,11 @@ export function createAiCommand(program) {
129
130
  verbosity: opts.verbosity,
130
131
  hideMeta: opts.hideMeta,
131
132
  });
132
- const { plainResult, result, content } = handleResponseFormatOptions(opts, res);
133
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
134
+ const { plainResult, result, content } = _formatted2;
133
135
  spinner.success({ text: "AI response received" });
134
136
  spinner.stop();
137
+ printFormattedResponse(opts, _formatted2);
135
138
  if (opts.save)
136
139
  await saveFile("ai-ask", opts, res);
137
140
  }
@@ -176,9 +179,10 @@ Examples:
176
179
  },
177
180
  });
178
181
  const res = response.data;
179
- handleResponseFormatOptions(opts, res);
182
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
180
183
  spinner.success({ text: `${type} generation complete` });
181
184
  spinner.stop();
185
+ printFormattedResponse(opts, _formatted3);
182
186
  if (opts.save)
183
187
  await saveFile(`ai-generate-${type}`, opts, res);
184
188
  }
@@ -1,7 +1,7 @@
1
1
  import chalk from "chalk";
2
2
  import { getModuleFromCollection } from "../models/getModuleFromCollection.js";
3
3
  import { apiCallHandler } from "../api/apiCallHandler.js";
4
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
4
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
5
5
  import { handleDeleteSingleOperation } from "../operations/handleDeleteSingleOperation.js";
6
6
  import { saveFile } from "../helpers/saveFile.js";
7
7
  import { spinner } from "../../index.js";
@@ -62,9 +62,10 @@ Examples:
62
62
  payload: results,
63
63
  meta: { pageInfo: { totalEntries: results.length, page: 1, totalPages: 1 } },
64
64
  };
65
- handleResponseFormatOptions(opts, res);
65
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
66
66
  spinner.success({ text: `Fetched ${results.length}/${idList.length} entries` });
67
67
  spinner.stop();
68
+ printFormattedResponse(opts, _formatted);
68
69
  if (opts.save)
69
70
  await saveFile("batch-get", opts, res);
70
71
  }
@@ -276,9 +277,10 @@ Examples:
276
277
  payload: created,
277
278
  meta: { pageInfo: { totalEntries: created.length, page: 1, totalPages: 1 } },
278
279
  };
279
- handleResponseFormatOptions(opts, res);
280
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
280
281
  spinner.success({ text: `Created ${successCount}/${entries.length} entries in ${collection}` });
281
282
  spinner.stop();
283
+ printFormattedResponse(opts, _formatted2);
282
284
  if (opts.save)
283
285
  await saveFile("batch-create", opts, res);
284
286
  if (errorCount > 0)
@@ -1,6 +1,6 @@
1
1
  import { getModuleFromCollection } from "../models/getModuleFromCollection.js";
2
2
  import { apiCallHandler } from "../api/apiCallHandler.js";
3
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
3
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
4
4
  import { saveFile } from "../helpers/saveFile.js";
5
5
  import { spinner } from "../../index.js";
6
6
  import { EXIT_GENERAL_ERROR } from "../exitCodes.js";
@@ -90,9 +90,10 @@ Examples:
90
90
  };
91
91
  // Force response format to match export format
92
92
  opts.responseFormat = opts.format;
93
- handleResponseFormatOptions(opts, fullRes);
93
+ const _formatted = handleResponseFormatOptions(opts, fullRes, { noPrint: true });
94
94
  spinner.success({ text: `Exported ${allPayload.length} entries from ${collection}` });
95
95
  spinner.stop();
96
+ printFormattedResponse(opts, _formatted);
96
97
  if (opts.save)
97
98
  await saveFile(`export-${collection}`, opts, fullRes);
98
99
  }
@@ -152,9 +153,10 @@ Examples:
152
153
  responseFormat: opts.responseFormat,
153
154
  verbosity: opts.verbosity,
154
155
  });
155
- handleResponseFormatOptions(opts, res);
156
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
156
157
  spinner.success({ text: `Export ${id} loaded` });
157
158
  spinner.stop();
159
+ printFormattedResponse(opts, _formatted2);
158
160
  }
159
161
  catch (e) {
160
162
  cliError(e.message || "Failed to get export", EXIT_GENERAL_ERROR);
@@ -1,5 +1,5 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
2
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
3
3
  import { saveFile } from "../helpers/saveFile.js";
4
4
  import { spinner } from "../../index.js";
5
5
  import { EXIT_GENERAL_ERROR } from "../exitCodes.js";
@@ -133,9 +133,10 @@ Examples:
133
133
  }
134
134
  }
135
135
  const res = await apiCallHandler("automation", `automations/${automationId}/execute`, "post", body, { responseFormat: opts.responseFormat });
136
- handleResponseFormatOptions(opts, res);
136
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
137
137
  spinner.success({ text: `Automation ${automationId} executed` });
138
138
  spinner.stop();
139
+ printFormattedResponse(opts, _formatted);
139
140
  }
140
141
  catch (e) {
141
142
  cliError(e.message || "Failed to execute automation", EXIT_GENERAL_ERROR);
@@ -12,7 +12,7 @@ import { handleDeleteSingleOperation } from "../operations/handleDeleteSingleOpe
12
12
  import { aYOUneModules } from "../../data/modules.js";
13
13
  import { getModelsInModules } from "../models/getModelsInModules.js";
14
14
  import { apiCallHandler } from "../api/apiCallHandler.js";
15
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
15
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
16
16
  import { isSuperUser } from "../helpers/tokenPayload.js";
17
17
  import { spinner } from "../../index.js";
18
18
  import { EXIT_GENERAL_ERROR, EXIT_MISUSE } from "../exitCodes.js";
@@ -104,9 +104,10 @@ Examples:
104
104
  responseFormat: opts.responseFormat,
105
105
  verbosity: opts.verbosity,
106
106
  });
107
- handleResponseFormatOptions(opts, res);
107
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
108
108
  spinner.success({ text: `Got ${collection} [${subjectArg}]` });
109
109
  spinner.stop();
110
+ printFormattedResponse(opts, _formatted);
110
111
  return;
111
112
  }
112
113
  if (op === "create") {
@@ -1,5 +1,5 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
2
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
3
3
  import { saveFile } from "../helpers/saveFile.js";
4
4
  import { spinner } from "../../index.js";
5
5
  import { EXIT_GENERAL_ERROR } from "../exitCodes.js";
@@ -141,9 +141,10 @@ Examples:
141
141
  const res = await apiCallHandler("devops", `alerts/${id}/acknowledge`, "put", null, {
142
142
  responseFormat: opts.responseFormat,
143
143
  });
144
- handleResponseFormatOptions(opts, res);
144
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
145
145
  spinner.success({ text: `Alert ${id} acknowledged` });
146
146
  spinner.stop();
147
+ printFormattedResponse(opts, _formatted);
147
148
  }
148
149
  catch (e) {
149
150
  cliError(e.message || "Failed to acknowledge alert", EXIT_GENERAL_ERROR);
@@ -160,9 +161,10 @@ Examples:
160
161
  const res = await apiCallHandler("devops", `alerts/${id}/resolve`, "put", null, {
161
162
  responseFormat: opts.responseFormat,
162
163
  });
163
- handleResponseFormatOptions(opts, res);
164
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
164
165
  spinner.success({ text: `Alert ${id} resolved` });
165
166
  spinner.stop();
167
+ printFormattedResponse(opts, _formatted2);
166
168
  }
167
169
  catch (e) {
168
170
  cliError(e.message || "Failed to resolve alert", EXIT_GENERAL_ERROR);
@@ -1,5 +1,5 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
2
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
3
3
  import { saveFile } from "../helpers/saveFile.js";
4
4
  import { spinner } from "../../index.js";
5
5
  import { EXIT_GENERAL_ERROR, EXIT_MISUSE } from "../exitCodes.js";
@@ -57,9 +57,10 @@ export function createPermissionsCommand(program) {
57
57
  const opts = { ...program.opts(), ...options };
58
58
  spinner.start({ text: `Approving request ${id}...`, color: "magenta" });
59
59
  const res = await apiCallHandler("config", "permissionrequests", "put", { _id: id, status: "approved" }, { responseFormat: opts.responseFormat });
60
- handleResponseFormatOptions(opts, res);
60
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
61
61
  spinner.success({ text: `Permission request ${id} approved` });
62
62
  spinner.stop();
63
+ printFormattedResponse(opts, _formatted);
63
64
  }
64
65
  catch (e) {
65
66
  cliError(e.message || "Failed to approve request", EXIT_GENERAL_ERROR);
@@ -78,9 +79,10 @@ export function createPermissionsCommand(program) {
78
79
  if (opts.reason)
79
80
  body.reason = opts.reason;
80
81
  const res = await apiCallHandler("config", "permissionrequests", "put", body, { responseFormat: opts.responseFormat });
81
- handleResponseFormatOptions(opts, res);
82
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
82
83
  spinner.success({ text: `Permission request ${id} rejected` });
83
84
  spinner.stop();
85
+ printFormattedResponse(opts, _formatted2);
84
86
  }
85
87
  catch (e) {
86
88
  cliError(e.message || "Failed to reject request", EXIT_GENERAL_ERROR);
@@ -117,9 +119,10 @@ export function createPermissionsCommand(program) {
117
119
  const res = await apiCallHandler("config", "permissionrequests", "post", body, {
118
120
  responseFormat: opts.responseFormat,
119
121
  });
120
- handleResponseFormatOptions(opts, res);
122
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
121
123
  spinner.success({ text: "Permission request created" });
122
124
  spinner.stop();
125
+ printFormattedResponse(opts, _formatted3);
123
126
  }
124
127
  catch (e) {
125
128
  cliError(e.message || "Failed to create permission request", EXIT_GENERAL_ERROR);
@@ -174,9 +177,10 @@ export function createPermissionsCommand(program) {
174
177
  responseFormat: opts.responseFormat,
175
178
  verbosity: opts.verbosity,
176
179
  });
177
- handleResponseFormatOptions(opts, res);
180
+ const _formatted4 = handleResponseFormatOptions(opts, res, { noPrint: true });
178
181
  spinner.success({ text: `Right ${id} loaded` });
179
182
  spinner.stop();
183
+ printFormattedResponse(opts, _formatted4);
180
184
  }
181
185
  catch (e) {
182
186
  cliError(e.message || "Failed to get user right", EXIT_GENERAL_ERROR);
@@ -2,7 +2,7 @@ import { resolveCollectionArgs } from "../helpers/resolveCollectionArgs.js";
2
2
  import { getModuleFromCollection } from "../models/getModuleFromCollection.js";
3
3
  import { apiCallHandler } from "../api/apiCallHandler.js";
4
4
  import { searchModel, searchOne, searchGlobal } from "../api/searchClient.js";
5
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
5
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
6
6
  import { saveFile } from "../helpers/saveFile.js";
7
7
  import { localStorage } from "../helpers/localStorage.js";
8
8
  import { spinner } from "../../index.js";
@@ -107,11 +107,12 @@ async function handleGlobalSearch(opts) {
107
107
  console.log(totalEntries);
108
108
  return;
109
109
  }
110
- handleResponseFormatOptions(opts, res);
110
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
111
111
  spinner.success({
112
112
  text: `Found ${totalEntries} entries across ${results.length} collections`,
113
113
  });
114
114
  spinner.stop();
115
+ printFormattedResponse(opts, _formatted);
115
116
  if (opts.save)
116
117
  await saveFile("search-global", opts, res);
117
118
  }
@@ -171,11 +172,12 @@ async function handleFindOneSearch(resolved, searchQuery, opts) {
171
172
  Object.assign(params, contextParams);
172
173
  applyFilters(params, opts.filter);
173
174
  const res = await searchOne(collection, params);
174
- handleResponseFormatOptions(opts, res);
175
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
175
176
  spinner.success({
176
177
  text: `Found match in ${collection}`,
177
178
  });
178
179
  spinner.stop();
180
+ printFormattedResponse(opts, _formatted2);
179
181
  localStorage.setItem("lastModule", resolved.module);
180
182
  localStorage.setItem("lastCollection", resolved.collection);
181
183
  if (opts.save)
@@ -1,5 +1,5 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
2
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
3
3
  import { spinner } from "../../index.js";
4
4
  import { EXIT_GENERAL_ERROR } from "../exitCodes.js";
5
5
  import { cliError } from "../helpers/cliError.js";
@@ -25,9 +25,10 @@ Examples:
25
25
  if (opts.id) {
26
26
  spinner.start({ text: `Syncing repository ${opts.id}...`, color: "magenta" });
27
27
  const res = await apiCallHandler("devops", `repositories/${opts.id}/sync`, "post", null, { responseFormat: opts.responseFormat });
28
- handleResponseFormatOptions(opts, res);
28
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
29
29
  spinner.success({ text: `Repository ${opts.id} sync initiated` });
30
30
  spinner.stop();
31
+ printFormattedResponse(opts, _formatted);
31
32
  }
32
33
  else {
33
34
  spinner.start({ text: "Syncing repositories...", color: "magenta" });
@@ -79,9 +80,10 @@ Examples:
79
80
  if (opts.id) {
80
81
  spinner.start({ text: `Syncing cluster ${opts.id}...`, color: "magenta" });
81
82
  const res = await apiCallHandler("devops", `clusters/${opts.id}/sync`, "post", null, { responseFormat: opts.responseFormat });
82
- handleResponseFormatOptions(opts, res);
83
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
83
84
  spinner.success({ text: `Cluster ${opts.id} sync initiated` });
84
85
  spinner.stop();
86
+ printFormattedResponse(opts, _formatted2);
85
87
  }
86
88
  else {
87
89
  spinner.start({ text: "Syncing all clusters...", color: "magenta" });
@@ -126,9 +128,10 @@ Examples:
126
128
  if (opts.provider)
127
129
  params.provider = opts.provider;
128
130
  const res = await apiCallHandler("devops", "pipelines/sync", "post", null, params);
129
- handleResponseFormatOptions(opts, res);
131
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
130
132
  spinner.success({ text: "Pipeline sync initiated" });
131
133
  spinner.stop();
134
+ printFormattedResponse(opts, _formatted3);
132
135
  }
133
136
  catch (e) {
134
137
  cliError(e.message || "Pipeline sync failed", EXIT_GENERAL_ERROR);
@@ -164,9 +167,10 @@ Examples:
164
167
  payload: status,
165
168
  meta: { pageInfo: { totalEntries: 1, page: 1, totalPages: 1 } },
166
169
  };
167
- handleResponseFormatOptions(opts, res);
170
+ const _formatted4 = handleResponseFormatOptions(opts, res, { noPrint: true });
168
171
  spinner.success({ text: "Sync status retrieved" });
169
172
  spinner.stop();
173
+ printFormattedResponse(opts, _formatted4);
170
174
  }
171
175
  catch (e) {
172
176
  cliError(e.message || "Failed to get sync status", EXIT_GENERAL_ERROR);
@@ -1,5 +1,5 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
2
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
3
3
  import { saveFile } from "../helpers/saveFile.js";
4
4
  import { spinner } from "../../index.js";
5
5
  import { EXIT_GENERAL_ERROR } from "../exitCodes.js";
@@ -66,9 +66,10 @@ Examples:
66
66
  responseFormat: opts.responseFormat,
67
67
  verbosity: opts.verbosity,
68
68
  });
69
- handleResponseFormatOptions(opts, res);
69
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
70
70
  spinner.success({ text: `Email template ${id} loaded` });
71
71
  spinner.stop();
72
+ printFormattedResponse(opts, _formatted);
72
73
  }
73
74
  catch (e) {
74
75
  cliError(e.message || "Failed to get email template", EXIT_GENERAL_ERROR);
@@ -120,9 +121,10 @@ Examples:
120
121
  responseFormat: opts.responseFormat,
121
122
  verbosity: opts.verbosity,
122
123
  });
123
- handleResponseFormatOptions(opts, res);
124
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
124
125
  spinner.success({ text: `Notification template ${id} loaded` });
125
126
  spinner.stop();
127
+ printFormattedResponse(opts, _formatted2);
126
128
  }
127
129
  catch (e) {
128
130
  cliError(e.message || "Failed to get notification template", EXIT_GENERAL_ERROR);
@@ -211,9 +213,10 @@ Examples:
211
213
  responseFormat: opts.responseFormat,
212
214
  verbosity: opts.verbosity,
213
215
  });
214
- handleResponseFormatOptions(opts, res);
216
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
215
217
  spinner.success({ text: `Store template ${id} loaded` });
216
218
  spinner.stop();
219
+ printFormattedResponse(opts, _formatted3);
217
220
  }
218
221
  catch (e) {
219
222
  cliError(e.message || "Failed to get store template", EXIT_GENERAL_ERROR);
@@ -228,9 +231,10 @@ Examples:
228
231
  const opts = { ...program.opts(), ...options };
229
232
  spinner.start({ text: `Installing template ${id}...`, color: "magenta" });
230
233
  const res = await apiCallHandler("config", `templategroups/${id}/install`, "post", null, { responseFormat: opts.responseFormat });
231
- handleResponseFormatOptions(opts, res);
234
+ const _formatted4 = handleResponseFormatOptions(opts, res, { noPrint: true });
232
235
  spinner.success({ text: `Template ${id} installed` });
233
236
  spinner.stop();
237
+ printFormattedResponse(opts, _formatted4);
234
238
  }
235
239
  catch (e) {
236
240
  cliError(e.message || "Failed to install template", EXIT_GENERAL_ERROR);
@@ -1,6 +1,6 @@
1
1
  import chalk from "chalk";
2
2
  import { apiCallHandler } from "../api/apiCallHandler.js";
3
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
3
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
4
4
  import { saveFile } from "../helpers/saveFile.js";
5
5
  import { spinner } from "../../index.js";
6
6
  import { EXIT_GENERAL_ERROR, EXIT_MISUSE } from "../exitCodes.js";
@@ -71,9 +71,10 @@ Examples:
71
71
  responseFormat: opts.responseFormat,
72
72
  verbosity: opts.verbosity,
73
73
  });
74
- handleResponseFormatOptions(opts, res);
74
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
75
75
  spinner.success({ text: `User ${id} loaded` });
76
76
  spinner.stop();
77
+ printFormattedResponse(opts, _formatted);
77
78
  }
78
79
  catch (e) {
79
80
  cliError(e.message || "Failed to get user", EXIT_GENERAL_ERROR);
@@ -101,9 +102,10 @@ Examples:
101
102
  const res = await apiCallHandler("su", "users", "post", body, {
102
103
  responseFormat: opts.responseFormat,
103
104
  });
104
- handleResponseFormatOptions(opts, res);
105
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
105
106
  spinner.success({ text: `Invitation sent to ${opts.email}` });
106
107
  spinner.stop();
108
+ printFormattedResponse(opts, _formatted2);
107
109
  }
108
110
  catch (e) {
109
111
  cliError(e.message || "Failed to invite user", EXIT_GENERAL_ERROR);
@@ -130,9 +132,10 @@ Examples:
130
132
  const res = await apiCallHandler("su", "users", "put", { _id: id, active: false }, {
131
133
  responseFormat: opts.responseFormat,
132
134
  });
133
- handleResponseFormatOptions(opts, res);
135
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
134
136
  spinner.success({ text: `User ${id} deactivated` });
135
137
  spinner.stop();
138
+ printFormattedResponse(opts, _formatted3);
136
139
  }
137
140
  catch (e) {
138
141
  cliError(e.message || "Failed to deactivate user", EXIT_GENERAL_ERROR);
@@ -187,9 +190,10 @@ Examples:
187
190
  responseFormat: opts.responseFormat,
188
191
  verbosity: opts.verbosity,
189
192
  });
190
- handleResponseFormatOptions(opts, res);
193
+ const _formatted4 = handleResponseFormatOptions(opts, res, { noPrint: true });
191
194
  spinner.success({ text: `Team ${id} loaded` });
192
195
  spinner.stop();
196
+ printFormattedResponse(opts, _formatted4);
193
197
  }
194
198
  catch (e) {
195
199
  cliError(e.message || "Failed to get team", EXIT_GENERAL_ERROR);
@@ -223,9 +227,10 @@ Examples:
223
227
  const res = await apiCallHandler("su", "teams", "post", body, {
224
228
  responseFormat: opts.responseFormat,
225
229
  });
226
- handleResponseFormatOptions(opts, res);
230
+ const _formatted5 = handleResponseFormatOptions(opts, res, { noPrint: true });
227
231
  spinner.success({ text: "Team created" });
228
232
  spinner.stop();
233
+ printFormattedResponse(opts, _formatted5);
229
234
  }
230
235
  catch (e) {
231
236
  cliError(e.message || "Failed to create team", EXIT_GENERAL_ERROR);
@@ -274,9 +279,10 @@ Examples:
274
279
  responseFormat: opts.responseFormat,
275
280
  verbosity: opts.verbosity,
276
281
  });
277
- handleResponseFormatOptions(opts, res);
282
+ const _formatted6 = handleResponseFormatOptions(opts, res, { noPrint: true });
278
283
  spinner.success({ text: `Role ${id} loaded` });
279
284
  spinner.stop();
285
+ printFormattedResponse(opts, _formatted6);
280
286
  }
281
287
  catch (e) {
282
288
  cliError(e.message || "Failed to get role", EXIT_GENERAL_ERROR);
@@ -1,5 +1,5 @@
1
1
  import { apiCallHandler } from "../api/apiCallHandler.js";
2
- import { handleResponseFormatOptions } from "../helpers/handleResponseFormatOptions.js";
2
+ import { handleResponseFormatOptions, printFormattedResponse } from "../helpers/handleResponseFormatOptions.js";
3
3
  import { saveFile } from "../helpers/saveFile.js";
4
4
  import { spinner } from "../../index.js";
5
5
  import { EXIT_GENERAL_ERROR, EXIT_MISUSE } from "../exitCodes.js";
@@ -59,9 +59,10 @@ Examples:
59
59
  responseFormat: opts.responseFormat,
60
60
  verbosity: opts.verbosity,
61
61
  });
62
- handleResponseFormatOptions(opts, res);
62
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
63
63
  spinner.success({ text: `Webhook ${id} loaded` });
64
64
  spinner.stop();
65
+ printFormattedResponse(opts, _formatted);
65
66
  }
66
67
  catch (e) {
67
68
  cliError(e.message || "Failed to get webhook", EXIT_GENERAL_ERROR);
@@ -101,9 +102,10 @@ Examples:
101
102
  const res = await apiCallHandler("config", "hooks", "post", body, {
102
103
  responseFormat: opts.responseFormat,
103
104
  });
104
- handleResponseFormatOptions(opts, res);
105
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
105
106
  spinner.success({ text: `Webhook created` });
106
107
  spinner.stop();
108
+ printFormattedResponse(opts, _formatted2);
107
109
  }
108
110
  catch (e) {
109
111
  cliError(e.message || "Failed to create webhook", EXIT_GENERAL_ERROR);
@@ -121,9 +123,10 @@ Examples:
121
123
  const res = await apiCallHandler("config", `hooks/${id}`, "delete", null, {
122
124
  responseFormat: opts.responseFormat,
123
125
  });
124
- handleResponseFormatOptions(opts, res);
126
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
125
127
  spinner.success({ text: `Webhook ${id} deleted` });
126
128
  spinner.stop();
129
+ printFormattedResponse(opts, _formatted3);
127
130
  }
128
131
  catch (e) {
129
132
  cliError(e.message || "Failed to delete webhook", EXIT_GENERAL_ERROR);
@@ -3,7 +3,7 @@
3
3
  // the customer has connected; `clusters` lists them and `cluster-sync` kicks
4
4
  // off a re-scan of resources for one cluster.
5
5
  import { apiCallHandler } from "../../api/apiCallHandler.js";
6
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
6
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
7
7
  import { saveFile } from "../../helpers/saveFile.js";
8
8
  import { spinner } from "../../../index.js";
9
9
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
@@ -52,9 +52,10 @@ Examples:
52
52
  const res = await apiCallHandler("devops", `clusters/${id}/sync`, "post", null, {
53
53
  responseFormat: opts.responseFormat,
54
54
  });
55
- handleResponseFormatOptions(opts, res);
55
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
56
56
  spinner.success({ text: `Cluster ${id} sync initiated` });
57
57
  spinner.stop();
58
+ printFormattedResponse(opts, _formatted);
58
59
  }
59
60
  catch (e) {
60
61
  cliError(e.message || "Failed to sync cluster", EXIT_GENERAL_ERROR);
@@ -3,7 +3,7 @@
3
3
  // counts, active alerts, recent pipelines). Useful as a one-shot health
4
4
  // check during incident response.
5
5
  import { apiCallHandler } from "../../api/apiCallHandler.js";
6
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
6
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
7
7
  import { spinner } from "../../../index.js";
8
8
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
9
9
  import { cliError } from "../../helpers/cliError.js";
@@ -20,9 +20,10 @@ export function addDashboardSubcommands(deploy, rootProgram) {
20
20
  responseFormat: opts.responseFormat,
21
21
  verbosity: opts.verbosity,
22
22
  });
23
- handleResponseFormatOptions(opts, res);
23
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
24
24
  spinner.success({ text: "Dashboard loaded" });
25
25
  spinner.stop();
26
+ printFormattedResponse(opts, _formatted);
26
27
  }
27
28
  catch (e) {
28
29
  cliError(e.message || "Failed to load dashboard", EXIT_GENERAL_ERROR);
@@ -5,7 +5,7 @@
5
5
  import chalk from "chalk";
6
6
  import { getModuleBaseUrl } from "../../api/apiClient.js";
7
7
  import { apiCallHandler } from "../../api/apiCallHandler.js";
8
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
8
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
9
9
  import { saveFile } from "../../helpers/saveFile.js";
10
10
  import { spinner } from "../../../index.js";
11
11
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
@@ -68,9 +68,10 @@ export function addDeploymentsSubcommands(deploy, rootProgram) {
68
68
  responseFormat: opts.responseFormat,
69
69
  verbosity: opts.verbosity,
70
70
  });
71
- handleResponseFormatOptions(opts, res);
71
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
72
72
  spinner.success({ text: `Deployment ${id} loaded` });
73
73
  spinner.stop();
74
+ printFormattedResponse(opts, _formatted);
74
75
  }
75
76
  catch (e) {
76
77
  cliError(e.message || "Failed to get deployment", EXIT_GENERAL_ERROR);
@@ -163,9 +164,10 @@ Examples:
163
164
  responseFormat: opts.responseFormat,
164
165
  verbosity: opts.verbosity,
165
166
  });
166
- handleResponseFormatOptions(opts, res);
167
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
167
168
  spinner.success({ text: `Logs loaded for deployment ${id}` });
168
169
  spinner.stop();
170
+ printFormattedResponse(opts, _formatted2);
169
171
  if (opts.save)
170
172
  await saveFile("deploy-logs", opts, res);
171
173
  }
@@ -189,9 +191,10 @@ Examples:
189
191
  deployment,
190
192
  replicas: parseInt(replicas, 10),
191
193
  }, { responseFormat: opts.responseFormat });
192
- handleResponseFormatOptions(opts, res);
194
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
193
195
  spinner.success({ text: `Scaled ${deployment} to ${replicas} replicas` });
194
196
  spinner.stop();
197
+ printFormattedResponse(opts, _formatted3);
195
198
  }
196
199
  catch (e) {
197
200
  cliError(e.message || "Failed to scale deployment", EXIT_GENERAL_ERROR);
@@ -206,9 +209,10 @@ Examples:
206
209
  const opts = { ...rootProgram.opts(), ...options };
207
210
  spinner.start({ text: `Restarting ${deployment}...`, color: "magenta" });
208
211
  const res = await apiCallHandler("devops", "deployments/restart", "post", { deployment }, { responseFormat: opts.responseFormat });
209
- handleResponseFormatOptions(opts, res);
212
+ const _formatted4 = handleResponseFormatOptions(opts, res, { noPrint: true });
210
213
  spinner.success({ text: `Restart initiated for ${deployment}` });
211
214
  spinner.stop();
215
+ printFormattedResponse(opts, _formatted4);
212
216
  }
213
217
  catch (e) {
214
218
  cliError(e.message || "Failed to restart deployment", EXIT_GENERAL_ERROR);
@@ -5,7 +5,7 @@
5
5
  // platform deploys from (see CLAUDE.md: master deploys to develop namespace
6
6
  // which IS prod).
7
7
  import { apiCallHandler } from "../../api/apiCallHandler.js";
8
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
8
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
9
9
  import { saveFile } from "../../helpers/saveFile.js";
10
10
  import { spinner } from "../../../index.js";
11
11
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
@@ -70,11 +70,12 @@ Examples:
70
70
  const res = await apiCallHandler("devops", "pipelines/trigger", "post", body, {
71
71
  responseFormat: opts.responseFormat,
72
72
  });
73
- handleResponseFormatOptions(opts, res);
73
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
74
74
  spinner.success({
75
75
  text: `Pipeline triggered for ${repo} (branch: ${opts.branch})`,
76
76
  });
77
77
  spinner.stop();
78
+ printFormattedResponse(opts, _formatted);
78
79
  }
79
80
  catch (e) {
80
81
  cliError(e.message || "Failed to trigger pipeline", EXIT_GENERAL_ERROR);
@@ -3,7 +3,7 @@
3
3
  // each step"). The plans tree forms its own intermediate command so the
4
4
  // `ay deploy plans <action>` invocation surface stays grouped.
5
5
  import { apiCallHandler } from "../../api/apiCallHandler.js";
6
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
6
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
7
7
  import { saveFile } from "../../helpers/saveFile.js";
8
8
  import { spinner } from "../../../index.js";
9
9
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
@@ -52,9 +52,10 @@ export function addPlansSubcommands(deploy, rootProgram) {
52
52
  responseFormat: opts.responseFormat,
53
53
  verbosity: opts.verbosity,
54
54
  });
55
- handleResponseFormatOptions(opts, res);
55
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
56
56
  spinner.success({ text: `Plan ${id} loaded` });
57
57
  spinner.stop();
58
+ printFormattedResponse(opts, _formatted);
58
59
  }
59
60
  catch (e) {
60
61
  cliError(e.message || "Failed to get plan", EXIT_GENERAL_ERROR);
@@ -117,9 +118,10 @@ export function addPlansSubcommands(deploy, rootProgram) {
117
118
  const res = await apiCallHandler("devops", `deployment-plans/${id}/execute`, "post", null, {
118
119
  responseFormat: opts.responseFormat,
119
120
  });
120
- handleResponseFormatOptions(opts, res);
121
+ const _formatted2 = handleResponseFormatOptions(opts, res, { noPrint: true });
121
122
  spinner.success({ text: `Plan ${id} execution started` });
122
123
  spinner.stop();
124
+ printFormattedResponse(opts, _formatted2);
123
125
  }
124
126
  catch (e) {
125
127
  cliError(e.message || "Failed to execute plan", EXIT_GENERAL_ERROR);
@@ -137,9 +139,10 @@ export function addPlansSubcommands(deploy, rootProgram) {
137
139
  const res = await apiCallHandler("devops", `deployment-plans/${id}`, "delete", null, {
138
140
  responseFormat: opts.responseFormat,
139
141
  });
140
- handleResponseFormatOptions(opts, res);
142
+ const _formatted3 = handleResponseFormatOptions(opts, res, { noPrint: true });
141
143
  spinner.success({ text: `Plan ${id} deleted` });
142
144
  spinner.stop();
145
+ printFormattedResponse(opts, _formatted3);
143
146
  }
144
147
  catch (e) {
145
148
  cliError(e.message || "Failed to delete plan", EXIT_GENERAL_ERROR);
@@ -3,7 +3,7 @@
3
3
  // standard "force restart this one instance" workaround when you don't
4
4
  // want to roll the whole deployment.
5
5
  import { apiCallHandler } from "../../api/apiCallHandler.js";
6
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
6
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
7
7
  import { saveFile } from "../../helpers/saveFile.js";
8
8
  import { spinner } from "../../../index.js";
9
9
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
@@ -60,9 +60,10 @@ export function addPodsSubcommands(deploy, rootProgram) {
60
60
  const res = await apiCallHandler("devops", `pods/${id}`, "delete", null, {
61
61
  responseFormat: opts.responseFormat,
62
62
  });
63
- handleResponseFormatOptions(opts, res);
63
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
64
64
  spinner.success({ text: `Pod ${id} deleted` });
65
65
  spinner.stop();
66
+ printFormattedResponse(opts, _formatted);
66
67
  }
67
68
  catch (e) {
68
69
  cliError(e.message || "Failed to delete pod", EXIT_GENERAL_ERROR);
@@ -3,7 +3,7 @@
3
3
  // the metadata for one repo from its provider (Bitbucket / GitHub) which
4
4
  // refreshes the branch list and last-commit info that the dashboard uses.
5
5
  import { apiCallHandler } from "../../api/apiCallHandler.js";
6
- import { handleResponseFormatOptions } from "../../helpers/handleResponseFormatOptions.js";
6
+ import { handleResponseFormatOptions, printFormattedResponse } from "../../helpers/handleResponseFormatOptions.js";
7
7
  import { saveFile } from "../../helpers/saveFile.js";
8
8
  import { spinner } from "../../../index.js";
9
9
  import { EXIT_GENERAL_ERROR } from "../../exitCodes.js";
@@ -53,9 +53,10 @@ export function addReposSubcommands(deploy, rootProgram) {
53
53
  const opts = { ...rootProgram.opts(), ...options };
54
54
  spinner.start({ text: `Syncing repository ${id}...`, color: "magenta" });
55
55
  const res = await apiCallHandler("devops", `repositories/${id}/sync`, "post", null, { responseFormat: opts.responseFormat });
56
- handleResponseFormatOptions(opts, res);
56
+ const _formatted = handleResponseFormatOptions(opts, res, { noPrint: true });
57
57
  spinner.success({ text: `Repository ${id} sync initiated` });
58
58
  spinner.stop();
59
+ printFormattedResponse(opts, _formatted);
59
60
  }
60
61
  catch (e) {
61
62
  cliError(e.message || "Failed to sync repository", EXIT_GENERAL_ERROR);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tolinax/ayoune-cli",
3
- "version": "2026.11.2",
3
+ "version": "2026.11.4",
4
4
  "description": "CLI for the aYOUne Business-as-a-Service platform",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -11,17 +11,15 @@
11
11
  "prebuild": "rimraf dist",
12
12
  "build": "npx tsc",
13
13
  "postbuild": "cpx package.json dist",
14
- "update-models": "npm install @tolinax/ayoune-models@latest",
15
- "update-core": "npm install @tolinax/ayoune-core@latest",
16
14
  "copy-package": "cpx package.json dist",
17
- "update-interfaces": "npm install @tolinax/ayoune-interfaces@latest",
15
+ "update-interfaces": "npm install -D @tolinax/ayoune-interfaces@latest",
18
16
  "test": "vitest run",
19
17
  "test:watch": "vitest",
20
18
  "lint": "eslint src/",
21
19
  "format": "prettier --write src/",
22
20
  "format:check": "prettier --check src/",
23
- "sync-models": "npx ts-node --esm scripts/sync-models-and-rights.ts",
24
- "sync-models:fix": "npx ts-node --esm scripts/sync-models-and-rights.ts --fix",
21
+ "sync-models": "tsx scripts/sync-models-and-rights.ts",
22
+ "sync-models:fix": "tsx scripts/sync-models-and-rights.ts --fix",
25
23
  "release": "release-it --ci",
26
24
  "postrelease": "npm run release-package",
27
25
  "prerelease-package": "npm run copy-package",
@@ -113,7 +111,6 @@
113
111
  }
114
112
  },
115
113
  "dependencies": {
116
- "@tolinax/ayoune-core": "^2026.10.0",
117
114
  "@types/jmespath": "^0.15.2",
118
115
  "chalk": "^5.3.0",
119
116
  "commander": "^12.0.0",
@@ -134,6 +131,7 @@
134
131
  },
135
132
  "devDependencies": {
136
133
  "@release-it/conventional-changelog": "^5.0.0",
134
+ "@tolinax/ayoune-interfaces": "latest",
137
135
  "@types/chalk": "^2.2.0",
138
136
  "@types/commander": "^2.12.2",
139
137
  "@types/figlet": "^1.5.8",
@@ -148,6 +146,8 @@
148
146
  "eslint": "^9.39.2",
149
147
  "prettier": "^3.2.5",
150
148
  "rimraf": "^5.0.5",
149
+ "tsx": "^4.19.2",
150
+ "typescript": "~5.9.2",
151
151
  "vitest": "^4.0.18"
152
152
  }
153
153
  }