frontpage-host 0.1.19 → 0.1.20
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/AGENTS.md +1 -1
- package/dist/commands/shop.js +87 -3
- package/dist/registry.js +7 -4
- package/llms.txt +1 -1
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -128,7 +128,7 @@ Sites are Astro 6 + Tailwind v4. More detail: `frontpage help site-building` or
|
|
|
128
128
|
- Generated images: `frontpage images generate --prompt "…"` `[--count N]` — one prompt, 1–4 variations of that same picture. Prints `sitePath:` first. Counts against AI $ and storage. Flag-off environments return 404 (`Image generation is not enabled.`). Do not call xAI / Imagine yourself.
|
|
129
129
|
- Analytics: bare `frontpage analytics` = dashboard; also `summary|query|funnel|timeseries|compare|sql` for structured reads (SQL is guard + RLS site-scoped).
|
|
130
130
|
- People CRM: `frontpage people list|get|add|set|note|rm-note|follow-up|hide|unhide|tag|export`. Site-scoped person graph (email or phone). Inbox stays the raw ledger. Hide is not forget. List export is CSV (not a one-person legal dump). Full guide: https://frontpage.host/developers/people
|
|
131
|
-
- Store catalog: `frontpage shop items|variants|settings|orders|payments`. Integer cents only (`$49.99` is `4999`). Stock `--add` / `--remove` become signed delta (`added 5` / `removed 5` / `set to 20` / `stockNow`). Connect stays `frontpage modules shop|payments connect`. Square `ordering` is a different module. Full guide: https://frontpage.host/developers/shop
|
|
131
|
+
- Store catalog: `frontpage shop items|variants|categories|settings|orders|payments`. Integer cents only (`$49.99` is `4999`). Stock `--add` / `--remove` become signed delta (`added 5` / `removed 5` / `set to 20` / `stockNow`). Create a category before assigning it (`categories create hats --label Hats`, then `items create … --categories hats`). Connect stays `frontpage modules shop|payments connect`. Square `ordering` is a different module. Full guide: https://frontpage.host/developers/shop
|
|
132
132
|
|
|
133
133
|
## Agent prompt loop
|
|
134
134
|
|
package/dist/commands/shop.js
CHANGED
|
@@ -4,7 +4,7 @@ import { CliHttpError, EXIT_OK, EXIT_USAGE, v1Get, v1Patch, v1Post, v1Put, } fro
|
|
|
4
4
|
import { assertNoUnknownFlags, hasFlag, takeFlag } from "../argv.js";
|
|
5
5
|
import { emitErr, emitOk, emitUsage, isJson } from "../runtime.js";
|
|
6
6
|
import { SHOP_ID_RE, VARIANT_ID_RE } from "./shop-ids.js";
|
|
7
|
-
const USAGE = "Usage: frontpage shop items|variants|settings|orders|payments … [--site <slug>] [--json]";
|
|
7
|
+
const USAGE = "Usage: frontpage shop items|variants|categories|settings|orders|payments … [--site <slug>] [--json]";
|
|
8
8
|
const CENTS_HINT = "$49.99 is 4999";
|
|
9
9
|
function takeAll(work, name) {
|
|
10
10
|
const out = [];
|
|
@@ -147,6 +147,7 @@ function printItem(row) {
|
|
|
147
147
|
prices.length ? prices.join(",") : "",
|
|
148
148
|
stocks.length ? `stock ${stocks.join(",")}` : "",
|
|
149
149
|
row.active === false ? "inactive" : "active",
|
|
150
|
+
row.categories?.length ? row.categories.join(",") : "",
|
|
150
151
|
row.archivedAt ? "archived" : "",
|
|
151
152
|
].filter(Boolean);
|
|
152
153
|
console.log(`${row.itemId} ${row.title ?? ""} ${bits.join(" · ")}`);
|
|
@@ -168,9 +169,15 @@ export async function runShop(args) {
|
|
|
168
169
|
if (!sub || sub === "list" || sub.startsWith("-")) {
|
|
169
170
|
const listWork = sub === "list" ? work : rest.slice(1);
|
|
170
171
|
const archived = hasFlag(listWork, "--archived");
|
|
172
|
+
const category = takeFlag(listWork, "--category");
|
|
171
173
|
assertNoUnknownFlags(listWork, "shop");
|
|
172
|
-
const qs =
|
|
173
|
-
|
|
174
|
+
const qs = new URLSearchParams();
|
|
175
|
+
if (archived)
|
|
176
|
+
qs.set("archived", "1");
|
|
177
|
+
if (category)
|
|
178
|
+
qs.set("category", category);
|
|
179
|
+
const suffix = qs.toString() ? `?${qs.toString()}` : "";
|
|
180
|
+
const data = await v1Get(`${base}/items${suffix}`);
|
|
174
181
|
if (isJson()) {
|
|
175
182
|
emitOk("shop", data);
|
|
176
183
|
return EXIT_OK;
|
|
@@ -214,6 +221,7 @@ export async function runShop(args) {
|
|
|
214
221
|
const minCents = parseCentsFlag(takeFlag(work, "--min-cents"), "minCents");
|
|
215
222
|
const requiresShipping = parseBoolFlag(takeFlag(work, "--requires-shipping"), "requiresShipping");
|
|
216
223
|
const optionNames = parseCsv(takeFlag(work, "--option-names"));
|
|
224
|
+
const categories = parseCsv(takeFlag(work, "--categories"));
|
|
217
225
|
const priceCents = parseCentsFlag(takeFlag(work, "--price-cents"), "priceCents");
|
|
218
226
|
const discountCents = parseCentsFlag(takeFlag(work, "--discount-cents"), "discountPriceCents");
|
|
219
227
|
const shippingCents = parseCentsFlag(takeFlag(work, "--shipping-cents"), "shippingCents");
|
|
@@ -239,6 +247,8 @@ export async function runShop(args) {
|
|
|
239
247
|
body.requiresShipping = requiresShipping;
|
|
240
248
|
if (optionNames)
|
|
241
249
|
body.optionNames = optionNames;
|
|
250
|
+
if (categories)
|
|
251
|
+
body.categories = categories;
|
|
242
252
|
if (images.length)
|
|
243
253
|
body.images = images;
|
|
244
254
|
if (body.checkout == null)
|
|
@@ -278,6 +288,7 @@ export async function runShop(args) {
|
|
|
278
288
|
const minCents = parseCentsFlag(takeFlag(work, "--min-cents"), "minCents");
|
|
279
289
|
const requiresShipping = parseBoolFlag(takeFlag(work, "--requires-shipping"), "requiresShipping");
|
|
280
290
|
const active = parseBoolFlag(takeFlag(work, "--active"), "active");
|
|
291
|
+
const categories = parseCsv(takeFlag(work, "--categories"));
|
|
281
292
|
const images = parseUrls(work);
|
|
282
293
|
assertNoUnknownFlags(work, "shop");
|
|
283
294
|
const body = {};
|
|
@@ -295,6 +306,8 @@ export async function runShop(args) {
|
|
|
295
306
|
body.requiresShipping = requiresShipping;
|
|
296
307
|
if (active !== undefined)
|
|
297
308
|
body.active = active;
|
|
309
|
+
if (categories)
|
|
310
|
+
body.categories = categories;
|
|
298
311
|
if (images.length)
|
|
299
312
|
body.images = images;
|
|
300
313
|
if (Object.keys(body).length === 0) {
|
|
@@ -474,6 +487,77 @@ export async function runShop(args) {
|
|
|
474
487
|
}
|
|
475
488
|
return emitUsage("shop", USAGE);
|
|
476
489
|
}
|
|
490
|
+
if (group === "categories") {
|
|
491
|
+
const sub = rest[1];
|
|
492
|
+
const work = rest.slice(2);
|
|
493
|
+
if (!sub || sub === "list" || sub.startsWith("-")) {
|
|
494
|
+
const listWork = sub === "list" ? work : rest.slice(1);
|
|
495
|
+
const archived = hasFlag(listWork, "--archived");
|
|
496
|
+
assertNoUnknownFlags(listWork, "shop");
|
|
497
|
+
const qs = archived ? "?archived=1" : "";
|
|
498
|
+
const data = await v1Get(`${base}/categories${qs}`);
|
|
499
|
+
if (isJson()) {
|
|
500
|
+
emitOk("shop", data);
|
|
501
|
+
return EXIT_OK;
|
|
502
|
+
}
|
|
503
|
+
const rows = data.categories ?? [];
|
|
504
|
+
if (rows.length === 0) {
|
|
505
|
+
console.log("No categories.");
|
|
506
|
+
return EXIT_OK;
|
|
507
|
+
}
|
|
508
|
+
for (const row of rows) {
|
|
509
|
+
console.log(`${row.slug} ${row.label}${row.archivedAt ? " archived" : ""}`);
|
|
510
|
+
}
|
|
511
|
+
return EXIT_OK;
|
|
512
|
+
}
|
|
513
|
+
if (sub === "create") {
|
|
514
|
+
const slug = takeFlag(work, "--slug") ?? takeFlag(work, "--id") ?? work.find((a) => !a.startsWith("-"));
|
|
515
|
+
if (slug && work.includes(slug))
|
|
516
|
+
work.splice(work.indexOf(slug), 1);
|
|
517
|
+
const label = takeFlag(work, "--label") ?? takeFlag(work, "--title");
|
|
518
|
+
assertNoUnknownFlags(work, "shop");
|
|
519
|
+
if (!slug || !SHOP_ID_RE.test(slug) || !label) {
|
|
520
|
+
throw new CliHttpError("Usage: frontpage shop categories create hats --label Hats", EXIT_USAGE, 0, "bad_request");
|
|
521
|
+
}
|
|
522
|
+
const data = await v1Post(`${base}/categories`, {
|
|
523
|
+
slug,
|
|
524
|
+
label,
|
|
525
|
+
});
|
|
526
|
+
if (isJson()) {
|
|
527
|
+
emitOk("shop", data);
|
|
528
|
+
return EXIT_OK;
|
|
529
|
+
}
|
|
530
|
+
console.log(`${data.category.slug} ${data.category.label}`);
|
|
531
|
+
return EXIT_OK;
|
|
532
|
+
}
|
|
533
|
+
if (sub === "rename") {
|
|
534
|
+
const slug = requireShopId(work, "Category slug");
|
|
535
|
+
const label = takeFlag(work, "--label") ?? takeFlag(work, "--title");
|
|
536
|
+
assertNoUnknownFlags(work, "shop");
|
|
537
|
+
if (!label) {
|
|
538
|
+
throw new CliHttpError("Usage: frontpage shop categories rename hats --label Hats", EXIT_USAGE, 0, "bad_request");
|
|
539
|
+
}
|
|
540
|
+
const data = await v1Patch(`${base}/categories/${encodeURIComponent(slug)}`, { label });
|
|
541
|
+
if (isJson()) {
|
|
542
|
+
emitOk("shop", data);
|
|
543
|
+
return EXIT_OK;
|
|
544
|
+
}
|
|
545
|
+
console.log(`${data.category.slug} ${data.category.label}`);
|
|
546
|
+
return EXIT_OK;
|
|
547
|
+
}
|
|
548
|
+
if (sub === "archive") {
|
|
549
|
+
const slug = requireShopId(work, "Category slug");
|
|
550
|
+
assertNoUnknownFlags(work, "shop");
|
|
551
|
+
const data = await v1Post(`${base}/categories/${encodeURIComponent(slug)}/archive`, {});
|
|
552
|
+
if (isJson()) {
|
|
553
|
+
emitOk("shop", data);
|
|
554
|
+
return EXIT_OK;
|
|
555
|
+
}
|
|
556
|
+
console.log(`${data.category.slug} archived`);
|
|
557
|
+
return EXIT_OK;
|
|
558
|
+
}
|
|
559
|
+
return emitUsage("shop", USAGE);
|
|
560
|
+
}
|
|
477
561
|
if (group === "settings") {
|
|
478
562
|
const sub = rest[1] ?? "get";
|
|
479
563
|
const work = rest.slice(2);
|
package/dist/registry.js
CHANGED
|
@@ -442,11 +442,13 @@ export const COMMANDS = [
|
|
|
442
442
|
{
|
|
443
443
|
name: "shop",
|
|
444
444
|
summary: "Store catalog: items, variants, stock, and store settings (not Square, not inbox)",
|
|
445
|
-
usage: "frontpage shop items|variants|settings|orders|payments … [--site <slug>] [--json]",
|
|
445
|
+
usage: "frontpage shop items|variants|categories|settings|orders|payments … [--site <slug>] [--json]",
|
|
446
446
|
topics: ["content"],
|
|
447
447
|
examples: [
|
|
448
448
|
"frontpage shop items list",
|
|
449
|
-
"frontpage shop
|
|
449
|
+
"frontpage shop categories create hats --label Hats",
|
|
450
|
+
"frontpage shop items create camp-hat --title \"Camp hat\" --price-cents 4999 --checkout cart --categories hats --stock 20",
|
|
451
|
+
"frontpage shop items list --category hats",
|
|
450
452
|
"frontpage shop variants add camp-hat --id m --option Size=M --price-cents 4999 --stock 8",
|
|
451
453
|
"frontpage shop items stock camp-hat --variant m --add 5",
|
|
452
454
|
"frontpage shop items stock camp-hat --variant m --remove 5",
|
|
@@ -458,7 +460,8 @@ export const COMMANDS = [
|
|
|
458
460
|
"Integer cents only. $49.99 is 4999. Do not send 49.99 or a dollar string.",
|
|
459
461
|
"--add / --remove become signed delta. 5 adds 5. --remove 5 removes 5. Result copy is added 5 / removed 5 / set to 20 / stockNow.",
|
|
460
462
|
"Pass either --add, --remove, or --set. Never two together. --set unlimited returns counted stock to unlimited.",
|
|
461
|
-
"items: list|get|create|update|archive|activate [--off] | images --urls … | stock [--variant m] --add|--remove|--set",
|
|
463
|
+
"items: list|get|create|update|archive|activate [--off] | images --urls … | stock [--variant m] --add|--remove|--set. list --category hats. create/update --categories hats,summer",
|
|
464
|
+
"categories: list|create|rename|archive. Create the category first. Assigning an unknown slug fails.",
|
|
462
465
|
"variants: add|update|archive <itemId> --id m --price-cents … [--option Size=M] [--stock]",
|
|
463
466
|
"settings: get|set-fulfillment|set-currency|set-checkout-fee. Connect stays frontpage modules shop|payments connect.",
|
|
464
467
|
"orders / payments list|get read the same ledgers as frontpage inbox orders|payments",
|
|
@@ -722,7 +725,7 @@ export const TOPICS = {
|
|
|
722
725
|
frontpage inbox [leads|subscribers|orders|google_reviews|…] [--mark-read] [--csv]
|
|
723
726
|
frontpage people list|get|add|set|note|rm-note|follow-up|hide|unhide|tag|export
|
|
724
727
|
# People CRM guide: https://frontpage.host/developers/people
|
|
725
|
-
frontpage shop items|variants|settings|orders|payments
|
|
728
|
+
frontpage shop items|variants|categories|settings|orders|payments
|
|
726
729
|
# Store catalog: https://frontpage.host/developers/shop
|
|
727
730
|
# Integer cents only. $49.99 is 4999. stock --add/--remove are signed delta.
|
|
728
731
|
frontpage mail settings|email|template|series|send|sends|enrolments|suppress
|
package/llms.txt
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
- SEO get: frontpage seo get [/path|--path /path]; search path filter: [path|--path <path>]; open [/path|--path /path]
|
|
18
18
|
- Redirects: frontpage redirects list|set|rm — HTTP 301/308, instant, not a file; revert does not undo; do not fake with Astro.redirect / meta refresh
|
|
19
19
|
- People CRM: frontpage people list|get|add|set|note|rm-note|follow-up|hide|unhide|tag|export. Site-scoped person graph (email or phone). Inbox stays the raw ledger. Hide is not forget. List export is CSV. Unknown leftover flags fail closed. Guide: https://frontpage.host/developers/people
|
|
20
|
-
- Store catalog: frontpage shop items|variants|settings|orders|payments. Integer cents only ($49.99 is 4999). stock --add/--remove are signed delta (added 5 / removed 5 / set to 20 / stockNow). Connect stays frontpage modules shop|payments connect. Not Square ordering. Guide: https://frontpage.host/developers/shop
|
|
20
|
+
- Store catalog: frontpage shop items|variants|categories|settings|orders|payments. Integer cents only ($49.99 is 4999). stock --add/--remove are signed delta (added 5 / removed 5 / set to 20 / stockNow). Create a category before assigning it. Connect stays frontpage modules shop|payments connect. Not Square ordering. Guide: https://frontpage.host/developers/shop
|
|
21
21
|
- Analytics funnel: --steps JSON array or comma paths (/, /pricing); bad JSON → Invalid JSON for --steps
|
|
22
22
|
- Modules: unknown key errors list Known: …; mailing list module key is signups (not subscribe)
|
|
23
23
|
- Errors: --json API envelopes include requestId when the server returned one; local validation omits requestId/httpStatus; runs wait failed/canceled → ok:false + run.error (exit 2); deploy wait = agent idle + tip compile ready (fail-closed / compile timeout → exit 2); push --wait and publish --wait wait for GET /deploy ready
|