v1.9.5
Forge Framework v1.9.5 (2026-08-09T21:12:39Z)
Welcome to this new release of Forge Framework!
Changelog
New Features
- 2b4e843: feat(cli): accept several spec sources (@juicycleff)
- be85a54: feat(cli): merge several spec sources into one package (@juicycleff)
- 3a840ea: feat(cli): watch every spec source (@juicycleff)
- 3d5bbd7: feat(client): add MergeSpecs and SourceKind (@juicycleff)
- 25b79ce: feat(client): add MergeSpecs and SourceKind (@juicycleff)
- 9c1366c: feat(client): add ParseFileUnresolved for multi-source merging (@juicycleff)
- f3e41d4: feat(client): add dehydrate, emitting only entities the exported queries reach (@juicycleff)
- 3464fb3: feat(client): add hydrate, reviving a payload into a warm cache (@juicycleff)
- 9db6836: feat(client): add peek, settledQueries and restore to the query cache (@juicycleff)
- 443a055: feat(client): add the SSR wire encoding, with reference-shaped data escaped (@juicycleff)
- 3041e0c: feat(client): add the overlay stack's entity plane (@juicycleff)
- af13563: feat(client): derive a mutation's optimistic target from its tags (@juicycleff)
- 0637c18: feat(client): emit declared scopes as typed capabilities and can() (@juicycleff)
- a3a7182: feat(client): emit response and entity types on mutation bindings (@juicycleff)
- 2d63f3d: feat(client): give a query handle a real server snapshot, and export the SSR surface (@juicycleff)
- b5f2075: feat(client): let a settle supply resolved tags instead of a response (@juicycleff)
- 9957bf0: feat(client): open one overlay resolution point in the entity store (@juicycleff)
- ab38624: feat(client): project pending placements onto a query's value (@juicycleff)
- 7332ab1: feat(client): rank introspected specs with OpenAPI (@juicycleff)
- 18706d9: feat(client): report merge collisions through spec.Warnings (@juicycleff)
- d59189f: feat(client): show a mutation's declared change before the server answers (@juicycleff)
- addca46: feat(client): surface pending optimistic state through every adapter (@juicycleff)
- ae33e82: feat(client-core): skip gap recovery when the server replayed it (@juicycleff)
- de92a9a: feat(react): hydrate during render, and emit real markup from a server render (@juicycleff)
- 06fbb60: feat(router): WithEventLog route option (@juicycleff)
- f704934: feat(router): bounded in-memory event log with honest gap reporting (@juicycleff)
- f2e1dea: feat(router): event log position codec (@juicycleff)
- 87b9732: feat(router): replay missed SSE events on reconnect (@juicycleff)
- 01d97ef: feat(streaming): record per-channel resume positions on session snapshots (@juicycleff)
- 4cb6b4f: feat(streaming): state the wire contract, and pin it from the Go side (@juicycleff)
Bug Fixes
- 7dd06e5: fix(cli): refresh every source's tracker after a watch regeneration (@juicycleff)
- 67a9e07: fix(cli): restore loud config-source validation and cover the merge path (@juicycleff)
- eb8ba84: fix(cli): say which source
client listused when given several (@juicycleff) - 54fe56c: fix(cli): stop the shared watch debouncer from dropping a source's change (@juicycleff)
- 4d1e71f: fix(client): carry spec warnings through the Go generator (@juicycleff)
- b80d2ff: fix(client): close the optimistic-overlay leak into base, and two related hazards (@juicycleff)
- 8fb4818: fix(client): correct ParseFileUnresolved rationale and test after review (@juicycleff)
- 57f9493: fix(client): do not import a mutation type that types.ts never exports (@juicycleff)
- 3099eda: fix(client): drop the duplicate declarations the merge only warned about (@juicycleff)
- 794ba2e: fix(client): keep a frame's value when an optimistic overlay is promoted (@juicycleff)
- 2f4be70: fix(client): keep a schema named Capability from breaking the package (@juicycleff)
- 6cc3fe8: fix(client): keep client-react buildable and close the size gate (@juicycleff)
- acf431e: fix(client): keep placement's shape check and entry.value entity-plane only (@juicycleff)
- a281f91: fix(client): make touch bump version only on real invalidation (@juicycleff)
- f93b98b: fix(client): stop canonicalising mutation binding type names (@juicycleff)
- c19688c: fix(client): thread the entity type through all three adapters (@juicycleff)
- 9108b64: fix(client): widen sameSchemaShape to catch enum, ref, and polymorphism drift (@juicycleff)
- 954ed4b: fix(client-core): decode the streaming extension's envelope (@juicycleff)
- 56feb1b: fix(client-core): key deferred gap recovery by endpoint, validate resumed payload (@juicycleff)
- 4d7e91e: fix(client-core): read event before type in the default frame decoder (@juicycleff)
- 095a388: fix(router): binary frames, write deadlines, and SSE event IDs (@juicycleff)
- 4255314: fix(router): make event log sequence numbers global to the log (@juicycleff)
- 42dc940: fix(router): reject caller IDs and serialize append-send on resumable streams (@juicycleff)
- f4baf78: fix(router): warn once when another layer's event IDs are refused (@juicycleff)
- 5df0814: fix(sse-replay): close the seams between log, replay wiring, and client (@juicycleff)
- 737348d: fix(streaming): close authorization gaps, enforce inert config, add replay (@juicycleff)
- d6a75d0: fix(streaming): count dropped delivery hooks and copy snapshots on Save (@juicycleff)
- cb773c3: fix(streaming): decode the extension's envelope on the client (@juicycleff)
- 74353ab: fix(streaming): stop leaked goroutines, sharing resumes, and per-message goroutines (@juicycleff)
- a1d8889: fix(streaming): survive an SSE route that owns its own event IDs (@juicycleff)
- 2d4f7ad: fix(webrtc): drop the now-redundant streaming.Extension assertions (@juicycleff)
Refactoring
- 72dc7be: refactor(client): drop the Forge prefix from the adapter APIs (@juicycleff)
- 6501d7c: refactor(react): name the boundary HydrationBoundary, not ForgeHydrationBoundary (@juicycleff)
Documentation Updates
- 75ce08b: docs(changelog): update CHANGELOG.md for v1.9.4 (@github-actions[bot])
- 6d2be46: docs(client): correct two claims that shipped wrong in the last commit (@juicycleff)
- 2f3601e: docs(client): document SSR dehydrate/hydrate and retire the not-yet-shipped section (@juicycleff)
- 812430e: docs(client): document isOptimistic and the OPTIMISTIC symbol (@juicycleff)
- 10b6e16: docs(client): document optimistic overlays as shipped (@juicycleff)
- da49300: docs(client): document repeatable sources, append semantics and watch (@juicycleff)
- 7f4b729: docs(client): plan the SSR dehydrate/hydrate implementation (@juicycleff)
- 752752d: docs(notes): record the two SSE replay mechanisms and the id conflict (@juicycleff)
- 763c34c: docs(plan): correct the Task 3 rationale (@juicycleff)
- aa63888: docs(plan): implementation plan for unified streams + hooks generation (@juicycleff)
- 5bc7ac3: docs(plan): stage explicit paths, never git add -A (@juicycleff)
- ec1a39b: docs(plans): SSE event replay implementation plan (@juicycleff)
- 8247d05: docs(plans): fix toHaveLength arity in the deferred-recovery test (@juicycleff)
- 268d5f1: docs(plans): follow-ups for the streaming frame decoder (@juicycleff)
- 90adb1e: docs(plans): prove the constant parse against a fixture (@juicycleff)
- fb84b28: docs(spec): design for unified streams + hooks generation (@juicycleff)
- fd2a92d: docs(specs): SSE event replay and honest gap recovery design (@juicycleff)
- 95e55b7: docs(web-client): drop the last unpublished-packages caveat (@juicycleff)
- e30a4cf: docs(web-client): drop the unpublished-packages caveats (@juicycleff)
- 1bb9d58: docs(web-client): multi-source generation ships, so stop calling it unbuilt (@juicycleff)
- 8b9e11e: docs(web-client): say which field names a stream frame (@juicycleff)
- 5463788: docs(web-client): say which field names a stream frame (@juicycleff)
- edd2d66: docs(web-client): the default decoder now reads event first (@juicycleff)
Build System
- d1a389e: build(client): raise the stream-binding budget past the overlay stack (@juicycleff)
Other Changes
- aca683f: chore(deps): bring the three drifted submodules up to current versions (@juicycleff)
- f1a8801: test(client): assert the SSR round trip, with reference-shaped keys generated (@juicycleff)
- ecc888c: test(client): cover promote's raw-base evaluation of computed sources (@juicycleff)
- eb8f713: test(client): make the un-decoded parse guard fixture-independent (@juicycleff)
- efab606: test(client): name the merge-resolve test after what it asserts (@juicycleff)
Installation
Using Go Install
go install github.com/xraph/forge/cmd/forge@v1.9.5Download Binary
Download the appropriate binary for your platform from the assets below.
Using Package Managers
# Homebrew (macOS/Linux)
brew install xraph/tap/forge
# Scoop (Windows)
scoop bucket add xraph https://github.com/xraph/scoop-bucket
scoop install forgeWhat's Changed
Full changelog: v1.9.4...v1.9.5