@soku-ai/cli 0.1.0-alpha.10 → 0.1.0-alpha.11
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/dist/auth/device.d.ts +2 -0
- package/dist/auth/device.d.ts.map +1 -1
- package/dist/auth/device.js +12 -1
- package/dist/auth/device.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +2 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/skills/soku/SKILL.md +157 -23
package/dist/auth/device.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface TokenWorkspace {
|
|
|
22
22
|
brand_name?: string | null;
|
|
23
23
|
brand_slug?: string | null;
|
|
24
24
|
}
|
|
25
|
+
export declare const DEFAULT_RESOURCE_BUNDLES: readonly ["data-infra", "conversion-groups-write", "seo-hosting", "automation", "ads-write", "context-hub", "asset-publish", "brand-skills"];
|
|
26
|
+
export declare const DEFAULT_RESOURCE_SCOPE: string;
|
|
25
27
|
export declare function requestDeviceCode(opts: {
|
|
26
28
|
apiBase?: string;
|
|
27
29
|
scope?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/auth/device.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAI5C,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,yBAAyB,EAAE,MAAM,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,cAAc,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/auth/device.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAI5C,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,yBAAyB,EAAE,MAAM,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,cAAc,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAID,eAAO,MAAM,wBAAwB,8IAS3B,CAAA;AACV,eAAO,MAAM,sBAAsB,QAAqC,CAAA;AAExE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAe/B;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACvC;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAEzB,iFAAiF;AACjF,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,GAAG,OAAO,CAAC,WAAW,CAAC,CA6CvB"}
|
package/dist/auth/device.js
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
import { resolveApiBaseUrl } from '../config.js';
|
|
3
3
|
const CLIENT_ID = 'soku-cli';
|
|
4
4
|
const WORKSPACE_SELECTION_CAPABILITY = 'workspace_selection_v1';
|
|
5
|
+
export const DEFAULT_RESOURCE_BUNDLES = [
|
|
6
|
+
'data-infra',
|
|
7
|
+
'conversion-groups-write',
|
|
8
|
+
'seo-hosting',
|
|
9
|
+
'automation',
|
|
10
|
+
'ads-write',
|
|
11
|
+
'context-hub',
|
|
12
|
+
'asset-publish',
|
|
13
|
+
'brand-skills',
|
|
14
|
+
];
|
|
15
|
+
export const DEFAULT_RESOURCE_SCOPE = DEFAULT_RESOURCE_BUNDLES.join(',');
|
|
5
16
|
export async function requestDeviceCode(opts) {
|
|
6
17
|
const base = resolveApiBaseUrl(opts.apiBase);
|
|
7
18
|
const res = await fetch(`${base}/api/device/code`, {
|
|
@@ -9,7 +20,7 @@ export async function requestDeviceCode(opts) {
|
|
|
9
20
|
headers: { 'Content-Type': 'application/json' },
|
|
10
21
|
body: JSON.stringify({
|
|
11
22
|
client_id: CLIENT_ID,
|
|
12
|
-
scope: opts.scope ??
|
|
23
|
+
scope: opts.scope ?? DEFAULT_RESOURCE_SCOPE,
|
|
13
24
|
client_capabilities: [WORKSPACE_SELECTION_CAPABILITY],
|
|
14
25
|
}),
|
|
15
26
|
});
|
package/dist/auth/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/auth/device.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AA4BhD,MAAM,SAAS,GAAG,UAAU,CAAA;AAC5B,MAAM,8BAA8B,GAAG,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/auth/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAA;AAM1B,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmG3D;AAsCD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAOlF"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** `soku auth login | status | logout` */
|
|
2
2
|
import open from 'open';
|
|
3
3
|
import qrcode from 'qrcode-terminal';
|
|
4
|
-
import { pollForToken, requestDeviceCode, } from '../auth/device.js';
|
|
4
|
+
import { DEFAULT_RESOURCE_SCOPE, pollForToken, requestDeviceCode, } from '../auth/device.js';
|
|
5
5
|
import { clearToken, loadToken, saveToken } from '../auth/store.js';
|
|
6
6
|
import { updateConfig } from '../config.js';
|
|
7
7
|
import { apiRequest } from '../http/client.js';
|
|
@@ -12,7 +12,7 @@ export function registerAuthCommands(program) {
|
|
|
12
12
|
.command('login')
|
|
13
13
|
.description('Sign in via device authorization')
|
|
14
14
|
.option('--api-base <url>', 'Override the API base URL')
|
|
15
|
-
.option('--resource <bundles>', 'Resource bundles to request (comma-separated)
|
|
15
|
+
.option('--resource <bundles>', 'Resource bundles to request (comma-separated). Omit to request all currently known bundles.', DEFAULT_RESOURCE_SCOPE)
|
|
16
16
|
.option('--no-wait', 'Print the verification URL and exit without polling (for agents)')
|
|
17
17
|
.option('--device-code <code>', 'Resume polling for a previously started login')
|
|
18
18
|
.option('--qr', 'Render the verification URL as a QR code')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAG1C,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,MAAM,MAAM,iBAAiB,CAAA;AAEpC,OAAO,EACL,YAAY,EACZ,iBAAiB,GAGlB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE1F,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAA;IAElF,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;SACvD,MAAM,CACL,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAG1C,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,MAAM,MAAM,iBAAiB,CAAA;AAEpC,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,GAGlB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE1F,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAA;IAElF,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;SACvD,MAAM,CACL,sBAAsB,EACtB,6FAA6F,EAC7F,sBAAsB,CACvB;SACA,MAAM,CAAC,WAAW,EAAE,kEAAkE,CAAC;SACvF,MAAM,CAAC,sBAAsB,EAAE,+CAA+C,CAAC;SAC/E,MAAM,CAAC,MAAM,EAAE,0CAA0C,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,0EAA0E;QAC1E,0BAA0B;QAC1B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,YAAY,CAAC;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,CAAC;gBACX,SAAS,EAAE,GAAG;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,IAAyB,CAAA;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,oBAAoB,EAAG,GAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC3E,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,WAAW,CAAC;gBACV,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;gBACzD,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,iCAAiC,IAAI,CAAC,WAAW,EAAE;aAC1D,EAAE,CAAC,CAAC,EAAE,EAAE,CACP;gBACE,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB;gBAC7B,WAAW,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,EAAE;gBAC9C,WAAW,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE;gBAC9B,iBAAiB,CAAC,CAAC,UAAU,GAAG;gBAChC,EAAE;gBACF,GAAG,CAAC,8BAA8B,CAAC;gBACnC,KAAK,CAAC,CAAC,IAAI,EAAE;aACd,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;QACH,CAAC;QAED,4BAA4B;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+BAA+B,IAAI,CAAC,gBAAgB,4BAA4B,IAAI,CAAC,SAAS,MAAM,CACrG,CAAA;QACD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAEnD,MAAM,YAAY,CAAC;YACjB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAA;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAA;QAC3F,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,UAAU,CAA2C,aAAa,CAAC,CAAA;QACpF,WAAW,CACT,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAC3F,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,EAAE,CAAA;QAClB,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACN,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAK3B;IACC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAA;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,SAAS,CAAC,eAAe,EAAE,2BAA2B,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,SAAS,CACP,SAAS,EACT,4CAA4C,EAC5C,QAAQ,CAAC,IAAI,EACb,8BAA8B,CAC/B,CAAA;IACH,CAAC;IACD,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAC3C,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,CAAA;IACzD,WAAW,CACT;QACE,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;QAC1B,oBAAoB,EAAE,mBAAmB;QACzC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI;KAC3C,EACD,GAAG,EAAE,CACH,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,iBAAiB,IAAI,QAAQ,CAAC,OAAO,GAAG,CACrE,mBAAmB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,qBAAqB,CAC1E,EAAE,CACN,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAqC;IACvE,IAAI,CAAC,SAAS,EAAE,eAAe,IAAI,CAAC,SAAS,EAAE,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrE,YAAY,CAAC;QACX,WAAW,EAAE,SAAS,CAAC,eAAe;QACtC,aAAa,EAAE,SAAS,CAAC,QAAQ;KAClC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
package/skills/soku/SKILL.md
CHANGED
|
@@ -7,12 +7,12 @@ description: >-
|
|
|
7
7
|
`soku brand use`, discovering capabilities, calling a data action, routing a
|
|
8
8
|
third-party API call (Ahrefs/DataForSEO/Firecrawl/Gemini/…) through
|
|
9
9
|
`soku egress`, managing `soku seo-hosting connections`, managing
|
|
10
|
-
`soku automation`,
|
|
11
|
-
CLI.
|
|
10
|
+
`soku automation`, using typed Meta Ads write commands, handling 401/403
|
|
11
|
+
errors, or installing/updating the Soku CLI.
|
|
12
12
|
license: Proprietary
|
|
13
13
|
metadata:
|
|
14
14
|
author: nex-ad
|
|
15
|
-
version: "0.
|
|
15
|
+
version: "0.3"
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
# Soku CLI
|
|
@@ -39,6 +39,10 @@ Every command prints JSON. When piped (non-TTY) success is
|
|
|
39
39
|
|
|
40
40
|
`soku` authenticates once per machine with a long-lived, **org-agnostic** session
|
|
41
41
|
token. The org and brand are chosen at runtime (see Workspace), not at login.
|
|
42
|
+
By default, `soku auth login` requests every resource bundle known to the CLI so
|
|
43
|
+
agents can use reads, approved writes, SEO Hosting, automations, Context Hub,
|
|
44
|
+
asset publishing, and Brand Skills without re-authenticating. Only pass
|
|
45
|
+
`--resource` when the user explicitly wants a narrower token.
|
|
42
46
|
|
|
43
47
|
### Agent path (recommended): non-blocking split-flow
|
|
44
48
|
|
|
@@ -204,14 +208,140 @@ soku call ads query_single_dimension --payload '{"account_id":"123","dimension":
|
|
|
204
208
|
soku call posthog query --payload '{"project_id":"12345","tool":"execute-sql","arguments":{"query":"SELECT count() FROM events"}}'
|
|
205
209
|
```
|
|
206
210
|
|
|
211
|
+
### Meta Ads typed commands
|
|
212
|
+
|
|
213
|
+
Meta Ads campaign-tree and creative workflows have an ergonomic typed command
|
|
214
|
+
tree under `soku ads meta`. Use these commands before the raw escape hatch; they
|
|
215
|
+
wrap the same backend actions but expose stable, platform-specific flags and
|
|
216
|
+
client-side validation. Always inspect the exact command help before invoking a
|
|
217
|
+
new verb:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
soku ads meta --help
|
|
221
|
+
soku ads meta campaign create --help
|
|
222
|
+
soku ads meta asset upload-images --help
|
|
223
|
+
soku ads meta creative create --help
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Use the normal agent login before Meta write workflows:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
soku auth login --no-wait
|
|
230
|
+
soku workspace status
|
|
231
|
+
soku ads list-ad-accounts --platform meta
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
If you are intentionally using a restricted token, it must include
|
|
235
|
+
`data-infra,ads-write` for this workflow.
|
|
236
|
+
|
|
237
|
+
Useful read helpers:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
soku ads meta account pages --account-id <meta_account_id>
|
|
241
|
+
soku ads meta campaign get --account-id <meta_account_id> --campaign-id <campaign_id>
|
|
242
|
+
soku ads meta ad get --account-id <meta_account_id> --ad-id <ad_id>
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Asset upload is a direct support action: it mutates Meta's asset library but
|
|
246
|
+
does not change delivery and does not require a review summary. Local image
|
|
247
|
+
files are read by the CLI and sent as bytes; public URLs are passed as URLs.
|
|
248
|
+
The result includes `image_hash` values for creative creation.
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
soku ads meta asset upload-images --account-id <meta_account_id> ./hero.png ./square.jpg
|
|
252
|
+
soku ads meta asset upload-images --account-id <meta_account_id> \
|
|
253
|
+
--url https://example.com/hero.png --name-prefix launch
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Common single-object write flow. Campaign and ad creation land paused; other
|
|
257
|
+
delivery-changing writes are review-gated. Every gated command requires
|
|
258
|
+
`--summary`, returns a review id, and executes only after human approval.
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
soku ads meta campaign create \
|
|
262
|
+
--account-id <meta_account_id> \
|
|
263
|
+
--name "Launch Test" \
|
|
264
|
+
--objective OUTCOME_TRAFFIC \
|
|
265
|
+
--summary "Create paused Meta traffic campaign Launch Test"
|
|
266
|
+
|
|
267
|
+
soku ads meta adset create \
|
|
268
|
+
--account-id <meta_account_id> \
|
|
269
|
+
--campaign-id <campaign_id> \
|
|
270
|
+
--name "US Prospecting" \
|
|
271
|
+
--optimization-goal LINK_CLICKS \
|
|
272
|
+
--billing-event IMPRESSIONS \
|
|
273
|
+
-p targeting='{"geo_locations":{"countries":["US"]}}' \
|
|
274
|
+
--summary "Create paused Meta ad set US Prospecting"
|
|
275
|
+
|
|
276
|
+
soku ads meta creative create \
|
|
277
|
+
--account-id <meta_account_id> \
|
|
278
|
+
--name "Hero image creative" \
|
|
279
|
+
--page-id <page_id> \
|
|
280
|
+
--image-hash <image_hash> \
|
|
281
|
+
--message "Primary text" \
|
|
282
|
+
--headline "Headline" \
|
|
283
|
+
--link https://example.com \
|
|
284
|
+
--call-to-action-type LEARN_MORE \
|
|
285
|
+
--summary "Create Meta image creative for Launch Test"
|
|
286
|
+
|
|
287
|
+
soku ads meta ad create \
|
|
288
|
+
--account-id <meta_account_id> \
|
|
289
|
+
--adset-id <adset_id> \
|
|
290
|
+
--name "Hero image ad" \
|
|
291
|
+
--creative-id <creative_id> \
|
|
292
|
+
--summary "Create paused Meta ad Hero image ad"
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Status controls exist at all three delivery levels:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
soku ads meta campaign activate --campaign-id <campaign_id> --account-id <meta_account_id> --summary "Activate campaign"
|
|
299
|
+
soku ads meta adset pause --adset-id <adset_id> --account-id <meta_account_id> --summary "Pause ad set"
|
|
300
|
+
soku ads meta ad pause --ad-id <ad_id> --account-id <meta_account_id> --summary "Pause ad"
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Bulk commands are intentionally one layer at a time. Each command takes a JSON
|
|
304
|
+
array file, and each item must be an object with a unique non-empty
|
|
305
|
+
`client_ref`. The CLI injects `platform=meta` and the `--account-id`; item fields
|
|
306
|
+
mirror the corresponding raw action payload (`create_campaign`,
|
|
307
|
+
`create_adset`, `create_ad_creative`, or `create_ad`). Bulk approvals execute
|
|
308
|
+
asynchronously after the human approves the review; poll with
|
|
309
|
+
`soku review show <review_id>`.
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
cat > campaigns.json <<'JSON'
|
|
313
|
+
[
|
|
314
|
+
{
|
|
315
|
+
"client_ref": "campaign-us-traffic",
|
|
316
|
+
"name": "US Traffic Test",
|
|
317
|
+
"objective": "OUTCOME_TRAFFIC"
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
JSON
|
|
321
|
+
|
|
322
|
+
soku ads meta campaign bulk-create \
|
|
323
|
+
--account-id <meta_account_id> \
|
|
324
|
+
--items-file campaigns.json \
|
|
325
|
+
--summary "Bulk-create paused Meta campaigns for launch test"
|
|
326
|
+
|
|
327
|
+
soku ads meta adset bulk-create --account-id <meta_account_id> --items-file adsets.json --summary "Bulk-create Meta ad sets"
|
|
328
|
+
soku ads meta creative bulk-create --account-id <meta_account_id> --items-file creatives.json --summary "Bulk-create Meta creatives"
|
|
329
|
+
soku ads meta ad bulk-create --account-id <meta_account_id> --items-file ads.json --summary "Bulk-create paused Meta ads"
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Use `soku call ads <raw_action>` only when the Meta action is not exposed in the
|
|
333
|
+
typed tree, such as some audience, pixel, lead form, label, rule, targeting, or
|
|
334
|
+
live-insights operations.
|
|
335
|
+
|
|
207
336
|
## Automations
|
|
208
337
|
|
|
209
|
-
Use `soku automation` to manage automations for the active brand.
|
|
210
|
-
|
|
338
|
+
Use `soku automation` to manage automations for the active brand. Default agent
|
|
339
|
+
login includes the `automation` resource. If you are intentionally using a
|
|
340
|
+
restricted token, include `automation` explicitly:
|
|
211
341
|
|
|
212
342
|
```bash
|
|
343
|
+
# Restricted-token examples only:
|
|
213
344
|
soku auth login --resource automation
|
|
214
|
-
# or include it with data access:
|
|
215
345
|
soku auth login --resource data-infra,automation
|
|
216
346
|
```
|
|
217
347
|
|
|
@@ -250,12 +380,13 @@ SOKU_WEB_BASE=http://127.0.0.1:47627 soku automation runs <automation_id>
|
|
|
250
380
|
|
|
251
381
|
## SEO Hosting domain connections
|
|
252
382
|
|
|
253
|
-
Use `soku seo-hosting` to manage SEO Hosting for the active brand.
|
|
254
|
-
|
|
383
|
+
Use `soku seo-hosting` to manage SEO Hosting for the active brand. Default agent
|
|
384
|
+
login includes the `seo-hosting` resource. If you are intentionally using a
|
|
385
|
+
restricted token, include `seo-hosting` explicitly:
|
|
255
386
|
|
|
256
387
|
```bash
|
|
388
|
+
# Restricted-token examples only:
|
|
257
389
|
soku auth login --resource seo-hosting
|
|
258
|
-
# or include it with data access:
|
|
259
390
|
soku auth login --resource data-infra,seo-hosting
|
|
260
391
|
```
|
|
261
392
|
|
|
@@ -344,14 +475,14 @@ for Vercel-backed domains.
|
|
|
344
475
|
|
|
345
476
|
## Write actions (human approval required)
|
|
346
477
|
|
|
347
|
-
Some actions mutate state
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
a
|
|
478
|
+
Some actions mutate state and are **review-gated**. Prefer typed commands when
|
|
479
|
+
they exist (`soku ads meta ...`, `soku ads google ...`). Use `soku call` for raw
|
|
480
|
+
actions that are not exposed as typed commands. Review-gated commands do NOT
|
|
481
|
+
execute immediately; they return a review that a human approves.
|
|
351
482
|
|
|
352
483
|
```bash
|
|
353
484
|
soku call ads create_conversion_group --summary "create group: qualified leads" -p name="Qualified leads"
|
|
354
|
-
# → {"ok":true,"data":{"status":"pending_review","
|
|
485
|
+
# → {"ok":true,"data":{"status":"pending_review","review_id":"<id>","summary":"..."}}
|
|
355
486
|
|
|
356
487
|
soku review list # see pending reviews
|
|
357
488
|
soku review show <id> # full payload + (after approval) result
|
|
@@ -359,15 +490,16 @@ soku review approve <id> # a human approves → the action executes now
|
|
|
359
490
|
soku review deny <id> --feedback "wrong account"
|
|
360
491
|
```
|
|
361
492
|
|
|
362
|
-
- The write resource must be granted to the session
|
|
363
|
-
`
|
|
364
|
-
`soku
|
|
493
|
+
- The write resource must be granted to the session. Default login includes
|
|
494
|
+
`conversion-groups-write`; restricted tokens must include it explicitly, for
|
|
495
|
+
example `soku auth login --resource data-infra,conversion-groups-write`.
|
|
496
|
+
Without it, `soku call` returns 403.
|
|
365
497
|
- Approval is **single-use**: one review = one execution. Approving an already
|
|
366
498
|
decided review is a no-op that returns the existing result.
|
|
367
499
|
- Do NOT loop `soku review approve` expecting retries; a failed approval is
|
|
368
500
|
terminal — create a fresh `soku call` to try again.
|
|
369
|
-
- As an agent: surface the `
|
|
370
|
-
|
|
501
|
+
- As an agent: surface the `review_id` + summary to the user and let THEM run
|
|
502
|
+
`soku review approve`. Do not approve on the user's behalf.
|
|
371
503
|
|
|
372
504
|
## Third-party APIs (egress)
|
|
373
505
|
|
|
@@ -453,9 +585,11 @@ so it runs through this same CLI — no in-sandbox tools, no local API keys.
|
|
|
453
585
|
|
|
454
586
|
- Never print the access token (it grants account access). Prefer `SOKU_TOKEN`
|
|
455
587
|
for CI rather than echoing it.
|
|
456
|
-
- Reads (`data-infra`) run directly.
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
588
|
+
- Reads (`data-infra`) run directly. Review-gated writes, whether invoked with
|
|
589
|
+
typed commands or `soku call`, create a pending review and only
|
|
590
|
+
`soku review approve` (a human action) executes them. Direct support writes
|
|
591
|
+
such as Meta image upload or SEO Hosting page writes execute immediately, so
|
|
592
|
+
confirm user intent before running them. Don't approve on the user's behalf,
|
|
593
|
+
and don't assume a `--yes`-style bypass exists — there isn't one.
|
|
460
594
|
- Pass user-provided values as separate argv elements (the `-p key=value` form),
|
|
461
595
|
never by string-concatenating them into a shell command.
|