@cavuno/board 4.4.1 → 4.6.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 (42) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/{_spec-COlkrizX.d.mts → _spec-Dm-1AieO.d.mts} +61 -1
  3. package/dist/{_spec-COlkrizX.d.ts → _spec-Dm-1AieO.d.ts} +61 -1
  4. package/dist/{blog-CgA_ljHa.d.ts → blog-BvyEW4bf.d.ts} +1 -1
  5. package/dist/{blog-DO8Yn21_.d.mts → blog-C5g0Tt8w.d.mts} +1 -1
  6. package/dist/{board-D51C3gB5.d.ts → board-CW3qMKdu.d.ts} +2 -2
  7. package/dist/{board-JgFR-2UW.d.mts → board-CemD1yEl.d.mts} +2 -2
  8. package/dist/{breadcrumbs-_QzN4nEk.d.ts → breadcrumbs-BRHiWWSf.d.ts} +2 -2
  9. package/dist/{breadcrumbs-zAN2biAq.d.mts → breadcrumbs-Bgmklae3.d.mts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-2ETP5UH4.mjs → chunk-GC5QWN7Y.mjs} +16 -0
  12. package/dist/{chunk-YEAQ3JEI.mjs → chunk-VWGF4I5C.mjs} +143 -4
  13. package/dist/filters.d.mts +2 -2
  14. package/dist/filters.d.ts +2 -2
  15. package/dist/format.d.mts +4 -4
  16. package/dist/format.d.ts +4 -4
  17. package/dist/format.js +15 -2
  18. package/dist/format.mjs +2 -126
  19. package/dist/index.d.mts +89 -12
  20. package/dist/index.d.ts +89 -12
  21. package/dist/index.js +205 -1
  22. package/dist/index.mjs +190 -2
  23. package/dist/{jobs-C1Mxty1n.d.mts → jobs-B0phTsdB.d.mts} +1 -1
  24. package/dist/{jobs-DOF3QXdq.d.ts → jobs-f-n4_rrz.d.ts} +1 -1
  25. package/dist/{search-_QDaN6Um.d.ts → search-C1LHejWz.d.ts} +1 -1
  26. package/dist/{search-Cx_dsVUb.d.mts → search-DVg1L-3s.d.mts} +1 -1
  27. package/dist/seo.d.mts +6 -6
  28. package/dist/seo.d.ts +6 -6
  29. package/dist/seo.js +16 -1
  30. package/dist/seo.mjs +1 -1
  31. package/dist/server.d.mts +5 -5
  32. package/dist/server.d.ts +5 -5
  33. package/dist/server.mjs +1 -1
  34. package/dist/sitemap.d.mts +5 -5
  35. package/dist/sitemap.d.ts +5 -5
  36. package/dist/suggest.d.mts +2 -2
  37. package/dist/suggest.d.ts +2 -2
  38. package/package.json +1 -1
  39. package/skills/cavuno-board-account/SKILL.md +31 -2
  40. package/skills/cavuno-board-companies/SKILL.md +21 -0
  41. package/skills/cavuno-board-seo/SALARY.md +2 -1
  42. package/skills/manifest.json +2 -2
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: cavuno-board-account
3
- description: Candidate self-service boundary with @cavuno/board. Use for account, profile, resume onboarding, avatar, experience, education, skills, languages, or notification preferences.
3
+ description: Candidate self-service boundary with @cavuno/board. Use for account, profile, resume onboarding, recommended jobs, avatar, experience, education, skills, languages, or notification preferences.
4
4
  ---
5
5
 
6
6
  # Candidate self-service boundary
7
7
 
8
8
  Signed-in candidate data lives under `board.me`. Browser calls use the bearer token in `auth.storage`; server calls pass it per request in `options.headers`. See `cavuno-board-auth` for cookie-based server sessions.
9
9
 
10
- The only anonymous method here is token-based email unsubscribe. Applications, employer companies, messaging, and alerts have their own skills.
10
+ Anonymous methods here are token-based email unsubscribe and email-change confirm (`confirmEmailChange`). Applications, employer companies, messaging, and alerts have their own skills.
11
11
 
12
12
  The host application owns forms, file pickers, and cookie plumbing; this SDK surface supplies data operations.
13
13
 
@@ -15,10 +15,20 @@ The host application owns forms, file pickers, and cookie plumbing; this SDK sur
15
15
 
16
16
  Account deletion is a synchronous, irreversible cascade over the profile, collections, saved jobs, alerts, avatar, and resume. Obtain explicit confirmation before calling it.
17
17
 
18
+ Change the password with the current password. The SDK persists the returned session so the caller stays signed in. Passwordless accounts (magic-link or OAuth) get `no_password` — send them through `auth.forgotPassword` instead.
19
+
18
20
  ```ts snippet
19
21
  const me = await board.me.retrieve();
20
22
  await board.me.delete();
21
23
 
24
+ await board.me.updatePassword({
25
+ currentPassword: 'oldpass99',
26
+ newPassword: 'newpass99',
27
+ });
28
+
29
+ await board.me.requestEmailChange({ email: 'new@example.com' });
30
+ await board.me.confirmEmailChange({ token });
31
+
22
32
  const profile = await board.me.profile.retrieve();
23
33
  await board.me.profile.update({
24
34
  headline: 'Staff Engineer',
@@ -104,6 +114,24 @@ if (resume.parseStatus === 'parsed') {
104
114
 
105
115
  Upload options also include `importMode: 'append_only' | 'replace_all'` and `confirmReplaceAll`. `resume.file.url` is a short-lived signed URL. `parseStatus` is null before any parse. `board.me.resume.delete()` removes the stored file and keep-on-file consent while retaining imported profile fields.
106
116
 
117
+ ## Recommended jobs
118
+
119
+ `board.me.recommendedJobs.list` is the sibling of `savedJobs.list`. Each item wraps the same slim `PublicJobCard` (`{ object: 'recommended_job', job }`). Order is the ranking. The endpoint never returns scores, weights, or ranker identity.
120
+
121
+ Cold start is an empty list — no hint field. Drive an upload-resume CTA from `board.me.profile` / `board.me.resume` (`parseStatus`, skills), not from the list response.
122
+
123
+ ```ts snippet
124
+ const { data } = await board.me.recommendedJobs.list({ limit: 20 });
125
+ data[0]?.job.title;
126
+
127
+ const profile = await board.me.profile.retrieve();
128
+ const skills = await board.me.profile.listSkills();
129
+ const resume = await board.me.resume.retrieve();
130
+ if (data.length === 0 && (skills.data.length === 0 || resume.parseStatus !== 'parsed')) {
131
+ promptResumeUpload();
132
+ }
133
+ ```
134
+
107
135
  ## Notification preferences
108
136
 
109
137
  Authenticated settings expose `messageEmails` and `applicationEmails`. Updating one channel returns the full set.
@@ -132,6 +160,7 @@ await board.me.notificationPreferences.unsubscribeWithToken({
132
160
  - Adding a skill preserves every existing skill.
133
161
  - Uploaded `avatarUrl` renders.
134
162
  - Resume parsing reaches `parsed`, reports `parseFailureReason`, or reaches the explicit delayed state without blocking editing.
163
+ - Recommended jobs render the returned cards in list order; an empty list plus missing skills / unparsed resume shows an upload-resume prompt.
135
164
  - Anonymous unsubscribe works in a logged-out browser.
136
165
 
137
166
  ## Cavuno SDK reference
@@ -12,6 +12,27 @@ Board-wide jobs use `jobs.*`, board-wide salary hubs use `salaries.*`, and
12
12
  employer self-service uses authenticated `board.me.companies.*`. The host app
13
13
  owns admin writes, sitemaps, and OG-image routes.
14
14
 
15
+ An approved admin can delete a company they manage and can list, retitle, or
16
+ remove members. Any approved member can leave with `board.me.companies.leave`.
17
+ Demoting, removing, or leaving as the last admin is `last_admin`. Admins
18
+ invite by email; approved members can list pending invites; accept is
19
+ session-gated on `board.me.acceptInvite`.
20
+
21
+ ```ts snippet
22
+ await board.me.companies.delete('acme');
23
+ const { data: members } = await board.me.companies.listMembers('acme');
24
+ await board.me.companies.updateMemberRole('acme', members[0].id, {
25
+ role: 'admin',
26
+ });
27
+ await board.me.companies.removeMember('acme', members[0].id);
28
+ await board.me.companies.leave('acme');
29
+
30
+ const { data: invites } = await board.me.companies.listInvites('acme');
31
+ await board.me.companies.createInvite('acme', { email: 'ada@acme.test' });
32
+ await board.me.companies.revokeInvite('acme', invites[0].id);
33
+ const { companySlug } = await board.me.acceptInvite({ token });
34
+ ```
35
+
15
36
  ## List and search
16
37
 
17
38
  `companies.list` returns `CompanyListEnvelope`: `ListEnvelope<PublicCompany>`
@@ -102,7 +102,8 @@ const index = itemListJsonLd([
102
102
  - `formatSalaryStat(locale, value, currency, notation?)` /
103
103
  `formatSalaryStatRange(locale, min, max, currency, notation?)` for
104
104
  salary-page amounts (currency from the detail, not hardcoded USD;
105
- `formatRange` owns the join). `notation` matches `formatSalaryRange`
105
+ `formatRange` owns the join when present, else two `format()` calls
106
+ joined with an en-dash). `notation` matches `formatSalaryRange`
106
107
  (magnitude default when omitted; pass `'standard'` for full figures).
107
108
  Returns `null` when currency is empty or `Intl` rejects inputs.
108
109
  - `SENIORITY_ORDER` / `sortBySeniority` for seniority ladder ordering
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "4.4.1",
2
+ "version": "4.6.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",
6
- "description": "Candidate self-service boundary with @cavuno/board. Use for account, profile, resume onboarding, avatar, experience, education, skills, languages, or notification preferences.",
6
+ "description": "Candidate self-service boundary with @cavuno/board. Use for account, profile, resume onboarding, recommended jobs, avatar, experience, education, skills, languages, or notification preferences.",
7
7
  "path": "skills/cavuno-board-account/SKILL.md",
8
8
  "framework": null,
9
9
  "category": "core"