@tutti-os/tutti-ops-cli 0.1.4 → 0.1.5
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/README.md +65 -4
- package/dist/config.d.ts +3 -0
- package/dist/config.js +9 -4
- package/dist/config.js.map +1 -1
- package/dist/core/commands.d.ts +2 -0
- package/dist/core/commands.js +71 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/errors.d.ts +7 -0
- package/dist/core/errors.js +16 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/executor.d.ts +32 -0
- package/dist/core/executor.js +133 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/input.d.ts +6 -0
- package/dist/core/input.js +163 -0
- package/dist/core/input.js.map +1 -0
- package/dist/core/output.d.ts +6 -0
- package/dist/core/output.js +35 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/types.d.ts +77 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/http.d.ts +9 -1
- package/dist/http.js +44 -41
- package/dist/http.js.map +1 -1
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/operations/admin-schemas.d.ts +2 -0
- package/dist/operations/admin-schemas.js +2433 -0
- package/dist/operations/admin-schemas.js.map +1 -0
- package/dist/operations/registry.d.ts +3 -0
- package/dist/operations/registry.js +204 -0
- package/dist/operations/registry.js.map +1 -0
- package/dist/upload.js +1 -0
- package/dist/upload.js.map +1 -1
- package/dist/workflows/app.d.ts +3 -0
- package/dist/workflows/app.js +82 -0
- package/dist/workflows/app.js.map +1 -0
- package/package.json +3 -2
- package/skills/tutti-admin/SKILL.md +23 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CliError, errorType } from './errors.js';
|
|
2
|
+
const secretKey = /^(authorization|cookie|token|token_value|tokenValue|auth_token|authToken|access_token|accessToken|secretAccessKey|secret_access_key|sessionToken|session_token|credentials|uploadSignature|upload_signature|uploadUrl|upload_url|plain_code|plainCode|codex_snippets|claude_code_snippets|codexSnippets|claudeCodeSnippets)$/i;
|
|
3
|
+
export function redact(value) {
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return value.map(redact);
|
|
6
|
+
if (value && typeof value === 'object')
|
|
7
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, secretKey.test(key) && typeof item !== 'object' ? '[REDACTED]' : secretKey.test(key) && key !== 'token' ? '[REDACTED]' : redact(item)]));
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
export function errorEnvelope(error, operation) {
|
|
11
|
+
const e = error instanceof CliError ? error : new CliError('INTERNAL_ERROR', error instanceof Error ? error.message : 'Unknown error', 1);
|
|
12
|
+
return { exitCode: e.exitCode, value: redact({ ok: false, operation, error: { type: errorType(e.exitCode), code: e.code, message: e.message, retryable: false, ...e.details }, meta: { contractVersion: '1' } }) };
|
|
13
|
+
}
|
|
14
|
+
export function render(value, format = 'json') {
|
|
15
|
+
if (format === 'json')
|
|
16
|
+
return JSON.stringify(value, null, 2) + '\n';
|
|
17
|
+
const record = value;
|
|
18
|
+
const data = record.data;
|
|
19
|
+
const collectionKey = data && typeof data === 'object' && !Array.isArray(data) ? Object.keys(data).find(key => Array.isArray(data[key])) : undefined;
|
|
20
|
+
const collection = Array.isArray(data) ? data : collectionKey ? data[collectionKey] : undefined;
|
|
21
|
+
const context = collectionKey ? Object.fromEntries(Object.entries(data).filter(([key]) => key !== collectionKey)) : undefined;
|
|
22
|
+
const rows = collection ?? (data === undefined ? [] : [data]);
|
|
23
|
+
if (format === 'table') {
|
|
24
|
+
const objects = rows.map(row => row && typeof row === 'object' && !Array.isArray(row) ? row : { value: row });
|
|
25
|
+
const columns = [...new Set(objects.flatMap(row => Object.keys(row)))];
|
|
26
|
+
const cell = (item) => (typeof item === 'string' ? item : JSON.stringify(item) ?? '').replace(/[\t\r\n]/g, ' ');
|
|
27
|
+
return [columns.join('\t'), ...objects.map(row => columns.map(k => cell(row[k])).join('\t')), `# context ${JSON.stringify(context ?? {})}`, `# meta ${JSON.stringify(record.meta)}`].join('\n') + '\n';
|
|
28
|
+
}
|
|
29
|
+
if (format === 'ndjson') {
|
|
30
|
+
const { data: omitted, ...metadata } = record;
|
|
31
|
+
return [...rows.map(data => JSON.stringify({ type: 'item', data })), JSON.stringify({ type: 'summary', ...metadata, context })].join('\n') + '\n';
|
|
32
|
+
}
|
|
33
|
+
throw new CliError('INVALID_FORMAT', 'Format must be json, table or ndjson');
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type Access = 'read' | 'write';
|
|
2
|
+
export type JsonObject = Record<string, unknown>;
|
|
3
|
+
export interface Schema {
|
|
4
|
+
type?: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';
|
|
5
|
+
properties?: Record<string, Schema>;
|
|
6
|
+
required?: string[];
|
|
7
|
+
additionalProperties?: boolean | Schema;
|
|
8
|
+
items?: Schema;
|
|
9
|
+
enum?: unknown[];
|
|
10
|
+
anyOf?: Schema[];
|
|
11
|
+
minimum?: number;
|
|
12
|
+
maximum?: number;
|
|
13
|
+
pattern?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface Field {
|
|
17
|
+
flag: string;
|
|
18
|
+
key: string;
|
|
19
|
+
in: 'params' | 'data' | 'headers' | 'local';
|
|
20
|
+
schema: Schema;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
identity?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface Operation {
|
|
25
|
+
id: string;
|
|
26
|
+
command: string;
|
|
27
|
+
description: string;
|
|
28
|
+
access: Access;
|
|
29
|
+
kind: 'api' | 'workflow' | 'local';
|
|
30
|
+
effects: string[];
|
|
31
|
+
scope: string;
|
|
32
|
+
fields: Field[];
|
|
33
|
+
params: Schema;
|
|
34
|
+
data?: Schema;
|
|
35
|
+
method?: string;
|
|
36
|
+
path?: string;
|
|
37
|
+
confirmation: boolean;
|
|
38
|
+
permission?: string;
|
|
39
|
+
blocked?: string;
|
|
40
|
+
pagination?: {
|
|
41
|
+
location: 'params' | 'data';
|
|
42
|
+
kind: 'page' | 'offset' | 'cursor';
|
|
43
|
+
key: string;
|
|
44
|
+
size: string;
|
|
45
|
+
items: string;
|
|
46
|
+
total?: string;
|
|
47
|
+
next?: string;
|
|
48
|
+
};
|
|
49
|
+
steps?: string[];
|
|
50
|
+
source: string;
|
|
51
|
+
}
|
|
52
|
+
export interface Input {
|
|
53
|
+
params: JsonObject;
|
|
54
|
+
data?: JsonObject;
|
|
55
|
+
headers: Record<string, string>;
|
|
56
|
+
local: JsonObject;
|
|
57
|
+
}
|
|
58
|
+
export interface Plan {
|
|
59
|
+
operation: string;
|
|
60
|
+
access: Access;
|
|
61
|
+
scope: string;
|
|
62
|
+
effects: string[];
|
|
63
|
+
request?: {
|
|
64
|
+
method: string;
|
|
65
|
+
path: string;
|
|
66
|
+
params: JsonObject;
|
|
67
|
+
data?: JsonObject;
|
|
68
|
+
headers: Record<string, string>;
|
|
69
|
+
};
|
|
70
|
+
steps?: string[];
|
|
71
|
+
localInputs?: JsonObject;
|
|
72
|
+
unresolved: string[];
|
|
73
|
+
}
|
|
74
|
+
export declare const object: (properties?: Record<string, Schema>, required?: string[]) => Schema;
|
|
75
|
+
export declare const string: Schema;
|
|
76
|
+
export declare const integer: Schema;
|
|
77
|
+
export declare const boolean: Schema;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const object = (properties = {}, required = []) => ({ type: 'object', properties, required, additionalProperties: false });
|
|
2
|
+
export const string = { type: 'string' };
|
|
3
|
+
export const integer = { type: 'integer', minimum: 0 };
|
|
4
|
+
export const boolean = { type: 'boolean' };
|
|
5
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAyEA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,aAAqC,EAAE,EAAE,WAAqB,EAAE,EAAU,EAAE,CACjG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACjD,MAAM,CAAC,MAAM,OAAO,GAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/http.d.ts
CHANGED
|
@@ -6,11 +6,19 @@ export declare class HttpError extends Error {
|
|
|
6
6
|
export interface HttpClientOptions {
|
|
7
7
|
adminUrl: string;
|
|
8
8
|
token?: string;
|
|
9
|
+
cookie?: string;
|
|
10
|
+
mode?: 'read' | 'write';
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface RequestOptions {
|
|
14
|
+
params?: Record<string, unknown>;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
access?: 'read' | 'write';
|
|
9
17
|
}
|
|
10
18
|
export declare class HttpClient {
|
|
11
19
|
private readonly options;
|
|
12
20
|
constructor(options: HttpClientOptions);
|
|
13
|
-
request<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
21
|
+
request<T>(method: string, path: string, body?: unknown, request?: RequestOptions): Promise<T>;
|
|
14
22
|
get<T>(path: string): Promise<T>;
|
|
15
23
|
post<T>(path: string, body?: unknown): Promise<T>;
|
|
16
24
|
patch<T>(path: string, body?: unknown): Promise<T>;
|
package/dist/http.js
CHANGED
|
@@ -12,52 +12,55 @@ export class HttpClient {
|
|
|
12
12
|
constructor(options) {
|
|
13
13
|
this.options = options;
|
|
14
14
|
}
|
|
15
|
-
async request(method, path, body) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
async request(method, path, body, request = {}) {
|
|
16
|
+
const access = request.access ?? (['GET', 'HEAD', 'OPTIONS'].includes(method) ? 'read' : 'write');
|
|
17
|
+
if (this.options.mode === 'read' && access === 'write')
|
|
18
|
+
throw new HttpError('Write operation denied by local read mode', 403, undefined);
|
|
19
|
+
const origin = new URL(this.options.adminUrl).origin;
|
|
20
|
+
if (!path.startsWith('/') || path.startsWith('//'))
|
|
21
|
+
throw new HttpError('Expected a relative API path', 400, undefined);
|
|
22
|
+
const url = new URL(path, origin);
|
|
23
|
+
if (url.origin !== origin)
|
|
24
|
+
throw new HttpError('Cross-origin API request denied', 400, undefined);
|
|
25
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)))
|
|
26
|
+
throw new HttpError('Credentials require HTTPS (except localhost)', 400, undefined);
|
|
27
|
+
for (const [key, value] of Object.entries(request.params ?? {})) {
|
|
28
|
+
if (value === undefined || value === null)
|
|
29
|
+
continue;
|
|
30
|
+
for (const item of Array.isArray(value) ? value : [value])
|
|
31
|
+
url.searchParams.append(key, String(item));
|
|
21
32
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
33
|
+
const headers = { accept: 'application/json' };
|
|
34
|
+
for (const [key, value] of Object.entries(request.headers ?? {})) {
|
|
35
|
+
if (key !== 'brand_id')
|
|
36
|
+
throw new HttpError('Unsupported request header', 400, undefined);
|
|
37
|
+
headers[key] = value;
|
|
26
38
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
if (this.options.token)
|
|
40
|
+
headers.authorization = `Bearer ${this.options.token}`;
|
|
41
|
+
if (this.options.cookie)
|
|
42
|
+
headers.cookie = this.options.cookie;
|
|
43
|
+
if (body !== undefined)
|
|
44
|
+
headers['content-type'] = 'application/json';
|
|
45
|
+
const response = await fetch(url, { method, headers, body: body === undefined ? undefined : JSON.stringify(body),
|
|
46
|
+
redirect: 'error', signal: AbortSignal.timeout(this.options.timeoutMs ?? 30_000) });
|
|
32
47
|
const text = await response.text();
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
48
|
+
let parsed = {};
|
|
49
|
+
if (text.trim()) {
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(text);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
parsed = text;
|
|
55
|
+
}
|
|
36
56
|
}
|
|
57
|
+
if (!response.ok)
|
|
58
|
+
throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response.status, parsed);
|
|
37
59
|
return parsed;
|
|
38
60
|
}
|
|
39
|
-
get(path) {
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return this.request('POST', path, body);
|
|
44
|
-
}
|
|
45
|
-
patch(path, body) {
|
|
46
|
-
return this.request('PATCH', path, body);
|
|
47
|
-
}
|
|
48
|
-
delete(path) {
|
|
49
|
-
return this.request('DELETE', path);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function parseResponseBody(text) {
|
|
53
|
-
if (!text.trim()) {
|
|
54
|
-
return {};
|
|
55
|
-
}
|
|
56
|
-
try {
|
|
57
|
-
return JSON.parse(text);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return text;
|
|
61
|
-
}
|
|
61
|
+
get(path) { return this.request('GET', path); }
|
|
62
|
+
post(path, body) { return this.request('POST', path, body); }
|
|
63
|
+
patch(path, body) { return this.request('PATCH', path, body); }
|
|
64
|
+
delete(path) { return this.request('DELETE', path); }
|
|
62
65
|
}
|
|
63
66
|
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createInterface } from 'node:readline/promises';
|
|
3
3
|
import { stdin as input, stdout as output } from 'node:process';
|
|
4
|
-
import { Command } from 'commander';
|
|
4
|
+
import { Command, CommanderError } from 'commander';
|
|
5
|
+
import { CliError } from './core/errors.js';
|
|
5
6
|
import { AppApi } from './appApi.js';
|
|
6
7
|
import { CONFIG_PATH, readConfig, resolveRuntimeConfig, writeConfig } from './config.js';
|
|
7
8
|
import { HttpClient } from './http.js';
|
|
8
9
|
import { inspectZip } from './zip.js';
|
|
9
|
-
|
|
10
|
+
import { registerOperations } from './core/commands.js';
|
|
11
|
+
import { errorEnvelope, render } from './core/output.js';
|
|
12
|
+
const program = new Command().exitOverride().configureOutput({ writeErr: () => { } });
|
|
10
13
|
const ADMIN_TOKEN_INSPECT_PATH = '/api/admin/api/v1/admin/auth/token/inspect';
|
|
11
14
|
program
|
|
12
15
|
.name('tutti-ops')
|
|
@@ -135,15 +138,19 @@ app
|
|
|
135
138
|
.requiredOption('--version <version>')
|
|
136
139
|
.option('--reason <reason>')
|
|
137
140
|
.action(runApp((api, options) => api.archive(options.appId, options.version, options.reason)));
|
|
141
|
+
registerOperations(program);
|
|
138
142
|
program.parseAsync().catch((error) => {
|
|
139
|
-
|
|
140
|
-
|
|
143
|
+
if (error instanceof CommanderError && error.exitCode === 0)
|
|
144
|
+
return;
|
|
145
|
+
const failure = errorEnvelope(error instanceof CommanderError ? new CliError('INVALID_ARGUMENTS', 'Invalid arguments; run the command with --help') : error);
|
|
146
|
+
process.stderr.write(render(failure.value));
|
|
147
|
+
process.exitCode = failure.exitCode;
|
|
141
148
|
});
|
|
142
149
|
function run(handler) {
|
|
143
150
|
return async () => {
|
|
144
151
|
const options = program.opts();
|
|
145
152
|
const runtime = await resolveRuntimeConfig(options);
|
|
146
|
-
if (!runtime.token) {
|
|
153
|
+
if (!runtime.token && !runtime.cookie) {
|
|
147
154
|
throw new Error('TUTTI_ADMIN_TOKEN is required. Run `tutti-ops auth login` first.');
|
|
148
155
|
}
|
|
149
156
|
print(await handler(new HttpClient(runtime)));
|
|
@@ -153,7 +160,7 @@ function runApp(handler) {
|
|
|
153
160
|
return async (options) => {
|
|
154
161
|
const rootOptions = program.opts();
|
|
155
162
|
const runtime = await resolveRuntimeConfig(rootOptions);
|
|
156
|
-
if (!runtime.token) {
|
|
163
|
+
if (!runtime.token && !runtime.cookie) {
|
|
157
164
|
throw new Error('TUTTI_ADMIN_TOKEN is required. Run `tutti-ops auth login` first.');
|
|
158
165
|
}
|
|
159
166
|
print(await handler(new AppApi(new HttpClient(runtime)), options));
|
|
@@ -180,6 +187,6 @@ async function resolveIconUrl(api, options) {
|
|
|
180
187
|
return api.uploadAppIcon(options.appId, icon);
|
|
181
188
|
}
|
|
182
189
|
function inspectAdminToken(client, token) {
|
|
183
|
-
return client.
|
|
190
|
+
return client.request('POST', ADMIN_TOKEN_INSPECT_PATH, token ? { token_value: token, metadata_only: true } : { metadata_only: true }, { access: 'read' });
|
|
184
191
|
}
|
|
185
192
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|