@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.
Files changed (46) hide show
  1. package/README.md +73 -6
  2. package/dist/appApi.d.ts +11 -1
  3. package/dist/appApi.js +48 -3
  4. package/dist/appApi.js.map +1 -1
  5. package/dist/config.d.ts +3 -0
  6. package/dist/config.js +9 -4
  7. package/dist/config.js.map +1 -1
  8. package/dist/core/commands.d.ts +2 -0
  9. package/dist/core/commands.js +71 -0
  10. package/dist/core/commands.js.map +1 -0
  11. package/dist/core/errors.d.ts +7 -0
  12. package/dist/core/errors.js +16 -0
  13. package/dist/core/errors.js.map +1 -0
  14. package/dist/core/executor.d.ts +32 -0
  15. package/dist/core/executor.js +133 -0
  16. package/dist/core/executor.js.map +1 -0
  17. package/dist/core/input.d.ts +6 -0
  18. package/dist/core/input.js +163 -0
  19. package/dist/core/input.js.map +1 -0
  20. package/dist/core/output.d.ts +6 -0
  21. package/dist/core/output.js +35 -0
  22. package/dist/core/output.js.map +1 -0
  23. package/dist/core/types.d.ts +77 -0
  24. package/dist/core/types.js +5 -0
  25. package/dist/core/types.js.map +1 -0
  26. package/dist/http.d.ts +9 -1
  27. package/dist/http.js +44 -41
  28. package/dist/http.js.map +1 -1
  29. package/dist/index.js +21 -7
  30. package/dist/index.js.map +1 -1
  31. package/dist/operations/admin-schemas.d.ts +2 -0
  32. package/dist/operations/admin-schemas.js +2433 -0
  33. package/dist/operations/admin-schemas.js.map +1 -0
  34. package/dist/operations/registry.d.ts +3 -0
  35. package/dist/operations/registry.js +204 -0
  36. package/dist/operations/registry.js.map +1 -0
  37. package/dist/upload.js +1 -0
  38. package/dist/upload.js.map +1 -1
  39. package/dist/workflows/app.d.ts +3 -0
  40. package/dist/workflows/app.js +82 -0
  41. package/dist/workflows/app.js.map +1 -0
  42. package/dist/zip.d.ts +19 -0
  43. package/dist/zip.js +154 -4
  44. package/dist/zip.js.map +1 -1
  45. package/package.json +6 -3
  46. 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. The first workflow is App Center
4
- release publishing, but the command surface is intentionally broader than app
5
- uploads so it can grow with admin automation.
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, and optionally publishes it and moves the
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
- constructor(http: HttpClient);
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
- constructor(http) {
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'
@@ -1 +1 @@
1
- {"version":3,"file":"appApi.js","sourceRoot":"","sources":["../src/appApi.ts"],"names":[],"mappings":"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"}
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 token = (options.token || process.env.TUTTI_ADMIN_TOKEN || stored.token || '').trim();
34
- return { adminUrl, token };
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
@@ -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;IAC7E,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAiD,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,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,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOperations(program: Command): void;
@@ -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;