@bowmark/web 1.0.0 → 1.2.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
@@ -1,11 +1,12 @@
1
1
  # @bowmark/web
2
2
 
3
- > **Status:** publishable, 2026-08-05 · `private` is gone and the two-hop release is
4
- > wired (Phase 6 of
5
- > [`docs/plans/public-types-package.md`](../../../docs/plans/public-types-package.md)).
6
- > Nothing above `0.0.0` is on npm until release-please bumps `package.json` and the
7
- > mirror's `publish.yml` sees the change. **What would make this doc wrong:** a build
8
- > step appearing, or the declarations moving out into a second package.
3
+ > **Status:** PUBLISHED · `@bowmark/web@1.0.0` on npm, 2026-08-06, alongside
4
+ > `bowmark-web` and `bowmark-web-stubs` on PyPI at the same version. The plan that built it
5
+ > is deleted; the reasoning is in the four
6
+ > [`docs/decisions/2026-08-06-*`](../../../docs/decisions/) records and the enforceable half
7
+ > is [`.claude/rules/public-types.md`](../../../.claude/rules/public-types.md).
8
+ > **What would make this doc wrong:** a build step appearing, the declarations moving out
9
+ > into a second package, or a runtime dependency landing in `package.json`.
9
10
 
10
11
  ```sh
11
12
  npm i @bowmark/web
@@ -186,13 +187,20 @@ message.
186
187
 
187
188
  **What it fails CLOSED on, and the two things it must not.** A known unit with an
188
189
  unknown FUNCTION is refused — the table is authoritative about a unit it carries. An
189
- unknown UNIT passes straight through, because a Shopify family MEMBER
190
- (`providers.gymshark`) is absent from every manifest **by design** — `listProviders()`
191
- excludes members and always will — so refusing an unknown unit would refuse the largest
192
- part of the library. A function with no readable argument shape is an EXPLICIT `null` in
193
- the table rather than an absence, and passes through; that distinction is what makes the
190
+ unknown UNIT passes straight through, because a family MEMBER (`providers.gymshark`) is
191
+ absent from the RUNTIME validator table **by design** — `listProviders()` excludes
192
+ members and always will — so refusing an unknown unit would refuse the largest part of
193
+ the library. A function with no readable argument shape is an EXPLICIT `null` in the
194
+ table rather than an absence, and passes through; that distinction is what makes the
194
195
  first rule safe at all.
195
196
 
197
+ Note the deliberate asymmetry with the TYPES: since 2026-08-06 a member IS declared in
198
+ `library.d.ts`, so `providers.gymshark.search(…)` completes and type-checks. The two
199
+ answer different questions. Types are a build-time artifact and can afford one line per
200
+ member; the validator table is loaded into every client process at runtime, where 51,711
201
+ entries would be a cost paid on every call to buy nothing — the family's arguments are
202
+ already checked by the shared interface the compiler saw.
203
+
196
204
  **A parameter may not offer a type the wire cannot carry.** Every argument crosses as
197
205
  JSON on every surface, so `requestedTime?: string | Date` has an arm refused 100% of the
198
206
  time while the library says otherwise. `gate:public-types`' `wire-impossible-param`
@@ -203,10 +211,16 @@ for all 253 typed parameters.
203
211
  ## Regenerating
204
212
 
205
213
  ```bash
206
- pnpm run gen:public-types # writes src/generated/{library.d.ts,validators.ts}
207
- pnpm run gate:public-types # fails if either committed file is stale, or leaks
214
+ pnpm run gen:public-types # writes src/generated/{library.d.ts,validators.ts}
215
+ pnpm run gate:public-types # fails on a leak, a new refusal, a wire-impossible type
216
+ pnpm run gate:public-types:drift # …and on the committed copy being stale
208
217
  ```
209
218
 
219
+ **Only the middle one runs on your PR, and staleness is deliberately not fatal there.**
220
+ The committed copy goes stale every time any unit anywhere lands a function, which is not
221
+ something your branch can keep true — `regen-public-types.yml` repairs it on `main`. See
222
+ `.claude/rules/public-types.md` § The gate is SPLIT.
223
+
210
224
  **`skipLibCheck: false` in this package's `tsconfig.json` is load-bearing**, and the base
211
225
  config sets the opposite. That flag skips type checking of every `.d.ts`, and this
212
226
  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.0.0",
3
+ "version": "1.2.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",