@cavuno/board 1.44.0 → 2.0.1

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 (84) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/CONTRIBUTING.md +25 -0
  3. package/LICENSE +21 -0
  4. package/README.md +12 -7
  5. package/SECURITY.md +28 -0
  6. package/TRADEMARKS.md +16 -0
  7. package/dist/_spec-sW85fuvT.d.mts +2731 -0
  8. package/dist/_spec-sW85fuvT.d.ts +2731 -0
  9. package/dist/bin.mjs +38 -349
  10. package/dist/{board-DZCw7A6P.d.ts → board-DKXyxwNN.d.ts} +2 -2
  11. package/dist/{board-BwFW1aU2.d.mts → board-QFeHT4UN.d.mts} +2 -2
  12. package/dist/doctor.d.mts +6 -19
  13. package/dist/doctor.d.ts +6 -19
  14. package/dist/doctor.js +38 -345
  15. package/dist/doctor.mjs +37 -344
  16. package/dist/filters.d.mts +5 -5
  17. package/dist/filters.d.ts +5 -5
  18. package/dist/format.d.mts +17 -19
  19. package/dist/format.d.ts +17 -19
  20. package/dist/go.d.mts +2 -2
  21. package/dist/go.d.ts +2 -2
  22. package/dist/go.js +1 -1
  23. package/dist/go.mjs +1 -1
  24. package/dist/index.d.mts +16 -18
  25. package/dist/index.d.ts +16 -18
  26. package/dist/index.js +39 -28
  27. package/dist/index.mjs +39 -28
  28. package/dist/{jobs-BVazo4mA.d.ts → jobs-CuRzTDb1.d.mts} +15 -13
  29. package/dist/{jobs-CSMshXGV.d.mts → jobs-DTnCZGtb.d.ts} +15 -13
  30. package/dist/paths.d.mts +6 -6
  31. package/dist/paths.d.ts +6 -6
  32. package/dist/paths.js +1 -1
  33. package/dist/paths.mjs +1 -1
  34. package/dist/roles-vY0AXhoc.d.mts +3 -3
  35. package/dist/roles-vY0AXhoc.d.ts +3 -3
  36. package/dist/route-contract.d.mts +16 -16
  37. package/dist/route-contract.d.ts +16 -16
  38. package/dist/route-contract.js +1 -1
  39. package/dist/route-contract.mjs +1 -1
  40. package/dist/{salaries-DMQsjLrV.d.ts → salaries-BOpR51Ny.d.mts} +3 -3
  41. package/dist/{salaries-IJlchnWk.d.mts → salaries-QoNpzRCT.d.ts} +3 -3
  42. package/dist/{search-B7gr_wOd.d.ts → search-B5ROY6PK.d.ts} +2 -2
  43. package/dist/{search-B6FJifRE.d.mts → search-f93nrSg3.d.mts} +2 -2
  44. package/dist/seo.d.mts +17 -18
  45. package/dist/seo.d.ts +17 -18
  46. package/dist/server.d.mts +14 -32
  47. package/dist/server.d.ts +14 -32
  48. package/dist/sitemap.d.mts +7 -7
  49. package/dist/sitemap.d.ts +7 -7
  50. package/dist/sitemap.js +4 -2
  51. package/dist/sitemap.mjs +4 -2
  52. package/dist/skills.d.mts +1 -1
  53. package/dist/skills.d.ts +1 -1
  54. package/dist/skills.js +1 -1
  55. package/dist/suggest.d.mts +2 -2
  56. package/dist/suggest.d.ts +2 -2
  57. package/dist/theme.d.mts +10 -13
  58. package/dist/theme.d.ts +10 -13
  59. package/dist/theme.js +1 -1
  60. package/dist/theme.mjs +1 -1
  61. package/dist/{ui-copy-CKfFTtLk.d.mts → ui-copy-CL-VN1xb.d.mts} +2 -3
  62. package/dist/{ui-copy-CKfFTtLk.d.ts → ui-copy-CL-VN1xb.d.ts} +2 -3
  63. package/dist/well-known.d.mts +3 -3
  64. package/dist/well-known.d.ts +3 -3
  65. package/dist/well-known.js +1 -1
  66. package/dist/well-known.mjs +1 -1
  67. package/package.json +46 -38
  68. package/skills/cavuno-board-client/SKILL.md +1 -2
  69. package/skills/cavuno-board-filters/SKILL.md +2 -2
  70. package/skills/cavuno-board-format/SKILL.md +1 -1
  71. package/skills/cavuno-board-i18n/SKILL.md +3 -3
  72. package/skills/cavuno-board-job-posting/SKILL.md +1 -1
  73. package/skills/cavuno-board-messaging/SKILL.md +2 -3
  74. package/skills/cavuno-board-paywall/SKILL.md +1 -1
  75. package/skills/cavuno-board-salaries/SKILL.md +1 -1
  76. package/skills/cavuno-board-seo/SKILL.md +4 -6
  77. package/skills/cavuno-board-server/SKILL.md +1 -1
  78. package/skills/cavuno-board-setup/SKILL.md +2 -1
  79. package/skills/cavuno-board-sitemap/SKILL.md +1 -1
  80. package/skills/cavuno-board-smoke-test/SKILL.md +4 -13
  81. package/skills/flavors/tanstack-start/SKILL.md +1 -2
  82. package/skills/manifest.json +1 -1
  83. package/dist/_spec-CoL3oYpG.d.mts +0 -5296
  84. package/dist/_spec-CoL3oYpG.d.ts +0 -5296
@@ -11,13 +11,13 @@ declare function classifyRoutes(routes: RouteEntry[], markers?: ReadonlyMap<stri
11
11
 
12
12
  /**
13
13
  * Classify routes and emit a ManifestV1 plus publish-gate signals.
14
- * Assigned templates are self-validated via checkRoleTemplate (F1);
14
+ * Assigned templates are self-validated via checkRoleTemplate;
15
15
  * failing required roles land in blockingMissing; failing optionals warn.
16
16
  */
17
17
  declare function compileManifest(routes: RouteEntry[], markers?: ReadonlyMap<string, RouteRole>): CompileResult;
18
18
 
19
19
  /**
20
- * LNK-06 — compile a ManifestV1 from a workspace file tree already in
20
+ * — compile a ManifestV1 from a workspace file tree already in
21
21
  * memory (candidate verification). Pure: no IO.
22
22
  */
23
23
 
@@ -36,7 +36,7 @@ declare function compileManifestFromTree(files: ReadonlyArray<TreeFile>): Compil
36
36
  * Tolerant parse of `export const cavunoPage = '<role>'` (single or double
37
37
  * quotes; optional `as const`). Accepts camelCase roles and their kebab-case
38
38
  * aliases (`job-detail` → `jobDetail`). Returns null when absent or when the
39
- * string is not a known RouteRole (ADR-0090 D6 escape hatch).
39
+ * string is not a known RouteRole.
40
40
  */
41
41
  declare function extractCavunoPageMarker(contents: string): RouteRole | null;
42
42
 
@@ -70,7 +70,7 @@ declare function checkRoleTemplate(role: RouteRole, template: string): ValidateM
70
70
  declare function validateManifest(value: unknown): ValidateManifestResult;
71
71
 
72
72
  /**
73
- * Platform resolution overlay (ADR-0090 D3 / LNK-07).
73
+ * Platform resolution overlay.
74
74
  *
75
75
  * Pure + isomorphic: role + params + precedence layers → board path.
76
76
  * Imports only sibling route-contract / paths modules.
@@ -92,7 +92,7 @@ declare function createBoardLinkResolver(layers: readonly ManifestLayer[]): {
92
92
  };
93
93
 
94
94
  /**
95
- * LNK-10 — pure history path matching for hosted rename 301s (ADR-0090 D7).
95
+ * — pure history path matching for hosted rename 301s.
96
96
  *
97
97
  * Segment-wise matcher (no RegExp construction from templates). Templates
98
98
  * are validated at write time but stay defensive here: any segment that
@@ -131,7 +131,7 @@ type HistoryMatchResult = {
131
131
  declare function matchPathAgainstHistory(entries: readonly HistoryMatchEntry[], pathname: string): HistoryMatchResult | null;
132
132
 
133
133
  /**
134
- * LNK-02 — shared types for the route-derivation adapter registry.
134
+ * — shared types for the route-derivation adapter registry.
135
135
  */
136
136
  type DerivedRoute = {
137
137
  path: string;
@@ -151,7 +151,7 @@ type FrameworkId = 'tanstack' | 'next' | 'astro' | 'sveltekit' | 'nuxt' | 'react
151
151
  *
152
152
  * The marker-less TanStack heuristic (any src/routes/*.tsx|jsx) runs LAST
153
153
  * among framework checks so a Next/Astro/SvelteKit/Nuxt repo with a stray
154
- * src/routes helper is never misclassified (F1).
154
+ * src/routes helper is never misclassified.
155
155
  */
156
156
 
157
157
  declare function detectFramework(paths: string[]): FrameworkId | null;
@@ -159,8 +159,8 @@ declare function detectFramework(paths: string[]): FrameworkId | null;
159
159
  /**
160
160
  * react-router pure parsers over provided FILE CONTENTS.
161
161
  *
162
- * Content-fetch is intentionally NOT wired into the navigator UI —
163
- * LNK-02 only exposes these functions; UI wiring is a later ticket.
162
+ * Content-fetch is intentionally not supported into the navigator UI —
163
+ * only exposes these functions; UI wiring is a future release.
164
164
  */
165
165
 
166
166
  /**
@@ -177,7 +177,7 @@ declare function parseReactRouterRoutes(contents: string[]): DerivedRoute[];
177
177
 
178
178
  /**
179
179
  * TanStack Start / TanStack Router file-based route conventions under
180
- * `src/routes/`. Behavior preserved exactly from the CHR-03 parser.
180
+ * `src/routes/`. Behavior preserved exactly from the parser.
181
181
  *
182
182
  * - `index` → parent path (`src/routes/index.tsx` → `/`)
183
183
  * - dots nest (`jobs.index.tsx` → `/jobs`)
@@ -208,7 +208,7 @@ declare function parseNextRoutes(paths: string[]): DerivedRoute[];
208
208
  * when the tree has astro.config.* and no src/pages/ (srcDir-customized).
209
209
  * Page extensions: .astro / .md / .mdx / .html.
210
210
  * Skip _-prefixed and .../api/. Index collapses.
211
- * [param]→:param, [...slug]→*, [[...slug]]→* (F5).
211
+ * [param]→:param, [...slug]→*, [[...slug]]→*.
212
212
  */
213
213
 
214
214
  declare function parseAstroRoutes(paths: string[]): DerivedRoute[];
@@ -217,7 +217,7 @@ declare function parseAstroRoutes(paths: string[]): DerivedRoute[];
217
217
  * SvelteKit file-based routing: src/routes/.../+page.svelte
218
218
  * and layout-reset +page@*.svelte only.
219
219
  * (group) stripped, [param]→:param, [[...rest]]→*, dynamic ⇒ navigable false.
220
- * +page.ts / +page.server.ts are load modules and derive nothing (F4).
220
+ * +page.ts / +page.server.ts are load modules and derive nothing.
221
221
  */
222
222
 
223
223
  declare function parseSvelteKitRoutes(paths: string[]): DerivedRoute[];
@@ -231,7 +231,7 @@ declare function parseSvelteKitRoutes(paths: string[]): DerivedRoute[];
231
231
  declare function parseNuxtRoutes(paths: string[]): DerivedRoute[];
232
232
 
233
233
  /**
234
- * LNK-02 — framework adapter registry entry.
234
+ * — framework adapter registry entry.
235
235
  *
236
236
  * Detects the framework from a path listing, dispatches to the matching
237
237
  * pure parser, returns DerivedRoute[] (path + navigable). Unknown → [].
@@ -239,18 +239,18 @@ declare function parseNuxtRoutes(paths: string[]): DerivedRoute[];
239
239
  * react-router content parsers are exported for later UI wiring; the
240
240
  * path-only deriveRoutes entry returns [] for react-router-only trees.
241
241
  *
242
- * LNK-06: enumerateRouteEntries keeps sourcePath for marker harvest +
242
+ *enumerateRouteEntries keeps sourcePath for marker harvest +
243
243
  * compileManifest; deriveRoutes strips it so the navigator contract is
244
244
  * unchanged (path + navigable only).
245
245
  */
246
246
 
247
247
  /**
248
- * Navigator contract: path + navigable only (CHR-03 / LNK-02 stable).
248
+ * Navigator contract: path + navigable only.
249
249
  * sourcePath is intentionally stripped so existing equality fixtures hold.
250
250
  */
251
251
  declare function deriveRoutes(paths: string[]): DerivedRoute[];
252
252
  /**
253
- * LNK-06 compile path: URL template + sourcePath for marker harvest.
253
+ * compile path: URL template + sourcePath for marker harvest.
254
254
  */
255
255
  declare function enumerateRouteEntries(paths: string[]): RouteEntry[];
256
256
 
@@ -108,7 +108,7 @@ var BOARD_PATHS = {
108
108
  talent: "/talent",
109
109
  employers: "/employers",
110
110
  /**
111
- * Alert-email surfaces (ADR-0090 D1/D4). Promoted out of raw literals in
111
+ * Alert-email surfaces. Promoted out of raw literals in
112
112
  * the job-alerts composer so /go indirection and email composition share
113
113
  * one definition.
114
114
  */
@@ -56,7 +56,7 @@ var BOARD_PATHS = {
56
56
  talent: "/talent",
57
57
  employers: "/employers",
58
58
  /**
59
- * Alert-email surfaces (ADR-0090 D1/D4). Promoted out of raw literals in
59
+ * Alert-email surfaces. Promoted out of raw literals in
60
60
  * the job-alerts composer so /go indirection and email composition share
61
61
  * one definition.
62
62
  */
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-CoL3oYpG.js';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-BVazo4mA.js';
1
+ import { S as Schemas } from './_spec-sW85fuvT.mjs';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-CuRzTDb1.mjs';
3
3
 
4
4
  /** Author shape embedded on posts (no `object` discriminator). */
5
5
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -33,7 +33,7 @@ type CompanyMarketRef = Schemas['CompanyMarketRef'];
33
33
  /** The company DETAIL shape — `PublicCompany` plus `markets` (detail-only). */
34
34
  type PublicCompanyDetail = Schemas['CompanyPublicDetail'];
35
35
  /**
36
- * A company's salary overview (ADR-0046): overall pay, by-seniority rows vs the
36
+ * A company's salary overview: overall pay, by-seniority rows vs the
37
37
  * board baseline, top competitors, top locations, and a per-category summary.
38
38
  * Names are board-language localized; the company slug/name are not.
39
39
  */
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-CoL3oYpG.mjs';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-CSMshXGV.mjs';
1
+ import { S as Schemas } from './_spec-sW85fuvT.js';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-DTnCZGtb.js';
3
3
 
4
4
  /** Author shape embedded on posts (no `object` discriminator). */
5
5
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -33,7 +33,7 @@ type CompanyMarketRef = Schemas['CompanyMarketRef'];
33
33
  /** The company DETAIL shape — `PublicCompany` plus `markets` (detail-only). */
34
34
  type PublicCompanyDetail = Schemas['CompanyPublicDetail'];
35
35
  /**
36
- * A company's salary overview (ADR-0046): overall pay, by-seniority rows vs the
36
+ * A company's salary overview: overall pay, by-seniority rows vs the
37
37
  * board baseline, top competitors, top locations, and a per-category summary.
38
38
  * Names are board-language localized; the company slug/name are not.
39
39
  */
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-CoL3oYpG.js';
1
+ import { S as Schemas } from './_spec-sW85fuvT.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -42,7 +42,7 @@ type FetchOptions = Omit<RequestInit, 'body'> & {
42
42
  };
43
43
  interface BoardClientOptions {
44
44
  baseUrl: string;
45
- /** Board identifier: `pk_…` key | `boards_…` ID | slug (ADR-0032). */
45
+ /** Board identifier: `pk_…` key | `boards_…` ID | slug. */
46
46
  board: string;
47
47
  storage: CustomStorage;
48
48
  globalHeaders?: Record<string, string>;
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-CoL3oYpG.mjs';
1
+ import { S as Schemas } from './_spec-sW85fuvT.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -42,7 +42,7 @@ type FetchOptions = Omit<RequestInit, 'body'> & {
42
42
  };
43
43
  interface BoardClientOptions {
44
44
  baseUrl: string;
45
- /** Board identifier: `pk_…` key | `boards_…` ID | slug (ADR-0032). */
45
+ /** Board identifier: `pk_…` key | `boards_…` ID | slug. */
46
46
  board: string;
47
47
  storage: CustomStorage;
48
48
  globalHeaders?: Record<string, string>;
package/dist/seo.d.mts CHANGED
@@ -1,20 +1,20 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-IJlchnWk.mjs';
2
- import { P as PublicBoard } from './board-BwFW1aU2.mjs';
3
- import { P as PublicJob } from './jobs-CSMshXGV.mjs';
4
- import { B as BoardLabelOverrides } from './ui-copy-CKfFTtLk.mjs';
5
- import './_spec-CoL3oYpG.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-BOpR51Ny.mjs';
2
+ import { P as PublicBoard } from './board-QFeHT4UN.mjs';
3
+ import { P as PublicJob } from './jobs-CuRzTDb1.mjs';
4
+ import { B as BoardLabelOverrides } from './ui-copy-CL-VN1xb.mjs';
5
+ import './_spec-sW85fuvT.mjs';
6
6
 
7
7
  /**
8
8
  * Google for Jobs `JobPosting` structured data on the `@cavuno/board` wire
9
9
  * types, transcribed field-by-field from the hosted board's generator
10
- * (`_lib/job-posting-json-ld.ts` + `job-posting-location-json-ld.ts`) and
11
- * golden-tested against it in-monorepo (ADR-0057).
10
+ * (the hosted board implementation + `job-posting-location-json-ld.ts`) and
11
+ * tested against the hosted behavior.
12
12
  *
13
13
  * JSON-LD structure is locale-neutral per schema.org — no board-language
14
14
  * parameter here; the only display strings are wire values passed through.
15
15
  *
16
16
  * Named exclusions (hosted behaviours with no wire twin, recorded in the
17
- * parity ledger):
17
+ * public API contract):
18
18
  * - `board.companyLegalName` — hosted falls back to it for the
19
19
  * organization name between `company.name` and `board.name`; the wire
20
20
  * board context does not expose it.
@@ -33,9 +33,8 @@ type JsonLdBoard = Pick<PublicBoard, 'name' | 'logoUrl'>;
33
33
  * next to TELECOMMUTE (Google requires a location signal), so the hosted
34
34
  * board — and this transcription — lists every country it recognises.
35
35
  *
36
- * This is the hosted board's exact country catalog (`@kit/data-remote`
37
- * `COUNTRIES`, built from `world-countries`): sorted by English common
38
- * name, includes `XK` (Kosovo), excludes `KP` (North Korea). Golden-tested
36
+ * This is the hosted board's exact country catalog: sorted by English common
37
+ * name, includes `XK` (Kosovo), and excludes `KP` (North Korea). tested
39
38
  * against the hosted list so the two cannot drift.
40
39
  */
41
40
  declare const ALL_COUNTRY_CODES: readonly ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", "BW", "BV", "BR", "IO", "VG", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "BQ", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CK", "CR", "HR", "CU", "CW", "CY", "CZ", "DK", "DJ", "DM", "DO", "CD", "EC", "EG", "SV", "GQ", "ER", "EE", "SZ", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "CI", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "XK", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "NL", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MK", "MP", "NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "CG", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SX", "SK", "SI", "SB", "SO", "ZA", "GS", "KR", "SS", "ES", "LK", "SD", "SR", "SJ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "VI", "UY", "UZ", "VU", "VA", "VE", "VN", "WF", "EH", "YE", "ZM", "ZW"];
@@ -58,9 +57,9 @@ declare function normalizeWebsiteUrl(website: string): string | null;
58
57
 
59
58
  /**
60
59
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
61
- * the hosted board's builders (`blog/_lib/server/blog-json-ld.ts`:
62
- * `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and golden-tested
63
- * against them in-monorepo (ADR-0057).
60
+ * the hosted board's builders (the hosted board implementation:
61
+ * `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and tested
62
+ * against them .
64
63
  *
65
64
  * JSON-LD structure is locale-neutral — no board-language parameter; every
66
65
  * display string is a wire value (or caller copy) passed through.
@@ -78,7 +77,7 @@ type ArticleJsonLdPost = Pick<PublicBlogPostSummary, 'title' | 'customExcerpt' |
78
77
  * `image` follows the hosted precedence: the post's cover (feature) image
79
78
  * first, then `ogImageUrl` — pass your page's OG image URL (hosted passes
80
79
  * its generated `/blog/:slug/og` card; OG generation itself is app-owned
81
- * per ADR-0039).
80
+ * per ).
82
81
  */
83
82
  declare function createBlogArticleJsonLd({ post, boardName, permalink, ogImageUrl, }: {
84
83
  post: ArticleJsonLdPost;
@@ -132,7 +131,7 @@ declare function createBreadcrumbJsonLd(items: BreadcrumbItemInput[], options?:
132
131
  * page.tsx:336-367.
133
132
  *
134
133
  * The Home/Jobs crumb names resolve from the copy catalog per board
135
- * language ⊕ operator overrides (ADR-0059); omitting `language` keeps the
134
+ * language ⊕ operator overrides; omitting `language` keeps the
136
135
  * English source, so existing call sites render unchanged.
137
136
  */
138
137
  declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?: BoardLabelOverrides): Array<{
@@ -142,7 +141,7 @@ declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?:
142
141
 
143
142
  /**
144
143
  * Framework-neutral `<head>` + structural JSON-LD builders for jobs-listing
145
- * pages (ADR-0057). Locale-neutral pass-through: the caller supplies the
144
+ * pages. Locale-neutral pass-through: the caller supplies the
146
145
  * heading/board copy (title/description COPY is board-SEO-config +
147
146
  * localized — a named exclusion; these builders replicate the hosted
148
147
  * STRUCTURE: title with result count, canonical, Open Graph, breadcrumb +
@@ -219,7 +218,7 @@ declare function formatRange(locale: string, min: number, max: number): string;
219
218
  /**
220
219
  * Seniority display label. Precedence (hosted shape): owner override >
221
220
  * board-language lexicon (en = the English source labels) > title-case
222
- * fallback for an unknown key (CAV-352 / 9b).
221
+ * fallback for an unknown key.
223
222
  */
224
223
  declare function formatSeniority(locale: string, value: string, overrides?: Record<string, string>): string;
225
224
  /** The canonical seniority ladder order the hosted salary pages sort by. */
package/dist/seo.d.ts CHANGED
@@ -1,20 +1,20 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-DMQsjLrV.js';
2
- import { P as PublicBoard } from './board-DZCw7A6P.js';
3
- import { P as PublicJob } from './jobs-BVazo4mA.js';
4
- import { B as BoardLabelOverrides } from './ui-copy-CKfFTtLk.js';
5
- import './_spec-CoL3oYpG.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-QoNpzRCT.js';
2
+ import { P as PublicBoard } from './board-DKXyxwNN.js';
3
+ import { P as PublicJob } from './jobs-DTnCZGtb.js';
4
+ import { B as BoardLabelOverrides } from './ui-copy-CL-VN1xb.js';
5
+ import './_spec-sW85fuvT.js';
6
6
 
7
7
  /**
8
8
  * Google for Jobs `JobPosting` structured data on the `@cavuno/board` wire
9
9
  * types, transcribed field-by-field from the hosted board's generator
10
- * (`_lib/job-posting-json-ld.ts` + `job-posting-location-json-ld.ts`) and
11
- * golden-tested against it in-monorepo (ADR-0057).
10
+ * (the hosted board implementation + `job-posting-location-json-ld.ts`) and
11
+ * tested against the hosted behavior.
12
12
  *
13
13
  * JSON-LD structure is locale-neutral per schema.org — no board-language
14
14
  * parameter here; the only display strings are wire values passed through.
15
15
  *
16
16
  * Named exclusions (hosted behaviours with no wire twin, recorded in the
17
- * parity ledger):
17
+ * public API contract):
18
18
  * - `board.companyLegalName` — hosted falls back to it for the
19
19
  * organization name between `company.name` and `board.name`; the wire
20
20
  * board context does not expose it.
@@ -33,9 +33,8 @@ type JsonLdBoard = Pick<PublicBoard, 'name' | 'logoUrl'>;
33
33
  * next to TELECOMMUTE (Google requires a location signal), so the hosted
34
34
  * board — and this transcription — lists every country it recognises.
35
35
  *
36
- * This is the hosted board's exact country catalog (`@kit/data-remote`
37
- * `COUNTRIES`, built from `world-countries`): sorted by English common
38
- * name, includes `XK` (Kosovo), excludes `KP` (North Korea). Golden-tested
36
+ * This is the hosted board's exact country catalog: sorted by English common
37
+ * name, includes `XK` (Kosovo), and excludes `KP` (North Korea). tested
39
38
  * against the hosted list so the two cannot drift.
40
39
  */
41
40
  declare const ALL_COUNTRY_CODES: readonly ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", "BW", "BV", "BR", "IO", "VG", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "BQ", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CK", "CR", "HR", "CU", "CW", "CY", "CZ", "DK", "DJ", "DM", "DO", "CD", "EC", "EG", "SV", "GQ", "ER", "EE", "SZ", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "CI", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "XK", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "NL", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MK", "MP", "NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "CG", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SX", "SK", "SI", "SB", "SO", "ZA", "GS", "KR", "SS", "ES", "LK", "SD", "SR", "SJ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "VI", "UY", "UZ", "VU", "VA", "VE", "VN", "WF", "EH", "YE", "ZM", "ZW"];
@@ -58,9 +57,9 @@ declare function normalizeWebsiteUrl(website: string): string | null;
58
57
 
59
58
  /**
60
59
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
61
- * the hosted board's builders (`blog/_lib/server/blog-json-ld.ts`:
62
- * `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and golden-tested
63
- * against them in-monorepo (ADR-0057).
60
+ * the hosted board's builders (the hosted board implementation:
61
+ * `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and tested
62
+ * against them .
64
63
  *
65
64
  * JSON-LD structure is locale-neutral — no board-language parameter; every
66
65
  * display string is a wire value (or caller copy) passed through.
@@ -78,7 +77,7 @@ type ArticleJsonLdPost = Pick<PublicBlogPostSummary, 'title' | 'customExcerpt' |
78
77
  * `image` follows the hosted precedence: the post's cover (feature) image
79
78
  * first, then `ogImageUrl` — pass your page's OG image URL (hosted passes
80
79
  * its generated `/blog/:slug/og` card; OG generation itself is app-owned
81
- * per ADR-0039).
80
+ * per ).
82
81
  */
83
82
  declare function createBlogArticleJsonLd({ post, boardName, permalink, ogImageUrl, }: {
84
83
  post: ArticleJsonLdPost;
@@ -132,7 +131,7 @@ declare function createBreadcrumbJsonLd(items: BreadcrumbItemInput[], options?:
132
131
  * page.tsx:336-367.
133
132
  *
134
133
  * The Home/Jobs crumb names resolve from the copy catalog per board
135
- * language ⊕ operator overrides (ADR-0059); omitting `language` keeps the
134
+ * language ⊕ operator overrides; omitting `language` keeps the
136
135
  * English source, so existing call sites render unchanged.
137
136
  */
138
137
  declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?: BoardLabelOverrides): Array<{
@@ -142,7 +141,7 @@ declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?:
142
141
 
143
142
  /**
144
143
  * Framework-neutral `<head>` + structural JSON-LD builders for jobs-listing
145
- * pages (ADR-0057). Locale-neutral pass-through: the caller supplies the
144
+ * pages. Locale-neutral pass-through: the caller supplies the
146
145
  * heading/board copy (title/description COPY is board-SEO-config +
147
146
  * localized — a named exclusion; these builders replicate the hosted
148
147
  * STRUCTURE: title with result count, canonical, Open Graph, breadcrumb +
@@ -219,7 +218,7 @@ declare function formatRange(locale: string, min: number, max: number): string;
219
218
  /**
220
219
  * Seniority display label. Precedence (hosted shape): owner override >
221
220
  * board-language lexicon (en = the English source labels) > title-case
222
- * fallback for an unknown key (CAV-352 / 9b).
221
+ * fallback for an unknown key.
223
222
  */
224
223
  declare function formatSeniority(locale: string, value: string, overrides?: Record<string, string>): string;
225
224
  /** The canonical seniority ladder order the hosted salary pages sort by. */
package/dist/server.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-CoL3oYpG.mjs';
3
- import './search-B6FJifRE.mjs';
4
- import './board-BwFW1aU2.mjs';
5
- import './jobs-CSMshXGV.mjs';
6
- import './salaries-IJlchnWk.mjs';
2
+ import './_spec-sW85fuvT.mjs';
3
+ import './search-f93nrSg3.mjs';
4
+ import './board-QFeHT4UN.mjs';
5
+ import './jobs-CuRzTDb1.mjs';
6
+ import './salaries-BOpR51Ny.mjs';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -11,7 +11,7 @@ import './salaries-IJlchnWk.mjs';
11
11
  * STRINGS (`Set-Cookie` values / `Cookie` headers), never framework response
12
12
  * objects. The session is the SDK bearer pair plus the access-token expiry;
13
13
  * it lives in ONE httpOnly cookie owned by the host app (the SDK never sees
14
- * storage on the server — ADR-0006).
14
+ * storage on the server — ).
15
15
  */
16
16
  interface BoardSession {
17
17
  accessToken: string;
@@ -59,7 +59,7 @@ declare function parseGrantCookie(cookieHeader: string | null, options?: {
59
59
  /**
60
60
  * Open-redirect guards — pure URL-safety logic (no cookies involved),
61
61
  * transcribed from the hosted board's `validate-redirect-path.ts` and
62
- * golden-tested against it input-for-input.
62
+ * tested against it input-for-input.
63
63
  */
64
64
  /**
65
65
  * Guard a `?redirect=` / `?next=` param: a same-origin absolute path only
@@ -78,31 +78,13 @@ declare function safeRedirectPath(path: string | undefined | null, defaultPath?:
78
78
  declare function currentPathFromReferer(referer: string | null): string;
79
79
 
80
80
  /**
81
- * MIG-10 (added scope) — keep `<slug>.cavuno.app` live after a custom-domain
82
- * cutover by 308-redirecting to the board's canonical custom domain.
81
+ * Keep `<slug>.cavuno.app` working after a custom-domain cutover by
82
+ * 308-redirecting to the board's canonical custom domain.
83
83
  *
84
- * ## Where this lives (DEVIATION LOUDLY)
85
- * **Serving-side, not the dispatch edge.** Production hostname→worker
86
- * routing is the WFP dispatch Worker's KV map (`hostname → workerName`
87
- * only — see `docs/recipes/ops/wfp-dispatch-custom-domain.md` and
88
- * `createWfpReleaseDeploy` / `deterministicWorkerName`). That edge has
89
- * **no board domain data** (no Convex, no primaryDomain). Inventing a
90
- * second edge datastore for canonical hosts is forbidden by the ticket.
91
- *
92
- * Data source: the board's public context already carries
93
- * `primaryDomain: string | null` (`GET /v1/boards/:id` via
94
- * `serializeBoardContext`). The starter loads context for every request
95
- * (theme, features, analytics) — reuse that field. When `primaryDomain`
96
- * is set, a request whose Host is a `*.cavuno.app` serving host 308s to
97
- * `https://<primaryDomain><path+query>` in **one hop**. Domainless boards
98
- * (`primaryDomain === null`) keep **serving** from cavuno.app (no redirect).
99
- *
100
- * Wire this helper into the starter's root middleware / entry (the
101
- * migration starter's host check) with `Response.redirect(url, 308)`.
102
- * Pure so unit tests pin behaviour without a Worker runtime.
103
- *
104
- * Pattern: Vercel `*.vercel.app` / GitHub `github.io` permanent fallback
105
- * origin — SEO-neutral 308 to the canonical production host.
84
+ * Pass `primaryDomain` from the public board context. When it is set, a
85
+ * request to a `*.cavuno.app` serving host redirects in one hop while
86
+ * preserving the path and query. A board without a custom domain keeps
87
+ * serving from its cavuno.app hostname.
106
88
  */
107
89
  /**
108
90
  * True when the request host is a cavuno.app board-serving host
@@ -129,7 +111,7 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
129
111
 
130
112
  /**
131
113
  * Single-flight session refresh — dedupes concurrent refreshes for the same
132
- * session WITHIN one process/isolate (the rotation race, ADR-0057 wart #4,
114
+ * session WITHIN one process/isolate (the rotation race, ,
133
115
  * mitigated at the one layer a client library can reach).
134
116
  *
135
117
  * Refresh tokens are single-use: two concurrent refreshes for the same
package/dist/server.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-CoL3oYpG.js';
3
- import './search-B7gr_wOd.js';
4
- import './board-DZCw7A6P.js';
5
- import './jobs-BVazo4mA.js';
6
- import './salaries-DMQsjLrV.js';
2
+ import './_spec-sW85fuvT.js';
3
+ import './search-B5ROY6PK.js';
4
+ import './board-DKXyxwNN.js';
5
+ import './jobs-DTnCZGtb.js';
6
+ import './salaries-QoNpzRCT.js';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -11,7 +11,7 @@ import './salaries-DMQsjLrV.js';
11
11
  * STRINGS (`Set-Cookie` values / `Cookie` headers), never framework response
12
12
  * objects. The session is the SDK bearer pair plus the access-token expiry;
13
13
  * it lives in ONE httpOnly cookie owned by the host app (the SDK never sees
14
- * storage on the server — ADR-0006).
14
+ * storage on the server — ).
15
15
  */
16
16
  interface BoardSession {
17
17
  accessToken: string;
@@ -59,7 +59,7 @@ declare function parseGrantCookie(cookieHeader: string | null, options?: {
59
59
  /**
60
60
  * Open-redirect guards — pure URL-safety logic (no cookies involved),
61
61
  * transcribed from the hosted board's `validate-redirect-path.ts` and
62
- * golden-tested against it input-for-input.
62
+ * tested against it input-for-input.
63
63
  */
64
64
  /**
65
65
  * Guard a `?redirect=` / `?next=` param: a same-origin absolute path only
@@ -78,31 +78,13 @@ declare function safeRedirectPath(path: string | undefined | null, defaultPath?:
78
78
  declare function currentPathFromReferer(referer: string | null): string;
79
79
 
80
80
  /**
81
- * MIG-10 (added scope) — keep `<slug>.cavuno.app` live after a custom-domain
82
- * cutover by 308-redirecting to the board's canonical custom domain.
81
+ * Keep `<slug>.cavuno.app` working after a custom-domain cutover by
82
+ * 308-redirecting to the board's canonical custom domain.
83
83
  *
84
- * ## Where this lives (DEVIATION LOUDLY)
85
- * **Serving-side, not the dispatch edge.** Production hostname→worker
86
- * routing is the WFP dispatch Worker's KV map (`hostname → workerName`
87
- * only — see `docs/recipes/ops/wfp-dispatch-custom-domain.md` and
88
- * `createWfpReleaseDeploy` / `deterministicWorkerName`). That edge has
89
- * **no board domain data** (no Convex, no primaryDomain). Inventing a
90
- * second edge datastore for canonical hosts is forbidden by the ticket.
91
- *
92
- * Data source: the board's public context already carries
93
- * `primaryDomain: string | null` (`GET /v1/boards/:id` via
94
- * `serializeBoardContext`). The starter loads context for every request
95
- * (theme, features, analytics) — reuse that field. When `primaryDomain`
96
- * is set, a request whose Host is a `*.cavuno.app` serving host 308s to
97
- * `https://<primaryDomain><path+query>` in **one hop**. Domainless boards
98
- * (`primaryDomain === null`) keep **serving** from cavuno.app (no redirect).
99
- *
100
- * Wire this helper into the starter's root middleware / entry (the
101
- * migration starter's host check) with `Response.redirect(url, 308)`.
102
- * Pure so unit tests pin behaviour without a Worker runtime.
103
- *
104
- * Pattern: Vercel `*.vercel.app` / GitHub `github.io` permanent fallback
105
- * origin — SEO-neutral 308 to the canonical production host.
84
+ * Pass `primaryDomain` from the public board context. When it is set, a
85
+ * request to a `*.cavuno.app` serving host redirects in one hop while
86
+ * preserving the path and query. A board without a custom domain keeps
87
+ * serving from its cavuno.app hostname.
106
88
  */
107
89
  /**
108
90
  * True when the request host is a cavuno.app board-serving host
@@ -129,7 +111,7 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
129
111
 
130
112
  /**
131
113
  * Single-flight session refresh — dedupes concurrent refreshes for the same
132
- * session WITHIN one process/isolate (the rotation race, ADR-0057 wart #4,
114
+ * session WITHIN one process/isolate (the rotation race, ,
133
115
  * mitigated at the one layer a client library can reach).
134
116
  *
135
117
  * Refresh tokens are single-use: two concurrent refreshes for the same
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-CoL3oYpG.mjs';
3
- import './search-B6FJifRE.mjs';
4
- import './board-BwFW1aU2.mjs';
5
- import './jobs-CSMshXGV.mjs';
6
- import './salaries-IJlchnWk.mjs';
2
+ import './_spec-sW85fuvT.mjs';
3
+ import './search-f93nrSg3.mjs';
4
+ import './board-QFeHT4UN.mjs';
5
+ import './jobs-CuRzTDb1.mjs';
6
+ import './salaries-BOpR51Ny.mjs';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -14,8 +14,8 @@ import './salaries-IJlchnWk.mjs';
14
14
  *
15
15
  * The XML byte layout transcribes the hosted serializers
16
16
  * (`sitemap-xml.utils.ts` — `serializeBoardSitemap` /
17
- * `serializeBoardSitemapIndex`) and is golden-tested byte-equal against
18
- * them in-monorepo. `changefreq`/`priority` are deliberately not supported:
17
+ * `serializeBoardSitemapIndex`) and is tested byte-equal against
18
+ * them . `changefreq`/`priority` are deliberately not supported:
19
19
  * the hosted builders never emit them.
20
20
  *
21
21
  * Network enumeration lives in `walker.ts`; this module is pure so the
package/dist/sitemap.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-CoL3oYpG.js';
3
- import './search-B7gr_wOd.js';
4
- import './board-DZCw7A6P.js';
5
- import './jobs-BVazo4mA.js';
6
- import './salaries-DMQsjLrV.js';
2
+ import './_spec-sW85fuvT.js';
3
+ import './search-B5ROY6PK.js';
4
+ import './board-DKXyxwNN.js';
5
+ import './jobs-DTnCZGtb.js';
6
+ import './salaries-QoNpzRCT.js';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -14,8 +14,8 @@ import './salaries-DMQsjLrV.js';
14
14
  *
15
15
  * The XML byte layout transcribes the hosted serializers
16
16
  * (`sitemap-xml.utils.ts` — `serializeBoardSitemap` /
17
- * `serializeBoardSitemapIndex`) and is golden-tested byte-equal against
18
- * them in-monorepo. `changefreq`/`priority` are deliberately not supported:
17
+ * `serializeBoardSitemapIndex`) and is tested byte-equal against
18
+ * them . `changefreq`/`priority` are deliberately not supported:
19
19
  * the hosted builders never emit them.
20
20
  *
21
21
  * Network enumeration lives in `walker.ts`; this module is pure so the
package/dist/sitemap.js CHANGED
@@ -222,7 +222,7 @@ var BOARD_PATHS = {
222
222
  talent: "/talent",
223
223
  employers: "/employers",
224
224
  /**
225
- * Alert-email surfaces (ADR-0090 D1/D4). Promoted out of raw literals in
225
+ * Alert-email surfaces. Promoted out of raw literals in
226
226
  * the job-alerts composer so /go indirection and email composition share
227
227
  * one definition.
228
228
  */
@@ -339,7 +339,9 @@ async function jobsTaxonomy(board, origin, kind) {
339
339
  async function jobsLocations(board, origin) {
340
340
  const { language } = await board.context();
341
341
  const { data } = await board.salaries.locations.list({ locale: language });
342
- return data.filter((l) => l.jobCount >= MIN_JOBS_PER_INDEXED_PAGE).map((l) => l.placeSlug).sort().map((slug) => `${origin}${jobsLocationPath(slug)}`);
342
+ return data.filter(
343
+ (location) => location.jobCount >= MIN_JOBS_PER_INDEXED_PAGE
344
+ ).map((location) => location.placeSlug).sort().map((slug) => `${origin}${jobsLocationPath(slug)}`);
343
345
  }
344
346
  async function jobDetails(board, origin) {
345
347
  const jobs = await enumerateJobs(board);