@cavuno/board 4.42.0 → 4.45.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 (49) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/{_spec-B2aizgxr.d.mts → _spec-CdNZDaaR.d.mts} +39 -0
  3. package/dist/{_spec-B2aizgxr.d.ts → _spec-CdNZDaaR.d.ts} +39 -0
  4. package/dist/bin.mjs +570 -10
  5. package/dist/{blog-BkACbXY0.d.ts → blog-ZvLJ6w1Q.d.ts} +1 -1
  6. package/dist/{blog-CYHSnNTZ.d.mts → blog-uV51b4Cg.d.mts} +1 -1
  7. package/dist/{board-DWeT9Jbl.d.ts → board-3JU14eF3.d.ts} +2 -2
  8. package/dist/{board-DK4HmSty.d.mts → board-CJw-MJpf.d.mts} +2 -2
  9. package/dist/{breadcrumbs-nTfIWzRh.d.mts → breadcrumbs-BY1UMCbL.d.mts} +2 -2
  10. package/dist/{breadcrumbs-CtKa2zPe.d.ts → breadcrumbs-CXvdv6Ry.d.ts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-WSO6JN5C.mjs → chunk-DZD3DAEY.mjs} +2 -0
  13. package/dist/doctor.d.mts +1 -0
  14. package/dist/doctor.d.ts +1 -0
  15. package/dist/doctor.js +570 -10
  16. package/dist/doctor.mjs +570 -10
  17. package/dist/filters.d.mts +2 -2
  18. package/dist/filters.d.ts +2 -2
  19. package/dist/format.d.mts +4 -4
  20. package/dist/format.d.ts +4 -4
  21. package/dist/index.d.mts +107 -14
  22. package/dist/index.d.ts +107 -14
  23. package/dist/index.js +129 -8
  24. package/dist/index.mjs +128 -9
  25. package/dist/{jobs-SAkNWgAB.d.ts → jobs-C7UvN_dW.d.ts} +1 -1
  26. package/dist/{jobs-C_eO-WfM.d.mts → jobs-D9ERWWda.d.mts} +1 -1
  27. package/dist/{search-Cb3Aoa4c.d.mts → search-BMSNK85o.d.mts} +1 -1
  28. package/dist/{search-CVcMFOuJ.d.ts → search-D0TFnn1x.d.ts} +1 -1
  29. package/dist/{seo-DPVud7SH.d.mts → seo-C3WmgifR.d.mts} +1 -1
  30. package/dist/{seo-DgFBQTIK.d.ts → seo-CYmVKHsu.d.ts} +1 -1
  31. package/dist/seo-files.d.mts +25 -3
  32. package/dist/seo-files.d.ts +25 -3
  33. package/dist/seo-files.js +44 -10
  34. package/dist/seo-files.mjs +44 -10
  35. package/dist/seo.d.mts +6 -6
  36. package/dist/seo.d.ts +6 -6
  37. package/dist/server.d.mts +6 -6
  38. package/dist/server.d.ts +6 -6
  39. package/dist/server.mjs +1 -1
  40. package/dist/sitemap.d.mts +6 -6
  41. package/dist/sitemap.d.ts +6 -6
  42. package/dist/sitemap.mjs +1 -1
  43. package/dist/suggest.d.mts +2 -2
  44. package/dist/suggest.d.ts +2 -2
  45. package/package.json +1 -1
  46. package/skills/cavuno-board-filters/SKILL.md +13 -0
  47. package/skills/cavuno-board-i18n/SKILL.md +10 -0
  48. package/skills/cavuno-board-post-a-job/SKILL.md +2 -1
  49. package/skills/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,62 @@
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.45.0 — 2026-10-13
7
+
8
+ - `robotsBody()` and `robotsResponse()` from `@cavuno/board/seo-files` take
9
+ `listingPaths: { jobs, companies, talent }` for boards that rename or
10
+ translate their listing pages (for example `/vacatures` in place of
11
+ `/jobs`). The pagination `Disallow` rules then use those roots. A missing,
12
+ root (`/`) or unsafe value keeps the default root for that group, and
13
+ without the option the body is unchanged.
14
+ - They also take `localeListingPaths`, a list of the same shape, for
15
+ secondary interface languages served under a prefix (for example
16
+ `/fr/emplois`). Each root gets the same pagination rules after the
17
+ base-language rules, and roots already listed are skipped.
18
+ - New exported type: `RobotsListingPaths`.
19
+ - Doctor: a new `read.localizedUrls` check. On a board whose route manifest
20
+ uses translated words, each translated page's English path must answer a
21
+ 308 to the board's own path on the same origin, and that path must load.
22
+ English boards skip it with no extra requests.
23
+ - The `cavuno-board-i18n` skill explains how a renamed URL word keeps
24
+ working: list the old word in `src/url-words-previous.json`, and starters
25
+ that read the file redirect it to the current word with one 308.
26
+
27
+ ## 4.44.0 — 2026-10-12
28
+
29
+ - Saved searches: `me.companies.talentLists.members.list()` takes `stage`, a
30
+ comma-separated list of pipeline stages, on a saved search linked to a job.
31
+ It keeps the saved people whose application on that job is at one of those
32
+ stages, so a stage view can be paged like any other list. Values match
33
+ stored stages exactly: to match a board column, pass every stage the column
34
+ shows (the Applied column is `applied,review`). `count` reflects the stage
35
+ and filters; `total` is still every saved person you can see. Passing
36
+ `stage` for a saved search with no linked job is a 400.
37
+
38
+ ## 4.43.0 — 2026-10-12
39
+
40
+ - Saved searches can hold people. `me.companies.talentLists.members.list()`,
41
+ `.add()` and `.remove()` manage the people saved to a saved search, and
42
+ `me.companies.talentLists.memberships()` lists the saved searches one
43
+ candidate is on. `members.list()` takes the same filters as `talent.list()`,
44
+ including `radius`, and returns `total` (every saved person you can see)
45
+ next to `count` (those matching the filters). Each saved search reports
46
+ `memberCount`. A saved search holds up to 500 people; adding more returns
47
+ 409 `talent_list_full`.
48
+ - Saving someone to a saved search that is linked to a job also shortlists
49
+ them on that job, and linking a job later shortlists everyone already
50
+ saved. Removing someone from a saved search never changes their place in a
51
+ job pipeline.
52
+ - Messaging: on boards that sell talent access, sending a message about a
53
+ shortlisted candidate who has not applied needs talent access, as a message
54
+ started from the talent directory does. Messages about people who applied
55
+ are unchanged.
56
+ - Talent directory: signed-in viewers also see profiles that are visible to
57
+ signed-in users only.
58
+ - Job postings: spending an existing credit or subscription through
59
+ `job-postings` requires `billingVerificationToken`, the token you pass to
60
+ `getBillingOptions`. Posts that buy a plan or are free are unaffected.
61
+
6
62
  ## 4.42.0 — 2026-10-12
7
63
 
8
64
  - Talent search: `talent.list()` takes `radius`, in kilometres (1–250,
@@ -64,6 +64,9 @@ interface components {
64
64
  job: string;
65
65
  candidateBoardUserId: string;
66
66
  };
67
+ AddTalentListMemberBody: {
68
+ candidateBoardUserId: string;
69
+ };
67
70
  Alert: {
68
71
  /** @description Job-alert preference ID. Also the path key. */
69
72
  id: string;
@@ -1082,6 +1085,8 @@ interface components {
1082
1085
  id?: string;
1083
1086
  planId: string;
1084
1087
  };
1088
+ /** @description The `verificationToken` the billing options were listed with. Required when `selectedBilling.type` is `order` or `subscription`; the token's email must match `submission.contactEmail`. */
1089
+ billingVerificationToken?: string;
1085
1090
  invoiceBilling?: {
1086
1091
  billingName?: string;
1087
1092
  address: {
@@ -2935,6 +2940,22 @@ interface components {
2935
2940
  */
2936
2941
  offset?: number;
2937
2942
  };
2943
+ PublicTalentPlace: {
2944
+ /** @enum {string} */
2945
+ object: "talent_place";
2946
+ /** @description Stable place identity (the same id as `/places`). */
2947
+ id: string;
2948
+ /** @description Parent place's `id`; `null` for a root place. */
2949
+ parentId: string | null;
2950
+ /** @description English source place slug: pass it as the talent directory's `place` filter. */
2951
+ slug: string | null;
2952
+ name: string;
2953
+ placeType: string;
2954
+ countryCode: string | null;
2955
+ regionCode: string | null;
2956
+ /** @description Candidates the viewer can see in the directory whose home is this place or lies within it. Signed out: `public` profiles; signed in: `public` and `logged_in_only` profiles. */
2957
+ candidateCount: number;
2958
+ };
2938
2959
  PublicTaxonomyResolution: {
2939
2960
  /** @enum {string} */
2940
2961
  object: "taxonomy_resolution";
@@ -3602,6 +3623,8 @@ interface components {
3602
3623
  createdBy: string;
3603
3624
  createdAt: number;
3604
3625
  updatedAt: number;
3626
+ /** @description People saved to this list (at most 500). Includes anyone the members list omits for the viewer (blocked, hidden or deactivated). */
3627
+ memberCount: number;
3605
3628
  };
3606
3629
  TalentListFilters: {
3607
3630
  q?: string;
@@ -3617,6 +3640,22 @@ interface components {
3617
3640
  permitCountry?: string;
3618
3641
  interestedRole?: string;
3619
3642
  };
3643
+ TalentListMember: {
3644
+ id: string;
3645
+ /** @enum {string} */
3646
+ object: "talent_list_member";
3647
+ candidate: components["schemas"]["TalentDirectoryEntry"];
3648
+ addedAt: number;
3649
+ /** @description Board-user id of the employer who saved them. */
3650
+ addedBy: string;
3651
+ };
3652
+ TalentListMembership: {
3653
+ /** @enum {string} */
3654
+ object: "talent_list_membership";
3655
+ listId: string;
3656
+ candidateBoardUserId: string;
3657
+ addedAt: number;
3658
+ };
3620
3659
  TalentProfile: {
3621
3660
  /** @enum {string} */
3622
3661
  object: "talent_profile";
@@ -64,6 +64,9 @@ interface components {
64
64
  job: string;
65
65
  candidateBoardUserId: string;
66
66
  };
67
+ AddTalentListMemberBody: {
68
+ candidateBoardUserId: string;
69
+ };
67
70
  Alert: {
68
71
  /** @description Job-alert preference ID. Also the path key. */
69
72
  id: string;
@@ -1082,6 +1085,8 @@ interface components {
1082
1085
  id?: string;
1083
1086
  planId: string;
1084
1087
  };
1088
+ /** @description The `verificationToken` the billing options were listed with. Required when `selectedBilling.type` is `order` or `subscription`; the token's email must match `submission.contactEmail`. */
1089
+ billingVerificationToken?: string;
1085
1090
  invoiceBilling?: {
1086
1091
  billingName?: string;
1087
1092
  address: {
@@ -2935,6 +2940,22 @@ interface components {
2935
2940
  */
2936
2941
  offset?: number;
2937
2942
  };
2943
+ PublicTalentPlace: {
2944
+ /** @enum {string} */
2945
+ object: "talent_place";
2946
+ /** @description Stable place identity (the same id as `/places`). */
2947
+ id: string;
2948
+ /** @description Parent place's `id`; `null` for a root place. */
2949
+ parentId: string | null;
2950
+ /** @description English source place slug: pass it as the talent directory's `place` filter. */
2951
+ slug: string | null;
2952
+ name: string;
2953
+ placeType: string;
2954
+ countryCode: string | null;
2955
+ regionCode: string | null;
2956
+ /** @description Candidates the viewer can see in the directory whose home is this place or lies within it. Signed out: `public` profiles; signed in: `public` and `logged_in_only` profiles. */
2957
+ candidateCount: number;
2958
+ };
2938
2959
  PublicTaxonomyResolution: {
2939
2960
  /** @enum {string} */
2940
2961
  object: "taxonomy_resolution";
@@ -3602,6 +3623,8 @@ interface components {
3602
3623
  createdBy: string;
3603
3624
  createdAt: number;
3604
3625
  updatedAt: number;
3626
+ /** @description People saved to this list (at most 500). Includes anyone the members list omits for the viewer (blocked, hidden or deactivated). */
3627
+ memberCount: number;
3605
3628
  };
3606
3629
  TalentListFilters: {
3607
3630
  q?: string;
@@ -3617,6 +3640,22 @@ interface components {
3617
3640
  permitCountry?: string;
3618
3641
  interestedRole?: string;
3619
3642
  };
3643
+ TalentListMember: {
3644
+ id: string;
3645
+ /** @enum {string} */
3646
+ object: "talent_list_member";
3647
+ candidate: components["schemas"]["TalentDirectoryEntry"];
3648
+ addedAt: number;
3649
+ /** @description Board-user id of the employer who saved them. */
3650
+ addedBy: string;
3651
+ };
3652
+ TalentListMembership: {
3653
+ /** @enum {string} */
3654
+ object: "talent_list_membership";
3655
+ listId: string;
3656
+ candidateBoardUserId: string;
3657
+ addedAt: number;
3658
+ };
3620
3659
  TalentProfile: {
3621
3660
  /** @enum {string} */
3622
3661
  object: "talent_profile";