@cavuno/board 4.0.0 → 4.2.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 (33) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/{_spec-GVe6WAfT.d.mts → _spec-BnoxU-iR.d.mts} +58 -12
  3. package/dist/{_spec-GVe6WAfT.d.ts → _spec-BnoxU-iR.d.ts} +58 -12
  4. package/dist/{blog-BsmKizpd.d.ts → blog-D-PYhejB.d.ts} +1 -1
  5. package/dist/{blog-Cf64mI8A.d.mts → blog-DoAOCg-d.d.mts} +1 -1
  6. package/dist/{board-DUhgiacm.d.ts → board-4vXzYDL3.d.ts} +2 -2
  7. package/dist/{board-GGWJ4coe.d.mts → board-CvBkK7my.d.mts} +2 -2
  8. package/dist/{breadcrumbs-DiccJhk4.d.ts → breadcrumbs-Blf_rsux.d.ts} +2 -2
  9. package/dist/{breadcrumbs-DFKr0HzU.d.mts → breadcrumbs-Cz1sFqtV.d.mts} +2 -2
  10. package/dist/filters.d.mts +2 -2
  11. package/dist/filters.d.ts +2 -2
  12. package/dist/format.d.mts +4 -4
  13. package/dist/format.d.ts +4 -4
  14. package/dist/index.d.mts +74 -16
  15. package/dist/index.d.ts +74 -16
  16. package/dist/index.js +41 -6
  17. package/dist/index.mjs +41 -6
  18. package/dist/{jobs-QrbXOYB9.d.ts → jobs-B8DNWEir.d.ts} +1 -1
  19. package/dist/{jobs-BuLpV8iy.d.mts → jobs-aTp9uC3a.d.mts} +1 -1
  20. package/dist/{search-Cr4noJJZ.d.mts → search-Cs7d8y1k.d.mts} +1 -1
  21. package/dist/{search-DdsniXQv.d.ts → search-Cskh-neW.d.ts} +1 -1
  22. package/dist/seo.d.mts +6 -6
  23. package/dist/seo.d.ts +6 -6
  24. package/dist/server.d.mts +5 -5
  25. package/dist/server.d.ts +5 -5
  26. package/dist/sitemap.d.mts +5 -5
  27. package/dist/sitemap.d.ts +5 -5
  28. package/dist/suggest.d.mts +2 -2
  29. package/dist/suggest.d.ts +2 -2
  30. package/package.json +1 -1
  31. package/skills/cavuno-board-api-client/SKILL.md +42 -0
  32. package/skills/cavuno-board-seo/SKILL.md +12 -0
  33. package/skills/manifest.json +1 -1
package/dist/server.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-GVe6WAfT.js';
3
- import './search-DdsniXQv.js';
4
- import './board-DUhgiacm.js';
5
- import './jobs-QrbXOYB9.js';
6
- import './blog-BsmKizpd.js';
2
+ import './_spec-BnoxU-iR.js';
3
+ import './search-Cskh-neW.js';
4
+ import './board-4vXzYDL3.js';
5
+ import './jobs-B8DNWEir.js';
6
+ import './blog-D-PYhejB.js';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-GVe6WAfT.mjs';
3
- import './search-Cr4noJJZ.mjs';
4
- import './board-GGWJ4coe.mjs';
5
- import './jobs-BuLpV8iy.mjs';
6
- import './blog-Cf64mI8A.mjs';
2
+ import './_spec-BnoxU-iR.mjs';
3
+ import './search-Cs7d8y1k.mjs';
4
+ import './board-CvBkK7my.mjs';
5
+ import './jobs-aTp9uC3a.mjs';
6
+ import './blog-DoAOCg-d.mjs';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-GVe6WAfT.js';
3
- import './search-DdsniXQv.js';
4
- import './board-DUhgiacm.js';
5
- import './jobs-QrbXOYB9.js';
6
- import './blog-BsmKizpd.js';
2
+ import './_spec-BnoxU-iR.js';
3
+ import './search-Cskh-neW.js';
4
+ import './board-4vXzYDL3.js';
5
+ import './jobs-B8DNWEir.js';
6
+ import './blog-D-PYhejB.js';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cr4noJJZ.mjs';
2
- import './_spec-GVe6WAfT.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cs7d8y1k.mjs';
2
+ import './_spec-BnoxU-iR.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/dist/suggest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DdsniXQv.js';
2
- import './_spec-GVe6WAfT.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cskh-neW.js';
2
+ import './_spec-BnoxU-iR.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.0.0",
3
+ "version": "4.2.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -60,6 +60,48 @@ A module-scoped client is safe for concurrent SSR requests when it uses the serv
60
60
 
61
61
  **Complete when:** a shared server client contains no per-user state and each authenticated request supplies its own headers.
62
62
 
63
+ ## Record marketing consent for the signed-in person
64
+
65
+ Marketing consent is a property of the board user, never a guest capture. The
66
+ frontend owns the checkbox wording and the privacy-policy link — render your
67
+ own copy beside the control; the API records the decision, not the prose.
68
+ Leave any checkbox unticked by default and call nothing while it stays
69
+ unticked: absence of a record means no consent, never a default.
70
+
71
+ At sign-up, pass the tick through the register body so consent is recorded in
72
+ the same transaction that creates the user:
73
+
74
+ ```ts snippet
75
+ await board.auth.register({
76
+ role: 'candidate',
77
+ method: 'emailpass',
78
+ email: form.email,
79
+ password: form.password,
80
+ displayName: form.displayName,
81
+ marketingConsent: form.marketingChecked,
82
+ });
83
+ ```
84
+
85
+ Later, read or change only the signed-in person's own consent through the
86
+ authenticated `me` namespace. There is intentionally no email parameter, so a
87
+ frontend cannot target another person. Withdrawal is always an explicit POST —
88
+ never a state-changing GET, which mail scanners would follow.
89
+
90
+ ```ts snippet
91
+ const current = await board.me.marketingConsent.retrieve();
92
+ if (current?.status !== 'granted') {
93
+ await board.me.marketingConsent.grant();
94
+ }
95
+ await board.me.marketingConsent.withdraw();
96
+ ```
97
+
98
+ Call `grant()` only from a surface that displayed your disclosure wording.
99
+ Both calls are idempotent: repeating one changes nothing and emits no event.
100
+
101
+ **Complete when:** the checkbox defaults to unticked, unticked submits
102
+ nothing, grant is only reachable beside rendered disclosure copy, and
103
+ withdrawal is never implemented as a state-changing GET.
104
+
63
105
  ## Use the escape hatch for an untyped endpoint
64
106
 
65
107
  `board.client.fetch<T>(path, options)` keeps the full request pipeline while providing a response type locally.
@@ -19,6 +19,18 @@ Read the matching reference completely before implementing that page:
19
19
 
20
20
  For a page that combines branches, read every matching reference.
21
21
 
22
+ ## Favicons and board logo
23
+
24
+ Brand identity — not SEO builders. Read them from `board.context()`:
25
+
26
+ ```ts
27
+ const { logoUrl, icons } = await board.context();
28
+ // logoUrl — board logo
29
+ // icons.ico / .svg / .appleTouch / .icon192 / .icon512 / .iconMaskable512
30
+ ```
31
+
32
+ `board.seo()` is infra tokens only (ads, IndexNow, verification, canonical base, optional `manifest.name`).
33
+
22
34
  Sitemaps and robots.txt use `cavuno-board-sitemap`. The host app owns OG-image
23
35
  generation and its route map. `listingHead` receives app-owned title and
24
36
  meta description copy; the SDK never composes those sentences or joins
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.0.0",
2
+ "version": "4.2.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",