@soku-ai/cli 0.1.0-alpha.0

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 (85) hide show
  1. package/README.md +91 -0
  2. package/dist/auth/device.d.ts +36 -0
  3. package/dist/auth/device.d.ts.map +1 -0
  4. package/dist/auth/device.js +66 -0
  5. package/dist/auth/device.js.map +1 -0
  6. package/dist/auth/store.d.ts +11 -0
  7. package/dist/auth/store.d.ts.map +1 -0
  8. package/dist/auth/store.js +89 -0
  9. package/dist/auth/store.js.map +1 -0
  10. package/dist/commands/auth.d.ts +4 -0
  11. package/dist/commands/auth.d.ts.map +1 -0
  12. package/dist/commands/auth.js +99 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/brand.d.ts +4 -0
  15. package/dist/commands/brand.d.ts.map +1 -0
  16. package/dist/commands/brand.js +53 -0
  17. package/dist/commands/brand.js.map +1 -0
  18. package/dist/commands/call.d.ts +4 -0
  19. package/dist/commands/call.d.ts.map +1 -0
  20. package/dist/commands/call.js +48 -0
  21. package/dist/commands/call.js.map +1 -0
  22. package/dist/commands/egress.d.ts +24 -0
  23. package/dist/commands/egress.d.ts.map +1 -0
  24. package/dist/commands/egress.js +197 -0
  25. package/dist/commands/egress.js.map +1 -0
  26. package/dist/commands/generated.d.ts +41 -0
  27. package/dist/commands/generated.d.ts.map +1 -0
  28. package/dist/commands/generated.js +106 -0
  29. package/dist/commands/generated.js.map +1 -0
  30. package/dist/commands/org.d.ts +4 -0
  31. package/dist/commands/org.d.ts.map +1 -0
  32. package/dist/commands/org.js +49 -0
  33. package/dist/commands/org.js.map +1 -0
  34. package/dist/commands/resources.d.ts +4 -0
  35. package/dist/commands/resources.d.ts.map +1 -0
  36. package/dist/commands/resources.js +22 -0
  37. package/dist/commands/resources.js.map +1 -0
  38. package/dist/commands/review.d.ts +8 -0
  39. package/dist/commands/review.d.ts.map +1 -0
  40. package/dist/commands/review.js +74 -0
  41. package/dist/commands/review.js.map +1 -0
  42. package/dist/commands/skill.d.ts +19 -0
  43. package/dist/commands/skill.d.ts.map +1 -0
  44. package/dist/commands/skill.js +313 -0
  45. package/dist/commands/skill.js.map +1 -0
  46. package/dist/config.d.ts +17 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +45 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/generated/capabilities.json +770 -0
  51. package/dist/http/client.d.ts +12 -0
  52. package/dist/http/client.d.ts.map +1 -0
  53. package/dist/http/client.js +91 -0
  54. package/dist/http/client.js.map +1 -0
  55. package/dist/index.d.ts +4 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +39 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/output/envelope.d.ts +45 -0
  60. package/dist/output/envelope.d.ts.map +1 -0
  61. package/dist/output/envelope.js +86 -0
  62. package/dist/output/envelope.js.map +1 -0
  63. package/dist/output/unwrap.d.ts +11 -0
  64. package/dist/output/unwrap.d.ts.map +1 -0
  65. package/dist/output/unwrap.js +33 -0
  66. package/dist/output/unwrap.js.map +1 -0
  67. package/dist/resolve.d.ts +24 -0
  68. package/dist/resolve.d.ts.map +1 -0
  69. package/dist/resolve.js +24 -0
  70. package/dist/resolve.js.map +1 -0
  71. package/dist/skills/unzip.d.ts +14 -0
  72. package/dist/skills/unzip.d.ts.map +1 -0
  73. package/dist/skills/unzip.js +86 -0
  74. package/dist/skills/unzip.js.map +1 -0
  75. package/dist/update-check.d.ts +24 -0
  76. package/dist/update-check.d.ts.map +1 -0
  77. package/dist/update-check.js +204 -0
  78. package/dist/update-check.js.map +1 -0
  79. package/dist/version.d.ts +3 -0
  80. package/dist/version.d.ts.map +1 -0
  81. package/dist/version.js +3 -0
  82. package/dist/version.js.map +1 -0
  83. package/package.json +61 -0
  84. package/skills/soku/SKILL.md +225 -0
  85. package/skills/soku/references/capability-flow.md +71 -0
@@ -0,0 +1,313 @@
1
+ /** `soku skill` — discover and install Soku skills into an AI client.
2
+ *
3
+ * - `soku skill list` browse the public skill catalog (CDN)
4
+ * - `soku skill install <slug...>` download + install business skills
5
+ * - `soku skill install --all` install the whole catalog
6
+ * - `soku skill install` (no slug) install just the bundled `soku` meta-skill
7
+ * - `soku skill installed` / `remove` manage what's installed locally
8
+ *
9
+ * Business skills are fetched as per-skill zips from a public CDN
10
+ * (`cdn.soku.ai/skills/`), already translated to CLI-native at pack time. We
11
+ * verify the sha256 from index.json, unzip safely, and drop each business skill
12
+ * into `<skillsDir>/soku/<slug>/` with a top-level symlink
13
+ * `<skillsDir>/soku-<slug> -> soku/<slug>`. The bundled `soku` meta-skill (how
14
+ * to drive the CLI) ships in the npm package and is installed as a prerequisite. */
15
+ import { createHash } from 'node:crypto';
16
+ import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
17
+ import { homedir } from 'node:os';
18
+ import { dirname, join } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+ import { resolveSkillsBaseUrl } from '../config.js';
21
+ import { dim, emitError, emitSuccess, ExitCode, table } from '../output/envelope.js';
22
+ import { safeUnzip, UnzipError } from '../skills/unzip.js';
23
+ const SOKU_META = 'soku';
24
+ const MANIFEST_FILE = '.soku-skills.json';
25
+ const PROJECT_DIRS = {
26
+ claude: '.claude/skills',
27
+ codex: '.codex/skills',
28
+ cursor: '.cursor/skills',
29
+ };
30
+ const GLOBAL_DIRS = {
31
+ claude: join(homedir(), '.claude/skills'),
32
+ codex: join(homedir(), '.codex/skills'),
33
+ cursor: join(homedir(), '.cursor/skills'),
34
+ };
35
+ /** Locate the bundled skills/soku dir relative to the compiled file. */
36
+ function bundledSkillDir() {
37
+ const here = dirname(fileURLToPath(import.meta.url));
38
+ const candidates = [
39
+ join(here, '..', '..', 'skills', SOKU_META),
40
+ join(here, '..', '..', '..', 'skills', SOKU_META),
41
+ ];
42
+ return candidates.find((c) => existsSync(join(c, 'SKILL.md'))) ?? candidates[0];
43
+ }
44
+ function baseDirFor(agent, global) {
45
+ return global ? GLOBAL_DIRS[agent] : PROJECT_DIRS[agent];
46
+ }
47
+ function parseAgents(value) {
48
+ if (value === 'all')
49
+ return ['claude', 'codex', 'cursor'];
50
+ if (value === 'claude' || value === 'codex' || value === 'cursor')
51
+ return [value];
52
+ return emitError('usage', `Unknown agent: ${value}. Use claude | codex | cursor | all.`, ExitCode.USAGE);
53
+ }
54
+ // Slugs become path segments (`soku-<slug>/`), so they must never contain
55
+ // traversal or separators. Mirrors the server catalog's SLUG_PATTERN. We do not
56
+ // trust the slug just because it came from index.json — the CDN base url is
57
+ // overridable (SOKU_SKILLS_URL), and a poisoned index could otherwise escape
58
+ // the skills dir. `remove` validates the user-supplied slug for the same reason.
59
+ const SLUG_PATTERN = /^[a-z0-9][a-z0-9_-]{0,63}$/;
60
+ /** A slug is safe to use as a path segment (no traversal/separators). Exported for tests. */
61
+ export function isSafeSlug(slug) {
62
+ return SLUG_PATTERN.test(slug);
63
+ }
64
+ function assertSafeSlug(slug, origin) {
65
+ if (!isSafeSlug(slug)) {
66
+ emitError('invalid_slug', `Refusing unsafe skill slug (${origin}): ${slug}`, ExitCode.USAGE);
67
+ }
68
+ }
69
+ function manifestPath(baseDir) {
70
+ return join(baseDir, MANIFEST_FILE);
71
+ }
72
+ function loadManifest(baseDir) {
73
+ try {
74
+ return JSON.parse(readFileSync(manifestPath(baseDir), 'utf8'));
75
+ }
76
+ catch {
77
+ return {};
78
+ }
79
+ }
80
+ function saveManifest(baseDir, manifest) {
81
+ mkdirSync(baseDir, { recursive: true });
82
+ writeFileSync(manifestPath(baseDir), `${JSON.stringify(manifest, null, 2)}\n`);
83
+ }
84
+ function sokuDir(baseDir) {
85
+ return join(baseDir, SOKU_META);
86
+ }
87
+ function businessSkillDir(baseDir, slug) {
88
+ return join(sokuDir(baseDir), slug);
89
+ }
90
+ function businessSkillLink(baseDir, slug) {
91
+ return join(baseDir, `soku-${slug}`);
92
+ }
93
+ function removeMetaSokuFiles(dest) {
94
+ rmSync(join(dest, 'SKILL.md'), { force: true });
95
+ rmSync(join(dest, 'references'), { recursive: true, force: true });
96
+ }
97
+ async function fetchIndex(base) {
98
+ let res;
99
+ try {
100
+ res = await fetch(`${base}/index.json`);
101
+ }
102
+ catch (err) {
103
+ return emitError('network_error', `Could not reach skill CDN ${base}: ${err.message}`, ExitCode.RUNTIME, 'Override with --skills-url or SOKU_SKILLS_URL.');
104
+ }
105
+ if (!res.ok) {
106
+ return emitError('index_unavailable', `Skill index not found at ${base}/index.json (HTTP ${res.status}).`, ExitCode.RUNTIME);
107
+ }
108
+ return (await res.json());
109
+ }
110
+ async function fetchZip(base, zip) {
111
+ let res;
112
+ try {
113
+ res = await fetch(`${base}/${zip}`);
114
+ }
115
+ catch (err) {
116
+ return emitError('network_error', `Could not download ${zip}: ${err.message}`, ExitCode.RUNTIME);
117
+ }
118
+ if (!res.ok) {
119
+ return emitError('download_failed', `${zip} (HTTP ${res.status})`, ExitCode.RUNTIME);
120
+ }
121
+ return new Uint8Array(await res.arrayBuffer());
122
+ }
123
+ /** Copy the bundled `soku` meta-skill into a client dir without deleting child skills. */
124
+ function installMetaSoku(baseDir) {
125
+ const source = bundledSkillDir();
126
+ if (!existsSync(join(source, 'SKILL.md'))) {
127
+ return emitError('skill_not_bundled', `Bundled skill not found at ${source}.`, ExitCode.RUNTIME);
128
+ }
129
+ const dest = sokuDir(baseDir);
130
+ mkdirSync(baseDir, { recursive: true });
131
+ mkdirSync(dest, { recursive: true });
132
+ removeMetaSokuFiles(dest);
133
+ cpSync(join(source, 'SKILL.md'), join(dest, 'SKILL.md'));
134
+ if (existsSync(join(source, 'references'))) {
135
+ cpSync(join(source, 'references'), join(dest, 'references'), { recursive: true });
136
+ }
137
+ const manifest = loadManifest(baseDir);
138
+ manifest[SOKU_META] = { sha256: '', installed_at: new Date().toISOString(), source: 'bundled' };
139
+ saveManifest(baseDir, manifest);
140
+ return dest;
141
+ }
142
+ /** Download, verify, unzip, and install one business skill. */
143
+ async function installBusinessSkill(baseDir, entry, base) {
144
+ assertSafeSlug(entry.slug, 'catalog index');
145
+ const data = await fetchZip(base, entry.zip);
146
+ const sha = createHash('sha256').update(data).digest('hex');
147
+ if (sha !== entry.sha256) {
148
+ return emitError('checksum_mismatch', `${entry.slug}: sha256 mismatch (expected ${entry.sha256.slice(0, 12)}…, got ${sha.slice(0, 12)}…)`, ExitCode.RUNTIME);
149
+ }
150
+ let files;
151
+ try {
152
+ files = safeUnzip(data);
153
+ }
154
+ catch (err) {
155
+ if (err instanceof UnzipError) {
156
+ return emitError('unsafe_bundle', `${entry.slug}: ${err.message}`, ExitCode.RUNTIME);
157
+ }
158
+ throw err;
159
+ }
160
+ const dest = businessSkillDir(baseDir, entry.slug);
161
+ const link = businessSkillLink(baseDir, entry.slug);
162
+ rmSync(link, { recursive: true, force: true });
163
+ rmSync(dest, { recursive: true, force: true });
164
+ mkdirSync(dest, { recursive: true });
165
+ for (const [rel, bytes] of files) {
166
+ const target = join(dest, rel);
167
+ mkdirSync(dirname(target), { recursive: true });
168
+ writeFileSync(target, bytes);
169
+ }
170
+ symlinkSync(`${SOKU_META}/${entry.slug}`, link, 'dir');
171
+ const manifest = loadManifest(baseDir);
172
+ manifest[entry.slug] = {
173
+ version: entry.version ?? null,
174
+ sha256: entry.sha256,
175
+ installed_at: new Date().toISOString(),
176
+ source: 'cdn',
177
+ };
178
+ saveManifest(baseDir, manifest);
179
+ return link;
180
+ }
181
+ function inCategory(entry, category) {
182
+ if (!category)
183
+ return true;
184
+ return (entry.category ?? '').toLowerCase() === category.toLowerCase();
185
+ }
186
+ function resolveTargets(index, slugs, all, category) {
187
+ if (all)
188
+ return index.skills.filter((e) => inCategory(e, category));
189
+ return slugs.map((slug) => {
190
+ const entry = index.skills.find((e) => e.slug === slug);
191
+ if (!entry) {
192
+ return emitError('skill_not_found', `No skill named ${slug} in the catalog.`, ExitCode.NOT_FOUND, 'List with `soku skill list`.');
193
+ }
194
+ return entry;
195
+ });
196
+ }
197
+ export function registerSkillCommand(program) {
198
+ const skill = program.command('skill').description('Discover and install Soku skills into your AI client');
199
+ skill
200
+ .command('list')
201
+ .description('Browse the public Soku skill catalog')
202
+ .option('--category <category>', 'Filter by category')
203
+ .option('--skills-url <url>', 'Override the skill CDN base url')
204
+ .action(async (opts) => {
205
+ const base = resolveSkillsBaseUrl(opts.skillsUrl);
206
+ const index = await fetchIndex(base);
207
+ const rows = index.skills.filter((e) => inCategory(e, opts.category));
208
+ emitSuccess({ skills: rows, count: rows.length }, (d) => table(d.skills.map((s) => ({
209
+ slug: s.slug,
210
+ category: s.category ?? '',
211
+ description: s.description.length > 70 ? `${s.description.slice(0, 67)}…` : s.description,
212
+ })), [
213
+ { key: 'slug', header: 'SLUG' },
214
+ { key: 'category', header: 'CATEGORY' },
215
+ { key: 'description', header: 'DESCRIPTION' },
216
+ ]));
217
+ });
218
+ skill
219
+ .command('install [slugs...]')
220
+ .description('Install business skills (or the bundled soku meta-skill when no slug is given)')
221
+ .option('--agent <agent>', 'claude | codex | cursor | all', 'all')
222
+ .option('--global', 'Install into the user-level (~) skills directory')
223
+ .option('--all', 'Install the entire catalog')
224
+ .option('--category <category>', 'With --all, limit to one category')
225
+ .option('--skills-url <url>', 'Override the skill CDN base url')
226
+ .action(async (slugs, opts) => {
227
+ const agents = parseAgents(opts.agent);
228
+ const installed = [];
229
+ // No slugs and no --all → legacy behaviour: install just the meta-skill.
230
+ if (slugs.length === 0 && !opts.all) {
231
+ for (const agent of agents)
232
+ installed.push(installMetaSoku(baseDirFor(agent, Boolean(opts.global))));
233
+ emitSuccess({ installed });
234
+ }
235
+ const base = resolveSkillsBaseUrl(opts.skillsUrl);
236
+ const index = await fetchIndex(base);
237
+ const targets = resolveTargets(index, slugs, Boolean(opts.all), opts.category);
238
+ for (const agent of agents) {
239
+ const baseDir = baseDirFor(agent, Boolean(opts.global));
240
+ // The soku meta-skill teaches `soku call`/`egress`/`auth` — a prerequisite
241
+ // for running any business skill. Install it if absent.
242
+ if (!existsSync(join(baseDir, SOKU_META, 'SKILL.md')))
243
+ installMetaSoku(baseDir);
244
+ for (const entry of targets) {
245
+ installed.push(await installBusinessSkill(baseDir, entry, base));
246
+ }
247
+ }
248
+ emitSuccess({ installed, count: installed.length });
249
+ });
250
+ skill
251
+ .command('installed')
252
+ .description('List skills installed locally')
253
+ .option('--agent <agent>', 'claude | codex | cursor', 'claude')
254
+ .option('--global', 'Inspect the user-level (~) skills directory')
255
+ .action((opts) => {
256
+ const [agent] = parseAgents(opts.agent === 'all' ? 'claude' : opts.agent);
257
+ const baseDir = baseDirFor(agent, Boolean(opts.global));
258
+ const manifest = loadManifest(baseDir);
259
+ const rows = Object.entries(manifest).map(([slug, rec]) => ({
260
+ slug,
261
+ version: rec.version ?? '',
262
+ source: rec.source,
263
+ installed_at: rec.installed_at,
264
+ }));
265
+ emitSuccess({ baseDir, skills: rows, count: rows.length }, (d) => rows.length === 0
266
+ ? dim(`(no Soku skills in ${d.baseDir})`)
267
+ : table(d.skills, [
268
+ { key: 'slug', header: 'SLUG' },
269
+ { key: 'version', header: 'VERSION' },
270
+ { key: 'source', header: 'SOURCE' },
271
+ { key: 'installed_at', header: 'INSTALLED' },
272
+ ]));
273
+ });
274
+ skill
275
+ .command('remove <slug>')
276
+ .description('Remove an installed skill')
277
+ .option('--agent <agent>', 'claude | codex | cursor | all', 'all')
278
+ .option('--global', 'Remove from the user-level (~) skills directory')
279
+ .action((slug, opts) => {
280
+ assertSafeSlug(slug, 'argument');
281
+ const agents = parseAgents(opts.agent);
282
+ const removed = [];
283
+ for (const agent of agents) {
284
+ const baseDir = baseDirFor(agent, Boolean(opts.global));
285
+ if (slug === SOKU_META) {
286
+ const dir = sokuDir(baseDir);
287
+ if (existsSync(dir)) {
288
+ removeMetaSokuFiles(dir);
289
+ removed.push(dir);
290
+ }
291
+ }
292
+ else {
293
+ const link = businessSkillLink(baseDir, slug);
294
+ const dir = businessSkillDir(baseDir, slug);
295
+ if (existsSync(link)) {
296
+ rmSync(link, { recursive: true, force: true });
297
+ removed.push(link);
298
+ }
299
+ if (existsSync(dir)) {
300
+ rmSync(dir, { recursive: true, force: true });
301
+ removed.push(dir);
302
+ }
303
+ }
304
+ const manifest = loadManifest(baseDir);
305
+ if (slug in manifest) {
306
+ delete manifest[slug];
307
+ saveManifest(baseDir, manifest);
308
+ }
309
+ }
310
+ emitSuccess({ removed, count: removed.length });
311
+ });
312
+ }
313
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Persistent CLI config at ~/.soku/config.json (active workspace + endpoint). */
2
+ export interface SokuConfig {
3
+ apiBaseUrl?: string;
4
+ activeOrgId?: string;
5
+ activeBrandId?: string;
6
+ /** Base URL of the public skill bundle CDN (index.json + <slug>.zip). */
7
+ skillsBaseUrl?: string;
8
+ }
9
+ export declare function configDir(): string;
10
+ export declare function loadConfig(): SokuConfig;
11
+ export declare function saveConfig(config: SokuConfig): void;
12
+ export declare function updateConfig(patch: Partial<SokuConfig>): SokuConfig;
13
+ /** Resolution order: --api-base flag (caller passes) → env → config → default. */
14
+ export declare function resolveApiBaseUrl(flag?: string): string;
15
+ /** Resolution order: --skills-url flag → env → config → default CDN. */
16
+ export declare function resolveSkillsBaseUrl(flag?: string): string;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAMlF,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,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,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAO1D"}
package/dist/config.js ADDED
@@ -0,0 +1,45 @@
1
+ /** Persistent CLI config at ~/.soku/config.json (active workspace + endpoint). */
2
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ const DEFAULT_API_BASE = 'https://studio-api.nex.ad';
6
+ const DEFAULT_SKILLS_BASE = 'https://cdn.soku.ai/skills';
7
+ export function configDir() {
8
+ return join(homedir(), '.soku');
9
+ }
10
+ function configPath() {
11
+ return join(configDir(), 'config.json');
12
+ }
13
+ export function loadConfig() {
14
+ try {
15
+ return JSON.parse(readFileSync(configPath(), 'utf8'));
16
+ }
17
+ catch {
18
+ return {};
19
+ }
20
+ }
21
+ export function saveConfig(config) {
22
+ const path = configPath();
23
+ mkdirSync(dirname(path), { recursive: true });
24
+ writeFileSync(path, JSON.stringify(config, null, 2), { mode: 0o600 });
25
+ }
26
+ export function updateConfig(patch) {
27
+ const next = { ...loadConfig(), ...patch };
28
+ saveConfig(next);
29
+ return next;
30
+ }
31
+ /** Resolution order: --api-base flag (caller passes) → env → config → default. */
32
+ export function resolveApiBaseUrl(flag) {
33
+ return (flag ||
34
+ process.env.SOKU_API_BASE ||
35
+ loadConfig().apiBaseUrl ||
36
+ DEFAULT_API_BASE).replace(/\/$/, '');
37
+ }
38
+ /** Resolution order: --skills-url flag → env → config → default CDN. */
39
+ export function resolveSkillsBaseUrl(flag) {
40
+ return (flag ||
41
+ process.env.SOKU_SKILLS_URL ||
42
+ loadConfig().skillsBaseUrl ||
43
+ DEFAULT_SKILLS_BASE).replace(/\/$/, '');
44
+ }
45
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,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;AAUzC,MAAM,gBAAgB,GAAG,2BAA2B,CAAA;AACpD,MAAM,mBAAmB,GAAG,4BAA4B,CAAA;AAExD,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,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,CACL,IAAI;QACJ,OAAO,CAAC,GAAG,CAAC,aAAa;QACzB,UAAU,EAAE,CAAC,UAAU;QACvB,gBAAgB,CACjB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACtB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,OAAO,CACL,IAAI;QACJ,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,UAAU,EAAE,CAAC,aAAa;QAC1B,mBAAmB,CACpB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACtB,CAAC"}