@tutti-os/tutti-ops-cli 0.1.3 → 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 +73 -6
- package/dist/appApi.d.ts +11 -1
- package/dist/appApi.js +48 -3
- package/dist/appApi.js.map +1 -1
- 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 +21 -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/dist/zip.d.ts +19 -0
- package/dist/zip.js +154 -4
- package/dist/zip.js.map +1 -1
- package/package.json +6 -3
- package/skills/tutti-admin/SKILL.md +23 -0
package/README.md
CHANGED
|
@@ -1,8 +1,55 @@
|
|
|
1
1
|
# tutti-ops-cli
|
|
2
2
|
|
|
3
|
-
Internal CLI for Tutti operations
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Internal CLI for Tutti admin operations: access, commerce, App Center, market,
|
|
4
|
+
LLM, releases, computers, tasks, and diagnostics.
|
|
5
|
+
|
|
6
|
+
## Design and development
|
|
7
|
+
|
|
8
|
+
See [implementation status](docs/implementation-status.md) for delivered capabilities and remaining backend dependencies.
|
|
9
|
+
See [CLI design](docs/cli-design.md) for target commands and compatibility,
|
|
10
|
+
[execution contract](docs/cli-contract.md) for agent-facing behavior, and
|
|
11
|
+
[admin capability inventory](docs/admin-cli-capability-inventory.md) for verified API coverage and gaps.
|
|
12
|
+
Repository contributors start with [AGENTS.md](AGENTS.md).
|
|
13
|
+
|
|
14
|
+
## Discover and run
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpm install --frozen-lockfile
|
|
18
|
+
pnpm build
|
|
19
|
+
node dist/index.js capabilities --access read
|
|
20
|
+
node dist/index.js schema access.login-code-settings.update
|
|
21
|
+
node dist/index.js skills show tutti-admin
|
|
22
|
+
|
|
23
|
+
# Offline request preview
|
|
24
|
+
node dist/index.js access login-code-settings update \
|
|
25
|
+
--scope-app-id example-app --enabled false --dry-run
|
|
26
|
+
|
|
27
|
+
# Explicitly execute an authorized write
|
|
28
|
+
node dist/index.js access login-code-settings update \
|
|
29
|
+
--scope-app-id example-app --enabled false --yes
|
|
30
|
+
|
|
31
|
+
# Read all pages for an operation with verified pagination support
|
|
32
|
+
node dist/index.js --mode read brand list --page-all --page-limit 10
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Canonical commands accept `--params` / `--data` as JSON objects, `@file.json`, or
|
|
36
|
+
`-` for stdin. Use schema for required fields and scope. Output defaults to a v1
|
|
37
|
+
JSON envelope; `--format table` produces TSV and `--format ndjson` emits records
|
|
38
|
+
and a summary. Failures use stderr JSON and nonzero exit codes. Exit 6 retains
|
|
39
|
+
partial data or indicates an uncertain write outcome; inspect state before retrying.
|
|
40
|
+
|
|
41
|
+
Management keys support **Read-only** (`access_mode=read`) and **Full access**
|
|
42
|
+
(`access_mode=write`) with the companion backend changes. New keys default to
|
|
43
|
+
read-only; existing keys retain full access. Server enforcement requires the
|
|
44
|
+
[coordinated rollout](docs/admin-token-permissions.md). Verify the target environment
|
|
45
|
+
before relying on typed key support.
|
|
46
|
+
`--mode read` (or `TUTTI_OPS_MODE=read`) adds a local write restriction and does not
|
|
47
|
+
change the key's actual permission. Existing administrator and business rules apply.
|
|
48
|
+
Session access can use an explicitly supplied `TUTTI_ADMIN_COOKIE`.
|
|
49
|
+
|
|
50
|
+
Credential fields are redacted by default. If an authorized task needs a newly
|
|
51
|
+
created token or a client config, pass `--show-secrets` on that successful request.
|
|
52
|
+
Dry-run and error output always redact known credential fields.
|
|
6
53
|
|
|
7
54
|
## Auth
|
|
8
55
|
|
|
@@ -17,7 +64,7 @@ The CLI stores the token in `~/.config/tutti-ops/config.json` with `0600`
|
|
|
17
64
|
permissions. CI can provide `TUTTI_ADMIN_TOKEN` instead.
|
|
18
65
|
`admin.nextop.sh` is normalized to the API origin `https://nextop.sh`.
|
|
19
66
|
|
|
20
|
-
## App Release
|
|
67
|
+
## App Release (legacy commands)
|
|
21
68
|
|
|
22
69
|
```bash
|
|
23
70
|
tutti-ops app list --brand nextop --query design
|
|
@@ -27,8 +74,14 @@ tutti-ops app release --brand nextop --app-id vibe-design --zip ./output/vibe-de
|
|
|
27
74
|
```
|
|
28
75
|
|
|
29
76
|
`app release` validates the zip, creates an artifact upload session, uploads the
|
|
30
|
-
zip, creates the App Center version,
|
|
31
|
-
latest pointer.
|
|
77
|
+
zip, synchronizes its localized catalog metadata, creates the App Center version,
|
|
78
|
+
and optionally publishes it and moves the latest pointer.
|
|
79
|
+
|
|
80
|
+
To backfill catalog metadata without creating a new version:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
tutti-ops app sync-metadata --brand nextop --app-id vibe-design --zip ./output/vibe-design.zip
|
|
84
|
+
```
|
|
32
85
|
|
|
33
86
|
## Maintenance
|
|
34
87
|
|
|
@@ -46,3 +99,17 @@ icon through App Center asset upload, or `--icon-url <url>` when the asset is
|
|
|
46
99
|
already hosted.
|
|
47
100
|
`app delete` removes the app catalog entry and all version metadata. It does not
|
|
48
101
|
delete previously uploaded CDN artifacts.
|
|
102
|
+
|
|
103
|
+
## Canonical App workflow
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
tutti-ops app +validate --zip ./output/vibe-design.zip
|
|
107
|
+
tutti-ops app +release --app-id vibe-design --zip ./output/vibe-design.zip \
|
|
108
|
+
--publish true --latest true --dry-run
|
|
109
|
+
tutti-ops app +release --app-id vibe-design --zip ./output/vibe-design.zip \
|
|
110
|
+
--publish true --latest true --yes
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Legacy App commands retain their original success output and flags. Legacy
|
|
114
|
+
`--brand` does not enforce brand isolation. Use canonical entries for schema,
|
|
115
|
+
dry-run, confirmation, structured output and workflow request history.
|
package/dist/appApi.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { uploadAppZip } from './upload.js';
|
|
1
2
|
import type { HttpClient } from './http.js';
|
|
3
|
+
import { inspectZip } from './zip.js';
|
|
2
4
|
export interface AppReleaseOptions {
|
|
3
5
|
brand: string;
|
|
4
6
|
appId: string;
|
|
@@ -7,9 +9,14 @@ export interface AppReleaseOptions {
|
|
|
7
9
|
latest?: boolean;
|
|
8
10
|
reason?: string;
|
|
9
11
|
}
|
|
12
|
+
interface AppApiDependencies {
|
|
13
|
+
inspectZip: typeof inspectZip;
|
|
14
|
+
uploadAppZip: typeof uploadAppZip;
|
|
15
|
+
}
|
|
10
16
|
export declare class AppApi {
|
|
11
17
|
private readonly http;
|
|
12
|
-
|
|
18
|
+
private readonly dependencies;
|
|
19
|
+
constructor(http: HttpClient, dependencies?: AppApiDependencies);
|
|
13
20
|
list(query?: string): Promise<unknown[]>;
|
|
14
21
|
detail(appId: string, include?: string[]): Promise<Record<string, unknown>>;
|
|
15
22
|
create(data: Record<string, unknown>): Promise<unknown>;
|
|
@@ -28,5 +35,8 @@ export declare class AppApi {
|
|
|
28
35
|
};
|
|
29
36
|
manifest: import("./zip.js").TuttiAppManifest;
|
|
30
37
|
}>;
|
|
38
|
+
syncMetadata(appId: string, zipPath: string, reason?: string): Promise<unknown>;
|
|
39
|
+
private updateCatalogMetadataFromInspectedZip;
|
|
31
40
|
private findApp;
|
|
32
41
|
}
|
|
42
|
+
export {};
|
package/dist/appApi.js
CHANGED
|
@@ -4,10 +4,16 @@ import { lookup } from 'mime-types';
|
|
|
4
4
|
import { uploadAdminAsset, uploadAppZip } from './upload.js';
|
|
5
5
|
import { hashFile, inspectZip } from './zip.js';
|
|
6
6
|
const APP_CENTER_BASE = '/api/desktop/v1/admin/app-center';
|
|
7
|
+
const defaultAppApiDependencies = {
|
|
8
|
+
inspectZip,
|
|
9
|
+
uploadAppZip,
|
|
10
|
+
};
|
|
7
11
|
export class AppApi {
|
|
8
12
|
http;
|
|
9
|
-
|
|
13
|
+
dependencies;
|
|
14
|
+
constructor(http, dependencies = defaultAppApiDependencies) {
|
|
10
15
|
this.http = http;
|
|
16
|
+
this.dependencies = dependencies;
|
|
11
17
|
}
|
|
12
18
|
list(query) {
|
|
13
19
|
return this.http.get(`${APP_CENTER_BASE}/apps`).then((reply) => {
|
|
@@ -92,7 +98,7 @@ export class AppApi {
|
|
|
92
98
|
return this.http.post(`${APP_CENTER_BASE}/apps/${encodeURIComponent(appId)}/versions/${encodeURIComponent(version)}/archive`, { appId, versionId: version, reason });
|
|
93
99
|
}
|
|
94
100
|
async release(options) {
|
|
95
|
-
const zip = await inspectZip(options.zip);
|
|
101
|
+
const zip = await this.dependencies.inspectZip(options.zip);
|
|
96
102
|
if (zip.appId !== options.appId) {
|
|
97
103
|
throw new Error(`zip appId ${zip.appId} does not match --app-id ${options.appId}`);
|
|
98
104
|
}
|
|
@@ -107,7 +113,7 @@ export class AppApi {
|
|
|
107
113
|
throw new Error(`app ${options.appId} version ${versionId} already exists`);
|
|
108
114
|
}
|
|
109
115
|
const contentType = lookup(options.zip) || 'application/zip';
|
|
110
|
-
const artifact = await uploadAppZip(this.http, {
|
|
116
|
+
const artifact = await this.dependencies.uploadAppZip(this.http, {
|
|
111
117
|
appId: options.appId,
|
|
112
118
|
versionId,
|
|
113
119
|
filePath: options.zip,
|
|
@@ -116,6 +122,7 @@ export class AppApi {
|
|
|
116
122
|
sha256: zip.sha256,
|
|
117
123
|
sizeBytes: zip.sizeBytes,
|
|
118
124
|
});
|
|
125
|
+
await this.updateCatalogMetadataFromInspectedZip(options.appId, zip, options.reason);
|
|
119
126
|
const version = await this.http.post(`${APP_CENTER_BASE}/apps/${encodeURIComponent(options.appId)}/versions`, {
|
|
120
127
|
appId: options.appId,
|
|
121
128
|
versionId,
|
|
@@ -132,11 +139,49 @@ export class AppApi {
|
|
|
132
139
|
}
|
|
133
140
|
return { version, artifact, manifest: zip.manifest };
|
|
134
141
|
}
|
|
142
|
+
async syncMetadata(appId, zipPath, reason) {
|
|
143
|
+
const zip = await this.dependencies.inspectZip(zipPath);
|
|
144
|
+
if (zip.appId !== appId) {
|
|
145
|
+
throw new Error(`zip appId ${zip.appId} does not match --app-id ${appId}`);
|
|
146
|
+
}
|
|
147
|
+
if (!(await this.findApp(appId))) {
|
|
148
|
+
throw new Error(`app ${appId} not found`);
|
|
149
|
+
}
|
|
150
|
+
return this.updateCatalogMetadataFromInspectedZip(appId, zip, reason);
|
|
151
|
+
}
|
|
152
|
+
async updateCatalogMetadataFromInspectedZip(appId, zip, reason) {
|
|
153
|
+
const reply = await this.edit(appId, {
|
|
154
|
+
fallbackDisplayName: zip.manifest.name,
|
|
155
|
+
fallbackDescription: zip.manifest.description,
|
|
156
|
+
localizations: zip.localizations,
|
|
157
|
+
replaceLocalizations: true,
|
|
158
|
+
reason,
|
|
159
|
+
});
|
|
160
|
+
assertCatalogLocalizationsPersisted(reply, zip.localizations);
|
|
161
|
+
return reply;
|
|
162
|
+
}
|
|
135
163
|
async findApp(appId) {
|
|
136
164
|
const apps = await this.list();
|
|
137
165
|
return apps.find((item) => getField(item, 'appId', 'app_id') === appId);
|
|
138
166
|
}
|
|
139
167
|
}
|
|
168
|
+
function assertCatalogLocalizationsPersisted(reply, expected) {
|
|
169
|
+
const app = getField(reply, 'app');
|
|
170
|
+
const actual = getField(app, 'localizations');
|
|
171
|
+
if (!Array.isArray(actual) || JSON.stringify(normalizeLocalizations(actual)) !== JSON.stringify(normalizeLocalizations(expected))) {
|
|
172
|
+
throw new Error('App Center did not persist catalog localizations. Deploy a tsh-server version that supports localized catalog metadata.');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function normalizeLocalizations(value) {
|
|
176
|
+
return value.map((item) => ({
|
|
177
|
+
locale: String(getField(item, 'locale') ?? '').trim(),
|
|
178
|
+
name: String(getField(item, 'name') ?? '').trim(),
|
|
179
|
+
description: String(getField(item, 'description') ?? '').trim(),
|
|
180
|
+
tags: Array.isArray(getField(item, 'tags'))
|
|
181
|
+
? getField(item, 'tags').map((tag) => String(tag).trim()).filter(Boolean)
|
|
182
|
+
: [],
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
140
185
|
function appIconUploadFileName(contentType, sha256) {
|
|
141
186
|
const ext = contentType === 'image/png'
|
|
142
187
|
? 'png'
|
package/dist/appApi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appApi.js","sourceRoot":"","sources":["../src/appApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,eAAe,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"appApi.js","sourceRoot":"","sources":["../src/appApi.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -9,8 +9,11 @@ export declare function writeConfig(config: StoredConfig): Promise<void>;
|
|
|
9
9
|
export declare function resolveRuntimeConfig(options?: {
|
|
10
10
|
adminUrl?: string;
|
|
11
11
|
token?: string;
|
|
12
|
+
mode?: 'read' | 'write';
|
|
12
13
|
}): Promise<{
|
|
13
14
|
adminUrl: string;
|
|
14
15
|
token: string;
|
|
16
|
+
cookie: string | undefined;
|
|
17
|
+
mode: "read" | "write";
|
|
15
18
|
}>;
|
|
16
19
|
export { CONFIG_PATH };
|
package/dist/config.js
CHANGED
|
@@ -24,14 +24,19 @@ export async function readConfig() {
|
|
|
24
24
|
}
|
|
25
25
|
export async function writeConfig(config) {
|
|
26
26
|
await mkdir(dirname(CONFIG_PATH), { recursive: true });
|
|
27
|
-
await writeFile(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
27
|
+
await writeFile(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
28
28
|
await chmod(CONFIG_PATH, 0o600);
|
|
29
29
|
}
|
|
30
30
|
export async function resolveRuntimeConfig(options = {}) {
|
|
31
31
|
const stored = await readConfig();
|
|
32
|
-
const adminUrl = normalizeApiOrigin(options.adminUrl || stored.adminUrl);
|
|
33
|
-
const
|
|
34
|
-
|
|
32
|
+
const adminUrl = normalizeApiOrigin(options.adminUrl || process.env.TUTTI_ADMIN_URL || stored.adminUrl);
|
|
33
|
+
const sameOrigin = !stored.token || adminUrl === normalizeApiOrigin(stored.adminUrl);
|
|
34
|
+
const token = (options.token || process.env.TUTTI_ADMIN_TOKEN || (sameOrigin ? stored.token : '') || '').trim();
|
|
35
|
+
const cookie = process.env.TUTTI_ADMIN_COOKIE?.trim();
|
|
36
|
+
const mode = options.mode || process.env.TUTTI_OPS_MODE || 'write';
|
|
37
|
+
if (mode !== 'read' && mode !== 'write')
|
|
38
|
+
throw new Error('Mode must be read or write');
|
|
39
|
+
return { adminUrl, token, cookie, mode: mode };
|
|
35
40
|
}
|
|
36
41
|
export { CONFIG_PATH };
|
|
37
42
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAE3E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAE3E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAC,QAAQ,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;IACnG,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAA0E,EAAE;IACrH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxG,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,KAAK,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;IACnE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACvF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAwB,EAAE,CAAC;AACrE,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { resolveRuntimeConfig } from '../config.js';
|
|
3
|
+
import { operations, findOperation } from '../operations/registry.js';
|
|
4
|
+
import { execute, envelope } from './executor.js';
|
|
5
|
+
import { CliError } from './errors.js';
|
|
6
|
+
import { errorEnvelope, redact, render } from './output.js';
|
|
7
|
+
function child(parent, name) {
|
|
8
|
+
return parent.commands.find(command => command.name() === name) ?? parent.command(name);
|
|
9
|
+
}
|
|
10
|
+
async function stdin() {
|
|
11
|
+
let data = '';
|
|
12
|
+
for await (const chunk of process.stdin)
|
|
13
|
+
data += chunk;
|
|
14
|
+
return data;
|
|
15
|
+
}
|
|
16
|
+
export function registerOperations(program) {
|
|
17
|
+
program.option('--mode <mode>', 'local operation policy: read or write (TUTTI_OPS_MODE)');
|
|
18
|
+
program.command('capabilities').description('List canonical operations and their read/write classification')
|
|
19
|
+
.option('--access <access>', 'read or write').option('--module <module>', 'top-level module')
|
|
20
|
+
.action(options => {
|
|
21
|
+
if (options.access && !['read', 'write'].includes(options.access))
|
|
22
|
+
throw new CliError('INVALID_ACCESS', 'Use read or write');
|
|
23
|
+
const list = operations.filter(op => (!options.access || op.access === options.access) && (!options.module || op.command.split(' ')[0] === options.module));
|
|
24
|
+
process.stdout.write(render(envelope('capabilities', list.map(({ id, command, access, kind, scope, blocked, permission }) => ({ id, command, access, kind, scope, availability: blocked ? 'blocked' : 'implemented', authorization: 'server-enforced; CLI mode is local only', blocked, permission })), false, true)));
|
|
25
|
+
});
|
|
26
|
+
program.command('schema <operation...>').description('Describe one operation (dotted ID or command words)')
|
|
27
|
+
.action((parts) => {
|
|
28
|
+
const op = findOperation(parts.join(' '));
|
|
29
|
+
if (!op)
|
|
30
|
+
throw new CliError('UNKNOWN_OPERATION', 'Unknown operation; run capabilities', 8);
|
|
31
|
+
process.stdout.write(render(envelope('schema', op, false, true)));
|
|
32
|
+
});
|
|
33
|
+
const skills = program.command('skills').description('Discover bundled agent instructions');
|
|
34
|
+
skills.command('list').action(() => { process.stdout.write(render(envelope('skills.list', [{ name: 'tutti-admin' }], false, true))); });
|
|
35
|
+
skills.command('show <name>').action(async (name) => {
|
|
36
|
+
if (name !== 'tutti-admin')
|
|
37
|
+
throw new CliError('UNKNOWN_SKILL', 'Use skills list', 8);
|
|
38
|
+
const text = await readFile(new URL('../../skills/tutti-admin/SKILL.md', import.meta.url), 'utf8');
|
|
39
|
+
process.stdout.write(text);
|
|
40
|
+
});
|
|
41
|
+
for (const op of operations) {
|
|
42
|
+
let command = program;
|
|
43
|
+
for (const name of op.command.split(' '))
|
|
44
|
+
command = child(command, name);
|
|
45
|
+
command.description(`${op.description} [${op.access}${op.blocked ? ', blocked' : ''}]`)
|
|
46
|
+
.option('--params <json>', 'query/path JSON, @file, or - for stdin')
|
|
47
|
+
.option('--data <json>', 'body JSON, @file, or - for stdin')
|
|
48
|
+
.option('--dry-run', 'validate and print a plan without network requests')
|
|
49
|
+
.option('--yes', 'execute an authorized write')
|
|
50
|
+
.option('--format <format>', 'json, table or ndjson', 'json')
|
|
51
|
+
.option('--show-secrets', 'include credential fields in successful output')
|
|
52
|
+
.option('--page-all', 'collect pages with a verified pagination contract')
|
|
53
|
+
.option('--page-limit <count>', 'maximum number of pages', '10')
|
|
54
|
+
.option('--page-delay <ms>', 'delay between pages', '200');
|
|
55
|
+
for (const field of op.fields)
|
|
56
|
+
command.option(`--${field.flag} <value>`, `${field.in}.${field.key}${field.required ? ' (required)' : ''}; ${field.schema.type ?? 'JSON'}`);
|
|
57
|
+
command.action(async (_, cmd) => {
|
|
58
|
+
const options = cmd.optsWithGlobals();
|
|
59
|
+
try {
|
|
60
|
+
const value = await execute(op, options, { stdin, runtime: () => resolveRuntimeConfig(options) });
|
|
61
|
+
process.stdout.write(render(options.showSecrets && !options.dryRun ? value : redact(value), String(options.format)));
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const failure = errorEnvelope(error, op.id);
|
|
65
|
+
process.stderr.write(render(failure.value));
|
|
66
|
+
process.exitCode = failure.exitCode;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class CliError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly exitCode: number;
|
|
4
|
+
readonly details: Record<string, unknown>;
|
|
5
|
+
constructor(code: string, message: string, exitCode?: number, details?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
export declare const errorType: (exit: number) => string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class CliError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
exitCode;
|
|
4
|
+
details;
|
|
5
|
+
constructor(code, message, exitCode = 2, details = {}) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.exitCode = exitCode;
|
|
9
|
+
this.details = details;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const errorType = (exit) => ({
|
|
13
|
+
1: 'internal', 2: 'validation', 3: 'authentication', 4: 'authorization',
|
|
14
|
+
5: 'upstream', 6: 'partial', 7: 'conflict', 8: 'unsupported', 10: 'confirmation',
|
|
15
|
+
}[exit] ?? 'internal');
|
|
16
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACZ;IAAwC;IAAuB;IAApF,YAAqB,IAAY,EAAE,OAAe,EAAW,WAAW,CAAC,EAAW,UAAmC,EAAE;QACvH,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,SAAI,GAAJ,IAAI,CAAQ;QAA4B,aAAQ,GAAR,QAAQ,CAAI;QAAW,YAAO,GAAP,OAAO,CAA8B;IAEzH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,eAAe;IACvE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc;CACjF,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type HttpClientOptions } from '../http.js';
|
|
2
|
+
import type { JsonObject, Operation } from './types.js';
|
|
3
|
+
export interface Dependencies {
|
|
4
|
+
runtime: () => Promise<HttpClientOptions>;
|
|
5
|
+
stdin: () => Promise<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function envelope(operation: string, data: unknown, executed: boolean, complete: boolean | null, extra?: JsonObject): {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
operation: string;
|
|
10
|
+
identity: {
|
|
11
|
+
verification: string;
|
|
12
|
+
};
|
|
13
|
+
data: unknown;
|
|
14
|
+
meta: {
|
|
15
|
+
contractVersion: string;
|
|
16
|
+
executed: boolean;
|
|
17
|
+
complete: boolean | null;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export declare function execute(op: Operation, options: JsonObject, dependencies: Dependencies): Promise<{
|
|
21
|
+
ok: boolean;
|
|
22
|
+
operation: string;
|
|
23
|
+
identity: {
|
|
24
|
+
verification: string;
|
|
25
|
+
};
|
|
26
|
+
data: unknown;
|
|
27
|
+
meta: {
|
|
28
|
+
contractVersion: string;
|
|
29
|
+
executed: boolean;
|
|
30
|
+
complete: boolean | null;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { HttpClient, HttpError } from '../http.js';
|
|
2
|
+
import { CliError } from './errors.js';
|
|
3
|
+
import { buildPlan, parseInput } from './input.js';
|
|
4
|
+
import { runWorkflow } from '../workflows/app.js';
|
|
5
|
+
export function envelope(operation, data, executed, complete, extra = {}) {
|
|
6
|
+
return { ok: true, operation, identity: { verification: executed ? 'request-accepted-by-server' : 'not-checked' }, data, meta: { contractVersion: '1', executed, complete, ...extra } };
|
|
7
|
+
}
|
|
8
|
+
function classify(error, op) {
|
|
9
|
+
if (error instanceof CliError)
|
|
10
|
+
return error;
|
|
11
|
+
if (error instanceof HttpError) {
|
|
12
|
+
const code = error.status;
|
|
13
|
+
if (code === 401)
|
|
14
|
+
return new CliError('UNAUTHENTICATED', 'Server rejected authentication', 3);
|
|
15
|
+
if (code === 403)
|
|
16
|
+
return new CliError('FORBIDDEN', 'Server or local mode denied this operation', 4);
|
|
17
|
+
if (code === 409 || code === 412)
|
|
18
|
+
return new CliError('CONFLICT', 'Resource version or state has changed', 7);
|
|
19
|
+
if (code === 400 || code === 422)
|
|
20
|
+
return new CliError('UPSTREAM_VALIDATION', 'Server rejected the request fields', 2);
|
|
21
|
+
return new CliError('UPSTREAM_ERROR', `HTTP ${code}`, op.access === 'write' && code >= 500 ? 6 : 5, { status: code, outcome: op.access === 'write' && code >= 500 ? 'unknown' : 'failed' });
|
|
22
|
+
}
|
|
23
|
+
return new CliError(op.access === 'write' ? 'WRITE_OUTCOME_UNKNOWN' : 'NETWORK_ERROR', op.access === 'write' ? 'Request failed; inspect resource state before retrying' : 'Request failed', op.access === 'write' ? 6 : 5);
|
|
24
|
+
}
|
|
25
|
+
const get = (value, path) => path.split('.').reduce((v, k) => v && typeof v === 'object' ? (v[k] ?? v[k.replace(/[A-Z]/g, c => '_' + c.toLowerCase())]) : undefined, value);
|
|
26
|
+
export async function execute(op, options, dependencies) {
|
|
27
|
+
if (op.blocked)
|
|
28
|
+
throw new CliError('UNSUPPORTED', op.blocked, 8);
|
|
29
|
+
if (!['json', 'table', 'ndjson'].includes(String(options.format ?? 'json')))
|
|
30
|
+
throw new CliError('INVALID_FORMAT', 'Use json, table or ndjson');
|
|
31
|
+
const mode = options.mode ?? process.env.TUTTI_OPS_MODE ?? 'write';
|
|
32
|
+
if (mode !== 'read' && mode !== 'write')
|
|
33
|
+
throw new CliError('INVALID_MODE', 'Use read or write');
|
|
34
|
+
const input = await parseInput(op, options, dependencies.stdin);
|
|
35
|
+
const plan = buildPlan(op, input);
|
|
36
|
+
if (options.pageAll && !op.pagination)
|
|
37
|
+
throw new CliError('UNSUPPORTED_PAGINATION', 'This operation has no verified automatic pagination contract', 8);
|
|
38
|
+
const limit = Number(options.pageLimit ?? 10), delay = Number(options.pageDelay ?? 200);
|
|
39
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 1000 || !Number.isInteger(delay) || delay < 0 || delay > 60000)
|
|
40
|
+
throw new CliError('INVALID_PAGINATION', 'page-limit: 1..1000; page-delay: 0..60000 ms');
|
|
41
|
+
if (options.dryRun)
|
|
42
|
+
return envelope(op.id, plan, false, false, { locallyAllowed: mode === 'write' || op.access === 'read' });
|
|
43
|
+
if (mode === 'read' && op.access === 'write')
|
|
44
|
+
throw new CliError('READ_ONLY', 'Write operation denied by local read mode', 4);
|
|
45
|
+
if (op.confirmation && !options.yes)
|
|
46
|
+
throw new CliError('CONFIRMATION_REQUIRED', 'Review --dry-run, then pass --yes to execute the authorized write', 10);
|
|
47
|
+
if (op.kind === 'local')
|
|
48
|
+
return envelope(op.id, await runWorkflow(op, input, undefined), false, true);
|
|
49
|
+
const runtime = await dependencies.runtime();
|
|
50
|
+
if (!runtime.token && !runtime.cookie)
|
|
51
|
+
throw new CliError('MISSING_AUTH', 'Set TUTTI_ADMIN_TOKEN for supported bearer endpoints or TUTTI_ADMIN_COOKIE for admin session endpoints', 3);
|
|
52
|
+
const client = new HttpClient({ ...runtime, mode: mode });
|
|
53
|
+
if (op.kind === 'workflow') {
|
|
54
|
+
try {
|
|
55
|
+
return envelope(op.id, await runWorkflow(op, input, client), true, true);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw classify(error, op);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const request = plan.request;
|
|
62
|
+
if (op.id === 'admin-token.create') {
|
|
63
|
+
let capabilities;
|
|
64
|
+
try {
|
|
65
|
+
capabilities = await client.get('/api/admin/api/v1/admin/tokens');
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw classify(error, { ...op, access: 'read' });
|
|
69
|
+
}
|
|
70
|
+
const modes = get(capabilities, 'supportedAccessModes');
|
|
71
|
+
if (!Array.isArray(modes) || !modes.includes('read') || !modes.includes('write'))
|
|
72
|
+
throw new CliError('UNSUPPORTED_TOKEN_PERMISSIONS', 'Upgrade admin-server before creating a typed management token', 8);
|
|
73
|
+
}
|
|
74
|
+
const items = [];
|
|
75
|
+
let pages = 0;
|
|
76
|
+
const p = op.pagination;
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
if (p) {
|
|
79
|
+
const target = p.location === 'data' ? request.data : request.params;
|
|
80
|
+
target[p.size] ??= 20;
|
|
81
|
+
if (p.kind !== 'cursor')
|
|
82
|
+
target[p.key] ??= p.kind === 'offset' ? 0 : 1;
|
|
83
|
+
}
|
|
84
|
+
let response;
|
|
85
|
+
let sourceIncomplete = false;
|
|
86
|
+
for (;;) {
|
|
87
|
+
try {
|
|
88
|
+
response = await client.request(request.method, request.path, request.data, { params: request.params, headers: request.headers, access: op.access });
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (pages)
|
|
92
|
+
throw new CliError('PARTIAL_RESULT', 'Pagination stopped after a request failed', 6, { items, pages, complete: false, cause: classify(error, op).code });
|
|
93
|
+
throw classify(error, op);
|
|
94
|
+
}
|
|
95
|
+
pages++;
|
|
96
|
+
if (!response || typeof response !== 'object')
|
|
97
|
+
throw new CliError('INVALID_RESPONSE', 'Expected a JSON response object', 6);
|
|
98
|
+
if (op.id === 'admin-token.create' && get(response, 'token.accessMode') !== request.data?.access_mode)
|
|
99
|
+
throw new CliError('TOKEN_MODE_MISMATCH', 'Server returned a different token mode; inspect and revoke the new token', 6, { tokenId: get(response, 'token.tokenId') });
|
|
100
|
+
const failures = get(response, 'failedCount');
|
|
101
|
+
const results = get(response, 'results');
|
|
102
|
+
if (Number(failures) > 0 || (Array.isArray(results) && results.some(r => r && typeof r === 'object' && r.success === false)))
|
|
103
|
+
throw new CliError('PARTIAL_RESULT', 'Some batch operations failed', 6, { data: response, complete: false });
|
|
104
|
+
const truncated = ['truncated', 'eventsTruncated', 'sourceTruncated'].some(key => get(response, key) === true);
|
|
105
|
+
sourceIncomplete ||= truncated;
|
|
106
|
+
if (!p)
|
|
107
|
+
return envelope(op.id, response, true, op.access === 'read' ? !truncated : null);
|
|
108
|
+
const batch = get(response, p.items);
|
|
109
|
+
if (!Array.isArray(batch))
|
|
110
|
+
throw new CliError('INVALID_RESPONSE', 'Expected a paginated item array', 6, { items, pages, complete: false });
|
|
111
|
+
items.push(...batch);
|
|
112
|
+
const target = p.location === 'data' ? request.data : request.params;
|
|
113
|
+
const current = target[p.key];
|
|
114
|
+
const size = Number(target[p.size] ?? 20);
|
|
115
|
+
const totalValue = p.total ? get(response, p.total) : undefined;
|
|
116
|
+
const total = totalValue === undefined ? undefined : Number(totalValue);
|
|
117
|
+
const next = p.next ? get(response, p.next) : undefined;
|
|
118
|
+
const more = p.kind === 'cursor' ? typeof next === 'string' && next.length > 0 : total !== undefined ? (p.kind === 'offset' ? Number(current ?? 0) : Math.max(0, Number(current ?? 1) - 1) * size) + batch.length < total : batch.length >= size;
|
|
119
|
+
if (!options.pageAll)
|
|
120
|
+
return envelope(op.id, response, true, !more && !sourceIncomplete, { pages });
|
|
121
|
+
if (!more && (sourceIncomplete || get(response, 'hasMore') === true))
|
|
122
|
+
throw new CliError('PARTIAL_RESULT', 'Source reports incomplete data without a continuation cursor', 6, { items, pages, complete: false });
|
|
123
|
+
if (!more)
|
|
124
|
+
return envelope(op.id, { items }, true, true, { pages });
|
|
125
|
+
if (pages >= limit || batch.length === 0 || (p.kind === 'cursor' && (next === current || seen.has(next))))
|
|
126
|
+
throw new CliError('PARTIAL_RESULT', 'Pagination limit or stalled cursor reached', 6, { items, pages, complete: false, next });
|
|
127
|
+
seen.add(next);
|
|
128
|
+
target[p.key] = p.kind === 'cursor' ? next : p.kind === 'offset' ? Number(current ?? 0) + batch.length : Number(current ?? 1) + 1;
|
|
129
|
+
if (delay)
|
|
130
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Input, JsonObject, Operation, Plan, Schema } from './types.js';
|
|
2
|
+
export declare const flagKey: (name: string) => string;
|
|
3
|
+
export declare const kebab: (name: string) => string;
|
|
4
|
+
export declare function validate(value: unknown, schema: Schema, path?: string): void;
|
|
5
|
+
export declare function parseInput(op: Operation, options: JsonObject, stdin: () => Promise<string>): Promise<Input>;
|
|
6
|
+
export declare function buildPlan(op: Operation, input: Input): Plan;
|