@cavuno/board 1.33.1 → 1.35.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 (38) hide show
  1. package/README.md +7 -8
  2. package/dist/bin.mjs +91 -21
  3. package/dist/{board-BTVapQiL.d.mts → board-Be8dY9Ba.d.mts} +1 -1
  4. package/dist/{board-0yI5ZRJw.d.ts → board-DsRbgz_D.d.ts} +1 -1
  5. package/dist/filters.d.mts +1 -1
  6. package/dist/filters.d.ts +1 -1
  7. package/dist/format.d.mts +2 -2
  8. package/dist/format.d.ts +2 -2
  9. package/dist/index.d.mts +32 -16
  10. package/dist/index.d.ts +32 -16
  11. package/dist/index.js +6 -3
  12. package/dist/index.mjs +6 -3
  13. package/dist/{jobs-Di4AV-02.d.mts → jobs-BFLMDNEN.d.mts} +194 -29
  14. package/dist/{jobs-Di4AV-02.d.ts → jobs-BFLMDNEN.d.ts} +194 -29
  15. package/dist/paths.d.mts +72 -0
  16. package/dist/paths.d.ts +72 -0
  17. package/dist/paths.js +99 -0
  18. package/dist/paths.mjs +78 -0
  19. package/dist/{salaries-B-zJKjkk.d.ts → salaries-negE75t8.d.ts} +4 -4
  20. package/dist/{salaries-D-BGZpDC.d.mts → salaries-pO_vGORE.d.mts} +4 -4
  21. package/dist/seo.d.mts +3 -3
  22. package/dist/seo.d.ts +3 -3
  23. package/dist/server.d.mts +3 -3
  24. package/dist/server.d.ts +3 -3
  25. package/dist/sitemap.d.mts +3 -3
  26. package/dist/sitemap.d.ts +3 -3
  27. package/dist/sitemap.js +89 -29
  28. package/dist/sitemap.mjs +89 -29
  29. package/package.json +11 -1
  30. package/skills/cavuno-board-auth/SKILL.md +0 -1
  31. package/skills/cavuno-board-client/SKILL.md +1 -4
  32. package/skills/cavuno-board-job-alerts/SKILL.md +4 -3
  33. package/skills/cavuno-board-jobs/SKILL.md +2 -2
  34. package/skills/cavuno-board-setup/SKILL.md +6 -8
  35. package/skills/cavuno-board-smoke-test/SKILL.md +7 -6
  36. package/skills/cavuno-board-theme/SKILL.md +33 -45
  37. package/skills/flavors/tanstack-start/SKILL.md +0 -1
  38. package/skills/manifest.json +4 -4
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @cavuno/board
2
2
 
3
3
  Typed, isomorphic client for the [Cavuno](https://cavuno.com) Board API —
4
- the headless toolkit for building fully-custom job-board frontends. Zero
4
+ the headless toolkit for building fully custom job board frontends. Zero
5
5
  dependencies; runs in the browser, Node ≥ 20, and Cloudflare Workers.
6
6
 
7
7
  You bring the framework and own the layout; the SDK brings the job board:
@@ -12,14 +12,14 @@ contract.
12
12
 
13
13
  ## Building with a coding agent
14
14
 
15
- The package ships an agent skill corpus that teaches Claude Code (or any
16
- SKILL.md-compatible agent) how to wire a board correctly — client setup,
15
+ The package ships an Agent Skills corpus for Codex, Claude Code, Cursor, and
16
+ other compatible coding agents. It teaches them how to wire a board correctly — client setup,
17
17
  auth and session ownership, pagination, gating, error handling, and a
18
18
  runtime smoke test:
19
19
 
20
20
  ```bash
21
- npm install @cavuno/board
22
- npx cavuno-board setup # copies version-matched skills into .claude/skills and/or .agents/skills
21
+ npm install @cavuno/board # or: pnpm add / yarn add / bun add
22
+ npx @cavuno/board setup # copies version-matched Agent Skills
23
23
  ```
24
24
 
25
25
  Then ask your agent: *"set up my Cavuno board"* — it reads the
@@ -33,8 +33,7 @@ never works from stale docs.
33
33
  import { createBoardClient } from '@cavuno/board';
34
34
 
35
35
  const board = createBoardClient({
36
- baseUrl: process.env.PUBLIC_CAVUNO_API_URL!, // https://api.cavuno.com
37
- board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
36
+ board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
38
37
  });
39
38
 
40
39
  const { name, theme, features } = await board.context();
@@ -80,7 +79,7 @@ SDK doesn't cover yet.
80
79
 
81
80
  ## Docs
82
81
 
83
- - API reference & guides: https://cavuno.com/docs/api
82
+ - SDK guides and reference: https://cavuno.com/docs/sdk
84
83
  - The OpenAPI document: `GET https://api.cavuno.com/v1/openapi.json`
85
84
  - Reference starter (TanStack Start on Cloudflare Workers):
86
85
  https://github.com/wollemiahq/cavuno-board-starter
package/dist/bin.mjs CHANGED
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ // src/constants.ts
4
+ var DEFAULT_CAVUNO_API_URL = "https://api.cavuno.com";
5
+
3
6
  // src/skills.ts
4
7
  import { readFileSync } from "fs";
5
8
  import { dirname, resolve } from "path";
@@ -220,6 +223,58 @@ async function runReadProbes(fetchImpl, frontendUrl) {
220
223
  ];
221
224
  }
222
225
 
226
+ // src/doctor/theme.ts
227
+ import { createHash } from "crypto";
228
+ import { existsSync, readFileSync as readFileSync2 } from "fs";
229
+ import { join } from "path";
230
+ var THEME = record("static.theme", 1);
231
+ function checkThemeFreshness(projectRoot, context) {
232
+ const tokensPath = join(projectRoot, "src/tokens.css");
233
+ if (!existsSync(tokensPath)) {
234
+ return [
235
+ THEME(
236
+ "skip",
237
+ "board is not tokens-migrated (ADR-0065) \u2014 no src/tokens.css"
238
+ )
239
+ ];
240
+ }
241
+ const tokensHash = createHash("sha256").update(readFileSync2(tokensPath, "utf8"), "utf8").digest("hex");
242
+ const resolvedPath = join(projectRoot, "src/theme/resolved.ts");
243
+ const resolvedHash = existsSync(resolvedPath) ? readFileSync2(resolvedPath, "utf8").match(
244
+ /tokensHash = '([0-9a-f]{64})'/
245
+ )?.[1] ?? null : null;
246
+ if (resolvedHash !== tokensHash) {
247
+ return [
248
+ THEME(
249
+ "fail",
250
+ `src/theme/resolved.ts is ${resolvedHash ? "stale" : "missing"} \u2014 run \`npm run gen:theme\` (OG images render from it)`
251
+ )
252
+ ];
253
+ }
254
+ if (!context) {
255
+ return [
256
+ THEME(
257
+ "skip",
258
+ "local derivations fresh; platform snapshot unverified \u2014 board context unavailable"
259
+ )
260
+ ];
261
+ }
262
+ if (context.themeSnapshotHash !== tokensHash) {
263
+ return [
264
+ THEME(
265
+ "fail",
266
+ `platform theme snapshot is ${context.themeSnapshotHash ? "stale" : "missing"} \u2014 emails render ${context.themeSnapshotHash ? "an old" : "the legacy"} theme; sync it: \`npm run gen:theme -- --payload | npx convex run boards/themeSnapshot:sync\``
267
+ )
268
+ ];
269
+ }
270
+ return [
271
+ THEME(
272
+ "pass",
273
+ `tokens.css \u21C4 resolved module \u21C4 platform snapshot (${tokensHash.slice(0, 12)}\u2026)`
274
+ )
275
+ ];
276
+ }
277
+
223
278
  // src/doctor/writes.ts
224
279
  var WRITE = {
225
280
  board: record("write.board", 3),
@@ -425,8 +480,8 @@ async function runWriteProbes(options) {
425
480
  }
426
481
 
427
482
  // src/doctor/run.ts
428
- import { existsSync, readFileSync as readFileSync2 } from "fs";
429
- import { join } from "path";
483
+ import { existsSync as existsSync2, readFileSync as readFileSync3 } from "fs";
484
+ import { join as join2 } from "path";
430
485
  var STATIC_API = record("static.api", 1);
431
486
  var STATIC_BOARD = record("static.board", 1);
432
487
  var STATIC_SKILLS = record("static.skills", 1);
@@ -486,15 +541,19 @@ async function checkBoardResolves(fetchImpl, env) {
486
541
  context: parsed
487
542
  };
488
543
  }
489
- var SKILL_ROOTS = [".claude/skills", ".agents/skills"];
544
+ var SKILL_ROOTS = [
545
+ ".claude/skills",
546
+ ".agents/skills",
547
+ ".cursor/skills"
548
+ ];
490
549
  function checkSkillsFreshness(projectRoot) {
491
- const roots = SKILL_ROOTS.map((root) => join(projectRoot, root)).filter(
492
- (root) => existsSync(root)
550
+ const roots = SKILL_ROOTS.map((root) => join2(projectRoot, root)).filter(
551
+ (root) => existsSync2(root)
493
552
  );
494
553
  if (roots.length === 0) {
495
554
  return STATIC_SKILLS(
496
555
  "skip",
497
- "no .claude/skills or .agents/skills directory \u2014 run `npx @cavuno/board setup` to install agent skills"
556
+ "no .claude/skills, .agents/skills, or .cursor/skills directory \u2014 run `npx @cavuno/board setup` to install agent skills"
498
557
  );
499
558
  }
500
559
  const corpus = loadSkillCorpus();
@@ -502,10 +561,10 @@ function checkSkillsFreshness(projectRoot) {
502
561
  const seen = /* @__PURE__ */ new Set();
503
562
  for (const root of roots) {
504
563
  for (const skill of corpus.skills) {
505
- const copied = join(root, skill.name, "SKILL.md");
506
- if (!existsSync(copied)) continue;
564
+ const copied = join2(root, skill.name, "SKILL.md");
565
+ if (!existsSync2(copied)) continue;
507
566
  seen.add(skill.name);
508
- if (readFileSync2(copied, "utf8") !== skill.content) {
567
+ if (readFileSync3(copied, "utf8") !== skill.content) {
509
568
  stale.add(skill.name);
510
569
  }
511
570
  }
@@ -527,12 +586,16 @@ function checkSkillsFreshness(projectRoot) {
527
586
  }
528
587
  async function runDoctor(options) {
529
588
  const fetchImpl = options.fetchImpl ?? fetch;
589
+ const env = {
590
+ ...options.env,
591
+ apiUrl: options.env.apiUrl ?? DEFAULT_CAVUNO_API_URL
592
+ };
530
593
  const results = [];
531
- const envResults = checkEnv(options.env);
594
+ const envResults = checkEnv(env);
532
595
  results.push(...envResults);
533
596
  const envOk = envResults.every((r) => r.status === "pass");
534
- if (options.env.apiUrl) {
535
- const api = await checkApiReachable(fetchImpl, options.env.apiUrl);
597
+ if (env.apiUrl) {
598
+ const api = await checkApiReachable(fetchImpl, env.apiUrl);
536
599
  results.push(
537
600
  api ?? STATIC_API("skip", "API URL malformed \u2014 fix env.api-url first")
538
601
  );
@@ -541,13 +604,16 @@ async function runDoctor(options) {
541
604
  }
542
605
  let boardContext = null;
543
606
  if (envOk) {
544
- const resolved = await checkBoardResolves(fetchImpl, options.env);
607
+ const resolved = await checkBoardResolves(fetchImpl, env);
545
608
  boardContext = resolved.context;
546
609
  results.push(resolved.result);
547
610
  } else {
548
611
  results.push(STATIC_BOARD("skip", "env checks failed \u2014 fix them first"));
549
612
  }
550
613
  results.push(checkSkillsFreshness(options.projectRoot ?? process.cwd()));
614
+ results.push(
615
+ ...checkThemeFreshness(options.projectRoot ?? process.cwd(), boardContext)
616
+ );
551
617
  results.push(
552
618
  ...options.frontendUrl ? await runReadProbes(fetchImpl, options.frontendUrl) : skipReadProbes("no --frontend <url> given")
553
619
  );
@@ -562,7 +628,7 @@ async function runDoctor(options) {
562
628
  } else {
563
629
  results.push(
564
630
  ...await runWriteProbes({
565
- env: options.env,
631
+ env,
566
632
  fetchImpl,
567
633
  resendApiKey: options.resendApiKey,
568
634
  nonce: options.writeProbeNonce,
@@ -574,12 +640,12 @@ async function runDoctor(options) {
574
640
  }
575
641
 
576
642
  // src/setup/run.ts
577
- import { cpSync, existsSync as existsSync2, mkdirSync, readFileSync as readFileSync3 } from "fs";
643
+ import { cpSync, existsSync as existsSync3, mkdirSync, readFileSync as readFileSync4 } from "fs";
578
644
  import { dirname as dirname2, resolve as resolve2 } from "path";
579
645
  function detectFramework(cwd) {
580
646
  const pkgPath = resolve2(cwd, "package.json");
581
- if (!existsSync2(pkgPath)) return null;
582
- const pkg = JSON.parse(readFileSync3(pkgPath, "utf8"));
647
+ if (!existsSync3(pkgPath)) return null;
648
+ const pkg = JSON.parse(readFileSync4(pkgPath, "utf8"));
583
649
  const deps = { ...pkg.dependencies, ...pkg.devDependencies };
584
650
  if (deps["@tanstack/react-start"]) return "tanstack-start";
585
651
  return null;
@@ -591,10 +657,12 @@ function runSetup(cwd = process.cwd()) {
591
657
  (skill) => skill.category === "core" || skill.framework === framework
592
658
  );
593
659
  const roots = [
660
+ resolve2(cwd, ".agents", "skills"),
594
661
  resolve2(cwd, ".claude", "skills"),
595
- resolve2(cwd, ".agents", "skills")
662
+ resolve2(cwd, ".codex", "skills"),
663
+ resolve2(cwd, ".cursor", "skills")
596
664
  ];
597
- const existing = roots.filter((root) => existsSync2(root));
665
+ const existing = roots.filter((root) => existsSync3(root));
598
666
  const targetDirs = existing.length > 0 ? existing : [roots[0]];
599
667
  const copied = [];
600
668
  for (const targetDir of targetDirs) {
@@ -670,11 +738,13 @@ function main() {
670
738
  );
671
739
  for (const name of result.copied) console.log(` - ${name}`);
672
740
  console.log("\nNext steps:");
673
- console.log(" 1. Set your environment variables:");
674
- console.log(" PUBLIC_CAVUNO_API_URL=https://api.cavuno.com");
741
+ console.log(" 1. Set your board publishable key:");
675
742
  console.log(
676
743
  " PUBLIC_CAVUNO_BOARD=pk_... # your board publishable key"
677
744
  );
745
+ console.log(
746
+ " # Optional API override: PUBLIC_CAVUNO_API_URL=https://api.cavuno.com"
747
+ );
678
748
  console.log(' 2. Ask your coding agent: "set up my Cavuno board".');
679
749
  console.log(" It reads the cavuno-board-setup skill first.");
680
750
  console.log(
@@ -1,4 +1,4 @@
1
- import { b as Schemas } from './jobs-Di4AV-02.mjs';
1
+ import { b as Schemas } from './jobs-BFLMDNEN.mjs';
2
2
 
3
3
  type PublicBoard = Schemas['PublicBoardContext'];
4
4
  type PublicBoardFeatures = PublicBoard['features'];
@@ -1,4 +1,4 @@
1
- import { b as Schemas } from './jobs-Di4AV-02.js';
1
+ import { b as Schemas } from './jobs-BFLMDNEN.js';
2
2
 
3
3
  type PublicBoard = Schemas['PublicBoardContext'];
4
4
  type PublicBoardFeatures = PublicBoard['features'];
@@ -1,5 +1,5 @@
1
1
  import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.mjs';
2
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-Di4AV-02.mjs';
2
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BFLMDNEN.mjs';
3
3
 
4
4
  declare const REMOTE_OPTIONS: readonly RemoteOption[];
5
5
  /**
package/dist/filters.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.js';
2
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-Di4AV-02.js';
2
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BFLMDNEN.js';
3
3
 
4
4
  declare const REMOTE_OPTIONS: readonly RemoteOption[];
5
5
  /**
package/dist/format.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-Di4AV-02.mjs';
1
+ import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-BFLMDNEN.mjs';
2
2
  import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.mjs';
3
3
  export { A as AlertsCopy, a as ApplyCopy, b as BlogCopy, c as BreadcrumbsCopy, C as CopyLinkCopy, E as EntityCopy, F as FooterCopy, J as JobCardCopy, d as JobDetailCopy, e as JobSearchCopy, N as NavCopy, P as PUBLIC_LABEL_GROUPS, f as PaginationCopy, S as SalaryCopy, U as UiCopy, u as uiCopy } from './ui-copy-rlfoH9P3.mjs';
4
- import { C as CustomFieldDefinition } from './board-BTVapQiL.mjs';
4
+ import { C as CustomFieldDefinition } from './board-Be8dY9Ba.mjs';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/format.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-Di4AV-02.js';
1
+ import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-BFLMDNEN.js';
2
2
  import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.js';
3
3
  export { A as AlertsCopy, a as ApplyCopy, b as BlogCopy, c as BreadcrumbsCopy, C as CopyLinkCopy, E as EntityCopy, F as FooterCopy, J as JobCardCopy, d as JobDetailCopy, e as JobSearchCopy, N as NavCopy, P as PUBLIC_LABEL_GROUPS, f as PaginationCopy, S as SalaryCopy, U as UiCopy, u as uiCopy } from './ui-copy-rlfoH9P3.js';
4
- import { C as CustomFieldDefinition } from './board-0yI5ZRJw.js';
4
+ import { C as CustomFieldDefinition } from './board-DsRbgz_D.js';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
- import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-Di4AV-02.mjs';
2
- export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCompany, J as JobSort, O as OfficeLocation, P as PublicJob, a as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-Di4AV-02.mjs';
3
- export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-BTVapQiL.mjs';
4
- import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-D-BGZpDC.mjs';
5
- export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-D-BGZpDC.mjs';
1
+ import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-BFLMDNEN.mjs';
2
+ export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCatalogPagination, m as JobCompany, J as JobSort, O as OfficeLocation, n as OffsetPagination, P as PublicJob, a as PublicJobCard, o as RelatedSearch, p as RemotePermit, q as RemoteTimezone, r as StorefrontPagination } from './jobs-BFLMDNEN.mjs';
3
+ export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-Be8dY9Ba.mjs';
4
+ import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-pO_vGORE.mjs';
5
+ export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-pO_vGORE.mjs';
6
6
 
7
7
  type Awaitable<T> = T | Promise<T>;
8
8
  /**
@@ -176,7 +176,7 @@ interface Paginator<P extends PageShape> extends AsyncIterable<ItemOf<P>> {
176
176
  * an explicit sort/query — see the jobs skill.
177
177
  *
178
178
  * `offset` is honored for the FIRST page only and dropped afterwards: on
179
- * storefront reads `offset` takes precedence over `cursor`, so carrying it
179
+ * job catalog reads let `offset` take precedence over `cursor`, so carrying it
180
180
  * forward would re-serve the same page forever.
181
181
  *
182
182
  * @example
@@ -204,7 +204,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
204
204
  * constant because the package is platform-neutral and cannot read
205
205
  * package.json at runtime.
206
206
  */
207
- declare const SDK_VERSION = "1.33.1";
207
+ declare const SDK_VERSION = "1.35.0";
208
208
 
209
209
  type SavedJob = Schemas['SavedJob'];
210
210
  type SavedJobsListQuery = {
@@ -456,7 +456,7 @@ type EmbedJobsQuery = {
456
456
  cursor?: string;
457
457
  /** Default 8; values above the embed ceiling of 50 are clamped to 50. */
458
458
  limit?: number;
459
- /** Storefront page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
459
+ /** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
460
460
  offset?: number;
461
461
  /** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
462
462
  companyId?: string[];
@@ -547,7 +547,7 @@ type AccessCheckoutBody = Schemas['AccessCheckoutBody'];
547
547
  type AccessPortalBody = Schemas['AccessPortalBody'];
548
548
  type PaywallOfferListEnvelope = ListEnvelope<PaywallOffer>;
549
549
 
550
- type JobAlertFrequency = 'daily' | 'weekly';
550
+ type JobAlertFrequency = 'weekly';
551
551
  type JobAlertRemoteOption = 'on_site' | 'hybrid' | 'remote';
552
552
  /**
553
553
  * Alert filters a consumer can capture. Only `jobFunctions` (→ job categories),
@@ -646,7 +646,8 @@ type PlacesListQuery = {
646
646
  };
647
647
 
648
648
  interface CreateBoardClientOptions {
649
- baseUrl: string;
649
+ /** Cavuno API origin. Defaults to the production service. */
650
+ baseUrl?: string;
650
651
  /** Board identifier: `pk_…` key (provisioned default) | `boards_…` ID | slug. */
651
652
  board: string;
652
653
  auth?: {
@@ -669,7 +670,6 @@ interface CreateBoardClientOptions {
669
670
  * import { createBoardClient } from '@cavuno/board';
670
671
  *
671
672
  * const board = createBoardClient({
672
- * baseUrl: 'https://api.cavuno.com',
673
673
  * board: 'pk_a8f3…',
674
674
  * });
675
675
  * const { data } = await board.jobs.list({ limit: 20 });
@@ -709,6 +709,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
709
709
  candidatePaywall: boolean;
710
710
  impressum: boolean;
711
711
  };
712
+ talentDirectoryVisibility: "off" | "public" | "employers_only";
712
713
  analytics: {
713
714
  ga4MeasurementId: string | null;
714
715
  gtmId: string | null;
@@ -738,6 +739,21 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
738
739
  [key: string]: string;
739
740
  };
740
741
  };
742
+ footer: {
743
+ description: string | null;
744
+ contactEmail: string | null;
745
+ websiteUrl: string | null;
746
+ xUrl: string | null;
747
+ facebookUrl: string | null;
748
+ linkedinUrl: string | null;
749
+ navigationOrder: string[];
750
+ customLinks: {
751
+ id: string;
752
+ label: string;
753
+ url: string;
754
+ }[];
755
+ };
756
+ themeSnapshotHash: string | null;
741
757
  }>;
742
758
  /**
743
759
  * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
@@ -1886,7 +1902,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1886
1902
  id: string;
1887
1903
  object: "alert";
1888
1904
  label: string | null;
1889
- frequency: "daily" | "weekly";
1905
+ frequency: "weekly";
1890
1906
  isActive: boolean;
1891
1907
  filters: {
1892
1908
  jobFunctions: string[];
@@ -1903,7 +1919,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1903
1919
  id: string;
1904
1920
  object: "alert";
1905
1921
  label: string | null;
1906
- frequency: "daily" | "weekly";
1922
+ frequency: "weekly";
1907
1923
  isActive: boolean;
1908
1924
  filters: {
1909
1925
  jobFunctions: string[];
@@ -1920,7 +1936,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1920
1936
  id: string;
1921
1937
  object: "alert";
1922
1938
  label: string | null;
1923
- frequency: "daily" | "weekly";
1939
+ frequency: "weekly";
1924
1940
  isActive: boolean;
1925
1941
  filters: {
1926
1942
  jobFunctions: string[];
@@ -1937,7 +1953,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1937
1953
  id: string;
1938
1954
  object: "alert";
1939
1955
  label: string | null;
1940
- frequency: "daily" | "weekly";
1956
+ frequency: "weekly";
1941
1957
  isActive: boolean;
1942
1958
  filters: {
1943
1959
  jobFunctions: string[];
@@ -2322,7 +2338,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2322
2338
  preferences: {
2323
2339
  id: string;
2324
2340
  label: string | null;
2325
- frequency: string;
2341
+ frequency: "weekly";
2326
2342
  isActive: boolean;
2327
2343
  filters: {
2328
2344
  jobFunctions?: string[];
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-Di4AV-02.js';
2
- export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCompany, J as JobSort, O as OfficeLocation, P as PublicJob, a as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-Di4AV-02.js';
3
- export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-0yI5ZRJw.js';
4
- import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-B-zJKjkk.js';
5
- export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-B-zJKjkk.js';
1
+ import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-BFLMDNEN.js';
2
+ export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCatalogPagination, m as JobCompany, J as JobSort, O as OfficeLocation, n as OffsetPagination, P as PublicJob, a as PublicJobCard, o as RelatedSearch, p as RemotePermit, q as RemoteTimezone, r as StorefrontPagination } from './jobs-BFLMDNEN.js';
3
+ export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-DsRbgz_D.js';
4
+ import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-negE75t8.js';
5
+ export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-negE75t8.js';
6
6
 
7
7
  type Awaitable<T> = T | Promise<T>;
8
8
  /**
@@ -176,7 +176,7 @@ interface Paginator<P extends PageShape> extends AsyncIterable<ItemOf<P>> {
176
176
  * an explicit sort/query — see the jobs skill.
177
177
  *
178
178
  * `offset` is honored for the FIRST page only and dropped afterwards: on
179
- * storefront reads `offset` takes precedence over `cursor`, so carrying it
179
+ * job catalog reads let `offset` take precedence over `cursor`, so carrying it
180
180
  * forward would re-serve the same page forever.
181
181
  *
182
182
  * @example
@@ -204,7 +204,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
204
204
  * constant because the package is platform-neutral and cannot read
205
205
  * package.json at runtime.
206
206
  */
207
- declare const SDK_VERSION = "1.33.1";
207
+ declare const SDK_VERSION = "1.35.0";
208
208
 
209
209
  type SavedJob = Schemas['SavedJob'];
210
210
  type SavedJobsListQuery = {
@@ -456,7 +456,7 @@ type EmbedJobsQuery = {
456
456
  cursor?: string;
457
457
  /** Default 8; values above the embed ceiling of 50 are clamped to 50. */
458
458
  limit?: number;
459
- /** Storefront page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
459
+ /** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
460
460
  offset?: number;
461
461
  /** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
462
462
  companyId?: string[];
@@ -547,7 +547,7 @@ type AccessCheckoutBody = Schemas['AccessCheckoutBody'];
547
547
  type AccessPortalBody = Schemas['AccessPortalBody'];
548
548
  type PaywallOfferListEnvelope = ListEnvelope<PaywallOffer>;
549
549
 
550
- type JobAlertFrequency = 'daily' | 'weekly';
550
+ type JobAlertFrequency = 'weekly';
551
551
  type JobAlertRemoteOption = 'on_site' | 'hybrid' | 'remote';
552
552
  /**
553
553
  * Alert filters a consumer can capture. Only `jobFunctions` (→ job categories),
@@ -646,7 +646,8 @@ type PlacesListQuery = {
646
646
  };
647
647
 
648
648
  interface CreateBoardClientOptions {
649
- baseUrl: string;
649
+ /** Cavuno API origin. Defaults to the production service. */
650
+ baseUrl?: string;
650
651
  /** Board identifier: `pk_…` key (provisioned default) | `boards_…` ID | slug. */
651
652
  board: string;
652
653
  auth?: {
@@ -669,7 +670,6 @@ interface CreateBoardClientOptions {
669
670
  * import { createBoardClient } from '@cavuno/board';
670
671
  *
671
672
  * const board = createBoardClient({
672
- * baseUrl: 'https://api.cavuno.com',
673
673
  * board: 'pk_a8f3…',
674
674
  * });
675
675
  * const { data } = await board.jobs.list({ limit: 20 });
@@ -709,6 +709,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
709
709
  candidatePaywall: boolean;
710
710
  impressum: boolean;
711
711
  };
712
+ talentDirectoryVisibility: "off" | "public" | "employers_only";
712
713
  analytics: {
713
714
  ga4MeasurementId: string | null;
714
715
  gtmId: string | null;
@@ -738,6 +739,21 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
738
739
  [key: string]: string;
739
740
  };
740
741
  };
742
+ footer: {
743
+ description: string | null;
744
+ contactEmail: string | null;
745
+ websiteUrl: string | null;
746
+ xUrl: string | null;
747
+ facebookUrl: string | null;
748
+ linkedinUrl: string | null;
749
+ navigationOrder: string[];
750
+ customLinks: {
751
+ id: string;
752
+ label: string;
753
+ url: string;
754
+ }[];
755
+ };
756
+ themeSnapshotHash: string | null;
741
757
  }>;
742
758
  /**
743
759
  * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
@@ -1886,7 +1902,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1886
1902
  id: string;
1887
1903
  object: "alert";
1888
1904
  label: string | null;
1889
- frequency: "daily" | "weekly";
1905
+ frequency: "weekly";
1890
1906
  isActive: boolean;
1891
1907
  filters: {
1892
1908
  jobFunctions: string[];
@@ -1903,7 +1919,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1903
1919
  id: string;
1904
1920
  object: "alert";
1905
1921
  label: string | null;
1906
- frequency: "daily" | "weekly";
1922
+ frequency: "weekly";
1907
1923
  isActive: boolean;
1908
1924
  filters: {
1909
1925
  jobFunctions: string[];
@@ -1920,7 +1936,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1920
1936
  id: string;
1921
1937
  object: "alert";
1922
1938
  label: string | null;
1923
- frequency: "daily" | "weekly";
1939
+ frequency: "weekly";
1924
1940
  isActive: boolean;
1925
1941
  filters: {
1926
1942
  jobFunctions: string[];
@@ -1937,7 +1953,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1937
1953
  id: string;
1938
1954
  object: "alert";
1939
1955
  label: string | null;
1940
- frequency: "daily" | "weekly";
1956
+ frequency: "weekly";
1941
1957
  isActive: boolean;
1942
1958
  filters: {
1943
1959
  jobFunctions: string[];
@@ -2322,7 +2338,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2322
2338
  preferences: {
2323
2339
  id: string;
2324
2340
  label: string | null;
2325
- frequency: string;
2341
+ frequency: "weekly";
2326
2342
  isActive: boolean;
2327
2343
  filters: {
2328
2344
  jobFunctions?: string[];
package/dist/index.js CHANGED
@@ -312,7 +312,7 @@ async function clearSession(storage) {
312
312
  }
313
313
 
314
314
  // src/version.ts
315
- var SDK_VERSION = "1.33.1";
315
+ var SDK_VERSION = "1.35.0";
316
316
 
317
317
  // src/client.ts
318
318
  function isRawBody(body) {
@@ -403,6 +403,9 @@ var BoardClient = class {
403
403
  }
404
404
  };
405
405
 
406
+ // src/constants.ts
407
+ var DEFAULT_CAVUNO_API_URL = "https://api.cavuno.com";
408
+
406
409
  // src/namespaces/auth.ts
407
410
  function authNamespace(client) {
408
411
  async function persist(session) {
@@ -1798,7 +1801,7 @@ function meNamespace(client) {
1798
1801
  *
1799
1802
  * @example
1800
1803
  * await board.me.alerts.update(alertId, {
1801
- * frequency: 'daily',
1804
+ * frequency: 'weekly',
1802
1805
  * placeIds: ['ChIJ…'],
1803
1806
  * });
1804
1807
  */
@@ -2633,7 +2636,7 @@ function resolveApplyAction(state) {
2633
2636
  // src/index.ts
2634
2637
  function createBoardClient(options) {
2635
2638
  const client = new BoardClient({
2636
- baseUrl: options.baseUrl,
2639
+ baseUrl: options.baseUrl ?? DEFAULT_CAVUNO_API_URL,
2637
2640
  board: options.board,
2638
2641
  storage: resolveStorage(options.auth?.storage, options.board),
2639
2642
  globalHeaders: options.globalHeaders,