@soku-ai/cli 0.1.0-alpha.4 → 0.1.0-alpha.7
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/commands/auth.js +1 -1
- package/dist/commands/auth.js.map +1 -1
- 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 +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/seo-hosting.d.ts +100 -0
- package/dist/commands/seo-hosting.d.ts.map +1 -0
- package/dist/commands/seo-hosting.js +489 -0
- package/dist/commands/seo-hosting.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 +208 -30
- 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 +26 -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 +177 -16
- package/README.md +0 -109
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/** `soku seo-hosting` — manage SEO Hosting posts and domain connections. */
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { apiRequest } from '../http/client.js';
|
|
4
|
+
import { bold, cyan, dim, emitError, emitSuccess, ExitCode, table } from '../output/envelope.js';
|
|
5
|
+
import { unwrapDispatch } from '../output/unwrap.js';
|
|
6
|
+
const CONNECTIONS_PATH = '/api/cli/seo-hosting/domain-connections';
|
|
7
|
+
const SEO_HOSTING_CALL_PATH = '/api/cli/call/seo_hosting';
|
|
8
|
+
const DEFAULT_SECTIONS = ['blog'];
|
|
9
|
+
const ALLOWED_SECTIONS = new Set(['blog', 'use-cases', 'alternatives']);
|
|
10
|
+
export class SeoHostingUsageError extends Error {
|
|
11
|
+
hint;
|
|
12
|
+
constructor(message, hint) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.hint = hint;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function domainConnectionPath(connectionId, suffix) {
|
|
18
|
+
if (!connectionId)
|
|
19
|
+
return CONNECTIONS_PATH;
|
|
20
|
+
const encoded = encodeURIComponent(connectionId);
|
|
21
|
+
return `${CONNECTIONS_PATH}/${encoded}${suffix ? `/${suffix}` : ''}`;
|
|
22
|
+
}
|
|
23
|
+
export function seoHostingCallPath(action) {
|
|
24
|
+
return `${SEO_HOSTING_CALL_PATH}/${encodeURIComponent(action)}`;
|
|
25
|
+
}
|
|
26
|
+
export function parseSections(raw) {
|
|
27
|
+
if (!raw || !raw.trim())
|
|
28
|
+
return [...DEFAULT_SECTIONS];
|
|
29
|
+
const sections = raw
|
|
30
|
+
.split(',')
|
|
31
|
+
.map((part) => part.trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
const unknown = sections.filter((section) => !ALLOWED_SECTIONS.has(section));
|
|
34
|
+
if (unknown.length > 0) {
|
|
35
|
+
throw new SeoHostingUsageError(`Unsupported section: ${unknown.join(', ')}`, 'Allowed sections: blog, use-cases, alternatives.');
|
|
36
|
+
}
|
|
37
|
+
return [...new Set(sections)];
|
|
38
|
+
}
|
|
39
|
+
export function validateCloudflareTokenOptions(opts) {
|
|
40
|
+
const sources = [opts.cfTokenEnv, opts.cfTokenStdin].filter(Boolean);
|
|
41
|
+
if (sources.length !== 1) {
|
|
42
|
+
throw new SeoHostingUsageError('Provide exactly one Cloudflare token source.', 'Use --cf-token-env NAME or --cf-token-stdin.');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function readAll(input) {
|
|
46
|
+
let out = '';
|
|
47
|
+
for await (const chunk of input)
|
|
48
|
+
out += chunk.toString();
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
export async function readCloudflareToken(opts) {
|
|
52
|
+
validateCloudflareTokenOptions(opts);
|
|
53
|
+
if (opts.cfTokenEnv) {
|
|
54
|
+
const token = process.env[opts.cfTokenEnv]?.trim();
|
|
55
|
+
if (!token) {
|
|
56
|
+
throw new SeoHostingUsageError(`Environment variable ${opts.cfTokenEnv} is empty or unset.`, `Export ${opts.cfTokenEnv} before running connect-worker.`);
|
|
57
|
+
}
|
|
58
|
+
return token;
|
|
59
|
+
}
|
|
60
|
+
const token = (await readAll(process.stdin)).trim();
|
|
61
|
+
if (!token) {
|
|
62
|
+
throw new SeoHostingUsageError('No Cloudflare token was received on stdin.', 'Pipe the token into the command, for example: printf %s "$CF_TOKEN" | soku seo-hosting connections connect-worker --cf-token-stdin ...');
|
|
63
|
+
}
|
|
64
|
+
return token;
|
|
65
|
+
}
|
|
66
|
+
export function workerProbeBlocker(probe, opts) {
|
|
67
|
+
if (!probe.is_cloudflare) {
|
|
68
|
+
const hint = probe.is_vercel
|
|
69
|
+
? 'This hostname appears to be on Vercel. Use the Web OAuth flow until Vercel CLI support lands.'
|
|
70
|
+
: 'Cloudflare Worker routes require the hostname zone to be on Cloudflare.';
|
|
71
|
+
return new SeoHostingUsageError('Hostname is not using Cloudflare nameservers.', hint);
|
|
72
|
+
}
|
|
73
|
+
if (probe.conflicts.length > 0 && !opts.acceptConflicts) {
|
|
74
|
+
return new SeoHostingUsageError(`Mount paths already serve content: ${probe.conflicts.join(', ')}.`, 'Pass --accept-conflicts after confirming the SEO Hosting Worker may shadow those paths.');
|
|
75
|
+
}
|
|
76
|
+
if (probe.serves_next_assets && !opts.acceptNextAssetsWarning) {
|
|
77
|
+
return new SeoHostingUsageError('The hostname appears to serve its own Next.js assets.', 'Pass --accept-next-assets-warning after confirming /_next/static/* can be routed through the Worker.');
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
export async function callSeoHostingAction(action, payload = {}) {
|
|
82
|
+
const result = await apiRequest(seoHostingCallPath(action), {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
workspace: true,
|
|
85
|
+
body: payload,
|
|
86
|
+
});
|
|
87
|
+
return unwrapDispatch(result);
|
|
88
|
+
}
|
|
89
|
+
export function parseSeoOverride(raw) {
|
|
90
|
+
if (!raw)
|
|
91
|
+
return undefined;
|
|
92
|
+
let parsed;
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(raw);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new SeoHostingUsageError('--seo must be valid JSON.');
|
|
98
|
+
}
|
|
99
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
100
|
+
throw new SeoHostingUsageError('--seo must be a JSON object.');
|
|
101
|
+
}
|
|
102
|
+
return parsed;
|
|
103
|
+
}
|
|
104
|
+
export async function readPostBody(opts, required) {
|
|
105
|
+
const sources = [opts.body !== undefined, opts.bodyFile, opts.bodyStdin].filter(Boolean);
|
|
106
|
+
if (sources.length > 1) {
|
|
107
|
+
throw new SeoHostingUsageError('Provide only one post body source.', 'Use --body, --body-file, or --body-stdin.');
|
|
108
|
+
}
|
|
109
|
+
if (sources.length === 0) {
|
|
110
|
+
if (required) {
|
|
111
|
+
throw new SeoHostingUsageError('Post body is required.', 'Use --body, --body-file, or --body-stdin.');
|
|
112
|
+
}
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
let body;
|
|
116
|
+
if (opts.bodyFile) {
|
|
117
|
+
try {
|
|
118
|
+
body = readFileSync(opts.bodyFile, 'utf8');
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
throw new SeoHostingUsageError(`Could not read body file: ${opts.bodyFile}`, err.message);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (opts.bodyStdin) {
|
|
125
|
+
body = await readAll(process.stdin);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
body = opts.body ?? '';
|
|
129
|
+
}
|
|
130
|
+
if (!body.trim()) {
|
|
131
|
+
throw new SeoHostingUsageError('Post body cannot be empty.');
|
|
132
|
+
}
|
|
133
|
+
return body;
|
|
134
|
+
}
|
|
135
|
+
export async function buildPostCreatePayload(opts) {
|
|
136
|
+
const body = await readPostBody(opts, true);
|
|
137
|
+
const payload = {
|
|
138
|
+
title: opts.title,
|
|
139
|
+
body_markdown: body,
|
|
140
|
+
};
|
|
141
|
+
addString(payload, 'slug', opts.slug);
|
|
142
|
+
addString(payload, 'section', opts.section);
|
|
143
|
+
addString(payload, 'excerpt', opts.excerpt);
|
|
144
|
+
addString(payload, 'cover_image_url', opts.coverImageUrl);
|
|
145
|
+
addString(payload, 'author_name', opts.authorName);
|
|
146
|
+
const seo = parseSeoOverride(opts.seo);
|
|
147
|
+
if (seo)
|
|
148
|
+
payload.seo = seo;
|
|
149
|
+
return payload;
|
|
150
|
+
}
|
|
151
|
+
export async function buildPostUpdatePayload(postId, opts) {
|
|
152
|
+
const payload = { post_id: postId };
|
|
153
|
+
addString(payload, 'title', opts.title);
|
|
154
|
+
addString(payload, 'excerpt', opts.excerpt);
|
|
155
|
+
addString(payload, 'cover_image_url', opts.coverImageUrl);
|
|
156
|
+
addString(payload, 'author_name', opts.authorName);
|
|
157
|
+
const body = await readPostBody(opts, false);
|
|
158
|
+
if (body !== undefined)
|
|
159
|
+
payload.body_markdown = body;
|
|
160
|
+
const seo = parseSeoOverride(opts.seo);
|
|
161
|
+
if (seo)
|
|
162
|
+
payload.seo = seo;
|
|
163
|
+
if (Object.keys(payload).length === 1) {
|
|
164
|
+
throw new SeoHostingUsageError('No post fields were provided.', 'Pass --title, a body option, --excerpt, --cover-image-url, --author-name, or --seo.');
|
|
165
|
+
}
|
|
166
|
+
return payload;
|
|
167
|
+
}
|
|
168
|
+
function addString(payload, key, value) {
|
|
169
|
+
if (value !== undefined && value.trim())
|
|
170
|
+
payload[key] = value;
|
|
171
|
+
}
|
|
172
|
+
export function renderHostingStatus(status) {
|
|
173
|
+
const rows = [
|
|
174
|
+
`${bold('Configured')}: ${status.configured ? 'yes' : 'no'}`,
|
|
175
|
+
`${bold('Live')}: ${status.live ? 'yes' : 'no'}`,
|
|
176
|
+
`${bold('Public URLs')}: ${status.public_base_urls.length ? status.public_base_urls.join(', ') : dim('(none)')}`,
|
|
177
|
+
];
|
|
178
|
+
if (status.connections.length > 0) {
|
|
179
|
+
rows.push('', bold('Connections'), renderConnectionSummaries(status.connections));
|
|
180
|
+
}
|
|
181
|
+
return rows.join('\n');
|
|
182
|
+
}
|
|
183
|
+
function renderConnectionSummaries(items) {
|
|
184
|
+
return table(items.map((item) => ({
|
|
185
|
+
hostname: item.hostname,
|
|
186
|
+
method: item.method,
|
|
187
|
+
status: item.status,
|
|
188
|
+
ssl: item.ssl_status,
|
|
189
|
+
sections: item.mounted_sections?.join(',') || '',
|
|
190
|
+
error: item.last_error || '',
|
|
191
|
+
})), [
|
|
192
|
+
{ key: 'hostname', header: 'HOSTNAME' },
|
|
193
|
+
{ key: 'method', header: 'METHOD' },
|
|
194
|
+
{ key: 'status', header: 'STATUS' },
|
|
195
|
+
{ key: 'ssl', header: 'SSL' },
|
|
196
|
+
{ key: 'sections', header: 'SECTIONS' },
|
|
197
|
+
{ key: 'error', header: 'ERROR' },
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
export function renderPosts(items) {
|
|
201
|
+
return table(items.map((item) => ({
|
|
202
|
+
id: item.id,
|
|
203
|
+
section: item.section,
|
|
204
|
+
slug: item.slug,
|
|
205
|
+
status: item.status,
|
|
206
|
+
title: item.title || '',
|
|
207
|
+
})), [
|
|
208
|
+
{ key: 'id', header: 'ID' },
|
|
209
|
+
{ key: 'section', header: 'SECTION' },
|
|
210
|
+
{ key: 'slug', header: 'SLUG' },
|
|
211
|
+
{ key: 'status', header: 'STATUS' },
|
|
212
|
+
{ key: 'title', header: 'TITLE' },
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
export function renderPost(post) {
|
|
216
|
+
const rows = [
|
|
217
|
+
`${bold('ID')}: ${cyan(post.id)}`,
|
|
218
|
+
`${bold('Section')}: ${post.section}`,
|
|
219
|
+
`${bold('Slug')}: ${post.slug}`,
|
|
220
|
+
`${bold('Status')}: ${post.status}`,
|
|
221
|
+
];
|
|
222
|
+
if (post.title)
|
|
223
|
+
rows.splice(1, 0, `${bold('Title')}: ${post.title}`);
|
|
224
|
+
if (post.url_path)
|
|
225
|
+
rows.push(`${bold('URL path')}: ${post.url_path}`);
|
|
226
|
+
if (post.excerpt)
|
|
227
|
+
rows.push(`${bold('Excerpt')}: ${post.excerpt}`);
|
|
228
|
+
if (post.author_name)
|
|
229
|
+
rows.push(`${bold('Author')}: ${post.author_name}`);
|
|
230
|
+
if (post.published_at)
|
|
231
|
+
rows.push(`${bold('Published')}: ${post.published_at}`);
|
|
232
|
+
if (post.body_markdown !== undefined) {
|
|
233
|
+
rows.push('', post.body_markdown.trim() || dim('(empty body)'));
|
|
234
|
+
}
|
|
235
|
+
return rows.join('\n');
|
|
236
|
+
}
|
|
237
|
+
export function renderConnections(items) {
|
|
238
|
+
return table(items.map((item) => ({
|
|
239
|
+
id: item.id,
|
|
240
|
+
hostname: item.hostname,
|
|
241
|
+
method: item.method,
|
|
242
|
+
status: item.status,
|
|
243
|
+
ssl: item.ssl_status,
|
|
244
|
+
sections: item.mounted_sections?.join(',') || '',
|
|
245
|
+
})), [
|
|
246
|
+
{ key: 'id', header: 'ID' },
|
|
247
|
+
{ key: 'hostname', header: 'HOSTNAME' },
|
|
248
|
+
{ key: 'method', header: 'METHOD' },
|
|
249
|
+
{ key: 'status', header: 'STATUS' },
|
|
250
|
+
{ key: 'ssl', header: 'SSL' },
|
|
251
|
+
{ key: 'sections', header: 'SECTIONS' },
|
|
252
|
+
]);
|
|
253
|
+
}
|
|
254
|
+
export function renderConnection(connection) {
|
|
255
|
+
const rows = [
|
|
256
|
+
`${bold('ID')}: ${cyan(connection.id)}`,
|
|
257
|
+
`${bold('Hostname')}: ${connection.hostname}`,
|
|
258
|
+
`${bold('Method')}: ${connection.method}`,
|
|
259
|
+
`${bold('Status')}: ${connection.status}`,
|
|
260
|
+
`${bold('SSL')}: ${connection.ssl_status}`,
|
|
261
|
+
];
|
|
262
|
+
if (connection.expected_cname_target) {
|
|
263
|
+
rows.push(`${bold('Expected CNAME')}: ${connection.expected_cname_target}`);
|
|
264
|
+
}
|
|
265
|
+
if (connection.mounted_sections?.length) {
|
|
266
|
+
rows.push(`${bold('Sections')}: ${connection.mounted_sections.join(', ')}`);
|
|
267
|
+
}
|
|
268
|
+
if (connection.last_error) {
|
|
269
|
+
rows.push(`${bold('Last error')}: ${connection.last_error}`);
|
|
270
|
+
}
|
|
271
|
+
return rows.join('\n');
|
|
272
|
+
}
|
|
273
|
+
export function renderWorkerProbe(probe) {
|
|
274
|
+
return [
|
|
275
|
+
`${bold('Cloudflare')}: ${probe.is_cloudflare ? 'yes' : 'no'}`,
|
|
276
|
+
`${bold('Vercel')}: ${probe.is_vercel ? 'yes' : 'no'}`,
|
|
277
|
+
`${bold('Conflicts')}: ${probe.conflicts.length ? probe.conflicts.join(', ') : dim('(none)')}`,
|
|
278
|
+
`${bold('Next.js assets')}: ${probe.serves_next_assets ? 'yes' : 'no'}`,
|
|
279
|
+
].join('\n');
|
|
280
|
+
}
|
|
281
|
+
function usageError(error) {
|
|
282
|
+
if (error instanceof SeoHostingUsageError) {
|
|
283
|
+
emitError('usage', error.message, ExitCode.USAGE, error.hint);
|
|
284
|
+
}
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
export function registerSeoHostingCommands(program) {
|
|
288
|
+
const seoHosting = program.command('seo-hosting').description('Manage SEO Hosting');
|
|
289
|
+
seoHosting
|
|
290
|
+
.command('status')
|
|
291
|
+
.description('Check whether the active brand has live SEO Hosting')
|
|
292
|
+
.action(async () => {
|
|
293
|
+
const data = await callSeoHostingAction('get_hosting_status');
|
|
294
|
+
emitSuccess(data, renderHostingStatus);
|
|
295
|
+
});
|
|
296
|
+
const posts = seoHosting.command('posts').description('Manage SEO Hosting posts');
|
|
297
|
+
posts
|
|
298
|
+
.command('list')
|
|
299
|
+
.description('List SEO Hosting posts for the active brand')
|
|
300
|
+
.option('--section <section>', 'Filter by section: blog, use-cases, alternatives')
|
|
301
|
+
.option('--status <status>', 'Filter by status: draft, published, archived')
|
|
302
|
+
.action(async (opts) => {
|
|
303
|
+
const payload = {};
|
|
304
|
+
addString(payload, 'section', opts.section);
|
|
305
|
+
addString(payload, 'status', opts.status);
|
|
306
|
+
const data = await callSeoHostingAction('list_posts', payload);
|
|
307
|
+
emitSuccess(data, (d) => renderPosts(d.items));
|
|
308
|
+
});
|
|
309
|
+
posts
|
|
310
|
+
.command('get <postId>')
|
|
311
|
+
.description('Read one SEO Hosting post including its Markdown body')
|
|
312
|
+
.action(async (postId) => {
|
|
313
|
+
const data = await callSeoHostingAction('get_post', { post_id: postId });
|
|
314
|
+
emitSuccess(data, renderPost);
|
|
315
|
+
});
|
|
316
|
+
posts
|
|
317
|
+
.command('create')
|
|
318
|
+
.description('Create a draft SEO Hosting post')
|
|
319
|
+
.requiredOption('--title <title>', 'Post title')
|
|
320
|
+
.option('--body <markdown>', 'Post body as Markdown')
|
|
321
|
+
.option('--body-file <path>', 'Read Markdown body from a file')
|
|
322
|
+
.option('--body-stdin', 'Read Markdown body from stdin')
|
|
323
|
+
.option('--slug <slug>', 'Optional URL slug; derived from title when omitted')
|
|
324
|
+
.option('--section <section>', 'Content section: blog, use-cases, alternatives')
|
|
325
|
+
.option('--excerpt <text>', 'Short excerpt')
|
|
326
|
+
.option('--cover-image-url <url>', 'Cover image URL')
|
|
327
|
+
.option('--author-name <name>', 'Display author name')
|
|
328
|
+
.option('--seo <json>', 'SEO overrides JSON object')
|
|
329
|
+
.action(async (opts) => {
|
|
330
|
+
let payload;
|
|
331
|
+
try {
|
|
332
|
+
payload = await buildPostCreatePayload(opts);
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
usageError(err);
|
|
336
|
+
}
|
|
337
|
+
const data = await callSeoHostingAction('create_post', payload);
|
|
338
|
+
emitSuccess(data, renderPost);
|
|
339
|
+
});
|
|
340
|
+
posts
|
|
341
|
+
.command('update <postId>')
|
|
342
|
+
.description('Update a SEO Hosting post')
|
|
343
|
+
.option('--title <title>', 'New title')
|
|
344
|
+
.option('--body <markdown>', 'New body as Markdown')
|
|
345
|
+
.option('--body-file <path>', 'Read new Markdown body from a file')
|
|
346
|
+
.option('--body-stdin', 'Read new Markdown body from stdin')
|
|
347
|
+
.option('--excerpt <text>', 'New excerpt')
|
|
348
|
+
.option('--cover-image-url <url>', 'New cover image URL')
|
|
349
|
+
.option('--author-name <name>', 'New display author name')
|
|
350
|
+
.option('--seo <json>', 'SEO overrides JSON object')
|
|
351
|
+
.action(async (postId, opts) => {
|
|
352
|
+
let payload;
|
|
353
|
+
try {
|
|
354
|
+
payload = await buildPostUpdatePayload(postId, opts);
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
usageError(err);
|
|
358
|
+
}
|
|
359
|
+
const data = await callSeoHostingAction('update_post', payload);
|
|
360
|
+
emitSuccess(data, renderPost);
|
|
361
|
+
});
|
|
362
|
+
posts
|
|
363
|
+
.command('publish <postId>')
|
|
364
|
+
.description('Publish a SEO Hosting post')
|
|
365
|
+
.action(async (postId) => {
|
|
366
|
+
const data = await callSeoHostingAction('publish_post', { post_id: postId });
|
|
367
|
+
emitSuccess(data, renderPost);
|
|
368
|
+
});
|
|
369
|
+
posts
|
|
370
|
+
.command('delete <postId>')
|
|
371
|
+
.description('Soft-delete a SEO Hosting post')
|
|
372
|
+
.option('--confirm', 'Confirm the delete')
|
|
373
|
+
.action(async (postId, opts) => {
|
|
374
|
+
if (!opts.confirm) {
|
|
375
|
+
emitError('confirmation_required', 'Delete requires explicit confirmation.', ExitCode.USAGE, 'Re-run with --confirm.');
|
|
376
|
+
}
|
|
377
|
+
const data = await callSeoHostingAction('delete_post', { post_id: postId });
|
|
378
|
+
emitSuccess(data, renderPost);
|
|
379
|
+
});
|
|
380
|
+
const connections = seoHosting
|
|
381
|
+
.command('connections')
|
|
382
|
+
.description('Manage SEO Hosting domain connections');
|
|
383
|
+
connections
|
|
384
|
+
.command('list')
|
|
385
|
+
.description('List domain connections for the active brand')
|
|
386
|
+
.action(async () => {
|
|
387
|
+
const data = await apiRequest(CONNECTIONS_PATH, {
|
|
388
|
+
workspace: true,
|
|
389
|
+
});
|
|
390
|
+
emitSuccess(data, (d) => renderConnections(d.items));
|
|
391
|
+
});
|
|
392
|
+
connections
|
|
393
|
+
.command('probe')
|
|
394
|
+
.description('Probe a hostname before Cloudflare Worker provisioning')
|
|
395
|
+
.requiredOption('--hostname <hostname>', 'Customer hostname, for example example.com')
|
|
396
|
+
.option('--sections <sections>', 'Comma-separated sections to mount', DEFAULT_SECTIONS.join(','))
|
|
397
|
+
.action(async (opts) => {
|
|
398
|
+
let sections;
|
|
399
|
+
try {
|
|
400
|
+
sections = parseSections(opts.sections);
|
|
401
|
+
}
|
|
402
|
+
catch (err) {
|
|
403
|
+
usageError(err);
|
|
404
|
+
}
|
|
405
|
+
const data = await apiRequest(`${CONNECTIONS_PATH}/worker/probe`, {
|
|
406
|
+
method: 'POST',
|
|
407
|
+
workspace: true,
|
|
408
|
+
body: { hostname: opts.hostname, sections },
|
|
409
|
+
});
|
|
410
|
+
emitSuccess(data, renderWorkerProbe);
|
|
411
|
+
});
|
|
412
|
+
connections
|
|
413
|
+
.command('connect-cname')
|
|
414
|
+
.description('Connect a CNAME SEO Hosting hostname')
|
|
415
|
+
.requiredOption('--hostname <hostname>', 'Customer hostname, for example blog.example.com')
|
|
416
|
+
.action(async (opts) => {
|
|
417
|
+
const data = await apiRequest(CONNECTIONS_PATH, {
|
|
418
|
+
method: 'POST',
|
|
419
|
+
workspace: true,
|
|
420
|
+
body: { hostname: opts.hostname },
|
|
421
|
+
});
|
|
422
|
+
emitSuccess(data, renderConnection);
|
|
423
|
+
});
|
|
424
|
+
connections
|
|
425
|
+
.command('connect-worker')
|
|
426
|
+
.description('Connect a Cloudflare Worker reverse proxy')
|
|
427
|
+
.requiredOption('--hostname <hostname>', 'Customer hostname, for example example.com')
|
|
428
|
+
.option('--sections <sections>', 'Comma-separated sections to mount', DEFAULT_SECTIONS.join(','))
|
|
429
|
+
.option('--cf-token-env <name>', 'Read the Cloudflare API token from this environment variable')
|
|
430
|
+
.option('--cf-token-stdin', 'Read the Cloudflare API token from stdin')
|
|
431
|
+
.option('--accept-conflicts', 'Allow SEO Hosting routes to shadow existing mounted paths')
|
|
432
|
+
.option('--accept-next-assets-warning', 'Allow /_next/static/* to route through the Worker')
|
|
433
|
+
.action(async (opts) => {
|
|
434
|
+
let sections;
|
|
435
|
+
try {
|
|
436
|
+
sections = parseSections(opts.sections);
|
|
437
|
+
validateCloudflareTokenOptions(opts);
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
usageError(err);
|
|
441
|
+
}
|
|
442
|
+
const probe = await apiRequest(`${CONNECTIONS_PATH}/worker/probe`, {
|
|
443
|
+
method: 'POST',
|
|
444
|
+
workspace: true,
|
|
445
|
+
body: { hostname: opts.hostname, sections },
|
|
446
|
+
});
|
|
447
|
+
const blocker = workerProbeBlocker(probe, opts);
|
|
448
|
+
if (blocker)
|
|
449
|
+
usageError(blocker);
|
|
450
|
+
let token;
|
|
451
|
+
try {
|
|
452
|
+
token = await readCloudflareToken(opts);
|
|
453
|
+
}
|
|
454
|
+
catch (err) {
|
|
455
|
+
usageError(err);
|
|
456
|
+
}
|
|
457
|
+
const connection = await apiRequest(`${CONNECTIONS_PATH}/worker`, {
|
|
458
|
+
method: 'POST',
|
|
459
|
+
workspace: true,
|
|
460
|
+
body: { hostname: opts.hostname, sections, api_token: token },
|
|
461
|
+
});
|
|
462
|
+
emitSuccess({ connection, probe }, (d) => [renderConnection(d.connection), '', bold('Probe'), renderWorkerProbe(d.probe)].join('\n'));
|
|
463
|
+
});
|
|
464
|
+
connections
|
|
465
|
+
.command('verify <connectionId>')
|
|
466
|
+
.description('Run one verification pass')
|
|
467
|
+
.action(async (connectionId) => {
|
|
468
|
+
const data = await apiRequest(domainConnectionPath(connectionId, 'verify'), {
|
|
469
|
+
method: 'POST',
|
|
470
|
+
workspace: true,
|
|
471
|
+
});
|
|
472
|
+
emitSuccess(data, renderConnection);
|
|
473
|
+
});
|
|
474
|
+
connections
|
|
475
|
+
.command('disconnect <connectionId>')
|
|
476
|
+
.description('Disconnect a domain connection')
|
|
477
|
+
.option('--confirm', 'Confirm the disconnect')
|
|
478
|
+
.action(async (connectionId, opts) => {
|
|
479
|
+
if (!opts.confirm) {
|
|
480
|
+
emitError('confirmation_required', 'Disconnect requires explicit confirmation.', ExitCode.USAGE, 'Re-run with --confirm.');
|
|
481
|
+
}
|
|
482
|
+
const data = await apiRequest(domainConnectionPath(connectionId), {
|
|
483
|
+
method: 'DELETE',
|
|
484
|
+
workspace: true,
|
|
485
|
+
});
|
|
486
|
+
emitSuccess(data, renderConnection);
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=seo-hosting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-hosting.js","sourceRoot":"","sources":["../../src/commands/seo-hosting.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skill.d.ts
CHANGED
|
@@ -1,29 +1,63 @@
|
|
|
1
1
|
/** `soku skill` — discover and install Soku skills into an AI client.
|
|
2
2
|
*
|
|
3
|
-
* - `soku skill list` browse the public skill catalog
|
|
3
|
+
* - `soku skill list` browse the public Soku skill catalog
|
|
4
4
|
* - `soku skill install <slug...>` download + install business skills
|
|
5
5
|
* - `soku skill install --all` install the whole catalog
|
|
6
6
|
* - `soku skill install` (no slug) install just the bundled `soku` meta-skill
|
|
7
|
-
* - `soku skill
|
|
7
|
+
* - `soku skill status` / `remove` manage what's installed locally
|
|
8
8
|
*
|
|
9
|
-
* Business skills are fetched as per-skill zips from
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* Business skills are fetched as per-skill zips from the public Soku skill
|
|
10
|
+
* catalog, already translated to CLI-native at pack time. We verify the sha256
|
|
11
|
+
* from index.json, unzip safely, and drop each business skill into
|
|
12
|
+
* `<skillsDir>/soku/<slug>/` with a top-level symlink
|
|
13
13
|
* `<skillsDir>/soku-<slug> -> soku/<slug>`. The bundled `soku` meta-skill (how
|
|
14
14
|
* to drive the CLI) ships in the npm package and is installed as a prerequisite. */
|
|
15
15
|
import { Command } from 'commander';
|
|
16
|
-
|
|
16
|
+
export declare const SOKU_META = "soku";
|
|
17
|
+
export declare const MANIFEST_FILE = ".soku-skills.json";
|
|
18
|
+
export type Agent = 'claude' | 'codex' | 'cursor';
|
|
19
|
+
export declare const AGENTS: Agent[];
|
|
20
|
+
export declare const PROJECT_DIRS: Record<Agent, string>;
|
|
21
|
+
export declare const GLOBAL_DIRS: Record<Agent, string>;
|
|
22
|
+
export interface IndexEntry {
|
|
23
|
+
slug: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
category?: string | null;
|
|
27
|
+
version?: string | null;
|
|
28
|
+
providers?: string[];
|
|
29
|
+
tags?: string[];
|
|
30
|
+
zip: string;
|
|
31
|
+
sha256: string;
|
|
32
|
+
bytes: number;
|
|
33
|
+
}
|
|
34
|
+
export interface SkillIndex {
|
|
35
|
+
schema: number;
|
|
36
|
+
generated_at: string;
|
|
37
|
+
source_commit: string;
|
|
38
|
+
base_url: string;
|
|
39
|
+
count: number;
|
|
40
|
+
skills: IndexEntry[];
|
|
41
|
+
}
|
|
42
|
+
export interface ManifestRecord {
|
|
17
43
|
version?: string | null;
|
|
18
44
|
sha256: string;
|
|
19
45
|
installed_at: string;
|
|
20
|
-
source: 'cdn' | 'bundled';
|
|
46
|
+
source: 'catalog' | 'cdn' | 'bundled';
|
|
21
47
|
}
|
|
22
|
-
type Manifest = Record<string, ManifestRecord>;
|
|
48
|
+
export type Manifest = Record<string, ManifestRecord>;
|
|
49
|
+
export declare function baseDirFor(agent: Agent, global: boolean): string;
|
|
50
|
+
export declare function parseAgents(value: string): Agent[];
|
|
23
51
|
/** A slug is safe to use as a path segment (no traversal/separators). Exported for tests. */
|
|
24
52
|
export declare function isSafeSlug(slug: string): boolean;
|
|
53
|
+
export declare function manifestPath(baseDir: string): string;
|
|
25
54
|
export declare function loadManifest(baseDir: string): Manifest;
|
|
26
55
|
export declare function saveManifest(baseDir: string, manifest: Manifest): void;
|
|
56
|
+
export declare function agentSkillName(slug: string): string;
|
|
57
|
+
export declare function fetchIndex(base: string): Promise<SkillIndex>;
|
|
58
|
+
/** Copy the bundled `soku` meta-skill into a client dir without deleting child skills. */
|
|
59
|
+
export declare function installMetaSoku(baseDir: string): string;
|
|
60
|
+
/** Download, verify, unzip, and install one business skill. */
|
|
61
|
+
export declare function installBusinessSkill(baseDir: string, entry: IndexEntry, base: string): Promise<string>;
|
|
27
62
|
export declare function registerSkillCommand(program: Command): void;
|
|
28
|
-
export {};
|
|
29
63
|
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;oFAaoF;AAQpF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;oFAaoF;AAQpF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,SAAS,SAAS,CAAA;AAC/B,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAEhD,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEjD,eAAO,MAAM,MAAM,EAAE,KAAK,EAAkC,CAAA;AAE5D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAI9C,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAI7C,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,CAAA;CACtC;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAYrD,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAIlD;AASD,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAQD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAMtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQtE;AAcD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AA8CD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoBlE;AAeD,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED,+DAA+D;AAC/D,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C5G;AAuDD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6H3D"}
|