@soku-ai/cli 0.1.0-alpha.4 → 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 +32 -12
- 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.js +4 -4
- 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
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/** `soku update` — keep the CLI and locally installed Soku skills fresh. */
|
|
2
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
3
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { configDir, resolveSkillsBaseUrl } from '../config.js';
|
|
6
|
+
import { cyan, dim, emitError, emitSuccess, ExitCode, green, table } from '../output/envelope.js';
|
|
7
|
+
import { checkForUpdate } from '../update-check.js';
|
|
8
|
+
import { agentSkillName, baseDirFor, fetchIndex, installBusinessSkill, installMetaSoku, loadManifest, manifestPath, parseAgents, SOKU_META, } from './skill.js';
|
|
9
|
+
const DEFAULT_AUTO_UPDATE_INTERVAL_HOURS = 24;
|
|
10
|
+
const AUTO_UPDATE_LOCK_TTL_MS = 10 * 60 * 1000;
|
|
11
|
+
function statePath() {
|
|
12
|
+
return join(configDir(), 'update-state.json');
|
|
13
|
+
}
|
|
14
|
+
function lockPath() {
|
|
15
|
+
return join(configDir(), 'update.lock');
|
|
16
|
+
}
|
|
17
|
+
function readUpdateState() {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(readFileSync(statePath(), 'utf8'));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function writeUpdateState(state) {
|
|
26
|
+
const path = statePath();
|
|
27
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
28
|
+
writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
|
|
29
|
+
}
|
|
30
|
+
function parseIntervalHours(value) {
|
|
31
|
+
if (!value)
|
|
32
|
+
return DEFAULT_AUTO_UPDATE_INTERVAL_HOURS;
|
|
33
|
+
const parsed = Number(value);
|
|
34
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_AUTO_UPDATE_INTERVAL_HOURS;
|
|
35
|
+
}
|
|
36
|
+
export function isAutoUpdateDue(lastRunAt, now, intervalHours) {
|
|
37
|
+
if (!lastRunAt)
|
|
38
|
+
return true;
|
|
39
|
+
const last = Date.parse(lastRunAt);
|
|
40
|
+
if (!Number.isFinite(last))
|
|
41
|
+
return true;
|
|
42
|
+
return now.getTime() - last >= intervalHours * 60 * 60 * 1000;
|
|
43
|
+
}
|
|
44
|
+
async function withUpdateLock(fn) {
|
|
45
|
+
const path = lockPath();
|
|
46
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
47
|
+
try {
|
|
48
|
+
if (existsSync(path)) {
|
|
49
|
+
const createdAt = Number(readFileSync(path, 'utf8').split('\n', 1)[0]);
|
|
50
|
+
if (Number.isFinite(createdAt) && Date.now() - createdAt > AUTO_UPDATE_LOCK_TTL_MS) {
|
|
51
|
+
rmSync(path, { force: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Ignore malformed stale-lock probes; the exclusive open below decides.
|
|
57
|
+
}
|
|
58
|
+
let fd;
|
|
59
|
+
try {
|
|
60
|
+
fd = openSync(path, 'wx', 0o600);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
writeFileSync(fd, `${Date.now()}\n${process.pid}\n`);
|
|
67
|
+
return await fn();
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
closeSync(fd);
|
|
71
|
+
rmSync(path, { force: true });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function targetLocation(global) {
|
|
75
|
+
return global ? 'global' : 'project';
|
|
76
|
+
}
|
|
77
|
+
function discoverInstalledTargets(agentOpt = 'all', scope = 'all') {
|
|
78
|
+
const agents = parseAgents(agentOpt);
|
|
79
|
+
const targets = [];
|
|
80
|
+
for (const agent of agents) {
|
|
81
|
+
for (const global of [false, true]) {
|
|
82
|
+
if (scope === 'global' && !global)
|
|
83
|
+
continue;
|
|
84
|
+
if (scope === 'project' && global)
|
|
85
|
+
continue;
|
|
86
|
+
const baseDir = baseDirFor(agent, global);
|
|
87
|
+
if (existsSync(manifestPath(baseDir))) {
|
|
88
|
+
targets.push({ agent, global, baseDir });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return targets;
|
|
93
|
+
}
|
|
94
|
+
function fallbackTargets(agentOpt = 'claude', scope = 'global') {
|
|
95
|
+
const agents = parseAgents(agentOpt);
|
|
96
|
+
const global = scope !== 'project';
|
|
97
|
+
return agents.map((agent) => ({ agent, global, baseDir: baseDirFor(agent, global) }));
|
|
98
|
+
}
|
|
99
|
+
function targetsForUpdate(agentOpt, scope) {
|
|
100
|
+
const installed = discoverInstalledTargets(agentOpt, scope);
|
|
101
|
+
return installed.length > 0 ? installed : fallbackTargets(agentOpt, scope);
|
|
102
|
+
}
|
|
103
|
+
function indexBySlug(index) {
|
|
104
|
+
return new Map(index.skills.map((entry) => [entry.slug, entry]));
|
|
105
|
+
}
|
|
106
|
+
export async function updateSkillTarget(target, base, index) {
|
|
107
|
+
const before = loadManifest(target.baseDir);
|
|
108
|
+
const slugs = Object.keys(before).filter((slug) => slug !== SOKU_META);
|
|
109
|
+
const metaUpdated = SOKU_META in before || slugs.length > 0 || existsSync(join(target.baseDir, SOKU_META, 'SKILL.md'));
|
|
110
|
+
if (metaUpdated)
|
|
111
|
+
installMetaSoku(target.baseDir);
|
|
112
|
+
const updated = [];
|
|
113
|
+
const unchanged = [];
|
|
114
|
+
const missing = [];
|
|
115
|
+
if (slugs.length > 0) {
|
|
116
|
+
const catalog = indexBySlug(index ?? (await fetchIndex(base)));
|
|
117
|
+
for (const slug of slugs) {
|
|
118
|
+
const entry = catalog.get(slug);
|
|
119
|
+
if (!entry) {
|
|
120
|
+
missing.push(slug);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const current = before[slug];
|
|
124
|
+
if (current?.sha256 === entry.sha256 && current.version === (entry.version ?? null) && current.source === 'catalog') {
|
|
125
|
+
unchanged.push(slug);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
await installBusinessSkill(target.baseDir, entry, base);
|
|
129
|
+
updated.push(slug);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
agent: target.agent,
|
|
134
|
+
global: target.global,
|
|
135
|
+
baseDir: target.baseDir,
|
|
136
|
+
metaUpdated,
|
|
137
|
+
updated,
|
|
138
|
+
unchanged,
|
|
139
|
+
missing,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async function updateSkills(opts) {
|
|
143
|
+
const targets = targetsForUpdate(opts.agent, opts.scope);
|
|
144
|
+
const base = resolveSkillsBaseUrl(opts.skillsUrl);
|
|
145
|
+
const needsCatalog = targets.some((target) => Object.keys(loadManifest(target.baseDir)).some((slug) => slug !== SOKU_META));
|
|
146
|
+
const index = needsCatalog ? await fetchIndex(base) : undefined;
|
|
147
|
+
const results = [];
|
|
148
|
+
for (const target of targets) {
|
|
149
|
+
results.push(await updateSkillTarget(target, base, index));
|
|
150
|
+
}
|
|
151
|
+
return results;
|
|
152
|
+
}
|
|
153
|
+
function skillStatusRows(targets, index) {
|
|
154
|
+
const catalog = indexBySlug(index);
|
|
155
|
+
const rows = [];
|
|
156
|
+
for (const target of targets) {
|
|
157
|
+
const manifest = loadManifest(target.baseDir);
|
|
158
|
+
for (const [slug, current] of Object.entries(manifest)) {
|
|
159
|
+
if (slug === SOKU_META) {
|
|
160
|
+
rows.push({
|
|
161
|
+
agent: target.agent,
|
|
162
|
+
location: targetLocation(target.global),
|
|
163
|
+
slug: agentSkillName(slug),
|
|
164
|
+
current: 'bundled',
|
|
165
|
+
latest: 'bundled',
|
|
166
|
+
status: 'bundled',
|
|
167
|
+
});
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const entry = catalog.get(slug);
|
|
171
|
+
rows.push({
|
|
172
|
+
agent: target.agent,
|
|
173
|
+
location: targetLocation(target.global),
|
|
174
|
+
slug: agentSkillName(slug),
|
|
175
|
+
current: current.version || current.sha256.slice(0, 12),
|
|
176
|
+
latest: entry?.version || entry?.sha256.slice(0, 12) || '',
|
|
177
|
+
status: !entry
|
|
178
|
+
? 'missing_from_catalog'
|
|
179
|
+
: current.sha256 === entry.sha256 && current.version === (entry.version ?? null) && current.source === 'catalog'
|
|
180
|
+
? 'current'
|
|
181
|
+
: 'update_available',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return rows;
|
|
186
|
+
}
|
|
187
|
+
function renderSkillUpdateResults(results) {
|
|
188
|
+
const rows = results.map((result) => ({
|
|
189
|
+
agent: result.agent,
|
|
190
|
+
location: targetLocation(result.global),
|
|
191
|
+
updated: result.updated.length,
|
|
192
|
+
unchanged: result.unchanged.length,
|
|
193
|
+
missing: result.missing.length,
|
|
194
|
+
meta: result.metaUpdated ? 'yes' : 'no',
|
|
195
|
+
dir: result.baseDir,
|
|
196
|
+
}));
|
|
197
|
+
return [
|
|
198
|
+
`${green('✓')} Soku skills updated`,
|
|
199
|
+
table(rows, [
|
|
200
|
+
{ key: 'agent', header: 'AGENT' },
|
|
201
|
+
{ key: 'location', header: 'LOCATION' },
|
|
202
|
+
{ key: 'updated', header: 'UPDATED' },
|
|
203
|
+
{ key: 'unchanged', header: 'UNCHANGED' },
|
|
204
|
+
{ key: 'missing', header: 'MISSING' },
|
|
205
|
+
{ key: 'meta', header: 'META' },
|
|
206
|
+
{ key: 'dir', header: 'DIR' },
|
|
207
|
+
]),
|
|
208
|
+
].join('\n');
|
|
209
|
+
}
|
|
210
|
+
function runNpmCliInstall() {
|
|
211
|
+
const result = spawnSync('npm', ['i', '-g', '@soku-ai/cli'], { stdio: 'inherit' });
|
|
212
|
+
if (typeof result.status === 'number')
|
|
213
|
+
return result.status;
|
|
214
|
+
return 1;
|
|
215
|
+
}
|
|
216
|
+
function spawnSkillAutoUpdate(entrypoint) {
|
|
217
|
+
const child = spawn(process.execPath, [entrypoint, 'update', 'skills', '--quiet'], {
|
|
218
|
+
env: {
|
|
219
|
+
...process.env,
|
|
220
|
+
SOKU_NO_UPDATE_CHECK: '1',
|
|
221
|
+
SOKU_NO_SKILL_AUTO_UPDATE: '1',
|
|
222
|
+
},
|
|
223
|
+
stdio: 'ignore',
|
|
224
|
+
detached: true,
|
|
225
|
+
});
|
|
226
|
+
child.on('error', () => {
|
|
227
|
+
// Background update is best-effort and must never break the foreground command.
|
|
228
|
+
});
|
|
229
|
+
child.unref();
|
|
230
|
+
}
|
|
231
|
+
export async function maybeAutoUpdateSkills() {
|
|
232
|
+
if (process.env.CI)
|
|
233
|
+
return;
|
|
234
|
+
if (process.env.SOKU_NO_UPDATE_CHECK === '1')
|
|
235
|
+
return;
|
|
236
|
+
if (process.env.SOKU_NO_SKILL_AUTO_UPDATE === '1')
|
|
237
|
+
return;
|
|
238
|
+
if (!process.argv[1])
|
|
239
|
+
return;
|
|
240
|
+
const state = readUpdateState();
|
|
241
|
+
const now = new Date();
|
|
242
|
+
const interval = parseIntervalHours(process.env.SOKU_UPDATE_INTERVAL_HOURS);
|
|
243
|
+
if (!isAutoUpdateDue(state.lastSkillAutoUpdateAt, now, interval))
|
|
244
|
+
return;
|
|
245
|
+
await withUpdateLock(() => {
|
|
246
|
+
writeUpdateState({ ...readUpdateState(), lastSkillAutoUpdateAt: now.toISOString() });
|
|
247
|
+
spawnSkillAutoUpdate(process.argv[1]);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
export async function maybeAutoUpdateCli() {
|
|
251
|
+
if (process.env.CI)
|
|
252
|
+
return;
|
|
253
|
+
if (process.env.SOKU_NO_UPDATE_CHECK === '1')
|
|
254
|
+
return;
|
|
255
|
+
if (process.env.SOKU_AUTO_UPDATE_CLI !== '1')
|
|
256
|
+
return;
|
|
257
|
+
const state = readUpdateState();
|
|
258
|
+
const now = new Date();
|
|
259
|
+
const interval = parseIntervalHours(process.env.SOKU_UPDATE_INTERVAL_HOURS);
|
|
260
|
+
if (!isAutoUpdateDue(state.lastCliAutoUpdateAt, now, interval))
|
|
261
|
+
return;
|
|
262
|
+
await withUpdateLock(async () => {
|
|
263
|
+
try {
|
|
264
|
+
const check = await checkForUpdate();
|
|
265
|
+
if (check.updateAvailable) {
|
|
266
|
+
const status = runNpmCliInstall();
|
|
267
|
+
if (status === 0) {
|
|
268
|
+
process.stderr.write(`${dim('Soku CLI auto-updated. Restart your shell or agent session to use the new version.')}\n`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Advisory only; never block the user's command.
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
writeUpdateState({ ...readUpdateState(), lastCliAutoUpdateAt: now.toISOString() });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
export function registerUpdateCommand(program) {
|
|
281
|
+
const update = program.command('update').description('Update the Soku CLI and installed Soku skills');
|
|
282
|
+
update
|
|
283
|
+
.command('status')
|
|
284
|
+
.description('Show CLI and installed skill update status')
|
|
285
|
+
.option('--agent <agent>', 'claude | codex | cursor | all', 'all')
|
|
286
|
+
.option('--global', 'Only inspect user-level (~) skills directories')
|
|
287
|
+
.option('--project', 'Only inspect project-level skills directories')
|
|
288
|
+
.option('--skills-url <url>', 'Override the skill catalog base url')
|
|
289
|
+
.action(async (opts) => {
|
|
290
|
+
const scope = opts.global ? 'global' : opts.project ? 'project' : 'all';
|
|
291
|
+
const targets = discoverInstalledTargets(opts.agent, scope);
|
|
292
|
+
const [cli, index] = await Promise.all([checkForUpdate(), fetchIndex(resolveSkillsBaseUrl(opts.skillsUrl))]);
|
|
293
|
+
const payload = { cli, skills: skillStatusRows(targets, index) };
|
|
294
|
+
emitSuccess(payload, (d) => {
|
|
295
|
+
const cliLine = d.cli.updateAvailable
|
|
296
|
+
? `${d.cli.packageName} ${d.cli.currentVersion} -> ${d.cli.latestVersion}`
|
|
297
|
+
: `${d.cli.packageName} is current (${d.cli.currentVersion})`;
|
|
298
|
+
const skillLines = d.skills.length === 0
|
|
299
|
+
? dim('(no Soku-managed skills installed)')
|
|
300
|
+
: table(d.skills.map((row) => ({ ...row })), [
|
|
301
|
+
{ key: 'agent', header: 'AGENT' },
|
|
302
|
+
{ key: 'location', header: 'LOCATION' },
|
|
303
|
+
{ key: 'slug', header: 'SKILL' },
|
|
304
|
+
{ key: 'current', header: 'CURRENT' },
|
|
305
|
+
{ key: 'latest', header: 'LATEST' },
|
|
306
|
+
{ key: 'status', header: 'STATUS' },
|
|
307
|
+
]);
|
|
308
|
+
return [`CLI: ${cliLine}`, '', 'Skills:', skillLines].join('\n');
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
update
|
|
312
|
+
.command('skills')
|
|
313
|
+
.description('Update installed Soku meta-skill and business skills')
|
|
314
|
+
.option('--agent <agent>', 'claude | codex | cursor | all', 'all')
|
|
315
|
+
.option('--global', 'Only update user-level (~) skills directories')
|
|
316
|
+
.option('--project', 'Only update project-level skills directories')
|
|
317
|
+
.option('--skills-url <url>', 'Override the skill catalog base url')
|
|
318
|
+
.option('--quiet', 'Suppress output except errors')
|
|
319
|
+
.action(async (opts) => {
|
|
320
|
+
const scope = opts.global ? 'global' : opts.project ? 'project' : 'all';
|
|
321
|
+
const results = await updateSkills({ agent: opts.agent, scope, skillsUrl: opts.skillsUrl });
|
|
322
|
+
if (opts.quiet)
|
|
323
|
+
process.exit(ExitCode.OK);
|
|
324
|
+
emitSuccess({ results }, (d) => renderSkillUpdateResults(d.results));
|
|
325
|
+
});
|
|
326
|
+
update
|
|
327
|
+
.command('cli')
|
|
328
|
+
.description('Install the latest @soku-ai/cli from npm')
|
|
329
|
+
.option('--dry-run', 'Only report what would be installed')
|
|
330
|
+
.action(async (opts) => {
|
|
331
|
+
const result = await checkForUpdate();
|
|
332
|
+
if (!result.updateAvailable || !result.latestVersion) {
|
|
333
|
+
emitSuccess(result, (d) => `${d.packageName} is up to date (${d.currentVersion}).`);
|
|
334
|
+
}
|
|
335
|
+
if (opts.dryRun) {
|
|
336
|
+
emitSuccess(result, (d) => `${d.packageName} ${d.currentVersion} -> ${d.latestVersion}\n${dim('Run')} ${cyan(d.installCommand)}`);
|
|
337
|
+
}
|
|
338
|
+
const status = runNpmCliInstall();
|
|
339
|
+
if (status !== 0) {
|
|
340
|
+
emitError('update_failed', `npm install exited with status ${status}`, ExitCode.RUNTIME, result.installCommand);
|
|
341
|
+
}
|
|
342
|
+
emitSuccess({ ...result, installed: true }, (d) => `${green('✓')} Installed ${d.packageName} ${d.latestVersion}\n${dim('Restart your shell or agent session to use it.')}`);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsFnC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwFhE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/** `soku workspace` — inspect and resolve the active org/brand selection. */
|
|
2
|
+
import { loadConfig, updateConfig } from '../config.js';
|
|
3
|
+
import { apiRequest } from '../http/client.js';
|
|
4
|
+
import { cyan, dim, emitError, emitSuccess, ExitCode, green, table } from '../output/envelope.js';
|
|
5
|
+
import { matchRef } from '../resolve.js';
|
|
6
|
+
function resolveSearchMatch(brands, ref) {
|
|
7
|
+
const exact = matchRef(brands, ref);
|
|
8
|
+
if (exact.kind !== 'none')
|
|
9
|
+
return exact;
|
|
10
|
+
if (brands.length === 1)
|
|
11
|
+
return { kind: 'match', item: brands[0] };
|
|
12
|
+
if (brands.length > 1)
|
|
13
|
+
return { kind: 'ambiguous', matches: brands };
|
|
14
|
+
return { kind: 'none' };
|
|
15
|
+
}
|
|
16
|
+
async function searchBrands(query, limit) {
|
|
17
|
+
const data = await apiRequest(`/api/cli/brands/search?q=${encodeURIComponent(query)}&limit=${encodeURIComponent(String(limit))}`);
|
|
18
|
+
return data.brands;
|
|
19
|
+
}
|
|
20
|
+
function resolveBrandCandidates(brands, ref) {
|
|
21
|
+
const res = resolveSearchMatch(brands, ref);
|
|
22
|
+
if (res.kind === 'match') {
|
|
23
|
+
return { resolved: true, reason: 'match', brand: res.item, candidates: [res.item] };
|
|
24
|
+
}
|
|
25
|
+
if (res.kind === 'ambiguous') {
|
|
26
|
+
return { resolved: false, reason: 'ambiguous', brand: null, candidates: res.matches };
|
|
27
|
+
}
|
|
28
|
+
return { resolved: false, reason: 'not_found', brand: null, candidates: [] };
|
|
29
|
+
}
|
|
30
|
+
function renderBrandCandidates(candidates) {
|
|
31
|
+
return table(candidates.map((b) => ({
|
|
32
|
+
name: b.name,
|
|
33
|
+
slug: b.slug,
|
|
34
|
+
org: b.org_slug || b.org_name || b.org_id,
|
|
35
|
+
id: b.id,
|
|
36
|
+
})), [
|
|
37
|
+
{ key: 'name', header: 'BRAND' },
|
|
38
|
+
{ key: 'slug', header: 'SLUG' },
|
|
39
|
+
{ key: 'org', header: 'ORG' },
|
|
40
|
+
{ key: 'id', header: 'ID' },
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
function useResolvedBrand(result, ref) {
|
|
44
|
+
if (result.resolved && result.brand)
|
|
45
|
+
return result.brand;
|
|
46
|
+
if (result.reason === 'not_found') {
|
|
47
|
+
emitError('not_found', `No accessible brand matching "${ref}".`, ExitCode.NOT_FOUND, 'Run `soku workspace resolve <brand>` to inspect candidates.');
|
|
48
|
+
}
|
|
49
|
+
const candidates = result.candidates.map((b) => `${b.slug} (${b.org_slug || b.org_name || b.org_id})`).join(', ');
|
|
50
|
+
return emitError('ambiguous', `"${ref}" matches ${result.candidates.length} brands.`, ExitCode.USAGE, `Use an exact slug or id: ${candidates}`);
|
|
51
|
+
}
|
|
52
|
+
export function registerWorkspaceCommands(program) {
|
|
53
|
+
const workspace = program.command('workspace').description('Inspect or set the active Soku workspace');
|
|
54
|
+
workspace
|
|
55
|
+
.command('status')
|
|
56
|
+
.description('Show the active organization and brand')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
const cfg = loadConfig();
|
|
59
|
+
const orgsData = await apiRequest('/api/cli/orgs');
|
|
60
|
+
const org = cfg.activeOrgId ? orgsData.orgs.find((item) => item.id === cfg.activeOrgId) : undefined;
|
|
61
|
+
let brand;
|
|
62
|
+
if (org && cfg.activeBrandId) {
|
|
63
|
+
const brandsData = await apiRequest(`/api/cli/brands?org_id=${encodeURIComponent(org.id)}`);
|
|
64
|
+
brand = brandsData.brands.find((item) => item.id === cfg.activeBrandId);
|
|
65
|
+
}
|
|
66
|
+
const data = {
|
|
67
|
+
active_org_id: cfg.activeOrgId ?? null,
|
|
68
|
+
active_org_name: org?.name ?? null,
|
|
69
|
+
active_org_slug: org?.slug ?? null,
|
|
70
|
+
active_brand_id: cfg.activeBrandId ?? null,
|
|
71
|
+
active_brand_name: brand?.name ?? null,
|
|
72
|
+
active_brand_slug: brand?.slug ?? null,
|
|
73
|
+
workspace_ready: Boolean(org && brand),
|
|
74
|
+
};
|
|
75
|
+
emitSuccess(data, (d) => {
|
|
76
|
+
const orgLabel = d.active_org_slug || d.active_org_name || d.active_org_id || '(none)';
|
|
77
|
+
const brandLabel = d.active_brand_slug || d.active_brand_name || d.active_brand_id || '(none)';
|
|
78
|
+
const ready = d.workspace_ready ? green('ready') : 'not ready';
|
|
79
|
+
return [
|
|
80
|
+
`Workspace: ${ready}`,
|
|
81
|
+
`Org: ${orgLabel}`,
|
|
82
|
+
`Brand: ${brandLabel}`,
|
|
83
|
+
d.workspace_ready
|
|
84
|
+
? dim('Next: soku resources list')
|
|
85
|
+
: dim('Next: soku workspace use-brand <brand>'),
|
|
86
|
+
].join('\n');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
workspace
|
|
90
|
+
.command('resolve <brand>')
|
|
91
|
+
.description('Resolve a brand across all accessible organizations without changing workspace')
|
|
92
|
+
.option('--limit <n>', 'Maximum candidates to inspect', '20')
|
|
93
|
+
.action(async (ref, opts) => {
|
|
94
|
+
const limit = Number(opts.limit);
|
|
95
|
+
if (!Number.isFinite(limit) || limit < 1) {
|
|
96
|
+
emitError('usage', '--limit must be a positive number.', ExitCode.USAGE);
|
|
97
|
+
}
|
|
98
|
+
const result = resolveBrandCandidates(await searchBrands(ref, limit), ref);
|
|
99
|
+
emitSuccess(result, (d) => {
|
|
100
|
+
if (d.resolved && d.brand) {
|
|
101
|
+
const org = d.brand.org_slug || d.brand.org_name || d.brand.org_id;
|
|
102
|
+
return [
|
|
103
|
+
`${green('✓')} Resolved brand: ${cyan(org)} / ${cyan(d.brand.name)} ${dim(`(${d.brand.id})`)}`,
|
|
104
|
+
dim(`Next: soku workspace use-brand ${ref}`),
|
|
105
|
+
].join('\n');
|
|
106
|
+
}
|
|
107
|
+
if (d.reason === 'not_found')
|
|
108
|
+
return `${dim('(no accessible brand candidates)')}\n${dim('Try a different brand name or slug.')}`;
|
|
109
|
+
return [
|
|
110
|
+
`${dim(`Ambiguous: ${d.candidates.length} candidates`)}`,
|
|
111
|
+
renderBrandCandidates(d.candidates),
|
|
112
|
+
dim('Next: rerun with an exact brand slug or id.'),
|
|
113
|
+
].join('\n');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
workspace
|
|
117
|
+
.command('use-brand <brand>')
|
|
118
|
+
.description('Resolve a brand across all organizations and set org+brand together')
|
|
119
|
+
.action(async (ref) => {
|
|
120
|
+
const result = resolveBrandCandidates(await searchBrands(ref, 20), ref);
|
|
121
|
+
const match = useResolvedBrand(result, ref);
|
|
122
|
+
updateConfig({ activeOrgId: match.org_id, activeBrandId: match.id });
|
|
123
|
+
emitSuccess({
|
|
124
|
+
active_org_id: match.org_id,
|
|
125
|
+
active_brand_id: match.id,
|
|
126
|
+
name: match.name,
|
|
127
|
+
org_name: match.org_name,
|
|
128
|
+
org_slug: match.org_slug,
|
|
129
|
+
}, (d) => `${green('✓')} Active workspace: ${cyan(d.org_slug || d.org_name || d.active_org_id)} / ${cyan(d.name)} ${dim(`(${d.active_brand_id})`)}\n ${dim('Next: soku resources list')}`);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export interface SokuConfig {
|
|
|
4
4
|
apiBaseUrl?: string;
|
|
5
5
|
activeOrgId?: string;
|
|
6
6
|
activeBrandId?: string;
|
|
7
|
-
/** Deprecated and ignored. Skill
|
|
7
|
+
/** Deprecated and ignored. Skill catalog overrides are environment-only. */
|
|
8
8
|
skillsBaseUrl?: string;
|
|
9
9
|
}
|
|
10
10
|
export declare function configDir(): string;
|
|
@@ -13,6 +13,6 @@ export declare function saveConfig(config: SokuConfig): void;
|
|
|
13
13
|
export declare function updateConfig(patch: Partial<SokuConfig>): SokuConfig;
|
|
14
14
|
/** Resolution order: --api-base flag (caller passes) → env → production default. */
|
|
15
15
|
export declare function resolveApiBaseUrl(flag?: string): string;
|
|
16
|
-
/** Resolution order: --skills-url flag → env → production
|
|
16
|
+
/** Resolution order: --skills-url flag → env → production skill catalog. */
|
|
17
17
|
export declare function resolveSkillsBaseUrl(flag?: string): string;
|
|
18
18
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAM5E,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAM5E,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAKD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAMD,wBAAgB,UAAU,IAAI,UAAU,CAMvC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAInD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAInE;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAM1D"}
|
package/dist/config.js
CHANGED
|
@@ -3,7 +3,7 @@ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
const DEFAULT_API_BASE = 'https://api.soku.ai';
|
|
6
|
-
const DEFAULT_SKILLS_BASE = 'https://
|
|
6
|
+
const DEFAULT_SKILLS_BASE = 'https://api.soku.ai/api/cli/skills';
|
|
7
7
|
export function configDir() {
|
|
8
8
|
return join(homedir(), '.soku');
|
|
9
9
|
}
|
|
@@ -34,7 +34,7 @@ export function resolveApiBaseUrl(flag) {
|
|
|
34
34
|
process.env.SOKU_API_BASE ||
|
|
35
35
|
DEFAULT_API_BASE).replace(/\/$/, '');
|
|
36
36
|
}
|
|
37
|
-
/** Resolution order: --skills-url flag → env → production
|
|
37
|
+
/** Resolution order: --skills-url flag → env → production skill catalog. */
|
|
38
38
|
export function resolveSkillsBaseUrl(flag) {
|
|
39
39
|
return (flag ||
|
|
40
40
|
process.env.SOKU_SKILLS_URL ||
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAWzC,MAAM,gBAAgB,GAAG,qBAAqB,CAAA;AAC9C,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAWzC,MAAM,gBAAgB,GAAG,qBAAqB,CAAA;AAC9C,MAAM,mBAAmB,GAAG,oCAAoC,CAAA;AAEhE,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAe,CAAA;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA0B;IACrD,MAAM,IAAI,GAAG,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,CAAA;IAC1C,UAAU,CAAC,IAAI,CAAC,CAAA;IAChB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,CACL,IAAI;QACJ,OAAO,CAAC,GAAG,CAAC,aAAa;QACzB,gBAAgB,CACjB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACtB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,OAAO,CACL,IAAI;QACJ,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,mBAAmB,CACpB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACtB,CAAC"}
|
|
@@ -358,7 +358,7 @@
|
|
|
358
358
|
"namespace": "ads",
|
|
359
359
|
"action": "query_single_dimension",
|
|
360
360
|
"description": "Primary cached ads analytics query for one dimension; returns column-oriented business metrics, derived metrics, and cg.{slug}.* conversion fan-out.",
|
|
361
|
-
"long_description": "PRIMARY PATH for cached ads analytics.\n\nPrimary use:\nSingle-dimension reporting over synced Nex business-layer ads data. Use this for
|
|
361
|
+
"long_description": "PRIMARY PATH for cached ads analytics.\n\nPrimary use:\nSingle-dimension reporting over synced Nex business-layer ads data. Use this for metrics report KPIs, campaign/ad/adgroup/keyword/search-term/device/country breakdowns, cross-platform-consistent metrics, and mapping-aware derived metrics.\n\nUse when:\n- The analysis has exactly one group-by dimension.\n- The user asks for CPA, CPP, ROAS, Reg Rate, Pur Rate, or cg.{slug}.* metrics.\n- The result should use Nex cached Parquet data and business semantics.\n\nDo not use when:\n- The user needs multiple group-by dimensions. Use query_multi_dimension.\n- The field or segment is not exposed by list_dimensions. Use get_resource_metadata then gaql_search for Google-native exploration.\n- The user needs write or mutation history. Use ads-ops or list_operation_records.\n\nWorkflow:\n1. Call list_ad_accounts if account_id is unknown.\n2. Call list_dimensions to choose a valid dimension, filters, and metrics.\n3. Call list_conversion_groups only if conversion-group fan-out or CPA/ROAS-like metrics are needed.\n4. Call this action with platform, account_id, date_start, date_end, and dimension.\n\nOutput semantics:\n- Returns column-oriented data. Read data.columns.<column>[i], not data.rows.\n- spend_micros and cpc_micros are micros; ctr is a 0-1 ratio.\n- scope_caveat explains aggregation limits for the selected scope.\n- mode=summary returns summary data such as top rows, totals, and p95 where supported.\n- truncated or warning means the agent must mention partial result limits.\n- For id-keyed dimensions (campaign / account / adgroup / ad), dimension_label is the resolved entity name (e.g., adset name for adgroup dimension); falls back to the platform id when the entity record is missing or has no name.",
|
|
362
362
|
"capability_mode": "read",
|
|
363
363
|
"priority": "primary",
|
|
364
364
|
"requires_review": false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"AAAA;gFACgF;AAMhF,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"AAAA;gFACgF;AAMhF,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,CAkFjG"}
|