frontpage-host 0.3.3 → 0.3.5
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 +3 -1
- package/MAIL.md +2 -2
- package/PEOPLE.md +15 -4
- package/README.md +16 -2
- package/dist/commands/routines.js +7 -1
- package/dist/commands/shop.js +17 -1
- package/dist/registry.js +5 -2
- package/llms.txt +3 -1
- package/package.json +2 -2
package/AGENTS.md
CHANGED
|
@@ -284,7 +284,7 @@ See [MAIL.md](./MAIL.md) for the complete save contract, reusable people picker
|
|
|
284
284
|
|
|
285
285
|
Rule placement: read a rule revision, then use `people workspace rules.place` with `id`, `owner` and `expectedRevision`. This only organizes the rule; it does not change its trigger or execution. New UI rules/attachments save paused. Generic attachment calls still need explicit `enabled:false` for paused creation. Saved optional conditions and exact duration minutes remain supported through CLI and agent calls.
|
|
286
286
|
|
|
287
|
-
Group details Email and stage email tasks use the existing `frontpage mail save` / `save_mail_editor` completion. `attachment` checks saved group/stage emailVersion, creates paused rules, supports shared-template edits with rule revisions, and recovers identical retries. Read MAIL.md, Group and stage email tasks. Template get includes ruleUsage; deletion protects paused and active rule dependencies. Creating or saving never activates, enrolls or sends.
|
|
287
|
+
The workspace validates and saves unfinished group settings before opening email setup. CLI and agent callers use `groups.create` / `groups.update` with a stable `requestKey` before attaching; `groups.count` reads the full visible match count. Group details Email and stage email tasks use the existing `frontpage mail save` / `save_mail_editor` completion. `attachment` checks saved group/stage emailVersion, creates paused rules, supports shared-template edits with rule revisions, and recovers identical retries. Read MAIL.md, Group and stage email tasks. Template get includes ruleUsage; deletion protects paused and active rule dependencies. Creating or saving never activates, enrolls or sends.
|
|
288
288
|
|
|
289
289
|
### People workspace navigation and selection
|
|
290
290
|
|
|
@@ -293,3 +293,5 @@ People CRM has People and Groups tabs. Group details has Group details, Stages a
|
|
|
293
293
|
For a manual group, `groups.people` accepts `availability: "all" | "available" | "member"` through `--data`. The server applies saved membership before counts and paging. This filter never grants or requires email permission. In the UI, conditional groups use condition preview instead of manual additions. Existing explicit owner-exception operations stay available through the advanced service.
|
|
294
294
|
|
|
295
295
|
Before a reviewed `groups.update`, read `groups.list` and pass its `emailVersion` as optional `expectedGroup`. A 409 means the saved settings changed; read and review again before writing. Membership counts do not change this version. For the UI's Add people CSV behavior, pass `manualGroupsOnly:true` to `import.start`. The job keeps this choice and reports rows if a destination becomes conditional before processing; it never creates an include exception from that request. Retry with the same accepted key/payload, and inspect the saved job. Existing explicit advanced imports keep their prior contract when the option is omitted.
|
|
296
|
+
|
|
297
|
+
Complete Store edits: use existing items update --file with changed fields and variantUpdates. stock requires expectedStock from a fresh items get. One transaction saves all changes or none. On 409 review current stock; never silently substitute it. firstVariant plus optionNames enables versions. Keep explicit stock/variant commands for single operations. Routines add accepts --request-id UUID; reuse that ID and exact schedule after a lost response. Ordinary form edits live only in the active task; Cancel keeps input, Discard loses unfinished input. Submitted payments, imports, builds, and API-key status are separate operations.
|
package/MAIL.md
CHANGED
|
@@ -35,7 +35,7 @@ The workspace's Back button returns to the source series. If template edits are
|
|
|
35
35
|
|
|
36
36
|
Group details has an Email section. It shows ordinary rules whose actual trigger is someone joining that group and whose actions send a template or start a series. It uses the same records as Rules. Saved conditions and extra actions stay visible. Moving a rule's placement does not change where it runs.
|
|
37
37
|
|
|
38
|
-
Use the shared Add email control to select a saved template, create a template, or use a saved series. Stage Manage rules uses the same template task. Save the group
|
|
38
|
+
Use the shared Add email control to select a saved template, create a template, or use a saved series. Stage Manage rules uses the same template task. With unsaved group edits, the workspace labels the action **Save group & add email**. Choosing an action validates and saves the group before opening the picker or editor. Missing conditions stay on the group page with an error. A failed group save retains the inputs and does not navigate. Canceling email setup leaves the group saved without a new attachment. Creating or attaching saves one **paused** rule with no extra conditions. A notice beside attached paused emails says to click Activate. Nothing activates, enrolls or sends until the owner explicitly activates the rule for future events. The older `attachments.create` operation keeps its documented defaults; the new completion below always creates paused rules.
|
|
39
39
|
|
|
40
40
|
The existing command and agent operation handle the complete save:
|
|
41
41
|
|
|
@@ -67,7 +67,7 @@ The response returns `complete:true`, `document` and `rule`. Repeating the same
|
|
|
67
67
|
|
|
68
68
|
To attach an existing source, omit `document`. Add either `attachment.templateId` or `attachment.seriesId` and its `expectedSourceUpdatedAt` from a fresh template/series get. A series needs at least one saved step. The result includes the source and paused rule. To edit shared content from an existing entry rule, supply the existing document with `expectedUpdatedAt`, plus `attachment.ruleId` and `expectedRevision` from `rules.get`. This saves the content while leaving the rule's conditions, actions, version, enabled state, activation time and history unchanged. Stale group, stage, source or rule checks return a conflict; keep the draft and review the saved records before making a revised request.
|
|
69
69
|
|
|
70
|
-
The workspace uses the existing template editor and returns to the source group or Stages after Save &
|
|
70
|
+
The workspace uses the existing template editor and returns to the source group or Stages after Save email & attach to group. Unfinished group, rule, stage, picker and template edits stay in memory only. Leaving uses the shared unsaved-changes modal: Cancel keeps editing; Discard and continue loses those edits and leaves without a network request. Refresh or closing the tab discards unfinished work without a browser prompt. Clean navigation and opening saved records show no warning. There is no editor backup or Recover save action. A template task keeps its source context in memory during the active flow; a refreshed task must be reopened from its source. A self-test sends only test content and does not complete a pending group task. Retry a submitted save with the exact original key and payload after a lost response; this does not require an editor backup.
|
|
71
71
|
|
|
72
72
|
Templates remain shared. Changes affect future uses; already queued messages keep their content snapshots. Template get exposes `ruleUsage`; the UI also shows rule usage beside existing dependencies. Deleting a template used by a live rule, including a paused rule, fails with a conflict naming the rule. Remove the template action or archive the rule first. Series, form and receipt dependencies still apply. Archiving a rule keeps its run history and saved actions. Never activate, enroll or send without the user's instruction.
|
|
73
73
|
|
package/PEOPLE.md
CHANGED
|
@@ -91,6 +91,16 @@ frontpage people workspace membership.addMany --file selected-people.json --site
|
|
|
91
91
|
|
|
92
92
|
`groups.preview` accepts `limit` (1 to 200, default 200) and `cursor`, and returns `checked`, `unknown`, `matches` and `nextCursor`. A page can have no matches while more people remain to check. Counts describe the people checked so far, not saved membership. Match rows include phone as well as email. Pass `expectedConditions` with a saved group ID to reject a changed condition/mode between pages. Explicit `conditions` previews edits without saving them. Neither preview changes membership or sends emails.
|
|
93
93
|
|
|
94
|
+
`groups.count` accepts a saved group `id` or explicit `conditions` and returns `matched`, `checked`, `unknown`, `complete` and `sendsNothing`. It counts all visible people in one consistent read; it does not return a sampled page. `unknown > 0` means the count is incomplete, never that those people do not match. It changes no memberships and sends no emails.
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
frontpage people groups count --file repeat-buyers.json --site YOUR_SITE --json
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Both `groups.create` and `groups.update` accept `requestKey` (1–120 characters). Retry an uncertain save with exactly the same key and payload to receive the original saved group without another write. Changing the payload with that key returns a conflict. Keep `expectedGroup` unchanged on a retry; a confirmed new edit uses a new key.
|
|
101
|
+
|
|
102
|
+
A conditional group must have at least one complete condition. In the workspace, Save group and Save group & add email use the same validation. An incomplete group stays on its page with a field error. A valid save-and-email action saves the group before opening the email editor or picker. Saving the new email attaches its paused rule and returns to the saved group. Canceling a new email leaves the saved group without that attachment. Membership never grants email permission.
|
|
103
|
+
|
|
94
104
|
When changing to **Match conditions**, membership will update to match the conditions, and some people may join or leave. When changing to **Add people**, current members stay and the group stops updating from conditions. Existing exceptions, saved pauses, stages and history stay saved. The UI shows this effect before Save and does not add a confirmation step.
|
|
95
105
|
|
|
96
106
|
### Keep a group matched to conditions
|
|
@@ -628,10 +638,11 @@ The agent can create and edit saved templates and series with the existing Email
|
|
|
628
638
|
| sources | — | Supported events and current form/product IDs. |
|
|
629
639
|
| groups.list | archived? | List groups; archived:true includes archived groups. |
|
|
630
640
|
| groups.get | id | One group with its stages. |
|
|
631
|
-
| groups.create | label, color?, mode?, conditions?
|
|
632
|
-
| groups.update | id, changed fields, expectedGroup?
|
|
641
|
+
| groups.create | label, color?, mode?, conditions?, requestKey? | Create a group. |
|
|
642
|
+
| groups.update | id, changed fields, expectedGroup?, requestKey? | Edit a group; compare its saved emailVersion to reject a stale form before writes. |
|
|
633
643
|
| groups.archive / groups.restore | id | Archive or restore a group. Related rules remain paused on restore. |
|
|
634
644
|
| groups.preview | id or conditions; personId? or cursor? | Check conditions without changing membership. |
|
|
645
|
+
| groups.count | id or conditions | Count all visible people matching conditions; report unknown facts separately. |
|
|
635
646
|
| groups.people | groupId; q?, source?, sort?, page?, selectedOnly?, selected?, availability? | Read the manual-group picker, including phone-only contacts and current membership. |
|
|
636
647
|
| stages.create | groupId, label, color?, position?, terminal? | Create a stage in a saved group. |
|
|
637
648
|
| stages.update | id, groupId, changed fields | Edit a stage. |
|
|
@@ -698,7 +709,7 @@ People supplies first-name and unsubscribe values. If content uses order, bookin
|
|
|
698
709
|
|
|
699
710
|
Group details has an Email section. It shows ordinary rules whose actual trigger is someone joining that group and whose actions send a template or start a series. It uses the same records as Rules. Saved conditions and extra actions stay visible. Moving a rule's placement does not change where it runs.
|
|
700
711
|
|
|
701
|
-
Use the shared Add email control to select a saved template, create a template, or use a saved series. Stage Manage rules uses the same template task. Save the group
|
|
712
|
+
Use the shared Add email control to select a saved template, create a template, or use a saved series. Stage Manage rules uses the same template task. With unsaved group edits, the workspace labels the action **Save group & add email**. Choosing an action validates and saves the group before opening the picker or editor. Missing conditions stay on the group page with an error. A failed group save retains the inputs and does not navigate. Canceling email setup leaves the group saved without a new attachment. Creating or attaching saves one **paused** rule with no extra conditions. A notice beside attached paused emails says to click Activate. Nothing activates, enrolls or sends until the owner explicitly activates the rule for future events. The older `attachments.create` operation keeps its documented defaults; the new completion below always creates paused rules.
|
|
702
713
|
|
|
703
714
|
The existing command and agent operation handle the complete save:
|
|
704
715
|
|
|
@@ -730,7 +741,7 @@ The response returns `complete:true`, `document` and `rule`. Repeating the same
|
|
|
730
741
|
|
|
731
742
|
To attach an existing source, omit `document`. Add either `attachment.templateId` or `attachment.seriesId` and its `expectedSourceUpdatedAt` from a fresh template/series get. A series needs at least one saved step. The result includes the source and paused rule. To edit shared content from an existing entry rule, supply the existing document with `expectedUpdatedAt`, plus `attachment.ruleId` and `expectedRevision` from `rules.get`. This saves the content while leaving the rule's conditions, actions, version, enabled state, activation time and history unchanged. Stale group, stage, source or rule checks return a conflict; keep the draft and review the saved records before making a revised request.
|
|
732
743
|
|
|
733
|
-
The workspace uses the existing template editor and returns to the source group or Stages after Save &
|
|
744
|
+
The workspace uses the existing template editor and returns to the source group or Stages after Save email & attach to group. Unfinished group, rule, stage, picker and template edits stay in memory only. Leaving uses the shared unsaved-changes modal: Cancel keeps editing; Discard and continue loses those edits and leaves without a network request. Refresh or closing the tab discards unfinished work without a browser prompt. Clean navigation and opening saved records show no warning. There is no editor backup or Recover save action. A template task keeps its source context in memory during the active flow; a refreshed task must be reopened from its source. A self-test sends only test content and does not complete a pending group task. Retry a submitted save with the exact original key and payload after a lost response; this does not require an editor backup.
|
|
734
745
|
|
|
735
746
|
Templates remain shared. Changes affect future uses; already queued messages keep their content snapshots. Template get exposes `ruleUsage`; the UI also shows rule usage beside existing dependencies. Deleting a template used by a live rule, including a paused rule, fails with a conflict naming the rule. Remove the template action or archive the rule first. Series, form and receipt dependencies still apply. Archiving a rule keeps its run history and saved actions. Never activate, enroll or send without the user's instruction.
|
|
736
747
|
|
package/README.md
CHANGED
|
@@ -81,7 +81,7 @@ frontpage store items get camp-hat --site my-site --json
|
|
|
81
81
|
|
|
82
82
|
### Store inventory and product options
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
`items update --file` accepts product changes; explicit flags override file values.
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
87
|
frontpage store variants update camp-hat --id default --stock unlimited --site my-site
|
|
@@ -95,4 +95,18 @@ A whole stock count of `0` means sold out; `unlimited` sends JSON null. Omit sto
|
|
|
95
95
|
|
|
96
96
|
See [MAIL.md](./MAIL.md) for the complete save contract, reusable people picker directory, saved campaign recipients, Off-series enrollment and resume timing, all sender settings/null resets, suppression rules, Sent queries and details, and retry-safe examples. `frontpage mail save --file save.json` saves template and pending series together; it never sends. `frontpage mail people` reads the same site-scoped directory as the workspace. Use `frontpage help mail --json` for current commands and flags. No new CLI binary, API namespace or migration command is required. Hosted guides and article help must be updated through the Frontpage CLI.
|
|
97
97
|
|
|
98
|
-
Group details Email and stage email tasks use the existing `frontpage mail save` / `save_mail_editor` completion. `attachment` checks saved group/stage emailVersion, creates paused rules, supports shared-template edits with rule revisions, and recovers identical retries. Read MAIL.md, Group and stage email tasks. Template get includes ruleUsage; deletion protects paused and active rule dependencies. Creating or saving never activates, enrolls or sends.
|
|
98
|
+
The workspace validates and saves unfinished group settings before opening email setup. CLI and agent callers use `groups.create` / `groups.update` with a stable `requestKey` before attaching; `groups.count` reads the full visible match count. Group details Email and stage email tasks use the existing `frontpage mail save` / `save_mail_editor` completion. `attachment` checks saved group/stage emailVersion, creates paused rules, supports shared-template edits with rule revisions, and recovers identical retries. Read MAIL.md, Group and stage email tasks. Template get includes ruleUsage; deletion protects paused and active rule dependencies. Creating or saving never activates, enrolls or sends.
|
|
99
|
+
|
|
100
|
+
### Complete product edits
|
|
101
|
+
|
|
102
|
+
`frontpage store items update ITEM_ID --file edit.json` uses the existing `/shop/items/ITEM_ID` PATCH. Send only changed fields. Product details and `variantUpdates` save in one transaction: all changes save or none do. Ordinary fields use the last successful save. Unchanged fields stay untouched.
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{"title":"Camp hat","variantUpdates":[{"variantId":"default","priceCents":1300,"stock":3,"expectedStock":5}]}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Read `items get` first. Include `expectedStock` only when changing stock; copy the current count or null for unlimited. If stock changed before Save, the whole edit fails with 409 and nothing saves. Read the product and review that stock change before retrying. Do not silently replace the expected count. Omitted stock stays untouched. `discountPriceCents:null` clears a sale. Prices use integer cents.
|
|
109
|
+
|
|
110
|
+
To turn versions on in the same edit, send `optionNames` and `firstVariant` using the normal variant fields. Do not combine `firstVariant` with `variantUpdates`. To turn versions off, send `optionNames:[]`; optional changes then address the `default` variant. Existing stock and variant commands remain available for explicit individual operations. IDs, order history, site/role/plan gates, and provider ownership stay unchanged. Browser forms use the same service. A successful save returns the saved product; a later list refresh cannot undo it.
|
|
111
|
+
|
|
112
|
+
An explicit stock target already equal to the current count is a no-op. Repeating that same target after a lost response does not fail merely because the earlier save applied it. A different current count still requires review; never automatically replace expectedStock.
|
|
@@ -99,7 +99,13 @@ export async function runRoutines(args) {
|
|
|
99
99
|
}
|
|
100
100
|
if (sub === "add") {
|
|
101
101
|
const work = rest.slice(1);
|
|
102
|
-
const
|
|
102
|
+
const requestId = takeFlag(work, "--request-id");
|
|
103
|
+
if (requestId && !ID_RE.test(requestId))
|
|
104
|
+
throw new CliHttpError("request-id must be a UUID.", EXIT_USAGE, 0, "bad_request");
|
|
105
|
+
const body = {
|
|
106
|
+
...scheduleBody(work, true),
|
|
107
|
+
...(requestId ? { requestId } : {}),
|
|
108
|
+
};
|
|
103
109
|
assertNoUnknownFlags(work, "routines");
|
|
104
110
|
const data = await v1Post(base, body);
|
|
105
111
|
if (isJson())
|
package/dist/commands/shop.js
CHANGED
|
@@ -287,7 +287,23 @@ export async function runShop(args) {
|
|
|
287
287
|
assertNoUnknownFlags(work, "store");
|
|
288
288
|
const body = file ? await readJsonFile(file) : {};
|
|
289
289
|
if (file) {
|
|
290
|
-
const allowed = new Set([
|
|
290
|
+
const allowed = new Set([
|
|
291
|
+
"title",
|
|
292
|
+
"description",
|
|
293
|
+
"images",
|
|
294
|
+
"checkout",
|
|
295
|
+
"amount",
|
|
296
|
+
"minCents",
|
|
297
|
+
"requiresShipping",
|
|
298
|
+
"extraShippingCents",
|
|
299
|
+
"active",
|
|
300
|
+
"optionNames",
|
|
301
|
+
"categories",
|
|
302
|
+
"categorySlugs",
|
|
303
|
+
"customizations",
|
|
304
|
+
"variantUpdates",
|
|
305
|
+
"firstVariant",
|
|
306
|
+
]);
|
|
291
307
|
const unknown = Object.keys(body).filter(key => !allowed.has(key));
|
|
292
308
|
if (unknown.length)
|
|
293
309
|
throw new CliHttpError(`Unsupported items update file field: ${unknown.join(", ")}. Use variant commands for SKU changes.`, EXIT_USAGE, 0, "bad_request");
|
package/dist/registry.js
CHANGED
|
@@ -456,6 +456,7 @@ export const COMMANDS = [
|
|
|
456
456
|
],
|
|
457
457
|
flags: [
|
|
458
458
|
"add requires --name, --prompt, --cadence hourly|daily|weekly|monthly, and --timezone (IANA, such as America/Chicago)",
|
|
459
|
+
"routines add --request-id UUID may identify a create attempt. Reuse it with the exact schedule after a lost response; a repeat returns the saved routine without creating another.",
|
|
459
460
|
"--hours accepts 8, 8am, 12pm, 4pm. Several hours: 8am,12pm,4pm stores [8, 12, 16]",
|
|
460
461
|
"--weekdays accepts tue,thu,fri or 2,4,5. Sunday is 0. Weekly only",
|
|
461
462
|
"--month-days accepts 1,15. Days are 1 through 28. Monthly only",
|
|
@@ -473,6 +474,7 @@ export const COMMANDS = [
|
|
|
473
474
|
examples: [
|
|
474
475
|
"frontpage people overview --json",
|
|
475
476
|
"frontpage people groups create --label Leads",
|
|
477
|
+
"frontpage people groups count --file conditions.json --json",
|
|
476
478
|
"frontpage people stages create --group GROUP_ID --label New --position 0",
|
|
477
479
|
"frontpage people membership add --person PERSON_ID --group GROUP_ID",
|
|
478
480
|
"frontpage people rules create --file rule.json",
|
|
@@ -487,13 +489,13 @@ export const COMMANDS = [
|
|
|
487
489
|
"frontpage people export",
|
|
488
490
|
],
|
|
489
491
|
flags: [
|
|
490
|
-
"Workspace: groups list|get|create|update|archive|restore|preview; stages create|update|reorder|archive|restore; membership get|add|remove|move|stage|advance|override|hold; rules list|get|create|update|enable|pause|archive|validate|preview|runs|retry; attachments create; import preview|start|get|retry; person permission; audience preview; overview; sources",
|
|
492
|
+
"Workspace: groups list|get|people|create|update|archive|restore|preview|count; stages create|update|reorder|archive|restore; membership get|add|addMany|remove|move|stage|advance|override|hold; rules list|get|create|update|place|enable|pause|archive|validate|preview|runs|retry; attachments create; import preview|start|get|retry; person permission|lookup|activity|update; audience preview; overview; sources. Use workspace notes.add|template.campaign|series.preview|series.enrol for the remaining shared operations.",
|
|
493
|
+
"groups count checks all visible people without changing membership. groups create/update accept --request-key for exact retries and expectedGroup through JSON for stale-save checks. Keep the original key and payload after an uncertain save.",
|
|
491
494
|
"All workspace operations accept --file JSON or --data JSON. Named flags: --id --label --name --group --stage --person --from-group --mode --color --position --terminal --enabled --hold --allowed --archived --reset --override include|exclude|auto --email-kind template|series --email-id --rule --run --cursor --limit --request-key. Boolean flags take true|false. Complex conditions/actions/mappings use JSON.",
|
|
492
495
|
"CSV: --csv PATH plus --file mapping.json. New contacts default to allowed; JSON emailPermission can select unknown or not_allowed. Row values override the list choice; saved refusals, unsubscribes and suppressions remain protected. import start requires a stable --request-key. Retry the same import with the same key and contents.",
|
|
493
496
|
"list/export: --group GROUP_ID --stage STAGE_ID. See package PEOPLE.md for full examples and every JSON shape.",
|
|
494
497
|
"list: --q --group --stage --source --form-slug --follow-up due|upcoming|none --hidden --sort --last-seen-days --limit --cursor",
|
|
495
498
|
"add requires --email and/or --phone (never name alone). New contacts default to owner-asserted email permission; --email-permission allowed|unknown|not_allowed changes this choice. Existing default decisions stay saved; withdrawals/restrictions cannot be overridden by add.",
|
|
496
|
-
"tag: --add <label> | --remove <slug>",
|
|
497
499
|
"export writes UTF-8 CSV (same filters as list). Optional --out <file>",
|
|
498
500
|
"Hide is not forget. Unique email/phone stay; later ingest un-hides",
|
|
499
501
|
"Unknown leftover flags fail closed (exit 2)",
|
|
@@ -518,6 +520,7 @@ export const COMMANDS = [
|
|
|
518
520
|
"variants update <itemId> --id <variantId> --clear-discount ends a sale and preserves the regular price. --discount-cents sets a sale; omit both on update to preserve it. The flags cannot be combined. 0 means free, not removal. Verify with items get. Prices update live.",
|
|
519
521
|
"Descriptions use a small markdown subset. Bind data-fp-store-bind=description for the full product story; do not bake titles, prices or images into the page. Store is cart-only; use Payments for explicit Pay now.",
|
|
520
522
|
"items stock uses --add/--remove as a signed delta, or --set/--unlimited. Never combine these verbs. Product pages use data-fp-store-product and the platform cart templates. Store prices read the shared currency owned by Payments.",
|
|
523
|
+
"items update --file accepts variantUpdates:[{variantId,priceCents?,discountPriceCents?,options?,stock?,expectedStock?}] and firstVariant with optionNames to enable versions. Send only changed fields. Explicit stock changes require expectedStock from items get; a conflict saves nothing. Complete edits commit together. Existing single-variant and stock commands stay available.",
|
|
521
524
|
"variants update --stock unlimited or items stock --set unlimited restores unlimited stock; 0 means sold out; omit stock on update to preserve it. items update --file supports optionNames: same-length rename or [] to return to one SKU, preserving the first live variant price/sale/stock. Read items get before and after.",
|
|
522
525
|
"variants add|update|archive|restore; categories list|create|rename|archive. Create categories before assigning their slugs.",
|
|
523
526
|
"settings get|set-fulfillment|set-checkout-fee|set-receipt|availability get|on|off. Fee mode flat uses --cents; percent uses --bps (250 is 2.5%). Receipt takes --template <id> or --stock. Availability requires admin and --yes in scripts.",
|
package/llms.txt
CHANGED
|
@@ -54,4 +54,6 @@ Customer Inbox: Frontpage website chat uses one settings toggle, no website edit
|
|
|
54
54
|
|
|
55
55
|
See [MAIL.md](./MAIL.md) for the complete save contract, reusable people picker directory, saved campaign recipients, Off-series enrollment and resume timing, all sender settings/null resets, suppression rules, Sent queries and details, and retry-safe examples. `frontpage mail save --file save.json` saves template and pending series together; it never sends. `frontpage mail people` reads the same site-scoped directory as the workspace. Use `frontpage help mail --json` for current commands and flags. No new CLI binary, API namespace or migration command is required. Hosted guides and article help must be updated through the Frontpage CLI.
|
|
56
56
|
|
|
57
|
-
Group details Email and stage email tasks use the existing `frontpage mail save` / `save_mail_editor` completion. `attachment` checks saved group/stage emailVersion, creates paused rules, supports shared-template edits with rule revisions, and recovers identical retries. Read MAIL.md, Group and stage email tasks. Template get includes ruleUsage; deletion protects paused and active rule dependencies. Creating or saving never activates, enrolls or sends.
|
|
57
|
+
The workspace validates and saves unfinished group settings before opening email setup. CLI and agent callers use `groups.create` / `groups.update` with a stable `requestKey` before attaching; `groups.count` reads the full visible match count. Group details Email and stage email tasks use the existing `frontpage mail save` / `save_mail_editor` completion. `attachment` checks saved group/stage emailVersion, creates paused rules, supports shared-template edits with rule revisions, and recovers identical retries. Read MAIL.md, Group and stage email tasks. Template get includes ruleUsage; deletion protects paused and active rule dependencies. Creating or saving never activates, enrolls or sends.
|
|
58
|
+
|
|
59
|
+
Complete Store edits: use existing items update --file with changed fields and variantUpdates. stock requires expectedStock from a fresh items get. One transaction saves all changes or none. On 409 review current stock; never silently substitute it. firstVariant plus optionNames enables versions. Keep explicit stock/variant commands for single operations. Routines add accepts --request-id UUID; reuse that ID and exact schedule after a lost response. Ordinary form edits live only in the active task; Cancel keeps input, Discard loses unfinished input. Submitted payments, imports, builds, and API-key status are separate operations.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "frontpage-host",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Frontpage CLI
|
|
3
|
+
"version": "0.3.5",
|
|
4
|
+
"description": "Frontpage CLI \u2014 manage your site from the terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"frontpage": "dist/bin.js"
|