@cavuno/board 4.26.0 → 4.28.0

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 (53) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/dist/{_spec-EgN7VmAI.d.mts → _spec-DQvmsp5o.d.mts} +589 -67
  3. package/dist/{_spec-EgN7VmAI.d.ts → _spec-DQvmsp5o.d.ts} +589 -67
  4. package/dist/bin.mjs +7989 -10
  5. package/dist/{blog-BIjFcNcm.d.ts → blog-CUkvhn3c.d.ts} +1 -1
  6. package/dist/{blog-T7gQ0ciz.d.mts → blog-CvuObn9O.d.mts} +1 -1
  7. package/dist/{board-CsEAgsKh.d.ts → board-CCG1pO6r.d.ts} +25 -4
  8. package/dist/{board-q0svBKW3.d.mts → board-D6xOidUX.d.mts} +25 -4
  9. package/dist/{breadcrumbs-CFcCjuG7.d.mts → breadcrumbs-BBvJ5gq-.d.mts} +2 -2
  10. package/dist/{breadcrumbs-xuDid8BS.d.ts → breadcrumbs-D2Cwrju4.d.ts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-DP2ZZZEO.mjs → chunk-EHSB2VAJ.mjs} +5 -0
  13. package/dist/doctor.js +7989 -10
  14. package/dist/doctor.mjs +7989 -10
  15. package/dist/filters.d.mts +19 -3
  16. package/dist/filters.d.ts +19 -3
  17. package/dist/filters.js +10 -1
  18. package/dist/filters.mjs +10 -1
  19. package/dist/format.d.mts +4 -4
  20. package/dist/format.d.ts +4 -4
  21. package/dist/index.d.mts +251 -14
  22. package/dist/index.d.ts +251 -14
  23. package/dist/index.js +218 -26
  24. package/dist/index.mjs +214 -27
  25. package/dist/{jobs-ub3gywNQ.d.ts → jobs-CEIuahbz.d.ts} +26 -2
  26. package/dist/{jobs-CfrxlDMU.d.mts → jobs-DjMcghv6.d.mts} +26 -2
  27. package/dist/{search-DKS7OIn2.d.mts → search-C0LiPXVb.d.mts} +1 -1
  28. package/dist/{search-Dx1TiAZk.d.ts → search-D-EjtZH3.d.ts} +1 -1
  29. package/dist/{seo-BbG2Ujyo.d.ts → seo-CjNGqZZH.d.ts} +1 -1
  30. package/dist/{seo-CI3wLKUW.d.mts → seo-DCQp8V1c.d.mts} +1 -1
  31. package/dist/seo-files.d.mts +2 -2
  32. package/dist/seo-files.d.ts +2 -2
  33. package/dist/seo.d.mts +6 -6
  34. package/dist/seo.d.ts +6 -6
  35. package/dist/server.d.mts +6 -6
  36. package/dist/server.d.ts +6 -6
  37. package/dist/server.mjs +1 -1
  38. package/dist/sitemap.d.mts +6 -6
  39. package/dist/sitemap.d.ts +6 -6
  40. package/dist/sitemap.mjs +1 -1
  41. package/dist/suggest.d.mts +2 -2
  42. package/dist/suggest.d.ts +2 -2
  43. package/package.json +2 -1
  44. package/skills/cavuno-board-account/SKILL.md +122 -1
  45. package/skills/cavuno-board-collections/SKILL.md +148 -0
  46. package/skills/cavuno-board-companies/SKILL.md +43 -1
  47. package/skills/cavuno-board-errors/SKILL.md +1 -1
  48. package/skills/cavuno-board-filters/SKILL.md +160 -1
  49. package/skills/cavuno-board-format/SKILL.md +52 -0
  50. package/skills/cavuno-board-paywall/SKILL.md +5 -2
  51. package/skills/cavuno-board-post-a-job/SKILL.md +88 -0
  52. package/skills/cavuno-board-salaries/SKILL.md +7 -0
  53. package/skills/manifest.json +11 -4
package/CHANGELOG.md CHANGED
@@ -3,6 +3,140 @@
3
3
  This changelog records changes that affect Board API compatibility, exported
4
4
  types, runtime behavior, or supported integration patterns.
5
5
 
6
+ ## 4.28.0 — 2026-09-25
7
+
8
+ - **Resolve global location selections.** `board.locations.search` finds places
9
+ beyond a board’s existing jobs. Pass the same session token to
10
+ `board.locations.resolve` when a suggestion is selected, then use its
11
+ canonical location ID when submitting an office. `LocationResolveInput`
12
+ describes the selection request.
13
+
14
+ - **Custom-field values on job cards.** Every `PublicJobCard` (jobs list,
15
+ search, similar, company jobs, embed, recommended and saved jobs) carries
16
+ `customFieldValues` for the job and `company.customFieldValues` for its
17
+ company, keyed by field key and `{}` when empty. Only `single_select`,
18
+ `multi_select`, `boolean` and `number` values are included; select values
19
+ are option keys. Text values stay on the full job and company, and private
20
+ company fields are never included. Job values are checked against the
21
+ board's current job custom-field definitions, so values of removed fields
22
+ or options are left out. A listing can now render custom-field badges
23
+ without fetching each job.
24
+ - **Filter jobs by company custom fields.** `board.jobs.search` accepts
25
+ `filters.companyCustomFields`, matched against the public profile fields
26
+ of each job's company, with the same clauses as `filters.customFields`:
27
+ a field `key` and its accepted `values` (option keys, booleans or
28
+ numbers), AND across clauses and OR within one, up to 10 of each. Keys and
29
+ options come from `board.profileFields.retrieve('company')`. An unknown or
30
+ private key, or an undefined option key, returns `400 invalid_filter`. Job
31
+ and company keys never collide, so both lists may use the same key. When a
32
+ company's values change, its jobs follow in search within seconds. If the
33
+ filter cannot be served yet on a board, the search returns `503
34
+ search_filter_unavailable` with `details.filter: "companyCustomFields"`;
35
+ the same search without it works.
36
+ - `JobsSearchBody` is now the spec's search body type as generated; its
37
+ `customFields` and `companyCustomFields` clauses stay identical to
38
+ `CustomFieldFilter`.
39
+
40
+ ## 4.27.0 — 2026-09-23
41
+
42
+ - **Collections and profile fields.** Company and talent responses carry
43
+ public `customFieldValues` and resolved collection selections in
44
+ `objectReferences`: title, description, logo, slug, the entry's public
45
+ fields and the profile's own details. `board.profileFields.retrieve` and
46
+ `board.profileFields.choices` list the public definitions and active
47
+ choices, and the signed-in owner methods on `board.me` read and update
48
+ editable fields and selections.
49
+ - **Collection fields on jobs.** Jobs return `resolvedCollectionFields`, with
50
+ each selected entry's `title` and `description` already resolved for that
51
+ job. `board.jobs.collectionChoices` lists a field's active choices. When a
52
+ field sets `allowOverrides`, operator and employer job writes accept
53
+ `collectionOverrides` to give a selected entry its own plain-text title and
54
+ description; on `PATCH`, an omitted list keeps the stored wording and `[]`
55
+ clears it.
56
+ - **Form layouts.** The board context's `forms` lists the job, company and
57
+ talent form fields in the operator's order, with visibility and required
58
+ flags, so a frontend can render forms the way the board is configured.
59
+ Operators read and replace layouts with `GET` and `PUT
60
+ /settings/form-layouts`.
61
+ - **Deprecated:** writing `logoUrl` on collection records. Mark an image
62
+ field as the collection's logo with `logoFieldKey` instead. Resolved
63
+ selections, job entries and choices still return `logoUrl`.
64
+
65
+ - **Custom fields on the employer job surface.** `POST` and `PATCH
66
+ /boards/{identifier}/me/companies/{slug}/jobs` accept `customFieldValues`,
67
+ the board-defined custom fields keyed by field `key`, with the same
68
+ additive write semantics as the operator job endpoints (`null` / `""` /
69
+ `[]` clear a key, omitted keys are preserved, unknown keys are ignored).
70
+ Every employer job read (`EmployerJobSummary`, `EmployerJob`) now carries
71
+ `customFieldValues` (`{}` when empty) so an edit form can prefill them. The
72
+ definitions to render — label, type, option keys, required — are the
73
+ board context's `customFields.job`. Writes are validated against the
74
+ board's Job form configuration: a required custom field left empty, a
75
+ wrong-typed value or an undefined option is rejected with `400
76
+ jobs_constraint_violation`. On employer create, custom fields are checked
77
+ only when the request carries `customFieldValues` (an empty object counts),
78
+ so a client that does not yet send them is not rejected for a custom field
79
+ it cannot supply. Employer creates are now held to the board's built-in Job
80
+ form rules (required salary or seniority, allowed options, allowed
81
+ countries) on the server as well, with the same error.
82
+ - **Job updates are checked against the board's Job form rules.** `PATCH
83
+ /jobs/{id}` and the employer job `PATCH` check each field group the request
84
+ sends (salary, seniority, employment type, work arrangement, office
85
+ locations, remote eligibility, custom fields) against the updated job, so
86
+ clearing a required salary or moving a job onto a work arrangement the board
87
+ does not allow is refused with `400 jobs_constraint_violation`. Groups the
88
+ request omits are not re-checked, so a job that predates a rule stays
89
+ editable.
90
+ - **The default work arrangement is checked too.** A job saved with an
91
+ office location but no `remoteOption` is stored as `on_site`. Creates and
92
+ updates now check that saved value against the board's allowed work
93
+ arrangements, so on a board that does not allow `on_site` such a write is
94
+ refused with `400 jobs_constraint_violation` instead of saving an on-site
95
+ job. This applies to any edit of an existing job that has an office
96
+ location but no work arrangement, even one that changes only other fields:
97
+ send an allowed `remoteOption` with it.
98
+ - **Employer checkout can return `pending_approval`.** When a board requires
99
+ approval of free jobs, a free employer post (and an invoice post that
100
+ publishes on issue) is held as a draft for the operator to publish instead
101
+ of going live, and `POST
102
+ /boards/{identifier}/me/companies/{slug}/jobs/{id}/checkout` answers
103
+ `status: "pending_approval"` with the `jobId`. Treat it as "submitted, not
104
+ live": do not link the job as published. Bundle, subscription and
105
+ member-credit posts still publish immediately (`status: "published"`), as
106
+ does a free post on a board without approval. The board operator now also
107
+ receives the job-submission notification for employer posts, matching the
108
+ public posting form.
109
+ - **`jobs_constraint_violation` errors carry structured details.**
110
+ `error.details.violations` lists each broken rule as `{ code, path, params }`
111
+ (for example `{ code: "custom_field_required", path: ["customFieldValues",
112
+ "team"] }`), so a client can show its own localized message.
113
+
114
+ - **`cavuno-board doctor`**: the new `read.attribution` check uses the board's
115
+ `showCavunoBranding` setting to require a real Cavuno backlink when branding
116
+ is enabled. Marker attributes, scripts, templates and explicitly hidden
117
+ markup do not count. Branding disabled permits the link to be absent;
118
+ unreadable branding settings fail verification. This HTML diagnostic does
119
+ not evaluate external stylesheets or client-side changes.
120
+
121
+ - **Blocking a company can also remove it from the board.** `POST
122
+ /companies/{id}/block` accepts an optional `remove` flag. Left off, blocking
123
+ behaves as before: the public profile stays up and currently published jobs
124
+ are archived. Set to `true`, the company's jobs and its profile are taken off
125
+ the board — its directory, sitemap, and search entries go with them — while
126
+ the company stays on the blocklist, so automated sourcing cannot bring it
127
+ back. Sending `remove: true` for a company that is already blocked upgrades it
128
+ to that outcome.
129
+ - **New fields on the block result**: `removed` reports the resulting state and
130
+ `removal_scheduled` reports whether this call started the removal.
131
+ - **New field on the unblock result**: `was_removed` reports whether the company
132
+ had also been taken off the board. Unblocking such a company brings it back as
133
+ an empty profile; its jobs are not restored.
134
+ - **Deleting a blocked company no longer unblocks it.** `DELETE
135
+ /companies/{id}` on a company that is on the blocklist keeps the block and
136
+ removes the company from the board instead of purging it. To purge one
137
+ completely, unblock it first and then delete it. Deleting a company that is
138
+ not blocked is unchanged, and the response is still `204`.
139
+
6
140
  ## 4.26.0 — 2026-09-07
7
141
 
8
142
  - **`board.me.talentAccess.claim()`** claims a public free `talent_access`