gwirian-cli 1.0.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.
package/dist/cli.js ADDED
@@ -0,0 +1,485 @@
1
+ import { createInterface } from 'readline';
2
+ import { createApiClient, TokenInvalidOrExpiredError, ApiError } from './api.js';
3
+ import { getConfig, setToken, setBaseUrl, clearToken, hasToken } from './config.js';
4
+ import { formatJson, formatList, formatRichTable, formatError } from './format.js';
5
+ import { program } from 'commander';
6
+ const AUTH_REQUIRED_MSG = 'No token configured. Run "gwirian auth" to set your API token.';
7
+ function printError(message, options = {}) {
8
+ if (process.stderr.isTTY) {
9
+ console.error(formatError(message, options));
10
+ }
11
+ else {
12
+ console.error(message);
13
+ }
14
+ }
15
+ function getBaseUrlAndToken(baseUrlOverride) {
16
+ const config = getConfig();
17
+ return {
18
+ baseUrl: baseUrlOverride ?? config.baseUrl,
19
+ token: config.token,
20
+ };
21
+ }
22
+ function requireToken(baseUrlOverride) {
23
+ const { baseUrl, token } = getBaseUrlAndToken(baseUrlOverride);
24
+ if (!token) {
25
+ printError(AUTH_REQUIRED_MSG, { title: 'Auth required' });
26
+ process.exit(1);
27
+ }
28
+ return { baseUrl, token };
29
+ }
30
+ function ask(question) {
31
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
32
+ return new Promise((resolve) => {
33
+ rl.question(question, (answer) => {
34
+ rl.close();
35
+ resolve(answer.trim());
36
+ });
37
+ });
38
+ }
39
+ function output(data, useJson, listColumns, tableOptions) {
40
+ if (useJson) {
41
+ console.log(formatJson(data));
42
+ return;
43
+ }
44
+ if (Array.isArray(data) && listColumns && listColumns.length > 0) {
45
+ const items = data;
46
+ const table = process.stdout.isTTY && items.length > 0
47
+ ? formatRichTable(items, listColumns, tableOptions ?? {})
48
+ : formatList(items, listColumns);
49
+ if (table)
50
+ console.log(table);
51
+ return;
52
+ }
53
+ console.log(formatJson(data));
54
+ }
55
+ program
56
+ .name('gwirian')
57
+ .description('CLI for Gwirian API with modern TUI')
58
+ .option('--base-url <url>', 'Override base URL for this run')
59
+ .option('--json', 'Output raw JSON')
60
+ .hook('preAction', (thisCommand) => {
61
+ const opts = thisCommand.opts();
62
+ if (opts.baseUrl)
63
+ thisCommand._baseUrlOverride = opts.baseUrl;
64
+ if (opts.json)
65
+ thisCommand._useJson = true;
66
+ });
67
+ program
68
+ .command('auth')
69
+ .description('Set API token (prompted, optionally test connection)')
70
+ .option('-t, --test', 'Test token with a projects request')
71
+ .action(async (opts) => {
72
+ const token = await ask('Token: ');
73
+ if (!token) {
74
+ printError('Token cannot be empty.', { title: 'Auth' });
75
+ process.exit(1);
76
+ }
77
+ setToken(token);
78
+ console.log('Token saved.');
79
+ if (opts.test) {
80
+ const api = createApiClient(getConfig().baseUrl, token);
81
+ try {
82
+ await api.getProjects();
83
+ console.log('Connection successful.');
84
+ }
85
+ catch (e) {
86
+ if (e instanceof TokenInvalidOrExpiredError) {
87
+ printError('Token is invalid or expired.', { title: 'Auth' });
88
+ }
89
+ else {
90
+ printError(`Connection failed: ${e.message}`, { title: 'Connection failed' });
91
+ }
92
+ process.exit(1);
93
+ }
94
+ }
95
+ });
96
+ program
97
+ .command('logout')
98
+ .description('Clear stored API token')
99
+ .action(() => {
100
+ clearToken();
101
+ console.log('Token cleared.');
102
+ });
103
+ program
104
+ .command('config')
105
+ .description('View or set configuration')
106
+ .addCommand(program.createCommand('get').description('Show base URL and token status').action(() => {
107
+ const config = getConfig();
108
+ console.log('Base URL:', config.baseUrl);
109
+ console.log('Token:', hasToken() ? 'set' : 'not set');
110
+ }))
111
+ .addCommand(program
112
+ .createCommand('set')
113
+ .description('Set a config value')
114
+ .addCommand(program
115
+ .createCommand('base-url')
116
+ .description('Set API base URL')
117
+ .argument('<url>', 'API base URL')
118
+ .action((url) => {
119
+ setBaseUrl(url);
120
+ console.log('Base URL set to:', url);
121
+ })));
122
+ // Projects
123
+ program
124
+ .command('projects')
125
+ .description('List or show projects')
126
+ .addCommand(program
127
+ .createCommand('list')
128
+ .description('List projects')
129
+ .action(async () => {
130
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
131
+ const useJson = program._useJson ?? false;
132
+ try {
133
+ const api = createApiClient(baseUrl, token);
134
+ const projects = await api.getProjects();
135
+ output(projects, useJson, ['id', 'name', 'description']);
136
+ }
137
+ catch (e) {
138
+ handleApiError(e);
139
+ }
140
+ }))
141
+ .addCommand(program
142
+ .createCommand('show')
143
+ .description('Show project details')
144
+ .argument('<project-id>', 'Project ID')
145
+ .action(async (projectId) => {
146
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
147
+ const useJson = program._useJson ?? false;
148
+ try {
149
+ const api = createApiClient(baseUrl, token);
150
+ const project = await api.getProject(projectId);
151
+ output(project, useJson);
152
+ }
153
+ catch (e) {
154
+ handleApiError(e);
155
+ }
156
+ }));
157
+ function handleApiError(e) {
158
+ if (e instanceof TokenInvalidOrExpiredError) {
159
+ printError('Token invalid or expired. Run "gwirian auth" to set a new token.', { title: 'Auth' });
160
+ }
161
+ else if (e instanceof ApiError) {
162
+ const title = e.statusCode === 404 ? 'Not found' : e.statusCode === 403 ? 'Forbidden' : 'Error';
163
+ printError(e.message, { title, statusCode: e.statusCode });
164
+ }
165
+ else {
166
+ printError(e.message, { title: 'Error' });
167
+ }
168
+ process.exit(1);
169
+ }
170
+ // Scenarios
171
+ program
172
+ .command('scenarios')
173
+ .description('List, show, create, update, or delete scenarios')
174
+ .addCommand(program
175
+ .createCommand('list')
176
+ .description('List scenarios')
177
+ .argument('<project-id>', 'Project ID')
178
+ .argument('<feature-id>', 'Feature ID')
179
+ .action(async (projectId, featureId) => {
180
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
181
+ const useJson = program._useJson ?? false;
182
+ try {
183
+ const api = createApiClient(baseUrl, token);
184
+ const list = await api.getScenarios(projectId, featureId);
185
+ output(list, useJson, ['id', 'title', 'given', 'when', 'then'], {
186
+ wordWrap: true,
187
+ colWidths: [6, 26, 28, 28, 28],
188
+ });
189
+ }
190
+ catch (e) {
191
+ handleApiError(e);
192
+ }
193
+ }))
194
+ .addCommand(program
195
+ .createCommand('show')
196
+ .description('Show scenario')
197
+ .argument('<project-id>', 'Project ID')
198
+ .argument('<feature-id>', 'Feature ID')
199
+ .argument('<scenario-id>', 'Scenario ID')
200
+ .action(async (projectId, featureId, scenarioId) => {
201
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
202
+ const useJson = program._useJson ?? false;
203
+ try {
204
+ const api = createApiClient(baseUrl, token);
205
+ const s = await api.getScenario(projectId, featureId, scenarioId);
206
+ output(s, useJson);
207
+ }
208
+ catch (e) {
209
+ handleApiError(e);
210
+ }
211
+ }))
212
+ .addCommand(program
213
+ .createCommand('create')
214
+ .description('Create scenario')
215
+ .argument('<project-id>', 'Project ID')
216
+ .argument('<feature-id>', 'Feature ID')
217
+ .option('--title <title>', 'Title')
218
+ .option('--given <given>', 'Given')
219
+ .option('--when <when>', 'When')
220
+ .option('--then <then>', 'Then')
221
+ .option('--position <n>', 'Position', parseInt)
222
+ .action(async (projectId, featureId, opts) => {
223
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
224
+ const useJson = program._useJson ?? false;
225
+ try {
226
+ const api = createApiClient(baseUrl, token);
227
+ const s = await api.createScenario(projectId, featureId, opts);
228
+ output(s, useJson);
229
+ }
230
+ catch (e) {
231
+ handleApiError(e);
232
+ }
233
+ }))
234
+ .addCommand(program
235
+ .createCommand('update')
236
+ .description('Update scenario')
237
+ .argument('<project-id>', 'Project ID')
238
+ .argument('<feature-id>', 'Feature ID')
239
+ .argument('<scenario-id>', 'Scenario ID')
240
+ .option('--title <title>', 'Title')
241
+ .option('--given <given>', 'Given')
242
+ .option('--when <when>', 'When')
243
+ .option('--then <then>', 'Then')
244
+ .option('--position <n>', 'Position', parseInt)
245
+ .action(async (projectId, featureId, scenarioId, opts) => {
246
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
247
+ const useJson = program._useJson ?? false;
248
+ try {
249
+ const api = createApiClient(baseUrl, token);
250
+ const s = await api.updateScenario(projectId, featureId, scenarioId, opts);
251
+ output(s, useJson);
252
+ }
253
+ catch (e) {
254
+ handleApiError(e);
255
+ }
256
+ }))
257
+ .addCommand(program
258
+ .createCommand('delete')
259
+ .description('Delete scenario')
260
+ .argument('<project-id>', 'Project ID')
261
+ .argument('<feature-id>', 'Feature ID')
262
+ .argument('<scenario-id>', 'Scenario ID')
263
+ .action(async (projectId, featureId, scenarioId) => {
264
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
265
+ try {
266
+ const api = createApiClient(baseUrl, token);
267
+ await api.deleteScenario(projectId, featureId, scenarioId);
268
+ console.log('Scenario deleted.');
269
+ }
270
+ catch (e) {
271
+ handleApiError(e);
272
+ }
273
+ }));
274
+ // Scenario executions
275
+ program
276
+ .command('scenario-executions')
277
+ .description('List, show, create, update, or delete scenario executions')
278
+ .addCommand(program
279
+ .createCommand('list')
280
+ .description('List scenario executions')
281
+ .argument('<project-id>', 'Project ID')
282
+ .argument('<feature-id>', 'Feature ID')
283
+ .argument('<scenario-id>', 'Scenario ID')
284
+ .action(async (projectId, featureId, scenarioId) => {
285
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
286
+ const useJson = program._useJson ?? false;
287
+ try {
288
+ const api = createApiClient(baseUrl, token);
289
+ const list = await api.getScenarioExecutions(projectId, featureId, scenarioId);
290
+ output(list, useJson, ['id', 'status', 'notes', 'executed_at']);
291
+ }
292
+ catch (e) {
293
+ handleApiError(e);
294
+ }
295
+ }))
296
+ .addCommand(program
297
+ .createCommand('show')
298
+ .description('Show scenario execution')
299
+ .argument('<project-id>', 'Project ID')
300
+ .argument('<feature-id>', 'Feature ID')
301
+ .argument('<scenario-id>', 'Scenario ID')
302
+ .argument('<execution-id>', 'Execution ID')
303
+ .action(async (projectId, featureId, scenarioId, executionId) => {
304
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
305
+ const useJson = program._useJson ?? false;
306
+ try {
307
+ const api = createApiClient(baseUrl, token);
308
+ const e = await api.getScenarioExecution(projectId, featureId, scenarioId, executionId);
309
+ output(e, useJson);
310
+ }
311
+ catch (e) {
312
+ handleApiError(e);
313
+ }
314
+ }))
315
+ .addCommand(program
316
+ .createCommand('create')
317
+ .description('Create scenario execution')
318
+ .argument('<project-id>', 'Project ID')
319
+ .argument('<feature-id>', 'Feature ID')
320
+ .argument('<scenario-id>', 'Scenario ID')
321
+ .option('--status <status>', 'Status')
322
+ .option('--notes <notes>', 'Notes')
323
+ .option('--executed-at <iso>', 'Executed at (ISO date)')
324
+ .action(async (projectId, featureId, scenarioId, opts) => {
325
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
326
+ const useJson = program._useJson ?? false;
327
+ try {
328
+ const api = createApiClient(baseUrl, token);
329
+ const e = await api.createScenarioExecution(projectId, featureId, scenarioId, opts);
330
+ output(e, useJson);
331
+ }
332
+ catch (e) {
333
+ handleApiError(e);
334
+ }
335
+ }))
336
+ .addCommand(program
337
+ .createCommand('update')
338
+ .description('Update scenario execution')
339
+ .argument('<project-id>', 'Project ID')
340
+ .argument('<feature-id>', 'Feature ID')
341
+ .argument('<scenario-id>', 'Scenario ID')
342
+ .argument('<execution-id>', 'Execution ID')
343
+ .option('--status <status>', 'Status')
344
+ .option('--notes <notes>', 'Notes')
345
+ .option('--executed-at <iso>', 'Executed at (ISO date)')
346
+ .action(async (projectId, featureId, scenarioId, executionId, opts) => {
347
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
348
+ const useJson = program._useJson ?? false;
349
+ try {
350
+ const api = createApiClient(baseUrl, token);
351
+ const e = await api.updateScenarioExecution(projectId, featureId, scenarioId, executionId, opts);
352
+ output(e, useJson);
353
+ }
354
+ catch (e) {
355
+ handleApiError(e);
356
+ }
357
+ }))
358
+ .addCommand(program
359
+ .createCommand('delete')
360
+ .description('Delete scenario execution')
361
+ .argument('<project-id>', 'Project ID')
362
+ .argument('<feature-id>', 'Feature ID')
363
+ .argument('<scenario-id>', 'Scenario ID')
364
+ .argument('<execution-id>', 'Execution ID')
365
+ .action(async (projectId, featureId, scenarioId, executionId) => {
366
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
367
+ try {
368
+ const api = createApiClient(baseUrl, token);
369
+ await api.deleteScenarioExecution(projectId, featureId, scenarioId, executionId);
370
+ console.log('Scenario execution deleted.');
371
+ }
372
+ catch (e) {
373
+ handleApiError(e);
374
+ }
375
+ }));
376
+ // Features must be added after scenarios so "features" is not shadowed
377
+ program
378
+ .command('features')
379
+ .description('List, show, create, update, or delete features')
380
+ .addCommand(program
381
+ .createCommand('list')
382
+ .description('List features')
383
+ .argument('<project-id>', 'Project ID')
384
+ .action(async (projectId) => {
385
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
386
+ const useJson = program._useJson ?? false;
387
+ try {
388
+ const api = createApiClient(baseUrl, token);
389
+ const list = await api.getFeatures(projectId);
390
+ output(list, useJson, ['id', 'title', 'description']);
391
+ }
392
+ catch (e) {
393
+ handleApiError(e);
394
+ }
395
+ }))
396
+ .addCommand(program
397
+ .createCommand('show')
398
+ .description('Show feature')
399
+ .argument('<project-id>', 'Project ID')
400
+ .argument('<feature-id>', 'Feature ID')
401
+ .action(async (projectId, featureId) => {
402
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
403
+ const useJson = program._useJson ?? false;
404
+ try {
405
+ const api = createApiClient(baseUrl, token);
406
+ const f = await api.getFeature(projectId, featureId);
407
+ output(f, useJson);
408
+ }
409
+ catch (e) {
410
+ handleApiError(e);
411
+ }
412
+ }))
413
+ .addCommand(program
414
+ .createCommand('create')
415
+ .description('Create feature')
416
+ .argument('<project-id>', 'Project ID')
417
+ .option('--title <title>', 'Title')
418
+ .option('--description <desc>', 'Description')
419
+ .option('--tag-list <tags>', 'Tag list')
420
+ .action(async (projectId, opts) => {
421
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
422
+ const useJson = program._useJson ?? false;
423
+ try {
424
+ const api = createApiClient(baseUrl, token);
425
+ const f = await api.createFeature(projectId, opts);
426
+ output(f, useJson);
427
+ }
428
+ catch (e) {
429
+ handleApiError(e);
430
+ }
431
+ }))
432
+ .addCommand(program
433
+ .createCommand('update')
434
+ .description('Update feature')
435
+ .argument('<project-id>', 'Project ID')
436
+ .argument('<feature-id>', 'Feature ID')
437
+ .option('--title <title>', 'Title')
438
+ .option('--description <desc>', 'Description')
439
+ .option('--tag-list <tags>', 'Tag list')
440
+ .action(async (projectId, featureId, opts) => {
441
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
442
+ const useJson = program._useJson ?? false;
443
+ try {
444
+ const api = createApiClient(baseUrl, token);
445
+ const f = await api.updateFeature(projectId, featureId, opts);
446
+ output(f, useJson);
447
+ }
448
+ catch (e) {
449
+ handleApiError(e);
450
+ }
451
+ }))
452
+ .addCommand(program
453
+ .createCommand('delete')
454
+ .description('Delete feature')
455
+ .argument('<project-id>', 'Project ID')
456
+ .argument('<feature-id>', 'Feature ID')
457
+ .action(async (projectId, featureId) => {
458
+ const { baseUrl, token } = requireToken(program._baseUrlOverride);
459
+ try {
460
+ const api = createApiClient(baseUrl, token);
461
+ await api.deleteFeature(projectId, featureId);
462
+ console.log('Feature deleted.');
463
+ }
464
+ catch (e) {
465
+ handleApiError(e);
466
+ }
467
+ }));
468
+ async function main() {
469
+ const args = process.argv.slice(2);
470
+ if (args.length === 0) {
471
+ if (process.stdin.isTTY) {
472
+ const { runTui } = await import('./runTui.js');
473
+ await runTui();
474
+ return;
475
+ }
476
+ program.outputHelp();
477
+ return;
478
+ }
479
+ await program.parseAsync(process.argv);
480
+ }
481
+ main().catch((err) => {
482
+ console.error(err);
483
+ process.exit(1);
484
+ });
485
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface ConfigData {
2
+ token: string | null;
3
+ baseUrl: string;
4
+ }
5
+ export declare function getConfig(): ConfigData;
6
+ export declare function setToken(token: string): void;
7
+ export declare function setBaseUrl(url: string): void;
8
+ export declare function clearToken(): void;
9
+ export declare function hasToken(): boolean;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAkBD,wBAAgB,SAAS,IAAI,UAAU,CAetC;AAQD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAGlC"}
package/dist/config.js ADDED
@@ -0,0 +1,59 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ const DEFAULT_BASE_URL = 'https://www.gwirian.com';
5
+ function getConfigDir() {
6
+ const base = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config');
7
+ return path.join(base, 'gwirian-cli');
8
+ }
9
+ function getConfigPath() {
10
+ return path.join(getConfigDir(), 'config.json');
11
+ }
12
+ function ensureConfigDir() {
13
+ const dir = getConfigDir();
14
+ if (!fs.existsSync(dir)) {
15
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
16
+ }
17
+ }
18
+ export function getConfig() {
19
+ const configPath = getConfigPath();
20
+ if (!fs.existsSync(configPath)) {
21
+ return { token: null, baseUrl: DEFAULT_BASE_URL };
22
+ }
23
+ try {
24
+ const raw = fs.readFileSync(configPath, 'utf-8');
25
+ const data = JSON.parse(raw);
26
+ return {
27
+ token: data.token ?? null,
28
+ baseUrl: data.baseUrl ?? DEFAULT_BASE_URL,
29
+ };
30
+ }
31
+ catch {
32
+ return { token: null, baseUrl: DEFAULT_BASE_URL };
33
+ }
34
+ }
35
+ function writeConfig(data) {
36
+ ensureConfigDir();
37
+ const configPath = getConfigPath();
38
+ fs.writeFileSync(configPath, JSON.stringify(data, null, 2), { mode: 0o600 });
39
+ }
40
+ export function setToken(token) {
41
+ const config = getConfig();
42
+ config.token = token;
43
+ writeConfig(config);
44
+ }
45
+ export function setBaseUrl(url) {
46
+ const config = getConfig();
47
+ config.baseUrl = url.replace(/\/$/, '');
48
+ writeConfig(config);
49
+ }
50
+ export function clearToken() {
51
+ const config = getConfig();
52
+ config.token = null;
53
+ writeConfig(config);
54
+ }
55
+ export function hasToken() {
56
+ const token = getConfig().token;
57
+ return typeof token === 'string' && token.length > 0;
58
+ }
59
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAOnD,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC/E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QACpD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,gBAAgB;SAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB;IACnC,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare function formatJson(value: unknown): string;
2
+ export interface RichTableOptions {
3
+ /** Enable word wrap in cells (no truncation); use with colWidths for long text. */
4
+ wordWrap?: boolean;
5
+ /** Fixed column widths when wordWrap is true (e.g. [6, 30, 36, 36, 36] for id, title, given, when, then). */
6
+ colWidths?: number[];
7
+ }
8
+ /** Rich terminal table with borders and colors (for TTY). */
9
+ export declare function formatRichTable(items: Record<string, unknown>[], columns: string[], options?: RichTableOptions): string;
10
+ /** Styled error box for TTY (e.g. "Project not found", API errors). */
11
+ export declare function formatError(message: string, options?: {
12
+ title?: string;
13
+ statusCode?: number;
14
+ }): string;
15
+ export declare function formatList(items: Record<string, unknown>[], columns: string[]): string;
16
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAQD,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6GAA6G;IAC7G,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAoDR;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,MAAM,CAsCR;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CAwBR"}