@soku-ai/cli 0.1.0-alpha.1 → 0.1.0-alpha.10

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 (92) hide show
  1. package/dist/auth/device.d.ts +9 -0
  2. package/dist/auth/device.d.ts.map +1 -1
  3. package/dist/auth/device.js +6 -1
  4. package/dist/auth/device.js.map +1 -1
  5. package/dist/commands/ads.d.ts +32 -0
  6. package/dist/commands/ads.d.ts.map +1 -0
  7. package/dist/commands/ads.js +752 -0
  8. package/dist/commands/ads.js.map +1 -0
  9. package/dist/commands/auth.d.ts +2 -0
  10. package/dist/commands/auth.d.ts.map +1 -1
  11. package/dist/commands/auth.js +28 -7
  12. package/dist/commands/auth.js.map +1 -1
  13. package/dist/commands/automation.d.ts +80 -0
  14. package/dist/commands/automation.d.ts.map +1 -0
  15. package/dist/commands/automation.js +213 -0
  16. package/dist/commands/automation.js.map +1 -0
  17. package/dist/commands/brand-skill.d.ts +72 -0
  18. package/dist/commands/brand-skill.d.ts.map +1 -0
  19. package/dist/commands/brand-skill.js +351 -0
  20. package/dist/commands/brand-skill.js.map +1 -0
  21. package/dist/commands/brand.d.ts.map +1 -1
  22. package/dist/commands/brand.js +59 -1
  23. package/dist/commands/brand.js.map +1 -1
  24. package/dist/commands/call.d.ts.map +1 -1
  25. package/dist/commands/call.js +6 -3
  26. package/dist/commands/call.js.map +1 -1
  27. package/dist/commands/context.d.ts +23 -0
  28. package/dist/commands/context.d.ts.map +1 -0
  29. package/dist/commands/context.js +291 -0
  30. package/dist/commands/context.js.map +1 -0
  31. package/dist/commands/files.d.ts +10 -0
  32. package/dist/commands/files.d.ts.map +1 -0
  33. package/dist/commands/files.js +48 -0
  34. package/dist/commands/files.js.map +1 -0
  35. package/dist/commands/generated.d.ts +24 -3
  36. package/dist/commands/generated.d.ts.map +1 -1
  37. package/dist/commands/generated.js +97 -10
  38. package/dist/commands/generated.js.map +1 -1
  39. package/dist/commands/memory.d.ts +18 -0
  40. package/dist/commands/memory.d.ts.map +1 -0
  41. package/dist/commands/memory.js +70 -0
  42. package/dist/commands/memory.js.map +1 -0
  43. package/dist/commands/review.d.ts.map +1 -1
  44. package/dist/commands/review.js +46 -2
  45. package/dist/commands/review.js.map +1 -1
  46. package/dist/commands/seo-hosting.d.ts +107 -0
  47. package/dist/commands/seo-hosting.d.ts.map +1 -0
  48. package/dist/commands/seo-hosting.js +499 -0
  49. package/dist/commands/seo-hosting.js.map +1 -0
  50. package/dist/commands/skill.d.ts +50 -6
  51. package/dist/commands/skill.d.ts.map +1 -1
  52. package/dist/commands/skill.js +120 -56
  53. package/dist/commands/skill.js.map +1 -1
  54. package/dist/commands/update.d.ts +23 -0
  55. package/dist/commands/update.d.ts.map +1 -0
  56. package/dist/commands/update.js +345 -0
  57. package/dist/commands/update.js.map +1 -0
  58. package/dist/commands/workspace.d.ts +4 -0
  59. package/dist/commands/workspace.d.ts.map +1 -0
  60. package/dist/commands/workspace.js +132 -0
  61. package/dist/commands/workspace.js.map +1 -0
  62. package/dist/config.d.ts +5 -4
  63. package/dist/config.d.ts.map +1 -1
  64. package/dist/config.js +5 -7
  65. package/dist/config.js.map +1 -1
  66. package/dist/generated/capabilities.json +291 -30
  67. package/dist/http/client.d.ts.map +1 -1
  68. package/dist/http/client.js +74 -16
  69. package/dist/http/client.js.map +1 -1
  70. package/dist/index.js +35 -3
  71. package/dist/index.js.map +1 -1
  72. package/dist/output/envelope.d.ts +5 -0
  73. package/dist/output/envelope.d.ts.map +1 -1
  74. package/dist/output/envelope.js +101 -2
  75. package/dist/output/envelope.js.map +1 -1
  76. package/dist/output/unwrap.d.ts.map +1 -1
  77. package/dist/output/unwrap.js +18 -1
  78. package/dist/output/unwrap.js.map +1 -1
  79. package/dist/skills/unzip.d.ts +1 -1
  80. package/dist/skills/unzip.js +1 -1
  81. package/dist/update-check.d.ts +0 -1
  82. package/dist/update-check.d.ts.map +1 -1
  83. package/dist/update-check.js +4 -54
  84. package/dist/update-check.js.map +1 -1
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.d.ts.map +1 -1
  87. package/dist/version.js +1 -1
  88. package/dist/version.js.map +1 -1
  89. package/package.json +7 -4
  90. package/postinstall.cjs +85 -0
  91. package/skills/soku/SKILL.md +254 -18
  92. package/README.md +0 -91
@@ -0,0 +1,291 @@
1
+ /** `soku context` — manage the brand's Context Hub files.
2
+ *
3
+ * The agent can reference these files in chat. All paths are context-relative
4
+ * (no `context/` prefix); the server pins them into the brand's context/ GCS
5
+ * subtree. Upload is the same presigned two-step PUT the web Context Hub uses:
6
+ * POST to mint a signed URL, then PUT the bytes straight to storage.
7
+ */
8
+ import { basename, extname, join, relative } from 'node:path';
9
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
10
+ import { apiRequest } from '../http/client.js';
11
+ import { bold, dim, emitError, emitSuccess, emitSuccessExit, ExitCode, table } from '../output/envelope.js';
12
+ const FILES_PATH = '/api/cli/context-hub/files';
13
+ const UPLOAD_PATH = '/api/cli/context-hub/upload';
14
+ const DIRECTORY_PATH = '/api/cli/context-hub/directory';
15
+ const RENAME_PATH = '/api/cli/context-hub/rename';
16
+ /** Minimal extension → MIME map. The content-type signed in the POST must match
17
+ * the PUT header exactly, so we compute it once and reuse it for both. */
18
+ const MIME_BY_EXT = {
19
+ '.pdf': 'application/pdf',
20
+ '.png': 'image/png',
21
+ '.jpg': 'image/jpeg',
22
+ '.jpeg': 'image/jpeg',
23
+ '.gif': 'image/gif',
24
+ '.webp': 'image/webp',
25
+ '.svg': 'image/svg+xml',
26
+ '.md': 'text/markdown',
27
+ '.markdown': 'text/markdown',
28
+ '.txt': 'text/plain',
29
+ '.csv': 'text/csv',
30
+ '.json': 'application/json',
31
+ '.html': 'text/html',
32
+ '.css': 'text/css',
33
+ '.js': 'text/javascript',
34
+ '.mp4': 'video/mp4',
35
+ '.mov': 'video/quicktime',
36
+ '.webm': 'video/webm',
37
+ '.doc': 'application/msword',
38
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
39
+ '.xls': 'application/vnd.ms-excel',
40
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
41
+ };
42
+ function guessContentType(filename) {
43
+ return MIME_BY_EXT[extname(filename).toLowerCase()] ?? 'application/octet-stream';
44
+ }
45
+ function renderList(data) {
46
+ const here = data.dir ? `context-hub:/${data.dir}` : 'context-hub:/';
47
+ const parts = [bold(here)];
48
+ if (data.directories.length > 0) {
49
+ parts.push(data.directories.map((d) => `${dim('dir')} ${d}/`).join('\n'));
50
+ }
51
+ if (data.files.length > 0) {
52
+ parts.push(table(data.files.map((f) => ({
53
+ name: f.name,
54
+ type: f.file_type,
55
+ size: f.size_bytes,
56
+ path: f.path,
57
+ })), [
58
+ { key: 'name', header: 'NAME' },
59
+ { key: 'type', header: 'TYPE' },
60
+ { key: 'size', header: 'BYTES' },
61
+ { key: 'path', header: 'PATH' },
62
+ ]));
63
+ }
64
+ if (data.directories.length === 0 && data.files.length === 0) {
65
+ parts.push(dim('(empty)'));
66
+ }
67
+ return parts.join('\n');
68
+ }
69
+ /** Files the CLI refuses to upload (operating-system cruft / editor state). */
70
+ const IGNORED_UPLOAD_NAMES = new Set(['.DS_Store', 'Thumbs.db', '.gitignore']);
71
+ /** Expand CLI args (globs, explicit files, and directories) into concrete
72
+ * upload tasks. Directories recurse, preserving their structure under `--dir`
73
+ * (so `upload ./assets --dir assets` lays out `assets/a/b.png` → `assets/a/b.png`).
74
+ * Dotfiles and OS cruft are skipped. */
75
+ export function expandUploadPaths(rawPaths, opts) {
76
+ const tasks = [];
77
+ const seen = new Set();
78
+ const push = (localPath, targetDir, filename) => {
79
+ if (IGNORED_UPLOAD_NAMES.has(filename))
80
+ return;
81
+ if (filename.startsWith('.'))
82
+ return;
83
+ const key = `${targetDir}/${filename}`;
84
+ if (seen.has(key))
85
+ return;
86
+ seen.add(key);
87
+ tasks.push({ localPath, targetDir, filename });
88
+ };
89
+ for (const raw of rawPaths) {
90
+ let info;
91
+ try {
92
+ info = statSync(raw);
93
+ }
94
+ catch {
95
+ throw new Error(`No such file or directory: ${raw}`);
96
+ }
97
+ if (info.isFile()) {
98
+ // Shell-expanded globs land here as plain files. `--name` is applied by
99
+ // the caller only in the single-file case.
100
+ push(raw, opts.dir, basename(raw));
101
+ continue;
102
+ }
103
+ if (info.isDirectory()) {
104
+ walk(raw, (abs) => {
105
+ const rel = relative(raw, abs); // preserve structure: a/b.png
106
+ const dir = join(opts.dir, rel.slice(0, Math.max(0, rel.lastIndexOf('/'))));
107
+ push(abs, dir.replace(/\\/g, '/'), basename(abs));
108
+ });
109
+ continue;
110
+ }
111
+ throw new Error(`Not a file or directory: ${raw}`);
112
+ }
113
+ return tasks;
114
+ }
115
+ /** Synchronous recursive directory walk over regular files (no globs/deps). */
116
+ function walk(root, visit) {
117
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
118
+ const abs = join(root, entry.name);
119
+ if (entry.isDirectory())
120
+ walk(abs, visit);
121
+ else if (entry.isFile())
122
+ visit(abs);
123
+ }
124
+ }
125
+ /** Mint a presigned PUT URL then PUT the bytes — the two-step Context Hub
126
+ * upload, isolated to one file. The presigned URL carries its own auth; the
127
+ * Content-Type MUST match the one signed at mint time. */
128
+ async function uploadOne(task, opts) {
129
+ const { localPath, targetDir, filename } = task;
130
+ const contentType = opts.contentType ?? guessContentType(filename);
131
+ let bytes;
132
+ try {
133
+ bytes = readFileSync(localPath);
134
+ }
135
+ catch (err) {
136
+ return { task, ok: false, error: `read failed: ${err.message}` };
137
+ }
138
+ let minted;
139
+ try {
140
+ minted = await apiRequest(UPLOAD_PATH, {
141
+ method: 'POST',
142
+ body: { filename, content_type: contentType, target_dir: targetDir },
143
+ workspace: true,
144
+ });
145
+ }
146
+ catch (err) {
147
+ return { task, ok: false, error: `mint failed: ${err.message}` };
148
+ }
149
+ try {
150
+ const putRes = await fetch(minted.upload_url, {
151
+ method: 'PUT',
152
+ headers: { 'Content-Type': contentType },
153
+ body: bytes,
154
+ });
155
+ if (!putRes.ok) {
156
+ return { task, ok: false, error: `PUT failed (HTTP ${putRes.status})` };
157
+ }
158
+ }
159
+ catch (err) {
160
+ return { task, ok: false, error: `PUT failed: ${err.message}` };
161
+ }
162
+ return { task, ok: true, path: minted.path, sizeBytes: bytes.length, contentType };
163
+ }
164
+ /** Run upload tasks through a small worker pool so dozens of files don't
165
+ * hammer the proxy/storage serially, but stay bounded. */
166
+ async function uploadAll(tasks, opts) {
167
+ const outcomes = new Array(tasks.length);
168
+ let next = 0;
169
+ const workers = Array.from({ length: Math.min(opts.concurrency, tasks.length) }, async () => {
170
+ while (true) {
171
+ const i = next++;
172
+ if (i >= tasks.length)
173
+ return;
174
+ outcomes[i] = await uploadOne(tasks[i], opts);
175
+ }
176
+ });
177
+ await Promise.all(workers);
178
+ return outcomes;
179
+ }
180
+ function renderUploadSummary(outcomes) {
181
+ const ok = outcomes.filter((o) => o.ok);
182
+ const failed = outcomes.filter((o) => !o.ok);
183
+ const head = `${bold('Uploaded')} ${ok.length}/${outcomes.length} file${outcomes.length === 1 ? '' : 's'}`;
184
+ const lines = [head];
185
+ for (const o of ok) {
186
+ lines.push(` ${dim('+')} ${o.path} (${o.sizeBytes} bytes)`);
187
+ }
188
+ for (const o of failed) {
189
+ lines.push(` ${dim('x')} ${o.task.targetDir}/${o.task.filename} — ${o.error}`);
190
+ }
191
+ return lines.join('\n');
192
+ }
193
+ export function registerContextCommands(program) {
194
+ const context = program
195
+ .command('context')
196
+ .description("Manage the brand's Context Hub files (requires the context-hub resource)");
197
+ context
198
+ .command('list')
199
+ .description('List Context Hub files and directories')
200
+ .option('--dir <dir>', 'Context-relative directory (e.g. docs)', '')
201
+ .action(async (opts) => {
202
+ const q = opts.dir ? `?dir=${encodeURIComponent(opts.dir)}` : '';
203
+ const data = await apiRequest(`${FILES_PATH}${q}`, { workspace: true });
204
+ emitSuccess(data, renderList);
205
+ });
206
+ context
207
+ .command('upload <paths...>')
208
+ .description('Upload one or more files (or directories) to the Context Hub. ' +
209
+ 'Directories recurse and preserve structure under --dir; globs expand. ' +
210
+ 'Runs uploads concurrently; failures are isolated and summarized.')
211
+ .option('--dir <dir>', 'Context-relative target directory (e.g. docs)', '')
212
+ .option('--name <name>', 'Override the stored filename (only valid with a single input file)')
213
+ .option('--content-type <type>', 'Override the content type (defaults to a guess by extension)')
214
+ .option('--concurrency <n>', 'Max simultaneous uploads (default 4)', (v) => {
215
+ const n = Number(v);
216
+ if (!Number.isInteger(n) || n < 1) {
217
+ emitError('usage', `--concurrency must be a positive integer, got: ${v}`, ExitCode.USAGE);
218
+ }
219
+ return n;
220
+ }, 4)
221
+ .action(async (paths, opts) => {
222
+ if (paths.length === 0) {
223
+ emitError('usage', 'upload requires at least one file or directory', ExitCode.USAGE);
224
+ }
225
+ // `--name` only makes sense for a single file; reject ambiguity early.
226
+ if (opts.name && paths.length > 1) {
227
+ emitError('usage', '--name can only be used with a single input file', ExitCode.USAGE);
228
+ }
229
+ let tasks;
230
+ try {
231
+ tasks = expandUploadPaths(paths, { dir: opts.dir });
232
+ }
233
+ catch (err) {
234
+ emitError('usage', err.message, ExitCode.USAGE);
235
+ }
236
+ if (tasks.length === 0) {
237
+ emitError('usage', 'no files to upload (only dotfiles/cruft found?)', ExitCode.USAGE);
238
+ }
239
+ // Apply a single-file rename last, after expansion validated it.
240
+ if (opts.name && tasks.length === 1)
241
+ tasks[0].filename = opts.name;
242
+ const outcomes = await uploadAll(tasks, {
243
+ contentType: opts.contentType,
244
+ concurrency: opts.concurrency,
245
+ });
246
+ const ok = outcomes.filter((o) => o.ok);
247
+ const data = {
248
+ uploaded: ok.length,
249
+ failed: outcomes.length - ok.length,
250
+ total_bytes: ok.reduce((sum, o) => sum + (o.sizeBytes ?? 0), 0),
251
+ files: ok.map((o) => ({ path: o.path, size_bytes: o.sizeBytes, content_type: o.contentType })),
252
+ failures: outcomes.filter((o) => !o.ok).map((o) => ({
253
+ path: `${o.task.targetDir}/${o.task.filename}`,
254
+ error: o.error,
255
+ })),
256
+ };
257
+ // Partial failure still emits the success-shaped summary (callers want
258
+ // the JSON results) but exits non-zero so scripts detect the failures.
259
+ emitSuccessExit(data, data.failed > 0 ? ExitCode.RUNTIME : ExitCode.OK, renderUploadSummary.bind(null, outcomes));
260
+ });
261
+ context
262
+ .command('rm <path>')
263
+ .description('Delete a Context Hub file')
264
+ .action(async (path) => {
265
+ const data = await apiRequest(`${FILES_PATH}?path=${encodeURIComponent(path)}`, { method: 'DELETE', workspace: true });
266
+ emitSuccess(data, (d) => `${bold('Deleted')} ${d.deleted}`);
267
+ });
268
+ context
269
+ .command('mkdir <path>')
270
+ .description('Create a Context Hub directory')
271
+ .action(async (path) => {
272
+ const data = await apiRequest(DIRECTORY_PATH, {
273
+ method: 'POST',
274
+ body: { path },
275
+ workspace: true,
276
+ });
277
+ emitSuccess(data, (d) => `${bold('Created')} ${d.created}/`);
278
+ });
279
+ context
280
+ .command('rename <oldPath> <newPath>')
281
+ .description('Rename or move a Context Hub file or directory')
282
+ .action(async (oldPath, newPath) => {
283
+ const data = await apiRequest(RENAME_PATH, {
284
+ method: 'POST',
285
+ body: { old_path: oldPath, new_path: newPath },
286
+ workspace: true,
287
+ });
288
+ emitSuccess(data, (d) => `${bold('Renamed')} ${d.renamed} → ${d.to}`);
289
+ });
290
+ }
291
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** `soku files publish <file>` — publish a local file to a short-lived public URL.
2
+
3
+ The URL is a GCS signed URL that expires in ~30 minutes. The CLI always
4
+ surfaces `expires_at` prominently (TTY + JSON) so an agent that reuses a stale
5
+ URL downstream understands why the third-party fetch failed — a published URL
6
+ is not permanent.
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function registerFilesCommands(program: Command): void;
10
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0BnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+B5D"}
@@ -0,0 +1,48 @@
1
+ /** `soku files publish <file>` — publish a local file to a short-lived public URL.
2
+
3
+ The URL is a GCS signed URL that expires in ~30 minutes. The CLI always
4
+ surfaces `expires_at` prominently (TTY + JSON) so an agent that reuses a stale
5
+ URL downstream understands why the third-party fetch failed — a published URL
6
+ is not permanent.
7
+ */
8
+ import { basename } from 'node:path';
9
+ import { readFileSync } from 'node:fs';
10
+ import { apiRequest } from '../http/client.js';
11
+ import { bold, dim, emitError, emitSuccess, ExitCode, red } from '../output/envelope.js';
12
+ const PUBLISH_PATH = '/api/cli/files/publish';
13
+ function renderPublish(data) {
14
+ const mins = Math.round(data.expires_in_seconds / 60);
15
+ return [
16
+ `${bold('Published')} ${data.brand_path} (${data.size_bytes} bytes, ${data.content_type})`,
17
+ `${dim('url ')} ${data.url}`,
18
+ `${dim('expires_at')} ${data.expires_at} (in ~${mins} min)`,
19
+ `${red('note ')} this URL is temporary — re-publish if a downstream fetch fails after the expiry.`,
20
+ ].join('\n');
21
+ }
22
+ export function registerFilesCommands(program) {
23
+ const files = program
24
+ .command('files')
25
+ .description('Publish local files to short-lived public URLs (requires asset-publish)');
26
+ files
27
+ .command('publish <file>')
28
+ .description('Publish a local file to a ~30-minute public signed URL')
29
+ .option('--name <name>', 'Override the stored filename (defaults to the local basename)')
30
+ .action(async (file, opts) => {
31
+ let bytes;
32
+ try {
33
+ bytes = readFileSync(file);
34
+ }
35
+ catch (err) {
36
+ return emitError('usage', `Could not read file: ${file}`, ExitCode.USAGE, err.message);
37
+ }
38
+ const form = new FormData();
39
+ form.append('file', new Blob([bytes]), opts.name ?? basename(file));
40
+ const data = await apiRequest(PUBLISH_PATH, {
41
+ method: 'POST',
42
+ body: form,
43
+ workspace: true,
44
+ });
45
+ emitSuccess(data, renderPublish);
46
+ });
47
+ }
48
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAItC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAExF,MAAM,YAAY,GAAG,wBAAwB,CAAA;AAW7C,SAAS,aAAa,CAAC,IAAyB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAA;IACrD,OAAO;QACL,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,WAAW,IAAI,CAAC,YAAY,GAAG;QAC1F,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;QAClC,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,SAAS,IAAI,OAAO;QAC3D,GAAG,GAAG,CAAC,YAAY,CAAC,mFAAmF;KACxG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yEAAyE,CAAC,CAAA;IAEzF,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,+DAA+D,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAuB,EAAE,EAAE;QACtD,IAAI,KAAa,CAAA;QACjB,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CACd,OAAO,EACP,wBAAwB,IAAI,EAAE,EAC9B,QAAQ,CAAC,KAAK,EACb,GAAa,CAAC,OAAO,CACvB,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAEnE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAsB,YAAY,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;QACF,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -22,7 +22,7 @@ export interface ManifestAction {
22
22
  action: string;
23
23
  description: string;
24
24
  long_description: string | null;
25
- capability_mode: string;
25
+ mode: string;
26
26
  priority: string;
27
27
  requires_review: boolean;
28
28
  freshness_kind: string;
@@ -33,9 +33,30 @@ export interface ManifestAction {
33
33
  export interface CapabilityManifest {
34
34
  actions: ManifestAction[];
35
35
  }
36
+ /** POST a data action and emit its result. Shared by the generated commands and
37
+ * the hand-written Tier-2 entity commands (`commands/ads.ts`). */
38
+ export declare function callTypedAction(namespace: string, action: string, payload: Record<string, unknown>): Promise<never>;
39
+ /** Normalize a data-action result and emit it. Review-gated writes return 202 +
40
+ * a pending-review id; we surface a unified `review_id` (not the wire
41
+ * `pending_review_id`) with the approve hint, instead of letting
42
+ * `unwrapDispatch` treat the non-envelope body as opaque data. Non-review
43
+ * writes and reads pass through. Exported so `soku call` reuses the same
44
+ * normalization. */
45
+ export declare function emitActionResult(result: unknown, action?: string): never;
36
46
  /** Load the committed manifest shipped alongside the compiled CLI. */
37
47
  export declare function loadManifest(): CapabilityManifest;
38
- /** Register one namespace group + typed sub-command per manifest action. */
39
- export declare function buildGeneratedCommands(program: Command, manifest: CapabilityManifest): void;
48
+ export interface BuildOptions {
49
+ /** Only render these namespaces (allowlist). */
50
+ namespaces?: string[];
51
+ /** Skip these namespaces (e.g. `ads`, which has a dedicated registrar). */
52
+ exclude?: string[];
53
+ }
54
+ /** Register one namespace group + typed sub-command per manifest action.
55
+ *
56
+ * Returns the namespace → group map so a caller (e.g. `commands/ads.ts`) can
57
+ * attach extra hand-written sub-commands to the same group instead of creating
58
+ * a second, conflicting `command(namespace)`.
59
+ */
60
+ export declare function buildGeneratedCommands(program: Command, manifest: CapabilityManifest, opts?: BuildOptions): Map<string, Command>;
40
61
  export declare function registerGeneratedCommands(program: Command): void;
41
62
  //# sourceMappingURL=generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../src/commands/generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,OAAO,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,aAAa,EAAE,CAAA;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,EAAE,CAAA;CAC1B;AAmCD,sEAAsE;AACtE,wBAAgB,YAAY,IAAI,kBAAkB,CAGjD;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAmD3F;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEhE"}
1
+ {"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../src/commands/generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,OAAO,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,aAAa,EAAE,CAAA;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,EAAE,CAAA;CAC1B;AAgDD;kEACkE;AAClE,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,KAAK,CAAC,CAMhB;AAED;;;;;oBAKoB;AACpB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAwBxE;AAyBD,sEAAsE;AACtE,wBAAgB,YAAY,IAAI,kBAAkB,CAGjD;AAED,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,GAAE,YAAiB,GACtB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAuEtB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAKhE"}
@@ -11,7 +11,7 @@
11
11
  import { readFileSync } from 'node:fs';
12
12
  import { fileURLToPath } from 'node:url';
13
13
  import { apiRequest } from '../http/client.js';
14
- import { emitError, emitSuccess, ExitCode } from '../output/envelope.js';
14
+ import { dim, emitError, emitSuccess, ExitCode, renderHumanData } from '../output/envelope.js';
15
15
  import { unwrapDispatch } from '../output/unwrap.js';
16
16
  function toKebab(name) {
17
17
  return name.replace(/_/g, '-');
@@ -41,13 +41,81 @@ function parseNumberFlag(param, raw) {
41
41
  }
42
42
  return n;
43
43
  }
44
+ /** Short tag describing an action's write semantics, shown in `--help`. */
45
+ function modeBadge(spec) {
46
+ if (spec.mode === 'risk') {
47
+ return '[risk] mutates live ad state — proposes a review; approve with `soku review approve <id>`';
48
+ }
49
+ if (spec.mode === 'write') {
50
+ return spec.requires_review
51
+ ? '[write] proposes a review; approve with `soku review approve <id>`'
52
+ : '[write] executes immediately';
53
+ }
54
+ return '';
55
+ }
56
+ /** POST a data action and emit its result. Shared by the generated commands and
57
+ * the hand-written Tier-2 entity commands (`commands/ads.ts`). */
58
+ export async function callTypedAction(namespace, action, payload) {
59
+ const result = await apiRequest(`/api/cli/call/${encodeURIComponent(namespace)}/${encodeURIComponent(action)}`, { method: 'POST', body: payload, workspace: true });
60
+ return emitActionResult(result, action);
61
+ }
62
+ /** Normalize a data-action result and emit it. Review-gated writes return 202 +
63
+ * a pending-review id; we surface a unified `review_id` (not the wire
64
+ * `pending_review_id`) with the approve hint, instead of letting
65
+ * `unwrapDispatch` treat the non-envelope body as opaque data. Non-review
66
+ * writes and reads pass through. Exported so `soku call` reuses the same
67
+ * normalization. */
68
+ export function emitActionResult(result, action) {
69
+ if (result &&
70
+ typeof result === 'object' &&
71
+ result.status === 'pending_review') {
72
+ const r = result;
73
+ return emitSuccess({ status: 'pending_review', review_id: r.pending_review_id, summary: r.summary }, (d) => `Pending review ${d.review_id}\n ${dim('Approve with:')} soku review approve ${d.review_id}`);
74
+ }
75
+ // An empty `rows` array on a query action is usually "no spend/activities in
76
+ // range" or "wrong dimension/metric selection" — surface a hint so the caller
77
+ // (human or agent) doesn't mistake it for a broken query. gaql_search returns
78
+ // `columns`/`rows` too but its own help already warns; limit to cached queries.
79
+ if (action && action.startsWith('query_') && isEmptyRowsResult(result)) {
80
+ const data = unwrapDispatch(result);
81
+ return emitSuccess(data, () => `${renderHumanData(data)}\n${dim('(no rows — try --mode summary, widen the date range, or run `soku ads list-dimensions` to confirm the dimension)')}`);
82
+ }
83
+ return emitSuccess(unwrapDispatch(result));
84
+ }
85
+ /** True when a query result body has a `rows` array that is present but empty. */
86
+ function isEmptyRowsResult(result) {
87
+ if (!result || typeof result !== 'object')
88
+ return false;
89
+ const rows = result.rows;
90
+ return Array.isArray(rows) && rows.length === 0;
91
+ }
92
+ function actionHelpSuffix(spec) {
93
+ const typedName = `${spec.namespace} ${toKebab(spec.action)}`;
94
+ const rawName = `${spec.namespace} ${spec.action}`;
95
+ const naming = `Typed CLI command: soku ${typedName}\nRaw call action: soku call ${rawName}`;
96
+ if (spec.namespace === 'ads' && spec.action === 'gaql_search') {
97
+ return [
98
+ 'FALLBACK WARNING:',
99
+ 'Prefer cached ads analytics first: `soku ads list-dimensions`, then `soku ads query-single-dimension` or `soku ads query-multi-dimension`.',
100
+ 'Use GAQL only for Google-native fields or segment combinations not covered by cached query actions. If fields are unknown, run `soku ads get-resource-metadata` before this command.',
101
+ '',
102
+ naming,
103
+ ].join('\n');
104
+ }
105
+ return naming;
106
+ }
44
107
  /** Load the committed manifest shipped alongside the compiled CLI. */
45
108
  export function loadManifest() {
46
109
  const path = fileURLToPath(new URL('../generated/capabilities.json', import.meta.url));
47
110
  return JSON.parse(readFileSync(path, 'utf8'));
48
111
  }
49
- /** Register one namespace group + typed sub-command per manifest action. */
50
- export function buildGeneratedCommands(program, manifest) {
112
+ /** Register one namespace group + typed sub-command per manifest action.
113
+ *
114
+ * Returns the namespace → group map so a caller (e.g. `commands/ads.ts`) can
115
+ * attach extra hand-written sub-commands to the same group instead of creating
116
+ * a second, conflicting `command(namespace)`.
117
+ */
118
+ export function buildGeneratedCommands(program, manifest, opts = {}) {
51
119
  const groups = new Map();
52
120
  const groupFor = (namespace) => {
53
121
  let group = groups.get(namespace);
@@ -57,11 +125,18 @@ export function buildGeneratedCommands(program, manifest) {
57
125
  }
58
126
  return group;
59
127
  };
60
- for (const spec of manifest.actions) {
128
+ const actions = manifest.actions.filter((spec) => {
129
+ if (opts.namespaces && !opts.namespaces.includes(spec.namespace))
130
+ return false;
131
+ if (opts.exclude && opts.exclude.includes(spec.namespace))
132
+ return false;
133
+ return true;
134
+ });
135
+ for (const spec of actions) {
61
136
  const cmd = groupFor(spec.namespace).command(toKebab(spec.action));
62
- cmd.description(spec.description);
63
- if (spec.long_description)
64
- cmd.addHelpText('after', `\n${spec.long_description}`);
137
+ cmd.description([modeBadge(spec), spec.description, spec.long_description, actionHelpSuffix(spec)]
138
+ .filter(Boolean)
139
+ .join('\n\n'));
65
140
  for (const param of spec.input_params) {
66
141
  const flag = `--${toKebab(param.name)}`;
67
142
  const desc = param.description || param.name;
@@ -88,6 +163,12 @@ export function buildGeneratedCommands(program, manifest) {
88
163
  cmd.option(valueFlag, desc);
89
164
  }
90
165
  }
166
+ // Review-gated actions carry a mandatory `--summary`: the server stores it
167
+ // as the human-readable review card header (`_summary`). Non-review writes
168
+ // (e.g. upload_image) and reads never get this flag.
169
+ if (spec.requires_review) {
170
+ cmd.requiredOption('--summary <text>', 'Human-readable description of this write; becomes the review approval card header');
171
+ }
91
172
  cmd.action(async (opts) => {
92
173
  const payload = {};
93
174
  for (const param of spec.input_params) {
@@ -95,12 +176,18 @@ export function buildGeneratedCommands(program, manifest) {
95
176
  if (value !== undefined)
96
177
  payload[param.name] = value;
97
178
  }
98
- const result = await apiRequest(`/api/cli/call/${encodeURIComponent(spec.namespace)}/${encodeURIComponent(spec.action)}`, { method: 'POST', body: payload, workspace: true });
99
- emitSuccess(unwrapDispatch(result));
179
+ if (spec.requires_review && typeof opts.summary === 'string') {
180
+ payload._summary = opts.summary;
181
+ }
182
+ await callTypedAction(spec.namespace, spec.action, payload);
100
183
  });
101
184
  }
185
+ return groups;
102
186
  }
103
187
  export function registerGeneratedCommands(program) {
104
- buildGeneratedCommands(program, loadManifest());
188
+ // `ads` has a dedicated registrar (commands/ads.ts) that owns the `ads` group
189
+ // and adds Tier-2 entity sub-commands, so it is excluded here to avoid a
190
+ // duplicate `command('ads')`.
191
+ buildGeneratedCommands(program, loadManifest(), { exclude: ['ads'] });
105
192
  }
106
193
  //# sourceMappingURL=generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/commands/generated.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/commands/generated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** `soku memory` — read memory entries scoped to the active brand. */
2
+ import { Command } from 'commander';
3
+ export type MemoryType = 'user' | 'feedback' | 'reference' | 'task' | 'reflection';
4
+ export interface MemoryEntry {
5
+ type: MemoryType;
6
+ name: string;
7
+ description: string;
8
+ content: string;
9
+ updated_at: string;
10
+ }
11
+ export declare function memoryListPath(opts: {
12
+ type?: string;
13
+ query?: string;
14
+ }): string;
15
+ export declare function renderMemoryEntries(entries: MemoryEntry[]): string;
16
+ export declare function renderMemoryEntry(entry: MemoryEntry): string;
17
+ export declare function registerMemoryCommands(program: Command): void;
18
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,CAAA;AAElF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAcD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAM9E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAiBlE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAM5D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC7D"}