@soku-ai/cli 0.1.0-alpha.0 → 0.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/device.d.ts +9 -0
- package/dist/auth/device.d.ts.map +1 -1
- package/dist/auth/device.js +6 -1
- package/dist/auth/device.js.map +1 -1
- package/dist/commands/ads.d.ts +32 -0
- package/dist/commands/ads.d.ts.map +1 -0
- package/dist/commands/ads.js +752 -0
- package/dist/commands/ads.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +28 -7
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/automation.d.ts +80 -0
- package/dist/commands/automation.d.ts.map +1 -0
- package/dist/commands/automation.js +213 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/brand-skill.d.ts +72 -0
- package/dist/commands/brand-skill.d.ts.map +1 -0
- package/dist/commands/brand-skill.js +351 -0
- package/dist/commands/brand-skill.js.map +1 -0
- package/dist/commands/brand.d.ts.map +1 -1
- package/dist/commands/brand.js +59 -1
- package/dist/commands/brand.js.map +1 -1
- package/dist/commands/call.d.ts.map +1 -1
- package/dist/commands/call.js +6 -3
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/context.d.ts +23 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +291 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/files.d.ts +10 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +48 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/generated.d.ts +24 -3
- package/dist/commands/generated.d.ts.map +1 -1
- package/dist/commands/generated.js +97 -10
- 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/review.d.ts.map +1 -1
- package/dist/commands/review.js +46 -2
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/seo-hosting.d.ts +107 -0
- package/dist/commands/seo-hosting.d.ts.map +1 -0
- package/dist/commands/seo-hosting.js +499 -0
- package/dist/commands/seo-hosting.js.map +1 -0
- package/dist/commands/skill.d.ts +50 -6
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +120 -56
- 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 +5 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -7
- package/dist/config.js.map +1 -1
- package/dist/generated/capabilities.json +291 -30
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +74 -16
- package/dist/http/client.js.map +1 -1
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/dist/output/envelope.d.ts +5 -0
- package/dist/output/envelope.d.ts.map +1 -1
- package/dist/output/envelope.js +101 -2
- package/dist/output/envelope.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 +6 -55
- package/dist/update-check.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +7 -4
- package/postinstall.cjs +85 -0
- package/skills/soku/SKILL.md +254 -18
- package/README.md +0 -91
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/** `soku seo-hosting` — manage file-based SEO Hosting pages and domain connections. */
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { basename } from 'node:path';
|
|
4
|
+
import { apiRequest } from '../http/client.js';
|
|
5
|
+
import { bold, cyan, dim, emitError, emitSuccess, ExitCode, table } from '../output/envelope.js';
|
|
6
|
+
import { unwrapDispatch } from '../output/unwrap.js';
|
|
7
|
+
const CONNECTIONS_PATH = '/api/cli/seo-hosting/domain-connections';
|
|
8
|
+
const ASSETS_PATH = '/api/cli/seo-hosting/assets';
|
|
9
|
+
const SEO_HOSTING_CALL_PATH = '/api/cli/call/seo_hosting';
|
|
10
|
+
const DEFAULT_SECTIONS = ['blog'];
|
|
11
|
+
const ALLOWED_SECTIONS = new Set(['blog', 'use-cases', 'alternatives']);
|
|
12
|
+
export class SeoHostingUsageError extends Error {
|
|
13
|
+
hint;
|
|
14
|
+
constructor(message, hint) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.hint = hint;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function domainConnectionPath(connectionId, suffix) {
|
|
20
|
+
if (!connectionId)
|
|
21
|
+
return CONNECTIONS_PATH;
|
|
22
|
+
const encoded = encodeURIComponent(connectionId);
|
|
23
|
+
return `${CONNECTIONS_PATH}/${encoded}${suffix ? `/${suffix}` : ''}`;
|
|
24
|
+
}
|
|
25
|
+
export function seoHostingCallPath(action) {
|
|
26
|
+
return `${SEO_HOSTING_CALL_PATH}/${encodeURIComponent(action)}`;
|
|
27
|
+
}
|
|
28
|
+
export function parseSections(raw) {
|
|
29
|
+
if (!raw || !raw.trim())
|
|
30
|
+
return [...DEFAULT_SECTIONS];
|
|
31
|
+
const sections = raw
|
|
32
|
+
.split(',')
|
|
33
|
+
.map((part) => part.trim())
|
|
34
|
+
.filter(Boolean);
|
|
35
|
+
const unknown = sections.filter((section) => !ALLOWED_SECTIONS.has(section));
|
|
36
|
+
if (unknown.length > 0) {
|
|
37
|
+
throw new SeoHostingUsageError(`Unsupported section: ${unknown.join(', ')}`, 'Allowed sections: blog, use-cases, alternatives.');
|
|
38
|
+
}
|
|
39
|
+
return [...new Set(sections)];
|
|
40
|
+
}
|
|
41
|
+
export function validateCloudflareTokenOptions(opts) {
|
|
42
|
+
const sources = [opts.cfTokenEnv, opts.cfTokenStdin].filter(Boolean);
|
|
43
|
+
if (sources.length !== 1) {
|
|
44
|
+
throw new SeoHostingUsageError('Provide exactly one Cloudflare token source.', 'Use --cf-token-env NAME or --cf-token-stdin.');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function readAll(input) {
|
|
48
|
+
let out = '';
|
|
49
|
+
for await (const chunk of input)
|
|
50
|
+
out += chunk.toString();
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
export async function readCloudflareToken(opts) {
|
|
54
|
+
validateCloudflareTokenOptions(opts);
|
|
55
|
+
if (opts.cfTokenEnv) {
|
|
56
|
+
const token = process.env[opts.cfTokenEnv]?.trim();
|
|
57
|
+
if (!token) {
|
|
58
|
+
throw new SeoHostingUsageError(`Environment variable ${opts.cfTokenEnv} is empty or unset.`, `Export ${opts.cfTokenEnv} before running connect-worker.`);
|
|
59
|
+
}
|
|
60
|
+
return token;
|
|
61
|
+
}
|
|
62
|
+
const token = (await readAll(process.stdin)).trim();
|
|
63
|
+
if (!token) {
|
|
64
|
+
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 ...');
|
|
65
|
+
}
|
|
66
|
+
return token;
|
|
67
|
+
}
|
|
68
|
+
export function workerProbeBlocker(probe, opts) {
|
|
69
|
+
if (!probe.is_cloudflare) {
|
|
70
|
+
const hint = probe.is_vercel
|
|
71
|
+
? 'This hostname appears to be on Vercel. Use the Web OAuth flow until Vercel CLI support lands.'
|
|
72
|
+
: 'Cloudflare Worker routes require the hostname zone to be on Cloudflare.';
|
|
73
|
+
return new SeoHostingUsageError('Hostname is not using Cloudflare nameservers.', hint);
|
|
74
|
+
}
|
|
75
|
+
if (probe.conflicts.length > 0 && !opts.acceptConflicts) {
|
|
76
|
+
return new SeoHostingUsageError(`Mount paths already serve content: ${probe.conflicts.join(', ')}.`, 'Pass --accept-conflicts after confirming the SEO Hosting Worker may shadow those paths.');
|
|
77
|
+
}
|
|
78
|
+
if (probe.serves_next_assets && !opts.acceptNextAssetsWarning) {
|
|
79
|
+
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.');
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
export async function callSeoHostingAction(action, payload = {}) {
|
|
84
|
+
const result = await apiRequest(seoHostingCallPath(action), {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
workspace: true,
|
|
87
|
+
body: payload,
|
|
88
|
+
});
|
|
89
|
+
return unwrapDispatch(result);
|
|
90
|
+
}
|
|
91
|
+
export function parseSeoOverride(raw) {
|
|
92
|
+
if (!raw)
|
|
93
|
+
return undefined;
|
|
94
|
+
let parsed;
|
|
95
|
+
try {
|
|
96
|
+
parsed = JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
throw new SeoHostingUsageError('--seo must be valid JSON.');
|
|
100
|
+
}
|
|
101
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
102
|
+
throw new SeoHostingUsageError('--seo must be a JSON object.');
|
|
103
|
+
}
|
|
104
|
+
return parsed;
|
|
105
|
+
}
|
|
106
|
+
/** Read the page HTML from exactly one of --html / --html-file / --html-stdin. */
|
|
107
|
+
export async function readHtmlBody(opts) {
|
|
108
|
+
const sources = [opts.html !== undefined, opts.htmlFile, opts.htmlStdin].filter(Boolean);
|
|
109
|
+
if (sources.length !== 1) {
|
|
110
|
+
throw new SeoHostingUsageError('Provide exactly one HTML source.', 'Use --html, --html-file, or --html-stdin.');
|
|
111
|
+
}
|
|
112
|
+
let html;
|
|
113
|
+
if (opts.htmlFile) {
|
|
114
|
+
try {
|
|
115
|
+
html = readFileSync(opts.htmlFile, 'utf8');
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
throw new SeoHostingUsageError(`Could not read HTML file: ${opts.htmlFile}`, err.message);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (opts.htmlStdin) {
|
|
122
|
+
html = await readAll(process.stdin);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
html = opts.html ?? '';
|
|
126
|
+
}
|
|
127
|
+
if (!html.trim()) {
|
|
128
|
+
throw new SeoHostingUsageError('Page HTML cannot be empty.');
|
|
129
|
+
}
|
|
130
|
+
return html;
|
|
131
|
+
}
|
|
132
|
+
export async function buildPagePutPayload(opts) {
|
|
133
|
+
const html = await readHtmlBody(opts);
|
|
134
|
+
const payload = {
|
|
135
|
+
section: opts.section,
|
|
136
|
+
slug: opts.slug,
|
|
137
|
+
title: opts.title,
|
|
138
|
+
html,
|
|
139
|
+
};
|
|
140
|
+
addString(payload, 'description', opts.description);
|
|
141
|
+
addString(payload, 'template', opts.template);
|
|
142
|
+
const seo = parseSeoOverride(opts.seo);
|
|
143
|
+
if (seo)
|
|
144
|
+
payload.seo = seo;
|
|
145
|
+
return payload;
|
|
146
|
+
}
|
|
147
|
+
function addString(payload, key, value) {
|
|
148
|
+
if (value !== undefined && value.trim())
|
|
149
|
+
payload[key] = value;
|
|
150
|
+
}
|
|
151
|
+
export function renderHostingStatus(status) {
|
|
152
|
+
const rows = [
|
|
153
|
+
`${bold('Allowed sections')}: ${status.allowed_sections.join(', ')}`,
|
|
154
|
+
`${bold('Asset CDN')}: ${status.asset_cdn_base_url}`,
|
|
155
|
+
`${bold('Workspace dir')}: ${status.workspace_dir}`,
|
|
156
|
+
];
|
|
157
|
+
if (status.domains.length > 0) {
|
|
158
|
+
rows.push('', bold('Domains'), renderStatusDomains(status.domains));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
rows.push('', dim('No domain connections yet.'));
|
|
162
|
+
}
|
|
163
|
+
return rows.join('\n');
|
|
164
|
+
}
|
|
165
|
+
function renderStatusDomains(items) {
|
|
166
|
+
return table(items.map((item) => ({
|
|
167
|
+
hostname: item.hostname,
|
|
168
|
+
method: item.method,
|
|
169
|
+
status: item.status,
|
|
170
|
+
live: item.live ? 'yes' : 'no',
|
|
171
|
+
contract: item.url_contract,
|
|
172
|
+
sections: item.served_sections.join(',') || '',
|
|
173
|
+
})), [
|
|
174
|
+
{ key: 'hostname', header: 'HOSTNAME' },
|
|
175
|
+
{ key: 'method', header: 'METHOD' },
|
|
176
|
+
{ key: 'status', header: 'STATUS' },
|
|
177
|
+
{ key: 'live', header: 'LIVE' },
|
|
178
|
+
{ key: 'contract', header: 'CONTRACT' },
|
|
179
|
+
{ key: 'sections', header: 'SECTIONS' },
|
|
180
|
+
]);
|
|
181
|
+
}
|
|
182
|
+
export function renderPages(items) {
|
|
183
|
+
return table(items.map((item) => ({
|
|
184
|
+
section: item.section,
|
|
185
|
+
slug: item.slug,
|
|
186
|
+
status: item.status,
|
|
187
|
+
title: item.title || '',
|
|
188
|
+
url: item.url_path,
|
|
189
|
+
})), [
|
|
190
|
+
{ key: 'section', header: 'SECTION' },
|
|
191
|
+
{ key: 'slug', header: 'SLUG' },
|
|
192
|
+
{ key: 'status', header: 'STATUS' },
|
|
193
|
+
{ key: 'title', header: 'TITLE' },
|
|
194
|
+
{ key: 'url', header: 'URL' },
|
|
195
|
+
]);
|
|
196
|
+
}
|
|
197
|
+
export function renderPage(page) {
|
|
198
|
+
const rows = [
|
|
199
|
+
`${bold('Section')}: ${page.section}`,
|
|
200
|
+
`${bold('Slug')}: ${cyan(page.slug)}`,
|
|
201
|
+
`${bold('Title')}: ${page.title}`,
|
|
202
|
+
`${bold('Status')}: ${page.status}`,
|
|
203
|
+
`${bold('URL path')}: ${page.url_path}`,
|
|
204
|
+
];
|
|
205
|
+
if (page.description)
|
|
206
|
+
rows.push(`${bold('Description')}: ${page.description}`);
|
|
207
|
+
if (page.template)
|
|
208
|
+
rows.push(`${bold('Template')}: ${page.template}`);
|
|
209
|
+
if (page.published_at)
|
|
210
|
+
rows.push(`${bold('Published')}: ${page.published_at}`);
|
|
211
|
+
if (page.public_url)
|
|
212
|
+
rows.push(`${bold('Public URL')}: ${page.public_url}`);
|
|
213
|
+
if (page.served !== undefined) {
|
|
214
|
+
rows.push(`${bold('Served')}: ${page.served ? 'yes' : 'no'}`);
|
|
215
|
+
}
|
|
216
|
+
if (page.link_warnings && page.link_warnings.length > 0) {
|
|
217
|
+
rows.push(`${bold('Link warnings')}:`);
|
|
218
|
+
for (const w of page.link_warnings)
|
|
219
|
+
rows.push(` - ${w}`);
|
|
220
|
+
}
|
|
221
|
+
return rows.join('\n');
|
|
222
|
+
}
|
|
223
|
+
export function renderAssetUpload(asset) {
|
|
224
|
+
return [
|
|
225
|
+
`${bold('URL')}: ${cyan(asset.url)}`,
|
|
226
|
+
`${bold('Path')}: ${asset.path}`,
|
|
227
|
+
`${bold('Size')}: ${asset.size_bytes} bytes`,
|
|
228
|
+
].join('\n');
|
|
229
|
+
}
|
|
230
|
+
export function renderConnections(items) {
|
|
231
|
+
return table(items.map((item) => ({
|
|
232
|
+
id: item.id,
|
|
233
|
+
hostname: item.hostname,
|
|
234
|
+
method: item.method,
|
|
235
|
+
status: item.status,
|
|
236
|
+
ssl: item.ssl_status,
|
|
237
|
+
sections: item.mounted_sections?.join(',') || '',
|
|
238
|
+
})), [
|
|
239
|
+
{ key: 'id', header: 'ID' },
|
|
240
|
+
{ key: 'hostname', header: 'HOSTNAME' },
|
|
241
|
+
{ key: 'method', header: 'METHOD' },
|
|
242
|
+
{ key: 'status', header: 'STATUS' },
|
|
243
|
+
{ key: 'ssl', header: 'SSL' },
|
|
244
|
+
{ key: 'sections', header: 'SECTIONS' },
|
|
245
|
+
]);
|
|
246
|
+
}
|
|
247
|
+
export function renderConnection(connection) {
|
|
248
|
+
const rows = [
|
|
249
|
+
`${bold('ID')}: ${cyan(connection.id)}`,
|
|
250
|
+
`${bold('Hostname')}: ${connection.hostname}`,
|
|
251
|
+
`${bold('Method')}: ${connection.method}`,
|
|
252
|
+
`${bold('Status')}: ${connection.status}`,
|
|
253
|
+
`${bold('SSL')}: ${connection.ssl_status}`,
|
|
254
|
+
];
|
|
255
|
+
if (connection.expected_cname_target) {
|
|
256
|
+
rows.push(`${bold('Expected CNAME')}: ${connection.expected_cname_target}`);
|
|
257
|
+
}
|
|
258
|
+
if (connection.mounted_sections?.length) {
|
|
259
|
+
rows.push(`${bold('Sections')}: ${connection.mounted_sections.join(', ')}`);
|
|
260
|
+
}
|
|
261
|
+
if (connection.last_error) {
|
|
262
|
+
rows.push(`${bold('Last error')}: ${connection.last_error}`);
|
|
263
|
+
}
|
|
264
|
+
return rows.join('\n');
|
|
265
|
+
}
|
|
266
|
+
export function renderWorkerProbe(probe) {
|
|
267
|
+
return [
|
|
268
|
+
`${bold('Cloudflare')}: ${probe.is_cloudflare ? 'yes' : 'no'}`,
|
|
269
|
+
`${bold('Vercel')}: ${probe.is_vercel ? 'yes' : 'no'}`,
|
|
270
|
+
`${bold('Conflicts')}: ${probe.conflicts.length ? probe.conflicts.join(', ') : dim('(none)')}`,
|
|
271
|
+
`${bold('Next.js assets')}: ${probe.serves_next_assets ? 'yes' : 'no'}`,
|
|
272
|
+
].join('\n');
|
|
273
|
+
}
|
|
274
|
+
function usageError(error) {
|
|
275
|
+
if (error instanceof SeoHostingUsageError) {
|
|
276
|
+
emitError('usage', error.message, ExitCode.USAGE, error.hint);
|
|
277
|
+
}
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
export function registerSeoHostingCommands(program) {
|
|
281
|
+
const seoHosting = program.command('seo-hosting').description('Manage SEO Hosting');
|
|
282
|
+
seoHosting
|
|
283
|
+
.command('status')
|
|
284
|
+
.description('Show this brand SEO Hosting setup: domains, live state, URL contract')
|
|
285
|
+
.action(async () => {
|
|
286
|
+
const data = await callSeoHostingAction('get_status');
|
|
287
|
+
emitSuccess(data, renderHostingStatus);
|
|
288
|
+
});
|
|
289
|
+
const pages = seoHosting.command('pages').description('Manage SEO Hosting pages');
|
|
290
|
+
pages
|
|
291
|
+
.command('list')
|
|
292
|
+
.description('List file-based SEO Hosting pages for the active brand')
|
|
293
|
+
.option('--section <section>', 'Filter by section: blog, use-cases, alternatives')
|
|
294
|
+
.option('--status <status>', 'Filter by status: draft, published, archived')
|
|
295
|
+
.action(async (opts) => {
|
|
296
|
+
const payload = {};
|
|
297
|
+
addString(payload, 'section', opts.section);
|
|
298
|
+
addString(payload, 'status', opts.status);
|
|
299
|
+
const data = await callSeoHostingAction('list_pages', payload);
|
|
300
|
+
emitSuccess(data, (d) => renderPages(d.items));
|
|
301
|
+
});
|
|
302
|
+
pages
|
|
303
|
+
.command('put')
|
|
304
|
+
.description('Create or overwrite a page (as draft) from an HTML document')
|
|
305
|
+
.requiredOption('--section <section>', 'Content section: blog, use-cases, alternatives')
|
|
306
|
+
.requiredOption('--slug <slug>', 'Page slug (folder name under the section)')
|
|
307
|
+
.requiredOption('--title <title>', 'Page title')
|
|
308
|
+
.option('--html <html>', 'The full HTML document')
|
|
309
|
+
.option('--html-file <path>', 'Read the HTML document from a file')
|
|
310
|
+
.option('--html-stdin', 'Read the HTML document from stdin')
|
|
311
|
+
.option('--description <text>', 'Meta description')
|
|
312
|
+
.option('--template <name>', 'Template name this page was built from')
|
|
313
|
+
.option('--seo <json>', 'SEO overrides JSON object')
|
|
314
|
+
.action(async (opts) => {
|
|
315
|
+
let payload;
|
|
316
|
+
try {
|
|
317
|
+
payload = await buildPagePutPayload(opts);
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
usageError(err);
|
|
321
|
+
}
|
|
322
|
+
const data = await callSeoHostingAction('put_page', payload);
|
|
323
|
+
emitSuccess(data, renderPage);
|
|
324
|
+
});
|
|
325
|
+
pages
|
|
326
|
+
.command('publish')
|
|
327
|
+
.description('Validate and publish a page (makes it live once the domain is live)')
|
|
328
|
+
.requiredOption('--section <section>', 'Content section')
|
|
329
|
+
.requiredOption('--slug <slug>', 'Page slug')
|
|
330
|
+
.action(async (opts) => {
|
|
331
|
+
const data = await callSeoHostingAction('publish_page', {
|
|
332
|
+
section: opts.section,
|
|
333
|
+
slug: opts.slug,
|
|
334
|
+
});
|
|
335
|
+
emitSuccess(data, renderPage);
|
|
336
|
+
});
|
|
337
|
+
pages
|
|
338
|
+
.command('unpublish')
|
|
339
|
+
.description('Unpublish a page (back to draft; stops serving)')
|
|
340
|
+
.requiredOption('--section <section>', 'Content section')
|
|
341
|
+
.requiredOption('--slug <slug>', 'Page slug')
|
|
342
|
+
.action(async (opts) => {
|
|
343
|
+
const data = await callSeoHostingAction('unpublish_page', {
|
|
344
|
+
section: opts.section,
|
|
345
|
+
slug: opts.slug,
|
|
346
|
+
});
|
|
347
|
+
emitSuccess(data, renderPage);
|
|
348
|
+
});
|
|
349
|
+
pages
|
|
350
|
+
.command('delete')
|
|
351
|
+
.description('Delete a page folder (index.html + page.json)')
|
|
352
|
+
.requiredOption('--section <section>', 'Content section')
|
|
353
|
+
.requiredOption('--slug <slug>', 'Page slug')
|
|
354
|
+
.option('--confirm', 'Confirm the delete')
|
|
355
|
+
.action(async (opts) => {
|
|
356
|
+
if (!opts.confirm) {
|
|
357
|
+
emitError('confirmation_required', 'Delete requires explicit confirmation.', ExitCode.USAGE, 'Re-run with --confirm.');
|
|
358
|
+
}
|
|
359
|
+
const data = await callSeoHostingAction('delete_page', {
|
|
360
|
+
section: opts.section,
|
|
361
|
+
slug: opts.slug,
|
|
362
|
+
});
|
|
363
|
+
emitSuccess(data, (d) => `Deleted ${d.section}/${d.slug} (${d.removed_objects} objects).`);
|
|
364
|
+
});
|
|
365
|
+
pages
|
|
366
|
+
.command('upload-asset')
|
|
367
|
+
.description('Upload an image / theme.css / font to the public CDN')
|
|
368
|
+
.requiredOption('--path <path>', "Relative CDN asset path, e.g. 'blog/{slug}/hero.png'")
|
|
369
|
+
.requiredOption('--file <path>', 'Local file to upload')
|
|
370
|
+
.action(async (opts) => {
|
|
371
|
+
// Direct multipart upload (no base64): stream the file to the CLI asset
|
|
372
|
+
// endpoint, which reuses the same AssetPublisher validation as the data action.
|
|
373
|
+
let bytes;
|
|
374
|
+
try {
|
|
375
|
+
bytes = readFileSync(opts.file);
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
usageError(new SeoHostingUsageError(`Could not read file: ${opts.file}`, err.message));
|
|
379
|
+
}
|
|
380
|
+
const form = new FormData();
|
|
381
|
+
form.append('path', opts.path);
|
|
382
|
+
form.append('file', new Blob([bytes]), basename(opts.file));
|
|
383
|
+
const data = await apiRequest(ASSETS_PATH, {
|
|
384
|
+
method: 'POST',
|
|
385
|
+
workspace: true,
|
|
386
|
+
body: form,
|
|
387
|
+
});
|
|
388
|
+
emitSuccess(data, renderAssetUpload);
|
|
389
|
+
});
|
|
390
|
+
const connections = seoHosting
|
|
391
|
+
.command('connections')
|
|
392
|
+
.description('Manage SEO Hosting domain connections');
|
|
393
|
+
connections
|
|
394
|
+
.command('list')
|
|
395
|
+
.description('List domain connections for the active brand')
|
|
396
|
+
.action(async () => {
|
|
397
|
+
const data = await apiRequest(CONNECTIONS_PATH, {
|
|
398
|
+
workspace: true,
|
|
399
|
+
});
|
|
400
|
+
emitSuccess(data, (d) => renderConnections(d.items));
|
|
401
|
+
});
|
|
402
|
+
connections
|
|
403
|
+
.command('probe')
|
|
404
|
+
.description('Probe a hostname before Cloudflare Worker provisioning')
|
|
405
|
+
.requiredOption('--hostname <hostname>', 'Customer hostname, for example example.com')
|
|
406
|
+
.option('--sections <sections>', 'Comma-separated sections to mount', DEFAULT_SECTIONS.join(','))
|
|
407
|
+
.action(async (opts) => {
|
|
408
|
+
let sections;
|
|
409
|
+
try {
|
|
410
|
+
sections = parseSections(opts.sections);
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
usageError(err);
|
|
414
|
+
}
|
|
415
|
+
const data = await apiRequest(`${CONNECTIONS_PATH}/worker/probe`, {
|
|
416
|
+
method: 'POST',
|
|
417
|
+
workspace: true,
|
|
418
|
+
body: { hostname: opts.hostname, sections },
|
|
419
|
+
});
|
|
420
|
+
emitSuccess(data, renderWorkerProbe);
|
|
421
|
+
});
|
|
422
|
+
connections
|
|
423
|
+
.command('connect-cname')
|
|
424
|
+
.description('Connect a CNAME SEO Hosting hostname')
|
|
425
|
+
.requiredOption('--hostname <hostname>', 'Customer hostname, for example blog.example.com')
|
|
426
|
+
.action(async (opts) => {
|
|
427
|
+
const data = await apiRequest(CONNECTIONS_PATH, {
|
|
428
|
+
method: 'POST',
|
|
429
|
+
workspace: true,
|
|
430
|
+
body: { hostname: opts.hostname },
|
|
431
|
+
});
|
|
432
|
+
emitSuccess(data, renderConnection);
|
|
433
|
+
});
|
|
434
|
+
connections
|
|
435
|
+
.command('connect-worker')
|
|
436
|
+
.description('Connect a Cloudflare Worker reverse proxy')
|
|
437
|
+
.requiredOption('--hostname <hostname>', 'Customer hostname, for example example.com')
|
|
438
|
+
.option('--sections <sections>', 'Comma-separated sections to mount', DEFAULT_SECTIONS.join(','))
|
|
439
|
+
.option('--cf-token-env <name>', 'Read the Cloudflare API token from this environment variable')
|
|
440
|
+
.option('--cf-token-stdin', 'Read the Cloudflare API token from stdin')
|
|
441
|
+
.option('--accept-conflicts', 'Allow SEO Hosting routes to shadow existing mounted paths')
|
|
442
|
+
.option('--accept-next-assets-warning', 'Allow /_next/static/* to route through the Worker')
|
|
443
|
+
.action(async (opts) => {
|
|
444
|
+
let sections;
|
|
445
|
+
try {
|
|
446
|
+
sections = parseSections(opts.sections);
|
|
447
|
+
validateCloudflareTokenOptions(opts);
|
|
448
|
+
}
|
|
449
|
+
catch (err) {
|
|
450
|
+
usageError(err);
|
|
451
|
+
}
|
|
452
|
+
const probe = await apiRequest(`${CONNECTIONS_PATH}/worker/probe`, {
|
|
453
|
+
method: 'POST',
|
|
454
|
+
workspace: true,
|
|
455
|
+
body: { hostname: opts.hostname, sections },
|
|
456
|
+
});
|
|
457
|
+
const blocker = workerProbeBlocker(probe, opts);
|
|
458
|
+
if (blocker)
|
|
459
|
+
usageError(blocker);
|
|
460
|
+
let token;
|
|
461
|
+
try {
|
|
462
|
+
token = await readCloudflareToken(opts);
|
|
463
|
+
}
|
|
464
|
+
catch (err) {
|
|
465
|
+
usageError(err);
|
|
466
|
+
}
|
|
467
|
+
const connection = await apiRequest(`${CONNECTIONS_PATH}/worker`, {
|
|
468
|
+
method: 'POST',
|
|
469
|
+
workspace: true,
|
|
470
|
+
body: { hostname: opts.hostname, sections, api_token: token },
|
|
471
|
+
});
|
|
472
|
+
emitSuccess({ connection, probe }, (d) => [renderConnection(d.connection), '', bold('Probe'), renderWorkerProbe(d.probe)].join('\n'));
|
|
473
|
+
});
|
|
474
|
+
connections
|
|
475
|
+
.command('verify <connectionId>')
|
|
476
|
+
.description('Run one verification pass')
|
|
477
|
+
.action(async (connectionId) => {
|
|
478
|
+
const data = await apiRequest(domainConnectionPath(connectionId, 'verify'), {
|
|
479
|
+
method: 'POST',
|
|
480
|
+
workspace: true,
|
|
481
|
+
});
|
|
482
|
+
emitSuccess(data, renderConnection);
|
|
483
|
+
});
|
|
484
|
+
connections
|
|
485
|
+
.command('disconnect <connectionId>')
|
|
486
|
+
.description('Disconnect a domain connection')
|
|
487
|
+
.option('--confirm', 'Confirm the disconnect')
|
|
488
|
+
.action(async (connectionId, opts) => {
|
|
489
|
+
if (!opts.confirm) {
|
|
490
|
+
emitError('confirmation_required', 'Disconnect requires explicit confirmation.', ExitCode.USAGE, 'Re-run with --confirm.');
|
|
491
|
+
}
|
|
492
|
+
const data = await apiRequest(domainConnectionPath(connectionId), {
|
|
493
|
+
method: 'DELETE',
|
|
494
|
+
workspace: true,
|
|
495
|
+
});
|
|
496
|
+
emitSuccess(data, renderConnection);
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
//# 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,19 +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
|
+
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 {
|
|
43
|
+
version?: string | null;
|
|
44
|
+
sha256: string;
|
|
45
|
+
installed_at: string;
|
|
46
|
+
source: 'catalog' | 'cdn' | 'bundled';
|
|
47
|
+
}
|
|
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[];
|
|
16
51
|
/** A slug is safe to use as a path segment (no traversal/separators). Exported for tests. */
|
|
17
52
|
export declare function isSafeSlug(slug: string): boolean;
|
|
53
|
+
export declare function manifestPath(baseDir: string): string;
|
|
54
|
+
export declare function loadManifest(baseDir: string): Manifest;
|
|
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>;
|
|
18
62
|
export declare function registerSkillCommand(program: Command): void;
|
|
19
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"}
|