diff --git a/data/ecosystem.toml b/data/ecosystem.toml index ff924cd..a685eee 100644 --- a/data/ecosystem.toml +++ b/data/ecosystem.toml @@ -1,28 +1,28 @@ schema_version = 1 as_of = "2026-07-30" source_repository = "hayatepy/.github" -source_commit = "0b44120a8e73d45fcfdfc1ce879faf5cd3452243" -compatibility_url = "https://github.com/hayatepy/.github/blob/0b44120a8e73d45fcfdfc1ce879faf5cd3452243/docs/COMPATIBILITY.md" +source_commit = "975173da2c1be720a4f902cde36ba3822b9b6e56" +compatibility_url = "https://github.com/hayatepy/.github/blob/975173da2c1be720a4f902cde36ba3822b9b6e56/docs/COMPATIBILITY.md" [[packages]] name = "hayate" version = "0.15.1" status = "Published alpha" -role = "Core framework and native runtime adapters" +role = "Core framework and native ASGI, Workers, and Lambda adapters" use_when = "Build one Fetch-style Python application for ASGI, Workers, or Lambda." repository = "https://github.com/hayatepy/hayate" pypi = "https://pypi.org/project/hayate/" -source_commit = "9e27b0191c7fa9f920ad6fe5b126e190268afba2" +source_commit = "5592276315c9b75e736d3fc204b4900e15f8867a" [[packages]] name = "create-hayate" -version = "0.12.0" +version = "0.13.0" status = "Published alpha" -role = "Composable project generator" -use_when = "Start with a tested API, Workers, MCP, auth, SQL, admin, or frontend composition." +role = "Composable applications with drift-checked first-party TypeScript clients" +use_when = "Start with a tested API, Workers, MCP, auth, SQL, admin, or frontend composition and keep its generated client in sync." repository = "https://github.com/hayatepy/create-hayate" pypi = "https://pypi.org/project/create-hayate/" -source_commit = "a1974325ce62a4bce5c6ceab27211675e07b0001" +source_commit = "9fdb98e5642ff047e04e24251be1c2747fc7572a" [[packages]] name = "hayate-auth" @@ -46,13 +46,13 @@ source_commit = "175e6ed85a5e9af3e2fd9fcbf8886594bd2f6723" [[packages]] name = "hayate-openapi" -version = "0.7.0" +version = "0.8.1" status = "Published alpha" -role = "OpenAPI 3.1, typed endpoints, Scalar, and TypeScript contracts" -use_when = "Make runtime validation, API documentation, and client types share one contract." +role = "OpenAPI 3.1, Scalar, and generated zero-runtime TypeScript clients" +use_when = "Make runtime validation, API documentation, client types, and a callable Fetch client share one contract." repository = "https://github.com/hayatepy/hayate-openapi" pypi = "https://pypi.org/project/hayate-openapi/" -source_commit = "5d274a7cc337c3336d5316421691779504e592f7" +source_commit = "2ed34215ec3dd5ebd0a0780f7b7903f0b3492a78" [[packages]] name = "hayate-sql" @@ -99,4 +99,4 @@ status = "Reference application" role = "Executable production integration" use_when = "Review tested trust boundaries and deployment choices before shipping." repository = "https://github.com/hayatepy/golden-app" -source_commit = "a424e1417baa2830518ce696bb96130f34c90259" +source_commit = "842fd2486f3d8bd5c284e44e4f8528b0441a574a" diff --git a/docs/ecosystem/compose.md b/docs/ecosystem/compose.md index ef0a1c6..461491b 100644 --- a/docs/ecosystem/compose.md +++ b/docs/ecosystem/compose.md @@ -25,7 +25,20 @@ uv add hayate hayate-openapi ``` Use explicit `Annotated` request sources and return types to drive runtime -binding, validation, JSON serialization, OpenAPI 3.1, and TypeScript types. +binding, validation, JSON serialization, OpenAPI 3.1, TypeScript types, and a +callable Fetch client. + +## Typed client boundary + +`hayate-openapi` emits `api-types.ts` and a status-discriminated +`api-client.ts` from the same OpenAPI 3.1.1 document. The generated client +uses the platform `fetch`, `URL`, `Headers`, `FormData`, and `Blob` APIs, so it +has no runtime npm dependency. Path, query, header, cookie, JSON, +URL-encoded, and multipart inputs stay tied to the published schema. + +The [golden application executes the compiled client against a real ASGI +process](https://github.com/hayatepy/golden-app/blob/842fd2486f3d8bd5c284e44e4f8528b0441a574a/client/check-api-client.ts) +instead of treating generation or type-checking alone as interoperability. ## Server-rendered application @@ -49,7 +62,7 @@ customer workflows. them: ```sh -uvx --from create-hayate==0.12.0 create-hayate --help +uvx --from create-hayate==0.13.0 create-hayate --help ``` Use the [family map](index.md) for current release state and package links. diff --git a/docs/ecosystem/index.md b/docs/ecosystem/index.md index bbe01d2..311e39f 100644 --- a/docs/ecosystem/index.md +++ b/docs/ecosystem/index.md @@ -4,36 +4,36 @@ Choose packages by the boundary your application needs. The core stays small; capabilities are explicit packages with their own release and evidence. -This snapshot is dated **2026-07-30** and is pinned to [`hayatepy/.github` at `0b44120a8e73`](https://github.com/hayatepy/.github/tree/0b44120a8e73d45fcfdfc1ce879faf5cd3452243). Every package is pre-1.0; check the compatibility snapshot before combining versions. +This snapshot is dated **2026-07-30** and is pinned to [`hayatepy/.github` at `975173da2c1b`](https://github.com/hayatepy/.github/tree/975173da2c1be720a4f902cde36ba3822b9b6e56). Every package is pre-1.0; check the compatibility snapshot before combining versions. | Project | Version | Responsibility | Release state | |---|---:|---|---| -| [`hayate`](https://github.com/hayatepy/hayate) | [`0.15.1`](https://pypi.org/project/hayate/) | Core framework and native runtime adapters | Published alpha | -| [`create-hayate`](https://github.com/hayatepy/create-hayate) | [`0.12.0`](https://pypi.org/project/create-hayate/) | Composable project generator | Published alpha | +| [`hayate`](https://github.com/hayatepy/hayate) | [`0.15.1`](https://pypi.org/project/hayate/) | Core framework and native ASGI, Workers, and Lambda adapters | Published alpha | +| [`create-hayate`](https://github.com/hayatepy/create-hayate) | [`0.13.0`](https://pypi.org/project/create-hayate/) | Composable applications with drift-checked first-party TypeScript clients | Published alpha | | [`hayate-auth`](https://github.com/hayatepy/hayate-auth) | [`0.10.1`](https://pypi.org/project/hayate-auth/) | Sessions, API keys, OAuth, passkeys, and authorization server | Published alpha; independent audit pending | | [`hayate-mcp`](https://github.com/hayatepy/hayate-mcp) | [`0.12.0`](https://pypi.org/project/hayate-mcp/) | MCP 2026-07-28 Streamable HTTP and discovery | Published alpha | -| [`hayate-openapi`](https://github.com/hayatepy/hayate-openapi) | [`0.7.0`](https://pypi.org/project/hayate-openapi/) | OpenAPI 3.1, typed endpoints, Scalar, and TypeScript contracts | Published alpha | +| [`hayate-openapi`](https://github.com/hayatepy/hayate-openapi) | [`0.8.1`](https://pypi.org/project/hayate-openapi/) | OpenAPI 3.1, Scalar, and generated zero-runtime TypeScript clients | Published alpha | | [`hayate-sql`](https://github.com/hayatepy/hayate-sql) | [`0.1.1`](https://pypi.org/project/hayate-sql/) | Checked SQL contracts and typed query facades | Published alpha | | [`hayate-fetch`](https://github.com/hayatepy/hayate-fetch) | [`0.1.3`](https://pypi.org/project/hayate-fetch/) | Portable outbound WHATWG-style fetch | Published alpha | | [`hayate-admin`](https://github.com/hayatepy/hayate-admin) | `0.2.0` | Explicit checked-SQL operational administration | Pre-release source | | [`hayate-htmx`](https://github.com/hayatepy/hayate-htmx) | `0.2.0` | Hypermedia, Jinja, htmx, fragments, and SSE | Pre-release source | | [`golden-app`](https://github.com/hayatepy/golden-app) | `0.1.0` | Executable production integration | Reference application | -[Open the tested compatibility snapshot](https://github.com/hayatepy/.github/blob/0b44120a8e73d45fcfdfc1ce879faf5cd3452243/docs/COMPATIBILITY.md) +[Open the tested compatibility snapshot](https://github.com/hayatepy/.github/blob/975173da2c1be720a4f902cde36ba3822b9b6e56/docs/COMPATIBILITY.md) ## hayate Build one Fetch-style Python application for ASGI, Workers, or Lambda. -**Current evidence:** Published alpha, version `0.15.1` · [source at `9e27b0191c7f`](https://github.com/hayatepy/hayate/tree/9e27b0191c7fa9f920ad6fe5b126e190268afba2) +**Current evidence:** Published alpha, version `0.15.1` · [source at `5592276315c9`](https://github.com/hayatepy/hayate/tree/5592276315c9b75e736d3fc204b4900e15f8867a) [Repository](https://github.com/hayatepy/hayate) · [PyPI](https://pypi.org/project/hayate/) ## create-hayate -Start with a tested API, Workers, MCP, auth, SQL, admin, or frontend composition. +Start with a tested API, Workers, MCP, auth, SQL, admin, or frontend composition and keep its generated client in sync. -**Current evidence:** Published alpha, version `0.12.0` · [source at `a1974325ce62`](https://github.com/hayatepy/create-hayate/tree/a1974325ce62a4bce5c6ceab27211675e07b0001) +**Current evidence:** Published alpha, version `0.13.0` · [source at `9fdb98e5642f`](https://github.com/hayatepy/create-hayate/tree/9fdb98e5642ff047e04e24251be1c2747fc7572a) [Repository](https://github.com/hayatepy/create-hayate) · [PyPI](https://pypi.org/project/create-hayate/) @@ -55,9 +55,9 @@ Expose MCP tools on ASGI or native Cloudflare Workers. ## hayate-openapi -Make runtime validation, API documentation, and client types share one contract. +Make runtime validation, API documentation, client types, and a callable Fetch client share one contract. -**Current evidence:** Published alpha, version `0.7.0` · [source at `5d274a7cc337`](https://github.com/hayatepy/hayate-openapi/tree/5d274a7cc337c3336d5316421691779504e592f7) +**Current evidence:** Published alpha, version `0.8.1` · [source at `2ed34215ec3d`](https://github.com/hayatepy/hayate-openapi/tree/2ed34215ec3dd5ebd0a0780f7b7903f0b3492a78) [Repository](https://github.com/hayatepy/hayate-openapi) · [PyPI](https://pypi.org/project/hayate-openapi/) @@ -97,6 +97,6 @@ Build progressively enhanced server-rendered applications without a JavaScript S Review tested trust boundaries and deployment choices before shipping. -**Current evidence:** Reference application, version `0.1.0` · [source at `a424e1417baa`](https://github.com/hayatepy/golden-app/tree/a424e1417baa2830518ce696bb96130f34c90259) +**Current evidence:** Reference application, version `0.1.0` · [source at `842fd2486f3d`](https://github.com/hayatepy/golden-app/tree/842fd2486f3d8bd5c284e44e4f8528b0441a574a) [Repository](https://github.com/hayatepy/golden-app) diff --git a/docs/evidence/compatibility.md b/docs/evidence/compatibility.md index 042644f..d237051 100644 --- a/docs/evidence/compatibility.md +++ b/docs/evidence/compatibility.md @@ -4,7 +4,7 @@ The current public snapshot is dated **2026-07-30**. All packages remain pre-1.0, so compatible versions must be selected from evidence rather than assumed from package names. -[Open the immutable compatibility snapshot](https://github.com/hayatepy/.github/blob/0b44120a8e73d45fcfdfc1ce879faf5cd3452243/docs/COMPATIBILITY.md){ .md-button .md-button--primary } +[Open the immutable compatibility snapshot](https://github.com/hayatepy/.github/blob/975173da2c1be720a4f902cde36ba3822b9b6e56/docs/COMPATIBILITY.md){ .md-button .md-button--primary } ## Golden runtime lock @@ -19,5 +19,20 @@ assumed from package names. | Workers flags | `python_workers` | | Default Workers entrypoint | `WorkerEntrypoint` class | +## Released client evidence + +- `hayate-openapi 0.8.1` generates the dependency-free callable TypeScript + client and validates it against a real Hayate ASGI process. +- `create-hayate 0.13.0` propagates the client, its types, and drift checks + into generated projects. +- The released generator passed all + [112 frontend compositions](https://github.com/hayatepy/create-hayate/actions/runs/30488857568). + The aggregate evidence JSON SHA-256 is + `fb3f4dc15e8d49bd1fdb6a658df70cc33e174a0f9342895f732dca8aa57a8bb9`. +- The [golden application main + run](https://github.com/hayatepy/golden-app/actions/runs/30488723553) + executes authenticated path, query, JSON, multipart, delete, and error + flows through the compiled client. + The generated [family map](../ecosystem/index.md) pins each listed project to the source commit used for this site snapshot. diff --git a/docs/get-started/first-app.md b/docs/get-started/first-app.md index 01fa73f..3f041a0 100644 --- a/docs/get-started/first-app.md +++ b/docs/get-started/first-app.md @@ -9,7 +9,7 @@ Cloudflare Access, checked SQL, request correlation, and production middleware. Install [uv](https://docs.astral.sh/uv/), then run: ```sh -uvx --refresh --from create-hayate==0.12.0 \ +uvx --refresh --from create-hayate==0.13.0 \ create-hayate my-app --template workers --preset production cd my-app ``` @@ -26,6 +26,10 @@ uv sync --locked uv run pytest uv run ruff check . uv run python scripts/check_sql_contracts.py +sh scripts/export_api.sh +test -f openapi.json +test -f client/api-types.ts +test -f client/api-client.ts ``` Commit `uv.lock` and use `uv sync --locked` in CI. The generated `.dev.vars` @@ -38,6 +42,9 @@ credentials. - Uvicorn supplies local ASGI; SQLite supplies local data. - Workerd supplies the native Workers adapter; D1 is a runtime binding. - HTTP and MCP share request identity and checked storage. +- `client/api-types.ts` and the callable `client/api-client.ts` come from the + same OpenAPI document. The client uses platform Fetch APIs and adds no + runtime package dependency. - The default Workers export is a `WorkerEntrypoint` class, preserving named RPC and class handlers such as `scheduled`. diff --git a/docs/index.md b/docs/index.md index 28ba636..7eaaf9f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -83,7 +83,8 @@ description: One Fetch-style Python application across ASGI, Cloudflare Workers,
The published baseline records startup, dependencies, payload, throughput, and a shared HTTP contract. Compatibility is backed by real ASGI, - Workerd/D1, and downstream package runs. + Workerd/D1, downstream package runs, and a generated zero-runtime + TypeScript client executed against real ASGI.
Read the evidence @@ -91,6 +92,6 @@ description: One Fetch-style Python application across ASGI, Cloudflare Workers,START FROM A TESTED COMPOSITION
uvx --from create-hayate==0.12.0 create-hayate my-app --template workers --preset production
uvx --from create-hayate==0.13.0 create-hayate my-app --template workers --preset production