frontpage-host 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/AGENTS.md +8 -0
  2. package/PEOPLE.md +8 -4
  3. package/package.json +1 -1
package/AGENTS.md CHANGED
@@ -285,3 +285,11 @@ See [MAIL.md](./MAIL.md) for the complete save contract, reusable people picker
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
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.
288
+
289
+ ### People workspace navigation and selection
290
+
291
+ People CRM has People and Groups tabs. Group details has Group details, Stages and Rules tabs. Group-entry emails remain rules with the same IDs. Stage Manage rules supports creating, placing, or attaching email without changing execution when placement changes. New attachments save paused.
292
+
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
+
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.
package/PEOPLE.md CHANGED
@@ -72,11 +72,13 @@ frontpage people groups archive --id GROUP_ID --site YOUR_SITE --json
72
72
  frontpage people groups restore --id GROUP_ID --site YOUR_SITE --json
73
73
  ```
74
74
 
75
+ For a reviewed group edit, read `groups.list` and pass the saved `emailVersion` as `expectedGroup` through `--data` or `--file` with `groups.update`. The workspace does this automatically. A changed name, color, mode, conditions or archive state returns 409 before writing. Membership counts do not invalidate the version. Read the latest group and review the change before trying again; do not replace the version and silently overwrite another edit. The check is optional for existing API callers.
76
+
75
77
  ### Select people from a manual group
76
78
 
77
79
  The group header offers **Add people** for manual groups and **View matching people** for conditional groups. Membership selection includes visible phone-only contacts and people without marketing permission. Current members are marked **Already in this group** and cannot be selected.
78
80
 
79
- Use `groups.people` with `groupId`, optional `q`, `source`, `sort` (`newest`, `oldest`, `name`), `page`, `selectedOnly` and `selected` IDs. It returns 20 people per page, a full filtered `total`, the actual `page`, phone/email contact details and `member`. It rejects conditional or archived groups and never records consent.
81
+ Use `groups.people` with `groupId`, optional `q`, `source`, `sort` (`newest`, `oldest`, `name`), `page`, `selectedOnly`, `selected` IDs and `availability` (`all`, `available`, `member`; default `all`). Availability checks current group membership, not email permission, and filters the full directory before counting and paging. It returns 20 people per page, a full filtered `total`, the actual `page`, phone/email contact details and `member`. It rejects conditional or archived groups and never records consent.
80
82
 
81
83
  Use `membership.addMany` with `groupId` and 1 to 20 `personIds` per request. The UI can select up to 100 and submits batches of 20. Results include `added`, `alreadyMember`, `skipped`, `failed` and per-person `results` with `personId`, `status` and an optional message. Retry unconfirmed or failed IDs: current members are skipped without resetting their stage or repeating join events. Hidden people are skipped; a group that changed to conditional or archived cannot receive new additions through this operation. Successful additions save immediately and keep the normal entry rules. This does not grant email permission or change other groups.
82
84
 
@@ -470,6 +472,8 @@ Use a saved CSV import for a new historical cohort. Its list-wide permission cho
470
472
 
471
473
  CSV imports accept up to 5 MB and 10,000 contact rows. Quoted commas, quoted newlines, UTF-8 BOM, and CRLF are supported. Larger lists need separate files; the UI does not render an unbounded list of failures.
472
474
 
475
+ The UI offers only Add people groups as import destinations and sends `manualGroupsOnly:true`. CLI and agent callers can pass the same option to `import.start`. The saved job retains it: if a selected group changes to Match conditions before processing, affected rows report an error instead of gaining an include exception. Completed rows stay saved. Restore Add people mode and retry the saved job, or preview a new import without that group. Omit this option only when deliberately using the existing advanced conditional-group include contract. Existing accepted jobs and saved exceptions keep their policy.
476
+
473
477
  ### 1. Upload and map columns
474
478
 
475
479
  ```
@@ -625,10 +629,10 @@ The agent can create and edit saved templates and series with the existing Email
625
629
  | groups.list | archived? | List groups; archived:true includes archived groups. |
626
630
  | groups.get | id | One group with its stages. |
627
631
  | groups.create | label, color?, mode?, conditions? | Create a group. |
628
- | groups.update | id, changed fields | Edit a group without changing its ID. |
632
+ | groups.update | id, changed fields, expectedGroup? | Edit a group; compare its saved emailVersion to reject a stale form before writes. |
629
633
  | groups.archive / groups.restore | id | Archive or restore a group. Related rules remain paused on restore. |
630
634
  | groups.preview | id or conditions; personId? or cursor? | Check conditions without changing membership. |
631
- | groups.people | groupId; q?, source?, sort?, page?, selectedOnly?, selected? | Read the manual-group picker, including phone-only contacts and current membership. |
635
+ | groups.people | groupId; q?, source?, sort?, page?, selectedOnly?, selected?, availability? | Read the manual-group picker, including phone-only contacts and current membership. |
632
636
  | stages.create | groupId, label, color?, position?, terminal? | Create a stage in a saved group. |
633
637
  | stages.update | id, groupId, changed fields | Edit a stage. |
634
638
  | stages.reorder | groupId, stageIds | Save every active stage ID in order, once each. |
@@ -655,7 +659,7 @@ The agent can create and edit saved templates and series with the existing Email
655
659
  | person.permission | personId, allowed; backfill?, expectedEmail?, evidence?, requestKey?; or backfill batch with people (1–25) | Record a decision or repair reviewed missing permission without automation. Unsubscribe and suppression still win. |
656
660
  | audience.preview | audience | Preview matched and eligible People for a campaign. |
657
661
  | import.preview | csv, mapping?, headersOnly? | Validate a CSV and match existing contacts; sends nothing. |
658
- | import.start | csv, mapping?, groupIds?, requestKey | Start a saved import. |
662
+ | import.start | csv, mapping?, groupIds?, requestKey, emailPermission?, manualGroupsOnly? | Start a saved import with frozen permission and optional manual-group policy. |
659
663
  | import.get | id | Read the import cursor, outcomes, and errors. |
660
664
  | import.retry | id | Retry failed rows after correcting saved identity conflicts. |
661
665
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frontpage-host",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Frontpage CLI — manage your site from the terminal",
5
5
  "type": "module",
6
6
  "bin": {