@cavuno/board 4.66.0 → 4.67.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 (41) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/{_spec-DBI6azWs.d.mts → _spec-BehBmeHK.d.mts} +92 -0
  3. package/dist/{_spec-DBI6azWs.d.ts → _spec-BehBmeHK.d.ts} +92 -0
  4. package/dist/{blog--VKuBIdw.d.ts → blog-BLpOmpyQ.d.ts} +1 -1
  5. package/dist/{blog-Bx-rjH4V.d.mts → blog-BmfbjijG.d.mts} +1 -1
  6. package/dist/{board-BsUhxdjL.d.mts → board-CXd9Me7_.d.mts} +2 -2
  7. package/dist/{board-USJ9ZZab.d.ts → board-dV_3NXAI.d.ts} +2 -2
  8. package/dist/{breadcrumbs-BVN_gIJq.d.mts → breadcrumbs-Cu_SPdRA.d.mts} +2 -2
  9. package/dist/{breadcrumbs-maV86vZP.d.ts → breadcrumbs-PEsRCVwI.d.ts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-R62XFNS7.mjs → chunk-ZA5TZ6UH.mjs} +4 -0
  12. package/dist/filters.d.mts +2 -2
  13. package/dist/filters.d.ts +2 -2
  14. package/dist/format.d.mts +4 -4
  15. package/dist/format.d.ts +4 -4
  16. package/dist/index.d.mts +61 -13
  17. package/dist/index.d.ts +61 -13
  18. package/dist/index.js +66 -10
  19. package/dist/index.mjs +63 -11
  20. package/dist/{jobs-qoVMh_Zd.d.mts → jobs-CbTUedOr.d.mts} +1 -1
  21. package/dist/{jobs-Dyj1HZ8W.d.ts → jobs-D2mKA65F.d.ts} +1 -1
  22. package/dist/{search-DPHLf8pI.d.ts → search-CHejx_k7.d.ts} +1 -1
  23. package/dist/{search-CrXCM8Hq.d.mts → search-CxUViZsz.d.mts} +1 -1
  24. package/dist/{seo-DRVgmTCQ.d.mts → seo-CWa4rTf7.d.mts} +1 -1
  25. package/dist/{seo-BDwe8PwT.d.ts → seo-DYyQ8NTh.d.ts} +1 -1
  26. package/dist/seo-files.d.mts +2 -2
  27. package/dist/seo-files.d.ts +2 -2
  28. package/dist/seo.d.mts +6 -6
  29. package/dist/seo.d.ts +6 -6
  30. package/dist/server.d.mts +6 -6
  31. package/dist/server.d.ts +6 -6
  32. package/dist/server.mjs +1 -1
  33. package/dist/sitemap.d.mts +6 -6
  34. package/dist/sitemap.d.ts +6 -6
  35. package/dist/sitemap.mjs +1 -1
  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 +11 -0
  40. package/skills/cavuno-board-collections/SKILL.md +31 -2
  41. package/skills/manifest.json +2 -2
package/dist/index.mjs CHANGED
@@ -28,7 +28,7 @@ import {
28
28
  isSsoRequired,
29
29
  isUnauthorized,
30
30
  isValidationError
31
- } from "./chunk-R62XFNS7.mjs";
31
+ } from "./chunk-ZA5TZ6UH.mjs";
32
32
 
33
33
  // src/query.ts
34
34
  function toSearchParams(query) {
@@ -49,7 +49,7 @@ function toSearchParams(query) {
49
49
  }
50
50
 
51
51
  // src/version.ts
52
- var SDK_VERSION = "4.66.0";
52
+ var SDK_VERSION = "4.67.0";
53
53
 
54
54
  // src/client.ts
55
55
  function isRawBody(body) {
@@ -770,6 +770,30 @@ function blogNamespace(client) {
770
770
  };
771
771
  }
772
772
 
773
+ // src/namespaces/collections.ts
774
+ function collectionsNamespace(client) {
775
+ return {
776
+ /**
777
+ * List the active entries of a collection the operator made public,
778
+ * sorted by name, with only its public fields. A collection that is not
779
+ * public reads as not found (`collections_not_found`). Follow
780
+ * `nextCursor` for more.
781
+ *
782
+ * @example
783
+ * const { data, nextCursor } = await board.collections.entries(
784
+ * 'trade_communities',
785
+ * { limit: 50 },
786
+ * );
787
+ */
788
+ entries(key, query, options) {
789
+ return client.fetch(
790
+ `/collections/${encodeURIComponent(key)}/entries`,
791
+ { ...options, query }
792
+ );
793
+ }
794
+ };
795
+ }
796
+
773
797
  // src/namespaces/companies.ts
774
798
  function companiesNamespace(client) {
775
799
  const markets = Object.assign(
@@ -1433,19 +1457,26 @@ function meNamespace(client) {
1433
1457
  query
1434
1458
  });
1435
1459
  },
1436
- /** Retrieve my profile custom-field definitions and current values. */
1460
+ /**
1461
+ * Retrieve my profile custom-field definitions, current values, and the
1462
+ * saved files of upload fields (`customFieldMedia`).
1463
+ */
1437
1464
  retrieveCustomFields(options) {
1438
- return client.fetch("/me/profile/custom-fields", {
1439
- ...options
1440
- });
1465
+ return client.fetch(
1466
+ "/me/profile/custom-fields",
1467
+ { ...options }
1468
+ );
1441
1469
  },
1442
1470
  /** Additively update my editable candidate profile custom fields. */
1443
1471
  updateCustomFields(body, options) {
1444
- return client.fetch("/me/profile/custom-fields", {
1445
- ...options,
1446
- method: "PATCH",
1447
- body
1448
- });
1472
+ return client.fetch(
1473
+ "/me/profile/custom-fields",
1474
+ {
1475
+ ...options,
1476
+ method: "PATCH",
1477
+ body
1478
+ }
1479
+ );
1449
1480
  },
1450
1481
  /** Retrieve editable catalog references on my candidate profile. */
1451
1482
  retrieveObjectReferences(options) {
@@ -1643,6 +1674,26 @@ function meNamespace(client) {
1643
1674
  method: "POST",
1644
1675
  body: form
1645
1676
  });
1677
+ },
1678
+ /**
1679
+ * Upload one file to an owner-editable `image_gallery` or `file` field
1680
+ * of my profile (up to 10 MB; galleries take JPEG, PNG, WebP or GIF).
1681
+ * The file is a draft until its `id` is saved to the field with
1682
+ * `updateCustomFields`, as the ordered list of file IDs.
1683
+ *
1684
+ * @example
1685
+ * const image = await board.me.profile.uploadCustomFieldFile('portfolio', file);
1686
+ * await board.me.profile.updateCustomFields({
1687
+ * values: { portfolio: [...savedIds, image.id] },
1688
+ * });
1689
+ */
1690
+ uploadCustomFieldFile(fieldKey, file, options) {
1691
+ const form = new FormData();
1692
+ form.append("file", file);
1693
+ return client.fetch(
1694
+ `/me/profile/custom-fields/${encodeURIComponent(fieldKey)}/files`,
1695
+ { ...options, method: "POST", body: form }
1696
+ );
1646
1697
  }
1647
1698
  },
1648
1699
  /**
@@ -4317,6 +4368,7 @@ function createBoardClient(options) {
4317
4368
  embed: embedNamespace(client),
4318
4369
  companies: companiesNamespace(client),
4319
4370
  blog: blogNamespace(client),
4371
+ collections: collectionsNamespace(client),
4320
4372
  auth: authNamespace(client, options.board),
4321
4373
  me: meNamespace(client),
4322
4374
  invites: invitesNamespace(client),
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DBI6azWs.mjs';
1
+ import { S as Schemas } from './_spec-BehBmeHK.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DBI6azWs.js';
1
+ import { S as Schemas } from './_spec-BehBmeHK.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DBI6azWs.js';
1
+ import { S as Schemas } from './_spec-BehBmeHK.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DBI6azWs.mjs';
1
+ import { S as Schemas } from './_spec-BehBmeHK.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DBI6azWs.mjs';
1
+ import { S as Schemas } from './_spec-BehBmeHK.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DBI6azWs.js';
1
+ import { S as Schemas } from './_spec-BehBmeHK.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-DRVgmTCQ.mjs';
2
- import './_spec-DBI6azWs.mjs';
1
+ import { B as BoardSeo } from './seo-CWa4rTf7.mjs';
2
+ import './_spec-BehBmeHK.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-BDwe8PwT.js';
2
- import './_spec-DBI6azWs.js';
1
+ import { B as BoardSeo } from './seo-DYyQ8NTh.js';
2
+ import './_spec-BehBmeHK.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-Bx-rjH4V.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-BVN_gIJq.mjs';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-BVN_gIJq.mjs';
4
- import './_spec-DBI6azWs.mjs';
5
- import './board-BsUhxdjL.mjs';
6
- import './jobs-qoVMh_Zd.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BmfbjijG.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-Cu_SPdRA.mjs';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-Cu_SPdRA.mjs';
4
+ import './_spec-BehBmeHK.mjs';
5
+ import './board-CXd9Me7_.mjs';
6
+ import './jobs-CbTUedOr.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog--VKuBIdw.js';
2
- import { e as JsonLdObject } from './breadcrumbs-maV86vZP.js';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-maV86vZP.js';
4
- import './_spec-DBI6azWs.js';
5
- import './board-USJ9ZZab.js';
6
- import './jobs-Dyj1HZ8W.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BLpOmpyQ.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-PEsRCVwI.js';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-PEsRCVwI.js';
4
+ import './_spec-BehBmeHK.js';
5
+ import './board-dV_3NXAI.js';
6
+ import './jobs-D2mKA65F.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/server.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DBI6azWs.mjs';
3
- import './search-CrXCM8Hq.mjs';
4
- import './jobs-qoVMh_Zd.mjs';
5
- import './board-BsUhxdjL.mjs';
6
- import './seo-DRVgmTCQ.mjs';
7
- import './blog-Bx-rjH4V.mjs';
2
+ import './_spec-BehBmeHK.mjs';
3
+ import './search-CxUViZsz.mjs';
4
+ import './jobs-CbTUedOr.mjs';
5
+ import './board-CXd9Me7_.mjs';
6
+ import './seo-CWa4rTf7.mjs';
7
+ import './blog-BmfbjijG.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DBI6azWs.js';
3
- import './search-DPHLf8pI.js';
4
- import './jobs-Dyj1HZ8W.js';
5
- import './board-USJ9ZZab.js';
6
- import './seo-BDwe8PwT.js';
7
- import './blog--VKuBIdw.js';
2
+ import './_spec-BehBmeHK.js';
3
+ import './search-CHejx_k7.js';
4
+ import './jobs-D2mKA65F.js';
5
+ import './board-dV_3NXAI.js';
6
+ import './seo-DYyQ8NTh.js';
7
+ import './blog-BLpOmpyQ.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Z4ALWIGS.mjs";
5
5
  import {
6
6
  isUnauthorized
7
- } from "./chunk-R62XFNS7.mjs";
7
+ } from "./chunk-ZA5TZ6UH.mjs";
8
8
 
9
9
  // src/server/cookie.ts
10
10
  var COOKIE_ATTRIBUTES = "Path=/; HttpOnly; Secure; SameSite=Lax";
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DBI6azWs.mjs';
3
- import './search-CrXCM8Hq.mjs';
4
- import './jobs-qoVMh_Zd.mjs';
5
- import './board-BsUhxdjL.mjs';
6
- import './seo-DRVgmTCQ.mjs';
7
- import './blog-Bx-rjH4V.mjs';
2
+ import './_spec-BehBmeHK.mjs';
3
+ import './search-CxUViZsz.mjs';
4
+ import './jobs-CbTUedOr.mjs';
5
+ import './board-CXd9Me7_.mjs';
6
+ import './seo-CWa4rTf7.mjs';
7
+ import './blog-BmfbjijG.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DBI6azWs.js';
3
- import './search-DPHLf8pI.js';
4
- import './jobs-Dyj1HZ8W.js';
5
- import './board-USJ9ZZab.js';
6
- import './seo-BDwe8PwT.js';
7
- import './blog--VKuBIdw.js';
2
+ import './_spec-BehBmeHK.js';
3
+ import './search-CHejx_k7.js';
4
+ import './jobs-D2mKA65F.js';
5
+ import './board-dV_3NXAI.js';
6
+ import './seo-DYyQ8NTh.js';
7
+ import './blog-BLpOmpyQ.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DLSO6XXY.mjs";
4
4
  import {
5
5
  isNotFound
6
- } from "./chunk-R62XFNS7.mjs";
6
+ } from "./chunk-ZA5TZ6UH.mjs";
7
7
  import {
8
8
  BOARD_PATHS,
9
9
  blogAuthorPath,
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CrXCM8Hq.mjs';
2
- import './_spec-DBI6azWs.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CxUViZsz.mjs';
2
+ import './_spec-BehBmeHK.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-DPHLf8pI.js';
2
- import './_spec-DBI6azWs.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CHejx_k7.js';
2
+ import './_spec-BehBmeHK.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.66.0",
3
+ "version": "4.67.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -206,6 +206,17 @@ The SDK builds multipart `FormData` with field `file` from a `Blob` or `File`. A
206
206
  const { avatarUrl } = await board.me.profile.uploadAvatar(file);
207
207
  ```
208
208
 
209
+ Image gallery and file custom fields take one upload per call, up to 10 MB; galleries accept JPEG, PNG, WebP or GIF and hold at most 10 images. Only fields with `editableByOwner: true` accept uploads. An upload is a draft until you save its `id` to the field: the field's value is the ordered list of file IDs, so append, remove or reorder IDs and send the whole list. Drafts never saved are deleted after a day. Show previews from the returned `url` and from `customFieldMedia` on `retrieveCustomFields`; both are signed links that expire, so read them fresh rather than storing them.
210
+
211
+ ```ts snippet
212
+ const { values } = await board.me.profile.retrieveCustomFields();
213
+ const saved = Array.isArray(values.portfolio) ? values.portfolio : [];
214
+ const image = await board.me.profile.uploadCustomFieldFile('portfolio', file);
215
+ await board.me.profile.updateCustomFields({
216
+ values: { portfolio: [...saved, image.id] },
217
+ });
218
+ ```
219
+
209
220
  Resume upload starts an asynchronous parse that may populate the profile. Poll within a fixed budget, surface failure, and keep manual editing available if parsing runs long.
210
221
 
211
222
  ```ts snippet
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: cavuno-board-collections
3
- description: Custom profile fields and collection references with @cavuno/board. Use for rendering company, talent or job custom fields, collection entries, benefits/technologies/certification sections, or collection-backed filters.
3
+ description: Custom profile fields, collection references and public collections with @cavuno/board. Use for rendering company, talent or job custom fields, collection entries, a page that lists a collection's entries (resources, partners, communities), benefits/technologies/certification sections, or collection-backed filters.
4
4
  ---
5
5
 
6
6
  # Custom fields and collections
7
7
 
8
8
  An operator defines two kinds of extra data. A **custom field** stores one typed value directly on a company, talent profile, or job. A **collection reference** points that record at reusable entries — benefits, technologies, certifications, learning resources — that the operator maintains once and every record shares.
9
9
 
10
- Hosted Cavuno boards do not render either one. The API resolves them and your frontend decides the layout, so this surface is read-heavy: definitions tell you what to draw, resolved selections tell you what to draw it with.
10
+ Your site renders both. The API resolves them and your frontend decides the layout, so this surface is read-heavy: definitions tell you what to draw, resolved selections tell you what to draw it with. A collection the operator made public can also be listed on its own page with `board.collections.entries` (see below).
11
11
 
12
12
  ## The read model
13
13
 
@@ -76,6 +76,34 @@ for (const field of job.resolvedCollectionFields) {
76
76
  }
77
77
  ```
78
78
 
79
+ ## Public collections
80
+
81
+ A collection the operator turned **Public** on (Settings, Collections) can be listed on its own page, such as a Resources or Partners page. Ask the operator for the collection's key; a collection that is not public, archived, or unknown throws `BoardApiError` with code `collections_not_found`.
82
+
83
+ ```ts snippet
84
+ const entries = [];
85
+ let cursor: string | undefined;
86
+ do {
87
+ const page = await board.collections.entries('trade_communities', {
88
+ limit: 100,
89
+ cursor,
90
+ });
91
+ entries.push(...page.data);
92
+ cursor = page.nextCursor ?? undefined;
93
+ } while (cursor);
94
+
95
+ for (const entry of entries) {
96
+ renderResource({
97
+ heading: entry.name,
98
+ logoUrl: entry.logoUrl,
99
+ website: entry.values.website,
100
+ href: entry.slug ? `/resources/${entry.slug}` : undefined,
101
+ });
102
+ }
103
+ ```
104
+
105
+ Each entry is `{ id, name, slug?, logoUrl?, fields, values, references? }`, sorted by name: the same `fields` / `values` / `references` shape as a job collection entry, without the per-job `title` and `description`. Take labels from `fields`.
106
+
79
107
  Visibility is enforced server-side. Public reads return only public scalar fields, public collection fields, and active entries; private definitions and archived entries are omitted entirely, not nulled. Do not render a placeholder for a key that is absent — the operator meant it to be invisible. An owner read returns the private owner-editable fields too, so the same component can receive either payload; branch on what is present.
80
108
 
81
109
  ## Owner writes
@@ -140,6 +168,7 @@ Finish only after every applicable check passes:
140
168
  - Rich text renders as formatted HTML, not escaped tags.
141
169
  - A private field and an archived entry are absent from the public render, with no empty placeholder left behind.
142
170
  - Job pages read `resolvedCollectionFields`, and company or talent pages read `objectReferences` — neither shape is assumed for the other.
171
+ - A page that lists a collection reads `board.collections.entries`, follows `nextCursor` to the end, and handles `collections_not_found` without a broken page.
143
172
  - Filter requests carry record IDs from a choices call, and the filter control's options come from the public definition list.
144
173
  - A multi-select picker stops at the definition's `maxSelections`, or at 100 when the definition omits it.
145
174
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.66.0",
2
+ "version": "4.67.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  {
40
40
  "name": "cavuno-board-collections",
41
- "description": "Custom profile fields and collection references with @cavuno/board. Use for rendering company, talent or job custom fields, collection entries, benefits/technologies/certification sections, or collection-backed filters.",
41
+ "description": "Custom profile fields, collection references and public collections with @cavuno/board. Use for rendering company, talent or job custom fields, collection entries, a page that lists a collection's entries (resources, partners, communities), benefits/technologies/certification sections, or collection-backed filters.",
42
42
  "path": "skills/cavuno-board-collections/SKILL.md",
43
43
  "framework": null,
44
44
  "category": "core"