aifsmjs 0.5.3 → 0.5.6

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 (58) hide show
  1. package/README.md +8 -4
  2. package/README_ZHTW.md +7 -5
  3. package/dist/chunk-2MME5V4F.cjs +384 -0
  4. package/dist/chunk-2MME5V4F.cjs.map +1 -0
  5. package/dist/chunk-3B2USJ3H.cjs +18 -0
  6. package/dist/chunk-3B2USJ3H.cjs.map +1 -0
  7. package/dist/chunk-A7U7QQL5.js +52 -0
  8. package/dist/chunk-A7U7QQL5.js.map +1 -0
  9. package/dist/chunk-CDK25FTD.cjs +59 -0
  10. package/dist/chunk-CDK25FTD.cjs.map +1 -0
  11. package/dist/chunk-FHTQ7LSQ.cjs +21 -0
  12. package/dist/chunk-FHTQ7LSQ.cjs.map +1 -0
  13. package/dist/chunk-I354FONA.cjs +153 -0
  14. package/dist/chunk-I354FONA.cjs.map +1 -0
  15. package/dist/chunk-JKZAOPQC.js +16 -0
  16. package/dist/chunk-JKZAOPQC.js.map +1 -0
  17. package/dist/chunk-NEJYZAKR.js +19 -0
  18. package/dist/chunk-NEJYZAKR.js.map +1 -0
  19. package/dist/chunk-PZ5AY32C.js +9 -0
  20. package/dist/chunk-PZ5AY32C.js.map +1 -0
  21. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  22. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  23. package/dist/chunk-VZCSHTOI.js +374 -0
  24. package/dist/chunk-VZCSHTOI.js.map +1 -0
  25. package/dist/chunk-ZLQ7HZCE.js +142 -0
  26. package/dist/chunk-ZLQ7HZCE.js.map +1 -0
  27. package/dist/effects/index.cjs +8 -14
  28. package/dist/effects/index.cjs.map +1 -1
  29. package/dist/effects/index.js +5 -14
  30. package/dist/effects/index.js.map +1 -1
  31. package/dist/guards/index.cjs +9 -13
  32. package/dist/guards/index.cjs.map +1 -1
  33. package/dist/guards/index.js +8 -12
  34. package/dist/guards/index.js.map +1 -1
  35. package/dist/index.cjs +101 -591
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.js +5 -571
  38. package/dist/index.js.map +1 -1
  39. package/dist/inspect/index.cjs +2 -0
  40. package/dist/inspect/index.cjs.map +1 -1
  41. package/dist/inspect/index.js +2 -0
  42. package/dist/inspect/index.js.map +1 -1
  43. package/dist/pbt/index.cjs +26 -525
  44. package/dist/pbt/index.cjs.map +1 -1
  45. package/dist/pbt/index.d.cts +7 -3
  46. package/dist/pbt/index.d.ts +7 -3
  47. package/dist/pbt/index.js +12 -511
  48. package/dist/pbt/index.js.map +1 -1
  49. package/dist/replay/index.cjs +9 -195
  50. package/dist/replay/index.cjs.map +1 -1
  51. package/dist/replay/index.js +5 -198
  52. package/dist/replay/index.js.map +1 -1
  53. package/dist/timer/index.cjs +30 -9
  54. package/dist/timer/index.cjs.map +1 -1
  55. package/dist/timer/index.js +30 -9
  56. package/dist/timer/index.js.map +1 -1
  57. package/llms-full.txt +165 -8
  58. package/package.json +8 -6
package/llms-full.txt CHANGED
@@ -14,14 +14,16 @@ The short index lives at `llms.txt` (see https://llmstxt.org/).
14
14
  # aifsmjs
15
15
 
16
16
  [![npm version](https://img.shields.io/npm/v/aifsmjs.svg)](https://www.npmjs.com/package/aifsmjs)
17
- [![CI](https://github.com/yshengliao/aifsmjs/actions/workflows/ci.yml/badge.svg)](https://github.com/yshengliao/aifsmjs/actions/workflows/ci.yml)
17
+ [![CI](https://github.com/islumina/aifsmjs/actions/workflows/ci.yml/badge.svg)](https://github.com/islumina/aifsmjs/actions/workflows/ci.yml)
18
18
  [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE)
19
19
  [![AI Generated](https://img.shields.io/badge/AI_Generated-Claude_Code_Opus_4.7_Max-blueviolet.svg)](https://www.anthropic.com/claude-code)
20
20
  [![繁體中文](https://img.shields.io/badge/lang-繁體中文-red.svg)](README_ZHTW.md)
21
21
 
22
22
  > A small, strict FSM library for any TypeScript/JS app that needs deterministic, replayable state transitions. Lifecycle is a pure `step()` function. Chain-of-Responsibility intuition is reserved for cross-cutting concerns (observe / persist / replay), never for the transition core.
23
23
 
24
- Part of the [ai\*js micro-runtime ecosystem](https://github.com/yshengliao) — see also [aibridgejs](https://github.com/yshengliao/aibridgejs) (cross-context RPC) and [aiecsjs](https://github.com/yshengliao/aiecsjs) (ECS).
24
+ Part of the [ai\*js micro-runtime ecosystem](https://github.com/islumina) — see also [aibridgejs](https://github.com/islumina/aibridgejs) (cross-context RPC) and [aiecsjs](https://github.com/islumina/aiecsjs) (ECS).
25
+
26
+ > **Status: 0.5.6.** Core FSM, hierarchical sub-machines, guards & effects, scheduler, replay, inspect, and PBT helpers are all live. See [CHANGELOG.md](CHANGELOG.md) for release history.
25
27
 
26
28
  **Primary audience**: developers building stateful flows — multi-step forms, checkout funnels, auth flows, tutorial sequences, document-status workflows, scene flow in interactive apps, and the same patterns in browser-based games (PixiJS / Svelte 5 / plain Canvas / WebGL). The core is **environment-neutral** (pure function + adapter boundary): browser, Node, Bun, Deno, Flutter WebView, and Web Workers all work. The Roadmap section keeps gaming-specific niceties (tick hook, ECS bridge) as opt-in subpaths, not core surface.
27
29
 
@@ -302,6 +304,8 @@ const runtime = createRuntime(def, impl, {
302
304
 
303
305
  Koa-style `(ctx, next) => void` pipeline. `ctx` is `{ prev, next, event, effects, changed }`, all deep-frozen. **Cannot cancel a transition** — `next()` must be called; the return value carries no meaning.
304
306
 
307
+ Two boundaries to respect (both stable for 1.x, detailed in [STABILITY.md](STABILITY.md)): skipping `next()` is **not** enforced and silently drops every later middleware (and the `recorder` / `persist` sinks) for that event; and a synchronous throw from a middleware (e.g. `persist` on non-serialisable context) propagates to the caller but leaves the snapshot **committed yet unannounced** — `notify()` and `on('transition')` are skipped. Do **not** call `runtime.send()` from inside the pipeline: the inner event runs its full pipeline before the outer frame finishes, so the `recorder` log is reordered and `replay()` diverges.
308
+
305
309
  ### `aifsmjs/replay` — Pure event log replay
306
310
 
307
311
  ```typescript
@@ -506,8 +510,8 @@ Example-first, PBT-augmented. Lesson from jssm: "3000+ tests / 100% coverage" tu
506
510
 
507
511
  - **Example tests** (vitest): for every src module, write happy path + edge + error-message triplets.
508
512
  - **PBT smoke**: each generic property runs 50 iterations as an invariant guard, not as a coverage source.
509
- - **CI-enforced thresholds**: `@vitest/coverage-v8` is wired to **100% statements / 100% lines / 100% functions / ≥90% branches**. The few defensive invariant-guard branches (e.g. runtime determinism mismatch) carry `/* v8 ignore */` annotations with rationale.
510
- - **Size budget**: `scripts/check-size.mjs` enforces per-subpath gzip caps in CI — core ≤4.7 KB (raised in 0.3.0 for sub-machine sugar), replay ≤1.8 KB, pbt ≤5.5 KB (raised in 0.3.0 because `pbt` transitively imports `createRuntime`), others ≤1 KB. Exceeding any cap fails the build.
513
+ - **CI-enforced thresholds**: `@vitest/coverage-v8` is wired to **100% lines / 100% functions / ≥95% statements / ≥90% branches**. The few defensive invariant-guard branches (e.g. runtime determinism mismatch) carry `/* v8 ignore */` annotations with rationale.
514
+ - **Size budget**: `scripts/check-size.mjs` enforces per-subpath gzip caps in CI, measured as each entry's transitive closure (entry + shared chunks — the build code-splits so error classes keep cross-subpath identity) — core ≤6.5 KB, pbt ≤8.5 KB (transitively imports `createRuntime`), replay ≤3.3 KB, effects ≤1.7 KB, guards ≤1.5 KB, timer ≤1.2 KB, inspect ≤1 KB. Exceeding any cap fails the build.
511
515
 
512
516
  ### The 6 built-in generic properties
513
517
 
@@ -579,6 +583,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
579
583
 
580
584
  ## [Unreleased]
581
585
 
586
+ ## [0.5.6] - 2026-06-10
587
+
588
+ ### Fixed
589
+
590
+ - **Guard combinators route through the async-guard safety net** — `and()` / `or()` / `not()` now pass each resolved guard's return value through the same `isThenable` check as top-level guards, throwing `AsyncGuardError` instead of coercing a pending thenable to `true`/`false`. The 0.2.0 async-guard protection was bypassable through any combinator. (Review wave 2026-06-10, FSM-S-01.)
591
+ - **`reset()` captures the committed snapshot before notifying** (mirroring the 0.2.0 `send()` fix), so a listener that re-enters `send()` during reset can no longer make the `'transition'` payload report a state pair that never occurred. (FSM-B-01.)
592
+ - **Scheduler `pending` registry no longer leaks** on any of its three escape paths: signal-abort cancellation, scheduling on an already-aborted signal, and a custom scheduler that fires synchronously during `after()`. Signal handling is owned by the scheduler layer now; fire/cancel/abort all remove the tracked handle and detach the abort listener. (FSM-R-01.)
593
+ - PBT property #5 `guardsFalseNoTransition` actually asserts `changed === false` (its body was vacuous — it returned `true` unconditionally); the other five generic properties were audited and are non-vacuous. (FSM-B-02.)
594
+ - Hierarchical `sub.initial` is validated as a member of `sub.states` at definition time. (FSM-S-02.)
595
+ - Effect results are detected with `isThenable` instead of `instanceof Promise` at both dispatch sites, so cross-realm / userland PromiseLike values are awaited and error-routed correctly. (FSM-B-03.)
596
+ - `emit()` / `notify()` snapshot their listener sets before iterating (family-canonical), pinning unsubscribe/re-subscribe-during-dispatch semantics. (FAM-S-03.)
597
+
598
+ ### Changed
599
+
600
+ - **Code splitting enabled (`tsup splitting: true`)** — the published 0.5.x dist inlined a private copy of the shared runtime (including every error class) into each subpath bundle, so an error raised through `aifsmjs/guards` failed `instanceof` checks against the root export. Shared chunks restore cross-subpath class identity; total dist JS shrank 50.7 KB → 31.1 KB. `check:size` now measures each entry's transitive chunk closure, with budgets recalibrated and the README size-budget bullet updated to match.
601
+ - Triplicated child init/wire logic extracted into a single `initChildFor()` helper (behaviour-preserving).
602
+ - Supply-chain and release hardening: CI/publish actions SHA-pinned, npm CLI pinned (`11.16.0`), `permissions: contents: read` on CI, job timeouts, `npm publish --ignore-scripts`, manual dispatch defaults to dry-run, new `verify:docs` banner gate, two-stage typecheck (tests are now type-checked), `llms-full.txt` embeds `STABILITY.md`, and a cross-subpath dist smoke (`verify:dist`).
603
+
604
+ ### Docs
605
+
606
+ - README coverage claim corrected to the enforced thresholds (95% statements); middleware sync-throw commit/notify boundary and `next()`-skip behaviour documented (with characterisation tests); README status banner added (EN + ZHTW).
607
+
608
+ ## [0.5.5] - 2026-06-08
609
+
610
+ ### Changed
611
+
612
+ - Project home migrated to the [`islumina`](https://github.com/islumina) GitHub org; the package is now published from there via npm trusted publisher (OIDC + SLSA provenance). Family-wide version alignment at `0.5.5` — no runtime or API changes.
613
+
582
614
  ## [0.5.3] - 2026-06-05
583
615
 
584
616
  ### Added
@@ -918,6 +950,131 @@ Hierarchical / compound states, parallel state regions, actor invocation
918
950
 
919
951
  ---
920
952
 
953
+ # Stability tiers (`STABILITY.md`)
954
+
955
+ # Stability
956
+
957
+ This document defines the stability tier of every public symbol exported by
958
+ `aifsmjs`. Tiers govern what breaks may occur in future minor / major bumps.
959
+
960
+ ## Stable (since 0.1.0)
961
+
962
+ Fully stable. Breaking changes only at a major version bump (1.0+).
963
+
964
+ - `createMachine`, `defineMachine`, `setup`, `createRuntime`, `initialSnapshot`
965
+ - `step`, `resolveTransitions`, `evalGuard`, `resolveGuard`, `isAsyncGuardFn`
966
+ - `assign`, `mergeContext`, `createSnapshot`, `deepFreeze`, `freezeSnapshot`
967
+ - `Runtime.send`, `Runtime.reset`, `Runtime.can`, `Runtime.getSnapshot`,
968
+ `Runtime.snapshot`, `Runtime.subscribe`, `Runtime.on`, `Runtime.dispose`,
969
+ `Runtime.signal`, `Runtime.disposed`
970
+ - All error classes from 0.1.0–0.2.1: `RuntimeDisposedError`,
971
+ `InvalidDefinitionError`, `UnknownActionError`, `UnknownGuardError`,
972
+ `AsyncGuardError`
973
+ - Types: `MachineDef`, `StateDef` (fields `on`, `entry`, `exit`, `final`),
974
+ `TransitionDef`, `Snapshot`, `Implementations`, `Guard`, `Action`,
975
+ `EffectHandler`, `Effect`, `Enqueuer`, `Middleware`, `MiddlewareContext`,
976
+ `RuntimeOptions`, `StepResult`, `ResetEvent`, `RESET_EVENT_TYPE`,
977
+ `RuntimeTransitionEvent`, `RuntimeErrorEvent`, `RuntimeEventMap`
978
+ - All subpath exports: `aifsmjs/guards`, `aifsmjs/effects`, `aifsmjs/inspect`,
979
+ `aifsmjs/replay`, `aifsmjs/pbt`, `aifsmjs/timer`
980
+ - `Runtime.onTransition` (added in 0.3.0) — pure sugar over the stable
981
+ `on('transition', ...)` API; listed under Stable because the underlying
982
+ contract is unchanged.
983
+
984
+ ### Sub-machines (stable since 0.4.0)
985
+
986
+ The hierarchical sub-machine surface shipped experimentally in 0.3.0 is
987
+ stable as of 0.4.0. Signatures and runtime semantics — including the
988
+ init-failure quarantine behaviour described below — are frozen for the 1.x
989
+ line. The boundaries listed are intentional design trade-offs, not bugs or
990
+ pending instability.
991
+
992
+ - `StateDef.sub` (optional `SubMachineDef`) — when present, a child runtime
993
+ is lazily initialised on entry and disposed on exit. Per-transition
994
+ ordering is parent `step()` (exit / actions / entry) → child dispose →
995
+ child init → snapshot commit.
996
+ - `StateDef.subImpl` (optional `Implementations`) — paired with `sub`;
997
+ passed to the child `createRuntime`. Defaults to `{}`.
998
+ - `Runtime.subRuntime()` — returns the live child handle, or `undefined`.
999
+ Returned generic is `Runtime<unknown, { type: string }, string>`; caller
1000
+ narrows via cast if necessary.
1001
+ - `SubMachineError` — thrown by `send()` / `reset()` on child init/dispose
1002
+ failure. Fields: `parentState`, `phase ("init" | "dispose")`, `cause`.
1003
+ - `SubMachineDef` type alias.
1004
+
1005
+ #### Design boundaries
1006
+
1007
+ - **Replay / PBT do not see child state.** `replay()` and
1008
+ `commandsFromMachine` only inspect parent snapshots. If your business
1009
+ logic lives in the parent layer, replay is still deterministic.
1010
+ - **`subRuntime()` may return a disposed handle** if an external caller
1011
+ disposed it. The handle is not reinitialised until the parent leaves and
1012
+ re-enters the sub-bearing state. Detect with `child.disposed`.
1013
+ - **Self-targeting external (`A → A`) is treated as full exit/entry**:
1014
+ child is disposed and reinitialised. The dispatcher re-resolves guards to
1015
+ identify the chosen transition before deciding external vs internal, so
1016
+ guarded internal transitions on the same event do not trigger a reinit.
1017
+ - **Init-failure mid-transition leaves the parent without a live child.**
1018
+ If `applySubLifecycle` successfully disposes the old child and then the
1019
+ new child's `createRuntime` throws, the parent's snapshot is rolled back
1020
+ to `prev` but `subRuntime()` returns `undefined`. Callers catching
1021
+ `SubMachineError(phase: "init")` should treat the runtime as quarantined
1022
+ — call `runtime.dispose()` (idempotent) or `runtime.reset()` (which
1023
+ attempts re-init) before sending further events. This quarantine
1024
+ behaviour is part of the stable contract; a future **major** version may
1025
+ switch to a two-phase "init before dispose" commit strategy (a breaking
1026
+ change reserved for 1.0+), but the current semantics are frozen for the
1027
+ 1.x line.
1028
+
1029
+ ### Middleware, effects & notification ordering (documented boundaries)
1030
+
1031
+ These are intentional ordering boundaries of the read-only middleware /
1032
+ effect pipeline, not bugs. They are stable for the 1.x line.
1033
+
1034
+ - **A synchronous throw from a middleware or effect handler leaves the
1035
+ snapshot committed but unannounced.** Inside `send()` / `reset()` the new
1036
+ snapshot is committed (so `getSnapshot()` already reflects it) *before*
1037
+ `runMiddleware()` and effect dispatch run. If a middleware or effect
1038
+ handler throws synchronously, the throw propagates to the `send()` /
1039
+ `reset()` caller (as documented), but `notify()`, `on('transition')`
1040
+ listeners, and — for a middleware throw — the collected effects are
1041
+ skipped. Observers therefore desynchronise from `getSnapshot()`. The
1042
+ shipped `persist` middleware throws on non-serialisable context, making
1043
+ this reachable without exotic code. Wrap throwing middleware/effects in
1044
+ your own `try/catch` if you need observers to fire regardless. (Contrast:
1045
+ the sub-machine init/dispose failure path *rolls back* instead — see
1046
+ above.) A future **major** may move the commit after the pipeline; the
1047
+ current order is frozen for 1.x.
1048
+ - **`next()` must be called by every middleware; skipping it is not
1049
+ enforced.** Calling `next()` twice throws; calling it zero times is
1050
+ silently tolerated and drops every later middleware (and the recorder /
1051
+ persist sinks) for that event — no throw, no warning. The state transition
1052
+ itself is unaffected (the snapshot is committed before the pipeline). Treat
1053
+ `next()` as mandatory.
1054
+ - **Re-entrant `send()` from inside middleware reorders recorder logs.**
1055
+ Middleware is documented read-only; a middleware that re-entrantly calls
1056
+ `runtime.send()` runs the inner event's full pipeline (including the
1057
+ recorder push) before the outer frame reaches the recorder. The
1058
+ `recorder` sink — intended to feed `replay()` — then lists `[inner,
1059
+ outer]` for an application order of `[outer, inner]`, so replaying that log
1060
+ diverges. Do not `send()` from within the middleware pipeline.
1061
+
1062
+ ## Experimental
1063
+
1064
+ No experimental APIs as of 0.4.0. The 0.3.0 sub-machine surface graduated to
1065
+ Stable in 0.4.0 — see "Sub-machines" above.
1066
+
1067
+ ## Draft (planned, not implemented)
1068
+
1069
+ API sketched, not shipped. May change before release.
1070
+
1071
+ - `historyState` (candidate for a future minor) — opt-in pseudo-state that
1072
+ remembers the last active sub-state on re-entry. Workaround in 0.3.0:
1073
+ snapshot the sub-runtime's value on exit via `onTransition`, restore
1074
+ manually.
1075
+
1076
+ ---
1077
+
921
1078
  <!-- ===== CONTRIBUTING.md ===== -->
922
1079
 
923
1080
  # Contributing to aifsmjs
@@ -1044,10 +1201,10 @@ pnpm example:form-wizard # 04-form-wizard
1044
1201
 
1045
1202
  | # | Example | What it shows | Real-world pattern |
1046
1203
  |---|---|---|---|
1047
- | 01 | [traffic-light](https://github.com/yshengliao/aifsmjs/blob/main/examples/01-traffic-light/index.ts) | Minimal `setup → defineMachine → createRuntime → send` loop with `assign` and a snapshot subscriber. | Cyclic scene flow (loading → menu → playing → result → loading) — or any 3-state cycle. |
1048
- | 02 | [approval-workflow](https://github.com/yshengliao/aifsmjs/blob/main/examples/02-approval-workflow/index.ts) | Multi-candidate guarded transitions (`and([...])`), effects + handlers, `persist` + `recorder` middleware, and `replay()` to reproduce the final snapshot. | Document approval, ticket triage, turn-based games with branching outcomes + post-mortem replay. |
1049
- | 03 | [checkout-funnel](https://github.com/yshengliao/aifsmjs/blob/main/examples/03-checkout-funnel/index.ts) | E-commerce checkout: cart → shipping → payment → review → confirmed. Per-stage validation as guards, payment + analytics as effects, full replay of the funnel. | Plain web app — no canvas, no game loop. Demonstrates that aifsmjs models classic UX funnels. |
1050
- | 04 | [form-wizard](https://github.com/yshengliao/aifsmjs/blob/main/examples/04-form-wizard/index.ts) | Multi-step form wizard with back / next / jump-to-step navigation. Per-step validation, draft persistence via the `persist` middleware. | Account onboarding, settings editor, multi-page survey. |
1204
+ | 01 | [traffic-light](https://github.com/islumina/aifsmjs/blob/main/examples/01-traffic-light/index.ts) | Minimal `setup → defineMachine → createRuntime → send` loop with `assign` and a snapshot subscriber. | Cyclic scene flow (loading → menu → playing → result → loading) — or any 3-state cycle. |
1205
+ | 02 | [approval-workflow](https://github.com/islumina/aifsmjs/blob/main/examples/02-approval-workflow/index.ts) | Multi-candidate guarded transitions (`and([...])`), effects + handlers, `persist` + `recorder` middleware, and `replay()` to reproduce the final snapshot. | Document approval, ticket triage, turn-based games with branching outcomes + post-mortem replay. |
1206
+ | 03 | [checkout-funnel](https://github.com/islumina/aifsmjs/blob/main/examples/03-checkout-funnel/index.ts) | E-commerce checkout: cart → shipping → payment → review → confirmed. Per-stage validation as guards, payment + analytics as effects, full replay of the funnel. | Plain web app — no canvas, no game loop. Demonstrates that aifsmjs models classic UX funnels. |
1207
+ | 04 | [form-wizard](https://github.com/islumina/aifsmjs/blob/main/examples/04-form-wizard/index.ts) | Multi-step form wizard with back / next / jump-to-step navigation. Per-step validation, draft persistence via the `persist` middleware. | Account onboarding, settings editor, multi-page survey. |
1051
1208
 
1052
1209
  ## Notes
1053
1210
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aifsmjs",
3
- "version": "0.5.3",
3
+ "version": "0.5.6",
4
4
  "description": "Small, strict FSM library for deterministic, replayable state machines in any TypeScript/JS app — multi-step forms, checkout funnels, auth flows, tutorials, scene flow. Pure step() lifecycle, opt-in effects, inspect, replay, and a fast-check property-based testing adapter. Browser / Node / Bun / Deno / WebView / Worker friendly.",
5
5
  "keywords": [
6
6
  "fsm",
@@ -20,13 +20,13 @@
20
20
  ],
21
21
  "author": "yshengliao",
22
22
  "license": "MIT",
23
- "homepage": "https://github.com/yshengliao/aifsmjs#readme",
23
+ "homepage": "https://github.com/islumina/aifsmjs#readme",
24
24
  "repository": {
25
25
  "type": "git",
26
- "url": "git+https://github.com/yshengliao/aifsmjs.git"
26
+ "url": "git+https://github.com/islumina/aifsmjs.git"
27
27
  },
28
28
  "bugs": {
29
- "url": "https://github.com/yshengliao/aifsmjs/issues"
29
+ "url": "https://github.com/islumina/aifsmjs/issues"
30
30
  },
31
31
  "type": "module",
32
32
  "sideEffects": false,
@@ -84,7 +84,9 @@
84
84
  "test:watch": "vitest",
85
85
  "lint": "biome check src test",
86
86
  "format": "biome format --write src test",
87
- "typecheck": "tsc --noEmit",
87
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.test.json --noEmit",
88
+ "verify:docs": "node scripts/verify-docs.mjs",
89
+ "verify:dist": "node scripts/check-dist-subpaths.mjs",
88
90
  "verify:exports": "node scripts/verify-exports.mjs",
89
91
  "check:size": "node scripts/check-size.mjs",
90
92
  "build:llms": "node scripts/build-llms-full.mjs",
@@ -94,7 +96,7 @@
94
96
  "example:approval": "tsx examples/02-approval-workflow/index.ts",
95
97
  "example:checkout-funnel": "tsx examples/03-checkout-funnel/index.ts",
96
98
  "example:form-wizard": "tsx examples/04-form-wizard/index.ts",
97
- "prepublishOnly": "pnpm typecheck && pnpm lint && pnpm coverage && pnpm build && pnpm verify:exports && pnpm verify:llms && pnpm check:size"
99
+ "prepublishOnly": "pnpm typecheck && pnpm lint && pnpm verify:docs && pnpm coverage && pnpm build && pnpm verify:dist && pnpm verify:exports && pnpm verify:llms && pnpm check:size"
98
100
  },
99
101
  "peerDependencies": {
100
102
  "fast-check": "^3.20.0 || ^4.0.0"