@cavuno/board 1.25.0 → 1.27.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/README.md +88 -0
  2. package/dist/bin.mjs +67 -34
  3. package/dist/filters.d.mts +55 -0
  4. package/dist/filters.d.ts +55 -0
  5. package/dist/filters.js +193 -0
  6. package/dist/filters.mjs +170 -0
  7. package/dist/format.d.mts +240 -0
  8. package/dist/format.d.ts +240 -0
  9. package/dist/format.js +453 -0
  10. package/dist/format.mjs +430 -0
  11. package/dist/index.d.mts +81 -3965
  12. package/dist/index.d.ts +81 -3965
  13. package/dist/index.js +154 -7
  14. package/dist/index.mjs +151 -4
  15. package/dist/jobs-DK5mPBgq.d.mts +3836 -0
  16. package/dist/jobs-DK5mPBgq.d.ts +3836 -0
  17. package/dist/salaries-CXt6Vkrp.d.ts +130 -0
  18. package/dist/salaries-CrJsaZe6.d.mts +130 -0
  19. package/dist/seo.d.mts +288 -0
  20. package/dist/seo.d.ts +288 -0
  21. package/dist/seo.js +1102 -0
  22. package/dist/seo.mjs +1079 -0
  23. package/dist/sitemap.d.mts +63 -0
  24. package/dist/sitemap.d.ts +63 -0
  25. package/dist/sitemap.js +353 -0
  26. package/dist/sitemap.mjs +330 -0
  27. package/dist/theme.d.mts +63 -0
  28. package/dist/theme.d.ts +63 -0
  29. package/dist/theme.js +149 -0
  30. package/dist/theme.mjs +128 -0
  31. package/package.json +57 -2
  32. package/skills/cavuno-board-account/SKILL.md +147 -0
  33. package/skills/cavuno-board-applications/SKILL.md +110 -0
  34. package/skills/cavuno-board-blog/SKILL.md +99 -0
  35. package/skills/cavuno-board-companies/SKILL.md +99 -0
  36. package/skills/cavuno-board-filters/SKILL.md +89 -0
  37. package/skills/cavuno-board-format/SKILL.md +104 -0
  38. package/skills/cavuno-board-job-alerts/SKILL.md +115 -0
  39. package/skills/cavuno-board-job-posting/SKILL.md +130 -0
  40. package/skills/cavuno-board-jobs/SKILL.md +15 -0
  41. package/skills/cavuno-board-messaging/SKILL.md +121 -0
  42. package/skills/cavuno-board-paywall/SKILL.md +108 -0
  43. package/skills/cavuno-board-salaries/SKILL.md +87 -0
  44. package/skills/cavuno-board-seo/SKILL.md +180 -0
  45. package/skills/cavuno-board-setup/SKILL.md +26 -2
  46. package/skills/cavuno-board-sitemap/SKILL.md +147 -0
  47. package/skills/cavuno-board-smoke-test/SKILL.md +84 -0
  48. package/skills/cavuno-board-theme/SKILL.md +69 -0
  49. package/skills/manifest.json +106 -1
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: cavuno-board-theme
3
+ description: Board branding with @cavuno/board/theme — map the board's stored theme (16 semantic colors × light/dark + typography from board.context().theme) onto shadcn CSS variables, resolve the color-scheme mode, and build the Google Fonts request. Use when wiring the app shell, dark mode, or brand styling for a tenant frontend.
4
+ ---
5
+
6
+ # Theme: board branding → shadcn tokens
7
+
8
+ `@cavuno/board/theme` maps the board's stored theme onto the canonical
9
+ shadcn token vocabulary as CSS-variable overrides. One contract, two
10
+ consumers: the dashboard edits the board theme; agents restyle through the
11
+ standard shadcn theme file — both end up in the same tokens.
12
+
13
+ ## When to use
14
+
15
+ - The app shell/root layout of any tenant frontend, once.
16
+ - Wiring dark mode or brand fonts.
17
+
18
+ ## When not to use
19
+
20
+ - Component-level styling — write normal Tailwind/shadcn classes; they pick
21
+ the overridden tokens up automatically.
22
+
23
+ ## Wire it once at the shell
24
+
25
+ ```ts snippet
26
+ import { boardThemeToCss, themeMode, googleFontsUrl } from '@cavuno/board/theme';
27
+
28
+ const context = await board.context();
29
+ const css = boardThemeToCss(context.theme); // ':root {…}' + '.dark {…}'
30
+ const mode = themeMode(context.theme); // 'light' | 'dark' | 'system'
31
+ const fontsHref = googleFontsUrl(context.theme); // one <link>, or null
32
+ ```
33
+
34
+ Inject `css` in a `<style>` AFTER the static theme stylesheet so the
35
+ overrides win; render nothing when it's empty (a null theme means the app's
36
+ default theme applies untouched). Apply `mode` by toggling the `.dark`
37
+ class (`system` = follow `prefers-color-scheme`).
38
+
39
+ ## The mapping is the contract
40
+
41
+ All 16 board color keys are consumed — a coverage golden in-monorepo
42
+ asserts neither the hosted board nor this module drops one. Standard
43
+ shadcn tokens carry the core (background/foreground, card, popover,
44
+ primary, secondary, muted, accent, destructive, border, input, ring);
45
+ the four keys shadcn has no standard token for ship as
46
+ `--contrast-background`, `--contrast-foreground`, `--foreground-subtle`,
47
+ `--foreground-disabled`, plus `--foreground-error`.
48
+
49
+ ## Anti-patterns
50
+
51
+ ```ts no-check
52
+ // NEVER hardcode brand colors in components — they bypass the board theme:
53
+ <button style={{ background: '#7c3aed' }} />
54
+ // NEVER re-map theme keys ad hoc per page; the shell mapping is the single source.
55
+ // NEVER fetch fonts per-family — googleFontsUrl builds ONE deduped request.
56
+ ```
57
+
58
+ ## Out of scope — do not invent exports
59
+
60
+ No color math (hover/pressed derivation, contrast checking — the hosted
61
+ dashboard owns palette design), no per-component theme props, no CSS-in-JS
62
+ runtime. The module emits strings; the app owns injection.
63
+
64
+ ## Verify
65
+
66
+ - [ ] A board with a custom theme renders its brand color on primary
67
+ buttons and focus rings; a board without one renders the app default.
68
+ - [ ] Dark palette applies under `.dark` and `mode` drives the class.
69
+ - [ ] The Google Fonts request appears once, covering sans + heading.
@@ -1,6 +1,20 @@
1
1
  {
2
- "version": "1.25.0",
2
+ "version": "1.27.0",
3
3
  "skills": [
4
+ {
5
+ "name": "cavuno-board-account",
6
+ "description": "Candidate account self-service with the @cavuno/board SDK — me.retrieve/delete, the candidate profile (merge-patch update, handle availability), experience/education CRUD, skills/languages full-replace, avatar upload, resume upload with async parse polling, and notification preferences plus the anonymous token unsubscribe. Use when building account, profile-edit, onboarding, or notification-settings pages for a signed-in board user.",
7
+ "path": "skills/cavuno-board-account/SKILL.md",
8
+ "framework": null,
9
+ "category": "core"
10
+ },
11
+ {
12
+ "name": "cavuno-board-applications",
13
+ "description": "The native apply flow with the @cavuno/board SDK — jobs.apply (signed-in or guest), attaching a resume via jobs.uploadApplicationResume, the jobs.myApplication \"have I applied?\" check, managing submitted applications (me.applications list/retrieve/updateFacts/withdraw), and saved jobs (me.savedJobs). Use when building an apply form, an application-tracker page, or a save-job button.",
14
+ "path": "skills/cavuno-board-applications/SKILL.md",
15
+ "framework": null,
16
+ "category": "core"
17
+ },
4
18
  {
5
19
  "name": "cavuno-board-auth",
6
20
  "description": "Authenticate board users with the @cavuno/board SDK — register, login, refresh, logout, email verification and password reset. Covers bearer-JWT storage modes, the deliberate no-auto-refresh-on-401 rule (and single-flight handling), and the server-side httpOnly-cookie pattern that keeps tokens out of the browser.",
@@ -8,6 +22,13 @@
8
22
  "framework": null,
9
23
  "category": "core"
10
24
  },
25
+ {
26
+ "name": "cavuno-board-blog",
27
+ "description": "Build the blog with the @cavuno/board SDK — post archives (blog.posts.list with tagSlug/authorSlug/featured), the post page (blog.posts.retrieve + adjacent + similar), blog.tags and blog.authors, and free-text blog.search. Covers the summary-vs-detail split (html on the single read only), cursor pagination, slug-change redirects (redirected/newSlug), and the SEO fields the API actually returns.",
28
+ "path": "skills/cavuno-board-blog/SKILL.md",
29
+ "framework": null,
30
+ "category": "core"
31
+ },
11
32
  {
12
33
  "name": "cavuno-board-client",
13
34
  "description": "Create and configure the @cavuno/board client — baseUrl and the pk_ board identifier, global headers, request/response hooks, per-call FetchOptions caching passthrough, the client.fetch escape hatch, and the rule that keeps one shared instance safe under SSR.",
@@ -15,6 +36,13 @@
15
36
  "framework": null,
16
37
  "category": "core"
17
38
  },
39
+ {
40
+ "name": "cavuno-board-companies",
41
+ "description": "Build company surfaces with the @cavuno/board SDK — the companies index (companies.list / companies.search with the market filter), the company profile (companies.retrieve, listJobs, similar), the markets sub-surface (companies.markets + markets.resolve with its 308 redirectTo), and company salary pages (companies.salaries + salaries.category). Covers PublicCompany vs PublicCompanyDetail and envelope pagination.",
42
+ "path": "skills/cavuno-board-companies/SKILL.md",
43
+ "framework": null,
44
+ "category": "core"
45
+ },
18
46
  {
19
47
  "name": "cavuno-board-errors",
20
48
  "description": "Handle errors and access gating with the @cavuno/board SDK — the BoardApiError shape, the typed guards (isNotFound, isUnauthorized, isValidationError, isRateLimited, isForbidden, isConflict), and the board-password flow (isBoardPasswordRequired → password.verify → X-Board-Access grant).",
@@ -22,6 +50,34 @@
22
50
  "framework": null,
23
51
  "category": "core"
24
52
  },
53
+ {
54
+ "name": "cavuno-board-filters",
55
+ "description": "The canonical listing-filter vocabulary and URL search-param parsing with @cavuno/board/filters — remote/employment/seniority/sort sets, localized seniority labels, and parseListingFilters for jobs-listing routes. Use when building listing pages, filter sidebars, sort dropdowns, or validating listing URL params.",
56
+ "path": "skills/cavuno-board-filters/SKILL.md",
57
+ "framework": null,
58
+ "category": "core"
59
+ },
60
+ {
61
+ "name": "cavuno-board-format",
62
+ "description": "Display formatting for board frontends with @cavuno/board/format — salary ranges, seniority/employment/remote labels, location labels, dates, and the board-language salary lexicon. Use when rendering job cards, detail pages, or salary figures, and whenever a value like salaryMin/salaryTimeframe/seniority needs to become display text.",
63
+ "path": "skills/cavuno-board-format/SKILL.md",
64
+ "framework": null,
65
+ "category": "core"
66
+ },
67
+ {
68
+ "name": "cavuno-board-job-alerts",
69
+ "description": "Build job-alert flows with the @cavuno/board SDK — the anonymous double-opt-in surface (jobAlerts.subscribe/confirm/resendConfirmation + HMAC-token manage/unsubscribe/resubscribe/updatePreference/deletePreference) and the authenticated board.me.alerts CRUD. Covers which surface to use when, how the manage token rides, which filters actually scope delivery, and the full-replace update trap.",
70
+ "path": "skills/cavuno-board-job-alerts/SKILL.md",
71
+ "framework": null,
72
+ "category": "core"
73
+ },
74
+ {
75
+ "name": "cavuno-board-job-posting",
76
+ "description": "Build the anonymous \"Post a job\" funnel with the @cavuno/board SDK — jobPosting.plans, create and its status-discriminated JobPostingResult (checkout / published / pending_approval / invoice_sent), logo upload + fetchLogoByDomain, and the email-verified billing helpers (checkBilling, sendBillingVerification, getBillingOptions, checkSubscriptionEntitlements).",
77
+ "path": "skills/cavuno-board-job-posting/SKILL.md",
78
+ "framework": null,
79
+ "category": "core"
80
+ },
25
81
  {
26
82
  "name": "cavuno-board-jobs",
27
83
  "description": "Browse, search, and render jobs with the @cavuno/board SDK — jobs.list, jobs.search, jobs.retrieve, jobs.similar. Covers the slim card vs full job shapes, storefront pagination (count/limit/offset + opaque cursor), filters, and the candidate-paywall gatedCount.",
@@ -29,6 +85,34 @@
29
85
  "framework": null,
30
86
  "category": "core"
31
87
  },
88
+ {
89
+ "name": "cavuno-board-messaging",
90
+ "description": "Build the board-user messaging inbox with the @cavuno/board SDK — me.conversations (list, unreadCount, retrieve, listMessages, start, reply, markRead, archive), me.messages (edit, unsend, report), me.blocks. Covers the polled-REST contract (no realtime transport in v1), visibility-aware polling, the unread badge, and read receipts.",
91
+ "path": "skills/cavuno-board-messaging/SKILL.md",
92
+ "framework": null,
93
+ "category": "core"
94
+ },
95
+ {
96
+ "name": "cavuno-board-paywall",
97
+ "description": "Build the candidate job-access paywall with the @cavuno/board SDK — anonymous offer reads (paywall.offers), the gated browse experience (gatedCount on job lists), the embedded Stripe checkout mount kit (me.access.checkout → retrieveCheckout → grant), and the billing portal (me.access.portal for recurring grants).",
98
+ "path": "skills/cavuno-board-paywall/SKILL.md",
99
+ "framework": null,
100
+ "category": "core"
101
+ },
102
+ {
103
+ "name": "cavuno-board-salaries",
104
+ "description": "Build salary pages with the @cavuno/board SDK — salaries.titles/skills/locations (list + retrieve + cross-axis .locations/.location/.titles/.skills), salaries.companies.list. Covers the sourceSlug/canonicalSlug 308 contract, the { locale } overlay, aggregate field shapes (avg/median/percentile bands + jobCount), and why salary math must never be recomputed client-side.",
105
+ "path": "skills/cavuno-board-salaries/SKILL.md",
106
+ "framework": null,
107
+ "category": "core"
108
+ },
109
+ {
110
+ "name": "cavuno-board-seo",
111
+ "description": "Structured data + head builders for board frontends with @cavuno/board/seo — Google for Jobs JobPosting JSON-LD, breadcrumbs, blog Article/ProfilePage, salary-page Occupation/FAQ structured data, and listing <head> descriptors. Use when building a job-detail, listing, blog, or salary page and it needs JSON-LD or SEO meta tags, or whenever \"structured data\", \"rich results\", or \"Google for Jobs\" comes up.",
112
+ "path": "skills/cavuno-board-seo/SKILL.md",
113
+ "framework": null,
114
+ "category": "core"
115
+ },
32
116
  {
33
117
  "name": "cavuno-board-setup",
34
118
  "description": "End-to-end orchestrator for building a headless Cavuno job board with the @cavuno/board SDK. Start here after `npx @cavuno/board setup` copies the skills — detect the framework, wire the client, render board context, jobs browsing and detail, board-user auth and saved jobs, handle errors and access gating, then verify.",
@@ -36,12 +120,33 @@
36
120
  "framework": null,
37
121
  "category": "core"
38
122
  },
123
+ {
124
+ "name": "cavuno-board-sitemap",
125
+ "description": "Build the board's sitemap with @cavuno/board/sitemap — the hosted 8-bucket model (marketing, jobs taxonomies, job details, companies, salaries, blog), 45k chunking, XML rendering, and the buildBucketUrls walker that enumerates a board's content through the BoardSdk with the hosted SEO rules built in (feature gating, ≥5-job thin-content floor, pagination backstops). Use when adding /sitemap.xml and /sitemap/:file routes to a custom board frontend.",
126
+ "path": "skills/cavuno-board-sitemap/SKILL.md",
127
+ "framework": null,
128
+ "category": "core"
129
+ },
130
+ {
131
+ "name": "cavuno-board-smoke-test",
132
+ "description": "Runtime verification for a wired Cavuno board frontend — literal curl probes against the Board API plus per-surface behavioral checks and a mandatory production-build pass. Run after cavuno-board-setup finishes, after upgrading @cavuno/board, or whenever board wiring is suspect. Type checks are not enough for board wiring.",
133
+ "path": "skills/cavuno-board-smoke-test/SKILL.md",
134
+ "framework": null,
135
+ "category": "core"
136
+ },
39
137
  {
40
138
  "name": "cavuno-board-tanstack-start",
41
139
  "description": "TanStack-Start-on-Cloudflare-Workers reference wiring for a headless Cavuno board — SSR loaders calling @cavuno/board server-side, the session held in an __Host- httpOnly cookie owned by the app, a single-flight refresh helper, and FetchOptions cache passthrough on Workers.",
42
140
  "path": "skills/flavors/tanstack-start/SKILL.md",
43
141
  "framework": "tanstack-start",
44
142
  "category": "flavor"
143
+ },
144
+ {
145
+ "name": "cavuno-board-theme",
146
+ "description": "Board branding with @cavuno/board/theme — map the board's stored theme (16 semantic colors × light/dark + typography from board.context().theme) onto shadcn CSS variables, resolve the color-scheme mode, and build the Google Fonts request. Use when wiring the app shell, dark mode, or brand styling for a tenant frontend.",
147
+ "path": "skills/cavuno-board-theme/SKILL.md",
148
+ "framework": null,
149
+ "category": "core"
45
150
  }
46
151
  ]
47
152
  }