@soku-ai/cli 0.1.0-alpha.3 → 0.1.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -13
- package/dist/commands/brand.d.ts.map +1 -1
- package/dist/commands/brand.js +57 -1
- package/dist/commands/brand.js.map +1 -1
- package/dist/commands/generated.d.ts.map +1 -1
- package/dist/commands/generated.js +16 -3
- package/dist/commands/generated.js.map +1 -1
- package/dist/commands/memory.d.ts +18 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +70 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/skill.d.ts +44 -10
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +77 -45
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/update.d.ts +23 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +345 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workspace.d.ts +4 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +132 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/generated/capabilities.json +1 -1
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +50 -14
- package/dist/http/client.js.map +1 -1
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/output/unwrap.d.ts.map +1 -1
- package/dist/output/unwrap.js +18 -1
- package/dist/output/unwrap.js.map +1 -1
- package/dist/skills/unzip.d.ts +1 -1
- package/dist/skills/unzip.js +1 -1
- package/dist/update-check.d.ts +0 -1
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +4 -54
- package/dist/update-check.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -2
- package/postinstall.cjs +85 -0
- package/skills/soku/SKILL.md +79 -9
package/dist/http/client.js
CHANGED
|
@@ -53,7 +53,7 @@ export async function apiRequest(path, opts = {}) {
|
|
|
53
53
|
return emitError('not_found', describeError(parsed) ?? 'Not found.', ExitCode.NOT_FOUND);
|
|
54
54
|
}
|
|
55
55
|
if (res.status >= 400) {
|
|
56
|
-
return emitError('request_failed', describeError(parsed) ?? `HTTP ${res.status}`,
|
|
56
|
+
return emitError(describeCode(parsed) ?? 'request_failed', describeError(parsed) ?? `HTTP ${res.status}`, exitCodeForStatus(res.status), describeHint(parsed) ?? undefined);
|
|
57
57
|
}
|
|
58
58
|
return parsed;
|
|
59
59
|
}
|
|
@@ -66,21 +66,16 @@ function safeJson(text) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
function describeError(parsed) {
|
|
69
|
+
const detail = detailObject(parsed);
|
|
70
|
+
if (detail?.message)
|
|
71
|
+
return String(detail.message);
|
|
72
|
+
const err = dispatcherErrorObject(parsed);
|
|
73
|
+
if (err?.message)
|
|
74
|
+
return String(err.message);
|
|
75
|
+
if (err?.code)
|
|
76
|
+
return String(err.code);
|
|
69
77
|
if (parsed && typeof parsed === 'object') {
|
|
70
78
|
const obj = parsed;
|
|
71
|
-
const detail = obj.detail;
|
|
72
|
-
if (detail?.message)
|
|
73
|
-
return String(detail.message);
|
|
74
|
-
// The shared data dispatcher returns { ok: false, error: <string | object> }.
|
|
75
|
-
// Unwrap a nested error object so the user sees the real message, not
|
|
76
|
-
// "[object Object]".
|
|
77
|
-
if (obj.error && typeof obj.error === 'object') {
|
|
78
|
-
const err = obj.error;
|
|
79
|
-
if (err.message)
|
|
80
|
-
return String(err.message);
|
|
81
|
-
if (err.code)
|
|
82
|
-
return String(err.code);
|
|
83
|
-
}
|
|
84
79
|
if (obj.error)
|
|
85
80
|
return String(obj.error);
|
|
86
81
|
if (obj.message)
|
|
@@ -88,4 +83,45 @@ function describeError(parsed) {
|
|
|
88
83
|
}
|
|
89
84
|
return null;
|
|
90
85
|
}
|
|
86
|
+
function describeCode(parsed) {
|
|
87
|
+
const detail = detailObject(parsed);
|
|
88
|
+
if (detail?.error)
|
|
89
|
+
return String(detail.error);
|
|
90
|
+
if (detail?.code)
|
|
91
|
+
return String(detail.code);
|
|
92
|
+
const err = dispatcherErrorObject(parsed);
|
|
93
|
+
if (err?.code)
|
|
94
|
+
return String(err.code);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
function describeHint(parsed) {
|
|
98
|
+
const detail = detailObject(parsed);
|
|
99
|
+
if (detail?.hint)
|
|
100
|
+
return String(detail.hint);
|
|
101
|
+
const err = dispatcherErrorObject(parsed);
|
|
102
|
+
if (err?.hint)
|
|
103
|
+
return String(err.hint);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
function detailObject(parsed) {
|
|
107
|
+
if (!parsed || typeof parsed !== 'object')
|
|
108
|
+
return null;
|
|
109
|
+
const detail = parsed.detail;
|
|
110
|
+
return detail && typeof detail === 'object' ? detail : null;
|
|
111
|
+
}
|
|
112
|
+
function dispatcherErrorObject(parsed) {
|
|
113
|
+
if (!parsed || typeof parsed !== 'object')
|
|
114
|
+
return null;
|
|
115
|
+
const error = parsed.error;
|
|
116
|
+
return error && typeof error === 'object' ? error : null;
|
|
117
|
+
}
|
|
118
|
+
function exitCodeForStatus(status) {
|
|
119
|
+
if (status === 400 || status === 422)
|
|
120
|
+
return ExitCode.USAGE;
|
|
121
|
+
if (status === 401 || status === 403)
|
|
122
|
+
return ExitCode.AUTH;
|
|
123
|
+
if (status === 404)
|
|
124
|
+
return ExitCode.NOT_FOUND;
|
|
125
|
+
return ExitCode.RUNTIME;
|
|
126
|
+
}
|
|
91
127
|
//# sourceMappingURL=client.js.map
|
package/dist/http/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"AAAA;gFACgF;AAEhF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,10 +6,13 @@ import { registerBrandCommands } from './commands/brand.js';
|
|
|
6
6
|
import { registerCallCommand } from './commands/call.js';
|
|
7
7
|
import { registerEgressCommands } from './commands/egress.js';
|
|
8
8
|
import { registerGeneratedCommands } from './commands/generated.js';
|
|
9
|
+
import { registerMemoryCommands } from './commands/memory.js';
|
|
9
10
|
import { registerOrgCommands } from './commands/org.js';
|
|
10
11
|
import { registerResourceCommands } from './commands/resources.js';
|
|
11
12
|
import { registerReviewCommands } from './commands/review.js';
|
|
12
13
|
import { registerSkillCommand } from './commands/skill.js';
|
|
14
|
+
import { maybeAutoUpdateCli, maybeAutoUpdateSkills, registerUpdateCommand } from './commands/update.js';
|
|
15
|
+
import { registerWorkspaceCommands } from './commands/workspace.js';
|
|
13
16
|
import { maybeNotifyUpdate, registerUpdateCheckCommand } from './update-check.js';
|
|
14
17
|
import { emitError, ExitCode } from './output/envelope.js';
|
|
15
18
|
import { CLI_VERSION } from './version.js';
|
|
@@ -21,17 +24,36 @@ program
|
|
|
21
24
|
registerAuthCommands(program);
|
|
22
25
|
registerOrgCommands(program);
|
|
23
26
|
registerBrandCommands(program);
|
|
27
|
+
registerWorkspaceCommands(program);
|
|
24
28
|
registerResourceCommands(program);
|
|
29
|
+
registerMemoryCommands(program);
|
|
25
30
|
registerGeneratedCommands(program);
|
|
26
31
|
registerCallCommand(program);
|
|
27
32
|
registerEgressCommands(program);
|
|
28
33
|
registerReviewCommands(program);
|
|
29
34
|
registerSkillCommand(program);
|
|
35
|
+
registerUpdateCommand(program);
|
|
30
36
|
registerUpdateCheckCommand(program);
|
|
37
|
+
function commandNames(command) {
|
|
38
|
+
const names = new Set();
|
|
39
|
+
let current = command;
|
|
40
|
+
while (current) {
|
|
41
|
+
names.add(current.name());
|
|
42
|
+
current = current.parent ?? null;
|
|
43
|
+
}
|
|
44
|
+
return names;
|
|
45
|
+
}
|
|
31
46
|
program.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
32
|
-
|
|
47
|
+
const names = commandNames(actionCommand);
|
|
48
|
+
if (names.has('update-check') || names.has('update'))
|
|
33
49
|
return;
|
|
34
|
-
await
|
|
50
|
+
await maybeAutoUpdateCli();
|
|
51
|
+
if (process.env.SOKU_AUTO_UPDATE_CLI !== '1') {
|
|
52
|
+
await maybeNotifyUpdate();
|
|
53
|
+
}
|
|
54
|
+
if (names.has('skill'))
|
|
55
|
+
return;
|
|
56
|
+
await maybeAutoUpdateSkills();
|
|
35
57
|
});
|
|
36
58
|
program.parseAsync(process.argv).catch((err) => {
|
|
37
59
|
emitError('unexpected', err instanceof Error ? err.message : String(err), ExitCode.RUNTIME);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,4BAA4B;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvB,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,wBAAwB,CAAC,OAAO,CAAC,CAAA;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAA;AAClC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,0BAA0B,CAAC,OAAO,CAAC,CAAA;AAEnC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE;IAC9D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../../src/output/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH;6EAC6E;AAC7E,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../../src/output/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH;6EAC6E;AAC7E,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAmBvD"}
|
package/dist/output/unwrap.js
CHANGED
|
@@ -21,13 +21,30 @@ export function unwrapDispatch(result) {
|
|
|
21
21
|
return result.data ?? null;
|
|
22
22
|
const err = result.error;
|
|
23
23
|
let message = 'Action failed.';
|
|
24
|
+
let type = 'action_failed';
|
|
25
|
+
let hint;
|
|
26
|
+
let exitCode = ExitCode.RUNTIME;
|
|
24
27
|
if (typeof err === 'string') {
|
|
25
28
|
message = err;
|
|
26
29
|
}
|
|
27
30
|
else if (err && typeof err === 'object') {
|
|
28
31
|
const obj = err;
|
|
32
|
+
type = String(obj.code ?? type);
|
|
29
33
|
message = String(obj.message ?? obj.code ?? JSON.stringify(err));
|
|
34
|
+
hint = obj.hint ? String(obj.hint) : undefined;
|
|
35
|
+
exitCode = exitCodeForStatus(obj.status_code);
|
|
30
36
|
}
|
|
31
|
-
return emitError(
|
|
37
|
+
return emitError(type, message, exitCode, hint);
|
|
38
|
+
}
|
|
39
|
+
function exitCodeForStatus(status) {
|
|
40
|
+
if (typeof status !== 'number')
|
|
41
|
+
return ExitCode.RUNTIME;
|
|
42
|
+
if (status === 400 || status === 422)
|
|
43
|
+
return ExitCode.USAGE;
|
|
44
|
+
if (status === 401 || status === 403)
|
|
45
|
+
return ExitCode.AUTH;
|
|
46
|
+
if (status === 404)
|
|
47
|
+
return ExitCode.NOT_FOUND;
|
|
48
|
+
return ExitCode.RUNTIME;
|
|
32
49
|
}
|
|
33
50
|
//# sourceMappingURL=unwrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../src/output/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../src/output/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAQvE,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,IAAI,IAAI,KAAK;QACb,OAAQ,KAAyB,CAAC,EAAE,KAAK,SAAS,CACnD,CAAA;AACH,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC9C,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IAEzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;IACxB,IAAI,OAAO,GAAG,gBAAgB,CAAA;IAC9B,IAAI,IAAI,GAAG,eAAe,CAAA;IAC1B,IAAI,IAAwB,CAAA;IAC5B,IAAI,QAAQ,GAAkB,QAAQ,CAAC,OAAO,CAAA;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,GAAG,CAAA;IACf,CAAC;SAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,GAA8B,CAAA;QAC1C,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QAC/B,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;QAChE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC9C,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAe;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAA;IACvD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;IAC3D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAA;IAC1D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC,SAAS,CAAA;IAC7C,OAAO,QAAQ,CAAC,OAAO,CAAA;AACzB,CAAC"}
|
package/dist/skills/unzip.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Safe in-memory unzip for skill bundles downloaded from the
|
|
1
|
+
/** Safe in-memory unzip for skill bundles downloaded from the public catalog.
|
|
2
2
|
*
|
|
3
3
|
* Mirrors the server's `packages/services/marketplace/zip_safety.py` rules so a
|
|
4
4
|
* bundle the packer produces is one the CLI will accept: strip a single top
|
package/dist/skills/unzip.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Safe in-memory unzip for skill bundles downloaded from the
|
|
1
|
+
/** Safe in-memory unzip for skill bundles downloaded from the public catalog.
|
|
2
2
|
*
|
|
3
3
|
* Mirrors the server's `packages/services/marketplace/zip_safety.py` rules so a
|
|
4
4
|
* bundle the packer produces is one the CLI will accept: strip a single top
|
package/dist/update-check.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,YAAY;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,GAAG,CAAC,EAAE,IAAI,CAAA;CACX;AA0CD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAyBD,wBAAsB,cAAc,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkBxF;AAQD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAavD;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8BjE"}
|
package/dist/update-check.js
CHANGED
|
@@ -1,34 +1,8 @@
|
|
|
1
|
-
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
3
|
-
import { configDir } from './config.js';
|
|
4
1
|
import { cyan, dim, emitError, emitSuccess, ExitCode } from './output/envelope.js';
|
|
5
2
|
import { CLI_PACKAGE_NAME, CLI_VERSION } from './version.js';
|
|
6
3
|
const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org';
|
|
7
4
|
const INSTALL_COMMAND = `npm i -g ${CLI_PACKAGE_NAME}`;
|
|
8
|
-
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
9
5
|
const REQUEST_TIMEOUT_MS = 2500;
|
|
10
|
-
function cachePath() {
|
|
11
|
-
return join(configDir(), 'update-check.json');
|
|
12
|
-
}
|
|
13
|
-
function readCache(now) {
|
|
14
|
-
try {
|
|
15
|
-
const cache = JSON.parse(readFileSync(cachePath(), 'utf8'));
|
|
16
|
-
const checkedAt = new Date(cache.checked_at).getTime();
|
|
17
|
-
if (!Number.isFinite(checkedAt))
|
|
18
|
-
return null;
|
|
19
|
-
if (now.getTime() - checkedAt > CACHE_TTL_MS)
|
|
20
|
-
return null;
|
|
21
|
-
return cache;
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
function writeCache(cache) {
|
|
28
|
-
const path = cachePath();
|
|
29
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
30
|
-
writeFileSync(path, `${JSON.stringify(cache, null, 2)}\n`, { mode: 0o600 });
|
|
31
|
-
}
|
|
32
6
|
function parseVersionParts(version) {
|
|
33
7
|
const core = version.split('-', 1)[0] ?? '';
|
|
34
8
|
return core.split('.').map((part) => {
|
|
@@ -114,29 +88,8 @@ export async function checkForUpdate(opts = {}) {
|
|
|
114
88
|
const currentVersion = opts.currentVersion ?? CLI_VERSION;
|
|
115
89
|
const registryUrl = (opts.registryUrl ?? DEFAULT_REGISTRY_URL).replace(/\/$/, '');
|
|
116
90
|
const now = opts.now ?? new Date();
|
|
117
|
-
if (opts.useCache !== false) {
|
|
118
|
-
const cache = readCache(now);
|
|
119
|
-
if (cache) {
|
|
120
|
-
const latestVersion = cache.latest_version;
|
|
121
|
-
return {
|
|
122
|
-
packageName: CLI_PACKAGE_NAME,
|
|
123
|
-
currentVersion,
|
|
124
|
-
latestVersion,
|
|
125
|
-
published: !cache.package_unpublished,
|
|
126
|
-
updateAvailable: latestVersion !== null && compareSemverish(latestVersion, currentVersion) > 0,
|
|
127
|
-
installCommand: INSTALL_COMMAND,
|
|
128
|
-
checkedAt: cache.checked_at,
|
|
129
|
-
registryUrl,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
91
|
const latestVersion = await fetchLatestVersion(registryUrl, opts.fetchImpl ?? fetch);
|
|
134
92
|
const checkedAt = now.toISOString();
|
|
135
|
-
writeCache({
|
|
136
|
-
checked_at: checkedAt,
|
|
137
|
-
latest_version: latestVersion,
|
|
138
|
-
...(latestVersion === null ? { package_unpublished: true } : {}),
|
|
139
|
-
});
|
|
140
93
|
return {
|
|
141
94
|
packageName: CLI_PACKAGE_NAME,
|
|
142
95
|
currentVersion,
|
|
@@ -149,8 +102,6 @@ export async function checkForUpdate(opts = {}) {
|
|
|
149
102
|
};
|
|
150
103
|
}
|
|
151
104
|
function shouldSkipNotice() {
|
|
152
|
-
if (!process.stderr.isTTY)
|
|
153
|
-
return true;
|
|
154
105
|
if (process.env.CI)
|
|
155
106
|
return true;
|
|
156
107
|
if (process.env.SOKU_NO_UPDATE_CHECK === '1')
|
|
@@ -165,7 +116,7 @@ export async function maybeNotifyUpdate() {
|
|
|
165
116
|
if (!result.updateAvailable || !result.latestVersion)
|
|
166
117
|
return;
|
|
167
118
|
process.stderr.write(`${dim('Update available:')} ${CLI_PACKAGE_NAME} ${result.currentVersion} -> ${result.latestVersion}\n` +
|
|
168
|
-
`${dim('Run')} ${cyan(
|
|
119
|
+
`${dim('Run')} ${cyan('soku update cli')}\n`);
|
|
169
120
|
}
|
|
170
121
|
catch {
|
|
171
122
|
// Update checks are advisory. Never fail the user command because npm is
|
|
@@ -174,14 +125,13 @@ export async function maybeNotifyUpdate() {
|
|
|
174
125
|
}
|
|
175
126
|
export function registerUpdateCheckCommand(program) {
|
|
176
127
|
program
|
|
177
|
-
.command('update-check')
|
|
178
|
-
.description('
|
|
128
|
+
.command('update-check', { hidden: true })
|
|
129
|
+
.description('Legacy alias for `soku update status`')
|
|
179
130
|
.option('--registry-url <url>', 'Override the npm registry URL')
|
|
180
131
|
.action(async (opts) => {
|
|
181
132
|
try {
|
|
182
133
|
const result = await checkForUpdate({
|
|
183
134
|
registryUrl: opts.registryUrl,
|
|
184
|
-
useCache: false,
|
|
185
135
|
});
|
|
186
136
|
emitSuccess(result, (d) => {
|
|
187
137
|
if (!d.published) {
|
|
@@ -193,7 +143,7 @@ export function registerUpdateCheckCommand(program) {
|
|
|
193
143
|
return `${CLI_PACKAGE_NAME} is up to date (${d.currentVersion}).`;
|
|
194
144
|
return [
|
|
195
145
|
`${CLI_PACKAGE_NAME} ${d.currentVersion} -> ${d.latestVersion}`,
|
|
196
|
-
`${dim('Run')} ${cyan(
|
|
146
|
+
`${dim('Run')} ${cyan('soku update cli')}`,
|
|
197
147
|
].join('\n');
|
|
198
148
|
});
|
|
199
149
|
}
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soku-ai/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.6",
|
|
4
4
|
"description": "Soku CLI — call Soku ads/GA4 data capabilities from any AI agent or shell.",
|
|
5
5
|
"license": "Proprietary",
|
|
6
6
|
"author": "Soku",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist",
|
|
30
|
+
"postinstall.cjs",
|
|
30
31
|
"skills"
|
|
31
32
|
],
|
|
32
33
|
"engines": {
|
|
@@ -39,9 +40,10 @@
|
|
|
39
40
|
"scripts": {
|
|
40
41
|
"build": "tsc && mkdir -p dist/generated && cp src/generated/capabilities.json dist/generated/capabilities.json",
|
|
41
42
|
"typecheck": "tsc --noEmit",
|
|
42
|
-
"test": "tsc -p tsconfig.test.json &&
|
|
43
|
+
"test": "tsc -p tsconfig.test.json && find .test-build -name '*.test.js' -print | sort | xargs node --test",
|
|
43
44
|
"gen:capabilities": "pnpm run build && node scripts/gen-capabilities.ts",
|
|
44
45
|
"clean": "rm -rf dist .test-build",
|
|
46
|
+
"postinstall": "node postinstall.cjs",
|
|
45
47
|
"prepublishOnly": "pnpm run clean && pnpm run build"
|
|
46
48
|
},
|
|
47
49
|
"dependencies": {
|
package/postinstall.cjs
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Refresh previously installed bundled Soku meta-skills after a global npm
|
|
4
|
+
* install. Business skills still update through `soku update skills`, because
|
|
5
|
+
* that path verifies catalog zip checksums and may need network access.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('node:fs')
|
|
9
|
+
const os = require('node:os')
|
|
10
|
+
const path = require('node:path')
|
|
11
|
+
|
|
12
|
+
const MANIFEST_FILE = '.soku-skills.json'
|
|
13
|
+
const SOKU_META = 'soku'
|
|
14
|
+
|
|
15
|
+
function shouldRun() {
|
|
16
|
+
return process.env.npm_config_global === 'true' || process.env.npm_config_global === '1'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function copyDir(source, dest) {
|
|
20
|
+
fs.mkdirSync(dest, { recursive: true })
|
|
21
|
+
for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
|
|
22
|
+
const from = path.join(source, entry.name)
|
|
23
|
+
const to = path.join(dest, entry.name)
|
|
24
|
+
if (entry.isDirectory()) {
|
|
25
|
+
copyDir(from, to)
|
|
26
|
+
} else if (entry.isFile()) {
|
|
27
|
+
fs.copyFileSync(from, to)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function loadManifest(baseDir) {
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(fs.readFileSync(path.join(baseDir, MANIFEST_FILE), 'utf8'))
|
|
35
|
+
} catch {
|
|
36
|
+
return {}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function hasSokuSkill(baseDir) {
|
|
41
|
+
const manifest = loadManifest(baseDir)
|
|
42
|
+
return (
|
|
43
|
+
Object.keys(manifest).length > 0 ||
|
|
44
|
+
fs.existsSync(path.join(baseDir, SOKU_META, 'SKILL.md'))
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function refreshMetaSkill(baseDir, bundledDir) {
|
|
49
|
+
if (!hasSokuSkill(baseDir)) return
|
|
50
|
+
|
|
51
|
+
const dest = path.join(baseDir, SOKU_META)
|
|
52
|
+
fs.mkdirSync(dest, { recursive: true })
|
|
53
|
+
fs.rmSync(path.join(dest, 'SKILL.md'), { force: true })
|
|
54
|
+
fs.rmSync(path.join(dest, 'references'), { recursive: true, force: true })
|
|
55
|
+
fs.copyFileSync(path.join(bundledDir, 'SKILL.md'), path.join(dest, 'SKILL.md'))
|
|
56
|
+
const referencesDir = path.join(bundledDir, 'references')
|
|
57
|
+
if (fs.existsSync(referencesDir)) {
|
|
58
|
+
copyDir(referencesDir, path.join(dest, 'references'))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const manifest = loadManifest(baseDir)
|
|
62
|
+
manifest[SOKU_META] = {
|
|
63
|
+
sha256: '',
|
|
64
|
+
installed_at: new Date().toISOString(),
|
|
65
|
+
source: 'bundled',
|
|
66
|
+
}
|
|
67
|
+
fs.writeFileSync(path.join(baseDir, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\n`)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function main() {
|
|
71
|
+
if (!shouldRun()) return
|
|
72
|
+
const bundledDir = path.join(__dirname, 'skills', SOKU_META)
|
|
73
|
+
if (!fs.existsSync(path.join(bundledDir, 'SKILL.md'))) return
|
|
74
|
+
|
|
75
|
+
for (const agentDir of ['.claude/skills', '.codex/skills', '.cursor/skills']) {
|
|
76
|
+
try {
|
|
77
|
+
refreshMetaSkill(path.join(os.homedir(), agentDir), bundledDir)
|
|
78
|
+
} catch {
|
|
79
|
+
// Best-effort lifecycle hook: npm install must not fail because an agent
|
|
80
|
+
// skill directory is missing, locked, or otherwise temporarily unreadable.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
main()
|
package/skills/soku/SKILL.md
CHANGED
|
@@ -89,10 +89,36 @@ soku org list # organizations you belong to
|
|
|
89
89
|
soku org use <slug|id> # set active org (id, slug, or name; clears a now-mismatched brand)
|
|
90
90
|
soku brand list # brands in the active org
|
|
91
91
|
soku brand use <slug|id> # id, slug, or name
|
|
92
|
+
soku workspace status # show the active org/brand and whether it is ready
|
|
93
|
+
soku workspace resolve <brand> # inspect accessible brand matches across orgs
|
|
94
|
+
soku workspace use-brand <brand> # set org + brand together when the match is unique
|
|
92
95
|
```
|
|
93
96
|
|
|
94
97
|
Env overrides for one-off invocations: `SOKU_ORG_ID`, `SOKU_BRAND_ID`.
|
|
95
98
|
|
|
99
|
+
Do not infer Soku workspace state from the current shell directory. The working
|
|
100
|
+
directory may contain unrelated README/AGENTS/context files from the user's local
|
|
101
|
+
project. Start with `soku workspace status`; if the target brand is unknown, use
|
|
102
|
+
`soku workspace resolve <brand>` and then `soku workspace use-brand <brand>`.
|
|
103
|
+
|
|
104
|
+
## Brand memory
|
|
105
|
+
|
|
106
|
+
Memory is scoped to the active Soku workspace, not to the local shell directory.
|
|
107
|
+
After `soku workspace status` is ready, these commands read memory for the
|
|
108
|
+
current brand only:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
soku memory list
|
|
112
|
+
soku memory search "policy 2026-05-31"
|
|
113
|
+
soku memory get reference noiz-policy-event
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Use brand memory as background, hypotheses, and investigation leads. Do not
|
|
117
|
+
treat a memory note as a verified data fact unless this turn also confirms it
|
|
118
|
+
with data actions, change history, billing evidence, or another authoritative
|
|
119
|
+
source. In reports, label memory-derived context separately from data-confirmed
|
|
120
|
+
findings.
|
|
121
|
+
|
|
96
122
|
## Calling capabilities (discover with --help, then run)
|
|
97
123
|
|
|
98
124
|
Each data capability is a typed sub-command under its namespace. Discover and
|
|
@@ -110,8 +136,34 @@ soku ads query-single-dimension --account-id 123 --dimension campaign \
|
|
|
110
136
|
```
|
|
111
137
|
|
|
112
138
|
`<command> --help` is authoritative for valid flags, required vs optional, types,
|
|
113
|
-
and usage. Read it before invoking an unfamiliar action.
|
|
114
|
-
|
|
139
|
+
and usage. Read it before invoking an unfamiliar action. Typed command names use
|
|
140
|
+
kebab-case (`soku ads query-single-dimension`); raw `soku call` action names use
|
|
141
|
+
registry snake_case (`soku call ads query_single_dimension`). Object/list flags
|
|
142
|
+
take a JSON string, e.g. `--filters '{"campaign_id":["123"]}'`.
|
|
143
|
+
|
|
144
|
+
### Google Ads GAQL fallback
|
|
145
|
+
|
|
146
|
+
Prefer cached ads analytics first:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
soku ads list-dimensions --platform google --account-id 123
|
|
150
|
+
soku ads query-single-dimension --account-id 123 --dimension campaign ...
|
|
151
|
+
soku ads query-multi-dimension --account-id 123 --dimensions '["campaign","device"]' ...
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Use GAQL only when cached query actions cannot expose the Google-native fields
|
|
155
|
+
or segment combination you need:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
soku ads get-resource-metadata --platform google --account-id 123 --resource-name campaign
|
|
159
|
+
soku ads gaql-search --platform google --account-id 123 \
|
|
160
|
+
--dimensions '["date","campaign"]' --metrics '["cost","clicks"]' --limit 20
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Do not write full `SELECT ... FROM ...` GAQL SQL. `gaql-search` takes structured
|
|
164
|
+
`dimensions`, `metrics`, `filters`, `date_range`, `order_by`, and `limit`; the
|
|
165
|
+
server translates those into real GAQL. For the same action through the raw
|
|
166
|
+
escape hatch, use snake_case: `soku call ads gaql_search --payload '{...}'`.
|
|
115
167
|
|
|
116
168
|
### Raw escape hatch
|
|
117
169
|
|
|
@@ -180,18 +232,25 @@ returned verbatim on stdout.
|
|
|
180
232
|
## Installing / updating the skill
|
|
181
233
|
|
|
182
234
|
```bash
|
|
183
|
-
soku update
|
|
235
|
+
soku update status # show CLI + installed skill update status
|
|
236
|
+
soku update skills # refresh this meta-skill and installed business skills
|
|
237
|
+
soku update cli # install the latest CLI from npm
|
|
184
238
|
soku skill install # this meta-skill into .claude / .codex / .cursor (project)
|
|
185
239
|
soku skill install --global # into ~/.claude, ~/.codex, ~/.cursor
|
|
186
240
|
soku skill install --agent claude --global
|
|
187
241
|
```
|
|
188
242
|
|
|
189
|
-
|
|
190
|
-
|
|
243
|
+
Normal `soku` commands schedule a background refresh for installed Soku-managed
|
|
244
|
+
skills at most once every 24 hours. Set `SOKU_NO_SKILL_AUTO_UPDATE=1` to disable
|
|
245
|
+
skill auto updates, or `SOKU_UPDATE_INTERVAL_HOURS=<n>` to change the interval.
|
|
191
246
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
247
|
+
The CLI binary itself is advisory by default. To opt into automatic npm CLI
|
|
248
|
+
updates, set `SOKU_AUTO_UPDATE_CLI=1`; otherwise run `soku update cli` when
|
|
249
|
+
`soku update status` shows a newer version.
|
|
250
|
+
|
|
251
|
+
A global `npm i -g @soku-ai/cli` refreshes this already-installed global
|
|
252
|
+
meta-skill after npm finishes installing. It does not install new skills and it
|
|
253
|
+
does not update project-local skills.
|
|
195
254
|
|
|
196
255
|
## Installing business skills (account audits, Google Ads, reports, …)
|
|
197
256
|
|
|
@@ -205,10 +264,21 @@ soku skill list # browse the catalog
|
|
|
205
264
|
soku skill install account-audit # install one (into soku-account-audit/)
|
|
206
265
|
soku skill install ads-report google-ads
|
|
207
266
|
soku skill install --all # install everything
|
|
208
|
-
soku skill
|
|
267
|
+
soku skill status # what's installed locally
|
|
268
|
+
soku skill list-installed # same as status
|
|
209
269
|
soku skill remove account-audit
|
|
210
270
|
```
|
|
211
271
|
|
|
272
|
+
Catalog slugs are used for install/remove commands (`ads-report`). Installed AI
|
|
273
|
+
client skill names are Soku-prefixed (`soku-ads-report`). When asking an agent to
|
|
274
|
+
run an installed business skill, write `use @soku-ads-report skill`, not
|
|
275
|
+
`@ads-report`.
|
|
276
|
+
|
|
277
|
+
Business skill updates are detected from `.soku-skills.json`: for each installed
|
|
278
|
+
catalog slug, Soku compares local `version`, `sha256`, and `source` against the
|
|
279
|
+
latest catalog `index.json`. A changed version, changed hash, or old source is
|
|
280
|
+
treated as an update; missing catalog entries are reported but not deleted.
|
|
281
|
+
|
|
212
282
|
Each installed skill carries a "Running this skill with the Soku CLI" section
|
|
213
283
|
(its data actions mapped to `soku call`, its third-party APIs to `soku egress`),
|
|
214
284
|
so it runs through this same CLI — no in-sandbox tools, no local API keys.
|