@utdk/cli 0.1.0-dev.646adf4
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/.turbo/turbo-build.log +4 -0
- package/LICENSE +373 -0
- package/dist/auth.d.ts +24 -0
- package/dist/auth.js +111 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +11 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.js +368 -0
- package/dist/cli.js.map +1 -0
- package/dist/format.d.ts +16 -0
- package/dist/format.js +111 -0
- package/dist/format.js.map +1 -0
- package/dist/providers.d.ts +70 -0
- package/dist/providers.js +317 -0
- package/dist/providers.js.map +1 -0
- package/package.json +32 -0
- package/src/auth.ts +123 -0
- package/src/bin.ts +11 -0
- package/src/cli.ts +451 -0
- package/src/format.ts +127 -0
- package/src/providers.ts +478 -0
- package/tsconfig.json +11 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core CLI logic for @utdk/cli.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* utdk [--output json|table] [--agent] <provider> <operation> [--flag value…]
|
|
6
|
+
* utdk --help
|
|
7
|
+
* utdk --version
|
|
8
|
+
* utdk <provider> --help
|
|
9
|
+
*
|
|
10
|
+
* Exit codes (matching cli-printing-press):
|
|
11
|
+
* 0 success
|
|
12
|
+
* 2 usage error (unknown provider / operation, bad args)
|
|
13
|
+
* 3 not found (HTTP 404)
|
|
14
|
+
* 4 auth failure (HTTP 401/403)
|
|
15
|
+
* 5 API error (HTTP 5xx)
|
|
16
|
+
* 7 rate limited (HTTP 429)
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync } from "fs";
|
|
19
|
+
import { join } from "path";
|
|
20
|
+
import { createClient } from "utdk/client";
|
|
21
|
+
import { resolveAuth, authEnvVars } from "./auth.js";
|
|
22
|
+
import { defaultOutputMode, renderHelpList, writeOutput, } from "./format.js";
|
|
23
|
+
import { buildToolMetadata, findOperation, getProviderInfo, listOperations, listProviders, UTDK_ROOT, } from "./providers.js";
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// CLI version
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
const VERSION = "0.1.0";
|
|
28
|
+
function coerceValue(raw) {
|
|
29
|
+
if (raw === "true")
|
|
30
|
+
return true;
|
|
31
|
+
if (raw === "false")
|
|
32
|
+
return false;
|
|
33
|
+
if (/^-?\d+(\.\d+)?$/.test(raw))
|
|
34
|
+
return Number(raw);
|
|
35
|
+
return raw;
|
|
36
|
+
}
|
|
37
|
+
export function parseArgs(argv) {
|
|
38
|
+
const result = {
|
|
39
|
+
output: undefined,
|
|
40
|
+
agent: false,
|
|
41
|
+
help: false,
|
|
42
|
+
version: false,
|
|
43
|
+
provider: undefined,
|
|
44
|
+
operation: undefined,
|
|
45
|
+
params: {},
|
|
46
|
+
};
|
|
47
|
+
const positionals = [];
|
|
48
|
+
let i = 0;
|
|
49
|
+
while (i < argv.length) {
|
|
50
|
+
const arg = argv[i];
|
|
51
|
+
if (arg === "--help" || arg === "-h") {
|
|
52
|
+
result.help = true;
|
|
53
|
+
i++;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (arg === "--version" || arg === "-v") {
|
|
57
|
+
result.version = true;
|
|
58
|
+
i++;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (arg === "--agent") {
|
|
62
|
+
result.agent = true;
|
|
63
|
+
i++;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (arg === "--output" || arg === "-o") {
|
|
67
|
+
const val = argv[i + 1];
|
|
68
|
+
if (val === "json" || val === "table" || val === "agent") {
|
|
69
|
+
result.output = val;
|
|
70
|
+
i += 2;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (arg.startsWith("--output=")) {
|
|
78
|
+
const val = arg.slice(9);
|
|
79
|
+
if (val === "json" || val === "table" || val === "agent")
|
|
80
|
+
result.output = val;
|
|
81
|
+
i++;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (arg.startsWith("--") && arg.length > 2) {
|
|
85
|
+
const key = arg.slice(2);
|
|
86
|
+
const nextArg = argv[i + 1];
|
|
87
|
+
if (nextArg !== undefined && !nextArg.startsWith("--")) {
|
|
88
|
+
const existing = result.params[key];
|
|
89
|
+
const coerced = coerceValue(nextArg);
|
|
90
|
+
if (existing !== undefined) {
|
|
91
|
+
result.params[key] = Array.isArray(existing)
|
|
92
|
+
? [...existing, coerced]
|
|
93
|
+
: [existing, coerced];
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result.params[key] = coerced;
|
|
97
|
+
}
|
|
98
|
+
i += 2;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
result.params[key] = true;
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
positionals.push(arg);
|
|
107
|
+
i++;
|
|
108
|
+
}
|
|
109
|
+
result.provider = positionals[0];
|
|
110
|
+
result.operation = positionals[1];
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Error → exit code mapping
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
function exitCodeForError(error) {
|
|
117
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
118
|
+
const m = /Request failed: (\d+)/.exec(msg);
|
|
119
|
+
if (!m)
|
|
120
|
+
return 1;
|
|
121
|
+
const status = parseInt(m[1] ?? "0", 10);
|
|
122
|
+
if (status === 404)
|
|
123
|
+
return 3;
|
|
124
|
+
if (status === 401 || status === 403)
|
|
125
|
+
return 4;
|
|
126
|
+
if (status === 429)
|
|
127
|
+
return 7;
|
|
128
|
+
if (status >= 500)
|
|
129
|
+
return 5;
|
|
130
|
+
return 2;
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Help text builders
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
function printGlobalHelp() {
|
|
136
|
+
const providers = listProviders();
|
|
137
|
+
process.stdout.write([
|
|
138
|
+
`utdk v${VERSION} — agent-native CLI for @utdk providers`,
|
|
139
|
+
"",
|
|
140
|
+
"Usage:",
|
|
141
|
+
" utdk [--output json|table] [--agent] <provider> <operation> [--flag value…]",
|
|
142
|
+
" utdk <provider> --help",
|
|
143
|
+
" utdk --help",
|
|
144
|
+
"",
|
|
145
|
+
"Global flags:",
|
|
146
|
+
" --output json|table Output format (default: table in TTY, json when piped)",
|
|
147
|
+
" --agent Compact JSON output optimised for agent parsing",
|
|
148
|
+
" --help, -h Show this help or provider/operation help",
|
|
149
|
+
" --version, -v Print version",
|
|
150
|
+
"",
|
|
151
|
+
"Providers:",
|
|
152
|
+
].join("\n"));
|
|
153
|
+
process.stdout.write("\n");
|
|
154
|
+
if (providers.length === 0) {
|
|
155
|
+
process.stdout.write(" (none found — is the utdk package built?)\n");
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const items = providers.map((name) => {
|
|
159
|
+
const info = getProviderInfo(name);
|
|
160
|
+
return [name, info?.description?.slice(0, 70) ?? ""];
|
|
161
|
+
});
|
|
162
|
+
process.stdout.write(renderHelpList(items, 20));
|
|
163
|
+
process.stdout.write("\n");
|
|
164
|
+
}
|
|
165
|
+
process.stdout.write("\n");
|
|
166
|
+
}
|
|
167
|
+
function printProviderHelp(providerName) {
|
|
168
|
+
const info = getProviderInfo(providerName);
|
|
169
|
+
if (!info) {
|
|
170
|
+
process.stderr.write(`Provider "${providerName}" not found.\n`);
|
|
171
|
+
process.exitCode = 2;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const ops = listOperations(providerName);
|
|
175
|
+
const envVars = authEnvVars(providerName, info.auth);
|
|
176
|
+
process.stdout.write([
|
|
177
|
+
`utdk ${providerName} — ${info.description ?? ""}`,
|
|
178
|
+
"",
|
|
179
|
+
"Usage:",
|
|
180
|
+
` utdk ${providerName} <operation> [--flag value…]`,
|
|
181
|
+
"",
|
|
182
|
+
"Auth environment variables:",
|
|
183
|
+
envVars.map((v) => ` ${v}`).join("\n"),
|
|
184
|
+
"",
|
|
185
|
+
`Operations (${ops.length} total):`,
|
|
186
|
+
].join("\n"));
|
|
187
|
+
process.stdout.write("\n");
|
|
188
|
+
const items = ops.slice(0, 100).map((op) => [
|
|
189
|
+
op.accessPath.join("."),
|
|
190
|
+
op.summary?.slice(0, 60) ?? `${op.method} ${op.path}`,
|
|
191
|
+
]);
|
|
192
|
+
process.stdout.write(renderHelpList(items, 40));
|
|
193
|
+
process.stdout.write("\n");
|
|
194
|
+
if (ops.length > 100) {
|
|
195
|
+
process.stdout.write(`\n … and ${ops.length - 100} more. Filter with: utdk ${providerName} --help | grep <term>\n`);
|
|
196
|
+
}
|
|
197
|
+
process.stdout.write("\n");
|
|
198
|
+
}
|
|
199
|
+
function printOperationHelp(providerName, op) {
|
|
200
|
+
const info = getProviderInfo(providerName);
|
|
201
|
+
const envVars = authEnvVars(providerName, info?.auth ?? []);
|
|
202
|
+
process.stdout.write([
|
|
203
|
+
`utdk ${providerName} ${op.accessPath.join(".")}`,
|
|
204
|
+
"",
|
|
205
|
+
`${op.method} ${op.path}`,
|
|
206
|
+
op.summary ? `Summary: ${op.summary}` : "",
|
|
207
|
+
op.description ? `\n${op.description.slice(0, 300)}` : "",
|
|
208
|
+
"",
|
|
209
|
+
"Parameters:",
|
|
210
|
+
]
|
|
211
|
+
.filter((l) => l !== "")
|
|
212
|
+
.join("\n"));
|
|
213
|
+
process.stdout.write("\n");
|
|
214
|
+
if (op.parameters.length === 0) {
|
|
215
|
+
process.stdout.write(" (none)\n");
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
const items = op.parameters.map((p) => [
|
|
219
|
+
`--${p.name}${p.required ? " *" : ""}`,
|
|
220
|
+
[p.in, p.type, p.description?.slice(0, 50)].filter(Boolean).join(" · "),
|
|
221
|
+
]);
|
|
222
|
+
process.stdout.write(renderHelpList(items, 30));
|
|
223
|
+
process.stdout.write("\n");
|
|
224
|
+
process.stdout.write("\n * = required\n");
|
|
225
|
+
}
|
|
226
|
+
process.stdout.write("\nAuth:\n");
|
|
227
|
+
process.stdout.write(envVars.map((v) => ` ${v}`).join("\n"));
|
|
228
|
+
process.stdout.write("\n\n");
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Operation executor
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
/** Navigate a nested object using a dot-path. */
|
|
234
|
+
function getNestedValue(obj, path) {
|
|
235
|
+
return path.reduce((current, key) => {
|
|
236
|
+
if (current !== null && typeof current === "object") {
|
|
237
|
+
return current[key];
|
|
238
|
+
}
|
|
239
|
+
return undefined;
|
|
240
|
+
}, obj);
|
|
241
|
+
}
|
|
242
|
+
async function executeOperation(providerName, op, params, outputMode) {
|
|
243
|
+
// Load the OpenAPI document for this provider
|
|
244
|
+
const openApiPath = join(UTDK_ROOT, providerName, "openapi.json");
|
|
245
|
+
let openApiDocument;
|
|
246
|
+
try {
|
|
247
|
+
openApiDocument = JSON.parse(readFileSync(openApiPath, "utf-8"));
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
process.stderr.write(`Failed to load OpenAPI spec for "${providerName}".\n`);
|
|
251
|
+
return 2;
|
|
252
|
+
}
|
|
253
|
+
// Resolve auth
|
|
254
|
+
const info = getProviderInfo(providerName);
|
|
255
|
+
const auth = resolveAuth(providerName, info?.auth ?? []);
|
|
256
|
+
// Build tool metadata from the OpenAPI spec so path/query/header/body
|
|
257
|
+
// params are routed correctly (provider metadata.ts files are often empty).
|
|
258
|
+
const allOps = listOperations(providerName);
|
|
259
|
+
const toolMetadata = buildToolMetadata(allOps);
|
|
260
|
+
// Create the client
|
|
261
|
+
let client;
|
|
262
|
+
try {
|
|
263
|
+
client = await createClient({
|
|
264
|
+
name: providerName,
|
|
265
|
+
openApiDocument,
|
|
266
|
+
toolMetadata,
|
|
267
|
+
...(auth ? { auth } : {}),
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
process.stderr.write(`Failed to create client for "${providerName}": ${err instanceof Error ? err.message : String(err)}\n`);
|
|
272
|
+
return 2;
|
|
273
|
+
}
|
|
274
|
+
// Navigate to the operation function
|
|
275
|
+
const fn = getNestedValue(client, op.accessPath);
|
|
276
|
+
if (typeof fn !== "function") {
|
|
277
|
+
process.stderr.write(`Operation "${op.accessPath.join(".")}" not found on the ${providerName} client.\n`);
|
|
278
|
+
return 2;
|
|
279
|
+
}
|
|
280
|
+
// Call it
|
|
281
|
+
let result;
|
|
282
|
+
try {
|
|
283
|
+
result = await fn(params);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
const code = exitCodeForError(err);
|
|
287
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
288
|
+
if (outputMode === "json" || outputMode === "agent") {
|
|
289
|
+
writeOutput({ ok: false, error: msg, exitCode: code }, outputMode);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
process.stderr.write(`Error: ${msg}\n`);
|
|
293
|
+
}
|
|
294
|
+
return code;
|
|
295
|
+
}
|
|
296
|
+
writeOutput(result, outputMode);
|
|
297
|
+
return 0;
|
|
298
|
+
}
|
|
299
|
+
// ---------------------------------------------------------------------------
|
|
300
|
+
// Main entry
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
export async function runCli(argv) {
|
|
303
|
+
const args = parseArgs(argv);
|
|
304
|
+
// Determine output mode: --agent overrides --output
|
|
305
|
+
const outputMode = args.agent
|
|
306
|
+
? "agent"
|
|
307
|
+
: (args.output ?? defaultOutputMode());
|
|
308
|
+
// --version
|
|
309
|
+
if (args.version) {
|
|
310
|
+
process.stdout.write(`@utdk/cli v${VERSION}\n`);
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
// utdk --help
|
|
314
|
+
if (args.help && !args.provider) {
|
|
315
|
+
printGlobalHelp();
|
|
316
|
+
return 0;
|
|
317
|
+
}
|
|
318
|
+
// No provider — show global help
|
|
319
|
+
if (!args.provider) {
|
|
320
|
+
printGlobalHelp();
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
// Validate provider
|
|
324
|
+
const providers = listProviders();
|
|
325
|
+
if (!providers.includes(args.provider)) {
|
|
326
|
+
if (outputMode === "json" || outputMode === "agent") {
|
|
327
|
+
writeOutput({
|
|
328
|
+
ok: false,
|
|
329
|
+
error: `Unknown provider: ${args.provider}`,
|
|
330
|
+
available: providers,
|
|
331
|
+
}, outputMode);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
process.stderr.write(`Unknown provider: "${args.provider}"\nAvailable: ${providers.join(", ")}\n`);
|
|
335
|
+
}
|
|
336
|
+
return 2;
|
|
337
|
+
}
|
|
338
|
+
// utdk <provider> --help or utdk <provider> (no operation)
|
|
339
|
+
if (args.help || !args.operation) {
|
|
340
|
+
printProviderHelp(args.provider);
|
|
341
|
+
return 0;
|
|
342
|
+
}
|
|
343
|
+
// Find the operation
|
|
344
|
+
const op = findOperation(args.provider, args.operation);
|
|
345
|
+
if (!op) {
|
|
346
|
+
// Maybe the user wants help on what they typed
|
|
347
|
+
if (outputMode === "json" || outputMode === "agent") {
|
|
348
|
+
writeOutput({
|
|
349
|
+
ok: false,
|
|
350
|
+
error: `Unknown operation: ${args.operation}`,
|
|
351
|
+
provider: args.provider,
|
|
352
|
+
}, outputMode);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
process.stderr.write(`Unknown operation "${args.operation}" for provider "${args.provider}".\n` +
|
|
356
|
+
`Run "utdk ${args.provider} --help" to list available operations.\n`);
|
|
357
|
+
}
|
|
358
|
+
return 2;
|
|
359
|
+
}
|
|
360
|
+
// utdk <provider> <operation> --help
|
|
361
|
+
if (args.help) {
|
|
362
|
+
printOperationHelp(args.provider, op);
|
|
363
|
+
return 0;
|
|
364
|
+
}
|
|
365
|
+
// Execute
|
|
366
|
+
return executeOperation(args.provider, op, args.params, outputMode);
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting for @utdk/cli.
|
|
3
|
+
*
|
|
4
|
+
* Supports three modes:
|
|
5
|
+
* - json : pretty-printed JSON (default when stdout is not a TTY)
|
|
6
|
+
* - table : padded text table (default when stdout is a TTY)
|
|
7
|
+
* - agent : compact single-line JSON with no ANSI escapes
|
|
8
|
+
*/
|
|
9
|
+
export type OutputMode = "json" | "table" | "agent";
|
|
10
|
+
/** Detect the default output mode based on whether stdout is a TTY. */
|
|
11
|
+
export declare function defaultOutputMode(): OutputMode;
|
|
12
|
+
export declare function formatJson(data: unknown, compact?: boolean): string;
|
|
13
|
+
export declare function formatTable(data: unknown): string;
|
|
14
|
+
export declare function writeOutput(data: unknown, mode: OutputMode): void;
|
|
15
|
+
/** Render a two-column list with fixed-width left column. */
|
|
16
|
+
export declare function renderHelpList(items: Array<[string, string]>, leftWidth?: number): string;
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting for @utdk/cli.
|
|
3
|
+
*
|
|
4
|
+
* Supports three modes:
|
|
5
|
+
* - json : pretty-printed JSON (default when stdout is not a TTY)
|
|
6
|
+
* - table : padded text table (default when stdout is a TTY)
|
|
7
|
+
* - agent : compact single-line JSON with no ANSI escapes
|
|
8
|
+
*/
|
|
9
|
+
/** Detect the default output mode based on whether stdout is a TTY. */
|
|
10
|
+
export function defaultOutputMode() {
|
|
11
|
+
return process.stdout.isTTY ? "table" : "json";
|
|
12
|
+
}
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// JSON output
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export function formatJson(data, compact = false) {
|
|
17
|
+
return compact ? JSON.stringify(data) : JSON.stringify(data, null, 2);
|
|
18
|
+
}
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Table output
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/** Render a two-column key/value table for a plain object. */
|
|
23
|
+
function renderObjectTable(obj) {
|
|
24
|
+
const entries = Object.entries(obj);
|
|
25
|
+
const keyWidth = Math.min(40, Math.max(4, ...entries.map(([k]) => k.length)));
|
|
26
|
+
const lines = [];
|
|
27
|
+
for (const [key, value] of entries) {
|
|
28
|
+
const k = key.padEnd(keyWidth);
|
|
29
|
+
const v = valueToCell(value);
|
|
30
|
+
lines.push(`${k} ${v}`);
|
|
31
|
+
}
|
|
32
|
+
return lines.join("\n");
|
|
33
|
+
}
|
|
34
|
+
/** Render an array of objects as a columnar table. */
|
|
35
|
+
function renderArrayTable(items) {
|
|
36
|
+
if (items.length === 0)
|
|
37
|
+
return "(empty)";
|
|
38
|
+
// Collect all column names from the first item (limit to 8 columns for readability)
|
|
39
|
+
const allKeys = Object.keys(items[0] ?? {});
|
|
40
|
+
const keys = allKeys.slice(0, 8);
|
|
41
|
+
const widths = keys.map((k) => {
|
|
42
|
+
const maxValue = Math.max(...items.map((r) => valueToCell(r[k]).length));
|
|
43
|
+
return Math.min(60, Math.max(k.length, maxValue));
|
|
44
|
+
});
|
|
45
|
+
const header = keys.map((k, i) => k.padEnd(widths[i] ?? k.length)).join(" ");
|
|
46
|
+
const divider = widths.map((w) => "─".repeat(w)).join(" ");
|
|
47
|
+
const rows = items.map((item) => keys
|
|
48
|
+
.map((k, i) => valueToCell(item[k]).slice(0, widths[i] ?? 60).padEnd(widths[i] ?? 0))
|
|
49
|
+
.join(" "));
|
|
50
|
+
return [header, divider, ...rows].join("\n");
|
|
51
|
+
}
|
|
52
|
+
function valueToCell(v) {
|
|
53
|
+
if (v === null || v === undefined)
|
|
54
|
+
return "";
|
|
55
|
+
if (typeof v === "string")
|
|
56
|
+
return v;
|
|
57
|
+
if (typeof v === "number" || typeof v === "boolean")
|
|
58
|
+
return String(v);
|
|
59
|
+
if (Array.isArray(v))
|
|
60
|
+
return `[${v.length} items]`;
|
|
61
|
+
if (typeof v === "object")
|
|
62
|
+
return "{…}";
|
|
63
|
+
return String(v);
|
|
64
|
+
}
|
|
65
|
+
function isObjectArray(data) {
|
|
66
|
+
return (Array.isArray(data) &&
|
|
67
|
+
data.length > 0 &&
|
|
68
|
+
typeof data[0] === "object" &&
|
|
69
|
+
data[0] !== null &&
|
|
70
|
+
!Array.isArray(data[0]));
|
|
71
|
+
}
|
|
72
|
+
function isPlainObject(data) {
|
|
73
|
+
return typeof data === "object" && data !== null && !Array.isArray(data);
|
|
74
|
+
}
|
|
75
|
+
export function formatTable(data) {
|
|
76
|
+
if (isObjectArray(data))
|
|
77
|
+
return renderArrayTable(data);
|
|
78
|
+
if (isPlainObject(data))
|
|
79
|
+
return renderObjectTable(data);
|
|
80
|
+
if (Array.isArray(data))
|
|
81
|
+
return data.map((item) => valueToCell(item)).join("\n");
|
|
82
|
+
return valueToCell(data);
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Unified output writer
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
export function writeOutput(data, mode) {
|
|
88
|
+
let out;
|
|
89
|
+
switch (mode) {
|
|
90
|
+
case "json":
|
|
91
|
+
out = formatJson(data, false);
|
|
92
|
+
break;
|
|
93
|
+
case "agent":
|
|
94
|
+
out = formatJson(data, true);
|
|
95
|
+
break;
|
|
96
|
+
case "table":
|
|
97
|
+
out = formatTable(data);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
process.stdout.write(`${out}\n`);
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Help table helpers
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
/** Render a two-column list with fixed-width left column. */
|
|
106
|
+
export function renderHelpList(items, leftWidth = 30) {
|
|
107
|
+
return items
|
|
108
|
+
.map(([left, right]) => ` ${left.padEnd(leftWidth)} ${right}`)
|
|
109
|
+
.join("\n");
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider and operation discovery for @utdk/cli.
|
|
3
|
+
*
|
|
4
|
+
* Scans the utdk package directory for providers and reads their OpenAPI
|
|
5
|
+
* specifications to enumerate operations. Name transformations mirror
|
|
6
|
+
* those in packages/utdk/client.ts so CLI operation names match the
|
|
7
|
+
* accessor paths on the created client.
|
|
8
|
+
*
|
|
9
|
+
* Also builds ToolRuntimeMetadataMap entries for path/query/header/body
|
|
10
|
+
* parameter routing, so the generated client can correctly assemble HTTP
|
|
11
|
+
* requests even when the provider's hand-written metadata.ts is empty.
|
|
12
|
+
*/
|
|
13
|
+
import type { ToolRuntimeMetadataMap } from "utdk/client";
|
|
14
|
+
export declare const UTDK_ROOT: string;
|
|
15
|
+
export type AuthConfig = {
|
|
16
|
+
auth_type: "api_key" | "oauth2" | "basic";
|
|
17
|
+
api_key?: string;
|
|
18
|
+
var_name?: string;
|
|
19
|
+
location?: string;
|
|
20
|
+
token_url?: string;
|
|
21
|
+
client_id?: string;
|
|
22
|
+
client_secret?: string;
|
|
23
|
+
scope?: string;
|
|
24
|
+
};
|
|
25
|
+
export type ProviderInfo = {
|
|
26
|
+
name: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
auth: AuthConfig[];
|
|
29
|
+
};
|
|
30
|
+
export type ParameterInfo = {
|
|
31
|
+
name: string;
|
|
32
|
+
in: "query" | "path" | "header" | "cookie";
|
|
33
|
+
required: boolean;
|
|
34
|
+
description?: string;
|
|
35
|
+
type?: string;
|
|
36
|
+
};
|
|
37
|
+
export type BodyInfo = {
|
|
38
|
+
kind: "none" | "properties" | "raw";
|
|
39
|
+
propertyKeys: string[];
|
|
40
|
+
contentType?: string;
|
|
41
|
+
allowsAdditionalProperties?: boolean;
|
|
42
|
+
};
|
|
43
|
+
export type OperationInfo = {
|
|
44
|
+
accessPath: string[];
|
|
45
|
+
operationId: string;
|
|
46
|
+
method: string;
|
|
47
|
+
path: string;
|
|
48
|
+
summary?: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
parameters: ParameterInfo[];
|
|
51
|
+
body: BodyInfo;
|
|
52
|
+
};
|
|
53
|
+
export declare function toCamelCase(name: string): string;
|
|
54
|
+
/** Returns all provider names found in the utdk package directory. */
|
|
55
|
+
export declare function listProviders(): string[];
|
|
56
|
+
/** Returns metadata for a single provider, or undefined if not found. */
|
|
57
|
+
export declare function getProviderInfo(providerName: string): ProviderInfo | undefined;
|
|
58
|
+
/** Parses the OpenAPI spec for a provider and returns all operations with their metadata. */
|
|
59
|
+
export declare function listOperations(providerName: string): OperationInfo[];
|
|
60
|
+
/** Returns the OperationInfo for a specific access-path string like "users.getByUsername". */
|
|
61
|
+
export declare function findOperation(providerName: string, operationPath: string): OperationInfo | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Build a ToolRuntimeMetadataMap from the provider's OpenAPI spec.
|
|
64
|
+
*
|
|
65
|
+
* The map keys equal the bare operationId (which is what OpenApiConverter
|
|
66
|
+
* uses as tool.name). Providing this map to createClient() gives the
|
|
67
|
+
* request assembler correct path/query/header/body routing without
|
|
68
|
+
* relying on the provider's (often empty) hand-written metadata.ts.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildToolMetadata(ops: OperationInfo[]): ToolRuntimeMetadataMap;
|