@cavuno/board 2.0.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 +16 -348
  10. package/dist/{board-B8tJGX4i.d.ts → board-DKXyxwNN.d.ts} +2 -2
  11. package/dist/{board-DmRuCA8m.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 +16 -344
  15. package/dist/doctor.mjs +15 -343
  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-BEYJY97F.d.ts → jobs-CuRzTDb1.d.mts} +15 -13
  29. package/dist/{jobs-DJiISpqX.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-D6q7h1J6.d.ts → salaries-BOpR51Ny.d.mts} +3 -3
  41. package/dist/{salaries-B_Xb5k2s.d.mts → salaries-QoNpzRCT.d.ts} +3 -3
  42. package/dist/{search-CnOIZEuc.d.ts → search-B5ROY6PK.d.ts} +2 -2
  43. package/dist/{search-uC_ijbdu.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-C7vqY_b3.d.mts +0 -5202
  84. package/dist/_spec-C7vqY_b3.d.ts +0 -5202
package/dist/index.mjs CHANGED
@@ -265,12 +265,24 @@ async function clearSession(storage) {
265
265
  }
266
266
 
267
267
  // src/version.ts
268
- var SDK_VERSION = "2.0.0";
268
+ var SDK_VERSION = "2.0.1";
269
269
 
270
270
  // src/client.ts
271
271
  function isRawBody(body) {
272
272
  return typeof body === "string" || body instanceof URLSearchParams || typeof FormData !== "undefined" && body instanceof FormData || typeof Blob !== "undefined" && body instanceof Blob || body instanceof ArrayBuffer || typeof ReadableStream !== "undefined" && body instanceof ReadableStream;
273
273
  }
274
+ function redactUrlForLog(value) {
275
+ try {
276
+ const url = new URL(value);
277
+ for (const key of new Set(url.searchParams.keys())) {
278
+ url.searchParams.delete(key);
279
+ url.searchParams.set(key, "[REDACTED]");
280
+ }
281
+ return url.toString();
282
+ } catch {
283
+ return value.replace(/([?&][^=&#]+)=([^&#]*)/g, "$1=[REDACTED]");
284
+ }
285
+ }
274
286
  var BoardClient = class {
275
287
  storage;
276
288
  basePath;
@@ -322,9 +334,10 @@ var BoardClient = class {
322
334
  init: { ...passthrough, method, headers, body: serializedBody }
323
335
  };
324
336
  if (this.options.onRequest) req = await this.options.onRequest(req);
325
- this.options.logger?.debug(`${method} ${req.url}`);
337
+ const logUrl = redactUrlForLog(req.url);
338
+ this.options.logger?.debug(`${method} ${logUrl}`);
326
339
  const res = await globalThis.fetch(req.url, req.init);
327
- this.options.logger?.debug(`${res.status} ${method} ${req.url}`);
340
+ this.options.logger?.debug(`${res.status} ${method} ${logUrl}`);
328
341
  if (this.options.onResponse)
329
342
  await this.options.onResponse(res.clone(), req);
330
343
  if (res.status === 204) return void 0;
@@ -350,7 +363,7 @@ var BoardClient = class {
350
363
  raw: parsed
351
364
  });
352
365
  this.options.logger?.error(
353
- `${error.status} ${error.code} ${method} ${req.url}`
366
+ `${error.status} ${error.code} ${method} ${logUrl}`
354
367
  );
355
368
  throw error;
356
369
  }
@@ -1005,7 +1018,7 @@ function jobsNamespace(client) {
1005
1018
  );
1006
1019
  },
1007
1020
  /**
1008
- * Apply to a job natively (ADR-0054). Optional auth: a signed-in candidate
1021
+ * Apply to a job natively. Optional auth: a signed-in candidate
1009
1022
  * applies from their profile (omit name/email); a guest supplies them
1010
1023
  * (allowed only when the board permits applications without sign-up).
1011
1024
  * Idempotent — a repeat apply returns the existing application.
@@ -1103,8 +1116,8 @@ function meNamespace(client) {
1103
1116
  return client.fetch("/me", { ...options, method: "DELETE" });
1104
1117
  },
1105
1118
  /**
1106
- * The authenticated candidate's own account self-service (doc 32).
1107
- * `profile.*` is the lean profile singleton + (commit 2+) its
1119
+ * The authenticated candidate's own account self-service.
1120
+ * `profile.*` is the lean profile singleton + its
1108
1121
  * experience / education / skills / languages collections + avatar.
1109
1122
  */
1110
1123
  profile: {
@@ -1252,7 +1265,7 @@ function meNamespace(client) {
1252
1265
  },
1253
1266
  /**
1254
1267
  * Signed-in notification preferences + the anonymous email-link
1255
- * unsubscribe branch (doc 32).
1268
+ * unsubscribe branch.
1256
1269
  */
1257
1270
  notificationPreferences: {
1258
1271
  /** List every notification channel + its subscribed state. */
@@ -1282,7 +1295,7 @@ function meNamespace(client) {
1282
1295
  }
1283
1296
  },
1284
1297
  /**
1285
- * The authenticated board user's employer facet (doc 35 / ADR-0052):
1298
+ * The authenticated board user's employer facet:
1286
1299
  * claiming/creating a company, the work-email verification state machine,
1287
1300
  * and editing the company profile. A board user becomes an employer by
1288
1301
  * claiming a company — the same identity can also be a candidate.
@@ -1427,8 +1440,7 @@ function meNamespace(client) {
1427
1440
  }
1428
1441
  },
1429
1442
  /**
1430
- * Manage the jobs of a company I am an approved member of (doc 35 /
1431
- * ADR-0052). Every method is scoped to the company `slug`. New jobs are
1443
+ * Manage the jobs of a company I am an approved member of . Every method is scoped to the company `slug`. New jobs are
1432
1444
  * created as held drafts — publishing is `publish` (within a live paid
1433
1445
  * window) or the paid-post checkout flow.
1434
1446
  */
@@ -1528,7 +1540,7 @@ function meNamespace(client) {
1528
1540
  );
1529
1541
  },
1530
1542
  /**
1531
- * Pay for / publish a held draft (ADR-0031). Select billing: a paid plan
1543
+ * Pay for / publish a held draft. Select billing: a paid plan
1532
1544
  * returns `{ status: 'checkout', checkoutUrl }` (send the buyer there;
1533
1545
  * the webhook publishes on payment); a free / bundle / subscription plan
1534
1546
  * publishes immediately (`status: 'published'`); an invoice plan emails a
@@ -1569,10 +1581,10 @@ function meNamespace(client) {
1569
1581
  },
1570
1582
  /**
1571
1583
  * The read-only reporting funnel that backs the hosted employer jobs
1572
- * table (doc 35): per-job views / apply clicks / native applications,
1584
+ * table: per-job views / apply clicks / native applications,
1573
1585
  * plus a daily views+apply-clicks time-series for a chart. Membership-
1574
- * scoped; never cached. Analytics degrade to zeroes on a Tinybird
1575
- * outage — the reads never fail on an analytics problem, so a `0` means
1586
+ * scoped; never cached. Analytics degrade to zeroes when reporting data
1587
+ * is temporarily unavailable, so a `0` means
1576
1588
  * "no activity" OR "analytics briefly unavailable".
1577
1589
  */
1578
1590
  jobStats: {
@@ -1609,7 +1621,7 @@ function meNamespace(client) {
1609
1621
  }
1610
1622
  },
1611
1623
  /**
1612
- * Company-profile page views (doc 35) for the employer dashboard's
1624
+ * Company-profile page views for the employer dashboard's
1613
1625
  * "profile views" metric — visits to the company profile page ITSELF
1614
1626
  * (`/companies/{slug}`, tab subpaths and bots excluded), NOT job details.
1615
1627
  * Membership-scoped; never cached; degrades to `0` / an empty series on
@@ -1648,7 +1660,7 @@ function meNamespace(client) {
1648
1660
  },
1649
1661
  /**
1650
1662
  * The applicant pipeline (ATS) for a company I am an approved member of
1651
- * (doc 35 / ADR-0052 / ADR-0004). Reads return the full pipeline (job
1663
+ * Reads return the full pipeline (job
1652
1664
  * header + stage rail + applicants with timelines); the move/reject/note
1653
1665
  * writes resolve void — re-read the pipeline for fresh state, mirroring
1654
1666
  * the hosted portal's single reactive query.
@@ -1799,7 +1811,7 @@ function meNamespace(client) {
1799
1811
  }
1800
1812
  },
1801
1813
  /**
1802
- * The viewer's talent entitlement on this board (CAV-243) — "does this
1814
+ * The viewer's talent entitlement on this board — "does this
1803
1815
  * employer have talent access?" for gating a Message-vs-upsell CTA.
1804
1816
  * Candidates and unaffiliated viewers get `hasTalentAccess: false`.
1805
1817
  *
@@ -1818,7 +1830,7 @@ function meNamespace(client) {
1818
1830
  }
1819
1831
  },
1820
1832
  /**
1821
- * The authenticated board user's job-alert preferences (ADR-0053) —
1833
+ * The authenticated board user's job-alert preferences —
1822
1834
  * a collection (up to 10). Creating one is active immediately (no
1823
1835
  * double opt-in — the authenticated action is the consent). There is no
1824
1836
  * pause: `remove` is the only way to stop an alert.
@@ -1892,7 +1904,7 @@ function meNamespace(client) {
1892
1904
  }
1893
1905
  },
1894
1906
  /**
1895
- * The authenticated candidate's applications (ADR-0054). Apply itself lives
1907
+ * The authenticated candidate's applications. Apply itself lives
1896
1908
  * on the job (`board.jobs.apply` — it is optional-auth); these manage the
1897
1909
  * applications the candidate has already submitted, keyed by `applicationId`.
1898
1910
  */
@@ -1948,7 +1960,7 @@ function meNamespace(client) {
1948
1960
  }
1949
1961
  },
1950
1962
  /**
1951
- * The candidate's resume (ADR-0055). `upload` starts an async parse that
1963
+ * The candidate's resume. `upload` starts an async parse that
1952
1964
  * auto-populates the profile — it returns `parseStatus: 'parsing'`; poll
1953
1965
  * `retrieve()` until `parsed`/`failed`, then re-read `profile.*`.
1954
1966
  */
@@ -2039,7 +2051,7 @@ function meNamespace(client) {
2039
2051
  }
2040
2052
  },
2041
2053
  /**
2042
- * The authenticated board user's messaging inbox (doc 34 / ADR-0053).
2054
+ * The authenticated board user's messaging inbox.
2043
2055
  * The v1 surface is polled REST — there is no realtime primitive; poll
2044
2056
  * `list` / `listMessages` / `unreadCount` on an interval (3–5s is the
2045
2057
  * reference cadence) for near-live updates.
@@ -2177,7 +2189,7 @@ function meNamespace(client) {
2177
2189
  );
2178
2190
  },
2179
2191
  /**
2180
- * The existing employer↔candidate conversation id (or null). Tier-3
2192
+ * The existing employer↔candidate conversation id (or null).
2181
2193
  * talent-contact helper — route to an existing thread instead of opening
2182
2194
  * a composer.
2183
2195
  *
@@ -2192,7 +2204,7 @@ function meNamespace(client) {
2192
2204
  }
2193
2205
  },
2194
2206
  /**
2195
- * Blocking (doc 34 §E): list / add / remove blocks + a Tier-3 status check.
2207
+ * Blocking: list / add / remove blocks + a status check.
2196
2208
  */
2197
2209
  blocks: {
2198
2210
  /**
@@ -2230,7 +2242,7 @@ function meNamespace(client) {
2230
2242
  );
2231
2243
  },
2232
2244
  /**
2233
- * Whether I've blocked a user (Tier-3 helper).
2245
+ * Whether I've blocked a user.
2234
2246
  *
2235
2247
  * @example
2236
2248
  * const { blocked } = await board.me.blocks.status(boardUserId);
@@ -2243,7 +2255,7 @@ function meNamespace(client) {
2243
2255
  }
2244
2256
  },
2245
2257
  /**
2246
- * Message-scoped actions (doc 34 §E): edit / unsend your own messages
2258
+ * Message-scoped actions: edit / unsend your own messages
2247
2259
  * (15-minute window), and report a message addressed to you.
2248
2260
  */
2249
2261
  messages: {
@@ -2289,8 +2301,7 @@ function meNamespace(client) {
2289
2301
  }
2290
2302
  },
2291
2303
  /**
2292
- * The candidate job-access paywall — the authenticated money flow (doc 36 /
2293
- * ADR-0056). Enumerate offers publicly with `board.paywall.offers()`, then
2304
+ * The candidate job-access paywall — the authenticated money flow . Enumerate offers publicly with `board.paywall.offers()`, then
2294
2305
  * `checkout` here; poll `retrieveCheckout` until complete and confirm with
2295
2306
  * `grant`. The SDK stays Stripe-agnostic — `checkout` returns a mount kit
2296
2307
  * and the frontend brings `@stripe/stripe-js`.
@@ -1,15 +1,17 @@
1
- import { S as Schemas } from './_spec-C7vqY_b3.js';
1
+ import { S as Schemas } from './_spec-sW85fuvT.mjs';
2
2
 
3
3
  /**
4
- * Stripe-shaped success envelopes (`01-conventions.md` §5.1). The
5
- * server MAY add top-level fields; consumers MUST ignore unknown
6
- * fields.
4
+ * Optional pagination metadata returned by Board API list operations.
5
+ * These fields are intentionally defined at the public SDK boundary because
6
+ * individual response schemas expose them inline rather than through a shared
7
+ * OpenAPI component.
7
8
  */
8
- /**
9
- * Optional offset-pagination metadata generated from the Board API contract.
10
- * `nextCursor` is preserved alongside for forward cursor iteration.
11
- */
12
- type OffsetPagination = Schemas['OffsetPagination'];
9
+ interface OffsetPagination {
10
+ count?: number;
11
+ limit?: number;
12
+ offset?: number;
13
+ gatedCount?: number;
14
+ }
13
15
  /** @deprecated Use `OffsetPagination`. */
14
16
  type StorefrontPagination = OffsetPagination;
15
17
  /** @deprecated Use `OffsetPagination`. */
@@ -33,7 +35,7 @@ type SearchEnvelope<T> = OffsetPagination & {
33
35
  type PublicJob = Schemas['PublicJob'];
34
36
  type PublicJobCard = Schemas['PublicJobCard'];
35
37
  /**
36
- * A job's opaque, display-only custom-field values (CAV-294), keyed by each
38
+ * A job's opaque, display-only custom-field values, keyed by each
37
39
  * field's `key`. Resolve labels via the board's `CustomFieldDefinition`s
38
40
  * (`board.context().customFields`).
39
41
  */
@@ -44,13 +46,13 @@ type OfficeLocation = Schemas['JobOfficeLocation'];
44
46
  type RemoteOption = NonNullable<PublicJob['remoteOption']>;
45
47
  type EmploymentType = NonNullable<PublicJob['employmentType']>;
46
48
  type Seniority = NonNullable<PublicJob['seniority']>;
47
- /** Candidate-facing result ordering (ADR-0048); `relevance` is the default. */
49
+ /** Candidate-facing result ordering; `relevance` is the default. */
48
50
  type JobSort = NonNullable<Schemas['PublicSearchJobsBody']['sort']>;
49
51
  type EducationRequirement = PublicJob['educationRequirements'][number];
50
52
  type RemotePermit = PublicJob['remotePermits'][number];
51
53
  type RemoteTimezone = PublicJob['remoteTimezones'][number];
52
54
  /**
53
- * Derived suggestion on a browse list (ADR-0037 §8): jobs surface `category`
55
+ * Derived suggestion on a browse list: jobs surface `category`
54
56
  * and `skill` terms; the companies list surfaces `market` terms.
55
57
  */
56
58
  interface RelatedSearch {
@@ -83,7 +85,7 @@ type JobsListQuery = {
83
85
  remoteOption?: RemoteOption[];
84
86
  employmentType?: EmploymentType[];
85
87
  seniority?: Seniority[];
86
- /** Result ordering (ADR-0048). Absent ⇒ `relevance` (the featured-ranked browse). */
88
+ /** Result ordering. Absent ⇒ `relevance` (the featured-ranked browse). */
87
89
  sort?: JobSort;
88
90
  /** Place slug for a geo radius search; unresolvable slugs are ignored. */
89
91
  location?: string;
@@ -1,15 +1,17 @@
1
- import { S as Schemas } from './_spec-C7vqY_b3.mjs';
1
+ import { S as Schemas } from './_spec-sW85fuvT.js';
2
2
 
3
3
  /**
4
- * Stripe-shaped success envelopes (`01-conventions.md` §5.1). The
5
- * server MAY add top-level fields; consumers MUST ignore unknown
6
- * fields.
4
+ * Optional pagination metadata returned by Board API list operations.
5
+ * These fields are intentionally defined at the public SDK boundary because
6
+ * individual response schemas expose them inline rather than through a shared
7
+ * OpenAPI component.
7
8
  */
8
- /**
9
- * Optional offset-pagination metadata generated from the Board API contract.
10
- * `nextCursor` is preserved alongside for forward cursor iteration.
11
- */
12
- type OffsetPagination = Schemas['OffsetPagination'];
9
+ interface OffsetPagination {
10
+ count?: number;
11
+ limit?: number;
12
+ offset?: number;
13
+ gatedCount?: number;
14
+ }
13
15
  /** @deprecated Use `OffsetPagination`. */
14
16
  type StorefrontPagination = OffsetPagination;
15
17
  /** @deprecated Use `OffsetPagination`. */
@@ -33,7 +35,7 @@ type SearchEnvelope<T> = OffsetPagination & {
33
35
  type PublicJob = Schemas['PublicJob'];
34
36
  type PublicJobCard = Schemas['PublicJobCard'];
35
37
  /**
36
- * A job's opaque, display-only custom-field values (CAV-294), keyed by each
38
+ * A job's opaque, display-only custom-field values, keyed by each
37
39
  * field's `key`. Resolve labels via the board's `CustomFieldDefinition`s
38
40
  * (`board.context().customFields`).
39
41
  */
@@ -44,13 +46,13 @@ type OfficeLocation = Schemas['JobOfficeLocation'];
44
46
  type RemoteOption = NonNullable<PublicJob['remoteOption']>;
45
47
  type EmploymentType = NonNullable<PublicJob['employmentType']>;
46
48
  type Seniority = NonNullable<PublicJob['seniority']>;
47
- /** Candidate-facing result ordering (ADR-0048); `relevance` is the default. */
49
+ /** Candidate-facing result ordering; `relevance` is the default. */
48
50
  type JobSort = NonNullable<Schemas['PublicSearchJobsBody']['sort']>;
49
51
  type EducationRequirement = PublicJob['educationRequirements'][number];
50
52
  type RemotePermit = PublicJob['remotePermits'][number];
51
53
  type RemoteTimezone = PublicJob['remoteTimezones'][number];
52
54
  /**
53
- * Derived suggestion on a browse list (ADR-0037 §8): jobs surface `category`
55
+ * Derived suggestion on a browse list: jobs surface `category`
54
56
  * and `skill` terms; the companies list surfaces `market` terms.
55
57
  */
56
58
  interface RelatedSearch {
@@ -83,7 +85,7 @@ type JobsListQuery = {
83
85
  remoteOption?: RemoteOption[];
84
86
  employmentType?: EmploymentType[];
85
87
  seniority?: Seniority[];
86
- /** Result ordering (ADR-0048). Absent ⇒ `relevance` (the featured-ranked browse). */
88
+ /** Result ordering. Absent ⇒ `relevance` (the featured-ranked browse). */
87
89
  sort?: JobSort;
88
90
  /** Place slug for a geo radius search; unresolvable slugs are ignored. */
89
91
  location?: string;
package/dist/paths.d.mts CHANGED
@@ -6,13 +6,13 @@
6
6
  *
7
7
  * Each `*Path` returns an absolute path (leading slash, no origin);
8
8
  * `boardUrl(origin, path)` prefixes a board origin. Pure, isomorphic,
9
- * zero-dependency — safe to import in the Convex runtime, on the edge,
9
+ * zero-dependency — safe to import in server runtimes, on the edge,
10
10
  * and in the browser.
11
11
  *
12
12
  * These paths mirror the hosted board's indexed URLs exactly (migration
13
13
  * parity). Do NOT change a pattern here without updating the hosted board
14
14
  * and the sitemap golden tests in lockstep — the structure is a locked
15
- * cross-surface contract (ADR-0070).
15
+ * cross-surface contract.
16
16
  */
17
17
  /** Job detail — the canonical, indexed job URL. Requires BOTH slugs. */
18
18
  declare function jobDetailPath(companySlug: string, jobSlug: string): string;
@@ -63,7 +63,7 @@ declare const BOARD_PATHS: {
63
63
  readonly talent: "/talent";
64
64
  readonly employers: "/employers";
65
65
  /**
66
- * Alert-email surfaces (ADR-0090 D1/D4). Promoted out of raw literals in
66
+ * Alert-email surfaces. Promoted out of raw literals in
67
67
  * the job-alerts composer so /go indirection and email composition share
68
68
  * one definition.
69
69
  */
@@ -71,8 +71,8 @@ declare const BOARD_PATHS: {
71
71
  readonly alertsConfirm: "/alerts/confirm";
72
72
  };
73
73
  /**
74
- * Email `/go` indirection paths (ADR-0090 D4 / LNK-05). Pure builders so
75
- * Convex email composers can emit structure-independent links without
74
+ * Email `/go` indirection paths. Pure builders so
75
+ * Server-side email composers can emit structure-independent links without
76
76
  * importing `@cavuno/board/go` (handler code is not safe in that runtime).
77
77
  *
78
78
  * Shapes match the hosted handler + SDK `createGoHandler` contracts:
@@ -80,7 +80,7 @@ declare const BOARD_PATHS: {
80
80
  * /go/alerts-manage
81
81
  * /go/alerts-confirm
82
82
  *
83
- * No encoding — callers pass opaque Convex ids / static role segments that
83
+ * No encoding — callers pass opaque Cavuno ids / static role segments that
84
84
  * are already URL-safe path segments. Query strings are composed by the
85
85
  * caller (tokens must ride through verbatim).
86
86
  */
package/dist/paths.d.ts CHANGED
@@ -6,13 +6,13 @@
6
6
  *
7
7
  * Each `*Path` returns an absolute path (leading slash, no origin);
8
8
  * `boardUrl(origin, path)` prefixes a board origin. Pure, isomorphic,
9
- * zero-dependency — safe to import in the Convex runtime, on the edge,
9
+ * zero-dependency — safe to import in server runtimes, on the edge,
10
10
  * and in the browser.
11
11
  *
12
12
  * These paths mirror the hosted board's indexed URLs exactly (migration
13
13
  * parity). Do NOT change a pattern here without updating the hosted board
14
14
  * and the sitemap golden tests in lockstep — the structure is a locked
15
- * cross-surface contract (ADR-0070).
15
+ * cross-surface contract.
16
16
  */
17
17
  /** Job detail — the canonical, indexed job URL. Requires BOTH slugs. */
18
18
  declare function jobDetailPath(companySlug: string, jobSlug: string): string;
@@ -63,7 +63,7 @@ declare const BOARD_PATHS: {
63
63
  readonly talent: "/talent";
64
64
  readonly employers: "/employers";
65
65
  /**
66
- * Alert-email surfaces (ADR-0090 D1/D4). Promoted out of raw literals in
66
+ * Alert-email surfaces. Promoted out of raw literals in
67
67
  * the job-alerts composer so /go indirection and email composition share
68
68
  * one definition.
69
69
  */
@@ -71,8 +71,8 @@ declare const BOARD_PATHS: {
71
71
  readonly alertsConfirm: "/alerts/confirm";
72
72
  };
73
73
  /**
74
- * Email `/go` indirection paths (ADR-0090 D4 / LNK-05). Pure builders so
75
- * Convex email composers can emit structure-independent links without
74
+ * Email `/go` indirection paths. Pure builders so
75
+ * Server-side email composers can emit structure-independent links without
76
76
  * importing `@cavuno/board/go` (handler code is not safe in that runtime).
77
77
  *
78
78
  * Shapes match the hosted handler + SDK `createGoHandler` contracts:
@@ -80,7 +80,7 @@ declare const BOARD_PATHS: {
80
80
  * /go/alerts-manage
81
81
  * /go/alerts-confirm
82
82
  *
83
- * No encoding — callers pass opaque Convex ids / static role segments that
83
+ * No encoding — callers pass opaque Cavuno ids / static role segments that
84
84
  * are already URL-safe path segments. Query strings are composed by the
85
85
  * caller (tokens must ride through verbatim).
86
86
  */
package/dist/paths.js CHANGED
@@ -97,7 +97,7 @@ var BOARD_PATHS = {
97
97
  talent: "/talent",
98
98
  employers: "/employers",
99
99
  /**
100
- * Alert-email surfaces (ADR-0090 D1/D4). Promoted out of raw literals in
100
+ * Alert-email surfaces. Promoted out of raw literals in
101
101
  * the job-alerts composer so /go indirection and email composition share
102
102
  * one definition.
103
103
  */
package/dist/paths.mjs CHANGED
@@ -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
  */
@@ -51,7 +51,7 @@ type ValidateManifestResult = {
51
51
  };
52
52
 
53
53
  /**
54
- * Role vocabulary for the per-board route manifest (ADR-0090 D1).
54
+ * Role vocabulary for the per-board route manifest.
55
55
  *
56
56
  * Parameterized roles mirror the helpers in `../paths`; static roles mirror
57
57
  * `BOARD_PATHS` keys; `alertsManage` / `alertsConfirm` are promoted out of
@@ -67,7 +67,7 @@ type RouteRole = 'jobDetail' | 'jobsCategory' | 'jobsSkill' | 'jobsLocation' | '
67
67
  * Empty arrays = static / zero-param roles (never inferred by signature).
68
68
  */
69
69
  declare const ROLE_PARAM_REGISTRY: Record<RouteRole, readonly string[]>;
70
- /** Email-emitting roles — a missing one blocks publish (ADR-0090 D1/D6). */
70
+ /** Email-emitting roles — a missing one blocks publish. */
71
71
  declare const REQUIRED_ROLES: readonly RouteRole[];
72
72
  /** All known roles (stable iteration order = registry key order). */
73
73
  declare const ALL_ROLES: readonly RouteRole[];
@@ -75,7 +75,7 @@ declare function isRouteRole(value: string): value is RouteRole;
75
75
  /**
76
76
  * Identity manifest reproducing the current canonical structure from the
77
77
  * paths module. Built by calling helpers with `:param` placeholders so the
78
- * templates stay locked to the helpers (ADR-0070 / ADR-0090).
78
+ * templates stay locked to the helpers.
79
79
  */
80
80
  declare const CANONICAL_MANIFEST: ManifestV1;
81
81
 
@@ -51,7 +51,7 @@ type ValidateManifestResult = {
51
51
  };
52
52
 
53
53
  /**
54
- * Role vocabulary for the per-board route manifest (ADR-0090 D1).
54
+ * Role vocabulary for the per-board route manifest.
55
55
  *
56
56
  * Parameterized roles mirror the helpers in `../paths`; static roles mirror
57
57
  * `BOARD_PATHS` keys; `alertsManage` / `alertsConfirm` are promoted out of
@@ -67,7 +67,7 @@ type RouteRole = 'jobDetail' | 'jobsCategory' | 'jobsSkill' | 'jobsLocation' | '
67
67
  * Empty arrays = static / zero-param roles (never inferred by signature).
68
68
  */
69
69
  declare const ROLE_PARAM_REGISTRY: Record<RouteRole, readonly string[]>;
70
- /** Email-emitting roles — a missing one blocks publish (ADR-0090 D1/D6). */
70
+ /** Email-emitting roles — a missing one blocks publish. */
71
71
  declare const REQUIRED_ROLES: readonly RouteRole[];
72
72
  /** All known roles (stable iteration order = registry key order). */
73
73
  declare const ALL_ROLES: readonly RouteRole[];
@@ -75,7 +75,7 @@ declare function isRouteRole(value: string): value is RouteRole;
75
75
  /**
76
76
  * Identity manifest reproducing the current canonical structure from the
77
77
  * paths module. Built by calling helpers with `:param` placeholders so the
78
- * templates stay locked to the helpers (ADR-0070 / ADR-0090).
78
+ * templates stay locked to the helpers.
79
79
  */
80
80
  declare const CANONICAL_MANIFEST: ManifestV1;
81
81
 
@@ -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