@bowmark/web 1.1.0 → 1.3.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.
package/README.md CHANGED
@@ -29,7 +29,11 @@ autocomplete is the entire promise. What exists to call is listed, one row per
29
29
  function, in
30
30
  [`CAPABILITIES.md`](https://github.com/bowmark-ai/web/blob/main/CAPABILITIES.md) and
31
31
  [`PROVIDERS.md`](https://github.com/bowmark-ai/web/blob/main/PROVIDERS.md) — absolute
32
- URLs, because this README is read on npm where a relative link resolves to nothing.
32
+ URLs, because this README is read on npm where a relative link resolves to nothing. What
33
+ changed between versions is
34
+ [`CHANGELOG.md`](https://github.com/bowmark-ai/web/blob/main/CHANGELOG.md), which is
35
+ generated by diffing those same two tables, so it describes the callable surface and
36
+ nothing else.
33
37
 
34
38
  **Zero runtime dependencies, permanently.** Not an aspiration — the argument guard is
35
39
  plain JS rather than a validator library, and the envelope shapes are hand-restated
@@ -187,13 +191,20 @@ message.
187
191
 
188
192
  **What it fails CLOSED on, and the two things it must not.** A known unit with an
189
193
  unknown FUNCTION is refused — the table is authoritative about a unit it carries. An
190
- unknown UNIT passes straight through, because a Shopify family MEMBER
191
- (`providers.gymshark`) is absent from every manifest **by design** — `listProviders()`
192
- excludes members and always will — so refusing an unknown unit would refuse the largest
193
- part of the library. A function with no readable argument shape is an EXPLICIT `null` in
194
- the table rather than an absence, and passes through; that distinction is what makes the
194
+ unknown UNIT passes straight through, because a family MEMBER (`providers.gymshark`) is
195
+ absent from the RUNTIME validator table **by design** — `listProviders()` excludes
196
+ members and always will — so refusing an unknown unit would refuse the largest part of
197
+ the library. A function with no readable argument shape is an EXPLICIT `null` in the
198
+ table rather than an absence, and passes through; that distinction is what makes the
195
199
  first rule safe at all.
196
200
 
201
+ Note the deliberate asymmetry with the TYPES: since 2026-08-06 a member IS declared in
202
+ `library.d.ts`, so `providers.gymshark.search(…)` completes and type-checks. The two
203
+ answer different questions. Types are a build-time artifact and can afford one line per
204
+ member; the validator table is loaded into every client process at runtime, where 51,711
205
+ entries would be a cost paid on every call to buy nothing — the family's arguments are
206
+ already checked by the shared interface the compiler saw.
207
+
197
208
  **A parameter may not offer a type the wire cannot carry.** Every argument crosses as
198
209
  JSON on every surface, so `requestedTime?: string | Date` has an arm refused 100% of the
199
210
  time while the library says otherwise. `gate:public-types`' `wire-impossible-param`
@@ -204,10 +215,16 @@ for all 253 typed parameters.
204
215
  ## Regenerating
205
216
 
206
217
  ```bash
207
- pnpm run gen:public-types # writes src/generated/{library.d.ts,validators.ts}
208
- pnpm run gate:public-types # fails if either committed file is stale, or leaks
218
+ pnpm run gen:public-types # writes src/generated/{library.d.ts,validators.ts}
219
+ pnpm run gate:public-types # fails on a leak, a new refusal, a wire-impossible type
220
+ pnpm run gate:public-types:drift # …and on the committed copy being stale
209
221
  ```
210
222
 
223
+ **Only the middle one runs on your PR, and staleness is deliberately not fatal there.**
224
+ The committed copy goes stale every time any unit anywhere lands a function, which is not
225
+ something your branch can keep true — `regen-public-types.yml` repairs it on `main`. See
226
+ `.claude/rules/public-types.md` § The gate is SPLIT.
227
+
211
228
  **`skipLibCheck: false` in this package's `tsconfig.json` is load-bearing**, and the base
212
229
  config sets the opposite. That flag skips type checking of every `.d.ts`, and this
213
230
  package's whole deliverable IS a `.d.ts` — with the inherited default, `pnpm typecheck`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bowmark/web",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "description": "The public client for the Bowmark capability library — real TypeScript for the whole bowmark.* surface, with no Bowmark source on the caller's disk. ZERO runtime dependencies, deliberately and permanently.",
6
6
  "license": "MIT",