From ca5ca535f9ee8763027ee3e4c30234139efd02c7 Mon Sep 17 00:00:00 2001 From: Bruno Carvalho Date: Mon, 22 Jun 2026 14:10:12 -0300 Subject: [PATCH 1/2] complete seo and docs-site issue bundle --- .github/workflows/ci.yml | 18 +- README.md | 17 +- addons/seo/seo.go | 3 + docs-site/.gitignore | 6 +- docs-site/README.md | 26 +- docs-site/app.css | 50 +- docs-site/cmd/syncdocs/main.go | 266 +++- docs-site/cmd/syncdocs/main_test.go | 69 + .../dist/site/assets/app.f8be0ea9d706.css | 1 - docs-site/dist/site/assets/favicon.ico | Bin 3065 -> 0 bytes .../site/CookieNotice/inline-gowdk.js | 17 - .../components/site/DocsPage/inline-gowdk.js | 195 --- docs-site/dist/site/assets/gowdk/gowdk.js | 1275 ----------------- docs-site/dist/site/assets/wdk_logo.png | Bin 2201557 -> 0 bytes docs-site/dist/site/asyncapi.json | 42 - .../docs/compiler/browser-compiler/index.html | 110 -- .../docs/compiler/build-report/index.html | 105 -- .../endpoint-binding-inspection/index.html | 43 - .../docs/compiler/generated-output/index.html | 352 ----- .../incremental-cache-keys/index.html | 54 - docs-site/dist/site/docs/compiler/index.html | 42 - .../site/docs/compiler/manifest/index.html | 211 --- .../site/docs/compiler/pipeline/index.html | 93 -- .../compiler/project-structure/index.html | 73 - .../compiler/syntax-contributors/index.html | 49 - .../docs/engineering/architecture/index.html | 254 ---- .../engineering/await-blocks-plan/index.html | 32 - .../dist/site/docs/engineering/ci/index.html | 105 -- .../docs/engineering/code-quality/index.html | 34 - .../docs/engineering/conventions/index.html | 27 - .../index.html | 28 - .../index.html | 29 - .../index.html | 45 - .../index.html | 63 - .../index.html | 51 - .../index.html | 104 -- .../index.html | 39 - .../0008-bounded-client-language/index.html | 50 - .../index.html | 51 - .../index.html | 115 -- .../0011-auth-addon-cryptography/index.html | 57 - .../index.html | 68 - .../index.html | 41 - .../index.html | 43 - .../index.html | 45 - .../docs/engineering/decisions/index.html | 34 - .../engineering/dependency-policy/index.html | 67 - .../generated-code-policy/index.html | 55 - .../markup-transitions-plan/index.html | 32 - .../engineering/naming-conventions/index.html | 43 - .../docs/engineering/operations/index.html | 86 -- .../docs/engineering/release-plan/index.html | 379 ----- .../site/docs/engineering/release/index.html | 101 -- .../security-threat-model/index.html | 39 - .../site/docs/engineering/security/index.html | 52 - .../site/docs/engineering/testing/index.html | 75 - .../dist/site/docs/getting-started/index.html | 167 --- .../site/docs/language/actions/index.html | 170 --- .../dist/site/docs/language/api/index.html | 109 -- .../dist/site/docs/language/audit/index.html | 82 -- .../dist/site/docs/language/blocks/index.html | 167 --- .../site/docs/language/components/index.html | 333 ----- .../site/docs/language/conformance/index.html | 71 - .../dist/site/docs/language/data/index.html | 48 - .../site/docs/language/diagnostics/index.html | 71 - .../site/docs/language/formatting/index.html | 56 - .../dist/site/docs/language/forms/index.html | 81 -- .../site/docs/language/grammar/index.html | 96 -- .../dist/site/docs/language/guards/index.html | 58 - .../dist/site/docs/language/hybrid/index.html | 34 - docs-site/dist/site/docs/language/index.html | 58 - .../site/docs/language/layouts/index.html | 92 -- .../dist/site/docs/language/markup/index.html | 267 ---- .../site/docs/language/partials/index.html | 90 -- .../site/docs/language/semantics/index.html | 71 - .../dist/site/docs/language/spec/index.html | 116 -- .../dist/site/docs/language/ssr/index.html | 187 --- .../site/docs/language/stability/index.html | 50 - .../dist/site/docs/language/syntax/index.html | 408 ------ .../docs/product/await-blocks-spec/index.html | 41 - .../product/contract-runtime-spec/index.html | 50 - .../diagnostics-and-navigation/index.html | 83 -- .../docs/product/language-server/index.html | 44 - .../markup-transitions-spec/index.html | 48 - .../observability-tracing-spec/index.html | 37 - .../index.html | 45 - .../site/docs/product/playground/index.html | 71 - .../site/docs/product/requirements/index.html | 37 - .../dist/site/docs/product/roadmap/index.html | 130 -- .../product/security-audit-spec/index.html | 71 - .../dist/site/docs/product/vision/index.html | 79 - .../site/docs/reference/addons/index.html | 344 ----- .../dist/site/docs/reference/cli/index.html | 381 ----- .../site/docs/reference/config/index.html | 494 ------- .../site/docs/reference/contracts/index.html | 654 --------- .../dist/site/docs/reference/css/index.html | 201 --- .../dist/site/docs/reference/db/index.html | 138 -- .../site/docs/reference/deployment/index.html | 315 ---- .../dist/site/docs/reference/dev/index.html | 79 - .../reference/diagnostic-codes/index.html | 160 --- .../docs/reference/diagnostics/index.html | 89 -- .../site/docs/reference/errors/index.html | 67 - .../framework-integrations/index.html | 133 -- .../site/docs/reference/go-interop/index.html | 96 -- .../dist/site/docs/reference/hooks/index.html | 168 --- .../site/docs/reference/images/index.html | 68 - docs-site/dist/site/docs/reference/index.html | 44 - .../site/docs/reference/manifest/index.html | 163 --- .../docs/reference/observability/index.html | 56 - .../docs/reference/pwa-offline/index.html | 71 - .../site/docs/reference/realtime/index.html | 178 --- .../site/docs/reference/routing/index.html | 274 ---- .../dist/site/docs/reference/seo/index.html | 61 - .../site/docs/reference/testing/index.html | 67 - .../site/docs/reference/tracing/index.html | 76 - docs-site/dist/site/favicon.ico | Bin 3065 -> 0 bytes docs-site/dist/site/gowdk-assets.json | 29 - docs-site/dist/site/gowdk-build-report.json | 1076 -------------- docs-site/dist/site/gowdk-routes.json | 510 ------- docs-site/dist/site/index.html | 28 - docs-site/dist/site/openapi.json | 17 - docs-site/render.yaml | 24 +- docs-site/scripts/build-production.sh | 21 + docs-site/scripts/install-tailwind-linux.sh | 14 + docs-site/scripts/smoke-production.sh | 61 + docs-site/src/components/docs-page.cmp.gwdk | 8 +- docs/compiler/build-report.md | 2 + docs/engineering/architecture.md | 2 +- docs/engineering/ci.md | 31 +- docs/engineering/conventions.md | 2 + docs/engineering/documentation-style.md | 40 + ...eo-structured-data-dynamic-sitemap-plan.md | 77 + docs/language/README.md | 86 +- docs/language/semantics.md | 13 +- docs/language/spec.md | 1 + docs/language/stability.md | 1 + docs/language/syntax.md | 4 + docs/product/requirements.md | 2 +- docs/product/roadmap.md | 4 +- ...seo-structured-data-and-dynamic-sitemap.md | 99 ++ docs/reference/addons.md | 10 +- docs/reference/config.md | 36 + docs/reference/manifest.md | 8 +- docs/reference/seo.md | 123 ++ examples/seo/blog-post.page.gwdk | 9 +- examples/seo/gowdk.config.go | 6 + examples/seo/site.page.gwdk | 3 + examples/seo/sitemap.go | 13 + gowdk.go | 22 +- internal/appgen/appgen_test.go | 51 + internal/appgen/auto_routes.go | 5 + internal/appgen/source.go | 56 + internal/appgen/types.go | 2 + internal/buildgen/build.go | 24 + internal/buildgen/build_report_test.go | 58 + internal/buildgen/render.go | 97 +- internal/buildgen/seo.go | 77 + internal/buildgen/seo_test.go | 97 ++ internal/compiler/validate_page.go | 47 + internal/compiler/validate_test.go | 53 + internal/diagnostics/registry.go | 2 + internal/gwdkir/ir.go | 6 + internal/lang/conformance_coverage_test.go | 1 + internal/lang/manifest_json.go | 15 +- internal/parser/metadata.go | 7 + internal/parser/page_test.go | 7 +- internal/parser/patterns.go | 2 +- internal/project/config.go | 50 + internal/project/config_test.go | 10 + internal/syntax/keywords.go | 1 + runtime/seo/seo.go | 206 +++ runtime/seo/seo_test.go | 92 ++ scripts/check-docs-style.sh | 83 ++ 173 files changed, 2102 insertions(+), 14685 deletions(-) create mode 100644 docs-site/cmd/syncdocs/main_test.go delete mode 100644 docs-site/dist/site/assets/app.f8be0ea9d706.css delete mode 100644 docs-site/dist/site/assets/favicon.ico delete mode 100644 docs-site/dist/site/assets/gowdk/components/site/CookieNotice/inline-gowdk.js delete mode 100644 docs-site/dist/site/assets/gowdk/components/site/DocsPage/inline-gowdk.js delete mode 100644 docs-site/dist/site/assets/gowdk/gowdk.js delete mode 100644 docs-site/dist/site/assets/wdk_logo.png delete mode 100644 docs-site/dist/site/asyncapi.json delete mode 100644 docs-site/dist/site/docs/compiler/browser-compiler/index.html delete mode 100644 docs-site/dist/site/docs/compiler/build-report/index.html delete mode 100644 docs-site/dist/site/docs/compiler/endpoint-binding-inspection/index.html delete mode 100644 docs-site/dist/site/docs/compiler/generated-output/index.html delete mode 100644 docs-site/dist/site/docs/compiler/incremental-cache-keys/index.html delete mode 100644 docs-site/dist/site/docs/compiler/index.html delete mode 100644 docs-site/dist/site/docs/compiler/manifest/index.html delete mode 100644 docs-site/dist/site/docs/compiler/pipeline/index.html delete mode 100644 docs-site/dist/site/docs/compiler/project-structure/index.html delete mode 100644 docs-site/dist/site/docs/compiler/syntax-contributors/index.html delete mode 100644 docs-site/dist/site/docs/engineering/architecture/index.html delete mode 100644 docs-site/dist/site/docs/engineering/await-blocks-plan/index.html delete mode 100644 docs-site/dist/site/docs/engineering/ci/index.html delete mode 100644 docs-site/dist/site/docs/engineering/code-quality/index.html delete mode 100644 docs-site/dist/site/docs/engineering/conventions/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0001-llm-ready-project-structure/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0002-compile-first-render-model/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0004-production-wasm-island-abi/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0005-generated-go-emission-boundary/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0007-static-first-spa-navigation/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0008-bounded-client-language/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0009-optional-inline-go-authoring/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0011-auth-addon-cryptography/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0012-realtime-subscribe-surface/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0013-built-in-tracing-observability/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0014-addon-runtime-config-split/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/0015-generated-binary-lifecycle-services/index.html delete mode 100644 docs-site/dist/site/docs/engineering/decisions/index.html delete mode 100644 docs-site/dist/site/docs/engineering/dependency-policy/index.html delete mode 100644 docs-site/dist/site/docs/engineering/generated-code-policy/index.html delete mode 100644 docs-site/dist/site/docs/engineering/markup-transitions-plan/index.html delete mode 100644 docs-site/dist/site/docs/engineering/naming-conventions/index.html delete mode 100644 docs-site/dist/site/docs/engineering/operations/index.html delete mode 100644 docs-site/dist/site/docs/engineering/release-plan/index.html delete mode 100644 docs-site/dist/site/docs/engineering/release/index.html delete mode 100644 docs-site/dist/site/docs/engineering/security-threat-model/index.html delete mode 100644 docs-site/dist/site/docs/engineering/security/index.html delete mode 100644 docs-site/dist/site/docs/engineering/testing/index.html delete mode 100644 docs-site/dist/site/docs/getting-started/index.html delete mode 100644 docs-site/dist/site/docs/language/actions/index.html delete mode 100644 docs-site/dist/site/docs/language/api/index.html delete mode 100644 docs-site/dist/site/docs/language/audit/index.html delete mode 100644 docs-site/dist/site/docs/language/blocks/index.html delete mode 100644 docs-site/dist/site/docs/language/components/index.html delete mode 100644 docs-site/dist/site/docs/language/conformance/index.html delete mode 100644 docs-site/dist/site/docs/language/data/index.html delete mode 100644 docs-site/dist/site/docs/language/diagnostics/index.html delete mode 100644 docs-site/dist/site/docs/language/formatting/index.html delete mode 100644 docs-site/dist/site/docs/language/forms/index.html delete mode 100644 docs-site/dist/site/docs/language/grammar/index.html delete mode 100644 docs-site/dist/site/docs/language/guards/index.html delete mode 100644 docs-site/dist/site/docs/language/hybrid/index.html delete mode 100644 docs-site/dist/site/docs/language/index.html delete mode 100644 docs-site/dist/site/docs/language/layouts/index.html delete mode 100644 docs-site/dist/site/docs/language/markup/index.html delete mode 100644 docs-site/dist/site/docs/language/partials/index.html delete mode 100644 docs-site/dist/site/docs/language/semantics/index.html delete mode 100644 docs-site/dist/site/docs/language/spec/index.html delete mode 100644 docs-site/dist/site/docs/language/ssr/index.html delete mode 100644 docs-site/dist/site/docs/language/stability/index.html delete mode 100644 docs-site/dist/site/docs/language/syntax/index.html delete mode 100644 docs-site/dist/site/docs/product/await-blocks-spec/index.html delete mode 100644 docs-site/dist/site/docs/product/contract-runtime-spec/index.html delete mode 100644 docs-site/dist/site/docs/product/diagnostics-and-navigation/index.html delete mode 100644 docs-site/dist/site/docs/product/language-server/index.html delete mode 100644 docs-site/dist/site/docs/product/markup-transitions-spec/index.html delete mode 100644 docs-site/dist/site/docs/product/observability-tracing-spec/index.html delete mode 100644 docs-site/dist/site/docs/product/playground-hosted-execution-spec/index.html delete mode 100644 docs-site/dist/site/docs/product/playground/index.html delete mode 100644 docs-site/dist/site/docs/product/requirements/index.html delete mode 100644 docs-site/dist/site/docs/product/roadmap/index.html delete mode 100644 docs-site/dist/site/docs/product/security-audit-spec/index.html delete mode 100644 docs-site/dist/site/docs/product/vision/index.html delete mode 100644 docs-site/dist/site/docs/reference/addons/index.html delete mode 100644 docs-site/dist/site/docs/reference/cli/index.html delete mode 100644 docs-site/dist/site/docs/reference/config/index.html delete mode 100644 docs-site/dist/site/docs/reference/contracts/index.html delete mode 100644 docs-site/dist/site/docs/reference/css/index.html delete mode 100644 docs-site/dist/site/docs/reference/db/index.html delete mode 100644 docs-site/dist/site/docs/reference/deployment/index.html delete mode 100644 docs-site/dist/site/docs/reference/dev/index.html delete mode 100644 docs-site/dist/site/docs/reference/diagnostic-codes/index.html delete mode 100644 docs-site/dist/site/docs/reference/diagnostics/index.html delete mode 100644 docs-site/dist/site/docs/reference/errors/index.html delete mode 100644 docs-site/dist/site/docs/reference/framework-integrations/index.html delete mode 100644 docs-site/dist/site/docs/reference/go-interop/index.html delete mode 100644 docs-site/dist/site/docs/reference/hooks/index.html delete mode 100644 docs-site/dist/site/docs/reference/images/index.html delete mode 100644 docs-site/dist/site/docs/reference/index.html delete mode 100644 docs-site/dist/site/docs/reference/manifest/index.html delete mode 100644 docs-site/dist/site/docs/reference/observability/index.html delete mode 100644 docs-site/dist/site/docs/reference/pwa-offline/index.html delete mode 100644 docs-site/dist/site/docs/reference/realtime/index.html delete mode 100644 docs-site/dist/site/docs/reference/routing/index.html delete mode 100644 docs-site/dist/site/docs/reference/seo/index.html delete mode 100644 docs-site/dist/site/docs/reference/testing/index.html delete mode 100644 docs-site/dist/site/docs/reference/tracing/index.html delete mode 100644 docs-site/dist/site/favicon.ico delete mode 100644 docs-site/dist/site/gowdk-assets.json delete mode 100644 docs-site/dist/site/gowdk-build-report.json delete mode 100644 docs-site/dist/site/gowdk-routes.json delete mode 100644 docs-site/dist/site/index.html delete mode 100644 docs-site/dist/site/openapi.json create mode 100755 docs-site/scripts/build-production.sh create mode 100755 docs-site/scripts/install-tailwind-linux.sh create mode 100755 docs-site/scripts/smoke-production.sh create mode 100644 docs/engineering/documentation-style.md create mode 100644 docs/engineering/seo-structured-data-dynamic-sitemap-plan.md create mode 100644 docs/product/seo-structured-data-and-dynamic-sitemap.md create mode 100644 examples/seo/sitemap.go create mode 100644 runtime/seo/seo.go create mode 100644 runtime/seo/seo_test.go create mode 100755 scripts/check-docs-style.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df4afb4b..7c5bed56 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -128,6 +128,9 @@ jobs: - name: Check documentation links run: sh scripts/check-docs-links.sh + - name: Check documentation style + run: sh scripts/check-docs-style.sh + - name: Check for removed source syntax in docs run: sh scripts/check-removed-syntax.sh @@ -148,20 +151,15 @@ jobs: go-version: '1.26.4' cache: true - - name: Compile docs site against in-tree GOWDK + - name: Build and smoke docs site against in-tree GOWDK working-directory: docs-site run: | set -euxo pipefail - # The site embeds dist/site; a placeholder lets the main package - # compile without the full asset build (Render compiles the real site - # at deploy). This job only catches Go/generator drift against HEAD. - mkdir -p dist/site - printf '\n' > dist/site/index.html - go build ./... + scripts/install-tailwind-linux.sh + scripts/build-production.sh + scripts/smoke-production.sh + go test ./... go vet ./... - # The docs generator must run against the repo's own docs/ tree. - go run ./cmd/syncdocs - test -f src/components/docs-sidebar.cmp.gwdk example-reports: name: Example reports diff --git a/README.md b/README.md index 29181488..065a8941 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,10 @@ Replace `github.com/acme/hello-gowdk/ui` with your app module path. ## CLI at a Glance "Inspectable" is not just a slogan — the CLI exposes every stage of the -pipeline. Run `gowdk` with no arguments for full flags. +pipeline. Run `gowdk` with no arguments for the registered command list, and use +[the CLI reference](docs/reference/cli.md) for the complete flag contract. The +command registry is covered by `cmd/gowdk/main_commands_test.go`; this section +is a short overview, not a second source of truth. ### Build and run @@ -157,6 +160,7 @@ pipeline. Run `gowdk` with no arguments for full flags. | `gowdk dev` | Build, serve, rebuild on change, live-reload browsers, show an error overlay | | `gowdk preview` | Build and serve a local deploy preview | | `gowdk serve` | Serve already-generated build output | +| `gowdk clean` | Remove configured generated outputs, with `--dry-run` and `--json` | ### Inspect and debug @@ -168,7 +172,7 @@ pipeline. Run `gowdk` with no arguments for full flags. | `gowdk doctor` | Check local environment and project health | | `gowdk audit` | Derive security posture, evaluate baseline/declared policies, and optionally emit/run audit tests (`--json` for CI) | | `gowdk inspect ir` / `tree` / `endpoint-graph` / `asset-graph` / `go-bindings` | Print validated compiler IR, source-linked node tree, endpoint dispatch graph, asset graph, or Go binding report JSON | -| `gowdk manifest` / `routes` / `sitemap` | Print validated manifest, route/endpoint metadata, or editor site-map JSON | +| `gowdk manifest` / `routes` / `endpoints` / `sitemap` | Print validated manifest, route metadata, backend endpoint metadata, or editor site-map JSON | | `gowdk tokens` | Print raw language tokens for a file | | `gowdk fmt` | Format `.gwdk` sources (`--write`) | @@ -179,6 +183,7 @@ pipeline. Run `gowdk` with no arguments for full flags. | `gowdk generate stubs` | Write conservative missing action/API Go handler stubs next to their owning source package | | `gowdk contracts` / `graph` / `trace` / `list` | Print contract registration metadata, the command/event graph, a single contract trace, or filtered lists of commands/queries/events/jobs | | `gowdk add ` | Wire an optional addon into `gowdk.config.go` (`add --list` for addable built-ins, `add --list --registry` for metadata; `add seo` requires `--base-url`) | +| `gowdk playground policy` / `export` / `run` | Print sandbox policy, archive a source project, or run a project through the explicit hosted-execution sandbox | | `gowdk lsp` | Start the language server over stdio | ## Design @@ -219,7 +224,12 @@ How responsibility is split, and the opinions behind it: ## What Works Today -This table describes the current demoable 0.x slice. Status levels: +This table describes the current demoable 0.x slice. "Current Limit" separates +GOWDK backlog from app-owned work by design; app-owned limits mean the compiler +intentionally leaves domain policy, persistence, credentials, deployment, or +business validation in ordinary Go/application infrastructure. + +Status levels: - **Works** — the listed path works end-to-end today. - **Works, contract unstable** — the listed path works end-to-end, but the @@ -241,6 +251,7 @@ This table describes the current demoable 0.x slice. Status levels: | Components | Works, contract unstable | Components support imported contracts, slots, scoped CSS/assets, first local client behavior, and generated island assets. Page stores can opt into localStorage/sessionStorage persistence with `persist "local"`/`persist "session"`, including WASM island read/write/sync through the host loader. | Non-string props, richer slots/events, real `g:if`/`g:for`, lifecycle cleanup, and dependency diagnostics are planned. | [Components](docs/language/components.md) | [Components](examples/components/base/base-components.page.gwdk) | | WASM islands | Early | Component-level `wasm` and page-level `go client {}` emit Go `js/wasm` browser assets for supported fixtures; build-time validation checks browser-safe imports and ABI exports, browser tests cover mount/event/patch/emit/destroy/store participation, and `runtime/wasm` exposes the Go payload/result helper. | User-code runtime validation beyond the current patch/store contract remains planned. | [Components](docs/language/components.md) | [WASM example](examples/components/wasm/README.md) | | CSS/assets | Works, contract unstable | CSS processors, page CSS, scoped component CSS, component assets, asset manifests, content-hashed filenames, optional production obfuscation for compiler-owned JS, and optional Tailwind wrapper exist. | CSS processor contracts and optional dependency boundaries need hardening. | [CSS](docs/reference/css.md) | [CSS](examples/css/styled.page.gwdk) | +| SEO | Works, contract unstable | The SEO addon emits `sitemap.xml` and `robots.txt`, validates supported `jsonld` page metadata, injects deterministic JSON-LD into generated HTML, and generated apps can serve `/sitemap.xml` by merging public build-time URLs with an optional dynamic sitemap provider. | Search console ownership, private/auth content policy, source-of-truth inventory queries, and request-time-only URL discovery stay app-owned; unsupported schema kinds remain GOWDK backlog. | [SEO](docs/reference/seo.md) | [SEO](examples/seo) | | One-binary output | Works, contract unstable | `gowdk build --app --bin` can generate and compile an embedded Go server for supported SPA/backend/SSR slices, `--docker` emits a minimal non-root Docker context beside the binary, and CI starts the embed example binary to verify health plus embedded page serving. | Runtime operations, richer Docker target config, and split/backend-only deploys are still expanding. | [Deployment](docs/reference/deployment.md) | [Embed](examples/embed/site.page.gwdk) | | Generated app WASM | Early | `gowdk build --app --wasm` compiles the generated app into a Go `js/wasm` deploy artifact, and CI verifies the emitted module header. | Host runtime/loader integration is deploy-platform owned; this is separate from component-level WASM islands. | [Deployment](docs/reference/deployment.md) | [Embed](examples/embed/site.page.gwdk) | | Contracts | Works, contract unstable | Runtime contracts support typed queries, commands, events, jobs, role filtering, local dispatch, file outbox, broker/fanout adapters, worker replay with dedup/backoff hooks, contract graph/trace/list commands, generated `g:command`/`g:query` web adapters, and explicit domain-event to query invalidation metadata. | Separate worker/cron binary generators and editor-first contract visualization remain planned platform tooling. | [Contracts](docs/reference/contracts.md) | [Runtime contracts](runtime/contracts) | diff --git a/addons/seo/seo.go b/addons/seo/seo.go index 7f7d9ffa..15b42946 100644 --- a/addons/seo/seo.go +++ b/addons/seo/seo.go @@ -11,6 +11,9 @@ type Options = gowdk.SEOOptions // URL describes one additional sitemap URL. type URL = gowdk.SEOURL +// DynamicSitemap describes an optional request-time sitemap provider. +type DynamicSitemap = gowdk.SEODynamicSitemap + // Addon enables build-time SEO output. BaseURL is required when building. func Addon(options ...Options) gowdk.Addon { var selected Options diff --git a/docs-site/.gitignore b/docs-site/.gitignore index e2db9ea2..b274c569 100644 --- a/docs-site/.gitignore +++ b/docs-site/.gitignore @@ -1,8 +1,5 @@ -# Generated site output. `dist/site` is committed so Render's default Go build -# can run the docs-site server without a custom build command. +# Generated site output. Production and CI rebuild `dist/site` from source. dist/* -!dist/site/ -!dist/site/** .gowdk/ gowdk_cache/ @@ -18,3 +15,4 @@ app /gowdk-page /syncdocs tools/tailwindcss +tools/gowdk diff --git a/docs-site/README.md b/docs-site/README.md index 162a8700..871ff3c1 100644 --- a/docs-site/README.md +++ b/docs-site/README.md @@ -18,6 +18,10 @@ sidebar, "on this page" TOC, breadcrumbs, prev/next, ⌘K search, copy buttons, callouts) lives in the reusable `DocsPage`/`DocsSidebar`/`Callout` components, so every generated page is modular and consistent. +`dist/site/` is also generated output. It is rebuilt by CI and Render from the +markdown, `.gwdk`, CSS, assets, and in-tree compiler; do not commit generated +HTML or hashed assets from that directory. + ## Prerequisites - Go 1.26.4+. @@ -72,18 +76,13 @@ Watches the `.gwdk` sources and `app.css` and rebuilds on change. Open ## Build Site Output ```sh -go run ./cmd/syncdocs -rm -rf dist/site (cd .. && go build -o docs-site/tools/gowdk ./cmd/gowdk) -./tools/gowdk build -mkdir -p dist/site/assets -cp -R assets/. dist/site/assets/ -cp assets/favicon.ico dist/site/favicon.ico +scripts/build-production.sh ``` -Always run `cmd/syncdocs` before the GOWDK build so the published docs match the -selected GOWDK source. `rm -rf dist/site` is required because the generated tree -mirrors the repo structure and stale routes must not linger. +Always run the production script before starting the site binary. It runs +`cmd/syncdocs`, clears `dist/site`, builds with the in-tree CLI, copies static +assets, and compiles the Go server. CI and Render use the same script. `./tools/gowdk build` compiles the `.gwdk` sources to static HTML, emits each page's `` from its `title`, `description`, and @@ -126,8 +125,7 @@ To preview website changes locally before opening a PR: ./tools/gowdk dev --addr 127.0.0.1:8091 # or a production-faithful preview that serves the exact built output through # the site's own Go binary (the same one that ships to production): -go run ./cmd/syncdocs -rm -rf dist/site && ./tools/gowdk build +scripts/build-production.sh GOWDK_ADDR=127.0.0.1:8091 go run . ``` @@ -156,6 +154,12 @@ project. - `app.css`: Tailwind v4 input and the site's visual system. - `cmd/syncdocs/`: generator that builds the docs pages and sidebar from the main repo's `docs/` markdown (uses `goldmark`). See "Sync docs". +- `scripts/build-production.sh`: production-faithful build used by CI and + Render. +- `scripts/smoke-production.sh`: local smoke check for the generated site + served through the production binary. +- `scripts/install-tailwind-linux.sh`: pinned Tailwind standalone CLI install + for Linux CI/Render environments. - `src/pages/index.page.gwdk`: the documentation home served at `/`. - `src/pages/docs/**.page.gwdk`: the documentation pages — **generated**; do not hand-edit. diff --git a/docs-site/app.css b/docs-site/app.css index 68c9d916..1b91cdaf 100644 --- a/docs-site/app.css +++ b/docs-site/app.css @@ -439,12 +439,13 @@ a { .prose :not(pre) > code { padding: 1px 5px; + border: 1px solid #c6dbe4; border-radius: 5px; - background: var(--color-surface-soft); - color: #0a5f74; + background: #f7fbfd; + color: #174956; font-family: var(--font-mono); font-size: 0.85em; - font-weight: 500; + font-weight: 600; word-break: break-word; } @@ -460,7 +461,7 @@ a { figure.code { margin: 22px 0 28px; border: 1px solid rgba(8, 26, 33, 0.5); - border-radius: 12px; + border-radius: 8px; background: var(--color-code); overflow: hidden; box-shadow: var(--shadow-card); @@ -469,6 +470,7 @@ figure.code { figure.code figcaption { display: flex; align-items: center; + justify-content: space-between; padding: 9px 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.07); color: #8fb2bf; @@ -487,11 +489,36 @@ figure.code pre { line-height: 1.7; } +.code-lang { + display: inline-flex; + min-height: 20px; + align-items: center; +} + .prose pre code { font-family: var(--font-mono); font-size: 13px; } +.tok-keyword, +.tok-directive { + color: #7dd3fc; + font-weight: 650; +} + +.tok-string { + color: #f7c873; +} + +.tok-number { + color: #c4b5fd; +} + +.tok-comment { + color: #8aa6b2; + font-style: italic; +} + /* tables emitted by the docs renderer */ .table-scroll { margin: 22px 0 28px; @@ -897,12 +924,12 @@ figure.code { font-size: 11.5px; font-weight: 600; cursor: pointer; - opacity: 0; + opacity: 0.84; transition: opacity 130ms ease, background 130ms ease; } figure.code:hover .code-copy, -.prose pre:hover .code-copy, +.prose > pre:hover .code-copy, .code-copy:focus-visible { opacity: 1; } @@ -912,13 +939,13 @@ figure.code:hover .code-copy, color: #fff; } -/* generated fenced code blocks (goldmark
) */
-.prose pre {
+/* fallback for any authored raw 
; generated fences use figure.code */
+.prose > pre {
   position: relative;
   margin: 22px 0 28px;
   padding: 16px 18px;
   border: 1px solid rgba(8, 26, 33, 0.5);
-  border-radius: 12px;
+  border-radius: 8px;
   background: var(--color-code);
   color: var(--color-code-text);
   overflow-x: auto;
@@ -1165,12 +1192,15 @@ body.docs-modal-open {
 
   .prose pre,
   figure.code pre {
+    font-size: 12.5px;
+  }
+
+  .prose > pre {
     margin-right: -14px;
     margin-left: -14px;
     border-right: 0;
     border-left: 0;
     border-radius: 0;
-    font-size: 12.5px;
   }
 
   .doc-pager {
diff --git a/docs-site/cmd/syncdocs/main.go b/docs-site/cmd/syncdocs/main.go
index 75123dd0..ca6cc39a 100644
--- a/docs-site/cmd/syncdocs/main.go
+++ b/docs-site/cmd/syncdocs/main.go
@@ -13,12 +13,14 @@ package main
 import (
 	"bytes"
 	"fmt"
+	"html"
 	"os"
 	"path"
 	"path/filepath"
 	"regexp"
 	"sort"
 	"strings"
+	"unicode/utf8"
 
 	"github.com/yuin/goldmark"
 	"github.com/yuin/goldmark/extension"
@@ -44,7 +46,7 @@ var sections = []section{
 	}},
 	{Title: "Reference", Dir: "reference", Order: []string{
 		"README", "routing", "cli", "config", "css", "hooks", "addons",
-		"contracts", "errors", "diagnostics", "diagnostic-codes", "dev",
+		"contracts", "seo", "errors", "diagnostics", "diagnostic-codes", "dev",
 		"deployment", "testing", "framework-integrations", "manifest",
 	}},
 	{Title: "Compiler", Dir: "compiler", Order: []string{
@@ -54,7 +56,7 @@ var sections = []section{
 	{Title: "Engineering", Dir: "engineering", Order: []string{
 		"architecture", "security", "conventions", "naming-conventions",
 		"code-quality", "generated-code-policy", "dependency-policy",
-		"operations", "testing", "ci", "release",
+		"documentation-style", "operations", "testing", "ci", "release",
 	}},
 	{Title: "Decisions", Dir: "engineering/decisions", Order: []string{"README"}},
 	{Title: "Product", Dir: "product", Order: []string{
@@ -99,12 +101,8 @@ func main() {
 		os.Exit(1)
 	}
 
-	routes := map[string]bool{}
 	for _, p := range pages {
-		routes[p.Route] = true
-	}
-	for _, p := range pages {
-		if err := writePage(docsRoot, p, routes); err != nil {
+		if err := writePage(docsRoot, p); err != nil {
 			fmt.Fprintln(os.Stderr, "syncdocs:", p.Rel, err)
 			os.Exit(1)
 		}
@@ -262,8 +260,9 @@ func frontMatter(markdown string) (title, lead string) {
 }
 
 var (
-	hrefRe   = regexp.MustCompile(`href="([^"]+)"`)
-	inlineRe = regexp.MustCompile("[`*_]")
+	hrefRe    = regexp.MustCompile(`href="([^"]+)"`)
+	inlineRe  = regexp.MustCompile("[`*_]")
+	commentRe = regexp.MustCompile(`(?s)`)
 	// GOWDK's view parser requires void elements to be self-closed; goldmark
 	// emits some (task-list , 
,
, ) without the slash. voidRe = regexp.MustCompile(`<(input|br|hr|img|col|area|base|embed|source|track|wbr)([^>]*?)\s*/?>`) @@ -282,12 +281,16 @@ func labelTaskListCheckboxes(s string) string { ``) } -func writePage(docsRoot string, p page, routes map[string]bool) error { +func stripHTMLComments(s string) string { + return commentRe.ReplaceAllString(s, "") +} + +func writePage(docsRoot string, p page) error { payload, err := os.ReadFile(filepath.Join(docsRoot, filepath.FromSlash(p.Rel))) if err != nil { return err } - body := stripFirstH1(string(payload)) + body := stripFirstH1AndLead(string(payload)) var buf bytes.Buffer if err := md.Convert([]byte(body), &buf); err != nil { @@ -295,7 +298,9 @@ func writePage(docsRoot string, p page, routes map[string]bool) error { } article := selfCloseVoids(buf.String()) article = labelTaskListCheckboxes(article) + article = stripHTMLComments(article) article = rewriteLinks(article, p.Rel) + article = highlightCodeBlocks(article) article = escapeBraces(article) var out strings.Builder @@ -327,16 +332,251 @@ func writePage(docsRoot string, p page, routes map[string]bool) error { return os.WriteFile(p.Output, []byte(out.String()), 0o644) } -func stripFirstH1(markdown string) string { +func stripFirstH1AndLead(markdown string) string { lines := strings.Split(strings.ReplaceAll(markdown, "\r\n", "\n"), "\n") for i, line := range lines { if strings.HasPrefix(line, "# ") { - return strings.Join(lines[i+1:], "\n") + return strings.Join(stripLeadingLead(lines[i+1:]), "\n") } } return markdown } +func stripLeadingLead(lines []string) []string { + i := 0 + for i < len(lines) && strings.TrimSpace(lines[i]) == "" { + i++ + } + if i >= len(lines) || !startsPlainLeadParagraph(lines[i]) { + return lines + } + for i < len(lines) && strings.TrimSpace(lines[i]) != "" { + i++ + } + for i < len(lines) && strings.TrimSpace(lines[i]) == "" { + i++ + } + return lines[i:] +} + +func startsPlainLeadParagraph(line string) bool { + t := strings.TrimSpace(line) + if t == "" { + return false + } + if strings.HasPrefix(t, "#") || strings.HasPrefix(t, "```") || + strings.HasPrefix(t, "-") || strings.HasPrefix(t, "* ") || + strings.HasPrefix(t, "1.") || strings.HasPrefix(t, "|") || + strings.HasPrefix(t, ">") { + return false + } + return true +} + +var codeBlockRe = regexp.MustCompile(`(?s)
(.*?)
`) + +func highlightCodeBlocks(article string) string { + return codeBlockRe.ReplaceAllStringFunc(article, func(match string) string { + parts := codeBlockRe.FindStringSubmatch(match) + lang := normalizeLanguage(parts[1]) + label := languageLabel(lang) + highlighted := highlightCode(parts[2], lang) + return `
` + + `
` + html.EscapeString(label) + `
` + + `
` + highlighted + `
` + + `
` + }) +} + +func normalizeLanguage(lang string) string { + lang = strings.ToLower(strings.TrimSpace(lang)) + switch lang { + case "": + return "text" + case "bash", "shell", "console": + return "sh" + case "javascript": + return "js" + case "typescript": + return "ts" + default: + return lang + } +} + +func languageLabel(lang string) string { + switch lang { + case "gwdk": + return "GOWDK" + case "go": + return "Go" + case "sh": + return "Shell" + case "js": + return "JavaScript" + case "ts": + return "TypeScript" + case "json": + return "JSON" + case "yaml", "yml": + return "YAML" + case "toml": + return "TOML" + case "text": + return "Text" + default: + return strings.ToUpper(lang[:1]) + lang[1:] + } +} + +var keywordSets = map[string]map[string]bool{ + "gwdk": words("act api build canonical client component css description emits fragment go guard import jsonld layout noindex page partial paths props route server state title use view wasm"), + "go": words("any bool break case chan const continue default defer else error fallthrough for func go goto if import interface map nil package range return select struct switch type var"), + "sh": words("case cd cp curl do done echo else esac export fi for if in mkdir rm set sh test then"), + "js": words("const else false for function if let new null return true var while"), + "ts": words("const else false for function if interface let new null return string true type var while"), +} + +func words(s string) map[string]bool { + set := map[string]bool{} + for _, word := range strings.Fields(s) { + set[word] = true + } + return set +} + +func highlightCode(codeHTML, lang string) string { + raw := html.UnescapeString(codeHTML) + keywords := keywordSets[lang] + var out strings.Builder + for i := 0; i < len(raw); { + if isBlockCommentStart(raw, i, lang) { + j := strings.Index(raw[i+2:], "*/") + if j < 0 { + out.WriteString(tokenSpan("comment", raw[i:])) + break + } + end := i + 2 + j + 2 + out.WriteString(tokenSpan("comment", raw[i:end])) + i = end + continue + } + if isLineCommentStart(raw, i, lang) { + j := strings.IndexByte(raw[i:], '\n') + if j < 0 { + out.WriteString(tokenSpan("comment", raw[i:])) + break + } + out.WriteString(tokenSpan("comment", raw[i:i+j])) + out.WriteByte('\n') + i += j + 1 + continue + } + if lang == "gwdk" && strings.HasPrefix(raw[i:], "g:") { + j := i + 2 + for j < len(raw) && isIdentPart(raw[j]) { + j++ + } + out.WriteString(tokenSpan("directive", raw[i:j])) + i = j + continue + } + if raw[i] == '"' || raw[i] == '\'' || raw[i] == '`' { + j := scanString(raw, i) + out.WriteString(tokenSpan("string", raw[i:j])) + i = j + continue + } + if isDigit(raw[i]) { + j := i + 1 + for j < len(raw) && (isDigit(raw[j]) || raw[j] == '.' || raw[j] == '_') { + j++ + } + out.WriteString(tokenSpan("number", raw[i:j])) + i = j + continue + } + if isIdentStart(raw[i]) { + j := i + 1 + for j < len(raw) && isIdentPart(raw[j]) { + j++ + } + word := raw[i:j] + if keywords[word] { + out.WriteString(tokenSpan("keyword", word)) + } else { + out.WriteString(html.EscapeString(word)) + } + i = j + continue + } + r, size := utf8.DecodeRuneInString(raw[i:]) + if r == utf8.RuneError && size == 0 { + break + } + out.WriteString(html.EscapeString(raw[i : i+size])) + i += size + } + return out.String() +} + +func isBlockCommentStart(raw string, i int, lang string) bool { + return (lang == "go" || lang == "gwdk" || lang == "js" || lang == "ts") && strings.HasPrefix(raw[i:], "/*") +} + +func isLineCommentStart(raw string, i int, lang string) bool { + if (lang == "go" || lang == "gwdk" || lang == "js" || lang == "ts") && strings.HasPrefix(raw[i:], "//") { + return true + } + if (lang == "sh" || lang == "yaml" || lang == "yml" || lang == "toml") && raw[i] == '#' { + start := strings.LastIndexByte(raw[:i], '\n') + 1 + return strings.TrimSpace(raw[start:i]) == "" + } + return false +} + +func scanString(raw string, start int) int { + quote := raw[start] + i := start + 1 + escaped := false + for i < len(raw) { + if quote != '`' && raw[i] == '\n' { + return i + } + if escaped { + escaped = false + i++ + continue + } + if quote != '`' && raw[i] == '\\' { + escaped = true + i++ + continue + } + if raw[i] == quote { + return i + 1 + } + i++ + } + return i +} + +func tokenSpan(class, text string) string { + return `` + html.EscapeString(text) + `` +} + +func isIdentStart(b byte) bool { + return (b >= 'A' && b <= 'Z') || (b >= 'a' && b <= 'z') || b == '_' +} + +func isIdentPart(b byte) bool { + return isIdentStart(b) || isDigit(b) || b == '-' +} + +func isDigit(b byte) bool { + return b >= '0' && b <= '9' +} + // rewriteLinks turns relative ".md" links into site routes, resolved against // the current page's directory. func rewriteLinks(htmlBody, currentRel string) string { diff --git a/docs-site/cmd/syncdocs/main_test.go b/docs-site/cmd/syncdocs/main_test.go new file mode 100644 index 00000000..c5bc2e4d --- /dev/null +++ b/docs-site/cmd/syncdocs/main_test.go @@ -0,0 +1,69 @@ +package main + +import ( + "strings" + "testing" +) + +func TestStripFirstH1AndLeadRemovesPromotedLead(t *testing.T) { + body := stripFirstH1AndLead(`# Language + +The promoted lead should appear only in the page header. + +## Status + +Body content. +`) + + if strings.Contains(body, "promoted lead") { + t.Fatalf("body still contains promoted lead:\n%s", body) + } + if !strings.Contains(body, "## Status") { + t.Fatalf("body lost first real section:\n%s", body) + } +} + +func TestStripFirstH1AndLeadPreservesImmediateStructuredContent(t *testing.T) { + listBody := stripFirstH1AndLead(`# Language + +- Keep this list. +`) + if !strings.Contains(listBody, "- Keep this list.") { + t.Fatalf("body lost immediate list:\n%s", listBody) + } + + codeBody := stripFirstH1AndLead("# Language\n\n```gwdk\nroute \"/\"\n```\n") + if !strings.Contains(codeBody, "```gwdk") { + t.Fatalf("body lost immediate code fence:\n%s", codeBody) + } +} + +func TestHighlightCodeBlocksWrapsLanguageAndTokens(t *testing.T) { + article := highlightCodeBlocks(`
route "/"
+view {
+  
+}
+
`) + + for _, want := range []string{ + `
`, + `GOWDK`, + `route`, + `"/"`, + `g:post`, + } { + if !strings.Contains(article, want) { + t.Fatalf("highlighted article missing %q:\n%s", want, article) + } + } +} + +func TestStripHTMLCommentsRemovesGoldmarkRawHTMLMarker(t *testing.T) { + body := stripHTMLComments(`

Text continues.

`) + if strings.Contains(body, "raw HTML omitted") || strings.Contains(body, "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≈4#)@sk34*%&I*OaG?Wx$TK6?S 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%0A<^bF=>0zj!$$sIQNp*3;%-3@$D8baljP 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

ri#h`sfUdtHB2xhD(g4-7e#CDU2bbF;wf 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

qU-kDIr%NZ0xqB!9 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

(rrVOU@T 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%0DkcfI>{1D&Z^RoP=e_xokY0C>AHdrke@!6Pkt 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%0DyJBXl{Ab%yDjc-3Q@I6m3gR%pKR>teb^% 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

cGBSiiP*_FMet| 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 z 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%0A4g1z0Nhlacefo9e_W)RoX}OhB$|s|4#h84qN`Cl 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 z%0D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 GLSTY>f~pq) diff --git a/docs-site/dist/site/asyncapi.json b/docs-site/dist/site/asyncapi.json deleted file mode 100644 index 5a1a8b5a..00000000 --- a/docs-site/dist/site/asyncapi.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "asyncapi": "3.0.0", - "info": { - "title": "GOWDK contract events", - "version": "0" - }, - "channels": {}, - "operations": {}, - "components": { - "messageTraits": { - "cloudEvents": { - "headers": { - "type": "object", - "properties": { - "datacontenttype": { - "type": "string" - }, - "id": { - "type": "string" - }, - "source": { - "type": "string" - }, - "specversion": { - "type": "string" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "type": { - "type": "string" - } - } - } - } - } - }, - "x-gowdk": { - "schema": "gowdk.asyncapi.v1" - } -} diff --git a/docs-site/dist/site/docs/compiler/browser-compiler/index.html b/docs-site/dist/site/docs/compiler/browser-compiler/index.html deleted file mode 100644 index 0ebde73c..00000000 --- a/docs-site/dist/site/docs/compiler/browser-compiler/index.html +++ /dev/null @@ -1,110 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Browser-Facing Output - GOWDK</title> - <meta name="description" content="GOWDK does not compile arbitrary Go or JavaScript for the browser by default. The current browser-facing output slices are:"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Browser-Facing Output - GOWDK"> - <meta property="og:description" content="GOWDK does not compile arbitrary Go or JavaScript for the browser by default. The current browser-facing output slices are:"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Browser-Facing Output - GOWDK"> - <meta name="twitter:description" content="GOWDK does not compile arbitrary Go or JavaScript for the browser by default. The current browser-facing output slices are:"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Browser-Facing Output</h1><p class="doc-lead">GOWDK does not compile arbitrary Go or JavaScript for the browser by default. The current browser-facing output slices are:</p></header><article class="prose"><p>GOWDK does not compile arbitrary Go or JavaScript for the browser by default. -The current browser-facing output slices are:</p><ul><li>Partial form enhancement runtime emitted as <code>assets/gowdk/gowdk.js</code>.</li><li>Generated JavaScript islands for stateful components.</li><li>Component-level WASM island asset emission for components that declare -<code>wasm</code>, with <code>g:island=&#34;wasm&#34;</code> still supported as a call-site override.</li></ul><p>Framework-owned browser runtime source lives under <code>internal/clientrt/assets/</code> -as ordinary <code>.js</code> files embedded with <code>go:embed</code>. Buildgen consumes those -sources through small template helpers for component names, page IDs, asset -paths, and WASM export names; it should not grow new multi-hundred-line -JavaScript raw strings in Go files.</p><h2 id="partial-runtime">Partial Runtime</h2><p>When a page uses a fragment-producing action form with <code>g:target</code> and <code>g:swap</code>, -SPA builds emit the client runtime:</p><pre><code class="language-gwdk">&lt;form g:post={Refresh} g:target=&#34;#patients&#34; g:swap=&#34;innerHTML&#34;&gt; - &lt;input name=&#34;query&#34; /&gt; - &lt;button&gt;Refresh&lt;/button&gt; -&lt;/form&gt; -</code></pre><p>The compiler lowers this to normal form attributes plus <code>data-gowdk-*</code> -metadata and emits a deferred script tag for <code>assets/gowdk/gowdk.js</code>.</p><p>The runtime:</p><ul><li>Submits enhanced forms with <code>X-GOWDK-Partial</code>, <code>X-GOWDK-Target</code>, and -<code>X-GOWDK-Swap</code> headers.</li><li>Applies <code>innerHTML</code> or <code>outerHTML</code> swaps.</li><li>Reloads the current page when the response carries <code>X-GOWDK-Reload: 1</code>.</li><li>Dispatches <code>gowdk:before-request</code>, <code>gowdk:after-swap</code>, and -<code>gowdk:request-error</code>. Failed enhanced requests include response <code>status</code>, -<code>body</code>, and <code>response</code> in event detail when available.</li><li>Toggles <code>aria-busy</code> on the submitting form.</li><li>Restores focus by matching the active element&#39;s <code>id</code> or <code>name</code> when possible.</li><li>Calls generated island destroy and mount hooks around replaced island DOM.</li></ul><h2 id="javascript-islands">JavaScript Islands</h2><p>Stateful components use generated JavaScript by default:</p><pre><code class="language-gwdk">component Counter - -import ui &#34;github.com/acme/app/ui&#34; - -state ui.CounterState = ui.NewCounterState() - -client { - fn Increment() { - Count++ - } -} - -view { - &lt;button g:on:click={Increment()}&gt;{Count}&lt;/button&gt; -} -</code></pre><p>The compiler validates a small Go-like client subset and emits browser -JavaScript under <code>assets/gowdk/islands/</code>: one shared <code>island.js</code> runtime plus -small package-scoped component registration stubs.</p><p>Supported island syntax is documented in <code>docs/language/syntax.md</code>, -<code>docs/language/markup.md</code>, and <code>docs/language/components.md</code>. The subset -includes scalar handler parameters, scalar locals, field assignment, -increment/decrement, arithmetic, comparisons, boolean logic, conditional -expressions, computed values, lifecycle/effect blocks, refs, simple bindings, -conditionals, keyed list rendering, and compiler-owned list/string/numeric -built-ins.</p><p>Unsupported today:</p><ul><li>Arbitrary Go syntax in the browser.</li><li>Arbitrary JavaScript.</li><li>Loops in client handlers.</li><li>Event object reads.</li><li>Broad date/time/browser APIs.</li><li>Recursive helper functions.</li><li>User-defined browser runtime imports.</li></ul><h2 id="component-level-wasm-islands">Component-Level WASM Islands</h2><p>Components declare WASM at the component level:</p><pre><code class="language-gwdk">component Counter -wasm ./browser/counter - -view { - &lt;button&gt;Counter&lt;/button&gt; -} -</code></pre><pre><code class="language-gwdk">&lt;Counter /&gt; -</code></pre><p>When <code>wasm</code> points to a local package, GOWDK builds that package with -<code>GOOS=js GOARCH=wasm</code>. The package must be browser-safe and cannot import -server/process/network packages such as <code>net/http</code>, <code>os/exec</code>, <code>database/sql</code>, -raw <code>syscall</code>, <code>plugin</code>, or <code>unsafe</code>. Declared Go WASM island packages also -ship <code>assets/gowdk/islands/wasm_exec.js</code>; the generated component loader first -tries a direct WASM instantiate path and falls back to Go runtime imports when a -compiled Go module needs them.</p><p>Declared browser-side Go packages must produce a browser WASM module and export -the component-scoped ABI entrypoints with the current <code>func() uint32</code> -signature:</p><pre><code class="language-go">import gowdkwasm &#34;github.com/cssbruno/gowdk/runtime/wasm&#34; - -//go:wasmexport GOWDKMountCounter -func GOWDKMountCounter() uint32 { - return gowdkwasm.ReturnResult(gowdkwasm.Result{Patches: []any{}}) -} - -//go:wasmexport GOWDKHandleCounter -func GOWDKHandleCounter() uint32 { return gowdkwasm.ReturnPatches([]any{}) } - -//go:wasmexport GOWDKDestroyCounter -func GOWDKDestroyCounter() uint32 { return gowdkwasm.ReturnPatches([]any{}) } -</code></pre><p>The generated loader passes a <code>gowdk-wasm-island-v1</code> bootstrap object containing -component name, state, props, emits, refs, compiler-owned binding metadata, and -the current values of any page stores declared with <code>use</code>. Event and destroy -payloads carry the same ABI version. Go exports can read the current payload and -return JSON through <code>runtime/wasm</code>; the loader accepts either a legacy patch -array or <code>{ patches, stores }</code>, writes returned store values back to page stores, -and rejects unsupported patch operations with a console error. Missing required -exports and startup failures are reported to the browser console instead of -silently disabling the island.</p><p>Normal calls to a component with <code>wasm</code> use the WASM island runtime. If a -component is called with <code>g:island=&#34;wasm&#34;</code> and no <code>wasm</code> package is declared, -GOWDK emits the current placeholder module plus loader shape.</p><p>See <code>examples/components/wasm/</code> for a runnable component-level WASM ABI example -that emits the component <code>.wasm</code>, host loader, and <code>wasm_exec.js</code> assets.</p><h2 id="production-mode">Production Mode</h2><p><code>Build.Mode</code> affects generated island assets:</p><pre><code class="language-go">Build: gowdk.BuildConfig{ - Mode: gowdk.Production, - Output: &#34;dist/site&#34;, -} -</code></pre><p>Development mode emits JavaScript island source maps. Production mode omits -<code>.js.map</code> artifacts and <code>sourceMappingURL</code> comments and compacts generated -island JavaScript. <code>Build.ObfuscateAssets</code> or <code>gowdk build --obfuscate-assets</code> -enables stronger deterministic minification/identifier shortening for -compiler-owned generated browser JavaScript in production builds.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/build-report/index.html b/docs-site/dist/site/docs/compiler/build-report/index.html deleted file mode 100644 index 9859da51..00000000 --- a/docs-site/dist/site/docs/compiler/build-report/index.html +++ /dev/null @@ -1,105 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Build Report - GOWDK</title> - <meta name="description" content="Every app generation entrypoint creates a structured build report. Disk builds write it to gowdk-build-report.json at the selected output root; in-memory builds return the same..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Build Report - GOWDK"> - <meta property="og:description" content="Every app generation entrypoint creates a structured build report. Disk builds write it to gowdk-build-report.json at the selected output root; in-memory builds return the same..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Build Report - GOWDK"> - <meta name="twitter:description" content="Every app generation entrypoint creates a structured build report. Disk builds write it to gowdk-build-report.json at the selected output root; in-memory builds return the same..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Build Report</h1><p class="doc-lead">Every app generation entrypoint creates a structured build report. Disk builds write it to gowdk-build-report.json at the selected output root; in-memory builds return the same file in MemoryResult.Files; failed builds wrap the original error in buildgen.BuildError so callers can inspect the partial report while preserving the original error text. Callers without a real output root can use BuildMemoryWithOptions or BuildMemoryFromIRWithOptions; an empty OutputBase uses . for deterministic relative path metadata and does not create files or report directories.</p></header><article class="prose"><p>Every app generation entrypoint creates a structured build report. Disk -builds write it to <code>gowdk-build-report.json</code> at the selected output root; -in-memory builds return the same file in <code>MemoryResult.Files</code>; failed builds -wrap the original error in <code>buildgen.BuildError</code> so callers can inspect the -partial report while preserving the original error text. -Callers without a real output root can use <code>BuildMemoryWithOptions</code> or -<code>BuildMemoryFromIRWithOptions</code>; an empty <code>OutputBase</code> uses <code>.</code> for deterministic -relative path metadata and does not create files or report directories.</p><p>The report is mandatory for compiler-facing build APIs. It is deterministic: -it does not include timestamps or durations, so unchanged builds can still skip -rewriting identical generated files.</p><p>Build timings are opt-in and separate. <code>gowdk build --timings</code> writes -<code>gowdk-build-timings.json</code> at the output root, and <code>gowdk build --timings=&lt;file&gt;</code> writes the same versioned JSON shape to a custom file. Timing -data is not printed to stdout and is not added to <code>gowdk-build-report.json</code>.</p><h2 id="schema">Schema</h2><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;mode&#34;: &#34;build&#34;, - &#34;outputDir&#34;: &#34;dist/site&#34;, - &#34;events&#34;: [ - { - &#34;level&#34;: &#34;info&#34;, - &#34;stage&#34;: &#34;validate&#34;, - &#34;kind&#34;: &#34;ir_valid&#34;, - &#34;message&#34;: &#34;compiler IR validation completed&#34; - } - ] -} -</code></pre><p><code>mode</code> is <code>build</code>, <code>memory</code>, or <code>incremental</code>. Events use <code>debug</code>, <code>info</code>, or -<code>error</code> levels and record the compiler stage, a stable event kind, a message, -and optional page, route, path, and string data fields.</p><p>Current stages are:</p><ul><li><code>start</code>: compiler IR counts at build entry.</li><li><code>validate</code>: compiler IR and compiler contract validation.</li><li><code>plan</code>: SPA page, CSS, and runtime asset planning.</li><li><code>write</code>: page, CSS, and runtime asset writes or memory collection.</li><li><code>manifest</code>: route and asset manifest reads/writes.</li><li><code>seo</code>: optional sitemap/robots output and sitemap route exclusions.</li><li><code>cleanup</code>: stale changed-page output removal during incremental builds.</li><li><code>complete</code>: successful build summary.</li><li><code>report</code>: build report serialization or write failure.</li></ul><p>Current report events include:</p><ul><li><code>cache_policy</code>: summarizes generated page, CSS, asset, and request-time cache -policies.</li><li><code>asset_obfuscation</code>: summarizes whether production generated-asset -obfuscation was enabled and how many compiler-owned browser assets were -transformed.</li><li><code>asset_obfuscated</code>: one event per compiler-owned generated browser asset -transformed by <code>Build.ObfuscateAssets</code> or <code>gowdk build --obfuscate-assets</code>, -including before/after hashes, byte counts, and whether the payload changed.</li><li><code>asset_size</code>: one event per generated runtime asset, including JavaScript, -source maps, WASM modules, and loaders. <code>data.kind</code> is <code>javascript</code>, <code>wasm</code>, -<code>sourcemap</code>, <code>css</code>, or <code>asset</code>; <code>data.bytes</code> is the generated byte count. -For <code>assets/gowdk/islands/wasm_exec.js</code>, <code>data.wasmExecGoVersion</code> records -the Go toolchain version that supplied the runtime file.</li><li><code>contract_reference</code>: one event per linked or unlinked <code>g:command</code>/<code>g:query</code> -reference, including owner, source, status, route metadata, roles, and -handler/register metadata when known.</li><li><code>realtime_subscription</code>: one event per <code>g:subscribe</code> reference, including -query, presentation event, owner, source, status, roles, and handler/register -metadata when known.</li><li><code>query_invalidation</code>: one event per validated domain-event to query -invalidation edge used by bound <code>g:query</code> regions, including query, event, -owner, source, status, and guard metadata when known.</li><li><code>sitemap_written</code> / <code>robots_written</code>: emitted when <code>addons/seo</code> writes -<code>sitemap.xml</code> and <code>robots.txt</code>.</li><li><code>seo_route_excluded</code>: emitted when <code>addons/seo</code> excludes a page from the -build-time sitemap, with <code>data.reason</code> and render <code>mode</code>. Reasons include -request-time rendering, missing dynamic <code>paths {}</code>, and guardless routes that -the generated app denies by default.</li></ul><h2 id="cli-debug-output">CLI Debug Output</h2><p><code>gowdk build --debug</code> prints a readable version of this report to stderr while -normal generated artifact paths remain on stdout. <code>gowdk dev</code> forwards -<code>--debug</code> as a build flag, including incremental SPA rebuilds.</p><p>Example:</p><pre><code class="language-sh">gowdk build --debug --out dist/site src/pages/home.page.gwdk -</code></pre><p>Generated file paths are still scriptable from stdout; report details are only -printed to stderr when <code>--debug</code> is present. The JSON report file is generated -for every successful disk build even without <code>--debug</code>.</p><h2 id="cli-timing-output">CLI Timing Output</h2><p><code>gowdk build --timings</code> records elapsed phase durations and simple counters in -a separate sidecar:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;mode&#34;: &#34;build&#34;, - &#34;outputDir&#34;: &#34;dist/site&#34;, - &#34;phases&#34;: [ - { - &#34;name&#34;: &#34;parse_lower&#34;, - &#34;durationMs&#34;: 1.25 - } - ], - &#34;counters&#34;: { - &#34;source_files&#34;: 1, - &#34;files_written&#34;: 4, - &#34;identical_writes_skipped&#34;: 0 - } -} -</code></pre><p>Current phases include <code>config_load</code>, <code>source_discovery</code>, <code>parse_lower</code>, -<code>ir_assembly</code>, <code>go_binding</code>, <code>ir_validation</code>, <code>contract_validation</code>, -<code>output_plan_writes</code>, <code>app_generation</code>, <code>binary_build</code>, <code>wasm_build</code>, -<code>backend_app_generation</code>, and <code>backend_binary_build</code> when those paths run.</p><p><code>gowdk dev</code> incremental SPA rebuilds reuse the same sidecar when <code>--timings</code> is -forwarded in the build flags. Incremental counters include -<code>incremental_input_changes</code>, <code>incremental_page_changes</code>, -<code>incremental_component_changes</code>, <code>incremental_layout_changes</code>, -<code>incremental_affected_pages</code>, <code>files_written</code>, and -<code>identical_writes_skipped</code>.</p><h2 id="benchmarks">Benchmarks</h2><p>Use Go&#39;s benchmark runner for repeatable compiler regression tracking:</p><pre><code class="language-sh">go test ./internal/parser ./internal/gwdkanalysis ./internal/compiler ./internal/buildgen -run &#39;^$&#39; -bench &#39;Benchmark(ParseLowerPage|IRAssembly|ValidateProgram|GeneratedOutputFromValidatedIR|IncrementalRebuildChangedPage)$&#39; -benchmem -count=5 -</code></pre><p>Stable benchmark names:</p><ul><li><code>BenchmarkParseLowerPage</code>: parses and lowers one representative page source.</li><li><code>BenchmarkIRAssembly</code>: assembles pages/components into <code>gwdkir.Program</code>.</li><li><code>BenchmarkValidateProgram</code>: runs compiler validation on assembled IR.</li><li><code>BenchmarkGeneratedOutputFromValidatedIR</code>: writes SPA output from validated IR.</li><li><code>BenchmarkIncrementalRebuildChangedPage</code>: rewrites the changed-page -incremental build path.</li></ul><p>Capture local baselines with the command above and compare with <code>benchstat</code>. -CI should run benchmarks for trend data only; do not gate merges on fixed -duration thresholds because hardware and filesystem variance are expected.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/endpoint-binding-inspection/index.html b/docs-site/dist/site/docs/compiler/endpoint-binding-inspection/index.html deleted file mode 100644 index 1aac03d3..00000000 --- a/docs-site/dist/site/docs/compiler/endpoint-binding-inspection/index.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: go/packages Endpoint Binding Inspection - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: go/packages Endpoint Binding Inspection - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: go/packages Endpoint Binding Inspection - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Feature Spec: go/packages Endpoint Binding Inspection</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Endpoint binding used to parse sibling <code>.go</code> files directly and match AST -shapes. That could drift from ordinary Go semantics for build tags, renamed -imports, type aliases, package load failures, and exact exported package-scope -symbols.</p><h2 id="goals">Goals</h2><ul><li>Inspect real same-directory Go packages through <code>golang.org/x/tools/go/packages</code>.</li><li>Resolve endpoint handlers from package type information instead of import-name -AST matching.</li><li>Preserve the current supported action, API, fragment, and SSR load -signatures.</li><li>Keep missing and unsupported bindings explicit for generated HTTP 501 stubs -and strict production diagnostics.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Add new endpoint signatures.</li><li>Change <code>.gwdk</code> endpoint syntax.</li><li>Change inline <code>go {}</code> extraction. Inline generated Go blocks still use the -existing synthetic AST path because they are not real packages on disk yet.</li></ul><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li>Owning source directories are loaded as Go packages with <code>packages.Load</code>.</li><li>Exported package-scope handler symbols are inspected through <code>types.Info</code>, -<code>types.Signature</code>, and package scope/type metadata.</li><li>Build-tag-excluded files do not bind handlers unless their tags are active in -the build environment.</li><li>Renamed imports and response type aliases resolve according to Go type -identity.</li><li>Package load errors become clear missing-binding metadata.</li><li>Typed action input fields are derived from compiled <code>types.Struct</code> metadata -and preserve existing form tag and supported-field-type behavior.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Performance: only owning endpoint package directories are loaded, and each -directory is cached for the current binding pass.</li><li>Reliability: unsupported signatures continue to be reported without importing -or referencing invalid handlers in generated output.</li><li>Security/privacy: diagnostics and binding messages do not include submitted -form values or runtime secrets.</li><li>Observability: public route/build metadata keeps the existing binding status, -message, import path, package, function, signature, and input field fields.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Handler binding uses type-checked Go package information for real Go -packages.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Build-tag-excluded handlers remain missing by default.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Renamed imports and response type aliases resolve correctly.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Non-exported handlers remain missing.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Package load errors produce clear binding metadata.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Unsupported signatures still fail strict production builds unless missing -backend stubs are explicitly allowed.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Existing generated app behavior remains compatible for supported -signatures.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Internal: <code>internal/compiler</code>, <code>internal/gwdkir</code>, generated app consumers of -backend binding metadata.</li><li>External: <code>golang.org/x/tools/go/packages</code>, used only by the compiler to load -owning Go packages with standard Go semantics.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/generated-output/index.html b/docs-site/dist/site/docs/compiler/generated-output/index.html deleted file mode 100644 index 4c62dfc1..00000000 --- a/docs-site/dist/site/docs/compiler/generated-output/index.html +++ /dev/null @@ -1,352 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Generated Output - GOWDK</title> - <meta name="description" content="Generated output currently covers app-shell HTML, selected browser runtime assets, generated embedded app source, and optional local binary or Go js/wasm artifacts for the..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Generated Output - GOWDK"> - <meta property="og:description" content="Generated output currently covers app-shell HTML, selected browser runtime assets, generated embedded app source, and optional local binary or Go js/wasm artifacts for the..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Generated Output - GOWDK"> - <meta name="twitter:description" content="Generated output currently covers app-shell HTML, selected browser runtime assets, generated embedded app source, and optional local binary or Go js/wasm artifacts for the..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Generated Output</h1><p class="doc-lead">Generated output currently covers app-shell HTML, selected browser runtime assets, generated embedded app source, and optional local binary or Go js/wasm artifacts for the implemented compiler slice.</p></header><article class="prose"><p>Generated output currently covers app-shell HTML, selected browser runtime assets, -generated embedded app source, and optional local binary or Go <code>js/wasm</code> -artifacts for the implemented compiler slice.</p><p>Implemented today:</p><ul><li><code>gowdk build [--out &lt;dir&gt;] [files...]</code> writes route-derived HTML files for simple <code>spa</code> and <code>action</code> pages.</li><li><code>.cmp.gwdk</code> files can be passed to build or discovered by default and expanded from self-closing component calls.</li><li><code>gowdk-routes.json</code> records the app route, page ID, and relative output path for emitted pages.</li><li><code>gowdk-assets.json</code> records generated app assets such as CSS files emitted -by CSS processors, generated page CSS files, the partial-update client -runtime when needed, and route HTML cache metadata.</li><li><code>sitemap.xml</code> and <code>robots.txt</code> are emitted only when <code>addons/seo</code> is enabled. -The sitemap includes public static and <code>paths {}</code>-expanded SPA routes plus -configured extra URLs; request-time and guardless default-denied pages are -excluded and listed in the build report.</li><li><code>gowdk-build-report.json</code> records build-output generator validation, planning, -write, manifest, cleanup, and completion events for every successful disk -build.</li><li>Page <code>title</code>, <code>description</code>, <code>canonical</code>, <code>image</code>, app-level -<code>Build.Head</code>, configured stylesheets, and CSS processor stylesheet links are -emitted in page <code>&lt;head&gt;</code> elements. <code>Build.Head</code> enables favicon, Open Graph, -and Twitter card tags without a post-build patcher.</li><li>CSS processors can emit CSS asset files under the output directory.</li><li>Discovered page CSS inputs selected by implicit <code>default page</code> or explicit -<code>css</code> metadata declarations are concatenated into generated page CSS files. Page -<code>style {}</code> CSS is appended to the same generated page CSS asset.</li><li>Page <code>js &#34;./file.js&#34;</code> declarations are copied under -<code>assets/gowdk/pages/&lt;page&gt;/</code> and linked only from that page as module scripts. -Page <code>js &#34;./file.ts&#34;</code> declarations are transformed to <code>.js</code> files in the same -directory. Inline page <code>js {}</code> blocks emit deterministic files such as -<code>inline-gowdk.js</code>.</li><li>Component <code>css</code> files are emitted as scoped CSS assets, linked from pages -whose composed view recursively calls the component, content-hashed, recorded -in <code>gowdk-assets.json</code>, and served with immutable cache headers by generated -binaries. Component <code>style {}</code> CSS is emitted through the same scoped CSS -path.</li><li>Component <code>js &#34;./file.js&#34;</code> declarations are copied under -<code>assets/gowdk/components/&lt;package&gt;/&lt;component&gt;/</code> and linked only from pages -that use the component. Component <code>js &#34;./file.ts&#34;</code> declarations are -transformed to <code>.js</code> files in the same directory. Inline component <code>js {}</code> -blocks emit deterministic files such as <code>inline-gowdk.js</code>. This first slice -does not bundle JavaScript or follow import graphs.</li><li>Layout <code>style {}</code> CSS is emitted as generated CSS and linked by pages that -declare the layout.</li><li>Dynamic app routes with literal <code>paths {}</code> declarations are expanded by -<code>gowdk build</code>.</li><li>Literal dynamic route params can render in the current literal <code>view {}</code> -interpolation subset.</li><li>Literal <code>build {}</code> data can render in the current literal <code>view {}</code> -interpolation subset.</li><li>Imported and same-package Go build functions can return <code>T</code> or <code>(T, error)</code>; -dynamic <code>paths {}</code> output can pass route params through one -<code>gowdk.BuildParams</code> argument.</li><li>SPA page output composes declared layouts by replacing each applied -layout&#39;s single <code>&lt;slot /&gt;</code> placeholder before rendering the combined view -source once.</li><li><code>gowdk build --app &lt;dir&gt;</code> writes a generated Go module that embeds the SPA -output under <code>&lt;dir&gt;/SPA</code>.</li><li><code>gowdk build --bin &lt;file&gt;</code> requires <code>--app</code> and compiles that generated app -into one local binary.</li><li>Generated apps include POST endpoint handlers for the first supported -action subset on concrete SPA page paths.</li><li>Generated embedded and backend-only app packages expose -<code>RegisterMiddleware(runtime/app.Middleware)</code>. Registered middleware wraps the -full generated app handler chain in registration order before static serving, -health checks, generated headers, and request-time route dispatch.</li><li>When <code>auth.Addon(auth.Options{...})</code> is configured, generated embedded and -backend-only app startup configures <code>addons/auth</code> sessions, registers the -default <code>auth.required</code> guard, and wires the session provider for native -<code>role:</code> / <code>permission:</code> guards. App login/logout handlers can use -<code>auth.DefaultSessions()</code> to issue or clear the same signed session cookie.</li><li>Generated embedded and backend-only app packages expose -<code>App() (*runtime/app.Application, error)</code> for full generated-binary startup. -<code>App()</code> shares one generated identity across the web handler and lifecycle -service context, collects configured lifecycle services, and exposes the -generated mux to service <code>Mount</code> hooks.</li><li><code>gowdk inspect go-bindings</code> reports Go binding status for actions, APIs, -fragments, SSR load functions, build-time Go calls, and web command/query -references. <code>gowdk generate stubs</code> can write missing action/API handler -stubs as normal Go code beside the owning source package.</li><li>Query-owned realtime subscription regions render <code>data-gowdk-query</code>, -<code>data-gowdk-subscribe</code>, and validated <code>data-gowdk-subscribe-type</code> markers -after <code>g:subscribe</code> validation. Generated apps mount -<code>/_gowdk/realtime/events</code>, expose <code>RealtimeEventsPath</code> and -<code>RegisterRealtimeFanout</code>, and dispatch command-emitted presentation events to -subscription-filtered SSE fanout. Generated <code>gowdk.js</code> connects subscribed -pages to the stream and applies explicit <code>replaceHTML</code> patches to the -matching query-owned region.</li><li>Generated apps pass one backend hook into <code>runtime/app.Handler</code>; generated -action and API dispatch are internal details behind that hook.</li><li>Generated app creation auto-detects supported action endpoints and supported -SSR routes from the parsed manifest used by <code>gowdk build --app</code>, so the CLI -does not need to manually register those handler hooks.</li><li>Generated apps include form input decoder functions that -preserve repeated values and reject unexpected fields inferred from direct -literal controls in same-page <code>g:post</code> forms.</li><li>Named submit controls discovered in literal <code>g:post</code> forms are included in -the allowlist as submit-intent fields before unknown-field rejection; local -<code>type=&#34;button&#34;</code> and reset controls are not included.</li><li>Generated action handlers cap request bodies before form parsing and return -HTTP 413 for oversized submissions.</li><li>Generated apps return HTTP 422 for missing or empty direct SPA -<code>required</code> fields when the action declares <code>valid(input)?</code>.</li><li>Generated build output emits <code>assets/gowdk/gowdk.js</code> only for pages that use -partial form metadata with fragment-producing actions.</li><li>Framework-owned browser runtime sources are authored as <code>.js</code> files under -<code>internal/clientrt/assets/</code> and embedded with <code>go:embed</code>; generated output -helpers only perform narrow placeholder substitution for component names, -page IDs, asset paths, and WASM export names.</li><li>Generated build output emits one shared JavaScript island runtime at -<code>assets/gowdk/islands/island.js</code> plus small package-scoped registration stubs -such as <code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.js</code> for stateful component -instances that use the default generated JavaScript island runtime. Island -roots carry compiler-owned <code>data-gowdk-island</code> markers plus a -package-qualified component id, and the shared runtime registers idempotent -browser mount hooks for initial load and partial-swap remounts plus destroy -hooks for islands removed by partial swaps. The generated JavaScript is scoped -to matching <code>&lt;gowdk-island&gt;</code> roots rather than hydrating the full page. The -shared runtime carries a compact binding descriptor table and updates collected -bindings through per-binding functions for text, form values, checked state, -classes, styles, attributes, conditionals, and lists; keyed list updates reuse -existing DOM nodes by <code>g:key</code>, remove stale keyed nodes, and toggle -compiler-owned <code>gowdk-transition-*</code> / <code>gowdk-animate-*</code> classes when -<code>g:transition</code> or <code>g:animate</code> are present.</li><li>Page store seed JSON embedded in compiler-owned -<code>&lt;script type=&#34;application/json&#34;&gt;</code> tags escapes literal <code>&lt;</code> as <code>\u003c</code>, so -store data cannot terminate the script element or enter HTML escaped-script -parser states.</li><li>In the default development build mode, generated JavaScript island stubs are -accompanied by <code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.js.map</code> source map -files that reference the component <code>.gwdk</code> source, are recorded in -<code>gowdk-assets.json</code>, include the component registration source span, and are -linked from the stub JS with <code>sourceMappingURL</code>. -<code>Build.Mode: gowdk.Production</code> omits those debug source map artifacts and -comments and compacts generated island JavaScript. <code>Build.ObfuscateAssets</code> -or <code>gowdk build --obfuscate-assets</code> enables stronger deterministic -minification/identifier shortening for compiler-owned generated browser -JavaScript in production builds.</li><li>Generated build output emits package-scoped island assets: -<code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.js</code> stubs for generated -JavaScript islands, and <code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.wasm</code> plus -<code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.wasm.js</code> for normal calls to -components that declare <code>wasm &lt;package&gt;</code> or explicit call-site overrides that -set <code>g:island=&#34;wasm&#34;</code>. When the component declares <code>wasm &lt;package&gt;</code>, GOWDK -runs <code>GOOS=js GOARCH=wasm go build</code> for that package and writes the compiled -browser WASM module to the component asset path plus -<code>assets/gowdk/islands/wasm_exec.js</code> for Go&#39;s browser runtime imports. Local -packages are checked for browser-safe imports before build; server, process, -and network packages such as <code>net/http</code>, <code>os/exec</code>, and <code>database/sql</code> are -rejected. A package that does not produce a WASM module or omits required ABI -exports fails the build. Components without <code>wasm</code> keep the minimal -placeholder module for the loader-shape slice and do not ship <code>wasm_exec.js</code>. -The loader discovers matching island roots, builds the ADR-defined bootstrap -object from ABI version <code>gowdk-wasm-island-v1</code>, state, props, emits, refs, -binding metadata, and current page-store values, calls component-scoped WASM -exports when present, decodes Go-style <code>uint32</code> JSON result pointers, captures -host DOM events, writes returned store values back to page stores, and applies -the supported validated patch commands for text, visibility, attribute, class, -style, and emitted-event updates. The build report records the Go toolchain -version used for generated <code>wasm_exec.js</code> runtime assets.</li><li>Generated apps can serve concrete and dynamic SSR pages in the supported -generated request-time slice. Dynamic route params are substituted into -generated SSR placeholders with request-time HTML escaping. Declared -<code>server { =&gt; { field } }</code> pages call same-package Go load functions named -<code>Load&lt;PageID&gt;</code> with <code>ssr.LoadContext</code> and replace declared load placeholders -with escaped returned values. Load errors that wrap <code>ssr.RedirectError</code> -become no-store local redirects; other load failures use generated error-page -output.</li><li>Request-time SSR and hybrid pages compose declared layouts before rendering -the generated response, and load placeholders are shared across page and -layout markup. Generated route metadata records the layout stack.</li><li>Generated embedded apps load optional <code>404.html</code> and <code>500.html</code> from the -embedded build output and use those pages for not-found responses and -generated SSR load failures. SSR routes can also declare -<code>error &#34;/errors/page.html&#34;</code> to use a generated route-local HTML error page -for load failures, generated render failures, and route panics before -falling back to <code>500.html</code>.</li><li>Generated SSR, action, and API request-time lanes recover panics before -response headers are written as no-store HTTP 500 responses without exposing -panic values. SSR route panics use a declared route-local <code>error</code> page when -one is available. Action and API declarations can also use endpoint-local -<code>error &#34;/errors/name.html&#34;</code> pages for generated panic boundaries.</li><li>Generated action, API, fragment, contract, SSR load, and addon 5xx error -responses hide ordinary returned error details from clients. Apps can expose -an intentional client message by returning <code>response.HandlerError</code> with an -explicit <code>Message</code>; generated 4xx handler errors keep their application -message contract.</li><li>Generated apps can return partial fragment responses from -action handlers for <code>X-GOWDK-Partial</code> requests and standalone -<code>fragment Name GET &#34;/path&#34; &#34;#target&#34; { ... }</code> routes. Standalone fragment -routes can be concrete or dynamic; dynamic fragment route params are matched -with <code>runtime/route</code> and exposed to hooks through <code>runtime/app.Params(ctx)</code> -and <code>runtime/app.TypedParams(ctx)</code>. Standalone fragment bodies can expand -known components at app generation time. If the source package exports -<code>func Name(context.Context) (response.Response, error)</code>, the generated -fragment handler calls that request-time hook instead of the static fallback.</li><li>Generated app action endpoint extraction rejects direct file inputs and -multipart <code>g:post</code> forms. Uploads belong in user-owned API/server handlers.</li><li><code>internal/compiler</code> resolves same-package action, API, fragment, and SSR load -handlers through <code>go/packages</code> and <code>go/types</code>, so build tags, renamed imports, -type aliases, and package load errors follow ordinary Go package semantics.</li><li><code>internal/gotypes</code> resolves component prop/state structs through Go module -import paths using <code>go list</code>, <code>go/parser</code>, and <code>go/types</code>.</li><li><code>addons/partial</code> exposes generated fragment and swap helpers. The underlying -<code>runtime/response</code> envelope carries target and swap metadata for generated -and future partial handlers.</li><li><code>/</code> maps to <code>index.html</code>.</li><li><code>/patients</code> maps to <code>patients/index.html</code>.</li><li>Current asset names are stable and deterministic. <code>gowdk-assets.json</code> -records content hashes and cache policy for generated CSS/runtime assets and -component-level <code>asset</code> files. Generated CSS is minified and emitted with -content-hashed filenames. Component <code>asset</code> files are emitted with -content-hashed filenames under <code>assets/gowdk/components/</code>.</li><li>CSS link order is deterministic: configured global links, processor global -links, processor page-specific links, generated page CSS, layout CSS, then -scoped component CSS for components used by the page.</li><li>Generated embedded apps skip local environment files, source maps, source -files, VCS/dependency directories, and common temporary artifacts when copying -build output into the embedded app.</li><li>Generated embedded apps load <code>gowdk-assets.json</code> from the embedded filesystem -when present and expose the loaded asset count through <code>/_gowdk/health</code>.</li></ul><p>Not implemented yet:</p><ul><li>Full page-aware third-party CSS processor selection beyond the current -processor stylesheet and generated CSS asset support.</li><li>Non-string props in inline <code>props {}</code> blocks.</li><li>Arbitrary build-time statements beyond literal expression records and -imported/same-package build data functions returning <code>T</code> or <code>(T, error)</code>.</li><li>Broader user Go type resolution beyond typed action decoders, user action -logic, API handlers, and general fragment routes.</li><li>Generated handlers beyond the supported action, API, fragment, and SSR load -signatures. Strict production builds diagnose missing or unsupported -action/API bindings with <code>backend_binding_required</code>; migration builds must -opt into <code>--allow-missing-backend</code> or <code>Build.AllowMissingBackend</code> to emit -explicit HTTP 501 stubs.</li></ul><h2 id="compatibility-notes">Compatibility Notes</h2><p>Generated output is still pre-1.0. Public releases must document -generated-output changes that can affect checked-in deploy recipes, generated -app imports, route manifests, asset manifests, cache headers, or generated -binary behavior.</p><p>The stable compatibility surface for v0.1 is intentionally narrow:</p><ul><li><code>gowdk-routes.json</code>, <code>gowdk-assets.json</code>, and <code>gowdk-build-report.json</code> -include explicit <code>version</code> fields.</li><li>Generated app entrypoints expose full process startup through -<code>gowdkapp.App()</code> plus standard request-only <code>net/http</code> handlers through -<code>gowdkapp.Handler()</code> and <code>gowdkapp.ServeMux()</code>.</li><li>Generated binaries serve selected embedded output and request-time routes from -the same build metadata used by <code>gowdk build --out</code>.</li><li>Generated asset logical paths resolve through <code>gowdk-assets.json</code>; consumers -should not hard-code content-hashed filenames.</li></ul><p>Generated source layout, helper function names, private package internals, and -intermediate files under selected app/output directories may change between -pre-1.0 releases unless a reference doc explicitly names them as public.</p><h2 id="target-artifacts">Target Artifacts</h2><p>The target output can include:</p><ul><li>App-shell HTML for <code>spa</code> and <code>action</code> pages.</li><li>Route manifest JSON.</li><li>Generated Go app/runtime adapter code.</li><li>Generated action handlers and typed form decoders.</li><li>Generated API handlers.</li><li>Generated server fragment handlers.</li><li>Optional SSR route handlers.</li><li>CSS processor addon artifacts.</li><li>Embedded asset manifest.</li><li>A generated Go command for one-binary app serving.</li></ul><h2 id="current-generated-app">Current Generated App</h2><p><code>gowdk build --out dist --app .gowdk/app</code> writes:</p><pre><code class="language-text">.gowdk/app/ - go.mod - gowdkapp/ - app.go - SPA/ - index.html - gowdk-routes.json - gowdk-assets.json - sitemap.xml # only with addons/seo - robots.txt # only with addons/seo - gowdk-build-report.json - cmd/ - server/ - main.go -</code></pre><p><code>gowdk build --out dist --app .gowdk/app --bin dist/site</code> then runs <code>go build</code> -for <code>.gowdk/app/cmd/server</code> and writes <code>dist/site</code>.</p><p>The generated <code>gowdkapp</code> package exposes <code>App() (*runtime/app.Application, error)</code> for generated binary startup plus <code>Handler() (http.Handler, error)</code> and -<code>ServeMux() (*http.ServeMux, error)</code> for request-only <code>net/http</code>, Chi, Echo, -Gin, and other router integrations. It also exposes <code>RegisterMiddleware</code> for -app-owned <code>net/http</code> middleware that should be installed before <code>Handler()</code> or -<code>ServeMux()</code> constructs the generated handler. The generated <code>cmd/server</code> -entrypoint calls <code>App()</code>, reads <code>GOWDK_ADDR</code>, defaults to <code>127.0.0.1:8080</code>, -serves GET and HEAD requests, applies <code>http.Server</code> defaults of -<code>ReadHeaderTimeout: 5s</code>, <code>ReadTimeout: 10s</code>, <code>WriteTimeout: 30s</code>, -<code>IdleTimeout: 60s</code>, and <code>MaxHeaderBytes: 1 MiB</code>, and hands the server to -<code>runtime/app.Run</code> for service supervision, SIGINT/SIGTERM handling, and -graceful shutdown. It maps extensionless routes to nested <code>index.html</code> files -and does not list directories. It exposes <code>/_gowdk/health</code> and adds -<code>X-GOWDK-App</code>, <code>X-GOWDK-Module</code>, and <code>X-GOWDK-Instance-ID</code> headers to responses. -When <code>Build.SecurityHeaders.Enabled</code> is true, generated apps also pass the -configured header map into <code>runtime/app</code> so every response path emits those -headers. -Request-time action/API/fragment dispatch registers generated backend routes with -<code>runtime/app.BackendRouter</code> and passes the router hook into <code>runtime/app</code>. -Generated action/API body caps default to 1 MiB and use <code>Build.BodyLimits</code> -overrides when configured. Older separate action/API hook fields remain a -compatibility path for existing -generated apps. -It loads <code>gowdk-assets.json</code>, <code>404.html</code>, <code>500.html</code>, and route-local SSR -<code>error</code> pages from the embedded build output filesystem when present. -Identity comes from <code>GOWDK_APP_ID</code>, <code>GOWDK_MODULE_NAME</code>, and -<code>GOWDK_INSTANCE_ID</code>; if no instance ID is provided, the app creates one at -process start from the module name, hostname, and a random token. It can also -serve auto-detected POST redirect handlers for the first supported action -subset and supported SSR/hybrid pages with or without declared <code>server {}</code> -identifier or dotted paths. SSR load functions can return safe local redirects with -<code>ssr.RedirectTo</code>/<code>ssr.Redirect</code>, and generated SSR load failures render the -route-local <code>error</code> page when declared or the optional <code>500.html</code> when -present. -Action handlers decode allowlisted form fields into named input wrappers, -cap request bodies before parsing, preserve repeated values, return HTTP 413 -for oversized submissions, return HTTP 400 for unexpected fields, and return -HTTP 422 for generated required-field validation failures. Direct file inputs -and multipart action forms are rejected before generated app output because -uploads are user-owned API/server behavior. For -partial requests, generated handlers can return the first parsed action -fragment matching <code>X-GOWDK-Target</code> and expose fragment target/swap metadata in -headers. Feature-bound generated action handlers can call no-input, -<code>form.Values</code>, typed value, and typed pointer same-package Go handlers; typed -handlers decode through generated normal Go functions built from Go AST input -struct metadata. Generated action and web-command POST handlers enable CSRF by -default: generated apps read a signing secret from <code>Build.CSRF.SecretEnv</code> or -<code>GOWDK_CSRF_SECRET</code>, inject hidden CSRF token fields into served HTML POST -forms, validate POSTs before generated decoding or user handlers run, and -return HTTP 403 <code>invalid csrf token</code> with <code>Cache-Control: no-store</code> for invalid -tokens. Set <code>Build.CSRF.Disabled</code> only for an intentional opt-out. The -generated app does not run user-defined validation beyond handler logic, -handle uploads, stream hybrid responses, refresh hybrid server data in place, or -perform non-HTTP revalidation today.</p><p>Generated app source is an output artifact and sits downstream of feature -packages. Feature packages may import stable public GOWDK runtime/addon -packages, but must not import generated <code>gowdkapp</code> packages, generated -<code>cmd/server</code> packages, build output directories, or any path under the selected -generated app directory. This keeps the dependency direction one-way: generated -adapters import user feature packages and call exported handlers.</p><h2 id="current-spa-route-manifest">Current SPA Route Manifest</h2><p><code>gowdk build</code> writes <code>gowdk-routes.json</code> at the output root:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;routes&#34;: [ - { - &#34;page&#34;: &#34;home&#34;, - &#34;route&#34;: &#34;/&#34;, - &#34;path&#34;: &#34;index.html&#34; - } - ], - &#34;endpoints&#34;: [ - { - &#34;kind&#34;: &#34;action&#34;, - &#34;directive&#34;: &#34;act&#34;, - &#34;method&#34;: &#34;POST&#34;, - &#34;route&#34;: &#34;/login&#34;, - &#34;page&#34;: &#34;login&#34;, - &#34;symbol&#34;: &#34;Login&#34;, - &#34;handler&#34;: &#34;actions.LoginLogin&#34;, - &#34;guards&#34;: [&#34;public&#34;], - &#34;csrf&#34;: true - } - ] -} -</code></pre><p>The <code>path</code> field is slash-separated and relative to the selected output -directory. Dynamic app routes are recorded once for each generated concrete -route, for example <code>/blog/{slug}</code> with <code>=&gt; { slug: &#34;hello-gowdk&#34; }</code> is recorded -as <code>/blog/hello-gowdk</code>. The optional <code>endpoints</code> array records generated -request-time action, API, fragment, command, and query adapter routes; it does -not point at static files. Dynamic endpoint routes also include -<code>dynamicParams</code> and typed <code>routeParams</code> when route parameters are declared.</p><h2 id="current-app-asset-manifest">Current App Asset Manifest</h2><p><code>gowdk build</code> writes <code>gowdk-assets.json</code> at the output root:</p><pre><code class="language-json">{ - &#34;version&#34;: 2, - &#34;files&#34;: { - &#34;assets/app.css&#34;: &#34;assets/app.7ada5a1234b1.css&#34; - }, - &#34;hashes&#34;: { - &#34;assets/app.css&#34;: &#34;sha256:...&#34; - }, - &#34;sizes&#34;: { - &#34;assets/app.css&#34;: 1204 - }, - &#34;cache&#34;: { - &#34;assets/app.css&#34;: &#34;public, max-age=31536000, immutable&#34;, - &#34;index.html&#34;: &#34;public, max-age=120&#34; - }, - &#34;obfuscated&#34;: { - &#34;assets/gowdk/gowdk.js&#34;: true - } -} -</code></pre><p>The <code>files</code> map resolves logical asset names to slash-separated paths relative -to the selected output directory. <code>hashes</code> records SHA-256 content hashes for -generated assets, <code>sizes</code> records generated asset byte counts, <code>cache</code> records -the HTTP cache policy generated binaries should apply when serving generated -assets or route HTML files, and <code>obfuscated</code> marks compiler-owned generated -browser assets transformed by production asset obfuscation. The current -implementation records CSS files emitted by CSS processors, generated page CSS -files, partial runtime assets, generated island runtime assets, generated -island source maps, WASM island assets, and page-level <code>cache</code> policies for -generated SPA HTML. It does not record configured stylesheet URLs that were not -written by the build.</p><h2 id="current-build-report">Current Build Report</h2><p><code>gowdk build</code> writes <code>gowdk-build-report.json</code> at the output root:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;mode&#34;: &#34;build&#34;, - &#34;outputDir&#34;: &#34;dist/site&#34;, - &#34;events&#34;: [ - { - &#34;level&#34;: &#34;info&#34;, - &#34;stage&#34;: &#34;complete&#34;, - &#34;kind&#34;: &#34;build_complete&#34;, - &#34;message&#34;: &#34;SPA build completed&#34; - } - ] -} -</code></pre><p>The report records build-output generator stages even when the CLI is not run with -<code>--debug</code>. Debug mode only mirrors the structured events to stderr for humans.</p><h2 id="planned-server-defaults">Planned Server Defaults</h2><p>Generated servers must include HTTP timeouts, header/body limits, method handling, safe app asset serving, and logs that do not expose secrets or sensitive form values.</p><h2 id="ownership-and-licensing">Ownership And Licensing</h2><p>Generated output ownership and license policy are documented in <code>../../LICENSE</code> -and <code>../engineering/generated-code-policy.md</code>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/incremental-cache-keys/index.html b/docs-site/dist/site/docs/compiler/incremental-cache-keys/index.html deleted file mode 100644 index 23d2b74c..00000000 --- a/docs-site/dist/site/docs/compiler/incremental-cache-keys/index.html +++ /dev/null @@ -1,54 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Incremental Cache Keys - GOWDK</title> - <meta name="description" content="GOWDK cache keys are deterministic compiler inputs, not runtime state. The cache model is split by phase so invalidation can stay local and reviewable."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Incremental Cache Keys - GOWDK"> - <meta property="og:description" content="GOWDK cache keys are deterministic compiler inputs, not runtime state. The cache model is split by phase so invalidation can stay local and reviewable."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Incremental Cache Keys - GOWDK"> - <meta name="twitter:description" content="GOWDK cache keys are deterministic compiler inputs, not runtime state. The cache model is split by phase so invalidation can stay local and reviewable."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Incremental Cache Keys</h1><p class="doc-lead">GOWDK cache keys are deterministic compiler inputs, not runtime state. The cache model is split by phase so invalidation can stay local and reviewable.</p></header><article class="prose"><p>GOWDK cache keys are deterministic compiler inputs, not runtime state. The -cache model is split by phase so invalidation can stay local and reviewable.</p><h2 id="key-model">Key Model</h2><p>Each key is a stable hash over the fields that affect the next compiler phase:</p><ul><li><code>.gwdk</code> source key: parsed source kind, package, declared identity, route, -metadata declarations, imports, <code>use</code> declarations, block bodies, endpoints, -component contracts, layout references, CSS/asset selections, and source file -path. Parser errors use the raw file hash until the file parses again.</li><li>Go ABI key: owning package import path, package name, exported handler/type -names used by <code>.gwdk</code>, resolved signatures, relevant struct fields and tags, -build tags, GOOS/GOARCH, and Go toolchain version. Function bodies are not ABI -input unless generated output embeds the body through an inline Go block.</li><li>Config/target key: normalized compiler config, selected modules, selected -build target, output mode, enabled feature flags, and active addons that affect -generated output.</li><li>Toolchain key: Go version, GOOS/GOARCH, build tags, and compiler feature -gates that can change package loading or generated code.</li><li>IR key: stable <code>gwdkir.Program</code> records that downstream generators consume, -excluding diagnostics ordering noise and runtime-only secrets.</li><li>Output-plan key: generated route, asset, CSS, app, backend, WASM, and binary -plans plus the generator version that owns their shape.</li><li>Generated-file key: output path, content hash, cache policy, and the source -output-plan record that produced it.</li></ul><p>Runtime-only values do not invalidate static output. For example, CSRF secret -values rotate at runtime and are not cache inputs unless the generated code shape -or config field that enables CSRF changes.</p><h2 id="reverse-dependencies">Reverse Dependencies</h2><p>Reverse dependencies answer &#34;which pages must be regenerated when this input -changes?&#34; and are derived from IR plus parsed view references:</p><ul><li>Page source changes affect that page.</li><li>Component source changes affect pages that call the component directly or -through another component.</li><li>Layout source changes affect pages that name the layout, including parent -layout chains.</li><li>CSS source changes affect CSS artifacts and pages that include the stylesheet.</li><li>Backend binding ABI changes affect generated adapters and reports, not static -page HTML unless a build/load function contributes build-time output.</li><li>Config, target, addon, toolchain, added source, and removed source changes -conservatively invalidate the whole selected build.</li></ul><p>Dependencies stay attached to explicit source kinds. Avoid catch-all global -cache state; a phase may cache local package inspection or output planning, but -the invalidation edge must name the source kind and owner.</p><h2 id="implemented-slice">Implemented Slice</h2><p>The current implementation keeps the existing content-hash input snapshot for -<code>gowdk dev</code>, then adds reverse dependencies for incremental SPA rebuilds:</p><ul><li>changed page sources still render only those pages;</li><li>changed component sources render pages that reference the component directly -or transitively through another component;</li><li>changed layout sources render pages that use the layout or a child layout that -inherits from it;</li><li>added, removed, config, generated app, binary, WASM, backend, and configured -target changes still fall back to the full build path.</li></ul><p>When <code>--timings</code> is enabled, incremental rebuilds write the same timing sidecar -as normal builds and include counters for input changes, affected pages, -component/layout/page changes, files written, and identical writes skipped.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/index.html b/docs-site/dist/site/docs/compiler/index.html deleted file mode 100644 index 0cd0d6a3..00000000 --- a/docs-site/dist/site/docs/compiler/index.html +++ /dev/null @@ -1,42 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Compiler - GOWDK</title> - <meta name="description" content="This directory documents GOWDK compiler behavior and generated-output contracts."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Compiler - GOWDK"> - <meta property="og:description" content="This directory documents GOWDK compiler behavior and generated-output contracts."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Compiler - GOWDK"> - <meta name="twitter:description" content="This directory documents GOWDK compiler behavior and generated-output contracts."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Compiler</h1><p class="doc-lead">This directory documents GOWDK compiler behavior and generated-output contracts.</p></header><article class="prose"><p>This directory documents GOWDK compiler behavior and generated-output contracts.</p><h2 id="current-status">Current Status</h2><p>Implemented today:</p><ul><li>Recursive <code>.gwdk</code> discovery through <code>internal/discover</code>.</li><li>Page and component metadata parsing through <code>internal/parser</code>.</li><li>IR-derived manifest JSON and site-map reports through <code>internal/lang</code>.</li><li>Render-rule, duplicate identity, redundant component, and component contract -validation through <code>internal/compiler</code>.</li><li>SPA <code>view {}</code> markup parsing through <code>internal/viewparse</code> and rendering -through <code>internal/viewrender</code>.</li><li>Imported Go props/state contract resolution through <code>internal/gotypes</code>.</li><li>Route-binding metadata for <code>gowdk routes</code> through <code>internal/compiler</code>.</li><li>App-shell HTML, route manifest, and asset manifest emission for simple build-time -pages, literal build data, imported and same-package Go build data functions, -literal dynamic paths, components, partial runtime assets, and island runtime -assets through <code>internal/buildgen</code>.</li><li>Mandatory SPA build reports through <code>internal/buildgen</code>, written as -<code>gowdk-build-report.json</code> for disk builds and returned on build errors.</li><li>Generated embedded app source and optional binary compilation through -<code>internal/appgen</code>, including supported action/API/fragment handlers, form -input decoder and required-field validation wrappers, CSRF wiring, guards, -concrete or dynamic SSR routes with declared <code>server {}</code> fields, and concrete -or dynamic hybrid request-time routes with or without declared <code>server {}</code> -fields.</li><li>SPA <code>gowdk.config.go</code> loading for build source discovery, build targets, -and output through <code>internal/project</code>.</li><li>CLI tools for <code>tokens</code>, <code>fmt</code>, <code>check</code>, <code>manifest</code>, <code>sitemap</code>, <code>build</code>, and <code>lsp</code>.</li></ul><p>Not implemented yet:</p><ul><li>Full AST/semantic/type analysis beyond the current component contract slice.</li><li>Full component compilation, arbitrary <code>build {}</code> statements beyond expression -records, and full <code>paths {}</code> execution.</li><li>Broader generated-client reactivity beyond explicit reload/fragment outcomes.</li><li>Hybrid streaming, data refresh, and non-HTTP revalidation.</li></ul><h2 id="documents">Documents</h2><ul><li><code>pipeline.md</code>: current and target compile pipeline.</li><li><code>project-structure.md</code>: current source inputs and planned project layout.</li><li><code>generated-output.md</code>: planned generated artifacts and current limitations.</li><li><code>endpoint-binding-inspection.md</code>: current Go package binding inspection.</li><li><code>browser-compiler.md</code>: browser-facing partial runtime, JavaScript islands, and -component-level WASM island behavior.</li><li><code>build-report.md</code>: generated build report schema and CLI debug output.</li><li><code>incremental-cache-keys.md</code>: compiler cache-key model and implemented -incremental invalidation slice.</li><li><code>manifest.md</code>: manifest and site-map JSON contracts.</li><li><code>syntax-contributors.md</code>: checklist for parser, diagnostics, IR, generation, -docs, and fixture coverage when syntax changes.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/manifest/index.html b/docs-site/dist/site/docs/compiler/manifest/index.html deleted file mode 100644 index 4ce1f8e7..00000000 --- a/docs-site/dist/site/docs/compiler/manifest/index.html +++ /dev/null @@ -1,211 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Manifest - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Manifest - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Manifest - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Manifest</h1></header><article class="prose"><h2 id="current-internal-model">Current Internal Model</h2><p>The internal manifest tracks pages with source path, page ID, route, render -package name, mode, layouts, guard metadata, page CSS selection metadata, paths presence, -block presence, captured <code>paths {}</code> body text, captured <code>build {}</code> body text, -captured <code>view {}</code> body text, and first-slice action metadata. It also tracks -component build inputs with source path, package name, component name, component Go imports, -inline string props, typed props/state contracts, and captured <code>view {}</code> body -text. Stateful components can also carry captured <code>client {}</code> body text for -component-local generated-JS handlers and <code>emits {}</code> metadata for component -events.</p><p>Compiler validation now rejects malformed routes, duplicate route params, -duplicate page route patterns, and same-method route conflicts before generated -output runs. Page routes own <code>GET</code>; action and API behavior is backend endpoint -metadata with declared method/path. Current API metadata defaults to <code>GET</code> on -the page route when API method or route data is absent. Current pages must also -declare <code>view {}</code> because they own a page <code>GET</code> route.</p><h2 id="current-public-manifest-json">Current Public Manifest JSON</h2><p><code>gowdk manifest</code> currently emits:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;pages&#34;: { - &#34;home&#34;: { - &#34;source&#34;: &#34;examples/pages/home.page.gwdk&#34;, - &#34;kind&#34;: &#34;page&#34;, - &#34;package&#34;: &#34;pages&#34;, - &#34;route&#34;: &#34;/&#34;, - &#34;render&#34;: &#34;spa&#34;, - &#34;uses&#34;: [ - {&#34;alias&#34;: &#34;ui&#34;, &#34;package&#34;: &#34;components&#34;} - ], - &#34;layouts&#34;: [&#34;root&#34;], - &#34;paths&#34;: true, - &#34;guard&#34;: [&#34;auth.required&#34;], - &#34;css&#34;: [&#34;default&#34;, &#34;page&#34;], - &#34;components&#34;: [&#34;Hero&#34;], - &#34;assets&#34;: [&#34;/assets/hero.png&#34;], - &#34;cssClasses&#34;: [&#34;hero&#34;, &#34;lead&#34;], - &#34;styleAttributes&#34;: [&#34;color: red;&#34;], - &#34;blocks&#34;: { - &#34;paths&#34;: true, - &#34;build&#34;: true, - &#34;load&#34;: false, - &#34;view&#34;: true, - &#34;actions&#34;: [&#34;submit&#34;] - }, - &#34;actions&#34;: [ - { - &#34;name&#34;: &#34;submit&#34;, - &#34;inputName&#34;: &#34;input&#34;, - &#34;inputType&#34;: &#34;SignupInput&#34;, - &#34;validatesInput&#34;: true, - &#34;redirect&#34;: &#34;/signup?ok=1&#34;, - &#34;fragments&#34;: [ - {&#34;target&#34;: &#34;#signup-result&#34;} - ] - } - ], - &#34;apis&#34;: [ - { - &#34;name&#34;: &#34;health&#34;, - &#34;method&#34;: &#34;GET&#34;, - &#34;route&#34;: &#34;/api/health&#34; - } - ] - } - }, - &#34;components&#34;: { - &#34;Hero&#34;: { - &#34;source&#34;: &#34;examples/pages/hero.cmp.gwdk&#34;, - &#34;kind&#34;: &#34;component&#34;, - &#34;package&#34;: &#34;components&#34;, - &#34;imports&#34;: [ - {&#34;alias&#34;: &#34;ui&#34;, &#34;path&#34;: &#34;github.com/acme/app/ui&#34;} - ], - &#34;propsType&#34;: {&#34;alias&#34;: &#34;ui&#34;, &#34;name&#34;: &#34;HeroProps&#34;}, - &#34;state&#34;: { - &#34;type&#34;: {&#34;alias&#34;: &#34;ui&#34;, &#34;name&#34;: &#34;HeroState&#34;}, - &#34;init&#34;: {&#34;alias&#34;: &#34;ui&#34;, &#34;name&#34;: &#34;NewHeroState&#34;} - }, - &#34;emits&#34;: [ - { - &#34;name&#34;: &#34;select&#34;, - &#34;params&#34;: [ - {&#34;name&#34;: &#34;id&#34;, &#34;type&#34;: &#34;string&#34;} - ] - } - ] - } - } -} -</code></pre><p><code>version</code> is the public manifest schema version. Public manifest JSON includes -known source paths, file kind, package names, page-level GOWDK source uses, page route and document metadata, dynamic route params, -declared block presence, first-slice action metadata including fragment targets, -API block names, direct page component references for the current spa <code>view {}</code> subset, direct spa -asset references, direct CSS class names, direct spa <code>style</code> attribute -values, first-slice API method/route metadata, and component declarations. -Component declarations include component-level CSS/assets, typed contract -metadata, typed public exports, and emitted event metadata when present. -<code>paths</code>, <code>layouts</code>, <code>guard</code>, <code>css</code>, <code>actions</code>, <code>apis</code>, <code>components</code>, -<code>uses</code>, <code>assets</code>, <code>cssClasses</code>, and <code>styleAttributes</code> are omitted when empty or -false.</p><p><code>gowdk manifest</code> is source-oriented page/component metadata. Use -<code>gowdk routes</code> or <code>gowdk endpoints</code> to inspect generated backend routes and -handler binding status for actions, APIs, fragments, and command/query -adapters.</p><h2 id="current-site-map-json">Current Site-Map JSON</h2><p><code>gowdk sitemap</code> emits editor-facing data with source paths, dynamic params, and block presence. It is broader than public manifest JSON because the VS Code extension uses it for route/file visualization.</p><h2 id="current-spa-route-manifest">Current SPA Route Manifest</h2><p><code>gowdk build</code> writes <code>gowdk-routes.json</code> in the selected output directory. It is -separate from <code>gowdk manifest</code> and records generated SPA page artifacts plus -generated request-time backend route metadata:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;routes&#34;: [ - { - &#34;page&#34;: &#34;home&#34;, - &#34;route&#34;: &#34;/&#34;, - &#34;path&#34;: &#34;index.html&#34; - } - ], - &#34;endpoints&#34;: [ - { - &#34;kind&#34;: &#34;fragment&#34;, - &#34;directive&#34;: &#34;fragment&#34;, - &#34;method&#34;: &#34;GET&#34;, - &#34;route&#34;: &#34;/patients/{id:int}/vitals&#34;, - &#34;page&#34;: &#34;patients&#34;, - &#34;symbol&#34;: &#34;PatientVitals&#34;, - &#34;handler&#34;: &#34;fragments.PatientsPatientVitals&#34;, - &#34;dynamicParams&#34;: [&#34;id&#34;], - &#34;routeParams&#34;: [{&#34;name&#34;: &#34;id&#34;, &#34;type&#34;: &#34;int&#34;}], - &#34;guards&#34;: [&#34;public&#34;] - } - ] -} -</code></pre><h2 id="current-app-asset-manifest">Current App Asset Manifest</h2><p><code>gowdk build</code> also writes <code>gowdk-assets.json</code> in the selected output directory. -It records generated spa assets that are not route entries, plus cache metadata -for route HTML when a page declares <code>cache</code>. Today that means CSS files emitted -by compile-time CSS processors, <code>gowdk.js</code> when server fragment forms need it, -generated default JS island files, WASM island files/loaders, and -page-level cache policies:</p><pre><code class="language-json">{ - &#34;version&#34;: 2, - &#34;files&#34;: { - &#34;assets/app.css&#34;: &#34;assets/app.7ada5a1234b1.css&#34;, - &#34;assets/gowdk/islands/Counter.js&#34;: &#34;assets/gowdk/islands/Counter.js&#34; - }, - &#34;sizes&#34;: { - &#34;assets/app.css&#34;: 1204, - &#34;assets/gowdk/islands/Counter.js&#34;: 4096 - }, - &#34;obfuscated&#34;: { - &#34;assets/gowdk/islands/Counter.js&#34;: true - } -} -</code></pre><p>Keys are stable logical asset names and values are emitted slash-separated paths -relative to the selected output directory. Generated CSS values include a -content hash in the filename after minification. The optional <code>hashes</code>, -<code>cache</code>, <code>sizes</code>, and <code>obfuscated</code> maps record content hashes, generated cache -policy, byte size, and production asset obfuscation markers for emitted assets. -The <code>cache</code> map may also include route HTML paths such as <code>index.html</code>; those -route entries do not need to appear in <code>files</code>. -Configured stylesheet links are not included unless GOWDK emits the referenced -file.</p><h2 id="current-security-manifest">Current Security Manifest</h2><p><code>gowdk build</code> also writes <code>gowdk-security.json</code> as a non-served report outside -the selected output directory, under a sibling -<code>.gowdk/reports/&lt;output-name&gt;/</code> directory. It is a declarative, IR-derived -security posture: every route, backend endpoint, and contract with its guards, -CSRF state, body limit, public/default-deny classification, and source -location, plus a <code>frontend</code> surface block. Like the route and asset manifests, -it is pure data — it never evaluates policy. <code>gowdk audit</code> reads this same -posture and applies the security baseline plus declared <code>*.audit.gwdk</code> policies -to produce findings.</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;generatedFrom&#34;: &#34;ir&#34;, - &#34;endpoints&#34;: [ - { - &#34;id&#34;: &#34;Submit&#34;, - &#34;kind&#34;: &#34;action&#34;, - &#34;method&#34;: &#34;POST&#34;, - &#34;path&#34;: &#34;/submit&#34;, - &#34;guards&#34;: [&#34;public&#34;], - &#34;csrf&#34;: false, - &#34;bodyLimitBytes&#34;: 1048576, - &#34;public&#34;: true, - &#34;defaultDeny&#34;: false, - &#34;pageId&#34;: &#34;signup&#34;, - &#34;source&#34;: &#34;signup.page.gwdk:8&#34; - } - ], - &#34;frontend&#34;: { - &#34;unguardedRoutes&#34;: [], - &#34;bundleSecrets&#34;: [], - &#34;rawHtmlSinks&#34;: [], - &#34;configuredHeaders&#34;: [] - } -} -</code></pre><p><code>version</code> is the security manifest schema version. The <code>frontend</code> block records -client-visible routes that rely on generated default-deny handling, secret-like -embedded assets or build-time values, raw <code>g:unsafe-html</code> sinks, and configured -security response header names.</p><h2 id="planned-manifest-work">Planned Manifest Work</h2><p>Future manifest versions need full action/API metadata, transitive -component/layout dependencies, and generated artifact paths.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/pipeline/index.html b/docs-site/dist/site/docs/compiler/pipeline/index.html deleted file mode 100644 index 255a4eee..00000000 --- a/docs-site/dist/site/docs/compiler/pipeline/index.html +++ /dev/null @@ -1,93 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Compiler Pipeline - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Compiler Pipeline - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Compiler Pipeline - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Compiler Pipeline</h1></header><article class="prose"><h2 id="current-pipeline">Current Pipeline</h2><pre><code class="language-text">project config plus explicit file paths or configured discovery - -&gt; parse source files into typed GOWDK AST - -&gt; lower parsed records into internal/gwdkir.Program - -&gt; enrich IR with Go endpoint discovery and backend bindings - -&gt; validate IR invariants, render rules, routes, endpoints, packages, and assets - -&gt; emit diagnostics, public manifest JSON, site-map JSON, route/endpoint metadata, build-output artifacts, browser runtime assets, or generated app output -</code></pre><p>Project-level compiler commands require <code>gowdk.config.go</code> or <code>--config &lt;file&gt;</code>. -The current CLI accepts explicit <code>.gwdk</code> files, but explicit paths still require -a loaded config. <code>gowdk build</code> can also discover source files from literal -<code>Source.Include</code> and <code>Source.Exclude</code> settings plus configured module sources -when no explicit files are supplied. Configured <code>Build.Targets</code> can declare -selected modules, output dirs, generated app dirs, and binary paths; <code>gowdk build</code> runs all configured targets and <code>gowdk build --target &lt;name&gt;</code> runs -selected targets. <code>gowdk build --module &lt;name&gt;</code> remains available for ad hoc -builds, and the flag may be repeated or comma-separated. Discovery uses -<code>**/*.gwdk</code> defaults when no root/module source is configured in the loaded -config.</p><p><code>gowdk build [--config &lt;file&gt;] [--target &lt;name&gt;] [--module &lt;name&gt;] [--out &lt;dir&gt;] [--app &lt;dir&gt;] [--bin &lt;file&gt;] [files...]</code> currently -emits app-shell HTML, <code>gowdk-routes.json</code>, <code>gowdk-assets.json</code>, generated embedded -app source, and an optional binary for the selected -source set. The current rendered page subset covers simple <code>spa</code> and -<code>action</code> pages with non-dynamic routes or literal <code>paths {}</code> dynamic routes, -literal <code>build {}</code> data, imported or same-package Go build data functions with -optional <code>gowdk.BuildParams</code>, lowercase HTML markup in <code>view {}</code>, and -<code>.cmp.gwdk</code> component files.</p><p><code>internal/syntax</code> owns the shared tokenizer. <code>internal/parser.ParseSyntax</code> uses -that token stream to recover a typed <code>internal/gwdkast.File</code> for the current -source subset: package declarations, typed page/component/layout/route/render/layout/guard/CSS -declarations, metadata declarations, Go imports, GOWDK uses, stores, typed -component contracts, supported top-level blocks, parsed <code>view {}</code> markup nodes, -literal <code>paths {}</code>/<code>build {}</code> records, action/API endpoint declarations, and -source spans. Parser diagnostics accumulate across declaration and block -boundaries so one syntax error does not hide later declarations in the same -file.</p><p><code>internal/gwdkanalysis</code> assembles parsed page, component, and layout records -into <code>internal/gwdkir.Program</code>. The IR models packages, source -files, page routes, backend endpoints from <code>.gwdk</code> declarations or explicit Go -comments, templates, client behavior, source-selected assets, asset scope/hash -metadata, parsed view nodes, typed literal records, and imported build-data call -metadata. <code>gwdkir.Blocks</code> retains source bodies for spans and -compatibility, but the parser-lowered handoff also carries parsed <code>view {}</code> -nodes, ordered literal <code>paths {}</code>/<code>build {}</code> records, and imported build-data -call metadata; downstream passes should consume those typed fields before -falling back to raw bodies. Build, memory build, incremental SPA build, SSR -artifact, generated app planning, route reports, LSP metadata, and the public -<code>gowdk manifest</code> report consume <code>internal/gwdkir.Program</code> and own their output -planning separately. Route and asset manifests are generated output artifacts, -not compiler handoff records. -Generated app Go, backend adapter Go, build-data helper Go, and starter config -Go are constructed as Go ASTs, printed, and formatted before use or write.</p><p>Browser-facing output is generated only when the source requires it. Partial -form metadata can emit <code>assets/gowdk/gowdk.js</code>; stateful components can emit -generated JavaScript island assets; component-level <code>wasm</code> declarations can -emit WASM island loader assets. See <code>browser-compiler.md</code>.</p><h2 id="invalid-ir-policy">Invalid IR Policy</h2><p><code>internal/gwdkir.CheckInvariants</code> is the compiler&#39;s internal sanity check for -IR defects that should be impossible after parsing and analysis. It checks -structural contracts such as sorted slices, closed enum values, and references -between IR slices. It does not replace user-facing validation for authoring -errors such as duplicate routes, missing guards, or unsupported source syntax.</p><p>Public compiler, CLI, buildgen, and appgen boundaries must return diagnostics or -ordinary errors for invalid IR. They must not panic on malformed IR, because a -bad handoff should be reported as an internal compiler error with any available -build report or source context.</p><p>Panicking helpers are allowed only in <code>_test.go</code> files, must include <code>ForTest</code> -or <code>must</code> in the helper name, and must not be imported by runtime, CLI, or -generated-output packages. Use those helpers only to keep focused tests small -after the non-panicking boundary behavior is already pinned.</p><h2 id="target-pipeline">Target Pipeline</h2><pre><code class="language-text">project config - -&gt; discover sources - -&gt; lex/parse full AST - -&gt; semantic analysis and type checks - -&gt; stable internal IR - -&gt; app/component/action/API/fragment/SSR codegen - -&gt; go/format - -&gt; app assets and generated Go app - -&gt; optional embedded one-binary output -</code></pre><p>Future build work should expand from the current generated-output slice while -keeping downstream passes on <code>internal/gwdkir.Program</code>.</p><p>The <code>lex/parse full AST</code> front-end is the shared-token parser behind the stable -<code>internal/gwdkast</code> AST seam. The decision record for that cutover is -<code>docs/engineering/decisions/0010-tokenizer-recursive-descent-parser.md</code>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/project-structure/index.html b/docs-site/dist/site/docs/compiler/project-structure/index.html deleted file mode 100644 index 606dbf8a..00000000 --- a/docs-site/dist/site/docs/compiler/project-structure/index.html +++ /dev/null @@ -1,73 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Project Structure - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Project Structure - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Project Structure - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Project Structure</h1></header><article class="prose"><h2 id="current-inputs">Current Inputs</h2><p>Project-level CLI commands require <code>gowdk.config.go</code> in the current directory, -or an explicit config passed with <code>--config &lt;file&gt;</code>, before they compile, -validate, or inspect <code>.gwdk</code> code. Explicit <code>.gwdk</code> file paths narrow the input -set, but they do not bypass the config requirement:</p><pre><code class="language-sh">go run ./cmd/gowdk check examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk -</code></pre><p><code>gowdk init [dir]</code> scaffolds a conventional buildable project:</p><pre><code class="language-text">gowdk.config.go -.gitignore -src/pages/home.page.gwdk -src/components/hero.cmp.gwdk -styles/global.css -</code></pre><p>The generated config uses <code>src/**/*.gwdk</code> as the source include, -<code>styles/**/*.css</code> for CSS inputs, a <code>site</code> build target, <code>.gowdk/site</code> for -generated app source, and <code>bin/site</code> for the generated binary. The <code>site</code> -target&#39;s output is inferred as <code>.gowdk/output/site</code>. The scaffolded -<code>.gitignore</code> ignores generated output directories.</p><p><code>gowdk build</code> can also discover <code>.gwdk</code> files when no explicit files are -supplied. It reads literal <code>Source.Include</code>, <code>Source.Exclude</code>, and -<code>Modules</code>, and <code>Build.Output</code> fields from the required config. Root source -patterns and module source patterns are additive when no module is selected; a -name-only module defaults to <code>&lt;module-name&gt;/**/*.gwdk</code>. -<code>Build.Targets</code> can declare selected modules, optional output dirs, generated -app dirs, and binary paths for user-owned deployment workflows. Target <code>Output</code> -defaults to <code>.gowdk/output/&lt;target-name&gt;</code> when omitted. With targets configured, -<code>gowdk build</code> runs all targets and <code>gowdk build --target &lt;name&gt;</code> runs selected -targets. <code>gowdk build --module &lt;name&gt;</code> remains available for ad hoc builds, and -the flag may be repeated or comma-separated. The selected modules define what -gets emitted to <code>--out</code>, copied into <code>--app</code>, and embedded into <code>--bin</code>. When -the loaded config has no root or module include, discovery falls back to -<code>**/*.gwdk</code> and an explicit <code>--out</code> directory.</p><p><code>.gwdk</code> files are selected by source discovery, explicit CLI paths, or selected -modules. Go <code>import</code> declarations inside <code>.gwdk</code> files import normal Go -packages for typed contracts and build functions; they do not import <code>.gwdk</code> -components, layouts, or pages. Same-package <code>.gwdk</code> and <code>.go</code> files are peers, -except <code>gowdk.config.go</code>, which is project configuration rather than -application package code.</p><p>Cross-package GOWDK source imports use <code>use</code>, not Go <code>import</code>:</p><pre><code class="language-gwdk">package pages - -use ui &#34;components&#34; - -view { - &lt;main&gt;&lt;ui.Hero title=&#34;GOWDK&#34; /&gt;&lt;/main&gt; -} -</code></pre><p>The quoted <code>use</code> target is a discovered <code>.gwdk</code> package name. Pages and -components can use qualified component calls through their own scoped aliases. -Pages use qualified layout references with <code>layout alias.id</code>, components use -qualified stores from client blocks with <code>use alias.store</code>, and pages select -cross-package CSS assets with <code>css alias.name</code>. Bare store and asset names are -same-package selections or built-in selections; cross-package lookup is never -implicit.</p><p>Current file-kind classification treats files ending in <code>.cmp.gwdk</code> or -containing <code>component</code> as components, files ending in <code>.layout.gwdk</code> as layout -files, files ending in <code>.asset.gwdk</code> as asset-adjacent planning files, and other -<code>.gwdk</code> inputs as pages. Layout and asset-adjacent files are classified so -project discovery can accept future conventions, but their parsing, resolution, -and rendering remain planned.</p><h2 id="planned-source-layout-decisions">Planned Source Layout Decisions</h2><p>Future compiler work must define:</p><ul><li>Final default source directories.</li><li>How island files are classified.</li><li>Where user Go code lives.</li><li>How full app config is discovered or passed to every compiler command.</li><li>Whether build targets need per-target addons, render settings, or package -layout controls.</li><li>How examples and fixture apps are kept runnable.</li><li>Component-level scoped CSS and asset files.</li></ul><p>Routes and layouts must remain declared inside files, not inferred from folder location.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/compiler/syntax-contributors/index.html b/docs-site/dist/site/docs/compiler/syntax-contributors/index.html deleted file mode 100644 index 4c5ab908..00000000 --- a/docs-site/dist/site/docs/compiler/syntax-contributors/index.html +++ /dev/null @@ -1,49 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Syntax Contributor Checklist - GOWDK</title> - <meta name="description" content="Use this checklist when adding or changing .gwdk syntax, compiler metadata, diagnostics, generated output, or editor behavior. Keep each change scoped to one language contract."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Syntax Contributor Checklist - GOWDK"> - <meta property="og:description" content="Use this checklist when adding or changing .gwdk syntax, compiler metadata, diagnostics, generated output, or editor behavior. Keep each change scoped to one language contract."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Syntax Contributor Checklist - GOWDK"> - <meta name="twitter:description" content="Use this checklist when adding or changing .gwdk syntax, compiler metadata, diagnostics, generated output, or editor behavior. Keep each change scoped to one language contract."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Compiler</p><h1>Syntax Contributor Checklist</h1><p class="doc-lead">Use this checklist when adding or changing .gwdk syntax, compiler metadata, diagnostics, generated output, or editor behavior. Keep each change scoped to one language contract.</p></header><article class="prose"><p>Use this checklist when adding or changing <code>.gwdk</code> syntax, compiler metadata, -diagnostics, generated output, or editor behavior. Keep each change scoped to one -language contract.</p><h2 id="required-path">Required Path</h2><ol><li>Update the source contract first: -<ul><li><code>docs/language/</code> for public syntax or semantics.</li><li><code>docs/reference/diagnostic-codes.md</code> for new or changed diagnostic codes.</li><li><code>docs/compiler/generated-output.md</code> for generated artifact shape changes.</li></ul></li><li>Update the AST and parser: -<ul><li><code>internal/gwdkast</code> for source nodes and spans.</li><li><code>internal/parser</code> for parsing and lowering into <code>internal/gwdkir</code>.</li><li>Parser goldens under <code>internal/parser/testdata/golden/</code> when the AST -contract changes.</li></ul></li><li>Update IR and invariants: -<ul><li><code>internal/gwdkir</code> type fields.</li><li><code>gwdkir.CheckInvariants</code> for closed enums, ordering, and cross-slice -references.</li><li><code>internal/gwdkanalysis</code> lowering and ordering.</li><li><code>gowdk inspect ir</code> goldens when the public debug shape changes.</li></ul></li><li>Update validation and diagnostics: -<ul><li><code>internal/compiler</code> for semantic checks.</li><li><code>internal/diagnostics/registry.go</code> for every emitted diagnostic code.</li><li>Source spans should target the smallest useful declaration or token.</li></ul></li><li>Update generated-output consumers when needed: -<ul><li><code>internal/buildgen</code> for SPA/build-output, CSS/assets, SSR artifacts, and -build reports.</li><li><code>internal/appgen</code> for generated Go adapters, route registrations, action, -API, fragment, contract, guard, rate-limit, SSR, and backend output.</li><li>Generated Go must use Go AST/printer/format as described in -<code>docs/engineering/generated-code-policy.md</code>.</li></ul></li><li>Update language tooling: -<ul><li><code>internal/lang</code> for formatting, manifest/site-map JSON, completions, and -diagnostics output.</li><li><code>internal/lsp</code> and <code>editors/vscode</code> when editor features need the new -syntax.</li></ul></li><li>Add focused tests: -<ul><li>Parser/AST: <code>go test ./internal/parser</code>.</li><li>Diagnostics/validation: <code>go test ./internal/compiler ./internal/diagnostics</code>.</li><li>Generated output: <code>go test ./internal/buildgen ./internal/appgen</code>.</li><li>LSP/editor: <code>go test ./internal/lsp</code> plus editor checks when touched.</li><li>CLI report changes: update <code>cmd/gowdk/testdata/*_golden</code> and run -<code>go test ./cmd/gowdk</code>.</li></ul></li><li>Add a conformance corpus case: -<ul><li>Accepted syntax: an <code>accept/</code> file under -<code>internal/lang/testdata/conformance/</code> that exercises it.</li><li>A rejection or new diagnostic: a <code>reject/</code> file with a leading -<code>// expect: &lt;code&gt;</code> directive. See <code>docs/language/conformance.md</code>.</li></ul></li></ol><h2 id="guardrails">Guardrails</h2><ul><li>Do not add <code>@</code> metadata syntax back as canonical public syntax.</li><li>Dynamic SPA routes still require <code>paths {}</code> unless a page uses request-time -SSR.</li><li>Actions, APIs, and fragments remain endpoint metadata, not page render modes.</li><li>Generated JavaScript is enhancement only; it must not own routing truth, -auth, server validation, business logic, server state, or cache policy.</li><li>Public generated-output shape changes need docs and deterministic tests in the -same change.</li></ul><h2 id="minimum-handoff">Minimum Handoff</h2><p>Before handing off, state:</p><ul><li>The syntax or behavior changed.</li><li>The AST/IR fields and diagnostics touched.</li><li>The generated files, JSON shapes, or reports affected.</li><li>The docs and examples updated.</li><li>The exact verification commands run.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/architecture/index.html b/docs-site/dist/site/docs/engineering/architecture/index.html deleted file mode 100644 index a3b2ef63..00000000 --- a/docs-site/dist/site/docs/engineering/architecture/index.html +++ /dev/null @@ -1,254 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Architecture - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Architecture - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Architecture - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Architecture</h1></header><article class="prose"><h2 id="current-status">Current Status</h2><p>GOWDK is compile-first. The current repository discovers <code>.gwdk</code> files, parses -page, component, layout, endpoint, client, CSS, asset, and source-import -metadata into a typed GOWDK AST, lowers that AST into compiler IR, validates -route/render/component/handler contracts, emits manifest/site-map/build-report -metadata plus non-served security posture reports, and generates build-time SPA -output, generated app source, local binaries, and Go <code>js/wasm</code> deploy -artifacts.</p><p>Generated build output covers simple static pages, literal dynamic <code>paths {}</code> -entries, literal, default <code>go {}</code>, and same-package/imported no-argument <code>build {}</code> data returning <code>T</code> or <code>(T, error)</code>, -declared layouts, discovered components, page CSS, processor-emitted CSS, -partial-update client assets, generated JavaScript island assets, component-level -browser WASM island assets, route manifests, asset manifests, source-linked -inspect trees, endpoint dispatch graphs, OpenAPI and AsyncAPI inspection -artifacts, <code>gowdk-security.json</code> posture reports outside served output, and -cache metadata. The build pipeline skips identical generated writes and can -incrementally render page-only SPA edits in the dev loop.</p><p>Generated apps use <code>runtime/app</code>, generated process lifecycle, and <code>net/http</code> -handler contracts. They can -serve embedded build output, feature-bound action/API handlers, CSRF-wired -action POSTs, first supported action redirect and fragment responses, -standalone fragment routes, guards, rate-limit hooks, endpoint panic -boundaries, optional generated error documents, concrete and dynamic -request-time SSR pages with declared <code>server {}</code> fields, safe local load -redirects, and inline <code>go server {}</code> load handlers through the generated -request-time route lane. -Backend adapter generation lowers request-time endpoint metadata into typed -appgen IR before emitting imports, route registrations, request decoders, -handler calls, response writing, fallback metadata, split frontend proxy route -matching, and backend-only app routing. The app generator uses typed IR and Go -AST/printer output before <code>go/format</code>.</p><p><code>runtime/contracts</code> now provides the first local typed registry for queries, -commands, backend-owned domain and integration events, presentation events, and -jobs. Compiler IR command/query references, <code>.gwdk</code> command/query syntax, -local/imported handler and contract-type diagnostics, CLI graph/trace output, -and runtime role filtering exist. -Generated web adapters can execute routable command/query references through -the local registry with the <code>web</code> role, compiler validation rejects web -references to non-web-only registrations, and <code>runtime/contracts/fileoutbox</code> -provides a dependency-free JSON Lines outbox/EventSource adapter with nack -retry metadata and opt-in dead-letter storage. Runtime also includes in-memory -broker/EventSource and SSE presentation fanout adapters in the root module. -Compiler-validated <code>g:subscribe</code> metadata now binds query-owned DOM regions to -presentation-event contracts with exact source spans and build-report metadata; -generated apps mount subscription-filtered SSE fanout for bound subscriptions, -run inherited guards before opening generated realtime streams, and generated -<code>gowdk.js</code> applies explicit <code>replaceHTML</code> realtime patches to the matching -query-owned region while rejecting unsupported patch shapes safely. The root -SSE adapter declares browser retry timing and drops events for full per-client -buffers instead of blocking command execution. -Concrete Redis Streams, NATS, and WebSocket adapters live as nested optional Go -modules under <code>runtime/contracts</code> so those third-party clients do not enter the -root module graph. Durable event envelopes carry stable IDs, workers can use -in-memory, file-backed, or Redis seen stores to skip duplicates inside a -post-ack deduplication window, and generated apps can expose contract event sink -registration, fresh registry construction, and worker replay helpers for -executable contract registrations. Event workers can apply explicit -nacked-batch backoff options while adapters retain durable retry and -dead-letter policy ownership.</p><p><code>runtime/trace</code> provides the first dependency-free GOWDK Trace core. It owns -W3C-compatible trace/span IDs, <code>traceparent</code> propagation, context spans, -GOWDK surface/lane/source metadata, attributes, events, status, sampling, -console/JSONL/ring/multi/exporter sinks, and a bounded in-process JSON/SSE -collector. Generated app auto-instrumentation, durable storage, a browser trace -viewer, and concrete OTLP transport are later integration work. Debug-gated -generated instrumentation now covers backend, SSR/load, contract, browser, and -island lanes through <code>addons/observability</code>.</p><p>Still partial: broad local client-side reactivity, richer hybrid streaming and -data refresh, non-HTTP revalidation, generated worker/cron binary scaffolding, -and platform-specific deployment adapters.</p><h2 id="system-context">System Context</h2><p>GOWDK users write portable <code>.gwdk</code> pages and components. GOWDK Compiler is the -language/compiler layer: it discovers those files, builds compiler metadata, -validates render rules, emits assets and generated Go adapters, and packages -output for hosted files or app binaries. GOWDK Runtime is the app/runtime -layer: it serves generated output, runs request-time handlers, and owns the -public runtime/addon packages used by generated adapters.</p><p>The target GOWDK Compiler plus GOWDK Runtime output can include spa pages, -components, typed actions, API handlers, server fragment handlers, embedded -assets, and a Go binary. CSS tooling, including Tailwind, belongs in optional -addons rather than the compiler core or runtime core. SSR is enabled -only when <code>ssr.Addon()</code> is present and a page opts into request-time rendering.</p><p>When this document uses <code>Compiler</code>, it means GOWDK internals under <code>internal/</code>. -When it uses <code>Runtime</code> or <code>Addon</code>, it means implementation packages that belong -to GOWDK Runtime. Avoid reading those owner labels as separate product names.</p><h2 id="compiler-lanes">Compiler Lanes</h2><p>Target <code>.gwdk</code> compilation:</p><pre><code class="language-text">.gwdk file - -&gt; GOWDK parser - -&gt; GOWDK AST - -&gt; GOWDK analyzer - -&gt; generated normal Go code - -&gt; go/format - -&gt; go build -</code></pre><p>Target Go package validation:</p><pre><code class="language-text">.go package directory - -&gt; go/packages load - -&gt; standard Go syntax and type information - -&gt; validate exported handlers/types -</code></pre><p>The GOWDK AST models <code>.gwdk</code> language constructs. Normal Go files and generated -Go source use the standard Go syntax and type information. Analyzer output -connects the lanes through package, route, type, component, and handler binding -metadata.</p><h2 id="compatibility-records">Compatibility Records</h2><p><code>internal/gwdkir.Program</code> is the single compiler handoff. The pipeline is -<code>source -&gt; GOWDK AST (gwdkast) -&gt; IR records (gwdkir) -&gt; program assembly (gwdkanalysis.BuildProgram) -&gt; validation/discovery/binding (compiler) -&gt; generated output (buildgen/appgen)</code>. The former <code>internal/manifest</code> -compatibility model has been removed entirely:</p><ul><li><code>internal/parser</code> lowers the typed AST directly into <code>gwdkir</code> page, -component, and layout records, including parsed view nodes and typed -literal/build-call metadata for supported <code>paths {}</code> and <code>build {}</code> blocks.</li><li><code>internal/gwdkanalysis.BuildProgram</code> assembles <code>gwdkir.Program</code> from those -records (routes, templates, assets, endpoints, packages) and exposes -<code>AddStandaloneEndpoints</code>/<code>AttachBackendBindings</code> for the post-assembly -enrichment phases.</li><li><code>internal/compiler</code> validates, discovers standalone Go endpoints, and binds -backend handlers against the IR.</li><li>The <code>gowdk manifest</code> JSON report keeps its historical field names but is -derived from the IR (<code>internal/lang/manifest_json.go</code>); a golden test pins -the output.</li><li>Shared leaf value types (source spans, route params, inline scripts, backend -binding records and signature enums, supported backend input field types, -error-page path validation) live in the neutral <code>internal/source</code> package.</li></ul><p>New generated-output work should consume <code>internal/gwdkir.Program</code> or add -fields there first.</p><p>No generation path depends on a manifest compatibility record. The remaining -<code>manifest</code> references in the tree are not compatibility models: the build-time -<code>routeManifest</code>/<code>assetManifest</code> JSON <em>output</em> artifacts (<code>internal/buildgen</code>), -the IR-derived public <code>gowdk manifest</code> report (<code>internal/lang/manifest_json.go</code>), -the runtime <code>LoadAssetManifest</code> asset lookup, the <code>&lt;… manifest&gt;</code> HTML attribute -allow-list (<code>internal/viewparse</code>), and historical-context code comments.</p><p>Golden tests pin each handoff stage end to end: AST -(<code>internal/parser/testdata/golden</code>), IR (<code>cmd/gowdk/testdata/inspect_ir_golden</code>), -routes and endpoints (<code>cmd/gowdk/testdata/routes_golden</code>), generated Go -(<code>internal/appgen/testdata/generated_go_golden</code>), generated HTML and route/asset -output manifests (<code>internal/buildgen/testdata/full_fixture</code>), and the public -manifest report (<code>internal/lang/testdata/manifest_golden</code>).</p><h2 id="components">Components</h2><table><thead><tr><th>Component</th><th>Responsibility</th><th>Owner</th><th>Notes</th></tr></thead><tbody><tr><td><code>cmd/gowdk</code></td><td>CLI entrypoint.</td><td>Core</td><td>Exposes <code>version</code>, <code>tokens</code>, <code>fmt</code>, <code>check</code>, <code>audit</code>, <code>manifest</code>, <code>sitemap</code>, <code>routes</code>, <code>endpoints</code>, <code>inspect</code>, <code>generate stubs</code>, <code>build</code>, <code>dev</code>, <code>preview</code>, <code>serve</code>, and <code>lsp</code>. <code>build</code> can emit spa files, generated embedded app source, optional SEO files, optional production generated-asset obfuscation, an optional binary, optional Dockerfile/<code>.dockerignore</code> files beside that binary, optional static/systemd/Caddy/Nginx/split deployment recipe starters, an optional WASM artifact, OpenAPI/AsyncAPI inspection reports, and a non-served security posture report for all discovered sources, selected configured modules, or spa <code>Build.Targets</code>; <code>audit</code> evaluates the IR-derived posture against the built-in baseline and declared policies, emits/runs generated audit tests, and exits non-zero on error findings; <code>inspect go-bindings</code> reports Go interop status for backend handlers, load functions, build-time Go calls, and web contracts; <code>generate stubs</code> writes conservative missing action/API handler stubs; <code>dev</code> compares input content hashes, can use incremental spa rendering for page-only plain output changes, persists a dev input cache, serves static output, or runs/restarts a generated app binary for backend/SSR flows; <code>preview</code> builds and serves a local deploy preview, with <code>--hot</code> reusing the dev loop.</td></tr><tr><td><code>gowdk</code> root package</td><td>Public config, render modes, fixed core addon feature IDs, and supported extension contracts.</td><td>Core</td><td>Includes <code>Config</code>, <code>RenderMode</code>, <code>Addon</code>, <code>CSSConfig</code>, <code>CSSProcessor</code>, <code>SEOProvider</code>, and <code>GoBlockConsumer</code>; <code>NewAddon</code> registers feature markers, while behaviorful external addons participate through <code>CSSProcessor</code>, <code>SEOProvider</code>, or <code>GoBlockConsumer</code>.</td></tr><tr><td><code>internal/discover</code></td><td>Find portable <code>.gwdk</code> files from include/exclude patterns.</td><td>Compiler</td><td>Recursive glob discovery implemented.</td></tr><tr><td><code>internal/gwdkast</code></td><td>Define the typed GOWDK source AST.</td><td>Compiler</td><td>Package declarations, typed page/component/layout/route/render/layout/guard/CSS declarations, component CSS scope/hash metadata, metadata declarations, Go imports, GOWDK uses, stores, typed component contracts, blocks, endpoint declarations, parsed view nodes, literal records, and source spans implemented.</td></tr><tr><td><code>internal/parser</code></td><td>Parse <code>.gwdk</code> files into typed AST and <code>internal/gwdkir</code> records.</td><td>Compiler</td><td>Uses the shared <code>internal/syntax</code> tokenizer for pages, components, layouts, route params, imported Go build functions, action/API metadata, component CSS scope/hash metadata, GOWDK <code>use</code> declarations, package declarations, package spans, and source spans. <code>ParseSyntax</code> returns <code>internal/gwdkast.File</code> with declaration-boundary error recovery; <code>ParsePage</code>/<code>ParseLayout</code>/<code>ParseComponent</code> lower the AST directly into <code>gwdkir</code> records with parsed view nodes, ordered literal records, and build-call metadata. The former manifest compatibility model has been removed.</td></tr><tr><td><code>internal/gwdkanalysis</code></td><td>Assemble <code>internal/gwdkir.Program</code> from parsed IR records.</td><td>Compiler</td><td><code>BuildProgram</code> derives packages, routes, endpoints, templates, contract references, realtime subscriptions, client behavior, source-selected assets with component CSS scope/hash metadata, stores, imports, uses, and source spans from parsed records; exposes standalone-endpoint and backend-binding attachment for post-assembly enrichment.</td></tr><tr><td><code>internal/gwdkir</code></td><td>Stable internal compiler IR shared by generated-output passes.</td><td>Compiler</td><td>IR records for packages, source files, page routes, backend endpoints, templates, command/query contract references, realtime subscriptions, client behavior, parsed view nodes, typed <code>paths {}</code>/<code>build {}</code> records, and asset scope/hash metadata implemented. Generated artifact planning stays in the consuming generator packages.</td></tr><tr><td><code>internal/viewmodel</code></td><td>Define the pure parsed <code>view {}</code> data model.</td><td>Compiler</td><td>Owns view nodes, elements, attributes, component calls, component template metadata, and component identity/prop helpers without importing renderer or runtime packages. <code>internal/gwdkast</code> and <code>internal/gwdkir</code> use these records for compiler handoffs.</td></tr><tr><td><code>internal/viewparse</code></td><td>Parse <code>view {}</code> source into <code>internal/viewmodel</code> nodes.</td><td>Compiler</td><td>Owns markup parsing, closed directive-name validation, event directive parsing, <code>g:for</code> parsing, style-binding attribute parsing, shorthand class/id normalization, and parse-time safety checks without importing the renderer or runtime packages.</td></tr><tr><td><code>internal/viewanalysis</code></td><td>Inspect parsed <code>view {}</code> trees without rendering.</td><td>Compiler</td><td>Owns canonical view fingerprints, component reference scans, dependency extraction, contract/query/subscription reference collection, and route-param reference collection over <code>internal/viewmodel</code> nodes. Compiler IR assembly, diagnostics, manifests, dev dependency indexing, and generated-output planning use this package instead of importing the renderer for analysis.</td></tr><tr><td><code>internal/viewvalidation</code></td><td>Validate view-bound client expressions.</td><td>Compiler</td><td>Owns DOM event symbols and typed validation for reactive attributes, <code>class:*</code>, and <code>style:*</code> expressions against <code>internal/clientlang</code>, without importing the renderer or runtime packages.</td></tr><tr><td><code>internal/viewrender</code></td><td>Render the first spa <code>view {}</code> markup subset.</td><td>Compiler</td><td>Lowercase HTML elements, spa/boolean/expression attributes, escaped text/attribute interpolation, self-closing component calls, prop/state interpolation, <code>g:on:*</code>, <code>g:island</code>, <code>g:command</code>, <code>g:query</code>, and query-bounded <code>g:subscribe</code> rendering implemented. Buildgen and appgen use this package for render output; AST, parser, analysis, compiler validation, and LSP code use <code>viewmodel</code>, <code>viewparse</code>, <code>viewanalysis</code>, and <code>viewvalidation</code> instead.</td></tr><tr><td><code>internal/clientlang</code></td><td>Parse, type-check, validate, and canonicalize the bounded client expression and statement language.</td><td>Compiler</td><td>Owns client block parsing, helper/computed metadata, expression checking/evaluation, island event/state/client statement validation, DOM ref statement recognition, emit validation, mutation field discovery, and the JS runtime conformance corpus used by <code>internal/clientrt</code> tests.</td></tr><tr><td><code>internal/gotypes</code></td><td>Resolve Go props/state contracts for components.</td><td>Compiler</td><td>Uses <code>go list</code>, <code>go/parser</code>, and <code>go/types</code> to resolve imported structs and state init signatures.</td></tr><tr><td><code>internal/lang</code></td><td>Language tooling for lexing, diagnostics, formatting, checking, and the IR-derived manifest JSON report.</td><td>Tools</td><td>Re-exports the shared tokenizer for CLI/editor tooling and reports accumulated parser diagnostics from recovered <code>.gwdk</code> parses. Initial CLI-backed tools implemented.</td></tr><tr><td><code>internal/inspectreport</code></td><td>Versioned compiler inspection report projections.</td><td>Tools</td><td>Builds the source-linked inspect tree, endpoint dispatch graph, and asset graph from validated <code>internal/gwdkir.Program</code> state and route metadata for <code>gowdk inspect tree</code>, <code>gowdk inspect endpoint-graph</code>, and <code>gowdk inspect asset-graph</code>.</td></tr><tr><td><code>internal/lsp</code></td><td>Language Server Protocol bridge for diagnostics, formatting, completions, and hover.</td><td>Tools</td><td>Dependency-free stdio server implemented with baseline and open-project completions plus hover for known language tokens and open-project symbols.</td></tr><tr><td><code>internal/project</code></td><td>Load project-level config, module source groups, build targets, and future source roots.</td><td>Compiler</td><td>SPA <code>gowdk.config.go</code> subset implemented for build discovery, output, and <code>Build.Targets</code>; project-level CLI commands require this config or an explicit <code>--config</code> file before compiling <code>.gwdk</code> code.</td></tr><tr><td><code>internal/addonregistry</code></td><td>Validate and expose checked-in addon discovery metadata.</td><td>Tools</td><td>Owns the local JSON registry used by <code>gowdk add --list --registry</code> and docs/website rendering. Registry entries describe kind, lifecycle, compatibility, ownership, trust, public interfaces, external tools, process/network behavior, and security notes without installing or executing addon code.</td></tr><tr><td><code>internal/compiler</code></td><td>Validate manifests and coordinate compilation metadata.</td><td>Compiler</td><td>Render-mode, duplicate identity, redundant component implementation, component Go contract, saved default <code>go {}</code> package type-checking with sibling Go files, route shape, duplicate route param, duplicate route pattern, route-method, required page-view validation, default <code>go {}</code> backend endpoint binding fallback, <code>go/packages</code>-backed backend binding, and realtime subscription addon/binding validation implemented. CLI route/endpoint reports now convert through <code>internal/gwdkir.Program</code>.</td></tr><tr><td><code>internal/securitymanifest</code></td><td>Project compiler IR into declarative security posture.</td><td>Tools</td><td>Builds <code>gowdk-security.json</code> posture records for routes, backend endpoints, command/query web contract endpoints, contract metadata, guards, CSRF state, body limits, public/default-deny classification, source locations, frontend bundle-secret candidates, raw-HTML sinks, unguarded client-visible routes, and configured security header names. It describes posture only; policy evaluation lives in <code>internal/auditspec</code>.</td></tr><tr><td><code>internal/auditspec</code></td><td>Evaluate security posture against audit policy.</td><td>Tools</td><td>Provides the policy model, selector matcher, <code>extends</code> composition, built-in baseline, declared <code>*.audit.gwdk</code> policy lowering, frontend audit rules, and registry-backed findings for <code>gowdk audit</code>.</td></tr><tr><td><code>internal/buildgen</code></td><td>Emit route-derived spa HTML files for build-time pages and SSR render artifacts.</td><td>Compiler</td><td>Disk builds, memory builds, incremental SPA builds, and SSR artifact planning consume <code>internal/gwdkir.Program</code>. Initial simple page, literal build data, imported Go build data calls with optional <code>gowdk.BuildParams</code>, literal dynamic path expansion, component expansion, partial runtime asset emission, default JS island asset emission, component-level non-CSS asset emission, component-level WASM island asset emission, page-level <code>go client {}</code> WASM mount asset emission, concrete and dynamic SSR page rendering with declared <code>server {}</code> placeholders, route manifest emission, asset manifest emission, optional SEO sitemap/robots emission, optional production obfuscation of compiler-owned generated browser JavaScript, OpenAPI report emission, non-served security posture report emission, mandatory build report emission with cache-policy, contract-reference, realtime-subscription, and request-time skip events, identical-output write skipping, and incremental changed-page spa rendering implemented.</td></tr><tr><td><code>internal/appgen</code></td><td>Emit generated Go app source for embedded spa output and request-time routes.</td><td>Compiler</td><td>Auto route planning consumes <code>internal/gwdkir.Program</code>, backend adapter planning uses typed appgen IR, and generated app Go files are assembled with <code>go/ast</code>/<code>go/printer</code> before <code>go/format</code>. Generates <code>go.mod</code>, <code>main.go</code>, copied spa assets, thin <code>runtime/app</code> server wiring, generated app middleware registration hooks, auth addon session/guard startup when configured, configured runtime security headers, generated audit <code>_test.go</code> files, <code>runtime/app.BackendRouter</code> registrations for feature-bound action/API/fragment/contract routes, split frontend proxy route matching from the same backend metadata, backend-only app routing, 501 stubs for missing/unsupported handlers, POST redirect and partial fragment action handlers backed by <code>runtime/form</code>, <code>runtime/response</code>, <code>runtime/validation</code>, and <code>addons/partial</code>, form input decoders, concrete and dynamic standalone fragment routes, concrete and dynamic SSR route handlers backed by <code>runtime/route</code>, declared SSR load path calls with redirect/error-page handling through <code>runtime/ssr</code>, shared request-time guard checks through <code>runtime/guard</code>, generated <code>gowdk_go/</code> packages for default <code>go {}</code> and <code>go server {}</code> blocks, addon <code>GoBlockConsumer</code> Go files, split backend apps, command/query contract exposure metadata in adapter IR including runtime roles, subscription-filtered and guard-checked realtime SSE fanout route generation for bound <code>g:subscribe</code> metadata, identical-output write skipping, stale embedded spa cleanup, and can invoke <code>go build</code> for local binaries or Go <code>js/wasm</code> artifacts.</td></tr><tr><td><code>internal/clientrt</code></td><td>Own embedded browser runtime sources for partial updates, static-first SPA navigation, stores, JS islands, WASM loaders, and realtime subscription patches.</td><td>Runtime</td><td>Framework-owned runtime source is kept as <code>.js</code> files under <code>internal/clientrt/assets/</code> and embedded with <code>go:embed</code>. First partial form enhancement runtime emits lifecycle hooks, target/swap request headers, swaps, focus restoration, loading state metadata, island remounts, and page-level <code>go client {}</code> remounts after SPA navigation. WASM island loaders merge page-store values into payloads, decode Go-style JSON result pointers, write returned store values back to the store registry, and subscribe for external store updates. Realtime subscription runtime connects to generated SSE streams for query-owned regions and applies explicit <code>replaceHTML</code> patches with safe rejection for unsupported shapes.</td></tr><tr><td><code>runtime/render</code></td><td>Core rendering engine used by static output, actions, partials, and SSR.</td><td>Runtime</td><td>Renderer and generated-code builder implemented; expression text writes escape by default.</td></tr><tr><td><code>runtime/component</code></td><td>Generated component runtime contract.</td><td>Runtime</td><td>Initial component interface implemented.</td></tr><tr><td><code>runtime/html</code></td><td>HTML escaping, attributes, and class helpers.</td><td>Runtime</td><td>Initial helpers implemented.</td></tr><tr><td><code>runtime/auth</code></td><td>Thin principal and RBAC access-gate helpers.</td><td>Runtime</td><td>Defines application-owned principal/provider contracts and native <code>role:</code>/<code>permission:</code> guard ID helpers for defense-in-depth generated route access. It does not own users, sessions, OAuth, tenants, persistence, or backend resource authorization.</td></tr><tr><td><code>runtime/guard</code></td><td>Shared request-time guard execution.</td><td>Runtime</td><td>Defines guard context, registry, ordered execution, and native RBAC guard resolution for generated action, API, fragment, and SSR handlers without depending on the SSR addon.</td></tr><tr><td><code>runtime/form</code></td><td>Form value normalization and scalar helpers for generated decoders.</td><td>Runtime</td><td>Values, first-slice allowlist decoding, and scalar parse helpers implemented; typed struct shape decoding is generated from Go package type metadata instead of runtime reflection.</td></tr><tr><td><code>runtime/validation</code></td><td>Validation result and errors for actions.</td><td>Runtime</td><td>Initial result model implemented.</td></tr><tr><td><code>runtime/response</code></td><td>HTML, redirect, fragment, and JSON response envelopes.</td><td>Runtime</td><td>Initial response model implemented.</td></tr><tr><td><code>runtime/asset</code></td><td>Asset manifest resolution.</td><td>Runtime</td><td>Initial manifest helper implemented.</td></tr><tr><td><code>runtime/route</code></td><td>Runtime route matching for generated request-time routes.</td><td>Runtime</td><td>Dynamic route matcher for first-slice generated SSR and standalone fragment routes implemented.</td></tr><tr><td><code>runtime/app</code></td><td>Shared generated app HTTP server and process lifecycle.</td><td>Runtime</td><td>Serves embedded spa files, ordered app-wide middleware, configured security headers, identity headers, health checks, asset manifest counts, optional generated 404/500 pages, no-JS cookie acknowledgement, server-side cookie notice hiding, generated CSRF token injection for POST forms, request-time panic boundaries with <code>runtime/security</code> redaction, generated action/API/fragment/SSR callback hooks, lifecycle service contracts, SIGINT/SIGTERM cancellation, and graceful generated-binary shutdown.</td></tr><tr><td><code>runtime/security</code></td><td>Runtime-safe security text helpers.</td><td>Runtime</td><td>Provides conservative secret-like text redaction for generated app panic/error logging without importing compiler-private <code>internal/</code> packages.</td></tr><tr><td><code>runtime/testkit</code></td><td>Generated audit test helpers.</td><td>Runtime</td><td>Provides small <code>httptest</code> helpers used by generated <code>gowdk_audit_test.go</code> files and <code>gowdk audit --run</code> to verify route status, method rejection, and configured response headers in-process against generated app handlers.</td></tr><tr><td><code>runtime/contracts</code></td><td>Typed contract registry and in-process dispatch.</td><td>Runtime</td><td>Implemented for queries, commands, backend-owned domain and integration events, presentation events, jobs, metadata, stable observation names and labels for logs/metrics/traces, local command-buffered event dispatch, event-envelope capture/replay with stable IDs, dependency-free outbox/broker/presentation-fanout/event-source/seen-store interfaces, command event sinks, an event worker loop with ack/nack, context cancellation, optional post-ack deduplication windows, explicit nacked-batch backoff options, a dependency-free file outbox adapter, dependency-free in-memory broker/EventSource adapter, dependency-free in-memory and file-backed seen stores, and dependency-free SSE presentation fanout adapter with retry hints and drop-on-full per-client buffers. Concrete Redis Streams, Redis TTL seen-store, NATS, and WebSocket adapters are nested optional modules. Separate worker/cron binary generators and deployment recipes are platform tooling, not runtime core.</td></tr><tr><td><code>runtime/trace</code></td><td>Dependency-free runtime tracing core.</td><td>Runtime</td><td>Provides W3C-compatible trace/span IDs, <code>traceparent</code> inject/extract helpers, context spans, GOWDK surface/lane/source metadata, attributes, events, status, always-on/off and ratio sampling, console/JSONL/ring/multi/exporter sinks, OTLP-shaped snapshots without an OpenTelemetry dependency, and a bounded JSON/SSE collector. Generated backend, SSR/load, guard, contract, browser, and island instrumentation is opt-in and debug-gated through <code>addons/observability</code>; durable trace storage and production sampling/access policy remain app-owned.</td></tr><tr><td><code>runtime/actions</code></td><td>Request-time action helpers.</td><td>Runtime</td><td>Owns CSRF token validation/generation, generated action registries, form decoding, and required-field validation helpers.</td></tr><tr><td><code>runtime/api</code></td><td>Request-time API helpers.</td><td>Runtime</td><td>Owns strict JSON request decoding, query helpers, and JSON/error/no-content response helpers.</td></tr><tr><td><code>runtime/partial</code></td><td>Request-time partial update helpers.</td><td>Runtime</td><td>Owns fragment responses, swap helpers, and partial client hook constants.</td></tr><tr><td><code>runtime/ratelimit</code></td><td>Request-time HTTP rate limiting.</td><td>Runtime</td><td>Owns fixed-window limiter contracts, in-memory store, Redis-store adapter interface, middleware, and response headers without importing the addon config marker.</td></tr><tr><td><code>runtime/realtime</code></td><td>Request-time presentation fanout helpers.</td><td>Runtime</td><td>Owns presentation fanout aliases and dependency-free SSE helper constructors used by generated realtime streams.</td></tr><tr><td><code>runtime/ssr</code></td><td>Request-time full-page rendering helpers.</td><td>Runtime</td><td>Owns load context aliases, declared load path resolution, safe redirects, layout composition, guard aliases, route registration, and server-side region rendering.</td></tr><tr><td><code>addons/static</code></td><td>Build-time static page output.</td><td>Addon</td><td>Capability boundary implemented; build-time output uses <code>runtime/render</code> through the compiler view renderer.</td></tr><tr><td><code>addons/spa</code></td><td>Static-first SPA navigation compatibility surface.</td><td>Addon</td><td>Keeps the existing SPA feature package and aliases build-time route output types from <code>addons/static</code>.</td></tr><tr><td><code>addons/actions</code></td><td>Typed backend actions feature marker.</td><td>Addon</td><td>Config-facing <code>Addon()</code>/<code>ImportPath</code> package with compatibility re-exports from <code>runtime/actions</code>; generated apps import <code>runtime/actions</code>.</td></tr><tr><td><code>addons/partial</code></td><td>Server fragments feature marker.</td><td>Addon</td><td>Config-facing <code>Addon()</code>/<code>ImportPath</code> package with compatibility re-exports from <code>runtime/partial</code>; generated apps import <code>runtime/partial</code>.</td></tr><tr><td><code>addons/ssr</code></td><td>Request-time full-page rendering feature marker.</td><td>Addon</td><td>Config-facing <code>Addon()</code>/<code>ImportPath</code> package with compatibility re-exports from <code>runtime/ssr</code>; generated apps import <code>runtime/ssr</code>.</td></tr><tr><td><code>addons/api</code></td><td>Generated API feature marker.</td><td>Addon</td><td>Config-facing <code>Addon()</code>/<code>ImportPath</code> package with compatibility re-exports from <code>runtime/api</code>; generated apps import runtime packages.</td></tr><tr><td><code>addons/embed</code></td><td>Embedded assets and one-binary serving.</td><td>Addon</td><td>Capability boundary implemented; generated app source, local binaries, and Go <code>js/wasm</code> deploy artifacts can embed selected build output.</td></tr><tr><td><code>addons/css</code></td><td>Compile-time CSS processing.</td><td>Addon</td><td>CSS feature registration and processor aliases implemented.</td></tr><tr><td><code>addons/tailwind</code></td><td>Tailwind CSS standalone CLI integration.</td><td>Addon</td><td>Experimental no-npm Tailwind v4 CSS processor wrapper; uses <code>tailwindcss</code> on PATH or an explicit installed executable path and fails with an install-required error when Tailwind is missing.</td></tr><tr><td><code>addons/ratelimit</code></td><td>Rate-limit feature marker.</td><td>Addon</td><td>Config-facing <code>Addon()</code>/<code>ImportPath</code> package with compatibility re-exports from <code>runtime/ratelimit</code>; generated apps import <code>runtime/ratelimit</code>.</td></tr><tr><td><code>addons/realtime</code></td><td>Browser presentation-event fanout feature marker.</td><td>Addon</td><td>Config-facing <code>Addon()</code>/<code>ImportPath</code> package with compatibility re-exports from <code>runtime/realtime</code>; generated apps import <code>runtime/realtime</code> for subscription-filtered presentation streams.</td></tr><tr><td><code>addons/db</code></td><td><code>database/sql</code> plumbing.</td><td>Addon</td><td>Opens app-selected drivers without importing a driver, provides <code>Ping</code>/<code>CheckReadiness</code>, <code>WithTx</code>, and ordered user-authored SQL migration application with file/checksum tracking. GOWDK does not own schemas, sqlc generation, repositories, domain logic, DSNs, or authorization. Real-driver coverage lives in the nested optional <code>addons/db/sqlitetest</code> module so root dependencies stay unchanged.</td></tr></tbody></table><h2 id="data-model">Data Model</h2><p>The internal compiler IR includes page identity, source path, route, render mode, -layouts, guard metadata, whether spa paths exist, retained <code>paths {}</code> and -<code>build {}</code> source text, typed literal/build-call records, parsed view nodes, -contract references, realtime subscriptions, and declared blocks. Current -public manifest JSON is intentionally smaller: it -includes route, effective render mode, layouts, paths presence, and guards. -Site-map JSON includes source paths, dynamic params, and block presence for -editor tooling.</p><p>Generated spa binaries embed this manifest with the rest of the spa output, -but request-time generated route handlers do not consume it yet.</p><p>Example manifest shape:</p><pre><code class="language-json">{ - &#34;pages&#34;: { - &#34;home&#34;: { - &#34;route&#34;: &#34;/&#34;, - &#34;render&#34;: &#34;spa&#34;, - &#34;layouts&#34;: [&#34;root&#34;] - }, - &#34;blog.post&#34;: { - &#34;route&#34;: &#34;/blog/{slug}&#34;, - &#34;render&#34;: &#34;spa&#34;, - &#34;paths&#34;: true, - &#34;layouts&#34;: [&#34;root&#34;, &#34;blog&#34;] - }, - &#34;dashboard&#34;: { - &#34;route&#34;: &#34;/dashboard&#34;, - &#34;render&#34;: &#34;ssr&#34;, - &#34;layouts&#34;: [&#34;root&#34;, &#34;dashboard&#34;], - &#34;guard&#34;: [&#34;auth.required&#34;] - } - } -} -</code></pre><h2 id="api-and-integration-contracts">API And Integration Contracts</h2><p>Application config:</p><pre><code class="language-go">var Config = gowdk.Config{ - AppName: &#34;Clinic&#34;, - Source: gowdk.SourceConfig{ - Include: []string{ - &#34;src/**/*.gwdk&#34;, - }, - }, - Modules: []gowdk.ModuleConfig{ - {Name: &#34;frontend&#34;, Type: &#34;frontend&#34;}, - { - Name: &#34;admin&#34;, - Type: &#34;admin-ui&#34;, - Source: gowdk.SourceConfig{ - Include: []string{&#34;frontends/admin/**/*.gwdk&#34;}, - }, - }, - { - Name: &#34;backendmicroservice&#34;, - Type: &#34;backendmicroservice&#34;, - Source: gowdk.SourceConfig{ - Include: []string{&#34;services/backend/**/*.gwdk&#34;}, - }, - }, - }, - Render: gowdk.RenderConfig{ - Default: gowdk.SPA, - }, - Build: gowdk.BuildConfig{ - Output: &#34;dist/clinic&#34;, - Assets: gowdk.Embed, - }, - Addons: []gowdk.Addon{ - SPA.Addon(), - actions.Addon(), - partial.Addon(), - embed.Addon(), - ssr.Addon(), - }, -} -</code></pre><p>Block semantics:</p><ul><li><code>paths {}</code> runs at build time and declares dynamic spa routes.</li><li><code>build {}</code> runs at build time and feeds spa rendering.</li><li><code>server {}</code> runs at request time and requires SSR or hybrid rendering.</li><li><code>act Name POST &#34;/path&#34;</code> declares POST/action endpoints.</li><li><code>api Name METHOD &#34;/path&#34;</code> declares API endpoints.</li><li><code>view {}</code> renders markup.</li></ul><p>Target generated route behavior:</p><pre><code class="language-go">mux.HandleFunc(&#34;GET /&#34;, embedded.SPA(&#34;pages/home.html&#34;)) -mux.HandleFunc(&#34;POST /newsletter&#34;, actions.NewsletterSubscribe) -mux.HandleFunc(&#34;GET /dashboard&#34;, ssr.RenderDashboard) -mux.HandleFunc(&#34;GET /api/patients&#34;, api.PatientsIndex) -</code></pre><p>The current code can plan route metadata for CLI reports and can emit SPA HTML files, CSS assets from compile-time processors and discovered page CSS inputs, stylesheet links, page-aware processor stylesheet selections, <code>gowdk-routes.json</code>, <code>gowdk-assets.json</code>, <code>gowdk-build-report.json</code>, the partial-update client runtime, and generated island runtime assets when needed for simple build-time pages with explicit or discovered component and layout files. It expands the first literal <code>paths {}</code> subset for dynamic SPA routes, binds those route params plus literal <code>build {}</code> data or imported Go build data into the current SPA <code>view {}</code> interpolation context, resolves typed component props/state contracts from Go module imports, runs state init functions at build time, and composes SPA page layouts through each layout&#39;s single <code>&lt;slot /&gt;</code>; literal <code>build {}</code> string values can also interpolate current route params. It parses the supported action body subset and can generate SPA POST redirect handlers plus form input decoders, required-field validation wrappers, typed same-package action decoder glue, user action/API calls, CSRF token wiring by default for generated action POSTs, command POSTs, and state-changing APIs, partial fragment responses, and concrete or dynamic standalone fragment routes through <code>runtime/partial</code>; dynamic fragment params are attached to hook contexts through <code>runtime/app.Params(ctx)</code> and <code>runtime/app.TypedParams(ctx)</code>. <code>gowdk build --app</code> can also generate concrete and dynamic SSR routes for pages with request-time full-page behavior, with dynamic route matching, generated typed route-param bindings backed by <code>runtime/route</code>, and <code>server {}</code> execution for declared fields through <code>runtime/ssr</code>; generated SSR load functions can return safe local redirects, generated SSR load failures can render optional <code>500.html</code>, and generated apps can render optional <code>404.html</code> for not-found responses. Generated guarded SSR, action, API, and fragment routes use <code>auth.Addon</code> defaults for <code>auth.required</code> and native <code>role:</code>/<code>permission:</code> session guards when configured; otherwise they require <code>GOWDKGuardRegistry</code> for custom guard IDs and <code>GOWDKAuthProvider</code> for native RBAC guard IDs, fail Go compilation when required backing hooks are missing, and run declared guards through <code>runtime/guard</code> before user logic. Ordinary guard errors fail closed while explicit guard helper errors can write no-store redirects or custom responses. Generated SSR, action, and API lanes also recover panics before response headers are written as no-store HTTP 500 responses without exposing panic values. <code>gowdk build --app</code> can generate an embedded Go app from that output, <code>--bin</code> can compile it, and <code>--docker</code> can emit a minimal Docker context beside the compiled binary. <code>gowdk serve</code> can serve the generated SPA directory locally. It does not implement arbitrary client expressions yet. Only pages with <code>server {}</code> or <code>go server {}</code> should use request-time full-page rendering.</p><p>Guard metadata declarations are parsed and exposed in manifest/site-map output. -<code>runtime/guard</code> defines guard context, registry, ordered execution, no-store -redirect/custom-response helpers, and native RBAC resolution for generated -action, API, fragment, and SSR routes. -<code>runtime/auth</code> defines the thin native RBAC principal/provider contract used for -generated route access gates. <code>runtime/ssr</code> owns guard type aliases for new code; <code>addons/ssr</code> re-exports them for existing -SSR-facing code, but generated action/API/fragment output does not import SSR -only to run guards. Generated handlers enforce declared guard IDs before -request-time user logic. Generated app packages with guarded routes use auth -addon defaults when configured, or require app startup code to define -<code>GOWDKGuardRegistry</code> or <code>GOWDKAuthProvider</code> without feature packages importing -generated output. Missing required guard backing hooks fail Go compilation. -Backend resource authorization still belongs in normal Go handlers and -services; generated guards are redundancy, not the source of truth.</p><p>Language tool commands:</p><pre><code class="language-sh">gowdk tokens &lt;file.gwdk&gt; -gowdk fmt [--write] &lt;file.gwdk&gt; -gowdk check [--ssr] &lt;file.gwdk&gt; -gowdk manifest [--ssr] &lt;file.gwdk&gt; -gowdk sitemap [--ssr] &lt;files&gt; -gowdk build [--config &lt;file&gt;] [--debug] [--ssr] [--target &lt;name&gt;] [--module &lt;name&gt;] [--out &lt;dir&gt;] [--app &lt;dir&gt;] [--bin &lt;file&gt;] [--docker] [--docker-base &lt;distroless|scratch&gt;] [--wasm &lt;file&gt;] [files...] -gowdk dev [--addr &lt;addr&gt;] [--interval &lt;duration&gt;] [build flags...] -gowdk serve --dir &lt;dir&gt; [--addr &lt;addr&gt;] -gowdk lsp [--ssr] -</code></pre><p>The user-facing documentation set for this pipeline is:</p><ul><li><code>docs/getting-started.md</code> for clone, build, scaffold, build, and serve.</li><li><code>docs/reference/cli.md</code> for working commands and flags.</li><li><code>docs/reference/config.md</code> for the spaally loaded config subset.</li><li><code>docs/reference/routing.md</code> for route validation, route plans, and generated -route behavior.</li><li><code>docs/reference/deployment.md</code> for spa, generated app, binary, and WASM -deploy outputs.</li><li><code>docs/compiler/pipeline.md</code> and <code>docs/compiler/browser-compiler.md</code> for -compiler and browser-facing output stages.</li><li><code>docs/language/</code> for supported and unsupported <code>.gwdk</code> syntax.</li><li><code>examples/README.md</code> for examples that match the actual compiler slice.</li></ul><p>Project-level compiler commands load <code>gowdk.config.go</code> from the current directory, or an explicit <code>--config &lt;file&gt;</code>, before compiling, validating, or inspecting <code>.gwdk</code> code. Explicit file paths narrow the input set but do not bypass the config requirement. When <code>gowdk build</code> receives no explicit files, it loads literal root source, module source, and build target settings from the config. A module with a name but no explicit include defaults to <code>&lt;module-name&gt;/**/*.gwdk</code>. Configured <code>Build.Targets</code> declare named module sets, output dirs, generated app dirs, binary paths, and WASM paths; with targets configured, <code>gowdk build</code> runs every target and <code>--target &lt;name&gt;</code> limits the run to selected targets. <code>--module &lt;name&gt;</code> remains available for ad hoc builds and may be repeated or comma-separated. The selected modules define the source set compiled into <code>--out</code>, copied into <code>--app</code>, and embedded into <code>--bin</code> or <code>--wasm</code>, so projects can build one-module binaries, multi-module binaries, WASM artifacts, or different artifacts from different module sets. If the loaded config has no root or module includes, discovery uses <code>**/*.gwdk</code> under the current working directory. Discovery excludes <code>.git</code>, <code>vendor</code>, <code>node_modules</code>, <code>testdata</code>, configured source excludes, and the selected output directory. Module type is user-defined metadata today; future generated-output work can use it to separate frontend, backend, and service artifacts. The VS Code extension uses <code>gowdk sitemap</code> to render a visual route map. Because routes are declared inside <code>.gwdk</code> files, the visualizer can move a page file without changing the page route.</p><p>LSP-capable editors can use <code>gowdk lsp</code> over stdio for live buffer diagnostics, -document formatting, completions, and hover. The first LSP version uses -full-document synchronization and validates one open buffer at a time with the -same parser and compiler rules as <code>gowdk check</code>.</p><h2 id="key-quality-attributes">Key Quality Attributes</h2><ul><li>Scalability: spa output should serve without request-time page rendering.</li><li>Reliability: invalid render modes and missing addon requirements must fail at compile time.</li><li>Security: actions must own form decoding, validation, CSRF, and redirect behavior.</li><li>Observability: manifests and site maps should explain route behavior and render mode.</li><li>Maintainability: runtime render core stays separate from <code>addons/ssr</code>.</li></ul><h2 id="diagrams">Diagrams</h2><pre><code class="language-mermaid">flowchart LR - Source[.gwdk files] --&gt; Discover[internal/discover] - Discover --&gt; Parser[internal/parser] - Parser --&gt; IR[internal/gwdkir records] - IR --&gt; Assembly[internal/gwdkanalysis] - Assembly --&gt; Compiler[internal/compiler] - Compiler --&gt; Buildgen[internal/buildgen] - Compiler --&gt; Appgen[internal/appgen] - Buildgen --&gt; SPA[SPA pages/assets] - Appgen --&gt; Binary[one Go binary] - Embed[addons/embed] --&gt; Binary - - Render[runtime/render] --&gt; StaticAddon[addons/static] - Render --&gt; ActionsAddon[addons/actions] - Render --&gt; PartialAddon[addons/partial] - Render --&gt; SSRAddon[addons/ssr] - Guard[runtime/guard] --&gt; ActionsAddon - Guard --&gt; APIAddon[addons/api] - Guard --&gt; PartialAddon - Guard --&gt; SSRAddon -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/await-blocks-plan/index.html b/docs-site/dist/site/docs/engineering/await-blocks-plan/index.html deleted file mode 100644 index 2938d6a6..00000000 --- a/docs-site/dist/site/docs/engineering/await-blocks-plan/index.html +++ /dev/null @@ -1,32 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Implementation Plan: Bounded Await Blocks - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Implementation Plan: Bounded Await Blocks - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Implementation Plan: Bounded Await Blocks - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Implementation Plan: Bounded Await Blocks</h1></header><article class="prose"><h2 id="context">Context</h2><p>Relevant issue: <a href="https://github.com/cssbruno/GoWDK/issues/502">https://github.com/cssbruno/GoWDK/issues/502</a></p><h2 id="assumptions">Assumptions</h2><ul><li>This PR completes the bounded <code>fetchJSON[T](urlExpr)</code> form for client islands.</li><li><code>g:await</code>, <code>g:async</code>, arbitrary promises, and value-returning async helpers -remain out of scope.</li></ul><h2 id="proposed-changes">Proposed Changes</h2><ul><li>Add an <code>AwaitBlock</code> view node and parser support for <code>{#await}</code> branches.</li><li>Render await blocks as <code>gowdk-await</code> markers with pending/then/catch -templates inside JS islands.</li><li>Add runtime fetch execution, cancellation, branch swapping, and re-binding.</li><li>Update diagnostics and language docs to describe the supported slice.</li></ul><h2 id="files-expected-to-change">Files Expected To Change</h2><ul><li><code>internal/viewmodel/</code></li><li><code>internal/viewparse/</code></li><li><code>internal/viewrender/</code></li><li><code>internal/clientlang/</code></li><li><code>internal/clientrt/assets/island.js</code></li><li><code>docs/language/</code></li><li>focused tests under <code>internal/viewrender</code>, <code>internal/clientrt</code>, and -<code>internal/buildgen</code> as needed.</li></ul><h2 id="data-and-api-impact">Data And API Impact</h2><ul><li>Adds generated <code>gowdk-await</code> markup and <code>data-gowdk-await-*</code> attributes inside -JS islands.</li><li>Does not change Go public APIs or endpoint contracts.</li></ul><h2 id="tests">Tests</h2><ul><li>Unit: parser/model/render validation and diagnostics.</li><li>Integration: generated runtime snippets.</li><li>End-to-end: browser island await success/error behavior when feasible.</li><li>Manual: none expected.</li></ul><h2 id="verification-commands">Verification Commands</h2><pre><code class="language-sh">go test ./internal/viewrender ./internal/clientrt ./internal/buildgen ./internal/compiler ./internal/lang -go test ./... -go build ./cmd/gowdk -</code></pre><h2 id="rollback-plan">Rollback Plan</h2><ul><li>Revert the parser/model/render/runtime changes and restore the unsupported -await diagnostic text.</li></ul><h2 id="risks">Risks</h2><ul><li>Nested branch content must be rebound after swaps.</li><li>Stale fetch results must not update detached or superseded await blocks.</li><li>Await-generated islands must mount even when a component has no explicit -state or event handlers.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/ci/index.html b/docs-site/dist/site/docs/engineering/ci/index.html deleted file mode 100644 index 30120ab2..00000000 --- a/docs-site/dist/site/docs/engineering/ci/index.html +++ /dev/null @@ -1,105 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>CI - GOWDK</title> - <meta name="description" content="Hosted CI is split by concern in .github/workflows/ci.yml. Local verification remains the fastest pre-handoff gate."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="CI - GOWDK"> - <meta property="og:description" content="Hosted CI is split by concern in .github/workflows/ci.yml. Local verification remains the fastest pre-handoff gate."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="CI - GOWDK"> - <meta name="twitter:description" content="Hosted CI is split by concern in .github/workflows/ci.yml. Local verification remains the fastest pre-handoff gate."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>CI</h1><p class="doc-lead">Hosted CI is split by concern in .github/workflows/ci.yml. Local verification remains the fastest pre-handoff gate.</p></header><article class="prose"><p>Hosted CI is split by concern in <code>.github/workflows/ci.yml</code>. Local verification -remains the fastest pre-handoff gate.</p><h2 id="hosted-jobs">Hosted Jobs</h2><p>Required pull-request lanes:</p><ul><li><code>Go tests (ubuntu-latest)</code>: root dependency check and all Go module tests.</li><li><code>Go tests (macos-14)</code>: OS signal for Go tests on Darwin/arm64.</li><li><code>Reachable vulnerabilities</code>: <code>scripts/vulncheck-go-modules.sh</code>.</li><li><code>CLI build</code>: <code>go build ./cmd/gowdk</code>.</li><li><code>VS Code extension</code>: extension version sync, Node syntax checks, and unit -tests.</li><li><code>Documentation links</code>: <code>scripts/check-docs-links.sh</code>.</li><li><code>Example reports</code>: <code>scripts/check-example-reports.sh</code>.</li><li><code>Parser fuzz smoke</code>: <code>scripts/test-parser-fuzz.sh</code> with -<code>GOWDK_FUZZTIME=1s</code>.</li><li><code>Generated app integration</code>: <code>scripts/test-generated-app-integration.sh</code>.</li><li><code>Generated output determinism</code>: -<code>scripts/test-generated-output-determinism.sh</code>.</li><li><code>Generated output smoke</code>: representative build output, binary, WASM, SSR, -CSS, SEO, component asset, and login example checks.</li></ul><p>The release lanes live outside the pull-request CI workflow:</p><ul><li><code>.github/workflows/release-dry-run.yml</code>: scheduled weekly and manual; packages -CLI/VS Code artifacts, writes checksums, and uploads workflow artifacts. This -is GitHub-only because it uses Actions artifact upload.</li><li><code>.github/workflows/release.yml</code>: tag/manual publishing workflow for real -releases.</li><li><code>.github/workflows/release-smoke.yml</code>: manual post-publish artifact smoke -across Linux, macOS Intel, macOS arm64, and Windows.</li></ul><h2 id="local-gates">Local Gates</h2><p>Run the same local checks before handoff when relevant:</p><ul><li><p>Go/module checks:</p><pre><code class="language-sh">scripts/check-root-deps.sh -scripts/test-go-modules.sh -scripts/vulncheck-go-modules.sh -go build ./cmd/gowdk -</code></pre></li><li><p>VS Code extension checks:</p><pre><code class="language-sh">node editors/vscode/scripts/sync-version.js --check -node --check editors/vscode/extension.js -node --check editors/vscode/extension-core.js -node --test editors/vscode/*.test.js -</code></pre></li><li><p>Docs and example report checks:</p><pre><code class="language-sh">scripts/check-docs-links.sh -scripts/check-example-reports.sh -</code></pre></li><li><p>Fuzz, integration, and determinism checks:</p><pre><code class="language-sh">scripts/test-parser-fuzz.sh -GOWDK_FUZZTIME=30s scripts/test-parser-fuzz.sh -scripts/test-generated-app-integration.sh -scripts/test-generated-output-determinism.sh -</code></pre></li><li><p>Example smoke checks:</p><pre><code class="language-sh">scripts/check-root-deps.sh -scripts/vulncheck-go-modules.sh -go run ./cmd/gowdk check --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/store-persist/*.gwdk examples/embed/*.gwdk examples/seo/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk examples/contracts/*.gwdk examples/security/*.gwdk -go run ./cmd/gowdk manifest --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/store-persist/*.gwdk examples/embed/*.gwdk examples/seo/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk examples/contracts/*.gwdk examples/security/*.gwdk -go run ./cmd/gowdk sitemap --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/store-persist/*.gwdk examples/embed/*.gwdk examples/seo/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk examples/contracts/*.gwdk examples/security/*.gwdk -go run ./cmd/gowdk routes --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/store-persist/*.gwdk examples/embed/*.gwdk examples/seo/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk examples/contracts/*.gwdk examples/security/*.gwdk -go run ./cmd/gowdk build --config examples/css/gowdk.config.go --out /tmp/gowdk-css-build examples/css/styled.page.gwdk -go run ./cmd/gowdk build --config examples/seo/gowdk.config.go --out /tmp/gowdk-seo-build examples/seo/*.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-embed-build --app /tmp/gowdk-embed-app --bin /tmp/gowdk-embed-site examples/embed/site.page.gwdk -GOWDK_SMOKE_ADDR=127.0.0.1:18085 scripts/smoke-generated-binary.sh /tmp/gowdk-embed-site /embed &#34;Embedded GOWDK&#34; -go run ./cmd/gowdk build --out /tmp/gowdk-wasm-build --app /tmp/gowdk-wasm-app --wasm /tmp/gowdk-site.wasm examples/embed/site.page.gwdk -scripts/smoke-generated-wasm.sh /tmp/gowdk-site.wasm -go run ./cmd/gowdk build --ssr --out /tmp/gowdk-hybrid-build --app /tmp/gowdk-hybrid-app --bin /tmp/gowdk-hybrid-site examples/ssr/hybrid-static.page.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-component-assets examples/components/assets/*.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-wasm-island examples/components/wasm/*.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-store-persist examples/store-persist/*.gwdk -</code></pre><p>These commands run from the repository root and rely on the root -<code>gowdk.config.go</code>. Any smoke command run from another directory must pass -<code>--config &lt;file&gt;</code>.</p></li></ul><h2 id="fuzz-integration-and-determinism">Fuzz, Integration, And Determinism</h2><p>Baseline CI keeps these checks bounded and Linux-only so the OS matrix is not -multiplied by generated-binary work:</p><ul><li><code>scripts/test-parser-fuzz.sh</code> runs the existing <code>FuzzParseSyntax</code> target. -CI sets <code>GOWDK_FUZZTIME=1s</code>; local hardening can raise it, for example -<code>GOWDK_FUZZTIME=30s scripts/test-parser-fuzz.sh</code>.</li><li><code>scripts/test-generated-app-integration.sh</code> runs representative generated -binary flows for embedded SPA serving, action redirect, CSRF, fragments, -dynamic SSR, and contract query execution.</li><li><code>scripts/test-generated-output-determinism.sh</code> builds the same page twice -and diffs generated HTML, manifests, OpenAPI/AsyncAPI, build reports, and -report CLI output after canonicalizing temp paths.</li></ul><p>If one of these reveals nondeterministic output, either fix the generator in -the same change or open a narrower issue naming the unstable file/report.</p><h2 id="release-smoke">Release Smoke</h2><p>After publishing a tag, verify the current machine&#39;s release artifact locally:</p><pre><code class="language-sh">scripts/smoke-release-artifact.sh v0.7.0 -</code></pre><p>Pass an explicit asset name to test a non-native artifact:</p><pre><code class="language-sh">scripts/smoke-release-artifact.sh v0.7.0 gowdk-linux-amd64 -</code></pre><p>Use <code>GOWDK_RELEASE_REPO=owner/repo</code> for forks. The GitHub-only matrix version -is <code>.github/workflows/release-smoke.yml</code>; trigger it with the published tag as -the <code>version</code> input.</p><h2 id="branch-protection">Branch Protection</h2><p>Require these checks before merging to <code>main</code>:</p><ul><li><code>Go tests (ubuntu-latest)</code></li><li><code>Go tests (macos-14)</code></li><li><code>Reachable vulnerabilities</code></li><li><code>CLI build</code></li><li><code>VS Code extension</code></li><li><code>Documentation links</code></li><li><code>Example reports</code></li><li><code>Parser fuzz smoke</code></li><li><code>Generated app integration</code></li><li><code>Generated output determinism</code></li><li><code>Generated output smoke</code></li></ul><p>Do not require scheduled <code>Release Dry Run</code> or manual <code>Release Artifact Smoke</code> -for normal pull requests. Use them for release readiness and post-publish -verification.</p><h2 id="documentation-links">Documentation Links</h2><p><code>scripts/check-docs-links.sh</code> runs the stdlib-only <code>internal/doclint</code> checker -over every Markdown file in the repository. It is a targeted gate: a broken -in-repo link fails CI instead of rotting silently.</p><p>It checks only local references and stays offline:</p><ul><li>Relative file and directory links must resolve to an existing path.</li><li><code>#fragment</code> anchors (same-file or <code>file.md#fragment</code>) must resolve to a -GitHub-style heading slug in the target Markdown file.</li><li>External links (<code>http</code>, <code>https</code>, <code>mailto</code>, <code>tel</code>, protocol-relative <code>//</code>) are -skipped — the check never makes network calls.</li><li>Links inside fenced or inline code are ignored because they are documentation -examples, not live references.</li></ul><p>Generated, vendored, and local-output directories are excluded by default -(<code>.git</code>, <code>.gowdk</code>, <code>node_modules</code>, <code>vendor</code>, <code>dist</code>, <code>bin</code>, <code>tmp</code>). Override the -set with <code>-exclude</code> and scope a run with <code>-root</code>:</p><pre><code class="language-sh">scripts/check-docs-links.sh -root docs -exclude .git,node_modules -</code></pre><p>Markdown <em>style</em> linting is intentionally not part of this gate. The available -formatters flagged mostly cosmetic line-wrap and list-indent differences across -the existing docs — high churn, low signal — so the gate is limited to link and -anchor correctness, which catches real breakage. Revisit if a style check earns -its keep without mass reformatting.</p><h2 id="cache-maintenance">Cache Maintenance</h2><p>GitHub Actions caching is enabled for Go through <code>actions/setup-go</code> in CI and -release packaging. Keep those caches because they reduce module and build-cache -work across repeated runs.</p><p>GitHub-managed CodeQL default setup also creates per-commit overlay database -caches. Those entries are safe to regenerate and can quickly fill the repository -cache quota. <code>.github/workflows/cache-maintenance.yml</code> runs weekly and can be -triggered manually to keep only the newest CodeQL overlay caches:</p><pre><code class="language-sh">gh workflow run cache-maintenance.yml -</code></pre><p>For local one-off cleanup with a GitHub token:</p><pre><code class="language-sh">GOWDK_CACHE_PRUNE_KEEP=20 scripts/prune-github-caches.sh cssbruno/GoWDK -</code></pre><h2 id="release-jobs">Release Jobs</h2><p>Release packaging lives in <code>.github/workflows/release.yml</code>. It builds the -supported CLI binaries, packages the VS Code <code>.vsix</code>, writes <code>checksums.txt</code>, -uploads <code>dist/*</code> as a run artifact for CI downloads, attests the same files, and -uploads them to the selected tag release. The release job fails if any expected -tag release asset is missing after upload.</p><ul><li>Expand the release matrix if additional platforms become supported.</li><li>Verify generated-output examples with <code>gowdk build --out</code>.</li><li>Automate the dependency and license gates documented in -<code>docs/engineering/dependency-policy.md</code>.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/code-quality/index.html b/docs-site/dist/site/docs/engineering/code-quality/index.html deleted file mode 100644 index b468d6b8..00000000 --- a/docs-site/dist/site/docs/engineering/code-quality/index.html +++ /dev/null @@ -1,34 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Code Quality - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Code Quality - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Code Quality - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Code Quality</h1></header><article class="prose"><h2 id="purpose">Purpose</h2><p>This document defines the engineering quality rules for GOWDK code. Naming and -product-name rules live in <code>docs/engineering/naming-conventions.md</code>.</p><h2 id="package-boundaries">Package Boundaries</h2><ul><li>Keep root <code>package gowdk</code> as a public API surface only. Do not put compiler, -runtime, addon, CLI, or generated-app implementation in the repository root.</li><li>Keep compiler internals under <code>internal/</code>.</li><li>Keep generated app runtime contracts under <code>runtime/</code>.</li><li>Keep optional capabilities under <code>addons/</code>.</li><li>Keep validation, parsing, manifest construction, app generation, runtime -contracts, and optional addons in separate packages.</li><li>Do not let <code>runtime/render</code> depend on <code>addons/ssr</code>; SSR depends on render -core, not the other way around.</li></ul><h2 id="implementation-rules">Implementation Rules</h2><ul><li>Prefer clear names over comments that restate the code.</li><li>Keep modules focused on one responsibility.</li><li>Keep public contracts documented.</li><li>Avoid speculative abstraction.</li><li>Prefer direct code over factories, registries, or package-level indirection -until the extra layer is required by real behavior.</li><li>Do not create catch-all <code>utils</code>, <code>common</code>, or <code>shared</code> packages. Put helpers -near their domain first; extract only when reuse is stable.</li><li>Return errors with enough context to diagnose the failing file, route, page, -module, or output path.</li><li>Add succinct comments only where they explain non-obvious behavior or preserve -a contract that future maintainers might accidentally break.</li><li>Use <code>gofmt</code> for all Go changes.</li></ul><h2 id="tests">Tests</h2><ul><li>Keep tests close to the package they validate.</li><li>Tests for the root public API live outside the root package so <code>gowdk.go</code> -remains the only root Go file.</li><li>Add or update tests when behavior, public contracts, generated output, parser -rules, diagnostics, or route behavior changes.</li><li>Prefer focused tests that prove the changed behavior over broad fixture churn.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Add production dependencies only when they remove meaningful implementation or -maintenance risk.</li><li>Document major dependency choices in an ADR.</li><li>Follow <code>docs/engineering/dependency-policy.md</code> for dependency review details.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/conventions/index.html b/docs-site/dist/site/docs/engineering/conventions/index.html deleted file mode 100644 index 9a58b4ae..00000000 --- a/docs-site/dist/site/docs/engineering/conventions/index.html +++ /dev/null @@ -1,27 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Engineering Conventions - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Engineering Conventions - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Engineering Conventions - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Engineering Conventions</h1></header><article class="prose"><h2 id="current-status">Current Status</h2><p>GOWDK is a Go module. The root module path is <code>github.com/cssbruno/gowdk</code>.</p><h2 id="repository-layout">Repository Layout</h2><p>Keep top-level directories purposeful:</p><ul><li><code>docs/</code>: product and engineering documentation.</li><li><code>.agents/</code>: tool-neutral agent skills (<code>skills/</code>) and reusable templates (<code>templates/</code>).</li><li><code>.github/</code>: GitHub metadata, issue templates, and PR template.</li><li><code>gowdk.go</code>: root public API for <code>github.com/cssbruno/gowdk</code>; keep this as -the only root Go source file.</li><li><code>cmd/gowdk/</code>: CLI entrypoint.</li><li><code>internal/</code>: compiler internals.</li><li><code>runtime/</code>: public generated-runtime packages.</li><li><code>addons/</code>: optional feature packages.</li></ul><h2 id="detailed-rules">Detailed Rules</h2><ul><li><code>docs/engineering/code-quality.md</code>: package boundaries, implementation -quality, testing, and dependency discipline.</li><li><code>docs/engineering/naming-conventions.md</code>: product name, full-name, file, -artifact, runtime, and Go identifier naming rules.</li><li><code>docs/engineering/dependency-policy.md</code>: dependency selection and review -policy.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0001-llm-ready-project-structure/index.html b/docs-site/dist/site/docs/engineering/decisions/0001-llm-ready-project-structure/index.html deleted file mode 100644 index ed59516e..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0001-llm-ready-project-structure/index.html +++ /dev/null @@ -1,28 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0001: LLM-Ready Project Structure - GOWDK</title> - <meta name="description" content="Date: 2026-06-04"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0001: LLM-Ready Project Structure - GOWDK"> - <meta property="og:description" content="Date: 2026-06-04"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0001: LLM-Ready Project Structure - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-04"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0001: LLM-Ready Project Structure</h1><p class="doc-lead">Date: 2026-06-04</p></header><article class="prose"><p>Date: 2026-06-04</p><p>Status: Accepted (amended 2026-06-11: <code>.llm/workflows/</code> was replaced by skills -in <code>.agents/skills/</code>, and <code>.llm/templates/</code> moved to <code>.agents/templates/</code>; -<code>AGENTS.md</code> is now the instruction file for any coding agent, not only Codex)</p><h2 id="context">Context</h2><p>The repository started empty and needed a structure that helps LLM-assisted coding sessions and humans build a larger project without losing product intent, architecture decisions, or verification habits.</p><h2 id="decision">Decision</h2><p>Use <code>AGENTS.md</code> as the source of truth for Codex instructions. Keep reusable, tool-neutral LLM workflows in <code>.llm/workflows/</code>, templates in <code>.llm/templates/</code>, product docs in <code>docs/product/</code>, and engineering docs in <code>docs/engineering/</code>.</p><p><strong>Amendment (2026-06-11):</strong><code>AGENTS.md</code> is the always-on instruction file for any coding agent, not only Codex. The <code>.llm/</code> directory was retired: recurring task workflows became skills under <code>.agents/skills/</code>, and reusable templates moved to <code>.agents/templates/</code>. Product and engineering doc locations are unchanged.</p><p>The product-specific implementation is documented separately in ADR 0002.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>Future LLM-assisted coding sessions have consistent startup context.</li><li>Planning, implementation, review, and documentation have defined homes.</li><li>Product and engineering decisions have stable locations as GOWDK grows.</li></ul><h3 id="negative">Negative</h3><ul><li>The repository contains process documentation that must stay in sync with implementation reality.</li><li>Tool-neutral workflows must avoid depending on any single coding assistant&#39;s private behavior.</li></ul><h3 id="neutral">Neutral</h3><ul><li>Agent instructions stay centralized in <code>AGENTS.md</code>, while reusable skills and templates remain tool-neutral (under <code>.agents/</code> since the 2026-06-11 amendment).</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Add adapters for other coding assistants. Rejected for now because reusable templates are tool-neutral and do not require separate adapter files.</li><li>Store all guidance in <code>AGENTS.md</code>. Rejected because long reusable workflows and templates should not consume Codex project-doc budget on every task.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Keep <code>README.md</code>, <code>AGENTS.md</code>, and <code>docs/engineering/architecture.md</code> aligned when commands, package boundaries, or render rules change.</li><li>Add nested <code>AGENTS.md</code> files only when a future subtree needs more specific agent instructions.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0002-compile-first-render-model/index.html b/docs-site/dist/site/docs/engineering/decisions/0002-compile-first-render-model/index.html deleted file mode 100644 index 914fd41d..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0002-compile-first-render-model/index.html +++ /dev/null @@ -1,29 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0002: Compile-First Render Model - GOWDK</title> - <meta name="description" content="Date: 2026-06-04"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0002: Compile-First Render Model - GOWDK"> - <meta property="og:description" content="Date: 2026-06-04"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0002: Compile-First Render Model - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-04"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0002: Compile-First Render Model</h1><p class="doc-lead">Date: 2026-06-04</p></header><article class="prose"><p>Date: 2026-06-04</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>GOWDK must not be full SSR by default. The product goal is a Go-first portable web compiler that can emit SPA pages, typed backend actions, server fragments, APIs, embedded assets, and one-binary deploys. Request-time full-page rendering is useful, but only for pages that need auth/session/request-aware data.</p><h2 id="decision">Decision</h2><p>Core GOWDK renders at build time by default. SSR is an optional addon and a per-page render mode.</p><p>Render modes:</p><ul><li><code>spa</code>: build-time HTML.</li><li><code>action</code>: SPA page plus backend actions/API behavior.</li><li><code>hybrid</code>: SPA by default with selected request-time behavior.</li><li><code>ssr</code>: request-time full-page rendering through the SSR addon.</li></ul><p>Block semantics:</p><ul><li><code>paths {}</code> runs at build time and declares dynamic SPA routes.</li><li><code>build {}</code> runs at build time.</li><li><code>server {}</code> runs at request time and requires request-time rendering.</li><li><code>act Name POST &#34;/path&#34;</code> declares POST/action endpoints.</li><li><code>api Name METHOD &#34;/path&#34;</code> declares API endpoints.</li><li><code>view {}</code> renders markup.</li></ul><p>Compiler rules:</p><ul><li>Default render mode is <code>spa</code>.</li><li>Dynamic SPA routes require <code>paths {}</code>; action endpoints inherit generated -concrete page paths.</li><li><code>server {}</code> and <code>go server {}</code> require <code>ssr.Addon()</code>.</li><li><code>server {}</code> is rejected on SPA/action pages.</li><li>Actions can exist without SSR.</li><li>Partial updates are server fragments, not full-page SSR.</li></ul><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>GOWDK has a sharper identity: app-shipping Go compiler with build-time output, backend actions, and optional SSR.</li><li>One-binary deploy works with or without request-time full-page rendering.</li><li>Actions, APIs, and fragments can provide backend behavior without forcing SSR.</li><li>Compiler diagnostics can catch render model mistakes early.</li></ul><h3 id="negative">Negative</h3><ul><li>The compiler must distinguish build-time and request-time blocks clearly.</li><li>Hybrid behavior needs careful design to avoid becoming implicit SSR.</li><li>SPA dynamic routes require a <code>paths {}</code> concept before route generation is complete.</li></ul><h3 id="neutral">Neutral</h3><ul><li>Runtime render core is shared by spa, actions, partials, and SSR.</li><li><code>addons/ssr</code> depends on render core; render core does not depend on SSR.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Make SSR the default framework identity. Rejected because it conflicts with portable compile-first output and one-binary app serving.</li><li>Make build output an addon. Rejected because build-time rendering is the -compiler core product behavior.</li><li>Treat partial updates as SSR. Rejected because server fragments are smaller and do not require full-page request-time rendering.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Implement <code>.gwdk</code> discovery and manifest generation.</li><li>Implement parser support for <code>paths</code>, <code>build</code>, <code>load</code>, <code>act</code>, <code>api</code>, and <code>view</code>.</li><li>Implement build-output/prerender codegen.</li><li>Implement CSS processor addon extension points. Tailwind should remain an -optional addon, not part of the initial compiler core or runtime core.</li><li>Implement one-binary serving before SSR addon internals.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/index.html b/docs-site/dist/site/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/index.html deleted file mode 100644 index 9029be11..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/index.html +++ /dev/null @@ -1,45 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0003: JS Default, Component-Declared WASM Islands - GOWDK</title> - <meta name="description" content="Date: 2026-06-04"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0003: JS Default, Component-Declared WASM Islands - GOWDK"> - <meta property="og:description" content="Date: 2026-06-04"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0003: JS Default, Component-Declared WASM Islands - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-04"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0003: JS Default, Component-Declared WASM Islands</h1><p class="doc-lead">Date: 2026-06-04</p></header><article class="prose"><p>Date: 2026-06-04</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>GOWDK needs local component interactivity without becoming a React, Svelte, or -npm-centered runtime. App-shell HTML remains the first output, server fragments -handle action-driven updates, and local state needs a small browser runtime.</p><p>WASM is still important for richer browser-side Go logic, but making it the -implicit runtime for every stateful component would force simple counters, -toggles, and disclosure widgets through a heavier runtime and make them harder -to inspect.</p><h2 id="decision">Decision</h2><p>Stateful components use generated JavaScript islands by default. A component -with <code>state &lt;alias&gt;.&lt;Type&gt; = &lt;alias&gt;.&lt;Init&gt;()</code> renders initial state at build -time and emits the shared <code>assets/gowdk/islands/island.js</code> runtime plus a -package-scoped <code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.js</code> registration stub -when a page calls it without an island override.</p><p>WASM is declared on the component with <code>wasm &lt;package&gt;</code>. Normal calls to that -component emit <code>assets/gowdk/islands/&lt;package&gt;/Counter.wasm</code> and -<code>assets/gowdk/islands/&lt;package&gt;/Counter.wasm.js</code>. <code>g:island=&#34;wasm&#34;</code> remains -available as a call-site override for compatibility and targeted experiments. Unknown -<code>g:island</code> values are compiler errors.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>The default interactive path stays dependency-free, inspectable, and small.</li><li>App-shell HTML remains the initial output for stateful components.</li><li>WASM work has an explicit component-level opt-in boundary instead of becoming -a hidden default for every stateful component.</li></ul><h3 id="negative">Negative</h3><ul><li>GOWDK now has two island asset paths to keep documented and tested.</li><li>The generated JavaScript expression subset must stay intentionally narrow -until a broader client model is designed.</li></ul><h3 id="neutral">Neutral</h3><ul><li>ADR 0004 defines the production WASM island ABI. Broader user-code ergonomics -can evolve without making WASM the default component runtime.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Make WASM the default island runtime. Rejected because it is too heavy for -common scalar UI state and weakens build-time inspectability.</li><li>Wait for a full WASM design before adding local state. Rejected because -generated JavaScript can handle the first useful stateful component slice -without adding npm or full-page hydration.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Keep ADR 0004 as the production WASM island ABI source of truth.</li><li>Expand generated JavaScript only through explicit, tested expression slices.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0004-production-wasm-island-abi/index.html b/docs-site/dist/site/docs/engineering/decisions/0004-production-wasm-island-abi/index.html deleted file mode 100644 index 904e8d2d..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0004-production-wasm-island-abi/index.html +++ /dev/null @@ -1,63 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0004: Production WASM Island ABI - GOWDK</title> - <meta name="description" content="Date: 2026-06-05"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0004: Production WASM Island ABI - GOWDK"> - <meta property="og:description" content="Date: 2026-06-05"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0004: Production WASM Island ABI - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-05"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0004: Production WASM Island ABI</h1><p class="doc-lead">Date: 2026-06-05</p></header><article class="prose"><p>Date: 2026-06-05</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>ADR 0003 keeps generated JavaScript as the default island runtime and makes -WASM explicit through component-level <code>wasm</code> declarations, with -<code>g:island=&#34;wasm&#34;</code> retained as a call-site override. The compiler needs a stable -ABI for bootstrapping state, passing props, dispatching events, lifecycle calls, -and DOM updates.</p><p>The ABI must preserve the compile-first model:</p><ul><li>App-shell HTML is still the initial rendered output.</li><li>JavaScript remains the host that discovers island roots and loads WASM.</li><li>WASM is opt-in per component, with call-site override support.</li><li>Components must not require full-page hydration.</li></ul><h2 id="decision">Decision</h2><p>Use a JS-hosted WASM island ABI. The generated loader owns DOM discovery, -bootstrap decoding, event listener attachment, lifecycle scheduling, and DOM -patch application. The Go WASM module owns component-local state transitions and -returns compiler-defined patch commands to the host.</p><p>Entrypoint naming:</p><ul><li>The generated loader looks for exported functions named -<code>GOWDKMount&lt;Component&gt;</code>, <code>GOWDKHandle&lt;Component&gt;</code>, and -<code>GOWDKDestroy&lt;Component&gt;</code>.</li><li>Each required export must currently have the WASM signature produced by Go -<code>func() uint32</code>: no parameters and one <code>i32</code> result.</li><li>Exported names are component-scoped to avoid a registry in the first slice.</li><li>Missing required exports are compile or load diagnostics, not silent no-ops.</li></ul><p>Bootstrap ABI:</p><ul><li>The loader passes one JSON object to <code>GOWDKMount&lt;Component&gt;</code>.</li><li>The object contains <code>abiVersion</code>, <code>component</code>, <code>state</code>, <code>props</code>, <code>emits</code>, -<code>refs</code>, and <code>bindings</code>.</li><li>The current <code>abiVersion</code> is <code>gowdk-wasm-island-v1</code>.</li><li><code>state</code> is the same JSON object used by JS islands.</li><li><code>props</code> contains initial prop values and reactive prop expression names.</li><li><code>bindings</code> is the compiler-owned table of text, attribute, class, style, -conditional, list, and event binding IDs.</li></ul><p>Event ABI:</p><ul><li>DOM events are captured by the JS host.</li><li>The host calls <code>GOWDKHandle&lt;Component&gt;</code> with -<code>{ abiVersion, component, event, binding, detail }</code>.</li><li><code>event</code> is the DOM event name or component event name.</li><li><code>binding</code> is the compiler-assigned binding ID.</li><li><code>detail</code> contains scalar event payload fields.</li><li>Component emits are returned as patch commands of type <code>emit</code>, and the host -dispatches <code>CustomEvent</code> with the typed payload.</li></ul><p>DOM update ABI:</p><ul><li>The WASM module does not directly mutate the DOM.</li><li>WASM returns a JSON patch list. The JS host validates and applies patches.</li><li>Initial patch operations are <code>setText</code>, <code>setAttr</code>, <code>removeAttr</code>, -<code>toggleClass</code>, <code>setStyle</code>, <code>setHidden</code>, <code>replaceList</code>, and <code>emit</code>.</li><li>Patch targets are compiler-owned binding IDs, not CSS selectors.</li></ul><p>Lifecycle ABI:</p><ul><li>The host calls <code>GOWDKMount&lt;Component&gt;</code> once per island root.</li><li>The host calls <code>GOWDKDestroy&lt;Component&gt;</code> when the island root is removed or on -pagehide before unload, with <code>{ abiVersion, component, state }</code>.</li><li>Future effect cleanup uses explicit patch/lifecycle return values rather than -ambient goroutines.</li></ul><p>Asset strategy:</p><ul><li>Component WASM is emitted at -<code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.wasm</code>.</li><li>The loader is emitted at -<code>assets/gowdk/islands/&lt;package&gt;/&lt;Component&gt;.wasm.js</code>.</li><li>Declared Go WASM packages ship <code>assets/gowdk/islands/wasm_exec.js</code> from the -Go toolchain used for the build; the build report records that Go version on -the <code>asset_size</code> event for the runtime asset.</li><li>Multiple component instances share the same WASM module asset but receive -separate bootstrap objects.</li><li>JS and WASM islands may coexist on the same page.</li></ul><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>The JS host keeps DOM mutation small, inspectable, and consistent with the -generated JavaScript island runtime.</li><li>WASM components can use real Go logic without taking over the whole page.</li><li>Binding IDs give future partial swaps and remounts a common target model.</li><li>Event dispatch stays consistent across JS and WASM islands.</li></ul><h3 id="negative">Negative</h3><ul><li>The host must validate patch lists to avoid corrupting DOM state.</li><li>The generated loader remains necessary even when the state logic lives in -WASM.</li><li>Exported function naming is simple but may need a registry if components are -bundled together later.</li></ul><h3 id="neutral">Neutral</h3><ul><li>This ADR defines the ABI only. It does not require immediate implementation -of user-authored browser-side Go packages.</li><li>The first implementation can support a subset of patch operations as long as -unsupported operations fail clearly.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Let WASM directly mutate the DOM through <code>syscall/js</code>. Rejected because it -duplicates host logic, makes partial remounting harder, and weakens -compiler-owned binding guarantees.</li><li>Use one global registry export. Rejected for the first production slice -because component-scoped exports are simpler to validate and debug.</li><li>Serialize HTML fragments from WASM. Rejected because it would bypass stable -binding IDs and make fine-grained updates harder to reason about.</li></ul><h2 id="implementation">Implementation</h2><ul><li>GOWDK builds declared <code>wasm</code> packages with <code>GOOS=js GOARCH=wasm</code>.</li><li>Generated loader payloads use ABI version <code>gowdk-wasm-island-v1</code>.</li><li>Built WASM artifacts are rejected unless they export -<code>GOWDKMount&lt;Component&gt;</code>, <code>GOWDKHandle&lt;Component&gt;</code>, and -<code>GOWDKDestroy&lt;Component&gt;</code> with the required no-parameter, <code>uint32</code> result -signature.</li><li>The generated loader passes the bootstrap object, applies the defined patch -operations, rejects unknown patch operations through a console error, and -supports JS/WASM island coexistence on the same page.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Add browser tests for mount, event handling, visible state update, destroy, -and JS/WASM coexistence against a real browser runtime.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0005-generated-go-emission-boundary/index.html b/docs-site/dist/site/docs/engineering/decisions/0005-generated-go-emission-boundary/index.html deleted file mode 100644 index 7794932c..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0005-generated-go-emission-boundary/index.html +++ /dev/null @@ -1,51 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0005: Generated Go Emission Boundary - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0005: Generated Go Emission Boundary - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0005: Generated Go Emission Boundary - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0005: Generated Go Emission Boundary</h1></header><article class="prose"><h2 id="status">Status</h2><p>Accepted</p><h2 id="context">Context</h2><p>GOWDK compiles <code>.gwdk</code> files into Go app source and then compiles that source -into binaries. This is the right product direction for a Go web compiler, but -large raw string templates are a poor long-term implementation boundary for Go -developers. They are hard to refactor, easy to break syntactically, and do not -feel like ordinary Go code.</p><p>Current generated output behavior is tracked in -<code>docs/compiler/generated-output.md</code> and <code>docs/engineering/architecture.md</code>.</p><h2 id="decision">Decision</h2><p>Generated Go remains an implementation artifact for now, but generated packages -must stay small, formatted, inspectable, and validated before write.</p><p>All generated Go source must be emitted from Go ASTs. Generated packages should -be constructed with <code>go/ast</code>, printed with <code>go/printer</code>, and validated with -<code>go/format</code> before write. -Raw Go source strings may remain only as temporary migration input while being -converted to AST, or as non-Go artifact content such as HTML, CSS, JavaScript, -JSON, and markdown.</p><p>Generated Go must not be assembled through hardcoded line writing, token -concatenation, <code>strings.Builder</code>, <code>bytes.Buffer</code>, or repeated <code>WriteString</code> -calls. Any temporary exception must be documented at the call site, scoped to a -specific migration step, and removed when the surrounding generated Go file -moves to AST emission.</p><p>Feature-bound backend integration keeps the existing generated-app path, but -formats generated Go before writing it and fails generation if the source is not -valid Go. Future work should replace existing raw generated Go templates with -AST builders instead of adding new string-based Go emission.</p><p>Generated Go sits at the boundary between the GOWDK analyzer and the standard Go -toolchain:</p><pre><code class="language-text">GOWDK analyzer metadata - -&gt; generated Go go/ast - -&gt; go/printer - -&gt; go/format - -&gt; go build -</code></pre><h2 id="consequences">Consequences</h2><ul><li>GOWDK still ships generated Go app source and binaries.</li><li>Invalid generated source fails at generation time, before <code>go build</code> writes a -confusing compiler error against broken files.</li><li>Future compiler work should remove string-template Go emission instead of -merely wrapping it in formatter checks.</li><li>AST generation is the default for every new generated Go file, function, -import block, route registration, and adapter body.</li><li>Existing string-generated Go should be migrated incrementally by generated Go -file or route kind.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/index.html b/docs-site/dist/site/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/index.html deleted file mode 100644 index 1b51730c..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/index.html +++ /dev/null @@ -1,104 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0006: GOWDK Compiler And Runtime Boundary - GOWDK</title> - <meta name="description" content="Date: 2026-06-05"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0006: GOWDK Compiler And Runtime Boundary - GOWDK"> - <meta property="og:description" content="Date: 2026-06-05"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0006: GOWDK Compiler And Runtime Boundary - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-05"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0006: GOWDK Compiler And Runtime Boundary</h1><p class="doc-lead">Date: 2026-06-05</p></header><article class="prose"><p>Date: 2026-06-05</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>GOWDK needs to grow from an early <code>.gwdk</code> page/component compiler into a full -Go-first web app system. The product naming should make the split as clear as -Svelte and SvelteKit, but adapted for Go:</p><pre><code class="language-text">GOWDK Compiler -component/page compiler - + -GOWDK Runtime -app/runtime layer - = -Go-first full web app -</code></pre><p>The risk is creating competing models: one where <code>.gwdk</code> files own backend -behavior through custom action bodies, another where generated Go owns too much -application logic, and another where Go itself is forked or replaced. That -would weaken the product and make future implementation plans conflict.</p><h2 id="decision">Decision</h2><p>GOWDK is split into two named product layers:</p><pre><code class="language-text">GOWDK Compiler: - Parses and validates .gwdk package-peer files. - Compiles pages, layouts, components, build data, CSS, islands, manifests, - static output, and generated adapter source. - -GOWDK Runtime: - Provides routing, form decoding, response envelopes, action/API adapters, - partial fragments, CSRF, SSR addon contracts, embedded assets, and one-binary - app serving. -</code></pre><p>The repository and Go module can continue to ship both layers together for now. -This ADR is a product-language boundary, not an import-path rename.</p><p>The naming contract is:</p><table><thead><tr><th>Name</th><th>Meaning</th></tr></thead><tbody><tr><td>GOWDK</td><td>Product name and repository wordmark.</td></tr><tr><td>GOWDK Compiler</td><td>The <code>.gwdk</code> language/compiler layer: parser, AST, analyzer, IR, diagnostics, generated adapter source, build output, manifests, route metadata, asset metadata, formatter, and LSP.</td></tr><tr><td>GOWDK Runtime</td><td>The app/runtime layer: <code>runtime/</code>, <code>addons/</code>, generated <code>net/http</code> app serving, routing, request context, form decoding, response envelopes, actions, APIs, fragments, SSR hooks, embedded assets, contract runtime, and one-binary or split-binary wiring.</td></tr><tr><td><code>gowdk</code></td><td>The CLI binary, Go package name, module path segment, generated prefixes, and config filename prefix.</td></tr><tr><td>GOWDK app</td><td>A user application built by GOWDK Compiler and served through GOWDK Runtime.</td></tr><tr><td>addon</td><td>Optional feature-registration or integration package. Addons extend GOWDK Runtime or compiler behavior; they are not a third product layer.</td></tr></tbody></table><p>Do not use <code>GOWDK Kit</code> for the app/runtime layer. It is redundant because the -<code>K</code> in <code>GOWDK</code> already carries the kit idea, so <code>GOWDK Kit</code> reads as &#34;kit kit.&#34; -Use <code>GOWDK Runtime</code> when the app/runtime layer must be named.</p><p>Avoid bare <code>core</code> in product docs because it hides the layer boundary. Use -<code>compiler core</code>, <code>runtime core</code>, or <code>repository core</code> when the distinction -matters. -Avoid creating public names such as <code>GOWDK World</code>, <code>GOWDK Core</code>, or <code>GOWDK Framework</code> unless a later ADR accepts that rename.</p><p>The compiler has two input lanes:</p><pre><code class="language-text">.gwdk file - -&gt; GOWDK parser - -&gt; GOWDK AST - -&gt; GOWDK analyzer - -&gt; generated normal Go code - -&gt; go/format - -&gt; go build -</code></pre><pre><code class="language-text">.go files - -&gt; standard go/parser - -&gt; standard go/ast - -&gt; standard go/types - -&gt; validate exported handlers/types -</code></pre><p>The GOWDK AST is for <code>.gwdk</code> language structure. Standard Go AST is for normal -Go source and generated Go source. The two models meet through analyzer output: -normalized route, component, package, type, and handler binding metadata.</p><p>GOWDK will not fork the Go compiler for the current roadmap. User application -logic stays in normal Go code. ADR 0009 amends the authoring boundary: separate -<code>.go</code> files remain supported, and future optional inline Go in <code>.gwdk</code> must -extract to normal importable, testable package Go. <code>.gwdk</code> is the custom -compiler surface that connects markup, routes, components, build-time data, and -runtime bindings to normal Go code.</p><p>The package-integrated direction is:</p><pre><code class="language-gwdk">package auth - -route &#34;/&#34; -guard public - -act Login POST &#34;/&#34; -api Session GET &#34;/api/session&#34; - -view { - &lt;form g:post={Login}&gt; - &lt;input name=&#34;email&#34; /&gt; - &lt;button&gt;Sign in&lt;/button&gt; - &lt;/form&gt; -} -</code></pre><p>The matching behavior is normal Go:</p><pre><code class="language-go">package auth - -func Login(ctx context.Context, input LoginInput) (response.Response, error) { - return response.RedirectTo(&#34;/dashboard&#34;), nil -} -</code></pre><p>Generated Go remains adapter glue. It may decode requests, call user handlers, -wire runtime contracts, and package assets, but it must not generate user -domain logic, handlers, stores, auth, validation policy, or storage code.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>GOWDK can become a full app framework without losing Go toolchain -compatibility.</li><li><code>go test</code>, <code>go build</code>, Go modules, editors, and deployment stay standard.</li><li><code>.gwdk</code> can be more ergonomic than raw Go where web UI needs a compiler.</li><li>Backend behavior stays inspectable and user-owned.</li><li>Planning docs have a clear boundary for compiler work versus runtime -work.</li></ul><h3 id="negative">Negative</h3><ul><li><code>.gwdk</code> is a real language surface and must carry migration diagnostics.</li><li>Package-aware <code>.gwdk</code> parsing touches parser, compiler, docs, examples, LSP, -and test fixtures together.</li><li>Runtime contracts must be designed carefully so generated adapters stay small.</li></ul><h3 id="neutral">Neutral</h3><ul><li>Go can still be improved around GOWDK through generated adapters, package -conventions, typed helpers, and compiler diagnostics.</li><li>A future custom Go compiler or source preprocessor is not ruled out forever, -but it is not part of the current roadmap.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Fork or customize the Go compiler now. Rejected because it would break too -much tooling before the product model is stable.</li><li>Keep backend behavior inside non-Go <code>.gwdk act {}</code> bodies. Rejected because -it creates a second backend language and conflicts with normal Go ownership. -Optional inline Go authoring is allowed by ADR 0009 only when extracted code -remains ordinary Go.</li><li>Generate user backend code. Rejected because it makes the framework own -application logic and creates trust/debugging problems.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Keep <code>docs/product/roadmap.md</code> as the active product direction.</li><li>Keep <code>docs/engineering/architecture.md</code> as the implementation boundary -source of truth.</li><li>Keep server fragments in runtime responses, not old action body syntax.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0007-static-first-spa-navigation/index.html b/docs-site/dist/site/docs/engineering/decisions/0007-static-first-spa-navigation/index.html deleted file mode 100644 index 7b1b1636..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0007-static-first-spa-navigation/index.html +++ /dev/null @@ -1,39 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0007: Static-First SPA Navigation - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0007: Static-First SPA Navigation - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0007: Static-First SPA Navigation - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0007: Static-First SPA Navigation</h1></header><article class="prose"><h2 id="status">Status</h2><p>Accepted</p><h2 id="context">Context</h2><p>GOWDK defaults full pages to SPA/build-time output, but that must not turn the -framework into a browser-owned application shell. Generated JavaScript can make -navigation and forms feel smoother, but the Go compiler, generated Go runtime, -and user Go packages must remain the source of truth for route existence, -backend behavior, security, and request-time policy.</p><h2 id="decision">Decision</h2><p>SPA means static-first pages with optional client navigation enhancement.</p><p>Every generated SPA route must be a real URL with a concrete HTML artifact or -runtime-served file candidate that works on direct open, browser refresh, and -non-JavaScript clients. Generated JavaScript may intercept internal links only -as an enhancement after those URLs already exist.</p><p>Generated JavaScript may enhance:</p><ul><li>internal-link navigation between generated SPA page artifacts;</li><li>fetching built page shells or server fragments;</li><li>swapping the visible page region;</li><li>preserving scroll and focus where possible;</li><li>prefetching static route assets;</li><li>showing loading and error UI;</li><li>progressively enhancing action forms and partial fragment swaps.</li></ul><p>Generated JavaScript must not own:</p><ul><li>route existence;</li><li>authentication or authorization decisions;</li><li>business rules;</li><li>database access or persistence;</li><li>trusted server validation;</li><li>action behavior;</li><li>global application state;</li><li>page loading policy;</li><li>cache or revalidation policy.</li></ul><p>Action forms must remain progressively enhanced. A supported generated form -should degrade to a normal HTTP POST where possible; generated JavaScript may -add partial request headers, swap fragments, and restore focus, but it must not -be required for the server to know what the action means.</p><p><code>client {}</code> remains for local component/UI behavior such as toggles, tabs, -counters, focus, small filters, and visual state. It is not a general -application logic runtime and must not become the place where routes, -authorization, persistence, or trusted validation live.</p><h2 id="consequences">Consequences</h2><ul><li>GOWDK can add SPA navigation without becoming a client-owned framework.</li><li>Generated page files and the generated Go runtime continue to define route -availability.</li><li>User Go handlers continue to own auth, validation, storage, business rules, -and action/API behavior.</li><li>Future navigation work must prove direct URL and refresh behavior before -adding interception, prefetching, or page-region swapping.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0008-bounded-client-language/index.html b/docs-site/dist/site/docs/engineering/decisions/0008-bounded-client-language/index.html deleted file mode 100644 index 53b7cb9d..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0008-bounded-client-language/index.html +++ /dev/null @@ -1,50 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0008: Bounded Client Language - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0008: Bounded Client Language - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0008: Bounded Client Language - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0008: Bounded Client Language</h1></header><article class="prose"><h2 id="status">Status</h2><p>Accepted</p><h2 id="context">Context</h2><p>GOWDK needs browser-side behavior for local UI state, progressive form -enhancement, partial updates, and explicit islands. The risk is letting that -browser behavior become a second application runtime that owns routes, auth, -business rules, data loading, or trusted validation.</p><p>External JavaScript framework reactivity models are useful comparison points, -but GOWDK&#39;s product direction is Go-first and compile-first. The client -language must stay small enough for the compiler to parse, type-check, format, -generate, and explain.</p><h2 id="decision">Decision</h2><p><code>client {}</code> is a bounded GOWDK language for local component and page-enhancement -behavior. It is not arbitrary JavaScript and it is not a route, auth, database, -business-rule, or server-validation layer.</p><p>Supported client behavior should grow through explicit compiler-owned syntax:</p><ul><li>typed handlers and helper functions;</li><li>scalar expression evaluation;</li><li>computed values with dependency ordering and cycle diagnostics;</li><li>lifecycle hooks and effect cleanup;</li><li>DOM refs with a small safe method set;</li><li>local bindings, class/style toggles, conditionals, and keyed lists;</li><li>compiler-owned async helpers when their ordering and failure behavior is -documented.</li></ul><p>Page stores are page-scoped UI state. They can be initialized from normal Go -types/functions and used by components that explicitly declare <code>client { use storeName }</code> or a qualified GOWDK source alias. They are browser enhancement -state, not global application authority.</p><p>Generated JavaScript may update local island state, page stores, text, -attributes, classes, styles, list rows, partial responses, and SPA navigation -enhancements. It must not own route existence, auth, business rules, database -access, trusted server validation, action behavior, global application state, -loading policy, or cache policy.</p><p>Cross-package stores are allowed only through explicit GOWDK <code>use</code> aliases and -validated store names. App-global stores, implicit store lookup, and -cross-route persistence are deferred.</p><p>Async client handlers are allowed only through compiler-owned async functions -and helpers, such as validated <code>await fetchJSON[...]</code>. Async functions cannot -return values. Await is rejected outside async handlers. The generated runtime -must preserve deterministic update ordering: handler statements run in source -order, awaited assignments resume in source order for that handler, computed -values update after state changes, and DOM bindings update after computed -values settle.</p><h2 id="consequences">Consequences</h2><ul><li>GOWDK can add richer browser behavior without making JavaScript the app -contract.</li><li>Client-language syntax needs explicit parser, type-checker, formatter, LSP, -and generated-runtime support before it is documented as stable.</li><li>Stores can support shared island UI state while preserving Go/server -authority for trusted behavior.</li><li>Future broad reactivity features need ADR-level scrutiny if they would change -these ownership boundaries.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0009-optional-inline-go-authoring/index.html b/docs-site/dist/site/docs/engineering/decisions/0009-optional-inline-go-authoring/index.html deleted file mode 100644 index b3995dd7..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0009-optional-inline-go-authoring/index.html +++ /dev/null @@ -1,51 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0009: Optional Inline Go Authoring - GOWDK</title> - <meta name="description" content="Date: 2026-06-07"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0009: Optional Inline Go Authoring - GOWDK"> - <meta property="og:description" content="Date: 2026-06-07"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0009: Optional Inline Go Authoring - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-07"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0009: Optional Inline Go Authoring</h1><p class="doc-lead">Date: 2026-06-07</p></header><article class="prose"><p>Date: 2026-06-07</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>GOWDK currently keeps real application behavior in normal Go packages while -<code>.gwdk</code> files own routes, rendering declarations, markup, CSS, endpoint -metadata, and bounded compiler-owned client behavior.</p><p>This boundary keeps the Go toolchain intact, but it also makes GOWDK feel less -integrated than component frameworks where the author can keep related page -logic and markup in one file. Users should be able to choose that colocated -authoring style without turning <code>.gwdk</code> into a second non-Go backend language.</p><h2 id="decision">Decision</h2><p>GOWDK will support optional inline Go authoring in <code>.gwdk</code> files as planned -language surface.</p><p>Inline Go must remain real Go:</p><ul><li>it is optional; separate <code>.go</code> files remain the default and supported path;</li><li>it must be parsed and type-checked with the standard Go toolchain after -extraction or lowering;</li><li>extracted code must become normal importable package code in the declaring -<code>.gwdk</code> package;</li><li>generated adapter code still calls exported Go symbols and must not own user -domain logic;</li><li>inline Go must not create a custom Go dialect, relaxed Go syntax, or hidden -runtime-only behavior;</li><li>the emitted or extracted Go must be inspectable, formatted, and testable.</li></ul><p>The first stable design should prefer a small explicit block form rather than -implicit script sections. Exact syntax remains planned and must be specified -before implementation.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>Users can colocate page/component-specific Go code with <code>.gwdk</code> markup when -that improves ergonomics.</li><li>GOWDK keeps Go as the programming language instead of inventing a backend -scripting language.</li><li>Inline-authored logic can still participate in normal package imports, -handler binding, build-time data calls, tests, and generated adapters.</li></ul><h3 id="negative">Negative</h3><ul><li>The compiler must own extraction, source mapping, diagnostics, formatting, -and conflict handling for inline Go.</li><li>Inline Go can make <code>.gwdk</code> files larger, so docs and tooling need clear -guidance on when separate Go files are better.</li><li>Generated or extracted files must avoid confusing users about what source of -truth to edit.</li></ul><h3 id="neutral">Neutral</h3><ul><li>This changes the authoring surface, not the runtime ownership model.</li><li>The generated adapter boundary from ADR 0005 still applies.</li><li>The compiler/runtime boundary from ADR 0006 is amended: behavior stays in -normal Go code, but that Go code may be authored inline in <code>.gwdk</code> once the -planned extraction pipeline exists.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Keep all application logic in separate <code>.go</code> files forever. Rejected because -it blocks an ergonomic colocated authoring option.</li><li>Allow arbitrary non-Go script logic in <code>.gwdk</code>. Rejected because it creates a -second application language and weakens Go toolchain compatibility.</li><li>Generate user behavior from declarations. Rejected because generated adapters -should remain glue and user behavior should stay user-owned.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Write a feature spec for inline Go block syntax, extraction, source maps, -package conflicts, formatting, tests, and generated output layout.</li><li>Update language docs when syntax exists.</li><li>Add diagnostics that explain whether a symbol came from a <code>.go</code> file, -extracted inline Go, or generated adapter code.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/index.html b/docs-site/dist/site/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/index.html deleted file mode 100644 index 3d93a5f6..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/index.html +++ /dev/null @@ -1,115 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0010: Tokenizer and Recursive-Descent Parser Direction - GOWDK</title> - <meta name="description" content="Date: 2026-06-11"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0010: Tokenizer and Recursive-Descent Parser Direction - GOWDK"> - <meta property="og:description" content="Date: 2026-06-11"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0010: Tokenizer and Recursive-Descent Parser Direction - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-11"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0010: Tokenizer and Recursive-Descent Parser Direction</h1><p class="doc-lead">Date: 2026-06-11</p></header><article class="prose"><p>Date: 2026-06-11</p><h2 id="status">Status</h2><p>Accepted</p><p>Implemented on 2026-06-12. <code>internal/syntax</code> owns the shared tokenizer, -<code>internal/parser.ParseSyntax</code> consumes the shared token rules behind the -<code>gwdkast.File</code> seam, page/component/layout entry points lower that AST into -<code>gwdkir</code>, parser diagnostics accumulate across declaration and block boundaries, -and the former <code>internal/parser</code><code>lexLine</code> path has been removed.</p><h2 id="context">Context</h2><p>The compiler front-end is line-oriented. <code>internal/parser.ParseSyntax</code> reads -source with a <code>bufio.Scanner</code>, matches patterns against each trimmed line -(<code>internal/parser/patterns.go</code><code>lexLine</code>), tracks nesting with a separate stateful -brace scanner (<code>internal/parser/braces.go</code>), and returns on the first syntax -error with no recovery. Source positions are 1-based line/column with no byte -offset, so many spans are line-wide approximations (<code>sourceLineSpan</code>). The -formatter (<code>internal/lang/format.go</code>) is independent whitespace-only string -manipulation that counts braces without skipping strings or comments.</p><p>This single foundation is the upstream constraint behind most of the deferred -parser/formatter/diagnostics work (#250): error recovery, an AST-backed -formatter, exact token spans, and granular per-construct diagnostic codes are all -downstream of having a real token stream and a node-producing parser. Right now -the line-oriented parser is deferred by omission rather than by an explicit -decision.</p><p>Two facts make the direction clear rather than open-ended:</p><ol><li>The documented target pipeline (<code>docs/compiler/pipeline.md</code>) already names a -<code>lex/parse full AST -&gt; semantic analysis -&gt; stable internal IR</code> front-end. -This ADR makes explicit the parser-internals decision that target already -implies.</li><li>A real character-level tokenizer already exists. <code>internal/lang.Lex</code> -(<code>internal/lang/lexer.go</code>) scans runes into typed tokens with line/column -positions, but only editor and CLI tooling consume it. The compiler parser -ignores it and re-lexes per line. The codebase therefore maintains two -divergent front-ends for the same language.</li></ol><p>Crucially, the typed AST is already a stable seam. <code>internal/parser.ParseSyntax</code> -produces the <code>internal/gwdkast</code> AST, and every downstream pass -(<code>internal/gwdkanalysis</code> lowering to <code>internal/gwdkir.Program</code>, validation, and -generation) consumes that AST. The parser can be replaced behind that seam -without disturbing IR, validation, reports, or codegen.</p><h2 id="decision">Decision</h2><p>Commit to a single shared tokenizer and a recursive-descent parser with error -recovery, producing the existing <code>internal/gwdkast</code> AST. Migrate incrementally -behind the AST seam.</p><p>Concretely:</p><ul><li><strong>One tokenizer.</strong> Promote the <code>internal/lang</code> rune scanner into the shared -lexer that both the compiler parser and editor/CLI tooling consume. Retire the -per-line <code>lexLine</code> path in <code>internal/parser</code>. There is one lexical definition -of <code>.gwdk</code>, not two.</li><li><strong>Recursive-descent parser over tokens.</strong> Parse the token stream into -<code>gwdkast.File</code> with explicit declaration, block, and view productions instead -of line-pattern matching. The brace scanner&#39;s string/comment/template state -becomes ordinary lexer state rather than a separate counter.</li><li><strong>Custom grammar for <code>.gwdk</code>, the real Go parser for embedded Go.</strong> The -recursive-descent parser owns only the framework grammar — package, imports, -uses, metadata, blocks, view markup, contracts, and endpoints. Wherever a -construct embeds Go — <code>go {}</code>/<code>client {}</code> block bodies and the <code>pkg.Type</code> / -<code>pkg.NewFn()</code> references in <code>store</code>/<code>props</code>/<code>state</code> contracts — the parser -delegates to <code>go/parser</code> (<code>go/ast</code>) on the extracted source span rather than -re-implementing Go lexing or parsing. The framework tokenizer only locates the -boundaries (e.g. the <code>=</code> separating a contract type from its initializer); the -Go operands are handed to the Go parser, which is then constrained to the -shapes the language accepts (a single <code>pkg.Name</code> selector, a zero-argument -constructor call). This keeps one definition of Go syntax — the Go toolchain&#39;s -— and means generics, multi-segment selectors, and call arguments are -recognized and accepted or rejected by Go&#39;s own grammar, not a hand-rolled -approximation.</li><li><strong>Error recovery.</strong> The parser synchronizes at top-level declaration -boundaries and block braces so one syntax error does not hide the rest of the -file. It accumulates diagnostics instead of returning on the first error.</li><li><strong>Exact spans.</strong> Tokens carry byte offsets (ADR depends on #294), so AST nodes -and diagnostics get exact token ranges instead of line-wide approximations.</li><li><strong>AST is the frozen seam.</strong><code>internal/gwdkast.File</code> is the contract. The new -parser must produce the same AST as the line-oriented parser for the currently -supported subset; <code>gwdkanalysis</code>, <code>gwdkir</code>, validation, reports, and codegen do -not change as part of this work.</li><li><strong>Formatter follows.</strong> Once the parser yields full nodes, the AST-backed -formatter deferred in #250 becomes possible and replaces line-oriented -<code>format.go</code>. Until then, the line-oriented formatter keeps its documented -limits (see #296).</li></ul><p>Migration is incremental and non-breaking. The line-oriented parser keeps working -while the new parser is built to produce identical <code>gwdkast.File</code> output for the -supported subset, gated by golden AST-equivalence tests and the language -conformance corpus (#295). Cutover happens per declaration kind once equivalence -holds, then the line-oriented path and <code>lexLine</code> are removed.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>One lexical and grammatical definition of <code>.gwdk</code> shared by the compiler and -the language server, instead of a line parser plus a separate tooling lexer.</li><li>Error recovery, exact spans, AST-backed formatting, and granular diagnostic -codes become reachable; #250 stops being blocked by the front-end.</li><li>Diagnostics point at tokens rather than whole lines, improving CLI output and -LSP precision.</li><li>Braces inside strings, comments, and template literals are handled by lexer -state, removing a class of parser and formatter miscounts by construction.</li></ul><h3 id="negative">Negative</h3><ul><li>A recursive-descent parser plus recovery is materially more code than the -current line parser, and the migration must preserve AST output exactly to stay -non-breaking.</li><li>Equivalence testing across every declaration kind is required before cutover; -this is real up-front cost before any user-visible benefit lands.</li><li>Recovery and span precision depend on byte offsets (#294) landing first.</li></ul><h3 id="neutral">Neutral</h3><ul><li>The public language surface does not change. This is a front-end -implementation decision, not a grammar change; the conformance corpus (#295) -pins behavior across the migration.</li><li>Downstream passes are untouched because the AST seam is stable.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li><strong>Keep the line-oriented parser, document its limits.</strong> Lowest cost, but -permanently caps span precision, error recovery, and AST-backed formatting, and -keeps two divergent front-ends. Rejected: it contradicts the already-documented -target pipeline and leaves #250 structurally blocked.</li><li><strong>Adopt a parser generator or third-party combinator library</strong> (ANTLR, -participle, goyacc). Rejected: adds a dependency and a generated/runtime layer -against the project&#39;s lean-dependency stance, and a hand-written -recursive-descent parser gives better control over recovery and diagnostics for -a small surface language.</li><li><strong>Incremental/streaming parser from day one.</strong> Useful for an editor, but -premature. The AST seam lets an incremental layer be added later without -another front-end decision.</li><li><strong>Hand-roll Go lexing/parsing for embedded Go.</strong> Re-implementing qualified -identifiers, call expressions, and (eventually) type expressions inside the -<code>.gwdk</code> tokenizer would duplicate a moving target and drift from <code>go/build</code> -semantics. Rejected: <code>go/parser</code> already parses Go exactly, so embedded Go is -delegated to it and only the framework-level boundaries are tokenized here.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>#294 (byte offsets in source positions) is the prerequisite; land it first.</li><li>Build the shared tokenizer by promoting <code>internal/lang</code>&#39;s scanner; retire -<code>internal/parser</code><code>lexLine</code>.</li><li>Build the recursive-descent parser to <code>gwdkast.File</code> with recovery, gated by -golden AST-equivalence tests and the conformance corpus (#295).</li><li>Cut over per declaration kind; remove the line-oriented parser when equivalence -holds across the supported subset.</li><li>AST-backed formatter and granular per-construct diagnostic codes (#250) consume -the new parser; #296 is the interim formatter guard.</li><li>Link this ADR from the #250 deferral so the line-oriented limitation is a -conscious choice with a committed exit.</li><li>Keep <code>docs/compiler/pipeline.md</code> and <code>docs/engineering/architecture.md</code> aligned -as the migration proceeds.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0011-auth-addon-cryptography/index.html b/docs-site/dist/site/docs/engineering/decisions/0011-auth-addon-cryptography/index.html deleted file mode 100644 index 1ce406e2..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0011-auth-addon-cryptography/index.html +++ /dev/null @@ -1,57 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0011: Auth Addon Cryptography Stance - GOWDK</title> - <meta name="description" content="Date: 2026-06-15"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0011: Auth Addon Cryptography Stance - GOWDK"> - <meta property="og:description" content="Date: 2026-06-15"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0011: Auth Addon Cryptography Stance - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-15"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0011: Auth Addon Cryptography Stance</h1><p class="doc-lead">Date: 2026-06-15</p></header><article class="prose"><p>Date: 2026-06-15</p><h2 id="status">Status</h2><p>Accepted</p><h2 id="context">Context</h2><p><code>addons/auth</code> is an experimental 0.x convenience addon for common authentication -plumbing: password hashing, signed session cookies, and native RBAC guard -providers. The repository dependency policy says to prefer maintained libraries -for cryptography while keeping production dependencies minimal and optional -integrations isolated.</p><p>The root module already targets Go 1.26.4. That standard library includes -<code>crypto/pbkdf2</code>, so the addon can use a maintained PBKDF2 implementation without -adding <code>golang.org/x/crypto</code> to the root module graph.</p><p>The addon must also avoid implying that GOWDK owns a complete authentication -system. Applications still own user lookup, credential lifecycle, MFA, OAuth, -account recovery, durable session storage, tenant policy, and backend resource -authorization.</p><h2 id="decision">Decision</h2><p>Keep the auth addon default dependency-free in the root module and implement the -default password hasher with Go&#39;s standard-library <code>crypto/pbkdf2</code> using -HMAC-SHA256.</p><p>Expose a small <code>PasswordHasher</code> interface and <code>PBKDF2Hasher</code> implementation so -applications can replace the default with bcrypt, Argon2, a password-hashing -service, or another app-owned policy without changing generated GOWDK route -contracts.</p><p>Do not add <code>golang.org/x/crypto</code> to the root module for this default. If a -future addon needs Argon2 or bcrypt helpers, package that as an optional or -nested dependency boundary and document the tradeoff separately.</p><p>Session signing secrets must fail closed: the auth addon requires at least -32 bytes of secret material, can read that secret from a named environment -variable, and reports only the variable name or structural requirement in -errors.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>The default password hashing path uses a maintained standard-library PBKDF2 -implementation and adds no production dependency.</li><li>Root module dependency surface stays small.</li><li>Applications with stronger or organization-specific password policy have an -explicit replacement point.</li><li>Session secret failures are clear without exposing secret values.</li></ul><h3 id="negative">Negative</h3><ul><li>PBKDF2-HMAC-SHA256 is a conservative default, not a modern memory-hard -password hashing recommendation.</li><li>Applications that require bcrypt or Argon2 must provide or import their own -hasher for now.</li></ul><h3 id="neutral">Neutral</h3><ul><li>The auth addon remains experimental 0.x behavior.</li><li>GOWDK still does not own user stores, OAuth, MFA, durable sessions, or -resource authorization.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Add <code>golang.org/x/crypto</code> to the root module and switch the default to an -x/crypto implementation. Rejected for the current default because Go 1.26.4 -already provides maintained PBKDF2 in the standard library and the root module -should avoid unnecessary production dependencies.</li><li>Keep the hand-rolled PBKDF2 loop. Rejected because the standard library now -provides this primitive.</li><li>Make Argon2 or bcrypt the built-in default. Deferred because those choices -need a dependency and parameter policy that is better isolated as an optional -package or app-owned hasher.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Keep PBKDF2 default tests pinned with a known vector.</li><li>Document the <code>PasswordHasher</code> replacement point in the addons reference.</li><li>If GOWDK ships bcrypt or Argon2 helpers later, place them behind an optional -dependency boundary and add a new ADR or update this one.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0012-realtime-subscribe-surface/index.html b/docs-site/dist/site/docs/engineering/decisions/0012-realtime-subscribe-surface/index.html deleted file mode 100644 index c14433cd..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0012-realtime-subscribe-surface/index.html +++ /dev/null @@ -1,68 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0012: Realtime Subscribe Surface - GOWDK</title> - <meta name="description" content="Date: 2026-06-15"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0012: Realtime Subscribe Surface - GOWDK"> - <meta property="og:description" content="Date: 2026-06-15"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0012: Realtime Subscribe Surface - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-15"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0012: Realtime Subscribe Surface</h1><p class="doc-lead">Date: 2026-06-15</p></header><article class="prose"><p>Date: 2026-06-15</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>M14 adds realtime reactivity on top of the M13 presentation-event fanout -boundary. The source contract needs to say which browser DOM regions can listen -for presentation events before generated fanout codegen, client patching, -reconnect behavior, or examples are implemented.</p><p>Existing constraints:</p><ul><li>Presentation events are the only browser-facing event category.</li><li>Domain and integration events stay backend-owned facts.</li><li>Generated JavaScript can enhance static-first pages, but it must not own -routes, auth, trusted validation, business rules, page loading policy, or -cache policy.</li><li><code>client {}</code> is local UI behavior, not a general app data runtime.</li><li>Query references already define bounded, compiler-owned data regions through -<code>g:query</code>.</li></ul><p>Issue #147 proposed compiler-derived event-to-query invalidation. M14 keeps the -template contract explicit and adds a Go-owned invalidation graph instead of -letting templates name domain events directly.</p><h2 id="decision">Decision</h2><p>GOWDK accepts explicit view-level subscriptions through:</p><pre><code class="language-gwdk">&lt;section g:query=&#34;patients.GetPatientPage&#34; g:subscribe=&#34;patients.PatientNotice&#34;&gt; - ... -&lt;/section&gt; -</code></pre><p>Rules:</p><ul><li><code>g:subscribe</code> names a package-qualified Go presentation-event contract.</li><li><code>g:subscribe</code> is valid only on an element that also declares <code>g:query</code>.</li><li>The compiler lowers each subscription into IR with owner, query, event, import -alias/path, event type, source file, and source span.</li><li>The compiler validates subscriptions against scanned runtime contract -registrations.</li><li>The referenced contract must be a <code>runtime/contracts</code> event registration with -<code>PresentationEvent</code> category.</li><li>The registration must be available to the generated web role, or unrestricted.</li><li>The project must enable <code>realtime.Addon()</code> before subscriptions are accepted.</li></ul><p>GOWDK also accepts explicit Go invalidation registrations:</p><pre><code class="language-go">contracts.RegisterInvalidation[PatientCreated, GetPatientPage](registry) -</code></pre><p>Rules:</p><ul><li><code>RegisterInvalidation[event, query]</code> says a domain event type invalidates a -query type.</li><li>The compiler scans invalidation registrations beside normal contract -registrations.</li><li>The scanner rejects edges that name an unknown query, an unknown domain event, -or a domain event no scanned command emits.</li><li>The compiler joins invalidation edges to <code>g:query</code> references and records the -joined graph in <code>Program.QueryInvalidations</code>, <code>gowdk-build-report.json</code>, and -<code>gowdk graph</code>.</li><li>Generated apps send a <code>gowdk.query.invalidate</code> presentation event after -command event dispatch for affected domain events.</li><li>Generated <code>gowdk.js</code> refetches the current document and swaps only matching -non-subscribed <code>data-gowdk-query-type</code> regions. Regions with <code>g:subscribe</code> -remain owned by explicit presentation patches.</li></ul><p>This ADR does not make <code>client {}</code> a subscription language and does not let -templates reference domain or integration events directly.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>The source contract is explicit and inspectable.</li><li>The target DOM region is bounded by an existing query-owned element.</li><li>Diagnostics can point at the exact subscription attribute.</li><li>Server fanout and client patch-loop work can consume one IR shape.</li></ul><h3 id="negative">Negative</h3><ul><li>Authors must name each presentation event or invalidation edge explicitly.</li><li>Query invalidation performs a document refetch instead of payload diffing.</li><li>Subscribed regions and invalidated regions have separate update ownership.</li></ul><h3 id="neutral">Neutral</h3><ul><li>Generated HTML may expose compiler-owned <code>data-gowdk-*</code> markers for later -runtime binding.</li><li>Generated HTML may expose validated <code>data-gowdk-query-type</code> markers for exact -invalidation matching.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Extend <code>client {}</code> with subscription statements. Rejected for M14 because it -would mix server-state invalidation with local UI behavior and expand the -bounded client language before the server/client ownership contract is ready.</li><li>Infer invalidation from handler bodies. Rejected because it would make -backend data policy implicit and brittle.</li><li>Allow templates to subscribe to domain or integration events directly. -Rejected because those categories are backend-owned facts and must not become -browser-facing input.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>#130: lower <code>g:subscribe</code> to IR and validate presentation-event bindings. -Implemented with exact-span diagnostics for missing, invalid, non-web-role, -non-presentation, and missing-addon references.</li><li>#131: generate server fanout registration using subscription IR. Implemented -as generated subscription-filtered SSE fanout.</li><li>#132: implement compiler-owned client patch/refresh loop. Implemented for -explicit <code>replaceHTML</code> patches on subscribed query regions.</li><li>#133: define reconnect, backpressure, and guard-gated stream behavior. -One-second SSE retry hints, drop-on-full client buffers, and guard rejection -before stream open are implemented; active session-change stream revocation -remains follow-up work.</li><li>#134: add live-updating examples and docs. Implemented in -<code>examples/contracts</code>.</li><li>#147: compiler-derived event-to-query invalidation. Implemented through -explicit <code>RegisterInvalidation[event, query]</code> scan metadata, build-report and -graph output, generated <code>gowdk.query.invalidate</code> presentation events, and -query-region document refetch.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0013-built-in-tracing-observability/index.html b/docs-site/dist/site/docs/engineering/decisions/0013-built-in-tracing-observability/index.html deleted file mode 100644 index a26de649..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0013-built-in-tracing-observability/index.html +++ /dev/null @@ -1,41 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0013: Built-In Tracing Observability - GOWDK</title> - <meta name="description" content="Date: 2026-06-15"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0013: Built-In Tracing Observability - GOWDK"> - <meta property="og:description" content="Date: 2026-06-15"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0013: Built-In Tracing Observability - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-15"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0013: Built-In Tracing Observability</h1><p class="doc-lead">Date: 2026-06-15</p></header><article class="prose"><p>Date: 2026-06-15</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>GOWDK Runtime needs trace IDs, spans, and local trace inspection across -generated routes, contracts, jobs, workers, islands, and future dev tooling. -The first phase must be usable from plain Go and must not force OpenTelemetry, -Sentry, or a hosted collector into the root module.</p><p>Repository constraints:</p><ul><li>Runtime core stays dependency-light and standard-library first.</li><li>Optional integrations should live in nested modules or addons when they add -third-party dependencies.</li><li>Generated JavaScript and generated Go should consume stable runtime contracts, -not own observability policy.</li><li>Trace context should interoperate with standard HTTP infrastructure.</li></ul><h2 id="decision">Decision</h2><p>GOWDK accepts a dependency-free <code>runtime/trace</code> package as the core tracing -boundary.</p><p>Rules:</p><ul><li>Trace identity uses W3C Trace Context <code>traceparent</code> IDs.</li><li>The core package exposes <code>TraceID</code>, <code>SpanID</code>, <code>Tracer</code>, <code>Span</code>, <code>Sampler</code>, -<code>Sink</code>, and context propagation helpers.</li><li>Span metadata uses explicit GOWDK surfaces (<code>backend</code>, <code>frontend</code>, <code>worker</code>) -and lanes (<code>route</code>, <code>guard</code>, <code>handler</code>, <code>ssr</code>, <code>action</code>, <code>api</code>, <code>fragment</code>, -<code>contract</code>, <code>job</code>, <code>island</code>, <code>nav</code>, <code>user</code>).</li><li>The root package includes only dependency-free sinks: console, JSON Lines, -in-memory ring, multi-sink, exporter adapter, and an in-process collector -handler for JSON/SSE local inspection.</li><li>OpenTelemetry compatibility is represented by semantic-convention attribute -keys and an OTLP-like exporter interface/value shape. Concrete OTLP -transports must remain optional and outside the root dependency graph.</li><li>Generated app auto-instrumentation consumes this runtime API rather than -creating a parallel tracing model.</li></ul><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>Plain Go applications can use the same trace API as future generated apps.</li><li>The root module dependency graph remains unchanged.</li><li>Trace propagation interoperates through standard <code>traceparent</code> headers.</li><li>The collector gives local visibility without requiring a separate service.</li></ul><h3 id="negative">Negative</h3><ul><li>The first slice does not send data to hosted observability systems.</li><li>The in-memory collector is process-local and loses traces on restart.</li><li>Generated app wiring still needs a later integration phase.</li></ul><h3 id="neutral">Neutral</h3><ul><li>Concrete OpenTelemetry export can be added later as a nested optional module.</li><li>Trace names and attribute keys can be shared by compiler/runtime code without -adopting an external SDK in core.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0014-addon-runtime-config-split/index.html b/docs-site/dist/site/docs/engineering/decisions/0014-addon-runtime-config-split/index.html deleted file mode 100644 index 603be5a3..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0014-addon-runtime-config-split/index.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0014: Addon Runtime Config Split - GOWDK</title> - <meta name="description" content="Date: 2026-06-16"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0014: Addon Runtime Config Split - GOWDK"> - <meta property="og:description" content="Date: 2026-06-16"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0014: Addon Runtime Config Split - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-16"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0014: Addon Runtime Config Split</h1><p class="doc-lead">Date: 2026-06-16</p></header><article class="prose"><p>Date: 2026-06-16</p><p>Status: Proposed</p><h2 id="context">Context</h2><p>Built-in addon packages used to combine build-time registration with -request-time runtime helpers. The registration face (<code>Addon()</code> and <code>ImportPath</code>) -imports the root <code>gowdk</code> config package. When generated apps imported helpers -from <code>addons/&lt;name&gt;</code>, the shipped app also linked the root build-time config -package through that addon.</p><p>The root package is small today, but this dependency direction violates the -compiler/runtime boundary and makes future config growth leak into generated -binaries.</p><h2 id="decision">Decision</h2><p>Request-time helper code belongs under <code>runtime/&lt;name&gt;</code>. The build-time addon -package remains the config-facing package.</p><table><thead><tr><th>Addon package</th><th>Runtime package</th><th>Runtime role</th></tr></thead><tbody><tr><td><code>addons/actions</code></td><td><code>runtime/actions</code></td><td>CSRF, action registry, form decoding, required validation</td></tr><tr><td><code>addons/api</code></td><td><code>runtime/api</code></td><td>JSON request helpers, query helpers, API responses</td></tr><tr><td><code>addons/partial</code></td><td><code>runtime/partial</code></td><td>Fragment and swap helpers, client hook constants</td></tr><tr><td><code>addons/ratelimit</code></td><td><code>runtime/ratelimit</code></td><td>Limiter, stores, middleware, Redis-store adapter interface</td></tr><tr><td><code>addons/realtime</code></td><td><code>runtime/realtime</code></td><td>Presentation fanout aliases and dependency-free SSE helpers</td></tr><tr><td><code>addons/ssr</code></td><td><code>runtime/ssr</code></td><td>Load context, redirects, layouts, guards, region rendering</td></tr></tbody></table><p>Generated app source imports the runtime packages. Existing user imports of the -addon packages remain source-compatible through aliases while users migrate to -runtime helper imports.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>Generated apps no longer import request-time helpers through addon packages -that also import the root config package.</li><li>New request-time code has a clear home under <code>runtime/</code>.</li><li>The existing <code>runtime/auth</code> and <code>runtime/contracts</code> pattern becomes the -repository rule for request-time helpers.</li></ul><h3 id="negative">Negative</h3><ul><li>Preferred helper import paths changed, so docs and examples need migration -notes even though compatibility re-exports remain.</li></ul><h3 id="neutral">Neutral</h3><ul><li>Config files still import <code>addons/&lt;name&gt;</code> and call <code>&lt;name&gt;.Addon()</code>.</li><li>The compiler accepts both <code>addons/ssr.LoadContext</code> and -<code>runtime/ssr.LoadContext</code> for load handler signatures during migration.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Keep request-time helpers under <code>addons/&lt;name&gt;</code> and promise the root package -stays light. Rejected because the boundary would remain unenforced.</li><li>Move runtime helpers to <code>addons/&lt;name&gt;/runtime</code>. Rejected because it keeps -runtime code under the addon tree and does not match <code>runtime/auth</code> and -<code>runtime/contracts</code>.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Prefer <code>runtime/&lt;name&gt;</code> imports in docs, examples, and generated-app extension -snippets for request-time helpers.</li><li>Keep <code>addons/&lt;name&gt;</code> re-exports during the 0.x migration window.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/0015-generated-binary-lifecycle-services/index.html b/docs-site/dist/site/docs/engineering/decisions/0015-generated-binary-lifecycle-services/index.html deleted file mode 100644 index 5bf8ca6a..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/0015-generated-binary-lifecycle-services/index.html +++ /dev/null @@ -1,45 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ADR 0015: Generated Binary Lifecycle Services - GOWDK</title> - <meta name="description" content="Date: 2026-06-16"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="ADR 0015: Generated Binary Lifecycle Services - GOWDK"> - <meta property="og:description" content="Date: 2026-06-16"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="ADR 0015: Generated Binary Lifecycle Services - GOWDK"> - <meta name="twitter:description" content="Date: 2026-06-16"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>ADR 0015: Generated Binary Lifecycle Services</h1><p class="doc-lead">Date: 2026-06-16</p></header><article class="prose"><p>Date: 2026-06-16</p><p>Status: Accepted</p><h2 id="context">Context</h2><p>Generated apps expose request-level <code>net/http</code> entry points, but the generated -binary has been web-only. Apps that need background work or an additional -in-process server have had to replace the generated main or use hidden -goroutines in generated app code.</p><p>The lifecycle extension must preserve the compiler/runtime boundary from ADR -0006 and the generated Go boundary from ADR 0005. It must also avoid turning a -specific protocol adapter, such as MCP, into framework core.</p><h2 id="decision">Decision</h2><p>GOWDK will provide a generic generated-binary lifecycle:</p><ul><li><code>gowdk.Config.Lifecycle.Services</code> declares import/function service provider -refs.</li><li>Generated app packages expose <code>App()</code> for process startup while keeping -<code>Handler()</code> and <code>ServeMux()</code> request-only.</li><li><code>runtime/app.Run</code> owns signal handling, service supervision, cancellation, -and graceful HTTP shutdown.</li><li>Lifecycle services use <code>runtime/app.Service</code>, <code>ServiceContext</code>, and -<code>ServiceHooks</code>.</li><li>Contract-aware generated apps expose a shared <code>ContractRegistry()</code> and pass -it through <code>ServiceContext.Values</code> under a string key. <code>runtime/app</code> does not -import <code>runtime/contracts</code>.</li></ul><p>MCP is not a built-in GOWDK addon or runtime package. An MCP bridge can be -written as app code or an external package that returns lifecycle services.</p><h2 id="consequences">Consequences</h2><h3 id="positive">Positive</h3><ul><li>Generated binaries can run workers, metrics endpoints, protocol bridges, and -other app-owned servers without replacing generated main.</li><li>Startup errors and shutdown behavior become visible and testable.</li><li>The framework owns only lifecycle supervision, not app protocol semantics.</li></ul><h3 id="negative">Negative</h3><ul><li>Invalid provider symbols fail during generated app Go compilation, not during -config AST parsing.</li><li>Services that ignore context can still delay process exit until timeout.</li></ul><h3 id="neutral">Neutral</h3><ul><li><code>Handler()</code> and <code>ServeMux()</code> remain the integration surface for external -routers and custom mains.</li><li>Target-specific lifecycle configuration remains future work.</li></ul><h2 id="alternatives-considered">Alternatives Considered</h2><ul><li>Function-valued config. Rejected because generated binaries cannot carry -build-time function values across the compiler/runtime boundary.</li><li>Built-in MCP addon. Rejected because MCP is a protocol adapter and should not -become framework implementation.</li><li><code>init()</code> goroutines. Rejected because they hide errors and have no shutdown -contract.</li></ul><h2 id="follow-up">Follow-Up</h2><ul><li>Add examples for generic app-owned services.</li><li>Re-scope issue #480 as external/app-owned MCP adapter documentation if kept -open.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/decisions/index.html b/docs-site/dist/site/docs/engineering/decisions/index.html deleted file mode 100644 index b1a331b7..00000000 --- a/docs-site/dist/site/docs/engineering/decisions/index.html +++ /dev/null @@ -1,34 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Architecture Decision Records - GOWDK</title> - <meta name="description" content="Use this directory for decisions that are expensive to reverse or that future agents and maintainers must understand."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Architecture Decision Records - GOWDK"> - <meta property="og:description" content="Use this directory for decisions that are expensive to reverse or that future agents and maintainers must understand."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Architecture Decision Records - GOWDK"> - <meta name="twitter:description" content="Use this directory for decisions that are expensive to reverse or that future agents and maintainers must understand."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Decisions</p><h1>Architecture Decision Records</h1><p class="doc-lead">Use this directory for decisions that are expensive to reverse or that future agents and maintainers must understand.</p></header><article class="prose"><p>Use this directory for decisions that are expensive to reverse or that future agents and maintainers must understand.</p><p>Create new records from <code>.agents/templates/adr.md</code>.</p><p>Recommended naming:</p><pre><code class="language-text">0001-short-title.md -0002-short-title.md -</code></pre><h2 id="records">Records</h2><ul><li><code>0001-llm-ready-project-structure.md</code>: accepted project structure for LLM-ready docs, workflows, and templates.</li><li><code>0002-compile-first-render-model.md</code>: accepted compile-first render model with optional SSR.</li><li><code>0003-js-default-explicit-wasm-islands.md</code>: accepted default JS islands and component-declared WASM island opt-in.</li><li><code>0004-production-wasm-island-abi.md</code>: accepted production ABI for component-declared WASM islands.</li><li><code>0005-generated-go-emission-boundary.md</code>: accepted generated Go adapter boundary.</li><li><code>0006-gowdk-compiler-and-runtime-boundary.md</code>: accepted split between -GOWDK Compiler and GOWDK Runtime.</li><li><code>0007-static-first-spa-navigation.md</code>: accepted static-first SPA navigation and generated JavaScript guardrails.</li><li><code>0008-bounded-client-language.md</code>: accepted bounded <code>client {}</code> language and page-scoped store boundaries.</li><li><code>0009-optional-inline-go-authoring.md</code>: accepted optional inline Go authoring direction, with extraction to normal package Go.</li><li><code>0010-tokenizer-recursive-descent-parser.md</code>: accepted shared tokenizer and -recursive-descent parser with error recovery, migrated behind the stable -<code>gwdkast</code> AST seam.</li><li><code>0011-auth-addon-cryptography.md</code>: accepted auth addon cryptography and -dependency stance for PBKDF2 defaults, custom hashers, and session secrets.</li><li><code>0012-realtime-subscribe-surface.md</code>: accepted explicit <code>g:subscribe</code> on -query-owned elements as the first realtime reactivity source contract.</li><li><code>0013-built-in-tracing-observability.md</code>: accepted dependency-free -<code>runtime/trace</code> primitives before generated app auto-instrumentation.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/dependency-policy/index.html b/docs-site/dist/site/docs/engineering/dependency-policy/index.html deleted file mode 100644 index 85184858..00000000 --- a/docs-site/dist/site/docs/engineering/dependency-policy/index.html +++ /dev/null @@ -1,67 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Dependency Policy - GOWDK</title> - <meta name="description" content="GOWDK should keep dependencies minimal while avoiding risky hand-rolled implementations for complex domains."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Dependency Policy - GOWDK"> - <meta property="og:description" content="GOWDK should keep dependencies minimal while avoiding risky hand-rolled implementations for complex domains."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Dependency Policy - GOWDK"> - <meta name="twitter:description" content="GOWDK should keep dependencies minimal while avoiding risky hand-rolled implementations for complex domains."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Dependency Policy</h1><p class="doc-lead">GOWDK should keep dependencies minimal while avoiding risky hand-rolled implementations for complex domains.</p></header><article class="prose"><p>GOWDK should keep dependencies minimal while avoiding risky hand-rolled implementations for complex domains.</p><h2 id="current-policy">Current Policy</h2><ul><li>Do not add production dependencies without a clear reason documented in the change or an ADR.</li><li>Prefer standard library packages for simple compiler, CLI, and runtime work.</li><li>Prefer maintained libraries for complex domains such as authentication, authorization, cryptography, payments, parsing, and dates.</li><li>Keep optional integrations behind addons or nested modules when possible.</li></ul><h2 id="documentation">Documentation</h2><p>Document major dependency decisions in <code>docs/engineering/decisions/</code>.</p><h2 id="release-review-gates">Release Review Gates</h2><p>Run these gates before release packaging.</p><pre><code class="language-sh">go list -m all -go list -m -json all -scripts/check-root-deps.sh -scripts/test-go-modules.sh -scripts/vulncheck-go-modules.sh -</code></pre><p>Review the <code>go list</code> output for unexpected new modules and record any -production dependency decision in an ADR. Review module licenses from the -<code>go list -m -json all</code> output and each module&#39;s repository metadata before -publishing release notes. <code>govulncheck</code> must complete without reachable -vulnerability findings, or the release notes must document the finding, -exploitability, and mitigation.</p><p>CI and release packaging pin Go <code>1.26.4</code> because earlier Go 1.26 patch versions -have reachable standard-library vulnerabilities. Local release verification -should use the same or newer Go patch version before trusting <code>govulncheck</code> -output.</p><p>CI runs <code>scripts/check-root-deps.sh</code> to keep root direct dependencies on an -explicit allowlist and to fail if known optional framework, broker, or realtime -modules enter the root graph. Add automated dependency, size, and license -reports before claiming production readiness.</p><h2 id="current-dependency-classification">Current Dependency Classification</h2><ul><li>Compiler core: standard library plus repository packages under <code>internal/</code>, -and <code>golang.org/x/tools/go/packages</code> for Go package loading during endpoint -binding inspection.</li><li>Root direct third-party modules: <code>github.com/evanw/esbuild</code> for CSS/script -bundling and <code>golang.org/x/tools</code> for Go package loading. Any addition must -update <code>scripts/check-root-deps.sh</code> and this policy, or move behind a nested -optional module.</li><li>Remaining intentional root dependency debt is limited to those two direct -modules plus their required indirect modules in <code>go.mod</code>.</li><li>Runtime core: standard library plus repository packages under <code>runtime/</code>.</li><li>Optional HTTP adapters: <code>runtime/adapters/chi</code>, <code>runtime/adapters/echo</code>, -<code>runtime/adapters/gin</code>, and <code>runtime/adapters/fiber</code>; each framework adapter -is a nested Go module so framework dependencies do not enter the root module -graph. Generated code remains <code>net/http</code> first by default.</li><li>Optional broker/realtime adapters: Redis Streams, NATS, SSE, and WebSocket -packages under <code>runtime/contracts</code>; concrete Redis Streams, NATS, and -WebSocket adapters are nested Go modules. Dependency-free adapters such as -file outbox, memory broker, and SSE stay in the root module. Applications opt -in.</li><li>Optional DB real-driver tests: <code>addons/db/sqlitetest</code> is a nested Go module -with a pure-Go SQLite driver used only to verify DB addon helpers against a -real <code>database/sql</code> driver. The root <code>addons/db</code> package imports no driver.</li></ul><p>Nested optional modules are intentionally not listed in a checked-in root -<code>go.work</code>; ordinary root <code>go test ./...</code> and <code>go build ./cmd/gowdk</code> should stay -outside workspace mode so optional framework and broker dependencies do not -enter the root module graph. <code>scripts/go-modules.sh</code> discovers the root module -plus nested runtime and addon modules for multi-module CI gates. -Nested optional modules that import the root GOWDK module should still require -the current released <code>github.com/cssbruno/gowdk</code> version and keep a local -<code>replace github.com/cssbruno/gowdk =&gt; ../../..</code> for repository tests outside -workspace mode. Update those required versions when cutting a release that -changes root runtime APIs used by nested modules.</p><ul><li>Optional CSS/tool adapters: <code>addons/tailwind</code>; it shells out to a user-owned -Tailwind executable and does not download Tailwind during normal builds.</li><li>Test/dev only: workflow Node checks and VS Code packaging scripts.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/generated-code-policy/index.html b/docs-site/dist/site/docs/engineering/generated-code-policy/index.html deleted file mode 100644 index c75efe59..00000000 --- a/docs-site/dist/site/docs/engineering/generated-code-policy/index.html +++ /dev/null @@ -1,55 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Generated Code Policy - GOWDK</title> - <meta name="description" content="Generated output exists for app-shell HTML, browser runtime assets, generated app source, local binaries, Go js/wasm artifacts, supported action/API/fragment handlers, guards,..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Generated Code Policy - GOWDK"> - <meta property="og:description" content="Generated output exists for app-shell HTML, browser runtime assets, generated app source, local binaries, Go js/wasm artifacts, supported action/API/fragment handlers, guards,..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Generated Code Policy - GOWDK"> - <meta name="twitter:description" content="Generated output exists for app-shell HTML, browser runtime assets, generated app source, local binaries, Go js/wasm artifacts, supported action/API/fragment handlers, guards,..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Generated Code Policy</h1><p class="doc-lead">Generated output exists for app-shell HTML, browser runtime assets, generated app source, local binaries, Go js/wasm artifacts, supported action/API/fragment handlers, guards, rate-limit hooks, concrete or dynamic SSR pages with declared server {} fields, and concrete or dynamic hybrid request-time pages with or without declared server {} data. Hybrid streaming/data refresh, richer generated-client reactivity, and production operations policy remain planned. This policy records constraints for generated files as that surface grows.</p></header><article class="prose"><p>Generated output exists for app-shell HTML, browser runtime assets, generated app -source, local binaries, Go <code>js/wasm</code> artifacts, supported action/API/fragment -handlers, guards, rate-limit hooks, concrete or dynamic SSR pages with declared -<code>server {}</code> fields, and concrete or dynamic hybrid request-time pages with or -without declared <code>server {}</code> data. -Hybrid streaming/data refresh, richer generated-client reactivity, and -production operations policy remain planned. This policy records constraints for -generated files as that surface grows.</p><h2 id="ownership">Ownership</h2><p>Generated application output belongs to the user application unless a generated -file explicitly states otherwise. Repository licensing details live in -<code>../../LICENSE</code>.</p><h2 id="safety-rules">Safety Rules</h2><p>Generated code must:</p><ul><li>Escape untrusted HTML by default.</li><li>Keep raw HTML escape hatches explicit.</li><li>Avoid logging secrets and sensitive form values.</li><li>Enforce action/API body limits before decoding.</li><li>Include conservative HTTP server timeouts and header limits.</li><li>Exclude local env files, credentials, private source files, and temporary artifacts from embedded output.</li><li>Keep generated files deterministic enough for tests and review.</li></ul><h2 id="compatibility">Compatibility</h2><p>Public generated-runtime contracts should live under <code>runtime/</code>. Compiler internals should stay under <code>internal/</code> and must not be imported by generated user applications unless explicitly promoted.</p><h2 id="generated-go-emission">Generated Go Emission</h2><p>Generated Go belongs to the compiler spine. New generated Go must be built from -Go AST nodes, printed with <code>go/printer</code>, and normalized with <code>go/format</code> before -being written or compiled. A formatting error is a generator bug and must stop -the build before <code>go build</code> sees broken generated files.</p><p>Current AST-backed Go emission surfaces:</p><ul><li><code>internal/appgen</code>: generated app packages, backend route registrations, -action/API/fragment/contract/guard/rate-limit/SSR adapter functions, generated -imports, server main source, and split backend app source.</li><li><code>internal/goblockgen</code>: captured <code>go {}</code> blocks parsed as Go files and emitted -through AST/printer/format into generated app package source.</li><li><code>internal/buildgen</code>: build-data helper programs and Go client/WASM helper -source are parsed or formatted before execution or artifact emission.</li></ul><p>Tests in <code>internal/appgen</code> ban <code>strings.Builder</code> and hardcoded line-writing in -the main generated Go emitters. Generated Go goldens under -<code>internal/appgen/testdata/generated_go_golden/</code> pin the inspectable output.</p><p>Allowed string payloads are limited to non-Go artifacts or user-owned Go source -that is parsed/formatted before use:</p><ul><li>HTML, CSS, JavaScript, JSON, markdown, route manifests, asset manifests, and -build reports.</li><li>User-authored inline <code>go {}</code> bodies, which are parsed into Go AST files before -generated package emission.</li><li>Literal source snippets used only as parse input for small Go helper programs, -when the result is immediately parsed or formatted and the source is not -appended through line-writing.</li></ul><p>Any future temporary generated-Go string exception must name the migration step -in a code comment, be covered by a deterministic test or golden, and be removed -before the surrounding generated Go surface is considered stable.</p><p>Framework-owned browser JavaScript is not a broad string-payload exception. -Runtime assets such as <code>gowdk.js</code>, store persistence, JS islands, and WASM -loaders live as <code>.js</code> files under <code>internal/clientrt/assets/</code> and are embedded -through <code>go:embed</code>; Go code may only perform narrow placeholder substitution -for generated names and paths.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/markup-transitions-plan/index.html b/docs-site/dist/site/docs/engineering/markup-transitions-plan/index.html deleted file mode 100644 index 773d9eee..00000000 --- a/docs-site/dist/site/docs/engineering/markup-transitions-plan/index.html +++ /dev/null @@ -1,32 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Implementation Plan: Bounded Markup Transitions - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Implementation Plan: Bounded Markup Transitions - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Implementation Plan: Bounded Markup Transitions - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Implementation Plan: Bounded Markup Transitions</h1></header><article class="prose"><h2 id="context">Context</h2><p>Relevant spec, issue, ADR, or discussion:</p><ul><li>Spec: <code>docs/product/markup-transitions-spec.md</code></li><li>Issue: <a href="https://github.com/cssbruno/GoWDK/issues/503">https://github.com/cssbruno/GoWDK/issues/503</a></li><li>ADR: <code>docs/engineering/decisions/0008-bounded-client-language.md</code></li></ul><h2 id="assumptions">Assumptions</h2><ul><li>Transition and animation names are literal CSS hook names.</li><li>This slice targets JS islands for client <code>g:if</code> and keyed client <code>g:for</code>.</li><li>Server-rendered <code>server {}</code> regions remain static request-time HTML and do -not get transition hooks.</li></ul><h2 id="proposed-changes">Proposed Changes</h2><ul><li>Add <code>g:transition</code> and <code>g:animate</code> to the closed directive set.</li><li>Validate motion directive values and placement in <code>viewrender</code>.</li><li>Emit <code>data-gowdk-transition</code> and <code>data-gowdk-animate</code> attributes.</li><li>Extend <code>island.js</code> conditional and keyed-list lifecycles with class toggles, -transition/animation end handling, and fallback cleanup.</li><li>Update docs, stability metadata, and conformance coverage.</li></ul><h2 id="files-expected-to-change">Files Expected To Change</h2><ul><li><code>internal/viewparse/directives.go</code></li><li><code>internal/viewrender/directives.go</code></li><li><code>internal/viewrender/element.go</code></li><li><code>internal/viewanalysis/contract_references.go</code></li><li><code>internal/clientrt/assets/island.js</code></li><li><code>internal/lang/stability.go</code></li><li><code>internal/lang/conformance_coverage_test.go</code></li><li><code>internal/viewrender/view_test.go</code></li><li><code>internal/buildgen/islands_test.go</code></li><li><code>docs/compiler/generated-output.md</code></li><li><code>docs/language/components.md</code></li><li><code>docs/language/diagnostics.md</code></li><li><code>docs/language/markup.md</code></li><li><code>docs/language/stability.md</code></li><li><code>docs/product/requirements.md</code></li><li><code>docs/product/roadmap.md</code></li></ul><h2 id="data-and-api-impact">Data And API Impact</h2><ul><li>Public <code>.gwdk</code> markup gains two accepted directives.</li><li>Generated HTML gains compiler-owned <code>data-gowdk-transition</code> and -<code>data-gowdk-animate</code> attributes.</li><li>No manifest shape changes.</li></ul><h2 id="tests">Tests</h2><ul><li>Unit: <code>internal/viewrender</code> directive validation and rendering tests.</li><li>Integration: <code>internal/buildgen</code> generated HTML/runtime source tests.</li><li>End-to-end: browser island smoke for enter, leave interruption, and reorder.</li><li>Manual: no separate example is required for this first slice; docs include -the minimal CSS contract.</li></ul><h2 id="verification-commands">Verification Commands</h2><pre><code class="language-sh">go test ./internal/viewparse ./internal/viewrender ./internal/viewanalysis ./internal/clientrt ./internal/buildgen ./internal/lang ./internal/diagnostics -go build ./cmd/gowdk -go test ./... -scripts/test-go-modules.sh -</code></pre><h2 id="rollback-plan">Rollback Plan</h2><ul><li>Remove the directives from the supported set and revert the runtime class -toggles. Existing generated output without these directives is unaffected.</li></ul><h2 id="risks">Risks</h2><ul><li>Class names could collide if unprefixed; the implementation uses <code>gowdk-*</code>.</li><li>CSS transitions without an end event need a deterministic fallback cleanup.</li><li>Reordering must not disturb keyed row reuse or event listener rebinding.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/naming-conventions/index.html b/docs-site/dist/site/docs/engineering/naming-conventions/index.html deleted file mode 100644 index 89e3c34f..00000000 --- a/docs-site/dist/site/docs/engineering/naming-conventions/index.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Naming And Full-Name Conventions - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Naming And Full-Name Conventions - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Naming And Full-Name Conventions - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Naming And Full-Name Conventions</h1></header><article class="prose"><h2 id="product-names">Product Names</h2><ul><li>Use <code>GOWDK</code> as the product name and wordmark in prose.</li><li>Use <code>GOWDK Compiler</code> for the <code>.gwdk</code> language/compiler layer when the layer -must be explicit.</li><li>Use <code>GOWDK Runtime</code> for the app/runtime product layer.</li><li>Do not write <code>GoWDK</code>, <code>Go WDK</code>, <code>GOWDK Kit</code>, or invent an expansion for -<code>WDK</code>. <code>GOWDK Kit</code> is especially forbidden because it reads as &#34;kit kit&#34;: -the <code>K</code> in the wordmark already carries the kit idea.</li><li>When referring to the product direction, prefer concrete wording such as -&#34;GOWDK ships apps&#34; or &#34;GOWDK is a portable Go web compiler.&#34;</li><li>When referring to the combined layer model, write <code>GOWDK Compiler plus GOWDK Runtime</code>. -Avoid making <code>GOWDK World</code>, <code>GOWDK Core</code>, or <code>GOWDK Framework</code> new public -product names unless a future ADR accepts that rename.</li></ul><h2 id="product-layer-names">Product Layer Names</h2><table><thead><tr><th>Name</th><th>Use For</th><th>Do Not Use For</th></tr></thead><tbody><tr><td><code>GOWDK</code></td><td>Product name and wordmark for the whole repository/product direction.</td><td>A hidden expansion of <code>WDK</code>, or the redundant &#34;kit kit&#34; phrase <code>GOWDK Kit</code>.</td></tr><tr><td><code>GOWDK Compiler</code></td><td><code>.gwdk</code> language, parser, analyzer, compiler, diagnostics, LSP, generated adapter source, build output, route metadata, asset metadata.</td><td>Runtime request handling, server process ownership, auth, storage, or user business behavior.</td></tr><tr><td><code>GOWDK Runtime</code></td><td>Runtime/app layer: <code>runtime/</code>, <code>addons/</code>, generated <code>net/http</code> app serving, routing, request context, form decoding, response envelopes, actions, APIs, fragments, SSR hooks, embedded assets, one-binary and split-binary wiring.</td><td><code>.gwdk</code> syntax, parser semantics, compiler AST ownership, or user-owned domain logic.</td></tr><tr><td><code>gowdk</code></td><td>CLI binary, Go package name, module path segment, config filename prefixes, generated asset prefixes, generated JavaScript runtime prefixes.</td><td>User-facing prose product name.</td></tr><tr><td><code>GOWDK app</code></td><td>A user app built or served through generated output and GOWDK Runtime.</td><td>The compiler itself.</td></tr><tr><td><code>addon</code></td><td>Optional feature-registration or integration package under <code>addons/</code>.</td><td>A separate product layer competing with GOWDK Runtime.</td></tr></tbody></table><h2 id="ambiguous-terms">Ambiguous Terms</h2><ul><li>Avoid bare <code>core</code> in product docs. Prefer <code>compiler core</code>, <code>runtime core</code>, or -<code>repository core</code>.</li><li>Use <code>runtime</code> for package-level implementation details such as <code>runtime/app</code> -or <code>runtime/contracts</code>; use <code>GOWDK Runtime</code> for the product layer.</li><li>Use <code>request-time page rendering</code> for SSR behavior. Do not describe SSR as -the framework identity.</li><li>Use <code>generated adapter</code> for generated Go glue. Do not call it generated -application logic.</li></ul><h2 id="lowercase-project-names">Lowercase Project Names</h2><ul><li>Use <code>gowdk</code> for the CLI binary.</li><li>Use <code>gowdk</code> for the Go package name and module path segment.</li><li>Use <code>gowdk</code> for config filename prefixes, generated asset prefixes, and -generated JavaScript runtime prefixes.</li><li>Use <code>gowdk.config.go</code> for project config files.</li></ul><h2 id="source-files-and-artifacts">Source Files And Artifacts</h2><ul><li>Use <code>.gwdk</code> for source files.</li><li>Use <code>.page.gwdk</code> for pages.</li><li>Use <code>.cmp.gwdk</code> for components.</li><li>Use lower-kebab-case for generated and CLI-facing artifact names, such as -<code>gowdk-routes.json</code> and <code>gowdk-assets.json</code>.</li></ul><h2 id="runtime-names">Runtime Names</h2><ul><li>Use upper snake case with the <code>GOWDK_</code> prefix for environment variables, such -as <code>GOWDK_APP_ID</code>, <code>GOWDK_MODULE_NAME</code>, and <code>GOWDK_INSTANCE_ID</code>.</li><li>Use <code>X-GOWDK-*</code> for HTTP headers owned by generated GOWDK apps.</li><li>Use <code>data-gowdk-*</code> for generated HTML data attributes owned by the client -runtime.</li></ul><h2 id="go-identifiers">Go Identifiers</h2><ul><li>Use Go initialism conventions for identifiers: <code>API</code>, <code>CSS</code>, <code>HTML</code>, <code>HTTP</code>, -<code>ID</code>, <code>JSON</code>, <code>LSP</code>, <code>SSR</code>, and <code>URL</code>.</li><li>Use full domain names for exported types and functions unless a short name is -already the domain term. Prefer <code>BuildTargetConfig</code> over <code>Target</code>, and -<code>RenderMode</code> over <code>Mode</code>.</li><li>Keep config field names concise but complete. A field name should make sense -inside <code>gowdk.Config{...}</code> without relying on surrounding comments.</li><li>Name modules after user-owned source groups, for example <code>public</code>, <code>admin</code>, -<code>api</code>, or <code>marketing</code>.</li><li>Treat <code>ModuleConfig.Type</code> as metadata. It must not imply deployment behavior -unless a future ADR defines that contract.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/operations/index.html b/docs-site/dist/site/docs/engineering/operations/index.html deleted file mode 100644 index f52c0eef..00000000 --- a/docs-site/dist/site/docs/engineering/operations/index.html +++ /dev/null @@ -1,86 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Operations - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Operations - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Operations - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Operations</h1></header><article class="prose"><h2 id="current-status">Current Status</h2><p>The current repository provides compiler/runtime tooling, SPA output, local -generated-output serving, generated embedded app source, and local generated -binary builds.</p><p>The target deployment model is one Go binary that can serve embedded SPA -pages and backend routes. Today, that binary serves embedded build output plus -supported action, API, fragment, guard, rate-limit, SSR, and explicit -hybrid-with-load request-time slices. SSR remains optional.</p><h2 id="runtime">Runtime</h2><ul><li>Application processes: current local development can use the <code>gowdk</code> CLI; -generated applications can run as a Go binary with supported action, API, -fragment, guard, and SSR handlers.</li><li>Background workers: not part of initial MVP.</li><li>Datastores: user application choice; usable from imported build-time Go data -functions and from user-owned action, API, fragment, and <code>server {}</code> handlers.</li><li>Queues: user application choice.</li><li>External services: user application choice.</li></ul><h2 id="environments">Environments</h2><ul><li>Local: run CLI commands such as <code>gowdk check</code>, <code>gowdk manifest</code>, -<code>gowdk sitemap</code>, <code>gowdk build</code>, <code>gowdk dev</code>, <code>gowdk serve</code>, and <code>gowdk lsp</code>.</li><li>Development: current flow compiles build output, generated app source, and -supported request-time handlers.</li><li>Staging: target flow verifies one-binary serving and addon behavior.</li><li>Production: not a supported readiness claim yet. Current generated binaries -can serve embedded app assets, supported action/API/fragment handlers, -generated guards, SSR pages with declared <code>server {}</code> identifier or dotted -paths, and hybrid pages with or without declared <code>server {}</code> data. Hybrid -streaming, data refresh, and non-HTTP revalidation remain planned.</li></ul><h2 id="observability">Observability</h2><ul><li>Logs: compiler diagnostics and current generated runtime request logs.</li><li>Metrics: route counts and render mode counts are available through manifests. -<code>runtime/app.Metrics</code> records dependency-free request counters for generated -app dispatch paths, and generated apps can expose snapshots through -<code>/_gowdk/health</code> when a metrics collector is attached.</li><li>Traces: request-time SSR, actions, APIs, and fragments are future production -observability concerns.</li><li>Alerts: action failures, API failures, SSR errors, and asset serving errors -are future production concerns.</li><li>Dashboards: generated manifest and route behavior should be inspectable.</li></ul><h2 id="deployment">Deployment</h2><p>Build-output deployment target:</p><pre><code class="language-text">gowdk build --out dist --app .gowdk/app --bin dist/&lt;app&gt; &lt;files&gt; -gowdk build --out dist --app .gowdk/app --wasm dist/&lt;app&gt;.wasm &lt;files&gt; -</code></pre><p>The current generated binary serves embedded prerendered HTML, CSS, SPA -assets, supported POST action handlers, partial action fragment responses, -standalone fragment routes, API handlers, guarded request-time lanes, concrete -or dynamic SSR pages with declared <code>server {}</code> paths, and hybrid pages that -explicitly declare <code>server {}</code> from the selected output directory. <code>--wasm</code> -compiles the same generated app with <code>GOOS=js GOARCH=wasm</code> for hosts that can -run Go WebAssembly; it is not browser WASM islands. Future generated artifacts -should improve production operations guidance, richer validation, broader -hybrid streaming/data refresh and broader generated-client reactivity.</p><p>Current local development can serve generated build output with:</p><pre><code class="language-sh">gowdk serve --dir dist -</code></pre><p>This is development tooling and does not replace generated app output when a -deployable binary is needed.</p><p>Current local development can rebuild generated build output on changes, serve -it, and live reload browsers with:</p><pre><code class="language-sh">gowdk dev --out dist -</code></pre><p><code>dev</code> uses polling so it stays dependency-free and portable. It compares -input content hashes, so touching a file without changing its bytes does not -trigger another rebuild. For plain SPA <code>--out</code> builds, edits to existing -page source files use incremental SPA rendering: GOWDK still parses and -validates the full compiler IR, but writes only the changed page output and -refreshes manifests. Component, layout, CSS, config, source-set, target, app, -binary, and WASM changes use the full build path. Generated build output files, -manifests, generated app source, and embedded build output files are skipped -when their bytes are unchanged, which reduces churn in the local dev loop. This -is live reload, not browser HMR.</p><p>GOWDK does not currently generate Kubernetes manifests or own deployment -configuration. Users can drive their own container or Kubernetes deployment code -by declaring SPA <code>Build.Targets</code> or by building selected configured modules -with repeated or comma-separated <code>gowdk build --module &lt;name&gt;</code> flags. The -selected modules define what is emitted to <code>--out</code>, copied into <code>--app</code>, and -embedded into <code>--bin</code> or <code>--wasm</code>; use separate output/app/bin/wasm paths when -separate artifacts need different module sets. -Generated apps identify replicas through <code>GOWDK_APP_ID</code>, <code>GOWDK_MODULE_NAME</code>, -and <code>GOWDK_INSTANCE_ID</code>, expose that data through <code>/_gowdk/health</code>, and include -it in <code>X-GOWDK-*</code> response headers. If <code>GOWDK_INSTANCE_ID</code> is omitted, the -generated app creates one at process start; deployment code should set it when a -stable ID is needed across restarts.</p><h2 id="generated-server-baseline">Generated Server Baseline</h2><p>Generated servers must have conservative defaults before any production -readiness claim:</p><ul><li>Set <code>http.Server</code> read, write, idle, and header timeouts.</li><li>Set <code>MaxHeaderBytes</code>.</li><li>Cap action/API request body size before form or JSON decoding; generated -apps default to 1 MiB and can override action/API caps with -<code>Build.BodyLimits</code>.</li><li>Do not set <code>Build.CSRF.Disabled</code> for production generated action, command, or -state-changing API handlers unless another cross-site request strategy is in -place. Provide a stable <code>GOWDK_CSRF_SECRET</code> or configured -<code>Build.CSRF.SecretEnv</code> value in each runtime environment.</li><li>Return explicit method-not-allowed responses for unsupported methods.</li><li>Serve app assets with deterministic cache headers.</li><li>Avoid public debug endpoints by default.</li><li>Exclude local env files, private source files, and temporary build artifacts from embedded output.</li><li>Keep logs useful for route/action/API/SSR failures without logging secrets or -sensitive form values. Generated panic-boundary logs and diagnostics redact -common secret fields (<code>password</code>, <code>secret</code>, <code>_gowdk_csrf</code>, cookies, -authorization headers, session IDs, and access/refresh/id tokens), but -app-owned logs remain the application&#39;s responsibility.</li></ul><h2 id="maintenance">Maintenance</h2><ul><li>Backup and restore: user application responsibility.</li><li>Data retention: user application responsibility.</li><li>Dependency updates: keep compiler/runtime dependencies minimal and documented.</li><li>Incident process: user application responsibility, but generated routes should expose enough logs and diagnostics to debug failures.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/release-plan/index.html b/docs-site/dist/site/docs/engineering/release-plan/index.html deleted file mode 100644 index 2674c535..00000000 --- a/docs-site/dist/site/docs/engineering/release-plan/index.html +++ /dev/null @@ -1,379 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>0.x Improvement Checklist - GOWDK</title> - <meta name="description" content="This document is the 0.x hardening backlog for GOWDK after the v0.1 release line. It is intentionally not a finish-line roadmap. It records what to improve while preserving the..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="0.x Improvement Checklist - GOWDK"> - <meta property="og:description" content="This document is the 0.x hardening backlog for GOWDK after the v0.1 release line. It is intentionally not a finish-line roadmap. It records what to improve while preserving the..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="0.x Improvement Checklist - GOWDK"> - <meta name="twitter:description" content="This document is the 0.x hardening backlog for GOWDK after the v0.1 release line. It is intentionally not a finish-line roadmap. It records what to improve while preserving the..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>0.x Improvement Checklist</h1><p class="doc-lead">This document is the 0.x hardening backlog for GOWDK after the v0.1 release line. It is intentionally not a finish-line roadmap. It records what to improve while preserving the product rules already defined in docs/product/roadmap.md, docs/product/requirements.md, and docs/engineering/architecture.md.</p></header><article class="prose"><p>This document is the 0.x hardening backlog for GOWDK after the v0.1 release -line. It is intentionally not a finish-line roadmap. It records what to improve -while preserving the product rules already defined in -<code>docs/product/roadmap.md</code>, <code>docs/product/requirements.md</code>, and -<code>docs/engineering/architecture.md</code>.</p><p>Minor versions such as <code>v0.2.0</code>, <code>v0.3.0</code>, <code>v0.4.0</code>, or later <code>0.x</code> tags are -release vehicles. They may group work from the waves below, but they must not -promise production readiness or imply that the project has reached a final -framework shape.</p><h2 id="product-rules-to-protect">Product Rules To Protect</h2><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep GOWDK framed as an experimental 0.x Go-first compiler/runtime.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add production-ready claims.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add a finish-line version promise.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add migration-guide docs.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add framework comparison docs as core docs.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep <code>.gwdk</code> as the declaration layer.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep normal Go as the behavior layer.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep generated Go as adapter glue.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep static/build-time pages as the default.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep request-time behavior explicit.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep SSR opt-in.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep hybrid behavior explicit.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep generated JavaScript as enhancement only.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not let generated JavaScript own auth, routing truth, validation truth, -business logic, server state, or cache policy.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep <code>net/http</code> as the runtime boundary.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep Chi, Gin, Echo, and Fiber as optional adapters.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep Redis, NATS, SSE, and WebSocket adapters optional.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep Tailwind optional.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep npm optional.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not download optional tools during normal builds.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Make unsupported behavior fail loudly with diagnostics.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Make partial behavior visible in docs, examples, CLI output, and release -notes.</li></ul><h2 id="release-wave-index">Release Wave Index</h2><p>These waves are ordered by dependency, not by promised version number.</p><table><thead><tr><th>Wave</th><th>Theme</th><th>Outcome</th></tr></thead><tbody><tr><td>Public Truth</td><td>Release metadata, README status, known gaps, and repo issue hygiene.</td><td>Users can tell what works, what is partial, and what is unsafe to rely on.</td></tr><tr><td>Release Trust</td><td>Release workflow, notes, checksums, attestations, docs checks, and smoke tests.</td><td>Releases are reproducible and clearly experimental.</td></tr><tr><td>Compiler Spine</td><td>AST, analyzer, IR, diagnostics, generated output, and deterministic generation.</td><td>Compiler phases are explicit and boring.</td></tr><tr><td>Go Interop</td><td>Go binding inspection, stubs, typed params, build/load contracts, and package resolution.</td><td>Go code is easy to connect and debug.</td></tr><tr><td>Endpoint Adapters</td><td>Unified endpoint metadata, adapter IR, strict binding mode, and reports.</td><td>Generated backend glue is strict, readable, and framework-neutral.</td></tr><tr><td>Secure Runtime</td><td>Actions, APIs, fragments, CSRF, redirects, guards, timeouts, limits, errors, and logs.</td><td>Runtime behavior is safer without claiming production readiness.</td></tr><tr><td>SSR And Hybrid</td><td>Request-time page contracts, load, guards, route params, errors, cache, and hybrid behavior.</td><td>Request-time lanes are explicit and documented.</td></tr><tr><td>Components And Islands</td><td>Component contracts, client language, reactivity, SPA navigation, and WASM islands.</td><td>Browser behavior stays bounded to enhancement and local UI.</td></tr><tr><td>CSS And Assets</td><td>Optional CSS processors, Tailwind, scoped CSS, asset manifests, and packaging.</td><td>Assets are deterministic and optional tools stay optional.</td></tr><tr><td>DX And Examples</td><td>CLI inspection, doctor/explain, dev server, LSP, native docs, and examples.</td><td>Users can learn GOWDK through native examples, not migration positioning.</td></tr><tr><td>Ops And CI</td><td>Dependency policy, security policy, production-safety gates, CI, performance, and operations docs.</td><td>Hardening is measurable and visible.</td></tr></tbody></table><h2 id="github-milestone-buckets">GitHub Milestone Buckets</h2><p>GitHub milestones are the planning source of truth. Release tags are separate -release vehicles: a <code>v0.x.y</code> tag may ship completed work from one or more -milestones, but a tag must not rename, skip, or imply completion of a GitHub -milestone unless the related issues and docs agree.</p><p>Last synced with GitHub milestones on 2026-06-09.</p><table><thead><tr><th>Milestone</th><th>Focus</th><th>Release gate</th></tr></thead><tbody><tr><td>M2 - Compiler + Language Contract</td><td>Compiler spine, diagnostics, source spans, parser/formatter hardening, and the current <code>.gwdk</code> language contract.</td><td>Build output, app generation, CLI reports, and language diagnostics use typed compiler records for supported paths, or remaining compatibility paths are explicitly listed.</td></tr><tr><td>M3 - Route / Endpoint / Contract Reports</td><td>Routes, endpoints, contracts, diagnostics, source maps, and editor-navigable reports.</td><td>A user can inspect route, endpoint, and contract metadata without reading generated source.</td></tr><tr><td>M4 - Go Interop</td><td>Go binding inspection, stubs, typed params, build/load contracts, and package resolution.</td><td>A user can see why a Go function or type did or did not bind.</td></tr><tr><td>M5 - Secure Endpoint Runtime</td><td>Strict endpoint adapters, body/header/time limits, CSRF response contract, panic boundaries, and safe redirects.</td><td>Actions, APIs, fragments, and generated request-time handlers have tested failure paths for invalid input, missing handlers, CSRF failure, guard failure, limits, redirects, and panic recovery.</td></tr><tr><td>M6 - Contracts Web Adapter</td><td>Stable <code>g:command</code>/<code>g:query</code> web adapters, contract role diagnostics, local outbox docs, and worker replay docs.</td><td>Web command/query behavior and worker replay behavior are explicit, optional, and do not replace action/API declarations prematurely.</td></tr><tr><td>M7 - SSR / Hybrid</td><td>Request-time page lifecycle, load contracts, hybrid behavior, cache, guards, and route-local errors.</td><td>Concrete and dynamic request-time pages can be built into generated binaries with tested load, guard, error, cache, and direct-refresh behavior.</td></tr><tr><td>M8 - Components / Client Language</td><td>Component props, slots, events, client reactivity, SPA navigation, lifecycle, and WASM islands.</td><td>Component and client behavior remains local enhancement and cannot own routing, auth, server validation, business logic, server state, or cache policy.</td></tr><tr><td>M9 - Assets / WASM / Packaging</td><td>Optional adapters, CSS/assets, WASM ABI, cache manifests, generated app packaging, and dependency surface policy.</td><td>Optional browser WASM, Tailwind, CSS, assets, and packaging behavior are testable without making npm, Tailwind, or WASM mandatory.</td></tr><tr><td>M10 - DX / Product Experience</td><td>VS Code cockpit, examples, cookbook, flagship app, docs, operations, website, playground, CI, and learning path.</td><td>A new user can install, inspect, debug, learn, and run native GOWDK examples through documented commands.</td></tr><tr><td>M11 - Auth Addon Hardening</td><td>Auth crypto stance, swappable password hashing, fail-closed session secret contract, CSRF/session interplay, guard docs, and addon docs.</td><td>Auth addon defaults and examples are explicit about crypto, secrets, sessions, CSRF, and guard boundaries.</td></tr><tr><td>M12 - DB Addon Hardening</td><td><code>database/sql</code> plumbing maturity: migrations apply, transaction/health helpers, sqlc walkthrough docs, and real-driver nested tests.</td><td>DB addon behavior stays plumbing-only and does not own domain code or schema DSL semantics.</td></tr><tr><td>M13 - WebSocket / Realtime Addon</td><td>Presentation-event fanout packaged as an opt-in WebSocket addon with config and <code>gowdk add</code> wiring.</td><td>Realtime transport packaging is optional and dependency-isolated; SSE remains the dependency-free core default.</td></tr><tr><td>M14 - Realtime Reactivity Wiring</td><td>ADR-gated server presentation events drive bounded live DOM updates without user JavaScript.</td><td>Realtime UI updates have explicit <code>.gwdk</code> syntax, IR, validation, guard gating, backpressure, reconnect, and client patch-loop contracts.</td></tr></tbody></table><p>Milestone issue counts and titles live in GitHub. If this table drifts, update -it from GitHub before adding new release planning text.</p><h2 id="standard-release-gates">Standard Release Gates</h2><p>Every 0.x minor release must have:</p><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Release notes that begin with &#34;Experimental 0.x release&#34; and &#34;Not -production-ready.&#34;</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Release notes split into implemented, partial, planned, intentionally out -of scope, required verification, and known gaps.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Current requirement statuses in <code>docs/product/requirements.md</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Current architecture notes in <code>docs/engineering/architecture.md</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Current CLI, config, generated-output, routing, deployment, and examples -docs for changed behavior.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Passing CI and current manual release gates from -<code>docs/engineering/release.md</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Checksums and artifact attestation instructions in release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> A release checklist link in release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> A &#34;no production claim&#34; check before publishing.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Normal GitHub release settings for v0.5.0 and later, unless release -policy deliberately changes again.</li></ul><h2 id="public-truth">Public Truth</h2><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Verify <code>v0.1.5</code> is marked as a pre-release on GitHub.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> If GitHub displays it only as &#34;Latest,&#34; update release settings or release -wording.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add a release note template in <code>.github/</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add &#34;known limitations&#34; to every release.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add &#34;breaking/unstable generated output&#34; to every release.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add CLI artifact verification instructions to release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add checksum verification instructions to release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add attestation verification instructions to release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add VS Code <code>.vsix</code> install instructions to release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add exact Go version requirement to release notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add exact Node version requirement for extension build/test to release -notes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Create a public project board named <code>0.x Hardening</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add waves to the board: Public truth, Release trust, Compiler spine, Go -interop, Endpoint adapters, Secure runtime, SSR/hybrid, Components/islands, -CSS/assets, DX/examples, and Ops/docs.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Convert every <code>Partial</code> requirement into an issue.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Convert every <code>Planned</code> roadmap item into an issue unless the item is -intentionally tracked only in docs.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add labels for compiler, parser, IR, diagnostics, generated Go, runtime, -actions, API, fragments, SSR, hybrid, components, client, WASM, CSS, assets, -security, ops, docs, examples, LSP, dev server, release blocker, breaking -change, good first issue, safe to try today, blocked by compiler IR, blocked -by security hardening, and blocked by generated app runtime.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add issue templates for compiler bugs, generated output bugs, runtime -bugs, security concerns, docs gaps, example requests, language proposals, and -addon proposals.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add README links to known gaps, the release checklist, and the public -hardening board.</li></ul><h2 id="readme-and-getting-started">README And Getting Started</h2><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep the experimental 0.x warning near the top.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add &#34;experimental 0.x&#34; wording near the top.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add &#34;public contracts may change&#34; near the install section.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Move &#34;What works today,&#34; &#34;What is partial,&#34; and &#34;What is planned&#34; higher.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add a compact support matrix for static build output, dynamic SPA paths, -build-time Go data, actions, APIs, fragments, SSR, hybrid, components, WASM -islands, CSS/assets, one-binary output, contracts, dev server, and LSP.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Include matrix columns for stable enough to demo, not production -security, docs available, example available, and tests available.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add direct links from matrix rows to docs, examples, or issues.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Replace slogan-style project laws with the concrete project shape: -<code>.gwdk</code> source declarations, normal Go behavior, compiler IR/output, -generated runtime wiring, explicit request-time lanes, bounded browser -enhancement, optional integrations, and diagnostics for unsupported source.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Replace vague &#34;full-stack&#34; wording with concrete supported lanes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep install from GitHub release asset as the first install path.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep build from source as the contributor/development path.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add Linux, macOS Intel, macOS ARM, and Windows install examples.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add checksum and attestation verification examples.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gowdk version</code> verification.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk doctor</code> verification once implemented.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add troubleshooting for missing <code>gowdk.config.go</code>, missing Tailwind -binary, unsupported Go handler signatures, missing SSR feature, and generated -binary build failures.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Warn that <code>gowdk serve</code> is static-output only and generated binaries are -needed for actions, APIs, fragments, SSR, and hybrid runtime behavior.</li></ul><h2 id="release-trust">Release Trust</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep <code>scripts/test-go-modules.sh</code> in the release gate.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep <code>scripts/vulncheck-go-modules.sh</code> in the release gate.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep <code>go build ./cmd/gowdk</code> in the release gate.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep Node syntax checks and VS Code Node tests.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep example <code>check</code>, <code>manifest</code>, <code>sitemap</code>, and <code>routes</code> gates.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk version --json</code> check after building artifacts.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add smoke execution for each OS/arch artifact where possible.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add generated CLI artifact checksum verification after checksum file -generation.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add generated binary HTTP smoke tests for static, SSR, action POST, API -GET, fragment, hybrid, and WASM build paths.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add VS Code <code>.vsix</code> package existence check.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add release body validation for experimental warning, not-production-ready -warning, known gaps, and checksum instructions.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add docs link checker.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add Markdown lint.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add generated docs sync check.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add generated output determinism check.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gofmt</code> check.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>go vet ./...</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add dependency, license, module graph, and dependency-size reports.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add security policy consistency check.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add examples README command consistency check.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add a &#34;no migration docs&#34; check if this becomes a hard policy.</li></ul><h2 id="toolchain-and-dependency-policy">Toolchain And Dependency Policy</h2><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>toolchain go1.26.4</code> if stronger local toolchain behavior is desired.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk doctor</code> checks for Go version and required local tools.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add CI and release checks that print <code>go version</code> and <code>go env GOVERSION</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document exact Go version requirements and future patch compatibility.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Explain <code>govulncheck</code> in release docs.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep <code>docs/engineering/dependency-policy.md</code> current.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Classify dependencies as compiler core, runtime core, optional HTTP -adapters, optional broker adapters, optional realtime adapters, optional -CSS/tool adapters, or test/dev only.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Move Chi, Gin, Echo, Fiber, Redis, NATS, and WebSocket packages to optional -submodules instead of root direct dependencies.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add CI checks for new direct dependencies.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add dependency diff, license report, vulnerability report, and module -graph report to releases.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Enforce no mandatory npm and no build-time downloads.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Test that generated code does not import Chi, Gin, Echo, Fiber, Redis, or NATS -by default.</li></ul><h2 id="security-and-production-safety-gates">Security And Production-Safety Gates</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Update root <code>SECURITY.md</code> to match <code>docs/engineering/security.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep the production warning.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Replace outdated &#34;planned but not complete&#34; wording with precise -&#34;first slice exists, not production enforcement&#34; wording.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> List implemented first slices: generated action decoding, unexpected -field rejection, direct literal request-shape validation, default generated -CSRF for state-changing endpoints, configurable action/API body caps, -generated <code>http.Server</code> timeout defaults, -<code>MaxHeaderBytes</code>, safe local redirect slice, guard execution slice, SSR panic -boundaries, and no-store request-time responses.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> List incomplete production areas: auth/session policy, full guard -contract, CSRF secret rotation, full redirect policy, per-route body/header -limit policy beyond current defaults, file upload policy, public API -hardening, realtime security policy, and admin tooling policy.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Enable GitHub private vulnerability reporting if available.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add a vulnerability report contact path.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add threat models for compiler diagnostics, generated logs, actions, -APIs, fragments, SSR load, guards, generated assets, VS Code extension, WASM -islands, and contracts/realtime.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add security checklist items to the PR template.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add security review trigger labels.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add generated <code>http.Server</code> timeout configuration: read, write, idle, and -read-header timeouts.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>MaxHeaderBytes</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep action request body caps and add API/fragment body caps where -relevant. Current action and API lanes use configurable caps that default to -1 MiB; generated standalone fragments are GET-only and action fragments share -the action cap.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add configurable body limits.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add explicit 405 responses.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Ensure panic recovery wraps all generated request-time user Go.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Ensure production-safe error pages and no stack traces in production mode.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Prevent secret values in diagnostics and logs.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add log redaction for cookies, auth headers, CSRF tokens, passwords, -secrets, sensitive form fields, and sensitive query params.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add secure headers middleware or docs for <code>X-Content-Type-Options</code>, -<code>Referrer-Policy</code>, <code>Content-Security-Policy</code>, frame policy, and optional -HSTS.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add cookie helper docs for <code>HttpOnly</code>, <code>Secure</code>, <code>SameSite</code>, path, and -domain policy.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add safe redirect allowlists, open redirect tests, and unsafe external -redirect diagnostics.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add embedded secret exclusion tests for <code>.env</code>, source maps with secrets, -private files, and temporary artifacts.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add reverse proxy, TLS termination, request ID, health endpoint, and -metrics endpoint security policy docs.</li></ul><h2 id="compiler-spine">Compiler Spine</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep lex -&gt; parse -&gt; AST -&gt; analyze -&gt; IR -&gt; validate -&gt; generate as -strict phases. See <code>docs/compiler/pipeline.md</code> and -<code>docs/engineering/architecture.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Finish downstream migration to <code>internal/gwdkir</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Make build output generation, app generation, CLI reports, and LSP -metadata consume typed IR.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Remove compatibility structs from long-term generation paths.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add golden coverage for implemented compiler-spine handoffs: AST, IR, -generated Go, generated HTML/CSS, manifest, route report, endpoint report, -build report, and route/asset output manifests. Component graph and asset -graph commands are deferred to #235.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add source spans to current AST and IR records where possible. Remaining -exact-span improvements for diagnostics, reports, and LSP metadata are -deferred to #235.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add compiler invariant checks.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Gate invalid IR before generated-output planning. Test-only invalid-IR -panic helper policy is deferred to #235.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add deterministic output, stale output cleanup, and unchanged-output -preservation tests.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Ban stringy generated Go except temporary documented exceptions. See -<code>docs/engineering/generated-code-policy.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Move generated Go to <code>go/ast</code>, <code>go/printer</code>, and <code>go/format</code> for current -generated app and adapter surfaces.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add internal architecture docs for compiler passes.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add contributor guidance for new syntax requiring parser, formatter, -diagnostic, IR, generation, docs, and example/fixture coverage. See -<code>docs/compiler/syntax-contributors.md</code>.</li></ul><h2 id="parser-formatter-diagnostics-and-language-spec">Parser, Formatter, Diagnostics, And Language Spec</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add stable diagnostic codes. See -<code>internal/diagnostics/registry.go</code> and -<code>docs/reference/diagnostic-codes.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk explain &lt;diagnostic-code&gt;</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Make <code>gowdk check --json</code> a stable tooling contract. See -<code>docs/reference/diagnostics.md</code> and <code>docs/language/diagnostics.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add parser recovery so one syntax error does not hide the rest of the -file. The shared parser now accumulates declaration/block diagnostics while -preserving broad <code>parse_error</code> fallback diagnostics where no stable code -exists.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add exact spans and suggestions for package declarations, imports, <code>use</code>, -metadata declarations, routes, layouts, render modes, <code>paths</code>, <code>build</code>, <code>load</code>, <code>view</code>, -<code>style</code>, <code>client</code>, <code>go</code>, <code>go ssr</code>, <code>go client</code>, <code>go addon.*</code>, actions, APIs, -fragments, component props, component state, and WASM declarations. Current -metadata/block/view/client surfaces have span and suggestion coverage where -parser records exist; remaining broader exact-span work is deferred to #250.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add suggestions for missing config, missing SSR feature, duplicate routes, -unsupported handler signatures, missing exported Go symbols, invalid route -params, unsupported build functions, unsupported component props, and missing -Tailwind command. Implemented suggestion surfaces are documented in -<code>docs/reference/diagnostics.md</code>; remaining suggestion expansion is deferred to -#250.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add formatter idempotence and comment preservation tests. <code>gowdk fmt</code> is -now parser-backed (#472): block kinds come from the parser and view markup is -indented from the parsed view node tree, with a conservative line-oriented -fallback that preserves unparseable source. Remaining unsupported formatting -families are listed in <code>docs/language/formatting.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add malformed syntax tests. Current parser/check fixtures cover malformed -metadata, imports, <code>use</code>, endpoint migration, and unsupported build syntax; -broader recovery-driven malformed syntax coverage is deferred to #250.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add parser, route matcher, view parser, and form decoder fuzz tests. -Deferred to #250 until the invariants and seed corpus for those fuzz targets -are documented.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Write a formal <code>.gwdk</code> language spec covering file kinds, package rules, -Go imports, component <code>use</code>, layout references, asset references, addon -references, metadata declarations, blocks, expressions, view markup, component calls, -slots, event bindings, class/style directives, <code>g:</code> directives, comments, -reserved words, Go identifier mapping, route params, dynamic paths, raw HTML -policy, unsupported syntax behavior, deprecation policy, and 0.x -compatibility. See <code>docs/language/spec.md</code>; remaining expansion is deferred to -#250.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add grammar examples, invalid syntax examples, diagnostics examples, and a -GOWDK-native mental model guide. Current grammar, diagnostics, and language -spec docs cover the baseline; broader examples and mental-model expansion are -deferred to #250.</li></ul><h2 id="go-interop">Go Interop</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Make Go interop a first-class docs page.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk inspect go-bindings</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk generate stubs</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Support build functions returning <code>(T, error)</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Support same-package build functions consistently.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Support imported package aliases consistently.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Support route params into build functions. Deferred to #327.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Support <code>context.Context</code> for request-time functions.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Support typed route params in <code>load</code>, APIs, actions, and fragments where -relevant. The current generated route context exposes <code>app.Params(ctx)</code> and -<code>app.TypedParams(ctx)</code> for SSR/load; per-route structs and broader -action/API/fragment typed accessors are deferred to #23.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add Go symbol discovery reports.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add diagnostics for unsupported signatures, hidden-by-build-tags symbols, -non-exported symbols, wrong packages, ambiguous imports, unsupported return -types, unsupported parameter types, and JSON encoding failures for build data. -First slice landed: <code>gowdk check</code>/<code>build</code> now emit <code>unsupported_backend_signature</code> -and <code>unexported_backend_handler</code> warnings for backend handler near-misses. -Build-tag-hidden symbols, wrong packages, ambiguous imports, detailed -return/parameter type diagnostics, and build-data JSON encoding diagnostics -remain deferred to #328.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add examples using normal Go packages such as <code>database/sql</code>, <code>pgx</code>, -<code>sqlc</code>, <code>slog</code>, session packages, validator packages, email packages, -markdown packages, image processing packages, and queue packages. Deferred to -#329.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep serious app behavior in <code>.go</code> files.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep inline <code>go {}</code> extractable and testable.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document that <code>.gwdk</code> calls supported Go contracts and is not arbitrary Go -everywhere.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add tests for package path resolution, aliased imports, build tags, -generated <code>gowdk_go/</code> packages, same-package handler discovery, and imported -build-data errors.</li></ul><h2 id="routes-layouts-view-engine-and-html-safety">Routes, Layouts, View Engine, And HTML Safety</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Formalize the current route pattern grammar, trailing slash policy, -encoded path handling, route params, typed param helpers, and final-segment -rest params. Route-priority/report hardening beyond the current generated -server behavior is deferred to #237.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add route conflict diagnostics for page, API, action, fragment, and -contract endpoint combinations in the current route model.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add versioned route reports for current route and endpoint metadata. -Route records include source spans, route params, guards, layouts, cache, and -planned handlers. Generated output paths remain in <code>gowdk-routes.json</code> -because dynamic SPA routes can expand to multiple files.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add a source-linked inspect tree for current package, page, component, -layout, route, endpoint, contract-reference, and view markup nodes. See -<a href="https://github.com/cssbruno/GoWDK/issues/317">#317</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add current direct refresh, 404, encoded param, static SPA, dynamic SPA -<code>paths</code>, SSR, hybrid, API, action, fragment, and trailing-slash tests. -Remaining path-traversal and expanded matrix coverage is deferred to #237.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Define current layout composition, nested layout behavior, ordering, slot -rules, request-aware runtime layout contracts, package-scoped layout imports, -and qualified layout references/diagnostics. Generated app request-aware and -hybrid layout wiring follow-ups are deferred to #237.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add current head and metadata support for <code>title</code>, route metadata, -description, canonical URL, Open Graph, Twitter card, app <code>Head</code>, and -sitemap/manifest metadata. Robots/noindex, preload, and prefetch are deferred -to #237.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document supported HTML subset.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Escape text and attributes by default.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Define URL escaping, boolean attributes, class binding, style binding, -event binding, form binding, and raw HTML policy.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add unsafe raw HTML diagnostics for the explicit <code>g:unsafe-html</code> escape hatch.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add the first practical accessibility warning, <code>missing_img_alt</code>. -Missing labels, empty links, button type, and heading order are deferred to -#237.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add unsafe <code>href</code>, <code>src</code>, and <code>action</code> tests plus script and attribute -injection tests for the current view renderer.</li></ul><h2 id="endpoint-adapters-actions-apis-and-fragments">Endpoint Adapters, Actions, APIs, And Fragments</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Normalize actions, APIs, fragments, SSR loads, commands, and queries into -one endpoint/contract metadata model for the current report and adapter IR -surface.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Include source file, source span, kind, package path, package name, symbol, -method, path, signature kind, input type, guards, CSRF policy, cache policy, -and binding status in the current endpoint report.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add endpoint report output type and rate limit policy once the adapter IR -carries stable metadata for both. Deferred to -<a href="https://github.com/cssbruno/GoWDK/issues/57">#57</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add strict binding mode for production-shaped builds. See -<a href="https://github.com/cssbruno/GoWDK/issues/83">#83</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Allow 501 stubs only behind an explicit flag. See -<a href="https://github.com/cssbruno/GoWDK/issues/87">#87</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep development/default builds compatible and make production migration -stubs explicit through <code>Build.AllowMissingBackend</code> / -<code>--allow-missing-backend</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add endpoint conflict diagnostics and a versioned endpoint report command.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Emit OpenAPI and AsyncAPI inspection artifacts from <code>gowdk build</code> for the -routable web surface and integration-event contract surface.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add endpoint graph output. See -<a href="https://github.com/cssbruno/GoWDK/issues/319">#319</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Generate adapters from typed IR with deterministic imports, route -registration, request decoding, and response writing for the current -action/API/fragment/SSR/contract surface. See -<a href="https://github.com/cssbruno/GoWDK/issues/86">#86</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Test generated adapters for success, validation error, missing handler, -unsupported handler, redirect, guard failure, CSRF failure, panic, no-store -response, and method not allowed.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Fully document action syntax, methods, form encoding, JSON support, -direct file input rejection, multipart rejection, user-owned uploads, typed -input decoding, scalar decoding, unknown field policy, missing/repeated field -policy, checkbox/radio/select policy, submit intent, request-shape -validation, domain validation handoff, validation error shape, partial -validation fragments, redirects, reload outcomes, CSRF token placement, -invalid CSRF response, and body limits.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add broader action examples for contact, settings, validation fragments, -redirects, and partial fragment responses beyond the current -newsletter/signup/login slices. Deferred to -<a href="https://github.com/cssbruno/GoWDK/issues/337">#337</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document and add broader API helpers for strict JSON bodies, typed query -params, JSON/error/no-content responses, content type handling, and -method-not-allowed behavior. Generated typed route params, <code>(T, error)</code> -signatures, CORS, and richer examples remain planned.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document supported API signatures, context/request support, -<code>response.Response</code>, generated error handling, guards, no-store responses, -missing/unsupported handler behavior, and unsupported methods for the current -first slice.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add broader API examples for session, search, JSON CRUD, and webhooks with -user-owned validation. Deferred to -<a href="https://github.com/cssbruno/GoWDK/issues/337">#337</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document fragments, standalone fragment routes, action-returned -fragments, validation fragments, <code>g:target</code>, <code>g:swap</code>, swap modes, partial -request headers, no-JS fallback, errors, focus restoration, island remounts, -and no-store behavior.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add fragment examples for inline validation, table row update, list -refresh, modal body update, and dashboard card refresh. Deferred to -<a href="https://github.com/cssbruno/GoWDK/issues/337">#337</a>.</li></ul><h2 id="ssr-hybrid-cache-guards-and-auth-hooks">SSR, Hybrid, Cache, Guards, And Auth Hooks</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document SSR lifecycle, render mode, feature requirement, <code>server {}</code> -grammar, declared load paths, typed route params, <code>(T, error)</code> load functions, -<code>context.Context</code> load functions, redirects, not found, custom errors, -route-local error pages, endpoint-local error pages, panic boundaries, -guard-before-load ordering, layout-data merge, and cache policy.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add SSR examples for simple pages, dashboards, guarded account pages, -dynamic detail pages, and route-local error pages. Deferred to -<a href="https://github.com/cssbruno/GoWDK/issues/102">#102</a>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document hybrid lifecycle, bare hybrid behavior, hybrid with and without -<code>load</code>, SSR feature requirement, cache, revalidation, action invalidation, -fragment refresh, and data refresh.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Defer hybrid streaming until simpler behavior is stable.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add route/build report output that shows hybrid clearly.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document static asset, SPA HTML, SSR HTML, API, action, fragment, and -hybrid cache policy.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document <code>cache</code> and <code>revalidate</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add route report cache column and build report cache section.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Test immutable asset cache, SPA <code>no-cache</code>, request-time <code>no-store</code>, -<code>cache</code>, <code>revalidate</code>, and invalid <code>revalidate</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document guard syntax, required backing hooks, guard failure behavior, and -support matrix for SSR, actions, APIs, fragments, and hybrid.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document request context helpers for request, params, CSRF, session, and -app context.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add user-owned session, cookie session, bearer token, admin role, -guest-only page, JSON auth failure, redirect auth failure, and partial auth -failure examples. Deferred to -<a href="https://github.com/cssbruno/GoWDK/issues/102">#102</a> and -<a href="https://github.com/cssbruno/GoWDK/issues/337">#337</a>.</li></ul><h2 id="components-client-language-spa-navigation-and-wasm">Components, Client Language, SPA Navigation, And WASM</h2><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Document component contracts, file structure, import/use rules, props, -slots, events, state, lifecycle, CSS/assets, and unsupported behavior.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add required/default/boolean/numeric/string/object/array/imported Go -struct prop support as contracts become stable.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add prop validation diagnostics.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add named slots and scoped slots only when syntax is stable.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add child-to-parent events, typed event payloads, bindable state, mount, -update, cleanup, real <code>g:if</code>, <code>g:for</code>, keyed <code>g:for</code>, keyed DOM updates, -recursion policy, and dynamic component policy.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add component snapshot and browser behavior tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add native component examples for buttons, text fields, cards, counters, -tabs, modals, dropdowns, tables, pagination, toasts, form fields, and nav -menus.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Document <code>client {}</code> state, computed values, handlers, allowed/rejected -expressions, dependency graph, cycles, batching, update order, cleanup, async -policy, event policy, DOM patch policy, browser diagnostics, and production -minification later.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Test computed updates, class toggles, conditional DOM, event handlers, -repeated state updates, cycles, cleanup, partial swap remounts, and SPA -navigation remounts.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Document static-first SPA navigation, link interception, external links, -downloads, hash links, targets/new tabs, prefetch, route asset prefetch, -scroll restoration, focus restoration, loading UI, error UI, and optional -enhancement behavior.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add no-JS, direct refresh, browser back/forward, route swap, island -remount, fragment remount, and generated JS size tests/reports.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Document and version the WASM island ABI, required exports, optional -cleanup, mount/remount, multiple instances, event bridge, DOM patch bridge, -browser-unsafe imports, diagnostics, size reporting, asset manifest reporting, -and <code>wasm_exec.js</code> version.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add WASM tests for compile success, missing export, bad export signature, -unsafe imports, mount, event, patch, emit, cleanup, remount after fragment, -and remount after SPA navigation.</li></ul><h2 id="css-assets-packaging-runtime-and-contracts">CSS, Assets, Packaging, Runtime, And Contracts</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep Tailwind optional, outside compiler/runtime core, and never -downloaded during builds. See <code>docs/reference/css.md</code>; the addon runs a -user-owned standalone executable and does not use npm, <code>npx</code>, a shell, or -downloader logic.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add tests proving no Tailwind download and clear missing Tailwind -diagnostics. <code>addons/tailwind/tailwind_test.go</code> covers missing configured and -default commands, and <code>cmd/gowdk/main_test.go</code> covers the optional-tool -doctor warning.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document Tailwind installation through user-owned toolchains and -<code>tailwind.Options.Command</code>. See <code>docs/reference/css.md</code> and -<code>docs/reference/config.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document the current CSS processor API, page-aware stylesheet output, -scoped component CSS, component <code>css</code>, component <code>style {}</code>, layout -<code>style {}</code>, component <code>asset</code>, non-CSS assets, image/font/icon assets, asset -manifest helpers, content hashing, immutable cache, and CSS ordering. See -<code>docs/reference/css.md</code>, <code>docs/reference/images.md</code>, and -<code>docs/compiler/manifest.md</code>. Duplicate/unused CSS warnings and broader asset -diagnostics remain deferred to #250; asset graph output and -<code>gowdk inspect assets</code> remain deferred to #235.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document generated app directory layout, binary layout, embedded output, -module selection, target selection, split frontend/backend builds, -backend-only builds, and deploy WASM versus browser island WASM. See -<code>docs/compiler/generated-output.md</code>, <code>docs/reference/deployment.md</code>, and -<code>docs/reference/config.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add generated output ownership, file cleanup, stale cleanup, -deterministic output, unchanged file preservation, selected module reporting, -embedded asset reports, asset size reports, and production generated-asset -obfuscation reports. Build timing and binary/source-size reporting continue -through the build-report/timings lane; broader release artifact reporting is -deferred to #67.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add smoke coverage for current one-binary, generated app WASM, split -frontend, and backend-only slices. CLI tests build runnable embedded binaries -and WASM artifacts; appgen tests pin split frontend proxy and backend-only -source. Broader HTTP artifact smoke workflows remain deferred to #67.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep generated apps <code>net/http</code> first. Generated app entrypoints, -<code>Handler()</code>, <code>ServeMux()</code>, middleware registration, and optional framework -adapters all preserve <code>net/http</code> as the runtime boundary.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document middleware registration, process lifecycle and graceful-shutdown -ownership, health/readiness through <code>/_gowdk/health</code>, metrics collectors, -request counters, request IDs, app-owned structured logging, future -OpenTelemetry ownership, panic logging/redaction, static asset serving, -404/500 handling, compression, optional ETags, cache-control helpers, reverse -proxies, trusted proxy/header policy, Caddy, Nginx, Docker, systemd, -environment variables, secrets, and binary rollback. See -<code>docs/reference/hooks.md</code>, <code>docs/reference/deployment.md</code>, and -<code>docs/reference/errors.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document contract model, command/query/event/job signatures, one command -owner, backend-owned domain events, presentation events as untrusted UI -notifications, idempotency, retry, backoff, dead-letter, replay, runtime role -filtering, and contract CLI output. See <code>docs/reference/contracts.md</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Defer worker binary generation and cron binary generation until the -runtime role contract is ready. The local single-binary contract path, -event-worker helpers, and deferral are documented in -<code>docs/reference/contracts.md</code>; the split worker/cron deferral was tracked in -#114, with remaining worker topology work tracked by #378.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add current contract examples and defer broader example coverage. The -implemented example covers command/query web adapters and generated contract -metadata in <code>examples/contracts/</code>; signup email jobs, checkout commands, -realtime dashboards, and background sync examples remain part of the native -learning-path/example backlog in #68.</li></ul><h2 id="cli-dev-server-lsp-docs-and-examples">CLI, Dev Server, LSP, Docs, And Examples</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk doctor</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gowdk explain &lt;diagnostic-code&gt;</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gowdk inspect</code> targets. <code>ir</code>, <code>tree</code>, <code>endpoint-graph</code>, -<code>asset-graph</code>, and <code>go-bindings</code> are implemented; <code>generated</code> and <code>deps</code> -remain planned.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk generate stubs</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gowdk clean</code>, <code>gowdk env</code>, <code>gowdk version --json</code>, and -<code>gowdk benchmark</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Improve JSON output for <code>check</code>, <code>routes</code>, <code>manifest</code>, and <code>sitemap</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add build timing, binary size, generated file, stale cleanup, strict mode, -stub mode, debug mode, and machine-readable build report schema docs.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add browser error overlay to <code>gowdk dev</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Show compiler errors and generated Go build errors in the browser.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Show dev-only generated-app runtime 5xx failures in the browser through -the proxy bridge with generic, non-request-bearing payloads.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep last successful build clearly visible.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Log changed files for failed dev rebuilds.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document backend dev proxy behavior and stabilize terminal wording for -runtime proxy startup plus generated-app restart after rebuild.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Log restart reason, rebuild timing, generated files changed, and -generated binary rebuilds.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Document backend proxy mode, <code>--app</code>, <code>preview</code>, and <code>--hot</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add dev tests for no-op rebuilds, component changes, layout changes, CSS -changes, config changes, backend process restarts, and generated app dev -planning.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add dev tests for failed rebuild recovery and generated app dev flow -smoke.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add LSP exact source-range diagnostics. The LSP consumes -<code>Diagnostic.Range</code> directly; high-value parser/IR/compiler diagnostics -(including <code>g:for</code>/<code>g:key</code> row bodies) carry exact spans. Remaining -file/line-level gaps are listed under &#34;Source Ranges&#34; in -<code>docs/reference/diagnostic-codes.md</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add go-to-definition for components, layouts, Go handlers, Go build -functions, CSS inputs, and assets.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add hover docs, completions, quick fixes, tree views, graph views, build -report viewer, generated output viewer, workspace health view, and extension -compatibility docs.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add native docs for building static sites, full GOWDK apps, Go package -interop, forms/actions, typed APIs, fragments, SSR pages, hybrid pages, -guarded routes, components, WASM islands, Tailwind, one binary, deployment, -generated Go, security, known gaps, when not to use GOWDK, troubleshooting, -cookbook, language reference, CLI reference, config reference, runtime -reference, addon reference, dependency policy, release process, and testing -strategy.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add migration guides.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add &#34;versus framework X&#34; docs as core positioning.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep capability examples and add larger native examples for static sites, -build data, layouts, actions, session guards, dashboards, APIs, fragments, -database usage, components, WASM islands, Tailwind, one-binary deploys, -Docker, systemd, Caddy, contracts workers, SSE, and WebSocket.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add one flagship full-stack native GOWDK example with home page, login, -cookie session, protected dashboard, SSR load, action submit, API route, -fragment update, CSRF, guard, database package in normal Go, one-binary -deploy, tests, and README.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Require every example to include purpose, commands, expected output, -feature status, what GOWDK owns, what Go owns, tests or smoke checks, -generated artifact paths, and known limitations.</li></ul><h2 id="testing-ci-operations-performance-playground-and-addons">Testing, CI, Operations, Performance, Playground, And Addons</h2><ul><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep <code>scripts/test-go-modules.sh</code>, CLI build tests, and VS Code tests.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add parser fuzzing through <code>scripts/test-parser-fuzz.sh</code>, with a bounded -CI smoke duration and longer local runs controlled by <code>GOWDK_FUZZTIME</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add route, form decoder, and URL escaping fuzzing.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add generated Go, HTML, CSS, manifest, sitemap, route report, and build -report schema tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add action, API, fragment, SSR, hybrid, guard, CSRF, generated binary, -generated WASM, browser client runtime, fragment, SPA navigation, and WASM -island integration tests.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add generated-output/report determinism through -<code>scripts/test-generated-output-determinism.sh</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add performance, memory, binary size, docs command, examples command, -release checklist, and regression tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Keep baseline CI fast and split jobs for Go unit tests, compiler tests, -runtime tests, appgen tests, CLI tests, examples smoke, docs checks, VS Code -tests, security scan, and dependency/license scan.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add OS matrix for Linux, macOS, and Windows.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add architecture matrix where useful for amd64 and arm64.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Cache Go and Node dependencies properly.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add docs link check, Markdown lint, release dry run, release artifact -smoke workflow, nightly extended examples, nightly fuzz/benchmark where -practical, and branch protection once stable.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Expand operations docs for static-only deploy, one-binary deploy, split -frontend/backend deploy, backend-only deploy, Docker, systemd, Caddy, Nginx, -environment variables, secrets, CSRF secrets, logs, metrics, health, -readiness, graceful shutdown, cache/CDN, binary rollback, artifact layout, -backup/restore as user responsibility, incident response as user -responsibility, dependency update policy, and observability TODOs.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add optional deployment recipe generators for Docker, systemd, reverse -proxy, static-host, and split frontend/backend starting points.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add performance benchmarks for cold build, incremental build, dev rebuild, -generated binary startup, static route latency, SSR latency, action latency, -API latency, fragment latency, memory, binary size, generated JS size, -generated CSS size, and WASM size.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add compiler phase timing for discovery, parse, analyze, IR, validate, -generate, write, and <code>go build</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add build timing to build reports and <code>gowdk benchmark</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Update website install docs to match release assets and sync website docs -from the repo automatically.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Define the docs-first playground onboarding path, sandbox rules, and -export contract.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add local playground policy, source export, and opt-in staged build CLI -bridge for future hosted execution.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Document addon discovery policy before registry-backed CLI discovery.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add checked-in addon registry metadata and gated CLI discovery output.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add website current release badge, experimental warning, what works today, -known gaps, cookbook, examples index, runnable snippets, generated output -preview, route manifest preview, build report preview, and website link -checker.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Document addon lifecycle, registration, config, compiler hooks, runtime -hooks, generated file ownership, version compatibility, security -restrictions, CSS processor addon, Tailwind addon, rate-limit addon, embed -addon, SSR addon, partial addon, contracts addon, addon test harness, example -addon, incompatible/missing addon diagnostics, version handshake, and addon -docs examples.</li></ul><h2 id="native-learning-path">Native Learning Path</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 1: install GOWDK.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 2: create a page.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 3: add build-time Go data.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 4: add a component.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 5: add CSS/assets.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 6: add an action.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 7: add validation.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 8: add CSRF.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 9: add an API.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 10: add a fragment.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 11: add SSR.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 12: add a guard.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 13: use a database from Go.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 14: build one binary.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 15: deploy behind Caddy.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 16: inspect generated Go.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 17: troubleshoot diagnostics.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 18: add tests.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 19: add optional Tailwind.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Lesson 20: add optional WASM island.</li></ul><p>The current lesson index lives in <code>docs/learning/native.md</code>. Polished WASM ABI -examples remain tracked in -<a href="https://github.com/cssbruno/GOWDK/issues/31">#31</a>, broader Go/database interop -examples in <a href="https://github.com/cssbruno/GOWDK/issues/329">#329</a>, and migration -helpers in <a href="https://github.com/cssbruno/GOWDK/issues/122">#122</a>.</p><h2 id="priority-queue">Priority Queue</h2><p>Start with these in order:</p><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Verify release metadata shows experimental/non-production-ready wording -correctly.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Open public issue backlog.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>0.x Hardening</code> project board.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Update website install docs for release binaries.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Sync root <code>SECURITY.md</code> with deeper security baseline.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Keep dependency policy current and add missing enforcement.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add license/dependency scan to CI.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add release note template.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gowdk doctor</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add <code>gowdk explain</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk inspect go-bindings</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add <code>gowdk generate stubs</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Stabilize <code>gowdk check --json</code>.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add diagnostic codes.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add exact source spans where missing. Tracked gaps are listed under -&#34;Source Ranges&#34; in <code>docs/reference/diagnostic-codes.md</code> (Go contract-scan -diagnostics, untyped <code>withLine</code> parser errors, <code>client {}</code> block columns).</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Finish downstream <code>gwdkir</code> migration.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add generated Go golden tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add endpoint IR report.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add strict production-shaped binding mode.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add generated app HTTP smoke tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add CSRF secret docs.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add safe redirect tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add guard contract docs and tests.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add request timeout, header limit, and body limit support.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Build flagship full-stack native GOWDK example.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Build deployment-shaped example.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add native cookbook.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Add browser dev error overlay.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add VS Code quick fix for creating a missing Go handler.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Add performance/build timing report.</li></ul><h2 id="do-not-add-for-now">Do Not Add For Now</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not add migration guides.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not add &#34;GOWDK vs X&#34; docs as core positioning.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not make SSR default.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not make full-page hydration default.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not make browser JavaScript the app contract.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not generate user domain logic.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not generate auth or business validation logic.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not auto-discover endpoints by function name.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not scan Chi/Gin/Echo/Fiber route registrations as route truth.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not require npm.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not require Tailwind.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not require Redis.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not require NATS.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not require Chi, Gin, Echo, or Fiber.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not download optional tools during builds.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Do not hide partial features behind confident wording.</li><li><input disabled="" type="checkbox" aria-label="Incomplete task"> Do not add more syntax without diagnostics, tests, docs, and examples.</li></ul><h2 id="direction">Direction</h2><pre><code class="language-text">Make the current 0.x surface trustworthy. -Make the compiler spine boring. -Make Go interop excellent. -Make generated adapters strict and readable. -Make security warnings precise. -Make examples native to GOWDK. -Do not expand into comparison or migration positioning. -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/release/index.html b/docs-site/dist/site/docs/engineering/release/index.html deleted file mode 100644 index 86a2650e..00000000 --- a/docs-site/dist/site/docs/engineering/release/index.html +++ /dev/null @@ -1,101 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Release - GOWDK</title> - <meta name="description" content="GOWDK is currently experimental 0.x compiler/runtime software. Release packaging automation lives in .github/workflows/release.yml and creates visible normal GitHub releases with..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Release - GOWDK"> - <meta property="og:description" content="GOWDK is currently experimental 0.x compiler/runtime software. Release packaging automation lives in .github/workflows/release.yml and creates visible normal GitHub releases with..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Release - GOWDK"> - <meta name="twitter:description" content="GOWDK is currently experimental 0.x compiler/runtime software. Release packaging automation lives in .github/workflows/release.yml and creates visible normal GitHub releases with..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Release</h1><p class="doc-lead">GOWDK is currently experimental 0.x compiler/runtime software. Release packaging automation lives in .github/workflows/release.yml and creates visible normal GitHub releases with downloadable assets from v tags or a manual workflow dispatch. VS Code Marketplace publishing lives in .github/workflows/vscode-extension-publish.yml.</p></header><article class="prose"><p>GOWDK is currently experimental 0.x compiler/runtime software. Release -packaging automation lives in <code>.github/workflows/release.yml</code> and creates -visible normal GitHub releases with downloadable assets from <code>v*</code> tags or a -manual workflow dispatch. VS Code Marketplace publishing lives in -<code>.github/workflows/vscode-extension-publish.yml</code>.</p><p>The current CLI version is <code>0.7.0</code>, but this is not a production-readiness -claim. It identifies the current development line while the compiler, generated -runtime, and docs continue through the 0.x line. Public release notes must keep -the build experimental and not production-ready until the 1.0 release gates are -satisfied.</p><p>Use <code>CHANGELOG.md</code> for published release history. -Use <code>docs/engineering/release-plan.md</code> for the open-ended 0.x hardening -checklist. It does not make any minor version a production-readiness target. -Use <code>.github/release-note-template.md</code> for future 0.x release bodies.</p><h2 id="version-policy">Version Policy</h2><p>Until the full feature set is complete, public release tags must stay in the -<code>0.x.y</code> pre-1.0 line: <code>v0.1.0</code>, <code>v0.1.5</code>, <code>v0.2.0</code>, and so on. Patch releases -can ship maintenance, packaging, editor, and documentation updates for an -already-published pre-1.0 line, but they must not imply production support.</p><p>The VS Code extension has its own Marketplace version in -<code>editors/vscode/package.json</code>. It does not have to match the CLI/LSP version -unless the release intentionally publishes both tracks with the same number.</p><p>Version roadmap entries in <code>docs/product/roadmap.md</code> are target milestones. A -tag may not claim a milestone unless <code>docs/product/requirements.md</code>, -<code>docs/engineering/architecture.md</code>, and the release notes agree on what is -implemented, partial, and planned.</p><p>GitHub milestones track capability buckets such as compiler/language, -routes/endpoints/contracts, secure runtime, SSR/hybrid, components/client -language, assets/packaging, and DX. They are not patch-release changelogs. -Patch-release changes belong in <code>CHANGELOG.md</code> and the selected release notes.</p><h2 id="release-readiness">Release Readiness</h2><p>No current release should be described as production-ready. Before tagging a -public release, confirm:</p><ul><li>The release body starts with &#34;Experimental 0.x release&#34; and &#34;Not -production-ready.&#34;</li><li>README, requirements, architecture, examples, generated-output docs, and -release notes clearly separate implemented, partial, and planned behavior.</li><li>Version and release notes are reflected in the visible GitHub release.</li><li>CI workflow is passing.</li><li>Release artifact list is still accurate.</li><li>GitHub artifact attestations are enabled for release artifacts.</li><li>Release notes include checksum and attestation verification instructions.</li><li>Generated-output compatibility notes are documented when public releases begin.</li><li>VS Code extension package metadata is current for extension releases.</li><li>The <code>VSCE_PAT</code> GitHub secret is present before publishing the extension.</li><li>Security advisory process is current.</li></ul><p>No local production-readiness feature blockers are currently listed in this -document. The external release, artifact, supply-chain, and publication gates -below still have to pass before publishing.</p><h2 id="current-manual-gates">Current Manual Gates</h2><pre><code class="language-sh">scripts/test-go-modules.sh -scripts/vulncheck-go-modules.sh -scripts/check-docs-links.sh -go build ./cmd/gowdk -./gowdk version --json -node --check editors/vscode/extension.js -node --check editors/vscode/extension-core.js -node --test editors/vscode/*.test.js -go run ./cmd/gowdk check --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk manifest --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk sitemap --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk routes --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk endpoints --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk inspect tree --json --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk inspect endpoint-graph --json --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -go run ./cmd/gowdk build --ssr --out /tmp/gowdk-hybrid-build --app /tmp/gowdk-hybrid-app --bin /tmp/gowdk-hybrid-site examples/ssr/hybrid-static.page.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-component-assets examples/components/assets/*.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-wasm-island examples/components/wasm/*.gwdk -</code></pre><p>After those gates pass on the release commit, run the release workflow manually -for the current CLI line or push the corresponding tag:</p><pre><code class="language-sh">gh workflow run release.yml -f version=v0.7.0 -</code></pre><p>After the release workflow completes, smoke the published artifacts for each -supported OS artifact:</p><pre><code class="language-sh">gh workflow run release-smoke.yml -f version=v0.7.0 -</code></pre><h2 id="artifacts">Artifacts</h2><ul><li><code>gowdk-linux-amd64</code></li><li><code>gowdk-linux-arm64</code></li><li><code>gowdk-darwin-amd64</code></li><li><code>gowdk-darwin-arm64</code></li><li><code>gowdk-windows-amd64.exe</code></li><li><code>checksums.txt</code></li><li><code>gowdk-vscode-0.7.0.vsix</code></li></ul><h2 id="install-script">Install Script</h2><p><code>scripts/install.sh</code> installs the latest visible published GitHub release by -default. It selects the current operating system and architecture, downloads -<code>checksums.txt</code>, verifies that the matching CLI artifact exists for the current -platform before binary download, verifies the binary SHA-256, and writes -<code>gowdk</code> into <code>GOWDK_INSTALL_DIR</code> or <code>/usr/local/bin</code>.</p><p>Pinned install:</p><pre><code class="language-sh">GOWDK_VERSION=v0.7.0 GOWDK_INSTALL_DIR=&#34;$HOME/.local/bin&#34; \ - sh -c &#34;$(curl -fsSL https://raw.githubusercontent.com/cssbruno/GoWDK/main/scripts/install.sh)&#34; -</code></pre><h2 id="supply-chain-metadata">Supply-Chain Metadata</h2><p>The release workflow uses GitHub artifact attestations for files in <code>dist/</code>. -It uploads the same <code>dist/*</code> set as a workflow artifact for run-level downloads -and verifies that the selected tag release contains the expected download -assets after the release upload step. Attestations are generated with -OIDC-backed Sigstore signing through <code>actions/attest</code> after CLI binaries, -<code>checksums.txt</code>, and the VS Code extension package are collected. Release -reviewers can verify downloaded artifacts with:</p><pre><code class="language-sh">gh attestation verify &lt;artifact&gt; -R &lt;owner&gt;/&lt;repo&gt; -</code></pre><h2 id="extension-publishing">Extension Publishing</h2><p>The release workflow packages the extension into a <code>.vsix</code> named from -<code>editors/vscode/package.json</code>, currently <code>gowdk-vscode-0.7.0.vsix</code>. -Marketplace publishing is handled by the <code>Publish VS Code Extension</code> workflow. -It is manual-only so CLI/runtime releases do not accidentally republish an -extension version that already exists on the Marketplace.</p><p>Before using the workflow:</p><ol><li>Create or confirm the Visual Studio Marketplace publisher that matches -<code>editors/vscode/package.json</code>.</li><li>Create an Azure DevOps Personal Access Token with Marketplace Manage scope.</li><li>Add the token as the repository secret <code>VSCE_PAT</code>.</li><li>Update <code>editors/vscode/package.json</code> to a version that does not already exist -on the Marketplace.</li><li>Decide whether the extension should publish as a Marketplace pre-release. -The workflow has a <code>pre_release</code> input for that path.</li></ol><p>Manual publish:</p><pre><code class="language-sh">gh workflow run vscode-extension-publish.yml -</code></pre><p>The workflow verifies the extension, packages a <code>.vsix</code>, uploads that package as -a workflow artifact, then runs <code>vsce publish --pat &#34;$VSCE_PAT&#34;</code>. Use the -workflow&#39;s <code>pre_release</code> input for Marketplace pre-release publishing. The CLI -and extension versions can differ; release notes should say whether the <code>.vsix</code> -is bundled only as a release artifact, manually published to the Marketplace, or -published as a Marketplace pre-release.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/security-threat-model/index.html b/docs-site/dist/site/docs/engineering/security-threat-model/index.html deleted file mode 100644 index f42d22fb..00000000 --- a/docs-site/dist/site/docs/engineering/security-threat-model/index.html +++ /dev/null @@ -1,39 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Security Threat Model - GOWDK</title> - <meta name="description" content="This baseline covers the current GOWDK Compiler plus GOWDK Runtime repository surfaces called out by the M5 secure endpoint runtime work. It is not a production-readiness claim...."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Security Threat Model - GOWDK"> - <meta property="og:description" content="This baseline covers the current GOWDK Compiler plus GOWDK Runtime repository surfaces called out by the M5 secure endpoint runtime work. It is not a production-readiness claim...."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Security Threat Model - GOWDK"> - <meta name="twitter:description" content="This baseline covers the current GOWDK Compiler plus GOWDK Runtime repository surfaces called out by the M5 secure endpoint runtime work. It is not a production-readiness claim...."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Security Threat Model</h1><p class="doc-lead">This baseline covers the current GOWDK Compiler plus GOWDK Runtime repository surfaces called out by the M5 secure endpoint runtime work. It is not a production-readiness claim. It records the main trust boundaries, abuse paths, current controls, and open follow-up areas for review.</p></header><article class="prose"><p>This baseline covers the current GOWDK Compiler plus GOWDK Runtime repository -surfaces called out by the M5 secure endpoint runtime work. It is not a -production-readiness claim. It records the main trust boundaries, abuse paths, -current controls, and open follow-up areas for review.</p><h2 id="assumptions">Assumptions</h2><ul><li>Generated apps may be exposed to untrusted HTTP clients when users deploy the -generated binary.</li><li>User application Go code owns authentication, authorization, persistence, -domain validation, audit policy, and incident response.</li><li>GOWDK-generated code owns adapter glue: request decoding, route dispatch, -generated CSRF checks, response envelopes, panic boundaries, embedded asset -serving, and contract web adapters.</li><li>During 0.x, unsupported or incomplete behavior must remain explicit in docs, -diagnostics, or tracked issues.</li></ul><h2 id="assets">Assets</h2><ul><li>User source code, generated Go source, build artifacts, embedded assets, and -release artifacts.</li><li>Secrets and credentials in config, environment variables, cookies, headers, -form fields, logs, diagnostics, and source-adjacent files.</li><li>Integrity of generated route, endpoint, contract, and asset metadata.</li><li>Availability of generated HTTP handlers, contract workers, and local dev -tooling.</li></ul><h2 id="boundaries">Boundaries</h2><table><thead><tr><th>Boundary</th><th>Entry Points</th><th>Current Controls</th><th>Open Work</th></tr></thead><tbody><tr><td><code>.gwdk</code> source to compiler diagnostics</td><td>Parser, analyzer, <code>gowdk check</code>, LSP diagnostics</td><td>Stable diagnostic registry, source spans where available, redaction policy for secret-like values</td><td>Broader exact spans and diagnostic expansion remain tracked outside M5.</td></tr><tr><td>Generated logs and panic sinks</td><td><code>runtime/app</code> panic boundaries, contract worker logs</td><td>Panic responses avoid stack traces; recovered panic logs pass through secret redaction</td><td>Broader app-owned logging guidance and redaction coverage remain planned.</td></tr><tr><td>Browser/client to action endpoints</td><td>POST forms, enhanced partial forms, command form adapters</td><td>Expected-field decoding, direct literal validation, configurable action body cap defaulting to 1 MiB, default CSRF, 405 on wrong methods, no-store error responses</td><td>Broader upload policy, per-route limits, and full production CSRF rotation remain planned.</td></tr><tr><td>Browser/client to API endpoints</td><td>Generated API routes, contract query routes</td><td>Method dispatch, configurable API body cap defaulting to 1 MiB, generated CSRF for state-changing API methods, rate-limit hook when addon is enabled</td><td>Public API hardening, typed helper expansion, and per-route policy are tracked in #24.</td></tr><tr><td>Browser/client to fragments</td><td>Standalone fragments, action fragment responses</td><td>Fragment routing through generated handlers, escaped render core, no-store request-time responses; standalone fragments are GET-only and action fragments share the action cap</td><td>Broader auth/session policy remains planned.</td></tr><tr><td>Browser/client to SSR <code>server {}</code></td><td>Request-time SSR routes, route-local error pages</td><td>SSR feature gate, guard execution, safe local redirect helpers, panic boundaries, no-store failures</td><td>Full guard contract, route-local auth/session policy, and richer request-time error policy remain planned.</td></tr><tr><td>Guard metadata to user authorization</td><td><code>guard</code> declarations, <code>GOWDKGuardRegistry</code>, <code>GOWDKAuthProvider</code></td><td>Guards run before generated request-time user logic; native RBAC helpers are defense-in-depth only</td><td>Backend resource authorization remains app-owned; full guard response contract is planned.</td></tr><tr><td>Embedded build output to generated server</td><td>Embedded SPA assets, generated error pages, health endpoint</td><td>Generated server uses HTTP timeouts and <code>MaxHeaderBytes</code>; embedded output skips known secret/private/temp artifacts</td><td>Broader asset policy remains planned.</td></tr><tr><td>VS Code extension to workspace</td><td>LSP/editor commands and workspace file access</td><td>Dependency-light local tooling; no production runtime authority</td><td>Extension command/file threat model needs focused review before broader editor automation.</td></tr><tr><td>WASM islands to browser runtime</td><td><code>go client {}</code>, component WASM assets, host loader</td><td>WASM is explicit and separate from backend handlers; browser-unsafe import validation exists</td><td>Production ABI hardening and user-code runtime validation remain planned.</td></tr><tr><td>Contracts and realtime adapters</td><td>Command/query web adapters, workers, outbox, broker, fanout</td><td>Web-role validation, CSRF before command decoding, guard/rate-limit preflight, local default dispatch, worker ack/nack, seen-store deduplication, and nacked-batch backoff hooks</td><td>Worker/cron binary generators, durable retry operations, and realtime security policy remain planned.</td></tr><tr><td>Playground source to sandbox execution</td><td><code>gowdk playground policy</code>, <code>export</code>, and opt-in <code>run</code>; future hosted website runners</td><td>Hosted execution is disabled by default; export/staging require <code>gowdk.config.go</code>, exclude generated output, dependency vendor folders, local env files, secrets, private keys, temp files, and reports; opt-in <code>run</code> re-executes the build inside an OS-level Linux sandbox (user/mount/PID/network/IPC/UTS namespaces, <code>pivot_root</code> off the host filesystem, no network, rlimits, dropped capability bounding set, <code>no_new_privs</code>) with a synthesized env (<code>GOPROXY=off</code>, <code>GOSUMDB=off</code>, <code>GOWORK=off</code>); the sandbox fails closed where unavailable; the module cache must be chosen explicitly (per-session via <code>--module-cache</code>, or the host cache via <code>--allow-shared-module-cache</code>) and <code>--out</code> must be a fresh empty directory</td><td>The inner sandbox has no seccomp filter, bounds tmpfs only per-mount (not in aggregate), does not cap total <code>/out</code> disk usage (the host bind is limited only by per-file <code>RLIMIT_FSIZE</code>), does not enforce <code>RLIMIT_NPROC</code> when gowdk runs as host root, and does not drop the init process&#39;s effective capabilities, so hosted infrastructure must still wrap each session in an outer VM/container boundary with network, cgroup memory/pids caps, output disk quota, rate-limit, log, cleanup, per-session module-cache, and version-pinning enforcement.</td></tr></tbody></table><h2 id="abuse-paths">Abuse Paths</h2><table><thead><tr><th>Abuse Path</th><th>Impact</th><th>Current Mitigation</th><th>Priority</th></tr></thead><tbody><tr><td>Submit unexpected action fields to overwrite handler input.</td><td>Integrity of action input.</td><td>Generated decoders reject unexpected fields and skip runtime fields such as CSRF.</td><td>Medium until broader typed helper contracts stabilize.</td></tr><tr><td>Send large request bodies to exhaust memory or handler time.</td><td>Availability of generated servers.</td><td>Generated action/API adapters cap bodies with configurable app-level limits; generated server entrypoints set HTTP timeouts and max-header defaults.</td><td>Medium because per-route limits remain planned.</td></tr><tr><td>Reuse or forge generated CSRF tokens.</td><td>Cross-site action, command, or state-changing API execution.</td><td>Generated CSRF is enabled by default for generated action POSTs, command POSTs, and state-changing APIs, and validates before decoding or user handlers run.</td><td>Medium while secret rotation and deployment guidance continue to harden.</td></tr><tr><td>Trigger handler panics and read stack traces or secret values.</td><td>Secret exposure and debugging data leakage.</td><td>Runtime panic boundaries avoid stack traces in responses and redact recovered-panic logs.</td><td>Medium because app-owned logs are outside generated control.</td></tr><tr><td>Use unsafe redirects to move users off-site.</td><td>Phishing or token leakage through redirects.</td><td>First slices require safe local redirects for generated action/SSR redirect paths.</td><td>Medium until full redirect allowlists and diagnostics are complete.</td></tr><tr><td>Embed local secrets into generated output.</td><td>Secret exposure in release artifacts.</td><td>Docs require generated output to avoid local env/private files.</td><td>High until exclusion tests cover <code>.env</code>, source maps, private files, and temp artifacts.</td></tr><tr><td>Expose public APIs without auth, rate limits, or validation.</td><td>Data exposure, mutation, or availability loss.</td><td>Generated adapters stay framework-neutral and can use guard/rate-limit hooks.</td><td>High until public API helper and policy work is complete.</td></tr><tr><td>Treat guards as full backend authorization.</td><td>Authorization bypass in user domain code.</td><td>Docs state guards are route gates and backend authorization stays in app Go.</td><td>High if users rely on guards alone for protected resources.</td></tr><tr><td>Replay contract or realtime events incorrectly.</td><td>Duplicate state changes or stale UI state.</td><td>Local default dispatch, worker ack/nack helpers, seen-store deduplication, and nacked-batch backoff hooks exist.</td><td>Medium until durable retry/dead-letter/realtime deployment policies are complete.</td></tr><tr><td>Let editor automation operate on untrusted workspaces without review.</td><td>Local file or command abuse.</td><td>Current editor surface is limited.</td><td>Medium before adding broader workspace automation.</td></tr><tr><td>Run playground submissions with host secrets, network access, or unbounded output.</td><td>Secret exposure, dependency supply-chain abuse, or host resource exhaustion.</td><td>Current CLI execution is opt-in, stages filtered files into a disposable workspace, rejects secret-looking sandbox env names, and disables Go network dependency lookup by default.</td><td>High for any future hosted runner until infrastructure-level isolation and abuse controls are implemented.</td></tr></tbody></table><h2 id="review-triggers">Review Triggers</h2><p>Apply the <code>security review</code> GitHub label to issues or pull requests that touch:</p><ul><li>authentication, authorization, sessions, CSRF, redirects, cookies, or headers;</li><li>generated action/API/fragment/SSR request handling;</li><li>request body/header limits, file uploads, parsing, or decoding;</li><li>generated logs, diagnostics, error pages, or panic boundaries;</li><li>embedded assets, source maps, release artifacts, or secret exclusion;</li><li>playground export, hosted execution, sandbox policy, or website-runner -infrastructure;</li><li>VS Code commands, workspace file access, WASM islands, contracts, workers, -queues, brokers, SSE, WebSocket, or realtime behavior.</li></ul><h2 id="follow-up-areas">Follow-Up Areas</h2><ul><li>Add per-route request body/header limit policy.</li><li>Finish public API helper hardening in #24.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/security/index.html b/docs-site/dist/site/docs/engineering/security/index.html deleted file mode 100644 index 3fd1dfcb..00000000 --- a/docs-site/dist/site/docs/engineering/security/index.html +++ /dev/null @@ -1,52 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Security Baseline - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Security Baseline - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Security Baseline - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Security Baseline</h1></header><article class="prose"><h2 id="current-status">Current Status</h2><p>The initial implementation is a compiler/runtime scaffold. Security-critical behavior appears incrementally in the actions, partial, API, embed, and SSR addons.</p><p>Do not treat current <code>act</code>, <code>api</code>, <code>partial</code>, <code>guard</code>, or SSR scaffolding as complete production enforcement. Current validation records and checks metadata; generated request decoding and default CSRF enforcement for browser-reachable state-changing endpoints exist, while authorization and broader request-time policy are still planned.</p><h2 id="baseline-rules">Baseline Rules</h2><ul><li>Never commit secrets or production credentials.</li><li>Keep <code>.env.example</code> updated when environment variables are introduced.</li><li>Validate untrusted input at system boundaries.</li><li>Enforce authentication and authorization close to protected resources.</li><li>Use maintained libraries for cryptography, authentication, authorization, and payment handling.</li><li>Log security-relevant events without logging secrets or sensitive personal data.</li><li>Treat file uploads, webhooks, background jobs, and admin tools as explicit attack surfaces.</li></ul><h2 id="gowdk-specific-security-rules">GOWDK-Specific Security Rules</h2><ul><li>Generated actions, command endpoints, and state-changing API endpoints enable -CSRF by default. Production configs must not set <code>Build.CSRF.Disabled</code> unless -another cross-site request strategy is enforced, and every runtime environment -must provide a stable CSRF secret.</li><li>Generated form decoders must validate expected fields and avoid mass assignment.</li><li>Generated action forms must reject direct file inputs and multipart posts. -Uploads are user-owned API/server behavior with explicit size, storage, -validation, cleanup, auth, and logging rules.</li><li>Generated action handlers must cap request bodies before parsing submitted -form values.</li><li>Generated server entrypoints must set conservative <code>http.Server</code> read, -read-header, write, idle, and max-header defaults.</li><li><code>partial</code> responses must render escaped HTML through the shared render core.</li><li><code>ssr</code> pages with <code>server {}</code> must make auth/session access explicit through guards or request-aware APIs.</li><li>Embedded assets must not include local env files, source maps with secrets, or private files outside configured build output.</li><li>Compiler diagnostics must not print secret values from config or build-time data.</li></ul><h2 id="production-readiness-gates">Production Readiness Gates</h2><p>Before generated app output is considered production-ready:</p><ul><li>Generated action, command, and state-changing API CSRF must be enabled and -configured with a runtime secret.</li><li>Redirects must reject unsafe external destinations unless explicitly allowed.</li><li>Generated decoders must define how unknown, missing, repeated, and file fields are handled.</li><li>Guards must have a documented execution contract, failure behavior, and test coverage.</li><li>Generated server entrypoints set read, read-header, write, idle, and -max-header defaults. Generated action/API body caps default to 1 MiB and can -be configured with <code>Build.BodyLimits</code>; per-route body/header policy remains -planned.</li><li>Embedded asset selection must exclude secrets, local env files, private source files, and temporary artifacts.</li><li>Diagnostics and logs must avoid printing sensitive form values, credentials, or private build-time data.</li></ul><h2 id="auditing-the-posture">Auditing The Posture</h2><p><code>gowdk audit</code> makes this baseline executable. It derives a declarative security -posture from validated IR. <code>gowdk build</code> writes the posture as -<code>gowdk-security.json</code> in a non-served sibling report path under -<code>.gowdk/reports/&lt;output-name&gt;/</code>, and <code>gowdk audit --json</code> includes the same -posture inline. The built-in policy encodes the production-readiness gates -above — for example, actions, commands, and state-changing APIs must enforce -CSRF, and APIs must not be public by omission. Findings carry a stable -diagnostic code, a <code>file:line</code>, and remediation; run <code>gowdk explain &lt;code&gt;</code> for -details.</p><p><code>gowdk build</code> evaluates the same static baseline before writing output. -Production builds fail on error-severity findings unless <code>--allow-insecure</code> is -set; non-production builds print a prominent warning summary without blocking -local iteration. <code>gowdk audit</code> remains the explicit report and CI surface: it -prints the full human/JSON report, reads declared <code>*.audit.gwdk</code> policies, -checks frontend risks such as bundle secrets and raw-HTML sinks, can emit -readable standalone runtime tests with <code>gowdk audit --emit-tests</code>, and can run -generated-app runtime tests with <code>gowdk audit --run</code>.</p><h2 id="security-review-triggers">Security Review Triggers</h2><p>Perform a focused security review when adding:</p><ul><li>Authentication or authorization.</li><li>User-generated content.</li><li>Payment, billing, or financial workflows.</li><li>File uploads or downloads.</li><li>Admin operations.</li><li>External webhooks or public APIs.</li><li>Sensitive personal data.</li><li>Session-aware layouts and broader request-time SSR user logic.</li><li>Server fragments that mutate or return user-specific HTML.</li></ul><p>First-slice actions, partials, APIs, SSR guards, layouts, and fragments should -be reviewed against this file before public release.</p><p>Use the <code>security review</code> GitHub label for issues or pull requests that need a -focused security pass before merge or release. The repository threat-model -baseline lives in <code>docs/engineering/security-threat-model.md</code>.</p><h2 id="reporting">Reporting</h2><p>Security reporting policy lives in the repository root <code>SECURITY.md</code>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/engineering/testing/index.html b/docs-site/dist/site/docs/engineering/testing/index.html deleted file mode 100644 index 9605ea35..00000000 --- a/docs-site/dist/site/docs/engineering/testing/index.html +++ /dev/null @@ -1,75 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Testing Strategy - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Testing Strategy - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Testing Strategy - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Engineering</p><h1>Testing Strategy</h1></header><article class="prose"><h2 id="current-status">Current Status</h2><p>Use Go&#39;s standard test runner.</p><h2 id="baseline-expectations">Baseline Expectations</h2><ul><li>Unit tests cover domain logic and pure transformations.</li><li>Integration tests cover persistence, API boundaries, queues, and external service adapters.</li><li>End-to-end tests cover critical user workflows once a UI or API surface exists.</li><li>Regression tests accompany meaningful bug fixes.</li></ul><h2 id="commands">Commands</h2><pre><code class="language-sh">scripts/test-go-modules.sh -scripts/check-root-deps.sh -go test ./... -scripts/vulncheck-go-modules.sh -go build ./cmd/gowdk -node --check editors/vscode/extension.js -node --test editors/vscode/*.test.js -scripts/test-parser-fuzz.sh -scripts/test-generated-app-integration.sh -scripts/test-generated-output-determinism.sh -go build -o /tmp/gowdk-cli ./cmd/gowdk -rm -rf /tmp/gowdk-init &amp;&amp; /tmp/gowdk-cli init /tmp/gowdk-init &amp;&amp; (cd /tmp/gowdk-init &amp;&amp; /tmp/gowdk-cli build) -go run ./cmd/gowdk build --out /tmp/gowdk-build examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -test -f /tmp/gowdk-build/gowdk-routes.json -test -f /tmp/gowdk-build/gowdk-assets.json -test -f /tmp/gowdk-build/openapi.json -test -f /tmp/gowdk-build/asyncapi.json -go test ./cmd/gowdk -</code></pre><p>Use <code>node --check</code> and <code>node --test editors/vscode/*.test.js</code> when editor extension files change or before release-style verification.</p><p>Example commands run from the repository root use the root <code>gowdk.config.go</code>. -Project-level compiler commands must have that file in the working directory or -must pass <code>--config &lt;file&gt;</code>.</p><h2 id="verification-matrix">Verification Matrix</h2><table><thead><tr><th>Area</th><th>Command</th><th>When</th></tr></thead><tbody><tr><td>Go packages</td><td><code>scripts/test-go-modules.sh</code></td><td>Every code change; includes the root module and nested optional adapter modules.</td></tr><tr><td>Root dependency surface</td><td><code>scripts/check-root-deps.sh</code></td><td>Dependency-policy changes, CI, and release-style verification.</td></tr><tr><td>Root Go packages</td><td><code>go test ./...</code></td><td>Core compiler/runtime changes when optional adapter modules are not relevant.</td></tr><tr><td>Go vulnerability scan</td><td><code>scripts/vulncheck-go-modules.sh</code></td><td>Release-style checks and dependency changes.</td></tr><tr><td>CLI build</td><td><code>go build ./cmd/gowdk</code></td><td>CLI, compiler, runtime, addon, or release changes.</td></tr><tr><td>Go formatting</td><td><code>gofmt -w &lt;files&gt;</code></td><td>Changed Go files before handoff.</td></tr><tr><td>Parser fuzz smoke</td><td><code>scripts/test-parser-fuzz.sh</code></td><td>Parser, tokenizer, syntax recovery, and diagnostic recovery changes.</td></tr><tr><td>Generated app integration</td><td><code>scripts/test-generated-app-integration.sh</code></td><td>Generated binary, SSR, action, fragment, CSRF, and contract adapter changes.</td></tr><tr><td>Generated output determinism</td><td><code>scripts/test-generated-output-determinism.sh</code></td><td>Generated HTML, manifest, report, inspect, or route/sitemap output changes.</td></tr><tr><td>VS Code extension syntax</td><td><code>node --check editors/vscode/extension.js</code></td><td>Editor extension changes and broad verification.</td></tr><tr><td>VS Code extension behavior</td><td><code>node --test editors/vscode/*.test.js</code></td><td>Editor extension pure helper changes and broad verification.</td></tr><tr><td>SPA/action examples</td><td><code>go run ./cmd/gowdk check examples/pages/home.page.gwdk examples/actions/newsletter.page.gwdk</code></td><td>Language/tooling changes.</td></tr><tr><td>Init project smoke</td><td><code>go build -o /tmp/gowdk-cli ./cmd/gowdk &amp;&amp; rm -rf /tmp/gowdk-init &amp;&amp; /tmp/gowdk-cli init /tmp/gowdk-init &amp;&amp; (cd /tmp/gowdk-init &amp;&amp; /tmp/gowdk-cli build)</code></td><td>CLI scaffold changes.</td></tr><tr><td>SSR example</td><td><code>go run ./cmd/gowdk check --ssr examples/ssr/dashboard.page.gwdk</code></td><td>SSR validation or example changes.</td></tr><tr><td>Manifest smoke</td><td><code>go run ./cmd/gowdk manifest --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk</code></td><td>Manifest, parser, or CLI output changes.</td></tr><tr><td>SPA build smoke</td><td><code>go run ./cmd/gowdk build --out /tmp/gowdk-build examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk &amp;&amp; test -f /tmp/gowdk-build/gowdk-routes.json &amp;&amp; test -f /tmp/gowdk-build/gowdk-assets.json &amp;&amp; test -f /tmp/gowdk-build/openapi.json &amp;&amp; test -f /tmp/gowdk-build/asyncapi.json</code></td><td>Parser, view, buildgen, component, or CLI build changes.</td></tr><tr><td>Dev loop tests</td><td><code>go test ./cmd/gowdk</code></td><td>Dev mode changes.</td></tr><tr><td>Action redirect smoke</td><td><code>go run ./cmd/gowdk build --out /tmp/gowdk-action-build --app /tmp/gowdk-action-app --bin /tmp/gowdk-action-site examples/actions/signup.page.gwdk</code></td><td>Action parsing or generated action endpoint changes.</td></tr><tr><td>Local serve tests</td><td><code>go test ./cmd/gowdk</code></td><td>CLI serving or option parsing changes.</td></tr><tr><td>Generated app tests</td><td><code>go test ./cmd/gowdk ./internal/appgen</code></td><td>Generated embedded app or binary-serving changes.</td></tr></tbody></table><h2 id="fuzz-integration-and-determinism">Fuzz, Integration, And Determinism</h2><ul><li><code>scripts/test-parser-fuzz.sh</code> is the explicit parser fuzz runner. It defaults -to <code>GOWDK_FUZZTIME=1s</code> for CI smoke cost; use a longer local run such as -<code>GOWDK_FUZZTIME=30s scripts/test-parser-fuzz.sh</code> before risky parser work.</li><li><code>scripts/test-generated-app-integration.sh</code> is the generated-app integration -slice. It builds temporary binaries through <code>internal/appgen</code> tests and -exercises representative request-time flows.</li><li><code>scripts/test-generated-output-determinism.sh</code> is the generated output and -report determinism slice. It compares two clean builds plus manifest, sitemap, -routes, and asset-graph report output.</li></ul><p>Keep these as separate commands so CI can show whether a failure is fuzz input, -runtime integration, or nondeterministic output.</p><h2 id="coverage-priorities">Coverage Priorities</h2><ol><li>Core domain behavior.</li><li>Compiler diagnostics for render modes and addon requirements.</li><li>Manifest generation and route normalization.</li><li>Parser behavior for <code>.gwdk</code> syntax.</li><li>SPA/prerender output and generated route handlers.</li><li>Typed action decoding, validation, CSRF, redirects, and fragments.</li><li>SSR addon routing, guards, <code>server {}</code>, layouts, and errors.</li></ol><h2 id="existing-coverage">Existing Coverage</h2><ul><li><code>internal/compiler</code> tests cover SSR addon enforcement, duplicate page/component/layout identities, layout reference resolution, dynamic SPA routes requiring <code>paths</code>, actions without SSR, and <code>server {}</code> rejection on SPA pages.</li><li><code>internal/discover</code> tests cover recursive <code>.gwdk</code> include/exclude matching.</li><li><code>internal/parser</code> tests cover page/component/layout metadata declarations, <code>paths</code>, <code>build</code>, <code>load</code>, <code>view</code>, <code>props</code>, <code>act</code>, captured <code>paths</code>/<code>build</code>/<code>load</code>/<code>view</code> bodies, the first action input/redirect body subset, and render mode rejection.</li><li><code>internal/viewrender</code> tests cover view markup rendering, escaping, expression attributes, shorthand class/id normalization, component expansion, and missing component/prop errors.</li><li><code>internal/buildgen</code> tests cover app-shell HTML emission, literal build data, -imported Go build data functions, build-data route-param binding, literal -dynamic paths, route and asset manifest output, component expansion, nested -route output paths, and no partial output on unsupported pages.</li><li><code>internal/lang</code> tests cover lexical tokenization, diagnostics, formatting, file checks, and manifest JSON from parsed source files.</li><li><code>internal/lang</code> tests cover site-map JSON for movable page files.</li><li><code>internal/lang</code> golden tests cover the IR-derived manifest JSON render/path/guard/action output.</li><li><code>internal/compiler</code> tests cover route metadata for SPA/SSR routes, endpoint -metadata for actions/APIs, and missing SSR addon rejection.</li><li><code>internal/clientrt</code> tests cover the embedded framework browser runtime source -files, render the placeholder templates, require Node for the client -expression conformance test against <code>internal/clientlang</code>, run <code>node --check</code> -for those <code>.js</code> files when <code>node</code> is available, and run a dependency-free Node -DOM harness for innerHTML and outerHTML swaps.</li><li><code>internal/lsp</code> tests cover initialize, diagnostics, formatting, completion, -hover, component and open-Go go-to-definition, references, semantic tokens, -code actions, shutdown, and exit protocol behavior.</li><li><code>editors/vscode</code> tests cover extension route hierarchy helpers.</li><li><code>cmd/gowdk</code> tests cover <code>build --out</code> writing <code>index.html</code>, expanding a component file, discovering build inputs when explicit paths are omitted, loading literal build config for source/output settings, configured build targets, selected target builds, and local generated-output serving behavior.</li><li><code>cmd/gowdk</code> tests cover dev option parsing, invalid dev intervals, -content-hash input snapshots, snapshot diffs, no-op touch detection, -incremental SPA page rebuild selection, and component-change fallback.</li><li><code>cmd/gowdk</code> and <code>internal/appgen</code> tests cover generated embedded app -source, binary compilation, WASM artifact compilation, live binary HTTP -serving, and first-slice action redirect routing.</li><li>Update the generated app golden with -<code>go test ./internal/appgen -run TestGeneratedGoMatchesGoldenFixture -update</code> -when an intentional generated Go change lands.</li><li><code>internal/buildgen</code> and <code>internal/appgen</code> tests cover preserving unchanged -generated file modification times so local dev loops do not retrigger on -identical output.</li><li><code>internal/buildgen</code> tests cover incremental changed-page rendering, complete -route manifest refreshes, and stale route output cleanup.</li><li><code>internal/project</code> tests cover literal <code>gowdk.config.go</code> parsing for source -discovery, module source groups, build output, and build targets.</li><li>Nested optional adapter modules cover Chi, Echo, Fiber, Gin, Redis Streams, -NATS, and WebSocket integration packages without adding those third-party -dependencies to the root module graph.</li><li><code>internal/parser/fuzz_test.go</code> defines <code>FuzzParseSyntax</code> with page, -component, layout, endpoint, and broken-source seeds.</li><li><code>scripts/test-generated-output-determinism.sh</code> compares generated HTML, -route/asset manifests, OpenAPI/AsyncAPI, build reports, and public report -command output across two clean runs.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/getting-started/index.html b/docs-site/dist/site/docs/getting-started/index.html deleted file mode 100644 index ac20d0a9..00000000 --- a/docs-site/dist/site/docs/getting-started/index.html +++ /dev/null @@ -1,167 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Getting Started - GOWDK</title> - <meta name="description" content="GOWDK can be installed from the latest GitHub release or built from source. The fastest app path is install the CLI, scaffold a small app, build the generated app binary, and run..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Getting Started - GOWDK"> - <meta property="og:description" content="GOWDK can be installed from the latest GitHub release or built from source. The fastest app path is install the CLI, scaffold a small app, build the generated app binary, and run..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Getting Started - GOWDK"> - <meta name="twitter:description" content="GOWDK can be installed from the latest GitHub release or built from source. The fastest app path is install the CLI, scaffold a small app, build the generated app binary, and run..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Start</p><h1>Getting Started</h1><p class="doc-lead">GOWDK can be installed from the latest GitHub release or built from source. The fastest app path is install the CLI, scaffold a small app, build the generated app binary, and run it locally.</p></header><article class="prose"><p>GOWDK can be installed from the latest GitHub release or built from source. The -fastest app path is install the CLI, scaffold a small app, build the generated -app binary, and run it locally.</p><h2 id="prerequisites">Prerequisites</h2><ul><li>Go <code>1.26.4</code> installed and available on <code>PATH</code>.</li><li><code>curl</code> or <code>wget</code> for release installs.</li></ul><h2 id="install-the-cli">Install The CLI</h2><p>Install the latest visible GitHub release:</p><pre><code class="language-sh">curl -fsSL https://raw.githubusercontent.com/cssbruno/GoWDK/main/scripts/install.sh | sh -gowdk version -</code></pre><p>Pin the current CLI release or install into a user-writable directory:</p><pre><code class="language-sh">GOWDK_VERSION=v0.7.0 GOWDK_INSTALL_DIR=&#34;$HOME/.local/bin&#34; \ - sh -c &#34;$(curl -fsSL https://raw.githubusercontent.com/cssbruno/GoWDK/main/scripts/install.sh)&#34; -</code></pre><p>The installer resolves <code>latest</code> from published GitHub releases, downloads the -matching binary for the current OS/architecture, verifies it against the -published <code>checksums.txt</code>, and fails before binary download if that release -does not publish the matching artifact.</p><h2 id="add-gowdk-to-your-shell">Add <code>gowdk</code> To Your Shell</h2><p>If you install into <code>$HOME/.local/bin</code>, make sure that directory is on <code>PATH</code>.</p><p>For zsh:</p><pre><code class="language-sh">mkdir -p &#34;$HOME/.local/bin&#34; -printf &#39;\nexport PATH=&#34;$HOME/.local/bin:$PATH&#34;\n&#39; &gt;&gt; &#34;$HOME/.zshrc&#34; -exec zsh -gowdk version -</code></pre><p>For bash:</p><pre><code class="language-sh">mkdir -p &#34;$HOME/.local/bin&#34; -printf &#39;\nexport PATH=&#34;$HOME/.local/bin:$PATH&#34;\n&#39; &gt;&gt; &#34;$HOME/.bashrc&#34; -exec bash -gowdk version -</code></pre><p>For POSIX login shells:</p><pre><code class="language-sh">mkdir -p &#34;$HOME/.local/bin&#34; -printf &#39;\nexport PATH=&#34;$HOME/.local/bin:$PATH&#34;\n&#39; &gt;&gt; &#34;$HOME/.profile&#34; -. &#34;$HOME/.profile&#34; -gowdk version -</code></pre><p>For fish:</p><pre><code class="language-fish">mkdir -p &#34;$HOME/.local/bin&#34; -fish_add_path &#34;$HOME/.local/bin&#34; -gowdk version -</code></pre><p>For PowerShell:</p><pre><code class="language-powershell">$installDir = &#34;$HOME\.local\bin&#34; -New-Item -ItemType Directory -Force -Path $installDir -[Environment]::SetEnvironmentVariable( - &#34;Path&#34;, - &#34;$installDir;$([Environment]::GetEnvironmentVariable(&#39;Path&#39;, &#39;User&#39;))&#34;, - &#34;User&#34; -) -$env:Path = &#34;$installDir;$env:Path&#34; -gowdk version -</code></pre><p>Direct artifact names:</p><table><thead><tr><th>Platform</th><th>Artifact</th></tr></thead><tbody><tr><td>Linux amd64</td><td><code>gowdk-linux-amd64</code></td></tr><tr><td>Linux arm64</td><td><code>gowdk-linux-arm64</code></td></tr><tr><td>macOS Intel</td><td><code>gowdk-darwin-amd64</code></td></tr><tr><td>macOS ARM</td><td><code>gowdk-darwin-arm64</code></td></tr><tr><td>Windows amd64</td><td><code>gowdk-windows-amd64.exe</code></td></tr></tbody></table><p>Manual Linux install:</p><pre><code class="language-sh">version=v0.7.0 -curl -fsSLO &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/gowdk-linux-amd64&#34; -curl -fsSLO &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/checksums.txt&#34; -grep &#39; gowdk-linux-amd64$&#39; checksums.txt | sha256sum -c - -chmod 0755 gowdk-linux-amd64 -mkdir -p &#34;$HOME/.local/bin&#34; -mv gowdk-linux-amd64 &#34;$HOME/.local/bin/gowdk&#34; -gowdk version -</code></pre><p>Manual macOS Intel install:</p><pre><code class="language-sh">version=v0.7.0 -curl -fsSLO &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/gowdk-darwin-amd64&#34; -curl -fsSLO &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/checksums.txt&#34; -expected=&#34;$(awk &#39;$2 == &#34;gowdk-darwin-amd64&#34; { print $1 }&#39; checksums.txt)&#34; -actual=&#34;$(shasum -a 256 gowdk-darwin-amd64 | awk &#39;{ print $1 }&#39;)&#34; -test &#34;$expected&#34; = &#34;$actual&#34; -chmod 0755 gowdk-darwin-amd64 -mkdir -p &#34;$HOME/.local/bin&#34; -mv gowdk-darwin-amd64 &#34;$HOME/.local/bin/gowdk&#34; -gowdk version -</code></pre><p>Manual macOS ARM install:</p><pre><code class="language-sh">version=v0.7.0 -curl -fsSLO &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/gowdk-darwin-arm64&#34; -curl -fsSLO &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/checksums.txt&#34; -expected=&#34;$(awk &#39;$2 == &#34;gowdk-darwin-arm64&#34; { print $1 }&#39; checksums.txt)&#34; -actual=&#34;$(shasum -a 256 gowdk-darwin-arm64 | awk &#39;{ print $1 }&#39;)&#34; -test &#34;$expected&#34; = &#34;$actual&#34; -chmod 0755 gowdk-darwin-arm64 -mkdir -p &#34;$HOME/.local/bin&#34; -mv gowdk-darwin-arm64 &#34;$HOME/.local/bin/gowdk&#34; -gowdk version -</code></pre><p>Manual Windows install from PowerShell:</p><pre><code class="language-powershell">$version = &#34;v0.7.0&#34; -Invoke-WebRequest &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/gowdk-windows-amd64.exe&#34; -OutFile &#34;gowdk.exe&#34; -Invoke-WebRequest &#34;https://github.com/cssbruno/GoWDK/releases/download/$version/checksums.txt&#34; -OutFile &#34;checksums.txt&#34; -$expected = (Select-String -Path checksums.txt -Pattern &#34;gowdk-windows-amd64.exe&#34;).Line.Split(&#34; &#34;)[0] -$actual = (Get-FileHash .\gowdk.exe -Algorithm SHA256).Hash.ToLower() -if ($expected -ne $actual) { throw &#34;checksum mismatch&#34; } -.\gowdk.exe version -</code></pre><p>Verify a downloaded artifact with GitHub attestations:</p><pre><code class="language-sh">gh attestation verify ./gowdk-linux-amd64 -R cssbruno/GOWDK -</code></pre><p>Install the VS Code extension package from a release when a <code>.vsix</code> is -published:</p><pre><code class="language-sh">code --install-extension gowdk-vscode-0.7.0.vsix -</code></pre><h2 id="build-from-source">Build From Source</h2><pre><code class="language-sh">git clone https://github.com/cssbruno/GOWDK.git -cd GOWDK -go build ./cmd/gowdk -./gowdk version -</code></pre><p>During repository development, you can also run the CLI without installing it:</p><pre><code class="language-sh">go run ./cmd/gowdk version -</code></pre><p>Use the built binary when running commands from outside this repository.</p><p>For focused recipes after the first app, use the -<a href="/docs/cookbook/">Native Cookbook</a>. For command and data contracts, use the -<a href="/docs/reference/">Reference Index</a>. Cookbook/reference coverage gaps are -tracked in the -<a href="/docs/cookbook/#coverage-and-gaps">cookbook coverage table</a>.</p><h2 id="create-an-app">Create An App</h2><p>With <code>gowdk</code> on <code>PATH</code>:</p><pre><code class="language-sh">gowdk init --tests --template site /tmp/gowdk-my-app -cd /tmp/gowdk-my-app -</code></pre><p><code>init --template site</code> writes a starter <code>gowdk.config.go</code>, one page, one -component, and one CSS file. <code>init --template minimal</code> writes a smaller -page/CSS starter. <code>init --tests</code> adds <code>tests/gowdk_smoke_test.go</code>, which skips -unless <code>GOWDK_BIN</code> points at a built <code>gowdk</code> CLI. Existing files are not -overwritten unless <code>--force</code> is passed.</p><p>The generated config discovers <code>src/**/*.gwdk</code>, discovers CSS from -<code>styles/**/*.css</code>, declares a <code>site</code> build target, generates app source in -<code>.gowdk/site</code>, compiles <code>bin/site</code>, and ignores generated outputs in the -scaffolded <code>.gitignore</code>. The target&#39;s intermediate build output is inferred as -<code>.gowdk/output/site</code>.</p><h2 id="build">Build</h2><p>From the app directory:</p><pre><code class="language-sh">gowdk build -</code></pre><p>Run the optional scaffolded smoke test:</p><pre><code class="language-sh">GOWDK_BIN=&#34;$(command -v gowdk)&#34; go test ./tests -</code></pre><p>The build writes app-shell HTML and manifests under <code>.gowdk/output/site</code>, then -embeds that output into <code>bin/site</code>:</p><pre><code class="language-text">.gowdk/output/site/ - index.html - gowdk-routes.json - gowdk-assets.json - gowdk-build-report.json -.gowdk/site/ -bin/site -</code></pre><p>Every successful disk build writes <code>gowdk-build-report.json</code>.</p><h2 id="run">Run</h2><pre><code class="language-sh">./bin/site -</code></pre><p>Open <code>http://127.0.0.1:8080/</code>.</p><p>The generated binary serves embedded frontend output and supported request-time -handlers. For static-only inspection, <code>gowdk serve --dir .gowdk/output/site</code> -still serves the generated directory, but it does not run generated actions, API -handlers, partial fragments, or SSR routes.</p><h2 id="development-loop">Development Loop</h2><p>Use <code>dev</code> for polling rebuilds, local serving, and browser reload:</p><pre><code class="language-sh">gowdk dev -</code></pre><p><code>dev</code> builds into <code>gowdk_cache</code> by default, serves that directory, polls source -inputs for content changes, rebuilds on changes, and injects browser live reload -into served HTML. It keeps serving the last successful build after a failed -rebuild. Pass <code>--out &lt;dir&gt;</code> to use a different dev output directory.</p><p>When you pass <code>--app &lt;dir&gt;</code>, <code>dev</code> builds the generated app, compiles a local -dev binary, runs it on <code>GOWDK_ADDR</code>, and restarts that process after successful -rebuilds. Use this path for local backend, action, API, partial, and SSR flows.</p><p>Use <code>preview</code> for a one-shot local deploy preview:</p><pre><code class="language-sh">gowdk preview -</code></pre><p>Add <code>--hot</code> to run the same preview output through the dev rebuild loop.</p><h2 id="build-repository-examples">Build Repository Examples</h2><p>From the GOWDK repository root:</p><pre><code class="language-sh">go run ./cmd/gowdk build --out /tmp/gowdk-build \ - examples/pages/home.page.gwdk \ - examples/pages/hero.cmp.gwdk - -go run ./cmd/gowdk serve --dir /tmp/gowdk-build -</code></pre><p>The repository root includes <code>gowdk.config.go</code> so these example commands have -the same required project config shape as a scaffolded app. Outside this -repository, run <code>gowdk init</code> first or pass <code>--config &lt;file&gt;</code>.</p><p>For a lesson-by-lesson path through pages, build-time Go data, components, -CSS/assets, actions, validation, CSRF, APIs, fragments, SSR, guards, -database-owned Go code, one-binary deploys, Caddy, diagnostics, tests, -Tailwind, and WASM islands, use the <a href="/docs/learning/native/">Native Learning Path</a>. -For website-style onboarding and hosted execution constraints, use the -<a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a> contract. The -local bridge commands are:</p><pre><code class="language-sh">gowdk playground policy -gowdk playground export --dir . --out /tmp/gowdk-project.zip -</code></pre><p>Dynamic SPA routes work when literal <code>paths {}</code> entries are present:</p><pre><code class="language-sh">go run ./cmd/gowdk build --out /tmp/gowdk-dynamic-build \ - examples/pages/blog-post.page.gwdk -</code></pre><p>This writes <code>/tmp/gowdk-dynamic-build/blog/hello-gowdk/index.html</code> and -<code>/tmp/gowdk-dynamic-build/blog/compile-first/index.html</code>.</p><h2 id="current-reality">Current Reality</h2><p>Implemented today:</p><ul><li>Build output for simple <code>.gwdk</code> pages and components.</li><li>Literal <code>paths {}</code> expansion for dynamic SPA routes.</li><li>Literal <code>build {}</code> data and imported Go build data functions with optional -<code>gowdk.BuildParams</code> route params.</li><li>Config-based discovery, module selection, and named build targets.</li><li>Generated embedded app source, local binaries, and Go <code>js/wasm</code> deploy -artifacts.</li><li>Component-level browser-side Go/WASM island packages with ABI export validation.</li><li>Feature-bound action/API handlers, action redirects, partial action -fragments, standalone fragment routes, CSRF-wired actions, guards, and -concrete or dynamic SSR pages with declared <code>server {}</code> identifier or dotted -paths, plus concrete or dynamic hybrid request-time pages with or without -declared <code>server {}</code> data, in generated binaries.</li><li>CLI tooling for tokens, formatting, validation, manifest, sitemap, routes, -compiler IR inspection, dev, serve, and LSP.</li></ul><p>Planned or partial:</p><ul><li>User-defined domain validation helpers beyond generated request-shape checks.</li><li>Hybrid streaming, data refresh, and non-HTTP revalidation.</li><li>Richer generated-client reactivity beyond explicit reload/fragment outcomes.</li></ul><p>Troubleshooting:</p><ul><li>Missing <code>gowdk.config.go</code>: run commands from an initialized GOWDK app, run -<code>gowdk init</code>, or pass <code>--config &lt;file&gt;</code>.</li><li>Missing Tailwind binary: install Tailwind through your own approved toolchain -and configure <code>tailwind.Options.Command</code>, or remove the Tailwind addon.</li><li>Unsupported Go handler signature: check the action/API docs and use a -supported exported function signature.</li><li>Missing SSR feature: add the SSR addon in config or remove request-time page -behavior such as <code>server {}</code>.</li><li>Generated binary build failure: rerun <code>gowdk build</code> from the app root and -inspect generated app errors under <code>.gowdk/</code>.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/actions/index.html b/docs-site/dist/site/docs/language/actions/index.html deleted file mode 100644 index fbfa813f..00000000 --- a/docs-site/dist/site/docs/language/actions/index.html +++ /dev/null @@ -1,170 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Actions - GOWDK</title> - <meta name="description" content="Actions are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Actions - GOWDK"> - <meta property="og:description" content="Actions are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Actions - GOWDK"> - <meta name="twitter:description" content="Actions are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Actions</h1><p class="doc-lead">Actions are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior.</p></header><article class="prose"><p>Actions are endpoint declarations. A page declares the exported same-package Go -symbol, HTTP method, and endpoint path in <code>.gwdk</code>; normal Go owns the behavior.</p><p>The supported declaration shape is:</p><pre><code class="language-gwdk">package auth - -act Submit POST &#34;/signup&#34; error &#34;/errors/signup.html&#34; -</code></pre><p>Current behavior:</p><ul><li><code>act Submit POST &#34;/signup&#34;</code> binds exactly to exported Go function <code>Submit</code> in -a same-package <code>.go</code> file or default <code>go {}</code> block.</li><li>The optional endpoint-local <code>error</code> suffix selects a generated HTML error -page for action panics before response headers are written. Returned handler -errors still follow normal <code>runtime/response.Response</code> behavior.</li><li>Old <code>act submit { ... }</code> blocks are rejected with a migration diagnostic.</li><li>Actions currently require <code>POST</code>.</li><li>Redirects, fragments, validation, and business rules come from the Go handler -response, not from generated <code>.gwdk</code> action body code.</li><li><code>&lt;form g:post={Submit}&gt;</code> lowers to a standard POST form for a supported -action.</li><li><code>gowdk build --app --bin</code> generates POST handlers for non-dynamic page routes. -If a same-directory Go package exports a matching handler function, the -generated app decodes direct literal fields from same-page <code>g:post</code> forms, -validates supported literal form constraints, calls that function, and writes -its <code>runtime/response.Response</code>.</li><li><code>Submit</code> must use one of the supported signatures: -<code>func(context.Context) (response.Response, error)</code>, -<code>func(context.Context, SignupInput) (response.Response, error)</code>, -<code>func(context.Context, *SignupInput) (response.Response, error)</code>, or -<code>func(context.Context, form.Values) (response.Response, error)</code>.</li><li>In development/default mode, missing or unsupported action handlers are not -build errors. Generated apps return HTTP 501 with a clear message for those -routes.</li><li>In production mode, explicitly declared actions must bind to supported -same-package Go handlers. Missing or unsupported handlers fail the build -unless <code>Build.AllowMissingBackend</code> or <code>--allow-missing-backend</code> is set to -intentionally generate HTTP 501 stubs during a migration.</li><li>Generated first-slice input decoders create a named input wrapper, preserve -repeated submitted values, allow missing fields, and reject unexpected fields -with HTTP 400.</li><li>Generated handlers enforce direct literal <code>required</code>, <code>minlength</code>, -<code>maxlength</code>, and <code>pattern</code> controls for typed action forms when generated -validation is enabled. Normal validation failures return HTTP 422.</li><li>Generated first-slice action error responses use explicit status mapping for -invalid CSRF tokens, invalid forms, oversized requests, and validation -failures, and set <code>Cache-Control: no-store</code>.</li><li>Generated typed action decoders are built from same-package Go type metadata, -then printed as ordinary Go code. They decode exported struct fields using -<code>form:&#34;name&#34;</code> tags first, then Go field names. They ignore <code>form:&#34;-&#34;</code>, reject -unknown user fields through the generated allowlist step, strip generated -runtime fields such as <code>_gowdk_csrf</code>, support <code>string</code>, <code>[]string</code>, <code>bool</code>, -signed integers, and unsigned integers, reject repeated scalar fields, leave -missing or blank numeric/boolean fields as zero values, and return structured -errors without submitted values.</li><li><code>runtime/app</code> exposes backend helpers for generated adapters: -<code>BackendRouter</code>, <code>Action0</code>, <code>ActionForm[T]</code>, <code>ActionFormPtr[T]</code>, -<code>ActionValues</code>, <code>APIHandler</code>, and <code>NotImplemented</code>. These helpers use -<code>context.Context</code> plus <code>app.Request(ctx)</code>, <code>app.Params(ctx)</code>, -<code>app.CSRF(ctx)</code>, <code>app.Session(ctx)</code>, <code>app.Route(ctx)</code>, and -<code>app.Endpoint(ctx)</code> instead of a custom GOWDK context type.</li><li>Generated bound action adapters attach endpoint metadata to the handler -context. User handlers can call <code>app.Endpoint(ctx)</code> to read the generated -endpoint kind, page ID, symbol name, method, and path without importing -generated app code.</li><li>Generated action and API request-time lanes run inside a runtime panic -boundary. A panic before response headers are written becomes a no-store -HTTP 500 response without exposing the panic value. Returned handler errors -use the <code>response.HandlerError</code> status contract, and ordinary 5xx error -details are hidden unless the handler sets an explicit <code>HandlerError.Message</code>.</li><li>Feature packages that declare action handlers may import stable public GOWDK -packages such as <code>runtime/response</code>, <code>runtime/form</code>, and <code>runtime/app</code>; they -must not import generated app packages, generated <code>gowdkapp</code> output, generated -<code>cmd/server</code> code, or build output directories. Generated app source imports -feature packages, never the other way around.</li><li><code>internal/appgen</code> emits the generated action adapter glue used by generated -apps; user action behavior remains in normal same-package Go handlers.</li><li><code>addons/actions.ValidateRequired</code> exposes the same required-field behavior as -a <code>runtime/validation.Result</code> for addon and generated-handler integrations.</li><li><code>addons/actions.NewCSRF</code> provides signed double-submit CSRF tokens with an -HttpOnly, Secure, SameSite=Lax cookie by default. Local HTTP <code>Insecure</code> mode -uses a non-prefixed <code>gowdk-csrf</code> cookie because browsers reject <code>__Host-</code> -cookies without Secure. Normal builds do not expose a no-op CSRF validator; -package tests keep their no-op helper in <code>_test.go</code>.</li><li>Generated action adapters wire CSRF token generation and validation by -default. Generated apps read the signing secret from <code>Build.CSRF.SecretEnv</code> or -<code>GOWDK_CSRF_SECRET</code>, inject a hidden token field into served HTML POST forms, -validate action POSTs before generated decoding or user handlers run, and -return HTTP 403 with <code>invalid csrf token</code> plus <code>Cache-Control: no-store</code> for -missing or invalid tokens. Set <code>Build.CSRF.Disabled: true</code> only for an -intentional non-production/test opt-out.</li><li>Field inference currently reads direct <code>input</code>, <code>textarea</code>, <code>select</code>, and -named submit controls with literal <code>name</code> attributes; fields hidden inside -component calls are not inferred yet.</li><li>User Go handlers that accept <code>form.Values</code> can decode form controls with -runtime helpers: <code>form.Select</code>, <code>form.SelectMultiple</code>, <code>form.Radio</code>, -<code>form.Checkbox</code>, and <code>form.CheckboxGroup</code>. Single checkboxes decode absent as -false and repeated checkbox values are reserved for explicit groups.</li><li>Direct <code>input type=&#34;file&#34;</code> controls and multipart <code>g:post</code> forms are rejected -during generated app action endpoint extraction. Uploads belong in user-owned -API/server handlers where body limits, storage, validation, cleanup, auth, and -logging policy are explicit.</li><li>Actions declared on guarded pages share generated app guard backing with SSR -pages and APIs. <code>auth.Addon</code> supplies <code>auth.required</code> and native RBAC session -guard backing when configured. Custom guards require <code>GOWDKGuardRegistry</code>; -native RBAC guard IDs such as <code>role:admin</code> and <code>permission:posts.write</code> -require <code>GOWDKAuthProvider</code> only without <code>auth.Addon</code>. Missing backing hooks -fail the generated app Go build. -Generated action handlers run guards before CSRF checks, form decoding, and -user handler calls. Treat these as defense-in-depth redundancy for generated -route/page access, never as backend resource authorization. If the page -itself is protected, use request-time page rendering; build-time SPA HTML -cannot enforce frontend page access.</li><li>Form values are not logged.</li></ul><p>The current compiler-generated same-package action binding can decode direct -literal form fields into exported same-package user input structs for supported -typed action signatures and wires generated CSRF by default. Generated -validation failures return HTTP 422 for normal requests; for -partial requests with <code>X-GOWDK-Partial</code> and <code>X-GOWDK-Target</code>, generated handlers -return an escaped <code>runtime/response.ValidationFragment</code> for the target instead. -Generated <code>pattern</code> checks use GOWDK&#39;s anchored form-pattern subset: literals, -<code>.</code>, character classes/ranges, grouping, alternation, common escapes such as -<code>\d</code>, <code>\w</code>, and <code>\s</code>, and <code>*</code>, <code>+</code>, <code>?</code>, <code>{n}</code>, <code>{n,}</code>, and <code>{n,m}</code> -quantifiers. GOWDK does not run user-defined domain validation or generate -general fragment routes. Handlers can return redirects, fragments, HTML, or JSON -through <code>runtime/response.Response</code>.</p><h2 id="examples">Examples</h2><ul><li><code>examples/endpoints/src/endpoints/contact.page.gwdk</code> declares redirect and validation -fragment actions backed by <code>examples/endpoints/src/endpoints/handlers.go</code>.</li><li><code>examples/endpoints/src/endpoints/settings.page.gwdk</code> declares save/reset actions that -return partial fragments for a settings result region.</li></ul><h2 id="production-notes">Production Notes</h2><ul><li>Do not set <code>Build.CSRF.Disabled</code> for production generated app deployments -that accept action POSTs. Provide a stable runtime secret through -<code>Build.CSRF.SecretEnv</code> or <code>GOWDK_CSRF_SECRET</code>.</li><li>Keep authentication, backend authorization, business validation, persistence, -service calls, redirects, HTML, JSON, and fragment decisions in normal Go handlers. -Generated adapters decode the request and write the returned -<code>runtime/response.Response</code>; they do not generate application policy.</li><li>Generated checks only cover direct literal <code>required</code>, <code>minlength</code>, -<code>maxlength</code>, and supported <code>pattern</code> controls in the current <code>view {}</code> -subset. Treat them as request-shape checks, not a substitute for domain -validation in Go. Optional empty fields skip length and pattern checks, -matching browser constraint behavior. Partial validation failures use an -escaped validation fragment so the client runtime can swap the configured -target.</li><li>Direct literal controls can customize those generated request-shape messages -with <code>g:message:required</code>, <code>g:message:minlength</code>, <code>g:message:maxlength</code>, and -<code>g:message:pattern</code>. Each message attribute must be a literal string and must -appear on a control that declares the matching constraint.</li><li><code>runtime/response.ValidationJSON</code> and -<code>runtime/response.ValidationFragment</code> provide reusable patterns for returning -structured validation errors or an escaped live-region fragment for partial -form updates.</li><li>Generated action redirects must stay local. Generated declarations reject -external, protocol-relative, newline-bearing, and backslash-bearing redirect -targets before output. User handlers should also keep redirects local unless -they intentionally implement and audit an external redirect allowlist.</li><li>Generated action, validation, redirect, fragment, invalid-form, oversized -body, missing-handler, unsupported-handler, and invalid-CSRF responses use -<code>Cache-Control: no-store</code>.</li><li>Handler errors are written with <code>runtime/response.HandlerStatus</code>, defaulting -to HTTP 500 when the error does not carry a safer explicit status. Ordinary -5xx responses use generic status text; expose only intentional -client-facing messages through <code>runtime/response.HandlerError.Message</code>.</li><li>File uploads are intentionally not generated by GOWDK actions. Implement -uploads in user-owned API/server handlers with explicit body limits, storage, -validation, cleanup, auth, and logging rules.</li></ul><h2 id="forms">Forms</h2><p>Current form behavior is intentionally narrow and literal-analysis driven:</p><ul><li>Forms post only when they declare <code>g:post={Action}</code> and the action exists on -the same page.</li><li>SPA builds lower <code>g:post</code> to <code>method=&#34;post&#34;</code> and the current concrete page -route.</li><li>Field inference reads direct <code>input</code>, <code>textarea</code>, <code>select</code>, and named submit -controls with literal <code>name</code> attributes.</li><li>When bound Go action input metadata is available, direct literal numeric -<code>&lt;input name=&#34;...&#34;&gt;</code> controls can receive missing browser attributes derived -from integer field types: <code>type=&#34;number&#34;</code>, <code>inputmode=&#34;numeric&#34;</code>, unsigned -<code>min=&#34;0&#34;</code>, and sized integer <code>min</code>/<code>max</code> bounds. Existing author attributes -are preserved.</li><li>Named submit controls such as <code>&lt;button name=&#34;intent&#34; value=&#34;save&#34;&gt;</code> and -<code>&lt;input type=&#34;submit&#34; name=&#34;intent&#34;&gt;</code> are treated as explicit submit-intent -fields before unknown-field rejection. Non-submitting controls such as -<code>type=&#34;button&#34;</code> and <code>type=&#34;reset&#34;</code> are ignored.</li><li>Validation is generated only from direct literal controls with <code>required</code>, -<code>minlength</code>, <code>maxlength</code>, or <code>pattern</code>. Dynamic constraint attributes are -rejected for generated validation metadata. Literal <code>g:message:*</code> attributes -can customize generated validation messages for matching constraints.</li><li>Generated first-slice decoders preserve repeated submitted values, allow -missing fields, reject unexpected fields, and avoid logging form values.</li><li>Generated typed action decoders reject repeated scalar fields and support -repeated values only for <code>[]string</code>.</li><li><code>input type=&#34;file&#34;</code> and multipart <code>g:post</code> forms are rejected; uploads are -user-owned API/server behavior.</li><li>Component-hidden fields are not inferred yet.</li></ul><p>Partial form metadata can be added to a supported action form:</p><pre><code class="language-gwdk">&lt;form g:post={Refresh} g:target=&#34;#patients&#34; g:swap=&#34;innerHTML&#34;&gt; - &lt;input name=&#34;query&#34; /&gt; - &lt;button&gt;Refresh&lt;/button&gt; -&lt;/form&gt; -</code></pre><p><code>g:target</code> must be a literal id selector present in the same direct <code>view {}</code> -markup subset. Current swap modes are <code>innerHTML</code> and <code>outerHTML</code>.</p><p>Future action behavior must define:</p><ul><li>Redirect safety beyond local redirect validation.</li><li>Error response shape and HTTP status mapping for broader generated action -execution.</li></ul><p>For the no-JavaScript baseline, enhanced fragment behavior, invalidation -boundary, and upload ownership rules, see <a href="/docs/language/forms/">forms.md</a>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/api/index.html b/docs-site/dist/site/docs/language/api/index.html deleted file mode 100644 index 33055f31..00000000 --- a/docs-site/dist/site/docs/language/api/index.html +++ /dev/null @@ -1,109 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>API - GOWDK</title> - <meta name="description" content="APIs are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="API - GOWDK"> - <meta property="og:description" content="APIs are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="API - GOWDK"> - <meta name="twitter:description" content="APIs are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>API</h1><p class="doc-lead">APIs are endpoint declarations. A page declares the exported same-package Go symbol, HTTP method, and endpoint path in .gwdk; normal Go owns the behavior.</p></header><article class="prose"><p>APIs are endpoint declarations. A page declares the exported same-package Go -symbol, HTTP method, and endpoint path in <code>.gwdk</code>; normal Go owns the behavior.</p><pre><code class="language-gowdk">package api - -api Health GET &#34;/api/health&#34; error &#34;/errors/api-health.html&#34; -</code></pre><p>Supported methods are <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code>, and <code>DELETE</code>. -The route must be a quoted absolute route path. -Old <code>api health { ... }</code> blocks are rejected with a migration diagnostic.</p><p>Generated apps bind same-package Go handlers for the first API slice. <code>api Health GET &#34;/api/health&#34;</code> maps exactly to exported Go function <code>Health</code> in a -same-package <code>.go</code> file or default <code>go {}</code> block when the function has -signature:</p><pre><code class="language-go">func Health(context.Context, *http.Request) (response.Response, error) -</code></pre><p>Bound API handlers return <code>runtime/response.Response</code>. In development/default -mode, missing or unsupported handlers are not build errors; generated apps -return HTTP 501 for those routes with a clear message.</p><p>In production mode, explicitly declared APIs must bind to supported -same-package Go handlers. Missing or unsupported handlers fail the build unless -<code>Build.AllowMissingBackend</code> or <code>--allow-missing-backend</code> is set to intentionally -generate HTTP 501 stubs during a migration.</p><p>Feature packages that declare API handlers may import stable public GOWDK -packages such as <code>runtime/response</code> and <code>runtime/app</code>; they must not import -generated app packages, generated <code>gowdkapp</code> output, generated <code>cmd/server</code> -code, or build output directories. Generated app source imports feature -packages, never the other way around.</p><h2 id="handler-helpers">Handler Helpers</h2><p>API handlers can use <code>github.com/cssbruno/gowdk/addons/api</code> for the current -public helper contract:</p><pre><code class="language-go">package api - -import ( - &#34;context&#34; - &#34;net/http&#34; - - gowdkapi &#34;github.com/cssbruno/gowdk/addons/api&#34; - &#34;github.com/cssbruno/gowdk/runtime/response&#34; -) - -type CreatePatientInput struct { - Name string `json:&#34;name&#34;` -} - -func CreatePatient(ctx context.Context, request *http.Request) (response.Response, error) { - input, err := gowdkapi.DecodeJSON[CreatePatientInput](request) - if err != nil { - return gowdkapi.Error(http.StatusBadRequest, &#34;invalid_json&#34;, &#34;Invalid JSON body&#34;) - } - - active, ok, err := gowdkapi.QueryBool(request, &#34;active&#34;) - if err != nil { - return gowdkapi.Error(http.StatusBadRequest, &#34;invalid_query&#34;, &#34;Invalid query&#34;) - } - _ = input - _ = active - _ = ok - - return gowdkapi.JSON(http.StatusCreated, map[string]any{&#34;ok&#34;: true}) -} -</code></pre><p><code>DecodeJSON[T]</code> decodes the capped request body into <code>T</code>, accepts -<code>application/json</code> and <code>+json</code> content types, rejects unknown object fields, -rejects trailing JSON values, and rejects an empty or non-JSON <code>Content-Type</code>.</p><p>Query helpers read from <code>request.URL.Query()</code>:</p><ul><li><code>QueryString(request, name) (string, bool)</code></li><li><code>QueryStrings(request, name) []string</code></li><li><code>QueryBool(request, name) (bool, bool, error)</code></li><li><code>QueryInt(request, name) (int, bool, error)</code></li><li><code>QueryInt64(request, name) (int64, bool, error)</code></li></ul><p>Response helpers return <code>runtime/response.Response</code>:</p><ul><li><code>JSON(status, value)</code> marshals a JSON response.</li><li><code>Error(status, code, message)</code> returns <code>{ &#34;ok&#34;: false, &#34;error&#34;: ... }</code>.</li><li><code>NoContent()</code> returns a 204 response.</li></ul><p>Generated bound API adapters attach endpoint metadata to the handler context. -Handlers can call <code>app.Endpoint(ctx)</code> from <code>runtime/app</code> to read the generated -endpoint kind, page ID, symbol name, method, path, and optional generated error -page.</p><p>The optional endpoint-local <code>error</code> suffix selects a generated HTML error page -for API panics before response headers are written. Returned handler errors -still follow normal <code>runtime/response.Response</code> behavior.</p><h2 id="examples">Examples</h2><p><code>examples/endpoints/src/endpoints/api.page.gwdk</code> declares session, search, JSON CRUD, and -webhook endpoints. <code>examples/endpoints/src/endpoints/handlers.go</code> keeps validation, JSON -decoding, response shape, and webhook policy in normal Go handlers.</p><p>APIs declared on guarded pages share generated app guard backing with SSR pages -and actions. <code>auth.Addon</code> supplies <code>auth.required</code> and native RBAC session guard -backing when configured. Custom guards require <code>GOWDKGuardRegistry</code>; native RBAC -guard IDs such as <code>role:admin</code> and <code>permission:reports.read</code> require -<code>GOWDKAuthProvider</code> only without <code>auth.Addon</code>. Missing backing hooks fail the -generated app Go build. -Generated API handlers run guards before user handler calls. Treat these as -defense-in-depth redundancy for generated route/page access, never as backend -resource authorization. If the page itself is protected, use request-time page -rendering; build-time SPA HTML cannot enforce frontend page access.</p><h2 id="production-notes">Production Notes</h2><ul><li>API handlers own authentication, backend authorization, domain validation, -storage, service calls, and response shape in normal Go.</li><li><code>addons/api</code> helpers cover strict JSON body decoding, typed query access, and -JSON response envelopes without requiring framework-specific adapters.</li><li>Bound API handlers return <code>runtime/response.Response</code>; generated adapters -only dispatch by method/path, call the handler, and write the returned -response.</li><li>Generated API responses and generated API error responses use -<code>Cache-Control: no-store</code> in the current first slice.</li><li>Generated API adapters dispatch only the declared HTTP method/path pair; -unsupported methods do not call user handlers.</li><li>Handler errors are written with <code>runtime/response.HandlerStatus</code>, defaulting -to HTTP 500 when the error does not carry an explicit status. Ordinary 5xx -responses use generic status text; expose only intentional client-facing -messages through <code>runtime/response.HandlerError.Message</code>.</li><li>Missing or unsupported generated API bindings return HTTP 501 only in -development/default mode or when an explicit missing-backend migration flag is -set.</li><li>Generated state-changing API endpoints validate the generated CSRF token by -default. Browser clients must send the token in the configured CSRF header -such as <code>X-GOWDK-CSRF</code>; non-browser API designs can opt out with -<code>Build.CSRF.Disabled</code> only when they enforce another cross-site request -strategy.</li></ul><p>Future API behavior must define:</p><ul><li>Authentication and authorization hooks.</li><li>Generated typed handler signatures beyond -<code>func(context.Context, *http.Request) (response.Response, error)</code>.</li><li>Per-route body/query/result contracts and route-param accessors.</li><li>CORS policy and richer content negotiation.</li><li>Interaction with SPA/action pages without full-page SSR.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/audit/index.html b/docs-site/dist/site/docs/language/audit/index.html deleted file mode 100644 index dd13c3db..00000000 --- a/docs-site/dist/site/docs/language/audit/index.html +++ /dev/null @@ -1,82 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Audit Policy Files - GOWDK</title> - <meta name="description" content=".audit.gwdk files declare security policy and runtime audit expectations. They are discovered with normal .gwdk inputs, lowered into IR, and consumed by gowdk audit; they do not..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Audit Policy Files - GOWDK"> - <meta property="og:description" content=".audit.gwdk files declare security policy and runtime audit expectations. They are discovered with normal .gwdk inputs, lowered into IR, and consumed by gowdk audit; they do not..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Audit Policy Files - GOWDK"> - <meta name="twitter:description" content=".audit.gwdk files declare security policy and runtime audit expectations. They are discovered with normal .gwdk inputs, lowered into IR, and consumed by gowdk audit; they do not..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Audit Policy Files</h1><p class="doc-lead">.audit.gwdk files declare security policy and runtime audit expectations. They are discovered with normal .gwdk inputs, lowered into IR, and consumed by gowdk audit; they do not generate pages, routes, or browser assets.</p></header><article class="prose"><p><code>*.audit.gwdk</code> files declare security policy and runtime audit expectations. -They are discovered with normal <code>.gwdk</code> inputs, lowered into IR, and consumed by -<code>gowdk audit</code>; they do not generate pages, routes, or browser assets.</p><pre><code class="language-gwdk">package security - -policy admin extends &#34;baseline.frontend&#34; { - match &#34;frontend&#34; - require header &#34;Content-Security-Policy&#34; - deny raw_html -} - -policy admin_routes { - match &#34;/admin/**&#34; - require guard &#34;role:admin&#34; -} - -test headers { - expect header &#34;Content-Security-Policy&#34; &#34;default-src &#39;self&#39;&#34; -} - -test admin_denied { - expect GET &#34;/admin&#34; as &#34;anonymous&#34; status 403 -} -</code></pre><h2 id="policies">Policies</h2><p>Use <code>policy &lt;name&gt; {}</code> for a named policy. A policy can extend one or more -other policies:</p><pre><code class="language-gwdk">policy browser_hardening extends &#34;baseline.frontend&#34; { - match &#34;frontend&#34; - require header &#34;X-Frame-Options&#34; -} -</code></pre><p>Selectors are string literals:</p><ul><li>Route globs: <code>&#34;/admin/**&#34;</code>, <code>&#34;/settings/*&#34;</code>, or <code>&#34;/&#34;</code>.</li><li>Endpoint selectors: <code>&#34;act:*&#34;</code>, <code>&#34;api:*&#34;</code>, <code>&#34;fragment:*&#34;</code>, <code>&#34;command:*&#34;</code>, -and <code>&#34;query:*&#34;</code>.</li><li>Frontend selector: <code>&#34;frontend&#34;</code>.</li></ul><p><code>match &#34;&lt;selector&gt;&#34;</code> and <code>apply to &#34;&lt;selector&gt;&#34;</code> are equivalent.</p><h2 id="rules">Rules</h2><p>Supported rule forms:</p><pre><code class="language-gwdk">require csrf -require guard &#34;role:admin&#34; -require header &#34;Content-Security-Policy&#34; -require max_body &#34;256kb&#34; -require no_secrets_in_bundle -deny public -deny raw_html -allow raw_html &#34;home:body&#34; -</code></pre><p>Add <code>as &lt;diagnostic-code&gt;</code> to override the finding code for a rule:</p><pre><code class="language-gwdk">require guard &#34;permission:patients.read&#34; as &#34;audit_required_guard_missing&#34; -</code></pre><p>Raw HTML allowlist values match either the exact source reference reported by -<code>gowdk audit</code> or <code>&lt;ownerId&gt;:&lt;field&gt;</code>.</p><h2 id="tests">Tests</h2><p><code>test {}</code> blocks become generated Go tests. <code>gowdk audit --emit-tests</code> writes a -readable standalone <code>gowdk_audit_test.go</code>; <code>gowdk audit --run</code> builds a -temporary generated app and runs its generated <code>gowdkapp/gowdk_audit_test.go</code> -with <code>go test ./gowdkapp</code>.</p><p>Supported expectations:</p><pre><code class="language-gwdk">expect GET &#34;/dashboard&#34; status 403 -expect GET &#34;/dashboard&#34; as &#34;role:admin&#34; status 200 -expect header &#34;X-Frame-Options&#34; &#34;DENY&#34; -</code></pre><p>Status expectations drive the handler through <code>runtime/testkit</code>. Header -expectations check the runtime health endpoint so header policy can be verified -without depending on a specific page route.</p><p>Actor expectations (<code>as &#34;role:...&#34;</code> / <code>as &#34;permission:...&#34;</code>) require the -generated-app audit test that <code>gowdk build --app</code> emits or <code>gowdk audit --run</code> -runs, because only that test exercises the real guard pipeline. The standalone -file from <code>gowdk audit --emit-tests</code> models static serving, default-deny, and -headers but installs no auth provider, so it rejects actor expectations rather -than pass or fail them for the wrong reason.</p><p>For <code>gowdk audit --run</code>, native RBAC actor expectations use a test-only provider -inside the temporary generated app. Production generated apps use <code>auth.Addon</code> -defaults when configured, or the app-owned <code>GOWDKAuthProvider</code> / -<code>GOWDKGuardRegistry</code> hooks documented for guarded routes.</p><h2 id="built-in-baseline">Built-In Baseline</h2><p><code>gowdk audit</code> always composes declared policies with the built-in baseline. -Built-in policy names include:</p><ul><li><code>&#34;baseline.actions&#34;</code></li><li><code>&#34;baseline.fragments&#34;</code></li><li><code>&#34;baseline.api&#34;</code></li><li><code>&#34;baseline.contract_commands&#34;</code></li><li><code>&#34;baseline.contract_queries&#34;</code></li><li><code>&#34;baseline.frontend&#34;</code></li></ul><p>A declared policy with the same name intentionally replaces that built-in slice. -Otherwise declared policies are appended and can extend the built-ins.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/blocks/index.html b/docs-site/dist/site/docs/language/blocks/index.html deleted file mode 100644 index 7d564f8c..00000000 --- a/docs-site/dist/site/docs/language/blocks/index.html +++ /dev/null @@ -1,167 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Blocks - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Blocks - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Blocks - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Blocks</h1></header><article class="prose"><h2 id="current-support">Current Support</h2><p>The parser records whether these top-level blocks are present:</p><ul><li><code>paths {}</code>: declares dynamic SPA paths. Presence and raw body -text are recorded. SPA builds support the first literal subset: -<code>=&gt; { slug: &#34;hello-gowdk&#34; }</code>. Other statement forms are rejected with a -<code>parse_error</code> diagnostic instead of running arbitrary build-time code.</li><li><code>build {}</code>: build-time data block. Presence and raw body text are recorded. -SPA builds support the first literal subset, <code>=&gt; { title: &#34;Hello&#34; }</code>, and -the first imported or same-package Go function subset, -<code>=&gt; interop.FeaturedCopyForBuild()</code> or <code>=&gt; FeaturedCopyForBuild()</code>. The Go -function can return <code>T</code> or <code>(T, error)</code> and can optionally accept one -<code>gowdk.BuildParams</code> argument for dynamic <code>paths {}</code> route params. Other -statement forms are rejected with a <code>parse_error</code> diagnostic; arbitrary -build-time statements remain planned.</li><li><code>server {}</code>: request-time data block. Presence and raw body text are recorded, -then rejected on SPA/action pages.</li><li><code>go {}</code> and <code>go target {}</code>: optional inline Go authoring blocks. -Presence, target, raw body text, and source span are recorded. Default -<code>go {}</code> can provide build-data functions called by -<code>build { =&gt; LocalFunc() }</code> and same-page action, API, or fragment handlers. -Page-level <code>go client {}</code> can opt into client-side execution by exporting -<code>GOWDKMount&lt;PageID&gt;</code> with -<code>//go:wasmexport</code>; GOWDK compiles that Go block to browser Go WASM and emits a -page loader. <code>go server {}</code> can provide generated SSR load handlers. -Configured addons that implement <code>gowdk.GoBlockConsumer</code> can validate -<code>go addon.&lt;name&gt; {}</code> blocks and emit generated app Go files.</li><li><code>view {}</code>: markup render block. Presence and body text are recorded.</li><li><code>style {}</code>: CSS render block for the same page, component, or layout. -Presence and body text are recorded, then emitted through generated CSS -assets.</li></ul><p>Actions and APIs are endpoint declarations, not blocks:</p><pre><code class="language-gwdk">act Submit POST &#34;/submit&#34; -api Health GET &#34;/api/health&#34; -</code></pre><h2 id="time-boundaries">Time Boundaries</h2><ul><li><code>paths {}</code> and <code>build {}</code> are build-time concepts.</li><li>Page-level Go imports used by <code>build {}</code> run at build time with the local Go -toolchain.</li><li>Build-time Go function calls can use an explicit imported alias such as -<code>interop.FeaturedCopyForBuild()</code> or a bare same-package function such as -<code>FeaturedCopyForBuild()</code> when the page directory is a buildable Go package. -Dynamic <code>paths {}</code> output passes route params into helpers that declare one -<code>gowdk.BuildParams</code> argument.</li><li><code>server {}</code> is request-time behavior and must not make SPA pages implicitly SSR.</li><li><code>go {}</code> is parsed as Go and can run static build-time helpers for -<code>build {}</code>. Saved default <code>go {}</code> blocks are also type-checked with -sibling Go files in the same package during validation. Generated apps can -bind supported same-page action, API, and fragment handlers from default -<code>go {}</code> when no same-package <code>.go</code> handler exists. A page-level -<code>go client {}</code> runs on the client only when it -declares a <code>//go:wasmexport GOWDKMount&lt;PageID&gt;</code> function; that browser lane is -compiled with <code>GOOS=js GOARCH=wasm</code> and mounted by the generated page loader. -<code>go server {}</code> is -request-time and requires SSR or explicit hybrid request-time behavior; -current generated apps can bind <code>Load&lt;PageID&gt;</code> from <code>go server {}</code>. -Generated app source writes default <code>go {}</code> and <code>go server {}</code> blocks as -normal Go packages under <code>gowdk_go/</code>. <code>go addon.&lt;name&gt; {}</code> -is reserved for addon-owned validation and generated app file emission.</li><li><code>act</code> and <code>api</code> endpoint declarations describe request handlers that should -work without full-page SSR. Normal Go handlers own behavior and return -<code>runtime/response.Response</code>.</li><li><code>view {}</code> renders markup for spa, action, partial, and SSR output.</li></ul><h2 id="style-blocks">Style Blocks</h2><p>Declare CSS close to markup with a sibling <code>style {}</code> block:</p><pre><code class="language-gwdk">view { - &lt;main class=&#34;hero&#34;&gt; - &lt;h1&gt;GOWDK&lt;/h1&gt; - &lt;/main&gt; -} - -style { - .hero { - color: red; - } -} -</code></pre><p>The style block is not rendered as markup. GOWDK emits it through the generated -CSS asset pipeline:</p><ul><li>Page styles are appended to the page CSS asset.</li><li>Component styles are emitted as scoped component CSS.</li><li>Layout styles are linked only by pages that declare the layout.</li></ul><h2 id="go-blocks">Go Blocks</h2><p>Use a default <code>go {}</code> block for colocated build-time Go helpers:</p><pre><code class="language-gwdk">import strings &#34;strings&#34; - -build { - =&gt; HomePageForBuild() -} - -go { -type PageCopy struct { - Title string `json:&#34;title&#34;` - Slug string `json:&#34;slug&#34;` -} - -func HomePageForBuild() PageCopy { - title := &#34;GOWDK ships apps&#34; - return PageCopy{ - Title: title, - Slug: strings.ToLower(strings.ReplaceAll(title, &#34; &#34;, &#34;-&#34;)), - } -} -} - -view { - &lt;h1&gt;{title}&lt;/h1&gt; -} - -style { - h1 { color: #0f766e; } -} -</code></pre><p>The compiler parses the go block body as Go and runs the referenced build-data -function during build. Dynamic <code>paths {}</code> output can pass one -<code>gowdk.BuildParams</code> argument. Returned JSON object fields become build data.</p><p>When generated app source is emitted, default <code>go {}</code> blocks are also written -under <code>gowdk_go/&lt;package&gt;/go.go</code> so <code>go test ./...</code> in the generated app can -type-check them as normal Go packages. GOWDK does not write extracted files -beside the user&#39;s source files.</p><p>Use <code>go server {}</code> for colocated SSR load handlers:</p><pre><code class="language-gwdk">import ssr &#34;github.com/cssbruno/gowdk/addons/ssr&#34; - -server { - =&gt; { user.name } -} - -go server { -func LoadDashboard(ctx ssr.LoadContext) (map[string]any, error) { - return map[string]any{ - &#34;user&#34;: map[string]any{&#34;name&#34;: &#34;Ada&#34;}, - }, nil -} -} -</code></pre><p>Generated apps emit the SSR go block as normal Go under <code>gowdk_go/</code> in the -generated app module and call it through the same load-handler adapter used for -separate <code>.go</code> files.</p><p>Use a page-level <code>go client {}</code> mount when the page needs client-side Go:</p><pre><code class="language-gwdk">page home &#34;/&#34; - -go client { -import &#34;syscall/js&#34; - -//go:wasmexport GOWDKMountHome -func GOWDKMountHome() uint32 { - document := js.Global().Get(&#34;document&#34;) - button := document.Call(&#34;querySelector&#34;, &#34;#refresh&#34;) - button.Call(&#34;addEventListener&#34;, &#34;click&#34;, js.FuncOf(func(js.Value, []js.Value) any { - document.Call(&#34;querySelector&#34;, &#34;#status&#34;).Set(&#34;textContent&#34;, &#34;mounted&#34;) - return nil - })) - return 0 -} -} - -view { - &lt;button id=&#34;refresh&#34;&gt;Refresh&lt;/button&gt; - &lt;p id=&#34;status&#34;&gt;&lt;/p&gt; -} - -style { - button { font: inherit; } -} -</code></pre><p>For page <code>home</code>, the required browser mount export is <code>GOWDKMountHome</code>. -GOWDK emits <code>assets/gowdk/islands/pages/Home.wasm</code>, -<code>assets/gowdk/islands/pages/Home.wasm.js</code>, and Go&#39;s <code>wasm_exec.js</code> runtime. -Without that <code>//go:wasmexport</code> mount, <code>go client {}</code> is validated as Go but no -browser WASM asset is emitted.</p><p>Use <code>go addon.&lt;name&gt; {}</code> when a configured addon owns the target:</p><pre><code class="language-gwdk">go addon.contracts { -func AuditSignup() string { - return &#34;signup&#34; -} -} -</code></pre><p>The compiler passes those blocks to the matching addon only when it implements -<code>gowdk.GoBlockConsumer</code>. The addon decides accepted targets, diagnostics, and -which generated app files to emit. Addon go block files are formatted when they -are Go files. If the addon is not configured, the compiler reports an -<code>unknown_addon_go_block_target</code> diagnostic. If the addon is configured but does -not implement <code>GoBlockConsumer</code> or does not accept the exact target, the -compiler reports <code>unsupported_addon_go_block_target</code>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/components/index.html b/docs-site/dist/site/docs/language/components/index.html deleted file mode 100644 index 83ada4e4..00000000 --- a/docs-site/dist/site/docs/language/components/index.html +++ /dev/null @@ -1,333 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Components - GOWDK</title> - <meta name="description" content="The first component slice is implemented for SPA build output."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Components - GOWDK"> - <meta property="og:description" content="The first component slice is implemented for SPA build output."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Components - GOWDK"> - <meta name="twitter:description" content="The first component slice is implemented for SPA build output."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Components</h1><p class="doc-lead">The first component slice is implemented for SPA build output.</p></header><article class="prose"><p>The first component slice is implemented for SPA build output.</p><p>Implemented today:</p><ul><li>Explicit or discovered <code>.cmp.gwdk</code> build inputs with <code>component Name</code>.</li><li>Optional <code>props { name string }</code> declarations, including scalar default -literals such as <code>props { count int = 0 }</code>.</li><li>Inline scalar props with <code>string</code>, <code>int</code>, <code>float</code>, and <code>bool</code> types.</li><li>Component-local Go imports using normal module import paths, such as -<code>import ui &#34;github.com/acme/app/ui&#34;</code>.</li><li>Typed props contracts that reference imported Go structs, such as -<code>props ui.CounterProps</code>.</li><li>Typed state contracts that reference imported Go structs and a no-argument -init function, such as <code>state ui.CounterState = ui.NewCounterState()</code>.</li><li>Typed exports metadata blocks such as <code>exports { selectedID string }</code>.</li><li>Typed emits metadata blocks such as <code>emits { select(id string) }</code>.</li><li>One <code>view {}</code> block per component.</li><li>Self-closing component calls such as <code>&lt;Hero title=&#34;GOWDK&#34; /&gt;</code>.</li><li>Wrapper component calls such as <code>&lt;Panel&gt;...&lt;/Panel&gt;</code> with child content -rendered into <code>&lt;slot /&gt;</code> in the component view.</li><li>Named slots with caller-side <code>&lt;template g:slot=&#34;name&#34;&gt;...&lt;/template&gt;</code> and -component-side <code>&lt;slot name=&#34;name&#34;&gt;fallback&lt;/slot&gt;</code>.</li><li>Scalar scoped slots with component-side slot props and caller-side <code>let:</code> -bindings, for example <code>&lt;slot name=&#34;item&#34; label={Title} /&gt;</code> consumed by -<code>&lt;template g:slot=&#34;item&#34; let:label&gt;...&lt;/template&gt;</code>.</li><li>Page-level cross-package component imports with -<code>use ui &#34;components&#34;</code> and qualified calls such as <code>&lt;ui.Hero /&gt;</code>.</li><li>Component-scoped cross-package component imports with local aliases such as -<code>use icons &#34;icons&#34;</code> and <code>&lt;icons.Badge /&gt;</code> inside the declaring component.</li><li>Escaped <code>{prop}</code> text and attribute interpolation inside component views.</li><li>Component prop values can interpolate page build data, such as a route param -from literal <code>paths {}</code>.</li><li>Slot children render in the caller scope, so page build data and route params -used inside the child content are resolved before being inserted into the -component slot. Scoped slot values are injected into that caller scope for -the slot body.</li><li>A component with <code>state ...</code> renders initial state at build time and emits a -generated JavaScript island by default when called without <code>g:island</code>.</li><li>Component-local <code>client { func Name(...) { ... } }</code> handlers can group the -current safe typed expression subset and be called from <code>g:on:*</code> with scalar -expressions, such as <code>Add(Count + 1)</code>. The older <code>fn Name(...)</code> spelling -remains accepted.</li><li>Components can dispatch declared events from <code>client {}</code> handlers with -<code>emit name(Field)</code>. Parent components can listen on component calls with -<code>g:on:name={...}</code> and receive typed event fields through the compiler-owned -<code>event</code> scope.</li><li>Component-local <code>computed Name Type { return expr }</code> values can derive -read-only browser state from props, state, and other computed values. -Computed values may also use one Go-style <code>if</code> return followed by a fallback -return. The compiler orders computed values by dependency and rejects cycles.</li><li>Pages can declare first-slice page-scoped stores with -<code>store cart ui.CartState = ui.NewCartState()</code>. Component <code>client {}</code> blocks -can declare explicit dependencies with <code>use cart</code>; the compiler validates -store type/init contracts and rejects unknown store uses. Runtime shared-state -subscriptions are still planned.</li><li>A component can declare <code>wasm ./browser/counter</code> to compile a browser-side -Go package and make normal calls to that component use the WASM island -runtime by default. The package is built with -<code>GOOS=js GOARCH=wasm</code>, must produce a real browser WASM module, and must not -import server/process/network packages such as <code>net/http</code>, <code>os/exec</code>, -<code>database/sql</code>, raw <code>syscall</code>, <code>plugin</code>, or <code>unsafe</code>.</li><li>A component call can explicitly request the WASM island artifact with -<code>&lt;Counter g:island=&#34;wasm&#34; /&gt;</code> when a call-site override is needed. If the -component has no <code>wasm</code> package, GOWDK still emits the first-slice -placeholder module plus loader shape for that explicit call.</li><li>Duplicate component names are rejected within the same GOWDK package during -compiler validation. Components in different packages may share a name and -must be referenced through the calling package&#39;s <code>use</code> alias.</li><li>Redundant component implementations are rejected during compiler validation -with <code>redundant_component_implementation</code>, even when their names differ.</li><li>Component <code>css</code> declarations are parsed, lowered into compiler metadata, -emitted as scoped component CSS, linked from generated pages, content-hashed, -manifest-mapped, and served with immutable cache headers. Component <code>asset</code> -declarations are emitted as content-hashed files under -<code>assets/gowdk/components/&lt;package&gt;/&lt;component&gt;/</code>, manifest-mapped, and served -with immutable cache headers.</li><li>Component <code>js &#34;./file.js&#34;</code> and <code>js &#34;./file.ts&#34;</code> declarations emit scoped -browser module files and link them only from pages that call that component. -Inline <code>js {}</code> blocks are supported for small cases, but path-based modules -are preferred. GOWDK transforms TypeScript without type-checking and does not -yet bundle or follow JavaScript imports.</li><li>Component files are compiler inputs, not Go imports. A page can call a -same-package component by name, such as <code>&lt;Hero /&gt;</code>, when that component file -is part of the same build/module input set. Cross-package page calls must use -a GOWDK source import and qualified component tag:</li></ul><pre><code class="language-gwdk">package pages - -use ui &#34;components&#34; - -view { - &lt;main&gt;&lt;ui.Hero title=&#34;GOWDK&#34; /&gt;&lt;/main&gt; -} -</code></pre><p>The quoted <code>use</code> target is a discovered <code>.gwdk</code> package name, not a Go import -path. Imported components can call sibling components in their own package by -bare name inside the component body. Components can also declare their own -scoped <code>use</code> aliases for qualified child component calls:</p><pre><code class="language-gwdk">package marketing - -use icons &#34;icons&#34; - -component Hero - -view { - &lt;section&gt;&lt;icons.Badge /&gt;&lt;/section&gt; -} -</code></pre><h2 id="examples">Examples</h2><p>Default slot:</p><pre><code class="language-gwdk">component Card - -view { - &lt;section&gt;&lt;slot /&gt;&lt;/section&gt; -} -</code></pre><p>Named slot:</p><pre><code class="language-gwdk">component Panel - -view { - &lt;section&gt; - &lt;header&gt;&lt;slot name=&#34;actions&#34;&gt;&lt;span&gt;No actions&lt;/span&gt;&lt;/slot&gt;&lt;/header&gt; - &lt;slot /&gt; - &lt;/section&gt; -} -</code></pre><p>Scoped slot:</p><pre><code class="language-gwdk">component Row - -props { - label string - count int = 0 - active bool = false -} - -view { - &lt;slot name=&#34;item&#34; value={label} /&gt; -} -</code></pre><pre><code class="language-gwdk">view { - &lt;Row label=&#34;Ada&#34;&gt; - &lt;template g:slot=&#34;item&#34; let:value&gt; - &lt;strong&gt;{value}&lt;/strong&gt; - &lt;/template&gt; - &lt;/Row&gt; -} -</code></pre><p>Typed emits:</p><pre><code class="language-gwdk">component Option - -props { - ID string -} - -emits { - select(id string) -} - -client { - fn Pick() { - emit select(ID) - } -} -</code></pre><p>Bindable child state is not a stable public contract. Use typed emits plus -parent-owned state instead:</p><pre><code class="language-gwdk">view { - &lt;Option g:on:select={SelectedID = event.id} /&gt; -} -</code></pre><p>Typed exports declare local component values that a parent can observe through -the generated <code>exports</code> event:</p><pre><code class="language-gwdk">exports { - SelectedID string -} - -view { - &lt;button g:on:click={SelectedID = &#34;first&#34;}&gt;{SelectedID}&lt;/button&gt; -} -</code></pre><p>Parent components can listen with <code>g:on:exports</code>:</p><pre><code class="language-gwdk">view { - &lt;Picker g:on:exports={CurrentID = event.SelectedID} /&gt; -} -</code></pre><p>Stores are explicit page-scoped UI state:</p><pre><code class="language-gwdk">route &#34;/cart&#34; -guard public - -store cart ui.CartState = ui.NewCartState() -</code></pre><pre><code class="language-gwdk">component CartButton - -client { - use cart -} -</code></pre><h3 id="wasm-islands">WASM Islands</h3><p>WASM islands are declared on the component:</p><pre><code class="language-gwdk">component Counter -wasm ./browser/counter - -view { - &lt;button&gt;Count&lt;/button&gt; -} -</code></pre><p>See <code>examples/components/wasm/</code> for a runnable component-level WASM island ABI -example with the required browser Go exports.</p><pre><code class="language-gwdk">view { - &lt;Counter /&gt; -} -</code></pre><h2 id="component-contract">Component Contract</h2><p>Component files are GOWDK compiler inputs. They are not imported by Go code and -must not import generated app output. Go <code>import</code> declarations inside <code>.gwdk</code> -files import normal Go packages for typed contracts and build-time helpers. -GOWDK <code>use</code> declarations import discovered <code>.gwdk</code> source packages; today that -contract is implemented for qualified component calls.</p><p>Props are caller-provided inputs. Inline <code>props {}</code> declarations support scalar -<code>string</code>, <code>int</code>, <code>float</code>, and <code>bool</code> types. Parent calls pass quoted string -props, scalar literal expressions for numbers and booleans, or expression -values from the implemented build-data subset. Props are read-only to -<code>client {}</code> code; mutable browser state belongs in <code>state</code> or in an explicit -page store.</p><p>Imported Go structs are the stable typed prop path for richer contracts. -Inline props can declare static scalar defaults with <code>name type = literal</code>. -Defaults are used when a caller omits the prop and are overridden by explicit -caller values.</p><p>Advanced prop forwarding stays inside the typed compiler contract:</p><ul><li><code>{...props}</code> may be used inside a component that declares props. It forwards -only same-named props that the child component also declares; it does not -expose an arbitrary prop bag or global lookup.</li><li><code>target:source</code> maps a differently named caller prop into a declared child -prop. Without a value, <code>target:source</code> forwards <code>{source}</code>. With a value, such -as <code>target:source={Expr}</code> or <code>target:source=&#34;literal&#34;</code>, the value is used for -<code>target</code> while <code>source</code> names the caller-side source for diagnostics.</li><li>Explicit props, spreads, and renames cannot provide the same target prop more -than once. Unknown target props and unsupported spread sources fail before -output is written.</li></ul><p>State is component-local UI state. A <code>state Type = Init()</code> declaration runs the -no-argument Go init function at build time for SPA/static output and serializes -the JSON-compatible initial value into the component island. State is visible to -the browser and must not carry secrets, trusted authorization state, database -state, or server validation results that the server still needs to enforce.</p><p>Bindable child state is supported on component calls with -<code>g:bind:&lt;ExportedState&gt;={ParentState}</code>. The target must be a child state field, -must be declared in <code>exports</code>, and must have a scalar type compatible with the -parent state field. Generated JavaScript sends the parent value down through -reactive props and listens for the child&#39;s typed <code>exports</code> event to write the -new child value back to parent state. A single component call may bind several -exported fields at once; the generated assignments share the one <code>exports</code> -listener and run as ordered statements. A component may not export a field named -<code>active</code>, which the exports payload reserves for the mount-state flag. Bound -state is still local UI state: it is not trusted input, server state, auth state, -validation, business logic, route truth, or cache policy.</p><p>Computed values are read-only derived state. They can depend on props, state, -and other computed values. The compiler builds a dependency graph for declared -computed values, emits them in dependency order, and rejects cycles before -generated JavaScript is written.</p><p>Stores are page-scoped UI state. A page <code>store</code> declaration names the store, -the Go type, and the build-time init function. A component <code>client { use name }</code> -declares that the island may use that store. Generated browser store state is a -page-local enhancement contract; it is not global application authority and it -does not replace server-side routing, auth, validation, persistence, or action -behavior.</p><p>Store use is explicit. Same-page stores use <code>client { use cart }</code>; stores from -another discovered <code>.gwdk</code> package require a GOWDK <code>use</code> alias and a qualified -client store reference such as <code>client { use stores.cart }</code>. Cross-package -stores are validated by alias and store name, not discovered globally. -App-global stores are deferred.</p><p>A <code>use</code> can carry the store&#39;s Go type so the component can reference the store&#39;s -fields directly, without redeclaring a matching <code>state</code> shape:</p><pre><code class="language-gwdk">component CartBadge - -client { - use cart ui.CartState - - computed Label string { return string(Count) } -} - -view { - &lt;span&gt;{Label}&lt;/span&gt; -} -</code></pre><p><code>use cart ui.CartState</code> binds <code>CartState</code>&#39;s fields (here <code>Count</code>) into the -component&#39;s client scope. The type is resolved against the component&#39;s own -imports, so a reusable component stays self-describing even when different pages -declare a same-named store; the annotated type is the component&#39;s contract for -the store&#39;s shape, exactly as a local <code>state</code> declaration was. The island seeds -those fields with the type&#39;s zero values for SSR and adopts the store&#39;s real -(init or persisted) value on mount; keep a local <code>state &lt;Type&gt; = &lt;init&gt;</code> if you -need the store&#39;s init value reflected in the server-rendered HTML.</p><p>A page store can opt into browser persistence with a <code>persist</code> modifier:</p><pre><code class="language-gwdk">store cart ui.CartState = ui.NewCartState() persist &#34;local&#34; -store prefs ui.UIPrefs = ui.DefaultPrefs() persist &#34;session&#34; -</code></pre><p><code>persist &#34;local&#34;</code> keeps the store in <code>localStorage</code> (survives a browser -restart); <code>persist &#34;session&#34;</code> keeps it in <code>sessionStorage</code> (survives reload and -SPA navigation, cleared when the tab closes). Persistence is keyed by store name -(<code>gowdk:store:&lt;name&gt;</code>), so the same persisted store keeps its value across routes -on the origin. Only the store&#39;s own declared fields are persisted — never -component state, props, or computed values. The compiler embeds a hash of the -store&#39;s struct shape; when the shape changes, stale persisted state is discarded -rather than restored, so a struct change never crashes on old data. Because -browser storage is readable by any script on the origin, persisting a field whose -name resembles a secret (<code>token</code>, <code>password</code>, <code>secret</code>, <code>auth</code>, …) is a warning — -including a nested field such as <code>Profile.Token</code>, because persistence writes the -whole value of each top-level field: keep credentials and trusted authorization -state server-side. An unknown scope is rejected — see -<code>gowdk explain page_store_persist_scope_invalid</code>.</p><p><code>persist &#34;local&#34;</code> stores also sync across tabs: when one tab writes, other tabs -on the origin mirror the value through the browser <code>storage</code> event. <code>persist &#34;session&#34;</code> stores are deliberately tab-local — <code>sessionStorage</code> is partitioned -per top-level tab, so session-scoped stores do not (and cannot) sync across tabs. -To drop a persisted store (for example after checkout or logout), use the -bounded <code>clear &lt;store&gt;</code> statement inside a client function, mount, destroy, or -effect block:</p><pre><code class="language-gwdk">client { - use cart - - func Checkout() { - clear cart - } -} -</code></pre><p><code>clear cart</code> lowers to <code>window.__gowdkStores.clear(&#34;cart&#34;)</code>, which removes the -stored copy and resets the store to its build-time init value, notifying every -island that uses it. A component may only clear a store it <code>use</code>s; clearing an -unused store is a compile error. If two pages persist a store with the -same name but different shapes, they share one storage key and discard each -other&#39;s data on navigation; the compiler warns with -<code>page_store_persist_key_conflict</code>. If they share the same shape but declare -different <code>local</code>/<code>session</code> scopes, the runtime keeps whichever scope initialized -first and the compiler warns with <code>page_store_persist_scope_conflict</code>. A store -first reached on a route that does not persist it still adopts persistence when a -later route declares it, restoring the saved value regardless of navigation order.</p><p>Persistence survives SPA navigation: when the client runtime swaps page content -it re-scans store seeds, so a store first declared on a later client-side route -hydrates without a full page load, and a store already in memory keeps its value.</p><p>WASM islands participate in page stores too. The host loader merges every used -store&#39;s current (and persisted) value into the mount/handle/destroy payload&#39;s -<code>state</code>, writes back any store values an export returns in the extended -<code>{ patches, stores }</code> result shape, and re-invokes the island when another island -changes a used store. Go WASM exports can use <code>runtime/wasm</code> to decode the -current payload and return either a patch array or <code>{ patches, stores }</code> through -the required <code>func() uint32</code> ABI; see <code>examples/components/wasm/README.md</code>.</p><p>Current limits. Invalid persist scopes are reported but not auto-fixed, because -choosing <code>local</code> vs <code>session</code> is a deliberate decision.</p><p>Exports must reference a declared prop, state field, or computed value and the -declared type must match that local symbol. Generated JavaScript islands emit -an <code>exports</code> event with <code>event.active == true</code> after mount and updates, plus a -<code>gowdk:exports</code> DOM event for direct integrations. Before unmount, the runtime -emits the same events with <code>event.active == false</code> and exported values set to -<code>null</code>, so parent code can clear local handles. Exports are local UI handles; -they are not server state, trusted input, or a replacement for backend actions.</p><p>Slots are the reusable-markup primitive. A default slot uses <code>&lt;slot /&gt;</code>, named -slots use <code>&lt;slot name=&#34;name&#34;&gt;</code>, and scoped slots pass scalar values through -slot props plus caller-side <code>let:</code> bindings. GOWDK does not currently have a -separate snippet/render value model.</p><p>Recursive component rendering is rejected to prevent unbounded build-time -rendering; direct and transitive cycles fail before output is written. Dynamic -component selection is rejected; component calls must name a known component -directly or through an explicit <code>use</code> alias.</p><p><code>client {}</code> is a compiler-owned UI language, not arbitrary JavaScript. The -supported handlers, helpers, lifecycle blocks, effects, refs, list built-ins, -bindings, conditionals, computed values, and scalar expressions are defined in -<a href="/docs/language/syntax/">syntax.md</a>. Generated island JavaScript interprets that bounded -subset instead of evaluating arbitrary user JavaScript source.</p><p>Client handlers run in source order. The generated runtime batches state -updates, recomputes computed values in dependency order, runs cleanup before -effects rerun or unload, and then updates DOM bindings. Async client handlers -are limited to compiler-owned async helpers such as validated -<code>await fetchJSON[T](urlExpr)</code> assignments; they cannot return values and do not -change the ownership boundary.</p><p>For loading/error UI that does not need a hand-written <code>Loading</code> or <code>Error</code> -state field, component views can use <code>{#await fetchJSON[T](urlExpr)}</code> blocks. -The block is local to the JS island, renders pending/then/catch branches, and -does not expose arbitrary JavaScript promises.</p><p>Client <code>g:if</code> branches and keyed client <code>g:for</code> rows can opt into CSS-driven -motion with <code>g:transition=&#34;name&#34;</code>; keyed client <code>g:for</code> rows can opt into -reorder hooks with <code>g:animate=&#34;name&#34;</code>. The generated runtime toggles -<code>gowdk-transition-*</code> and <code>gowdk-animate-*</code> classes only. User or addon CSS owns -all durations, easing, transforms, and <code>prefers-reduced-motion</code> behavior.</p><p>Generated browser runtime behavior is scoped to the island or page enhancement -that requested it. JavaScript may update text, attributes, classes, styles, -form bindings, list rows, local state, page stores, partial responses, and SPA -link transitions. It must not own route existence, auth, business rules, -database access, trusted server validation, action behavior, or cache/loading -policy. Real routes, direct browser refresh, and server behavior stay owned by -the compiler manifest, generated Go, and user Go handlers.</p><p>Production WASM islands are declared with component-level <code>wasm</code>. Normal calls -to that component use the WASM island runtime by default. The referenced package -is browser-side Go compiled for <code>GOOS=js GOARCH=wasm</code> with server and process -packages rejected. GOWDK validates the required component-scoped ABI entrypoints, -ships Go&#39;s browser <code>wasm_exec.js</code> runtime asset for declared Go WASM packages, -passes <code>gowdk-wasm-island-v1</code> payloads to component WASM exports, and keeps DOM -mutation in the generated host loader. WASM islands are not a replacement for -backend handlers.</p><p>The runnable ABI example in <code>examples/components/wasm/</code> builds a component -WASM asset, per-component host loader, and <code>wasm_exec.js</code> from a browser Go -package with the required <code>GOWDKMount&lt;Component&gt;</code>, -<code>GOWDKHandle&lt;Component&gt;</code>, and <code>GOWDKDestroy&lt;Component&gt;</code> exports.</p><p>Not implemented yet:</p><ul><li>Supported recursive component rendering and supported dynamic component -selection.</li><li>Full runtime validation for user browser logic in WASM islands beyond -required export, browser import, and patch-operation checks.</li><li>Wiring generated Go component packages into the generated app layout.</li><li>Cross-package store and asset use syntax.</li><li>Emitting and rewriting component-scoped CSS and component-level assets from -the existing component <code>css</code> and <code>asset</code> metadata.</li></ul><p>Component design rules:</p><ul><li>Components must stay portable and must not derive route identity from folder location.</li><li>Component resolution should be explicit enough for diagnostics, editor navigation, and generated code.</li><li>Generated component output must escape untrusted text by default.</li><li>Public generated-runtime contracts belong under <code>runtime/</code>.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/conformance/index.html b/docs-site/dist/site/docs/language/conformance/index.html deleted file mode 100644 index dcd424ff..00000000 --- a/docs-site/dist/site/docs/language/conformance/index.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>.gwdk Conformance Corpus - GOWDK</title> - <meta name="description" content="The conformance corpus is the machine-checked source of truth for the .gwdk language contract. The prose in docs/language/spec.md and docs/language/grammar.md describes the..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content=".gwdk Conformance Corpus - GOWDK"> - <meta property="og:description" content="The conformance corpus is the machine-checked source of truth for the .gwdk language contract. The prose in docs/language/spec.md and docs/language/grammar.md describes the..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content=".gwdk Conformance Corpus - GOWDK"> - <meta name="twitter:description" content="The conformance corpus is the machine-checked source of truth for the .gwdk language contract. The prose in docs/language/spec.md and docs/language/grammar.md describes the..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>.gwdk Conformance Corpus</h1><p class="doc-lead">The conformance corpus is the machine-checked source of truth for the .gwdk language contract. The prose in docs/language/spec.md and docs/language/grammar.md describes the language; the corpus pins it, so a parser or validator change that silently accepts or rejects different syntax fails a test instead of drifting from the docs.</p></header><article class="prose"><p>The conformance corpus is the machine-checked source of truth for the <code>.gwdk</code> -language contract. The prose in <code>docs/language/spec.md</code> and -<code>docs/language/grammar.md</code> describes the language; the corpus <em>pins</em> it, so a -parser or validator change that silently accepts or rejects different syntax -fails a test instead of drifting from the docs.</p><h2 id="location">Location</h2><pre><code class="language-text">internal/lang/testdata/conformance/ - accept/ # files that must check clean (no error-severity diagnostics) - reject/ # files that must produce specific stable diagnostic codes -</code></pre><p>The runner is <code>TestConformanceCorpusAccept</code> and <code>TestConformanceCorpusReject</code> in -<code>internal/lang/conformance_test.go</code>. Each file is checked with -<code>lang.CheckSource</code>, the same single-file path the editor and <code>gowdk check</code> use, -so cases are hermetic and need no project layout.</p><h2 id="accept-cases">Accept cases</h2><p>Any <code>.gwdk</code> file under <code>accept/</code> must produce no error-severity diagnostics. -Warnings (for example <code>missing_img_alt</code>) are allowed, because they do not fail a -build. File-kind classification follows the filename suffix, so a component case -is named <code>*.cmp.gwdk</code> and a layout case <code>*.layout.gwdk</code>.</p><h2 id="reject-cases">Reject cases</h2><p>Any <code>.gwdk</code> file under <code>reject/</code> must declare the stable diagnostic codes it is -expected to produce in a leading directive comment:</p><pre><code class="language-gwdk">// expect: old_action_block_syntax -package pages -... -</code></pre><p>Multiple codes may be comma- or space-separated. The test asserts every named -code appears among the diagnostics for that file. Diagnostic codes are the ones -registered in <code>internal/diagnostics/registry.go</code> and documented in -<code>docs/reference/diagnostic-codes.md</code>.</p><h2 id="scope-and-limits">Scope and limits</h2><p>The corpus uses single-file <code>CheckSource</code>, so it pins what one file can verify -without a project: package and metadata declarations, route forms, <code>view {}</code> -markup, <code>style {}</code>, literal <code>build {}</code>, slots, and the rejection contracts below.</p><p>It cannot cleanly cover constructs that require project context: reactive <code>g:</code> -directives (<code>g:if</code>/<code>g:on</code>/<code>g:bind</code>) reference a Go-typed <code>state</code> contract that -does not resolve single-file; endpoint forms (<code>act</code>/<code>api</code>) need exported Go -handlers; and <code>layout</code>/<code>wasm</code>/<code>asset</code>/<code>css</code> need sibling files or config. Those -are exercised by the package- and build-level tests instead.</p><p>Full construct coverage is therefore split, and the split is enforced. -<code>TestConformanceCoversEveryConstruct</code> partitions every construct in the -stability registry (<code>lang.ConstructStabilities</code>) into <code>corpusConstructs</code> (the -single-file corpus exercises it) or <code>integrationCoverage</code> (a named integration -test covers the project-context construct). Adding a construct to the registry -fails that test until it is given coverage in one set or the other, so no -construct can silently go untested.</p><h2 id="coverage">Coverage</h2><p><code>TestConformanceCorpusCoversRejectionContracts</code> fails when a rejection contract -that surfaces a specific stable code through the single-file check loses its -reject case (<code>unsupported_top_level_block</code>, <code>old_action_block_syntax</code>, -<code>old_api_block_syntax</code>, <code>malformed_legacy_metadata</code>, <code>malformed_gowdk_use</code>).</p><p>Markup directive and foreign-syntax rejections currently surface as the generic -<code>parse_error</code> through this path rather than <code>unsupported_markup_directive</code> / -<code>unsupported_markup_syntax</code>. Their reject cases pin <code>parse_error</code> for now and -will be updated to the specific code once markup rejections carry their own code -(tracked alongside parser recovery in #250). The corpus ratchets that -improvement: when the specific code lands, the <code>parse_error</code> expectation fails -until the case is updated.</p><h2 id="adding-a-corpus-case">Adding a corpus case</h2><p>New or changed <code>.gwdk</code> syntax must come with a corpus case. Adding accepted -syntax means an <code>accept/</code> file exercising it; adding a rejection or a new -diagnostic means a <code>reject/</code> file with the expected code. This requirement is -part of the syntax contributor checklist in -<code>docs/compiler/syntax-contributors.md</code>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/data/index.html b/docs-site/dist/site/docs/language/data/index.html deleted file mode 100644 index 56f4e45e..00000000 --- a/docs-site/dist/site/docs/language/data/index.html +++ /dev/null @@ -1,48 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Data Lifecycle - GOWDK</title> - <meta name="description" content="GOWDK has separate build-time, request-time page, and endpoint data lanes. Generated JavaScript does not own page loading policy."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Data Lifecycle - GOWDK"> - <meta property="og:description" content="GOWDK has separate build-time, request-time page, and endpoint data lanes. Generated JavaScript does not own page loading policy."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Data Lifecycle - GOWDK"> - <meta name="twitter:description" content="GOWDK has separate build-time, request-time page, and endpoint data lanes. Generated JavaScript does not own page loading policy."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Data Lifecycle</h1><p class="doc-lead">GOWDK has separate build-time, request-time page, and endpoint data lanes. Generated JavaScript does not own page loading policy.</p></header><article class="prose"><p>GOWDK has separate build-time, request-time page, and endpoint data lanes. -Generated JavaScript does not own page loading policy.</p><h2 id="lane-summary">Lane Summary</h2><table><thead><tr><th>Construct</th><th>Runs</th><th>Owns</th><th>Current contract</th></tr></thead><tbody><tr><td><code>paths {}</code></td><td>build time</td><td>concrete dynamic SPA routes</td><td>Literal records only. Required for dynamic SPA pages unless the page uses request-time rendering.</td></tr><tr><td><code>build {}</code></td><td>build time</td><td>static page data</td><td>Literal records plus imported or same-package Go functions, with optional <code>gowdk.BuildParams</code> route params.</td></tr><tr><td><code>server {}</code></td><td>request time</td><td>SSR page data</td><td>One same-package <code>Load&lt;PageID&gt;</code> function returns <code>map[string]any</code> data.</td></tr><tr><td><code>act</code></td><td>request time</td><td>POST/action endpoint behavior</td><td>Same-package Go handler returns <code>runtime/response.Response</code>.</td></tr><tr><td><code>api</code></td><td>request time</td><td>API endpoint behavior</td><td>Same-package Go handler returns <code>runtime/response.Response</code>.</td></tr><tr><td><code>fragment</code></td><td>request time</td><td>partial endpoint behavior</td><td>Same-package Go hook or static generated fragment body.</td></tr></tbody></table><h2 id="current-rules">Current Rules</h2><ul><li><code>build {}</code> data is rendered into generated static output. It must not depend -on the incoming HTTP request.</li><li><code>server {}</code> selects request-time SSR and requires the SSR addon.</li><li>Generated SSR calls one same-package function named <code>Load&lt;PageID&gt;</code>.</li><li>Supported load signatures are:</li></ul><pre><code class="language-go">func LoadDashboard(ssr.LoadContext) map[string]any -func LoadDashboard(ssr.LoadContext) (map[string]any, error) -</code></pre><ul><li>One <code>server {}</code> block can declare multiple fields. They come from the single -returned map, including dotted paths such as <code>user.name</code>.</li><li>Layouts do not have independent <code>server {}</code> data yet. Request-time layout data -composition is planned.</li><li>Load redirects use <code>ssr.RedirectTo(&#34;/path&#34;)</code> or -<code>ssr.Redirect(&#34;/path&#34;, status)</code>. Redirect targets must be local absolute -paths.</li><li>Not-found, forbidden, validation, and typed expected-error helpers for load -are planned. Today, guards handle guarded access and other load errors use -the generated SSR error-page path.</li><li>Generated load data is map-based today. Typed load data accessors are planned -after the load result contract is stable.</li></ul><h2 id="invalidation-and-refresh">Invalidation And Refresh</h2><ul><li>Full POST actions and enhanced POST actions share the same user Go handler -ownership. The handler response decides redirect, HTML, JSON, or fragment -behavior.</li><li>GOWDK does not automatically rerun <code>server {}</code> after an action today.</li><li>Partial updates use explicit fragment responses or standalone fragment -endpoints. Fragments own their request-time data through the fragment Go hook.</li><li>Fragments do not declare compiler-tracked data dependencies today.</li><li>Generated client navigation does not prefetch or reuse <code>server {}</code> data today. -Any future prefetch or reuse must be an explicit generated-client feature, -not hidden browser-owned loading policy.</li></ul><h2 id="boundaries">Boundaries</h2><ul><li>User Go owns auth, business validation, storage, service calls, and response -semantics.</li><li>Generated Go owns adapter glue: decode, dispatch, context metadata, response -writing, guards, CSRF checks, panic boundaries, and cache defaults.</li><li>Generated JavaScript may enhance form submissions, fragments, islands, and -static SPA navigation. It must not become the authority for routes, auth, -validation, server data, action behavior, cache, or page loading policy.</li><li>Actions do not invalidate <code>server {}</code> data implicitly. Use redirects, -fragments, JSON, or <code>response.ReloadPage()</code> to make the lifecycle visible in -the action result.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/diagnostics/index.html b/docs-site/dist/site/docs/language/diagnostics/index.html deleted file mode 100644 index 0c12681a..00000000 --- a/docs-site/dist/site/docs/language/diagnostics/index.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Diagnostics - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Diagnostics - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Diagnostics - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Diagnostics</h1></header><article class="prose"><h2 id="current-shape">Current Shape</h2><p>CLI JSON diagnostics use:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;diagnostics&#34;: [ - { - &#34;file&#34;: &#34;examples/pages/home.page.gwdk&#34;, - &#34;code&#34;: &#34;missing_page_guard&#34;, - &#34;pos&#34;: {&#34;line&#34;: 3, &#34;column&#34;: 1}, - &#34;range&#34;: { - &#34;start&#34;: {&#34;line&#34;: 3, &#34;column&#34;: 1}, - &#34;end&#34;: {&#34;line&#34;: 3, &#34;column&#34;: 11} - }, - &#34;severity&#34;: &#34;warning&#34;, - &#34;message&#34;: &#34;home declares no guard; its route is denied (403) at request time. Add guard public to serve it, or a protective guard such as guard auth.required&#34; - } - ] -} -</code></pre><p><code>version</code> is the JSON schema version and is currently <code>1</code>. Positions and ranges -are 1-based; range end columns are exclusive. Lexer, parser, and compiler -validation diagnostics include ranges when the source line is known. Compiler -validation ranges are derived from parser-recorded source spans for metadata -declarations, block declarations, route params, actions, APIs, guards, layouts, -components, and CSS references. Parser errors use the public -<code>parse_error</code> code until parser recovery has more specific codes.</p><p>The optional <code>suggestion</code> field carries a short structured fix hint for common -mistakes such as missing <code>paths {}</code> on dynamic spa routes, unknown client or -view fields, missing <code>g:key</code>, and malformed <code>g:for</code> syntax.</p><p>The optional <code>fix</code> field carries registry-backed machine-readable fix metadata -for safe rewrites. <code>gowdk fix</code> and LSP code actions use the same fix title, -description, and named rewriter from the registry.</p><p>Warnings are non-fatal unless <code>gowdk check --warnings-as-errors</code> is used. -Accessibility warnings include <code>missing_img_alt</code>, <code>missing_form_label</code>, -<code>empty_link_text</code>, <code>missing_button_type</code>, and <code>heading_order_skip</code> for literal -view markup in pages, components, and layouts. <code>missing_page_guard</code> is emitted -for a page that declares no <code>guard</code>: the build still succeeds, but the page is -not public by default; its route is denied (403) at request time until the -author adds <code>guard public</code> (or a protective guard). Access is never granted by -omission.</p><h2 id="current-code-registry">Current Code Registry</h2><p>The diagnostic-code registry, stability policy, naming rules, and -<code>gowdk explain</code> behavior live in -<a href="/docs/reference/diagnostic-codes/">diagnostic-codes.md</a>. The implementation -source of truth is <code>internal/diagnostics/registry.go</code>.</p><p>Lexer diagnostics can emit <code>unterminated_string</code>; parser diagnostics emit -<code>parse_error</code> until parser recovery has more specific stable codes.</p><h2 id="markup-contract-codes">Markup Contract Codes</h2><p>Two stable codes describe the <code>view {}</code> markup contract families:</p><ul><li><code>unsupported_markup_syntax</code> — foreign template syntax such as <code>{#if}</code>, -<code>{#each}</code>, <code>{#snippet}</code>, <code>{@html}</code>, <code>{@const}</code>, and <code>{@debug}</code>. -Each rejection message names the GOWDK-owned alternative (for example, -<code>{@html body}</code> points at the explicit <code>g:unsafe-html={Expr}</code> directive).</li><li><code>unsupported_markup_directive</code> — <code>g:</code> attributes outside the owned directive -contract, including unknown directives and deferred families: -document/window/body/head targets, async placeholders (<code>g:await</code>, <code>g:async</code>), -and DOM actions (<code>g:use</code>, <code>g:action</code>, <code>g:attach</code>). Each family gets explicit -guidance in its message.</li></ul><p>Today these rejections surface through the compiler as the <code>view_parse_error</code> -carrier code with the canonical message text above; the registered codes -document the contract families and power <code>gowdk explain</code>. Mapping each markup -rejection to its own carried code is planned follow-up work alongside parser -recovery.</p><h2 id="planned-work">Planned Work</h2><p>Diagnostics still need parser recovery and broader body-level syntax errors.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/formatting/index.html b/docs-site/dist/site/docs/language/formatting/index.html deleted file mode 100644 index 31861b0e..00000000 --- a/docs-site/dist/site/docs/language/formatting/index.html +++ /dev/null @@ -1,56 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Formatting - GOWDK</title> - <meta name="description" content="gowdk fmt formats .gwdk source from the parsed syntax tree. The CLI and the language server share one implementation (internal/lang.Format), so editor formatting and gowdk fmt..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Formatting - GOWDK"> - <meta property="og:description" content="gowdk fmt formats .gwdk source from the parsed syntax tree. The CLI and the language server share one implementation (internal/lang.Format), so editor formatting and gowdk fmt..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Formatting - GOWDK"> - <meta name="twitter:description" content="gowdk fmt formats .gwdk source from the parsed syntax tree. The CLI and the language server share one implementation (internal/lang.Format), so editor formatting and gowdk fmt..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Formatting</h1><p class="doc-lead">gowdk fmt formats .gwdk source from the parsed syntax tree. The CLI and the language server share one implementation (internal/lang.Format), so editor formatting and gowdk fmt produce identical output.</p></header><article class="prose"><p><code>gowdk fmt</code> formats <code>.gwdk</code> source from the parsed syntax tree. The CLI and the -language server share one implementation (<code>internal/lang.Format</code>), so editor -formatting and <code>gowdk fmt</code> produce identical output.</p><pre><code class="language-sh">gowdk fmt &lt;files&gt; # print formatted source to stdout -gowdk fmt --write &lt;files&gt; # rewrite files in place -gowdk fmt --check &lt;files&gt; # list files that are not formatted (non-zero exit) -</code></pre><h2 id="parser-backed-formatting">Parser-backed formatting</h2><p>When a file parses, the formatter is driven by the parsed structure rather than -line-by-line text heuristics:</p><ul><li>Top-level declarations, comments, and blank lines keep their content; only -indentation and blank-line grouping are normalized.</li><li>Block kinds and boundaries come from the parser, so <code>style</code>, <code>client</code>, <code>go</code>, -<code>go ssr</code>, <code>go client</code>, <code>go addon.*</code>, <code>server</code>, and the record/contract blocks -are each indented by brace depth using the parser&#39;s string/comment-aware -scanner. Braces inside string literals, comments, and template literals do not -skew indentation.</li><li>View markup is indented from the parsed view node tree. Nested elements, -component calls, interpolations, and multi-line open tags are indented from -structure, so a multi-line tag indents its attribute continuation lines one -level deeper than the tag and places the closing <code>&gt;</code> / <code>/&gt;</code> back at the tag&#39;s -level.</li><li>Comments are preserved. Top-level <code>//</code> comments keep their position and are -re-indented in place.</li><li>Two-space indentation; a single trailing newline.</li></ul><p>The formatter normalizes whitespace only — it never rewrites the textual content -of a line, so expressions, attribute values, CSS, JavaScript, and Go block -bodies are preserved exactly.</p><h2 id="malformed-or-unsupported-source">Malformed or unsupported source</h2><p>If a file does not parse, the formatter falls back to a conservative -line-oriented pass that only normalizes whitespace and never drops user source:</p><ul><li><code>gowdk fmt</code> and the editor still print best-effort formatted output.</li><li><code>gowdk fmt --write</code> and <code>gowdk fmt --check</code> refuse the file (non-zero exit) -rather than rewriting source the parser cannot model. Run <code>gowdk check &lt;file&gt;</code> to see the underlying diagnostics.</li></ul><h2 id="unsupported-formatting-families">Unsupported formatting families</h2><p>These shapes are formatted by the conservative fallback (whitespace only), -because the parser cannot model them precisely. They are preserved without data -loss, but their internal structure is not re-derived:</p><ul><li>View bodies containing HTML comments (<code>&lt;!-- ... --&gt;</code>). The view parser does not -model HTML comments, so such views take the fallback path. Inline <code>{...}</code> -interpolations and component calls are supported on the parser-backed path.</li><li>Any file with parse-level syntax errors or unsupported/legacy block syntax -(for example old <code>act {}</code> / <code>api {}</code> blocks). These keep their content and -surface their diagnostics through <code>gowdk check</code>.</li><li>Go, CSS, and JavaScript block bodies are indented by brace depth, not -reformatted by a language-specific formatter. Run <code>gofmt</code> (or the relevant -tool) for canonical formatting of those bodies.</li></ul><h2 id="hardening-coverage">Hardening coverage</h2><ul><li>Page, component, endpoint, comment, nested-markup, multi-line-attribute, and -per-block-family shapes are covered by golden and idempotence tests.</li><li>Formatting a file with parser-level migration errors does not hide those -errors; validation still reports the diagnostic after formatting.</li><li>The fallback path is covered by a test that asserts no source line is dropped.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/forms/index.html b/docs-site/dist/site/docs/language/forms/index.html deleted file mode 100644 index 30dabe41..00000000 --- a/docs-site/dist/site/docs/language/forms/index.html +++ /dev/null @@ -1,81 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Forms And Progressive Enhancement - GOWDK</title> - <meta name="description" content="GOWDK forms start as normal HTML forms. JavaScript can enhance a form into a fragment request, but Go handlers still own action behavior."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Forms And Progressive Enhancement - GOWDK"> - <meta property="og:description" content="GOWDK forms start as normal HTML forms. JavaScript can enhance a form into a fragment request, but Go handlers still own action behavior."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Forms And Progressive Enhancement - GOWDK"> - <meta name="twitter:description" content="GOWDK forms start as normal HTML forms. JavaScript can enhance a form into a fragment request, but Go handlers still own action behavior."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Forms And Progressive Enhancement</h1><p class="doc-lead">GOWDK forms start as normal HTML forms. JavaScript can enhance a form into a fragment request, but Go handlers still own action behavior.</p></header><article class="prose"><p>GOWDK forms start as normal HTML forms. JavaScript can enhance a form into a -fragment request, but Go handlers still own action behavior.</p><h2 id="baseline-form-behavior">Baseline Form Behavior</h2><p><code>g:post={Submit}</code> lowers to a standard POST form:</p><pre><code class="language-gwdk">&lt;form g:post={Submit}&gt; - &lt;input name=&#34;email&#34; required /&gt; - &lt;button&gt;Subscribe&lt;/button&gt; -&lt;/form&gt; -</code></pre><p>The generated page remains usable without JavaScript. In generated apps, the -POST route decodes the declared request shape, validates supported literal -request-shape constraints, runs guards and CSRF when configured, calls the -same-package Go action handler, and writes the returned -<code>runtime/response.Response</code>.</p><p>There is no generated page-level form state object today. The submitted form -data, handler response, redirected page, or returned fragment is the source of -truth. Component state and <code>g:bind</code> can improve client interaction, but they do -not replace server validation or action results.</p><h2 id="action-results">Action Results</h2><p>Full-page POST handlers return <code>runtime/response.Response</code>:</p><ul><li><code>response.RedirectTo(&#34;/next&#34;)</code> for POST/redirect/get.</li><li><code>response.HTMLBody(status, body)</code> for an explicit HTML response.</li><li><code>response.JSONBody(status, body)</code> or <code>response.JSONValue(status, value)</code> for -JSON.</li><li><code>partial.Fragment(target, body)</code> or <code>partial.Swap(target, swap, body)</code> for -fragment responses.</li><li><code>response.ValidationJSON(result)</code> or <code>response.ValidationFragment(target, result)</code> for validation responses.</li><li><code>response.ReloadPage()</code> for enhanced forms that should reload the current -page after the action completes.</li></ul><p>Generated request-shape validation is intentionally narrow. It covers direct -literal form fields and literal constraints such as <code>required</code>, <code>minlength</code>, -<code>maxlength</code>, and <code>pattern</code>. Domain validation belongs in the Go handler.</p><h2 id="enhanced-fragment-requests">Enhanced Fragment Requests</h2><p>A form with <code>g:target</code> opts into partial enhancement:</p><pre><code class="language-gwdk">&lt;form g:post={Refresh} g:target=&#34;#patients&#34; g:swap=&#34;innerHTML&#34;&gt; - &lt;input name=&#34;query&#34; /&gt; - &lt;button&gt;Refresh&lt;/button&gt; -&lt;/form&gt; -&lt;section id=&#34;patients&#34;&gt;&lt;/section&gt; -</code></pre><p>The compiler lowers this to normal form attributes plus <code>data-gowdk-*</code> -metadata and emits <code>assets/gowdk/gowdk.js</code> when the page needs it. The runtime -submits the form with:</p><ul><li><code>X-GOWDK-Partial: 1</code></li><li><code>X-GOWDK-Target: &lt;target&gt;</code></li><li><code>X-GOWDK-Swap: &lt;swap&gt;</code></li></ul><p>Successful enhanced responses swap <code>innerHTML</code> or <code>outerHTML</code> into the target. -Before the partial POST, the runtime runs the browser&#39;s native constraint -validation (<code>checkValidity</code> / <code>reportValidity</code>) when available. Invalid -enhanced forms are not posted, <code>gowdk:validation-blocked</code> is dispatched on the -form, and the server remains authoritative for every request that reaches the -action handler. The runtime dispatches <code>gowdk:before-request</code>, -<code>gowdk:after-swap</code>, and <code>gowdk:request-error</code>, toggles <code>aria-busy</code>, preserves -focus where possible, and remounts generated islands around replaced DOM. -Failed enhanced requests dispatch <code>gowdk:request-error</code> with <code>detail.status</code>, -<code>detail.body</code>, and <code>detail.response</code> when an HTTP response exists.</p><p>Enhanced redirects are not a stable contract today. For enhanced requests, -return a fragment response for the target. Use normal full-page POST redirects -for the no-JavaScript path.</p><p>There is no nearest error-boundary lookup for enhanced actions today. Failed -enhanced requests dispatch <code>gowdk:request-error</code>; generated validation -fragments can target a declared error container such as <code>#errors</code>. Generated -validation fragments are escaped live regions with <code>role=&#34;alert&#34;</code> and -<code>aria-live=&#34;polite&#34;</code>.</p><h2 id="invalidation">Invalidation</h2><p>GOWDK does not automatically invalidate page data after actions. Action -handlers choose the lifecycle outcome explicitly.</p><p>Use one of these explicit outcomes:</p><ul><li>Redirect after full-page POST so the browser loads fresh page output.</li><li>Return a fragment response for the changed region.</li><li>Return <code>response.ReloadPage()</code> so enhanced forms reload the current page and -rerun request-time <code>server {}</code> data.</li><li>Return JSON to a user-owned client integration.</li><li>Call an app-owned API or reload policy outside generated core.</li></ul><p>Generated JavaScript must not own routing, auth, business rules, database -access, server validation, action behavior, global app state, or page loading -policy.</p><h2 id="field-inference">Field Inference</h2><p>The generated first slice infers direct <code>input</code>, <code>textarea</code>, <code>select</code>, and -named submit controls with literal <code>name</code> attributes. It does not infer fields -hidden inside component calls.</p><p>Author-written form controls keep their literal browser validation attributes -such as <code>required</code>, <code>type</code>, <code>inputmode</code>, <code>min</code>, and <code>max</code>. When a <code>g:post</code> -action has bound Go input metadata, the renderer can add missing numeric browser -attributes to direct literal <code>&lt;input name=&#34;...&#34;&gt;</code> controls: <code>type=&#34;number&#34;</code>, -<code>inputmode=&#34;numeric&#34;</code>, <code>min=&#34;0&#34;</code> for unsigned integers, and exact <code>min</code>/<code>max</code> -bounds for sized integer types. It does not synthesize <code>required</code> because -requiredness is enforced from literal form constraints, not from Go field type -metadata.</p><p>File uploads are intentionally user-owned. Direct <code>input type=&#34;file&#34;</code> controls -and multipart generated action forms are rejected. Use a normal Go API/server -handler when uploads need explicit body limits, storage, validation, cleanup, -auth, and logging policy.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/grammar/index.html b/docs-site/dist/site/docs/language/grammar/index.html deleted file mode 100644 index 88de65c6..00000000 --- a/docs-site/dist/site/docs/language/grammar/index.html +++ /dev/null @@ -1,96 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Grammar - GOWDK</title> - <meta name="description" content="This is the grammar accepted by the current metadata parser. It is intentionally line-oriented and incomplete."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Grammar - GOWDK"> - <meta property="og:description" content="This is the grammar accepted by the current metadata parser. It is intentionally line-oriented and incomplete."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Grammar - GOWDK"> - <meta name="twitter:description" content="This is the grammar accepted by the current metadata parser. It is intentionally line-oriented and incomplete."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Grammar</h1><p class="doc-lead">This is the grammar accepted by the current metadata parser. It is intentionally line-oriented and incomplete.</p></header><article class="prose"><p>This is the grammar accepted by the current metadata parser. It is intentionally line-oriented and incomplete.</p><p>Accepted and rejected syntax is pinned by the machine-checked conformance corpus -in <a href="/docs/language/conformance/">Conformance Corpus</a>, which is the contract source of truth -when this grammar drifts.</p><pre><code class="language-text">file = line* -line = blank | comment | packageDecl | metadataDecl | importDecl | useDecl | blockDecl | goDecl | actionDecl | apiDecl | unsupportedBlock | other -blank = whitespace* -comment = whitespace* &#34;//&#34; text - -packageDecl = &#34;package&#34; whitespace+ ident -metadataDecl = metadataKeyword value -importDecl = &#34;import&#34; (whitespace+ ident)? whitespace+ string -useDecl = &#34;use&#34; whitespace+ ident whitespace+ string -blockDecl = (&#34;paths&#34; | &#34;build&#34; | &#34;load&#34; | &#34;view&#34; | &#34;style&#34;) whitespace* &#34;{&#34; -goDecl = &#34;go&#34; (whitespace+ blockName)? whitespace* &#34;{&#34; -actionDecl = &#34;act&#34; whitespace+ ident whitespace+ &#34;POST&#34; whitespace+ string -apiDecl = &#34;api&#34; whitespace+ ident whitespace+ apiMethod whitespace+ string -unsupportedBlock = blockName text &#34;{&#34; -apiMethod = &#34;GET&#34; | &#34;POST&#34; | &#34;PUT&#34; | &#34;PATCH&#34; | &#34;DELETE&#34; - -ident = letterOrUnderscore (letter | digit | &#34;_&#34;)* -blockName = letterOrUnderscore (letter | digit | &#34;_&#34; | &#34;.&#34; | &#34;-&#34;)* -</code></pre><p>Audit policy files use the <code>*.audit.gwdk</code> suffix and a separate top-level -grammar:</p><pre><code class="language-text">auditFile = (blank | comment | packageDecl | policyDecl | testDecl)* -policyDecl = &#34;policy&#34; whitespace+ ident (whitespace+ &#34;extends&#34; whitespace+ ident (&#34;,&#34; whitespace* ident)*)? whitespace* &#34;{&#34; -policyLine = applyLine | requireLine | denyLine | allowLine -applyLine = (&#34;match&#34; | &#34;apply&#34; whitespace+ &#34;to&#34;) whitespace+ string -requireLine = &#34;require&#34; whitespace+ (&#34;csrf&#34; | &#34;guard&#34; whitespace+ value | &#34;header&#34; whitespace+ string | &#34;max_body&#34; whitespace+ value | &#34;no_secrets_in_bundle&#34;) (whitespace+ &#34;as&#34; whitespace+ value)? -denyLine = &#34;deny&#34; whitespace+ (&#34;public&#34; | &#34;raw_html&#34;) (whitespace+ &#34;as&#34; whitespace+ value)? -allowLine = &#34;allow&#34; whitespace+ &#34;raw_html&#34; whitespace+ value -testDecl = &#34;test&#34; whitespace+ ident whitespace* &#34;{&#34; -testLine = &#34;expect&#34; whitespace+ method whitespace+ string (whitespace+ &#34;as&#34; whitespace+ string)? whitespace+ &#34;status&#34; whitespace+ statusCode - | &#34;expect&#34; whitespace+ &#34;header&#34; whitespace+ string whitespace+ string -value = ident | string -method = &#34;GET&#34; | &#34;HEAD&#34; | &#34;POST&#34; | &#34;PUT&#34; | &#34;PATCH&#34; | &#34;DELETE&#34; -statusCode = digit digit digit -</code></pre><p>The parser currently scans each trimmed line independently. It records -declarations and captures raw body text for <code>paths {}</code>, <code>build {}</code>, <code>server {}</code>, -<code>go {}</code>, <code>go target {}</code>, <code>view {}</code>, and <code>style {}</code> blocks until their -closing <code>}</code>. CSS braces inside <code>style {}</code> and Go braces inside <code>go {}</code> do -not close those blocks early. Go block bodies are parsed as Go during semantic -validation. <code>act</code> and <code>api</code> -declarations name exact exported Go handler symbols; behavior lives in normal -same-package Go handlers. <code>gowdk build</code> parses the first literal <code>paths {}</code> and -<code>build {}</code> subsets at app-generation time:</p><pre><code class="language-text">literalReturn = &#34;=&gt;&#34; whitespace* &#34;{&#34; literalField (&#34;,&#34; literalField)* &#34;}&#34; -literalField = ident &#34;:&#34; string -buildCall = &#34;=&gt;&#34; whitespace* ident &#34;.&#34; ident &#34;()&#34; -</code></pre><p>The current <code>view {}</code> parser accepts the supported markup subset documented in -<a href="/docs/language/markup/">Markup</a>. Contract and realtime directives use package-qualified Go -references:</p><pre><code class="language-text">contractRef = ident &#34;.&#34; ident -g:command = &#34;g:command&#34; &#34;=&#34; (string | &#34;{&#34; contractRef &#34;}&#34;) -g:query = &#34;g:query&#34; &#34;=&#34; (string | &#34;{&#34; contractRef &#34;}&#34;) -g:subscribe = &#34;g:subscribe&#34; &#34;=&#34; (string | &#34;{&#34; contractRef &#34;}&#34;) -</code></pre><p><code>g:subscribe</code> must appear on the same element as <code>g:query</code> and must reference a -presentation-event contract.</p><p>Unknown or malformed legacy metadatas fail at parse time. Unsupported top-level block -declarations fail when they have an identifier-like first token and a trailing -<code>{</code>. SPA builds also accept the first imported <code>buildCall</code> subset when the -page declares the referenced import.</p><p>Default <code>go {}</code> blocks can provide no-argument build-data functions for -<code>build { =&gt; LocalFunc() }</code>. Saved default <code>go {}</code> blocks are type-checked with -sibling Go files in the same package during validation. <code>go server {}</code> can provide -generated SSR load handlers when request-time rendering is enabled. Generated -app source writes default <code>go {}</code> and <code>go server {}</code> blocks under <code>gowdk_go/</code>. -Page-level <code>go client {}</code> blocks that export <code>GOWDKMount&lt;PageID&gt;</code> with -<code>//go:wasmexport</code> compile to client-side Go WASM and emit a page mount loader. -Targets such as <code>addon.contracts</code> are preserved for lane-specific extraction. -Configured addons that implement -<code>gowdk.GoBlockConsumer</code> can validate <code>go addon.&lt;name&gt; {}</code> blocks and emit -generated app Go files.</p><p>Old <code>act name { ... }</code> and <code>api name { ... }</code> forms are rejected with migration -diagnostics.</p><p>It validates first-slice action fragment targets, captures their body text, and -the generated embedded app can serve the first rendered action fragment response -for partial POSTs. It does not validate broader statement syntax, full markup -syntax, expressions, or most block body contents.</p><p>The canonical AST, recovery, and semantic-analysis model lives in the language -docs in this directory; implementation remains incremental.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/guards/index.html b/docs-site/dist/site/docs/language/guards/index.html deleted file mode 100644 index 365c9276..00000000 --- a/docs-site/dist/site/docs/language/guards/index.html +++ /dev/null @@ -1,58 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Guards And Default-Deny Page Access - GOWDK</title> - <meta name="description" content="This is the single source of truth for how guard and page access control work in GOWDK. Other docs (spec, routing, ssr, hooks) describe their own concerns and link here for the..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Guards And Default-Deny Page Access - GOWDK"> - <meta property="og:description" content="This is the single source of truth for how guard and page access control work in GOWDK. Other docs (spec, routing, ssr, hooks) describe their own concerns and link here for the..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Guards And Default-Deny Page Access - GOWDK"> - <meta name="twitter:description" content="This is the single source of truth for how guard and page access control work in GOWDK. Other docs (spec, routing, ssr, hooks) describe their own concerns and link here for the..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Guards And Default-Deny Page Access</h1><p class="doc-lead">This is the single source of truth for how guard and page access control work in GOWDK. Other docs (spec, routing, ssr, hooks) describe their own concerns and link here for the access contract.</p></header><article class="prose"><p>This is the single source of truth for how <code>guard</code> and page access control -work in GOWDK. Other docs (spec, routing, ssr, hooks) describe their own -concerns and link here for the access contract.</p><h2 id="the-contract">The Contract</h2><p>A page is <strong>not public by default</strong>. Access is never granted by omission.</p><ul><li><code>guard</code> is <strong>optional</strong> on a page source. A page that declares no <code>guard</code> -still builds — the build succeeds — but it is denied (403) at request time -until access is stated.</li><li>A guardless page emits a <code>missing_page_guard</code><strong>warning</strong> so the omission is -visible to authors and editors.</li><li>Use <code>guard public</code> to serve a page on purpose.</li><li>Use custom guard IDs, or native RBAC IDs such as <code>role:admin</code> and -<code>permission:posts.write</code>, when the page is protected.</li><li><code>guard public</code> must stand alone — it cannot be combined with other guard IDs -(<code>public_guard_exclusive</code>).</li></ul><pre><code class="language-gwdk">route &#34;/&#34; -guard public # intentionally public - -route &#34;/dashboard&#34; -guard auth.required # protected - -route &#34;/draft&#34; -# no guard -&gt; builds with a warning, route returns 403 until a guard is added -</code></pre><h2 id="how-denial-is-enforced">How Denial Is Enforced</h2><p>The default-deny is enforced differently per render mode, but the observable -result is the same: a guardless page route returns <strong>403</strong>.</p><table><thead><tr><th>Page kind</th><th>Enforcement</th></tr></thead><tbody><tr><td>Static / build-time (SPA)</td><td>The generated app carries a deny registry. The route returns 403 before serving any static artifact.</td></tr><tr><td>Dynamic build-time (<code>paths {}</code>)</td><td>The page <strong>route pattern</strong> (e.g. <code>/blog/{slug}</code>) is denied, so every concrete artifact expanded from <code>paths {}</code> returns 403 — not just the pattern string.</td></tr><tr><td>Request-time (SSR / <code>server {}</code>)</td><td>The generated SSR handler returns 403 before running any context, load, or HTML statements.</td></tr></tbody></table><p>The deny check normalizes the request path first, so a page emitted as -<code>&lt;route&gt;/index.html</code> is denied when fetched directly by its file path -(<code>/dashboard/index.html</code>) and by its trailing-slash directory form, not only by -its canonical route.</p><h3 id="backend-endpoints-cannot-be-public-by-omission">Backend Endpoints Cannot Be Public By Omission</h3><p>A page that declares <code>act</code>, <code>api</code>, or <code>fragment</code> blocks derives request-time -endpoints that inherit the page&#39;s guards. If such a page declared no <code>guard</code>, -those endpoints would be publicly callable even though the page&#39;s own GET route -is denied. That contradicts the contract, so it is a <strong>build error</strong> (not a -warning): a guardless page with backend endpoints fails the build with -<code>missing_page_guard</code> until a guard is declared.</p><h2 id="static-export-caveat">Static Export Caveat</h2><p>The 403 is enforced by the generated Go server. A pure static export served -without that server cannot enforce denial — the build warning is the backstop. -Do not rely on static hosting alone to protect a guardless page.</p><h2 id="status">Status</h2><p><code>guard</code> validation currently records and checks metadata and enforces the -default-deny described above. Guard functions return <code>nil</code> to allow a request -or an <code>error</code> to stop it. Ordinary errors fail closed with 403; explicit -<code>runtime/guard.RedirectTo</code>, <code>runtime/guard.Redirect</code>, and -<code>runtime/guard.Respond</code> errors write no-store redirects or custom responses. -Full authorization and richer request-local state are still planned — see -<a href="/docs/engineering/security/">docs/engineering/security.md</a>.</p><h2 id="related">Related</h2><ul><li><a href="/docs/language/spec/">spec.md</a> — full page keyword and metadata declaration contract.</li><li><a href="/docs/reference/routing/">docs/reference/routing.md</a> — route validation and plans.</li><li><a href="/docs/language/ssr/">ssr.md</a> — request-time render mode and <code>server {}</code>.</li><li><a href="/docs/language/diagnostics/">diagnostics.md</a> — <code>missing_page_guard</code>, <code>public_guard_exclusive</code>.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/hybrid/index.html b/docs-site/dist/site/docs/language/hybrid/index.html deleted file mode 100644 index 845f4251..00000000 --- a/docs-site/dist/site/docs/language/hybrid/index.html +++ /dev/null @@ -1,34 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Hybrid Rendering - GOWDK</title> - <meta name="description" content="Hybrid rendering is not exposed as separate source syntax."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Hybrid Rendering - GOWDK"> - <meta property="og:description" content="Hybrid rendering is not exposed as separate source syntax."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Hybrid Rendering - GOWDK"> - <meta name="twitter:description" content="Hybrid rendering is not exposed as separate source syntax."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Hybrid Rendering</h1><p class="doc-lead">Hybrid rendering is not exposed as separate source syntax.</p></header><article class="prose"><p>Hybrid rendering is not exposed as separate source syntax.</p><p>Pages default to build-time SPA output. Use <code>server {}</code> or <code>go server {}</code> when a -page must run through generated request-time rendering. Both require the SSR -addon.</p><p>The compiler still has internal <code>hybrid</code> route metadata for generated route -reports and configured render defaults, but there is no page metadata -declaration for selecting hybrid behavior in <code>.gwdk</code> files. A page without -<code>server {}</code> remains build-time SPA output; a page with <code>server {}</code> or <code>go server {}</code> -uses the integrated request-time page lane.</p><p>Current generated hybrid behavior is deliberately narrow:</p><ul><li>Concrete and dynamic request-time pages can be built into generated binaries.</li><li>Page-level <code>cache</code> and <code>revalidate</code> use the same HTTP Cache-Control contract -as SPA and SSR HTML.</li><li>Actions and fragments refresh data explicitly through redirects, fragment -responses, JSON, or reload responses.</li></ul><p>Deferred hybrid behavior:</p><ul><li>streaming responses;</li><li>browser-owned server-data refresh;</li><li>non-HTTP revalidation;</li><li>implicit action invalidation of page load data.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/index.html b/docs-site/dist/site/docs/language/index.html deleted file mode 100644 index ebb667c5..00000000 --- a/docs-site/dist/site/docs/language/index.html +++ /dev/null @@ -1,58 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>GOWDK Language - GOWDK</title> - <meta name="description" content="This directory documents the current .gwdk language contract."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="GOWDK Language - GOWDK"> - <meta property="og:description" content="This directory documents the current .gwdk language contract."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="GOWDK Language - GOWDK"> - <meta name="twitter:description" content="This directory documents the current .gwdk language contract."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>GOWDK Language</h1><p class="doc-lead">This directory documents the current .gwdk language contract.</p></header><article class="prose"><p>This directory documents the current <code>.gwdk</code> language contract.</p><p>The current implementation supports line-oriented page metadata, page-level Go -imports for build-time data, GOWDK <code>use</code> declarations for page-level -cross-package component calls, explicit component metadata, top-level block -detection, the first typed action input/redirect/fragment-metadata subset, the -first API method/route metadata subset, minimal literal <code>view {}</code> markup parsing, -metadata capture for <code>go {}</code> inline Go authoring blocks, -first-slice <code>g:post</code>, <code>g:target</code>, and <code>g:swap</code> lowering, literal dynamic SPA -route expansion, literal build data, imported Go build data functions with -optional <code>gowdk.BuildParams</code> route params, default <code>go {}</code> build-data functions, package -type-checking for saved default <code>go {}</code> blocks, generated -<code>gowdk_go/</code> packages for default <code>go {}</code> and <code>go server {}</code> blocks, -same-page action/API/fragment handlers from default <code>go {}</code> blocks, -page-level <code>go client {}</code> WASM mounts, <code>go server {}</code> load -handlers, configured-addon -<code>go addon.&lt;name&gt; {}</code> validation and generated app Go file emission through -<code>gowdk.GoBlockConsumer</code>, route/build-data -interpolation in views, Go-typed component props/state contracts, first-slice -generated JavaScript islands for stateful components, component-level <code>wasm</code> -island asset emission, formatting, diagnostics, manifest output, build output -for simple SPA pages/components, generated partial fragment responses for -embedded apps, and LSP/editor integration. It does not yet implement full typed -action semantics, API request/response -bodies, broad local client-side reactivity, or full semantic/type analysis -outside the component contract and inline package-go-block slices.</p><h2 id="current-files">Current Files</h2><ul><li><code>spec.md</code>: compact current <code>.gwdk</code> language contract for M2 compiler work.</li><li><code>syntax.md</code>: lexical tokens and accepted top-level forms.</li><li><code>grammar.md</code>: current parser grammar and future grammar boundaries.</li><li><code>semantics.md</code>: current render-mode and validation rules.</li><li><code>guards.md</code>: <code>guard</code> and the default-deny page access contract.</li><li><code>blocks.md</code>: block meanings and current parser support.</li><li><code>data.md</code>: build-time data, request-time load data, endpoint data, and -invalidation boundaries.</li><li><code>markup.md</code>: current <code>view {}</code> status and planned markup behavior.</li><li><code>components.md</code>: component status and portability rules.</li><li><code>layouts.md</code>: layout metadata and planned layout resolution.</li><li><code>docs/reference/routing.md</code>: route validation, route plans, and generated -route output.</li><li><code>actions.md</code>: action status and planned typed action behavior.</li><li><code>api.md</code>: API block status and planned handler behavior.</li><li><code>audit.md</code>: <code>*.audit.gwdk</code> policy and generated audit test syntax.</li><li><code>partials.md</code>: partial update status and planned fragment behavior.</li><li><code>forms.md</code>: form submission, progressive enhancement, validation, and -invalidation boundaries.</li><li><code>ssr.md</code>: SSR render-mode, <code>load</code>, and guard behavior.</li><li><code>hybrid.md</code>: hybrid request-time behavior and deferred hybrid capabilities.</li><li><code>diagnostics.md</code>: current diagnostic shape and known codes.</li><li><code>formatting.md</code>: current formatter behavior.</li><li><code>stability.md</code>: per-construct stability and deprecation tiers.</li><li><code>conformance.md</code>: machine-checked accept/reject corpus that pins the contract.</li></ul><h2 id="file-kinds">File Kinds</h2><p>The compiler currently treats every parsed file as a page file. A minimal page -uses:</p><pre><code class="language-gwdk">route &#34;/&#34; -guard public -</code></pre><p>The page ID derives from the filename unless <code>page</code> is present.</p><p>Component files are supported as explicit or discovered <code>gowdk build</code> inputs -with <code>component</code>. Layout files are also supported. <code>*.audit.gwdk</code> files are a -separate audit policy/test kind consumed by <code>gowdk audit</code>; they do not generate -pages. Separate island file kinds are planned.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/layouts/index.html b/docs-site/dist/site/docs/language/layouts/index.html deleted file mode 100644 index 7c50bbe5..00000000 --- a/docs-site/dist/site/docs/language/layouts/index.html +++ /dev/null @@ -1,92 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Layouts - GOWDK</title> - <meta name="description" content="The current parser records page layout metadata as an ordered list of layout references:"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Layouts - GOWDK"> - <meta property="og:description" content="The current parser records page layout metadata as an ordered list of layout references:"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Layouts - GOWDK"> - <meta name="twitter:description" content="The current parser records page layout metadata as an ordered list of layout references:"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Layouts</h1><p class="doc-lead">The current parser records page layout metadata as an ordered list of layout references:</p></header><article class="prose"><p>The current parser records page <code>layout</code> metadata as an ordered list of layout -references:</p><pre><code class="language-gwdk">layout root, dashboard -</code></pre><p>A layout&#39;s identity comes from its file name. A file named <code>root.layout.gwdk</code> -declares the layout <code>root</code>, and <code>dashboard.layout.gwdk</code> declares <code>dashboard</code>. -Layout files do not declare identity with <code>layout</code>; they only provide view -markup and, optionally, the parent layout they nest within:</p><pre><code class="language-gwdk">view { - &lt;slot /&gt; -} -</code></pre><p>Inside a layout file, <code>layout</code> is optional and declares the parent layout(s) -this layout nests within, not the layout&#39;s own identity. For example, -<code>dashboard.layout.gwdk</code> can declare <code>layout root</code> to nest the <code>dashboard</code> shell -inside the <code>root</code> shell:</p><pre><code class="language-gwdk">layout root - -view { - &lt;aside&gt;Dashboard nav&lt;/aside&gt; - &lt;slot /&gt; -} -</code></pre><p>A layout that references itself, or that forms a cycle through other layouts, -is a compile error (<code>layout_self_reference</code>, <code>cyclic_layout_reference</code>). A -<code>layout</code> parent that does not resolve to a declared layout reports -<code>unknown_layout_id</code>.</p><p>Bare layout references are same-package references. A page in package <code>pages</code> -can use <code>layout root</code> when a discovered layout file in package <code>pages</code> declares -the layout <code>root</code> (that is, <code>root.layout.gwdk</code>). Package-less fixtures keep the -legacy package-less lookup.</p><p>Cross-package layouts require a GOWDK source import and a qualified layout -reference:</p><pre><code class="language-gwdk">package pages - -route &#34;/&#34; -guard public -layout chrome.root - -use chrome &#34;layouts&#34; - -view { - &lt;main&gt;Home&lt;/main&gt; -} -</code></pre><p>The quoted <code>use</code> target is a discovered <code>.gwdk</code> package name, not a Go import -path. The qualified reference <code>chrome.root</code> resolves to the layout <code>root</code> (the -file <code>root.layout.gwdk</code>) in package <code>layouts</code>. Unqualified cross-package lookup -is rejected so layout reuse does not depend on global IDs or folder locations. -Layout files do not support <code>use</code> declarations yet; parent layouts declared -inside a layout file must be same-package references.</p><p>When layout files are part of the project manifest, compiler validation resolves -page <code>layout</code> references by package and declared ID and reports unknown or -duplicate layout IDs. Duplicate layout IDs are allowed across different GOWDK -packages and rejected inside the same package. App generation composes declared -page layouts by replacing each layout&#39;s single <code>&lt;slot /&gt;</code> placeholder with the -child page or inner layout source before rendering the combined markup once. -Generated request-time pages use the same composition path for <code>server {}</code> and -hybrid routes, so declared load fields can render in both the page body and its -layout stack with request-time escaping. Generated request-time route metadata -also carries the declared layout stack through <code>runtime/app.Route(ctx)</code>.</p><p>The SSR addon exposes request-aware <code>LayoutFunc</code>, <code>LayoutRegistry</code>, and -<code>ComposeLayouts</code> contracts for runtime helpers that need to apply the same -outermost-to-innermost layout order while passing the request <code>LoadContext</code> to -each layout.</p><p>Current app-shell layout rules:</p><ul><li>A layout&#39;s identity is its file name: <code>root.layout.gwdk</code> declares the layout -<code>root</code>.</li><li>Layouts are declared outermost to innermost, for example -<code>layout root, dashboard</code>.</li><li>Inside a layout file, <code>layout</code> is optional and names the parent layout(s) the -layout nests within.</li><li>Cross-package layouts use <code>layout alias.id</code> with a page-level -<code>use alias &#34;package&#34;</code> declaration.</li><li>Layout files cannot declare <code>use</code>; cross-package parent layouts are deferred -until a layout-local import contract is stable.</li><li>Each layout must contain exactly one <code>&lt;slot /&gt;</code> placeholder. Layouts with zero -or multiple slots are rejected at validation time (<code>layout_slot_count</code>).</li><li>A layout may not reference itself or form a cyclic inheritance chain.</li><li>Layout markup is rendered through the same escaped view renderer as -pages.</li><li>Request-time layout markup can read fields declared by the page&#39;s <code>server {}</code> -block. Missing fields fail the generated request with the same no-store error -policy as page body load failures.</li><li>Hybrid pages use the same generated request-time layout composition when -their render mode is selected by config or IR. This does not make request-time -rendering the default; pages still opt in through <code>server {}</code>, <code>go server {}</code>, -or internal hybrid route metadata.</li></ul><p>Rules that should remain true as implementation grows:</p><ul><li>Layout identity comes from the file&#39;s base name, not from its folder location -or a global ID.</li><li>Page portability must not depend on the source folder path.</li><li>Missing, self-referential, cyclic, or same-package duplicate layout IDs -produce validation diagnostics when layout files are included in the manifest.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/markup/index.html b/docs-site/dist/site/docs/language/markup/index.html deleted file mode 100644 index 2748c34f..00000000 --- a/docs-site/dist/site/docs/language/markup/index.html +++ /dev/null @@ -1,267 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Markup - GOWDK</title> - <meta name="description" content="view {} is currently captured and parsed for the first SPA build subset. This page is the contract for the supported markup subset; syntax not listed here is unsupported unless..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Markup - GOWDK"> - <meta property="og:description" content="view {} is currently captured and parsed for the first SPA build subset. This page is the contract for the supported markup subset; syntax not listed here is unsupported unless..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Markup - GOWDK"> - <meta name="twitter:description" content="view {} is currently captured and parsed for the first SPA build subset. This page is the contract for the supported markup subset; syntax not listed here is unsupported unless..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Markup</h1><p class="doc-lead">view {} is currently captured and parsed for the first SPA build subset. This page is the contract for the supported markup subset; syntax not listed here is unsupported unless another language reference explicitly says otherwise.</p></header><article class="prose"><p><code>view {}</code> is currently captured and parsed for the first SPA build subset. This -page is the contract for the supported markup subset; syntax not listed here is -unsupported unless another language reference explicitly says otherwise.</p><h2 id="contract-decisions">Contract Decisions</h2><ul><li><code>view {}</code> markup expands only through GOWDK-owned AST nodes and <code>g:</code> -directives. There is no implicit pass-through lane: foreign template syntax -and unknown <code>g:</code> attributes are rejected with explicit diagnostics instead -of being translated or silently ignored.</li><li>Rendered text and attributes are escaped by default. The one explicit raw -HTML opt-in is the <code>g:unsafe-html={Expr}</code> directive documented below; all other raw -HTML syntax (including <code>{@html ...}</code>) is rejected.</li><li>URL-bearing attributes accept local, relative, fragment, query, <code>http</code>, -<code>https</code>, <code>mailto</code>, and <code>tel</code> values. Active-content schemes, -protocol-relative URLs, and control characters are rejected.</li><li>Raw inline event handler attributes such as <code>onclick</code> are rejected. Use -<code>g:on:*</code> inside stateful components for compiler-owned local behavior.</li><li><code>&lt;script&gt;</code> tags and <code>srcdoc</code> are not part of <code>view {}</code>. Use configured or -scoped script assets for explicit scripts, and <code>g:unsafe-html={Expr}</code> only for -trusted or sanitized HTML content.</li><li>Snippet/render blocks are not supported. Use GOWDK component slots for the -supported reusable-markup model.</li><li>Head management is page metadata, not <code>view {}</code> markup. Use <code>title</code>, -<code>description</code>, <code>canonical</code>, <code>image</code>, <code>robots</code>, <code>noindex</code>, <code>preload</code>, and -<code>prefetch</code>.</li><li>External template syntax is rejected instead of translated implicitly.</li></ul><p>Deferred construct families each fail with a registered diagnostic (see -<a href="/docs/language/diagnostics/">diagnostics.md</a>) rather than ad-hoc behavior:</p><ul><li>Async placeholder directives (<code>g:await</code>/<code>g:async</code>) are deferred. Use the -bounded <code>{#await fetchJSON[T](urlExpr)}</code> block inside client islands when a -local loading/error placeholder is needed.</li><li>Transitions and animations are bounded CSS hooks. <code>g:transition</code> attaches -enter/leave classes to client <code>g:if</code> branches and keyed client <code>g:for</code> rows; -<code>g:animate</code> attaches move classes to keyed client <code>g:for</code> rows. Animation -values live in user or addon CSS.</li><li>Document/window/body/head targets (<code>g:window</code>, <code>g:document</code>, <code>g:body</code>, -<code>g:head</code>) are deferred. The diagnostic points at page metadata and -element-level <code>g:on:*</code> (<code>unsupported_markup_directive</code>). <code>g:target</code> values -must be literal <code>#id</code> selectors, so DOM/document targets are also rejected -there by value validation.</li><li>DOM actions/attachments (<code>g:use</code>, <code>g:action</code>, <code>g:attach</code>) are deferred. The -diagnostic points at component <code>client {}</code> blocks with <code>g:ref</code> -(<code>unsupported_markup_directive</code>).</li><li>Raw HTML beyond the <code>g:unsafe-html</code> hatch — <code>{@html ...}</code> and any other foreign -raw-HTML syntax — is rejected with guidance toward <code>g:unsafe-html={Expr}</code> -(<code>unsupported_markup_syntax</code>).</li></ul><p>Implemented today:</p><ul><li><p>Lowercase HTML element tags.</p></li><li><p>SPA quoted attributes.</p></li><li><p>Boolean attributes.</p></li><li><p>Expression attributes such as <code>data-title={post.Title}</code> using the same -interpolation scope as text.</p></li><li><p>Safe URL attributes such as <code>href</code>, <code>src</code>, <code>srcset</code>, <code>action</code>, and -<code>formaction</code>, with unsafe schemes and protocol-relative URLs rejected.</p></li><li><p>Class shorthand such as <code>.text-4xl</code> and <code>.font-bold</code>, normalized into -ordinary <code>class</code> attributes.</p></li><li><p>ID shorthand such as <code>#hero</code>, normalized into an ordinary <code>id</code> attribute.</p></li><li><p>Self-closing tags rendered as explicit open/close tags.</p></li><li><p>SPA text and attribute values, escaped before output.</p></li><li><p><code>{name}</code> and dotted-name interpolation such as <code>{post.Title}</code> in page text and -quoted attributes when SPA build data is available, including route params -from literal <code>paths {}</code> and string values from literal <code>build {}</code> or imported -Go build data functions.</p></li><li><p>Explicit route-param interpolation with <code>{param(&#34;slug&#34;)}</code> in page text, -quoted attributes, and component prop values. SPA builds validate that -each referenced param is declared by the page route. Inside quoted attributes, -escape the inner quotes as <code>{param(\&#34;slug\&#34;)}</code>.</p></li><li><p>Self-closing component calls such as <code>&lt;Hero title=&#34;GOWDK&#34; /&gt;</code> when the component file is passed to <code>gowdk build</code>.</p></li><li><p>Wrapper component calls such as <code>&lt;Panel&gt;...&lt;/Panel&gt;</code>, with child markup -rendered into <code>&lt;slot /&gt;</code> in the component view.</p></li><li><p>Named component slots using caller-side <code>&lt;template g:slot=&#34;name&#34;&gt;...&lt;/template&gt;</code> -and component-side <code>&lt;slot name=&#34;name&#34;&gt;fallback&lt;/slot&gt;</code>.</p></li><li><p>Scalar scoped slot values using component-side <code>&lt;slot name=&#34;row&#34; value={Field} /&gt;</code> -and caller-side <code>&lt;template g:slot=&#34;row&#34; let:value&gt;...&lt;/template&gt;</code>.</p></li><li><p><code>{prop}</code> text and attribute interpolation inside component views.</p></li><li><p>Component prop values can interpolate page build data, such as -<code>&lt;Hero title=&#34;{slug}&#34; /&gt;</code>.</p></li><li><p><code>g:post={action}</code> on <code>&lt;form&gt;</code>, lowered to <code>method=&#34;post&#34;</code> and the current -concrete route when the action exists.</p></li><li><p><code>g:target=&#34;#id&#34;</code> and <code>g:swap=&#34;innerHTML|outerHTML&#34;</code> on <code>g:post</code> forms, -lowered to <code>data-gowdk-target</code> and <code>data-gowdk-swap</code> for future partial -runtime enhancement.</p></li><li><p><code>g:message:required</code>, <code>g:message:minlength</code>, <code>g:message:maxlength</code>, and -<code>g:message:pattern</code> on literal controls inside <code>g:post</code> forms to attach -request-shape validation messages to the generated action schema. Each -message directive must match a literal HTML constraint on the same control.</p></li><li><p><code>g:on:&lt;event&gt;={...}</code> on elements inside stateful components. The first -generated-JS expression subset supports field increment/decrement, -assignment from typed scalar expressions, arithmetic, comparisons, boolean -logic, parentheses, scalar field reads, and calls to component-local client -functions such as <code>g:on:click={Increment()}</code> and -<code>g:on:click={Add(Count + 1)}</code>.</p></li><li><p>Event directives can use <code>.prevent</code>, <code>.stop</code>, <code>.once</code>, <code>.capture</code>, -<code>.debounce(duration)</code>, and <code>.throttle(duration)</code> modifiers, for example -<code>g:on:submit.prevent={Save()}</code> and -<code>g:on:input.debounce(250ms)={Search()}</code>.</p></li><li><p>DOM event expressions can read the compiler-owned event scope: -<code>event.value</code>, <code>event.checked</code>, <code>event.key</code>, <code>event.code</code>, -<code>event.clientX</code>, and <code>event.clientY</code>.</p></li><li><p>Component <code>client {}</code> blocks can declare <code>on mount</code>, <code>on destroy</code>, and -<code>effect when Field</code> blocks. These blocks use the same state-mutation subset -as client functions; effects rerun after the named state field changes and -can return cleanup blocks with <code>return { ... }</code>.</p></li><li><p>Component <code>client {}</code> blocks can declare DOM refs such as -<code>ref searchInput HTMLInputElement</code>; elements bind them with -<code>g:ref={searchInput}</code>. Ref statements only support <code>Focus</code>, <code>Blur</code>, and -<code>ScrollIntoView</code>.</p></li><li><p>Component <code>client {}</code> blocks can declare computed values with <code>return expr</code> -or one Go-style <code>if</code> return followed by a fallback return. -Computed values are read-only, can depend on props, state, and earlier -computed values, and update dependent bindings after state changes.</p></li><li><p><code>g:if={boolExpr}</code>, <code>g:else-if={boolExpr}</code>, and <code>g:else</code> on sibling elements -inside stateful components. The static first render may mark inactive -branches with <code>hidden</code>; after island mount, generated JavaScript mounts the -active branch and unmounts inactive branches.</p></li><li><p><code>g:bind:value={Field}</code> on <code>&lt;input&gt;</code>, <code>&lt;textarea&gt;</code>, and <code>&lt;select&gt;</code> inside -stateful components when <code>Field</code> is a string state field. Numeric state -fields can bind to <code>&lt;input type=&#34;number&#34;&gt;</code>. The first slice emits the -initial value, updates state on control events, and syncs the control after -other state changes.</p></li><li><p>Radio groups can bind string state with -<code>&lt;input type=&#34;radio&#34; value=&#34;...&#34; g:bind:value={Field}&gt;</code>.</p></li><li><p><code>g:bind:checked={Field}</code> on checkbox <code>&lt;input&gt;</code> elements inside stateful -components when <code>Field</code> is a bool state field. It emits the initial -<code>checked</code> state, updates state on <code>change</code>, and syncs after other state -changes.</p></li><li><p>Local form bindings can be used inside normal <code>g:post</code> action forms. Binding -listeners do not add submit interception; the action form still posts through -its lowered <code>method</code> and <code>action</code>.</p></li><li><p><code>g:subscribe=&#34;pkg.PresentationEvent&#34;</code> on the same element as <code>g:query</code>. -This declares realtime subscription metadata for a query-owned region, -renders <code>data-gowdk-subscribe</code> plus a validated event-type marker, requires -<code>realtime.Addon()</code>, and validates the referenced Go contract as a -browser-facing presentation event. Generated apps mount subscription-filtered -SSE fanout, and generated <code>gowdk.js</code> can apply explicit <code>replaceHTML</code> -presentation-event patches to the query-owned region.</p></li><li><p>Component-call bindings use the component contract described in -<a href="/docs/language/components/">components.md</a>: <code>g:bind:&lt;ExportedState&gt;={ParentState}</code> binds -parent UI state to an exported child state field.</p></li><li><p>Reactive expression attributes on safe non-URL attributes inside stateful -components, such as <code>disabled={Open}</code> and <code>aria-expanded={Open}</code>. Boolean -HTML attributes are toggled as attributes; scalar and ARIA attributes are -stringified.</p></li><li><p>Class toggles on elements inside stateful components, such as -<code>class:active={Open}</code>. The expression must be bool, literal classes are -preserved, and the generated island runtime updates <code>classList</code>.</p></li><li><p>Style bindings on elements inside stateful components, such as -<code>style:height.px={PanelHeight}</code> and <code>style:width.%={WidthPercent}</code>. The -expression must be string or numeric, literal style declarations are -preserved, and the generated island runtime updates the CSS property.</p></li><li><p>Island expressions can read nested fields and indexed values from Go-typed -state, such as <code>User.Name</code>, <code>Items[0].Name</code>, and <code>Flags[Count]</code>.</p></li><li><p>Island expressions can choose values with the Go-ish conditional expression -<code>if Open { &#34;open&#34; } else { &#34;closed&#34; }</code>.</p></li><li><p>Elements inside stateful components can render Go-typed slice state with -<code>g:for={item in Items}</code> or <code>g:for={item, i in Items}</code> and a required scalar -<code>g:key={item.ID}</code>. The first slice supports item field interpolation such as -<code>{item.Name}</code>, index interpolation such as <code>{i}</code>, and keyed row reuse/reorder -during island render passes. Over component <code>state</code>/<code>store</code> this <code>g:for</code> is a -<strong>client island</strong>; over a <code>server {}</code> field the same <code>g:for</code> is a server list -(next item). The compiler infers the lane from the operand&#39;s data source.</p></li><li><p><code>g:transition=&#34;name&#34;</code> on the same element as a client <code>g:if</code>, -<code>g:else-if</code>, <code>g:else</code>, or keyed client <code>g:for</code> row. The runtime toggles -<code>gowdk-transition</code>, <code>gowdk-transition-name</code>, <code>gowdk-transition-enter</code>, -<code>gowdk-transition-enter-from</code>, <code>gowdk-transition-enter-to</code>, -<code>gowdk-transition-leave</code>, <code>gowdk-transition-leave-from</code>, and -<code>gowdk-transition-leave-to</code>. The value must be a literal CSS-safe identifier; -no animation CSS is generated by core.</p></li><li><p><code>g:animate=&#34;name&#34;</code> on the same element as a keyed client <code>g:for</code> row. When a -keyed row is reused at a different index, the runtime toggles <code>gowdk-animate</code>, -<code>gowdk-animate-name</code>, and <code>gowdk-animate-move</code>. The value must be a literal -CSS-safe identifier.</p></li><li><p><code>g:for</code>/<code>g:if</code> over a <strong><code>server {}</code> request-time field</strong> render <strong>server-side</strong>. -<code>g:for={item in field}</code> (or <code>g:for={item, i in field}</code>) renders rows with -escape-by-default interpolation (<code>{item.Name}</code>, <code>{i}</code>); server lists nest — a -nested <code>g:for={child in item.children}</code> resolves its slice per parent row. -<code>g:if={field}</code> / <code>g:if={!field}</code> conditionally renders a branch, and a -top-level server <code>g:if</code> accepts a full bool expression -(<code>g:if={count &gt; 0 &amp;&amp; status == &#34;open&#34;}</code>) evaluated at request time. The lane is -chosen by the data source — a declared <code>server {}</code> field is server-rendered; -<code>state</code>/<code>store</code> is a client island. See <a href="/docs/language/ssr/">ssr.md</a> for the full -server-region contract. (<code>g:each</code>/<code>g:when</code> were unified into <code>g:for</code>/<code>g:if</code>; -the old names parse to a migration nudge.)</p></li><li><p>Client handlers can mutate state arrays with compiler-owned built-ins: -<code>append(Items, { Field: expr })</code>, <code>remove(Items, index)</code>, and -<code>move(Items, from, to)</code>.</p></li><li><p>Client expressions support first-slice compiler-owned built-ins: -<code>len(value)</code>, <code>lower(value)</code>, <code>upper(value)</code>, <code>contains(value, query)</code>, -<code>string(value)</code>, <code>int(value)</code>, and <code>float(value)</code>.</p></li><li><p>Component-level <code>wasm</code> declarations make normal calls to that component use -WASM island assets. <code>g:island=&#34;wasm&#34;</code> remains a call-site override. Unknown -<code>g:island</code> values are compile/render errors. Without <code>wasm</code> or <code>g:island</code>, -stateful component calls use generated JavaScript by default.</p></li><li><p>Bounded client-island await blocks:</p><pre><code class="language-gwdk">{#await fetchJSON[[]Item](&#34;/api/items&#34;)} - &lt;p&gt;Loading&lt;/p&gt; -{:then results} - &lt;ul&gt; - &lt;li g:for={item in results} g:key={item.ID}&gt;{item.Name}&lt;/li&gt; - &lt;/ul&gt; -{:catch err} - &lt;p&gt;{err.message}&lt;/p&gt; -{/await} -</code></pre><p>Await blocks are local browser-island behavior. The expression must be -<code>fetchJSON[T](urlExpr)</code> where <code>urlExpr</code> is a bounded client expression. The -<code>then</code> branch receives the resolved value; the optional <code>catch</code> branch -receives an error object with <code>message</code>. Await blocks do not support arbitrary -promises, raw JavaScript, <code>g:await</code>, or <code>g:async</code>.</p></li><li><p>The explicit raw HTML escape hatch <code>g:unsafe-html={Expr}</code> on a non-void element -without markup children. See the &#34;Raw HTML (<code>g:unsafe-html</code>)&#34; section below.</p></li><li><p>Familiar external-template block syntax such as <code>{#if}</code>, <code>{#each}</code>, -<code>{#snippet}</code>, <code>{@html}</code>, <code>{@const}</code>, and <code>{@debug}</code> is rejected with -diagnostics that point to the current GOWDK-native alternatives — -<code>{@html body}</code> now points at the explicit <code>g:unsafe-html={Expr}</code> directive. -These diagnostics are guidance only; they do not imply that GOWDK will -implement those external constructs feature-for-feature.</p></li><li><p>Unknown <code>g:</code> attributes are rejected at parse time with a diagnostic that -lists where the supported directive set is documented. There is no silent -pass-through for unrecognized directives.</p></li></ul><h2 id="supported-g-directives">Supported <code>g:</code> Directives</h2><p>These are the supported <code>g:</code> directives in <code>view {}</code> markup:</p><ul><li><code>g:post={Action}</code> on <code>&lt;form&gt;</code>.</li><li><code>g:target=&#34;#id&#34;</code> and <code>g:swap=&#34;innerHTML|outerHTML&#34;</code> on <code>g:post</code> forms.</li><li><code>g:message:required</code>, <code>g:message:minlength</code>, <code>g:message:maxlength</code>, and -<code>g:message:pattern</code> on literal form controls inside <code>g:post</code> forms.</li><li><code>g:on:&lt;event&gt;[.&lt;modifier&gt;...]={Expr}</code> inside stateful components. Supported -modifiers are <code>.prevent</code>, <code>.stop</code>, <code>.once</code>, <code>.capture</code>, -<code>.debounce(duration)</code>, and <code>.throttle(duration)</code>.</li><li><code>g:ref={name}</code> inside stateful components.</li><li><code>g:if={boolExpr}</code>, <code>g:else-if={boolExpr}</code>, and <code>g:else</code> inside stateful -components.</li><li><code>g:for={item in Items}</code> or <code>g:for={item, i in Items}</code> with required -<code>g:key={scalarExpr}</code> inside stateful components.</li><li><code>g:transition=&#34;name&#34;</code> on client <code>g:if</code> branches or keyed client <code>g:for</code> rows.</li><li><code>g:animate=&#34;name&#34;</code> on keyed client <code>g:for</code> rows.</li><li><code>g:bind:value={Field}</code> on <code>&lt;input&gt;</code>, <code>&lt;textarea&gt;</code>, and <code>&lt;select&gt;</code> inside -stateful components.</li><li><code>g:bind:checked={Field}</code> on checkbox <code>&lt;input&gt;</code> elements inside stateful -components.</li><li><code>g:slot=&#34;name&#34;</code> on caller-side <code>&lt;template&gt;</code> elements for named and scoped -slots.</li><li><code>g:island=&#34;wasm&#34;</code> on component calls when a call-site WASM override is needed.</li><li><code>g:command=&#34;pkg.Command&#34;</code> on forms and <code>g:query=&#34;pkg.Query&#34;</code> on HTML -elements for contract web adapters.</li><li><code>g:subscribe=&#34;pkg.PresentationEvent&#34;</code> beside <code>g:query</code> for realtime -subscription metadata.</li><li><code>g:unsafe-html={Expr}</code> on non-void HTML elements without markup children, in pages -and stateless component views. See &#34;Raw HTML (<code>g:unsafe-html</code>)&#34; below.</li></ul><p>All other <code>g:</code> directives are unsupported today and rejected at parse time -with the <code>unsupported_markup_directive</code> message. In particular, there is no -<code>g:head</code>, <code>g:window</code>, <code>g:body</code>, <code>g:document</code>, or <code>g:action</code> directive in the -compiler core.</p><h2 id="transition-and-animation-hooks">Transition And Animation Hooks</h2><p><code>g:transition</code> and <code>g:animate</code> are class/state contracts, not animation -presets. GOWDK emits stable data attributes and toggles compiler-owned classes; -authors provide CSS:</p><pre><code class="language-gwdk">view { - &lt;section g:if={Open} g:transition=&#34;fade&#34;&gt;Details&lt;/section&gt; - &lt;li g:for={item in Items} g:key={item.ID} g:transition=&#34;fade&#34; g:animate=&#34;reorder&#34;&gt; - {item.Name} - &lt;/li&gt; -} -</code></pre><pre><code class="language-css">.gowdk-transition-fade.gowdk-transition-enter-from, -.gowdk-transition-fade.gowdk-transition-leave-to { - opacity: 0; -} - -.gowdk-transition-fade.gowdk-transition-enter-to, -.gowdk-transition-fade.gowdk-transition-leave-from { - opacity: 1; -} - -.gowdk-transition-fade.gowdk-transition-enter, -.gowdk-transition-fade.gowdk-transition-leave, -.gowdk-animate-reorder.gowdk-animate-move { - transition: opacity 160ms ease, transform 160ms ease; -} -</code></pre><p>Use <code>@media (prefers-reduced-motion: reduce)</code> in user/addon CSS to remove or -shorten motion. The runtime still toggles classes so state changes remain -deterministic with or without motion.</p><p>Restrictions:</p><ul><li><code>g:transition</code> must be on the same HTML element as a client <code>g:if</code>, -<code>g:else-if</code>, <code>g:else</code>, or keyed client <code>g:for</code>.</li><li><code>g:animate</code> must be on the same HTML element as keyed client <code>g:for</code>.</li><li>Server-lane <code>g:for</code>/<code>g:if</code> over <code>server {}</code> data do not support motion -directives.</li><li>Motion names are literal CSS-safe identifiers using letters, digits, -underscore, or hyphen, and cannot start with a digit.</li><li>Component-call lifecycle motion remains out of this slice; wrap the component -in an element that owns the lifecycle directive.</li></ul><h2 id="url-event-and-script-safety">URL, Event, And Script Safety</h2><p>GOWDK escapes attribute values before output, then applies extra checks for -attributes that browsers treat as navigation or resource URLs.</p><p>Allowed URL forms:</p><ul><li>Local paths, such as <code>/docs</code>.</li><li>Relative paths, such as <code>../assets/logo.png</code>.</li><li>Fragment and query values, such as <code>#main</code> or <code>?tab=settings</code>.</li><li><code>http</code>, <code>https</code>, <code>mailto</code>, and <code>tel</code> URLs.</li></ul><p>Rejected URL forms:</p><ul><li>Active-content or ambiguous schemes such as <code>javascript:</code>, <code>vbscript:</code>, and -<code>data:</code>.</li><li>Protocol-relative and browser-normalized host-relative URLs such as -<code>//example.com/app.js</code> or <code>/\example.com/app.js</code>.</li><li>URL values containing control characters.</li></ul><p>The policy applies to literal URL attributes and to values resolved through -build data interpolation. <code>srcset</code> is checked per URL candidate. Request-time -route params and <code>server {}</code> fields are allowed in URL-bearing attributes only -inside root-relative URL templates with a stable literal prefix, such as -<code>/issue/{issue.id}</code>. During SSR and server-region rendering, accepted -request-time URL segments are URL-encoded before HTML escaping. Bare -request-time URLs such as <code>href={website}</code>, request-time-controlled first path -segments such as <code>href=&#34;/{slug}&#34;</code>, -protocol-relative URLs, backslashes, control characters, inline handlers, -<code>style</code>, and <code>srcdoc</code> are rejected. Custom attributes such as <code>data-uri</code> are -ordinary escaped attributes; the exact HTML <code>&lt;object data=&#34;...&#34;&gt;</code> attribute is -URL-bearing and follows this policy.</p><p>Raw inline event handler attributes (<code>onclick</code>, <code>onerror</code>, and other <code>on*</code> -attributes) are rejected. The supported event model is <code>g:on:*</code> inside -stateful components.</p><p>Literal <code>&lt;script&gt;</code> tags in <code>view {}</code> are rejected. Compiler-owned generated -scripts, configured scripts, scoped script assets, and island/WASM runtime -assets are emitted by the build pipeline instead of handwritten script tags in -markup. <code>srcdoc</code> is also rejected because it embeds raw HTML outside the -<code>g:unsafe-html</code> contract.</p><h2 id="raw-html-gunsafe-html">Raw HTML (<code>g:unsafe-html</code>)</h2><p><code>g:unsafe-html={Expr}</code> is the single explicit, GOWDK-owned opt-in for raw HTML -output:</p><pre><code class="language-gwdk">view { - &lt;article class=&#34;prose&#34; g:unsafe-html={post.BodyHTML}&gt;&lt;/article&gt; -} -</code></pre><p>Contract:</p><ul><li>The element renders its open and close tags normally; literal and -interpolated attributes on the element are still escaped.</li><li>The expression resolves through the same render-data lookup as <code>{Expr}</code> text -interpolation, including dotted names and component props. Unknown names -fail the same way text interpolation fails.</li><li>The resolved string is written as the element content <strong>without escaping</strong>.</li></ul><p><strong>Security warning:</strong> content rendered through <code>g:unsafe-html</code> bypasses GOWDK&#39;s -escape-by-default output. Only feed trusted or server-side sanitized HTML to -<code>g:unsafe-html</code>. Never pass user-controlled input through it; route-param -interpolation (<code>{param(&#34;...&#34;)}</code>) is rejected inside <code>g:unsafe-html</code> for this reason.</p><p>Restrictions (each is an explicit error):</p><ul><li>The element must have no children in markup; the expression provides the -whole content.</li><li><code>g:unsafe-html</code> requires an expression value (<code>g:unsafe-html={Body}</code>), not a string -literal or boolean attribute.</li><li><code>g:unsafe-html</code> is not allowed on void elements such as <code>&lt;br&gt;</code> or <code>&lt;img&gt;</code>.</li><li><code>g:unsafe-html</code> cannot combine with <code>g:for</code>/<code>g:key</code> or <code>g:bind:*</code> on the same -element.</li><li><code>g:unsafe-html</code> is rejected inside stateful component views, inside <code>g:for</code> loops, -and for island-bound reactive fields, because the island runtime re-renders -bound content as escaped text and cannot honor raw HTML there.</li></ul><p>Server-rendered fragment swaps (<code>g:post</code> + <code>g:target</code>/<code>g:swap</code>) inject -server-rendered HTML via <code>innerHTML</code>/<code>outerHTML</code>, so raw HTML rendered with -<code>g:unsafe-html</code> flows through them unchanged.</p><p>Request-time <code>server {}</code> regions selected by <code>g:for</code> or <code>g:if</code> currently support -static markup, escaped scoped interpolation, nested <code>g:for</code>, and nested <code>g:if</code>. -They do not allow component calls, <code>g:post</code>, <code>g:command</code>, <code>g:query</code>, or <code>g:on:*</code> -inside the region; use a root-relative request-time page link such as -<code>/issue/{issue.id}</code>, or move the interaction outside the server-rendered row.</p><p>Not implemented yet:</p><ul><li>Raw HTML escape hatches beyond the <code>g:unsafe-html</code> element directive, including -attribute-position or text-position raw output.</li><li>Snippet/render block syntax as a first-class reusable markup value.</li><li>Await forms beyond the bounded client-island <code>fetchJSON[T](urlExpr)</code> block, -local const tags, debug tags, DOM actions, and document/window/body/head -special targets.</li><li>Full client-side expressions beyond the first safe island subset, including -broader date/time built-ins and JavaScript-style ternaries.</li><li>Other <code>g:</code> directives beyond the supported directive list above.</li><li>Reactive URL attributes and raw <code>style={expr}</code> attributes.</li><li>Raw inline event handler attributes.</li><li>Shorthand preservation in a full component AST.</li><li>Comment preservation.</li></ul><p>Examples may show components, attributes, interpolation, and <code>g:</code> directives. -Those examples are product direction unless they fit the implemented subset -above.</p><p>Future markup work must define:</p><ul><li>HTML tag parsing.</li><li>Component invocation syntax.</li><li>Text and interpolation.</li><li>Attribute escaping.</li><li>Boolean, string, and expression attributes.</li><li><code>g:</code> directives.</li><li>Raw HTML escape hatches beyond the element-level <code>g:unsafe-html</code> directive, if any.</li><li>Source spans and diagnostics for malformed markup.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/partials/index.html b/docs-site/dist/site/docs/language/partials/index.html deleted file mode 100644 index fdb14a7c..00000000 --- a/docs-site/dist/site/docs/language/partials/index.html +++ /dev/null @@ -1,90 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Partials - GOWDK</title> - <meta name="description" content="Partial updates use server fragments, not full-page SSR. The generated slice supports action-driven fragment responses for SPA/action pages and standalone concrete or dynamic..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Partials - GOWDK"> - <meta property="og:description" content="Partial updates use server fragments, not full-page SSR. The generated slice supports action-driven fragment responses for SPA/action pages and standalone concrete or dynamic..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Partials - GOWDK"> - <meta name="twitter:description" content="Partial updates use server fragments, not full-page SSR. The generated slice supports action-driven fragment responses for SPA/action pages and standalone concrete or dynamic..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Partials</h1><p class="doc-lead">Partial updates use server fragments, not full-page SSR. The generated slice supports action-driven fragment responses for SPA/action pages and standalone concrete or dynamic fragment routes.</p></header><article class="prose"><p>Partial updates use server fragments, not full-page SSR. The generated slice -supports action-driven fragment responses for SPA/action pages and standalone -concrete or dynamic fragment routes.</p><p>Current support:</p><ul><li><p>Editor completions include <code>g:post</code>, <code>g:target</code>, and <code>g:swap</code>.</p></li><li><p>SPA builds lower <code>g:post={action}</code> on <code>&lt;form&gt;</code> to normal POST form -attributes for the first action slice.</p></li><li><p>SPA builds parse <code>g:target=&#34;#id&#34;</code> and <code>g:swap=&#34;innerHTML|outerHTML&#34;</code> on -<code>g:post</code> forms and lower them to <code>data-gowdk-target</code> and <code>data-gowdk-swap</code> -attributes for the client runtime.</p></li><li><p>SPA builds emit <code>assets/gowdk/gowdk.js</code> and a deferred script tag only when -a page uses partial form metadata with a fragment-producing action.</p></li><li><p><code>g:target</code> must reference a SPA <code>id</code> in the same direct <code>view {}</code> -markup subset.</p></li><li><p>Action bodies parse <code>fragment &#34;#id&#34; { ... }</code> metadata and capture the raw -fragment body for generated render functions and first-slice generated action -responses.</p></li><li><p>Runtime/addon package boundaries exist for partial responses and swaps.</p></li><li><p><code>addons/partial</code> exposes server fragment helpers. The underlying -<code>runtime/response</code> envelope carries target and swap metadata through -<code>X-GOWDK-Fragment-Target</code> and <code>X-GOWDK-Fragment-Swap</code> when written to HTTP.</p></li><li><p>Page files can declare standalone fragment endpoints:</p><pre><code class="language-gwdk">fragment Patients GET &#34;/patients/list&#34; &#34;#patients&#34; { - &lt;section&gt;Patients&lt;/section&gt; -} - -fragment PatientVitals GET &#34;/patients/{id:int}/vitals&#34; &#34;#patients&#34; { - &lt;section&gt;Vitals&lt;/section&gt; -} -</code></pre><p>Generated apps register these as backend endpoints, not page route kinds. -They currently require <code>GET</code>, an absolute route pattern, and a literal -id-selector target. Fragment route params use the same syntax as page routes: -<code>{name}</code>, <code>{name:type}</code>, and final-segment <code>{name...}</code>. Supported scalar -types are <code>string</code>, <code>int</code>, <code>int64</code>, <code>uint</code>, <code>uint64</code>, <code>bool</code>, and <code>float64</code>.</p></li><li><p>If the same package exports a function with the fragment name and signature -<code>func(context.Context) (response.Response, error)</code>, generated apps call that -user-owned hook at request time. The hook owns data loading, validation, -redirects, HTML, JSON, and fragment response decisions through -<code>runtime/response.Response</code>. <code>runtime/app.Request(ctx)</code> exposes the current -request, <code>runtime/app.Params(ctx)</code> exposes raw dynamic route params, and -<code>runtime/app.TypedParams(ctx)</code> exposes decoded typed route params. Generated -typed fragment bindings return <code>400</code> for invalid scalar params and <code>404</code> for -missing params before guards or fragment hooks run. If no function with the -fragment name exists, the generated handler serves the static rendered -fragment body.</p></li><li><p>Generated embedded app action handlers can respond to <code>X-GOWDK-Partial</code> -requests with rendered fragment HTML, <code>Cache-Control: no-store</code>, and fragment -target metadata. Normal POST requests still use the redirect/no-content -fallback path.</p></li><li><p>Generated standalone fragment handlers return no-store responses. Static -fallback fragments return rendered HTML, <code>Content-Type: text/html; charset=utf-8</code>, and fragment target/swap headers.</p></li><li><p>Static standalone fragment bodies expand known components at app generation -time, including page-level <code>use</code> aliases and component-scoped child -components. They are used only when no same-package request-time fragment -hook is bound.</p></li><li><p>Generated required-field validation failures on partial requests with -<code>X-GOWDK-Target</code> return an escaped validation fragment for that target, also -with <code>Cache-Control: no-store</code>.</p></li><li><p><code>internal/clientrt</code> emits a small <code>gowdk.js</code> runtime that enhances -<code>form[data-gowdk-target]</code> submissions, sends <code>X-GOWDK-Partial</code>, -<code>X-GOWDK-Target</code>, and <code>X-GOWDK-Swap</code>, applies <code>innerHTML</code> or <code>outerHTML</code> -swaps, dispatches <code>gowdk:before-request</code>, <code>gowdk:validation-blocked</code>, -<code>gowdk:after-swap</code>, and <code>gowdk:request-error</code>, and toggles <code>aria-busy</code> on the -form while the request is pending. Browser constraint validation blocks -invalid enhanced submissions before the partial request is sent. Failed -enhanced requests include <code>status</code>, <code>body</code>, and <code>response</code> in the -<code>gowdk:request-error</code> detail when an HTTP response exists. It restores focus -by matching the active element&#39;s <code>id</code> or <code>name</code> after the swap when possible. -Before a swap, it calls the generated island -destroy hook when present for islands being replaced; after the swap, it calls -the generated island mount hook so newly inserted JavaScript islands can -attach.</p></li></ul><h2 id="examples">Examples</h2><p><code>examples/endpoints/src/endpoints/fragments.page.gwdk</code> demonstrates inline validation, table -row update, list refresh, modal body update, dashboard card refresh, standalone -fragment declarations, and action handlers that return explicit fragment -responses from normal Go.</p><h2 id="swap-modes">Swap Modes</h2><p>The current swap modes are:</p><ul><li><code>innerHTML</code>: replace the target element children with the returned fragment -HTML. The target element itself remains in place.</li><li><code>outerHTML</code>: replace the target element itself with the returned fragment -HTML.</li></ul><p>Build output records these values as <code>data-gowdk-swap</code> metadata and runtime -fragment responses expose the same mode names through response metadata. The -first client runtime prefers the response <code>X-GOWDK-Fragment-Swap</code> header and -falls back to the form metadata.</p><p>Field-specific generated validation messages are documented in -<code>docs/language/actions.md</code>. The form enhancement contract is documented in -<a href="/docs/language/forms/">forms.md</a>.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/semantics/index.html b/docs-site/dist/site/docs/language/semantics/index.html deleted file mode 100644 index 4cec80c0..00000000 --- a/docs-site/dist/site/docs/language/semantics/index.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Semantics - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Semantics - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Semantics - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Semantics</h1></header><article class="prose"><h2 id="current-render-rules">Current Render Rules</h2><ul><li>Default render mode is <code>spa</code>.</li><li>Source pages do not declare render modes.</li><li><code>server {}</code> or <code>go server {}</code> selects request-time SSR and requires the SSR addon.</li><li>Page IDs must be unique within the manifest.</li><li>Component names must be unique within the manifest.</li><li>Dynamic build-time routes such as <code>/blog/{slug}</code> require a <code>paths {}</code> block. -Action endpoints on those pages inherit the generated concrete paths.</li><li>SPA navigation enhancement is optional runtime behavior over literal internal -links. Route existence, route output, auth, and server behavior remain owned -by generated files and generated Go. The runtime can prefetch same-origin -internal page HTML on hover, focus, or touch, fetch it with -<code>X-GOWDK-Navigate</code> during navigation, mark <code>&lt;html data-gowdk-navigating&gt;</code>, -dispatch <code>gowdk:navigate-start</code> / <code>gowdk:navigate-end</code>, and fall back to a -normal browser navigation on unsupported or failed responses.</li><li><code>server {}</code> runs at request time.</li><li>SPA pages may declare <code>act</code> blocks without SSR.</li></ul><h2 id="current-metadata-semantics">Current Metadata Semantics</h2><ul><li><code>route</code> is required for page sources. <code>guard</code> is optional but a page is not -public by default: a page that declares no <code>guard</code> builds with a -<code>missing_page_guard</code> warning and its route is denied (403) at request time -until access is stated. Declare <code>guard public</code> to serve a page on purpose; -declare custom guard IDs or native RBAC IDs such as <code>role:admin</code> and -<code>permission:posts.write</code> for protected pages. <code>guard public</code> must stand -alone. Access is never granted by omission.</li><li><code>page</code> is optional for file-backed page sources. When omitted, page ID -derives from the source filename by removing <code>.page.gwdk</code> or <code>.gwdk</code>. -Explicit <code>page</code> keeps page identity stable across file renames.</li><li><code>title</code>, <code>description</code>, <code>canonical</code>, <code>image</code>, <code>robots</code>, <code>noindex</code>, -<code>preload</code>, and <code>prefetch</code> record document head metadata used by generated -HTML output. If <code>title</code> is omitted, generated output falls back to the page -ID. <code>image</code> feeds generated Open Graph and Twitter image tags when social -head output is enabled by page or config metadata. <code>noindex</code> adds <code>noindex</code> -to the robots meta value and excludes otherwise public pages from generated -SEO sitemaps.</li><li><code>layout</code> records ordered page layout references. Bare references resolve to -same-package layout IDs or legacy package-less layouts. Cross-package layouts -require <code>use alias &#34;package&#34;</code> and qualified refs such as <code>alias.root</code>.</li><li><code>guard</code> records guard IDs. Generated SSR, action, API, and fragment handlers -run declared non-public guards before request-time user logic. Guarded -generated apps require matching backing functions and fail Go compilation -when those functions are missing. Non-public page guards require request-time -page rendering because build-time SPA output emits plain static HTML.</li><li>Generated SSR, action, and API handlers are protected by runtime panic -boundaries that return no-store HTTP 500 responses before headers are -written.</li><li><code>paths {}</code> records that dynamic SPA paths are declared and preserves raw -body text internally. SPA builds can execute literal string declarations -such as <code>=&gt; { slug: &#34;hello-gowdk&#34; }</code> to expand dynamic route output paths.</li><li><code>build {}</code> records block presence and raw body text internally. SPA builds -can execute one literal string declaration such as -<code>=&gt; { title: &#34;Hello&#34; }</code> and expose those values to <code>view {}</code> interpolation. -SPA builds can also execute one imported Go function call such as -<code>=&gt; interop.FeaturedCopyForBuild()</code> when the page declares -<code>import interop &#34;github.com/...&#34;</code>; dynamic <code>paths {}</code> builds pass route -params to helpers that declare one <code>gowdk.BuildParams</code> argument.</li><li><code>server {}</code> runs at request time for SSR or request-time hybrid pages. -Generated SSR supports <code>=&gt; { field, user.name }</code> declarations and -same-package Go load functions named <code>Load&lt;PageID&gt;</code> that receive -<code>ssr.LoadContext</code>.</li><li><code>view {}</code> records block presence and raw body text for the current app-shell HTML -subset. SPA builds interpolate route params and component props in text and -attribute values, escaping the result.</li><li><code>act Name POST &#34;/path&#34;</code> records exact exported action handler symbols and -endpoint paths.</li><li><code>api Name METHOD &#34;/path&#34;</code> records exact exported API handler symbols, methods, -and endpoint paths.</li></ul><h2 id="planned-semantics">Planned Semantics</h2><p>Future compiler phases must define broader symbol resolution, type checking, -layout composition, full component resolution, route parameter binding into -imported <code>build {}</code> calls, real typed action decoding and execution, generated -API/fragment execution, partial updates, cache/revalidation behavior, and -richer guard response behavior.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/spec/index.html b/docs-site/dist/site/docs/language/spec/index.html deleted file mode 100644 index d4d9eea1..00000000 --- a/docs-site/dist/site/docs/language/spec/index.html +++ /dev/null @@ -1,116 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Current .gwdk Language Spec - GOWDK</title> - <meta name="description" content="This is the current .gwdk language contract for the experimental 0.x line. It describes implemented and partial syntax only as far as the compiler supports it today. Planned..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Current .gwdk Language Spec - GOWDK"> - <meta property="og:description" content="This is the current .gwdk language contract for the experimental 0.x line. It describes implemented and partial syntax only as far as the compiler supports it today. Planned..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Current .gwdk Language Spec - GOWDK"> - <meta name="twitter:description" content="This is the current .gwdk language contract for the experimental 0.x line. It describes implemented and partial syntax only as far as the compiler supports it today. Planned..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Current .gwdk Language Spec</h1><p class="doc-lead">This is the current .gwdk language contract for the experimental 0.x line. It describes implemented and partial syntax only as far as the compiler supports it today. Planned syntax is listed so unsupported source can fail clearly instead of becoming accidental behavior.</p></header><article class="prose"><p>This is the current <code>.gwdk</code> language contract for the experimental 0.x line. It -describes implemented and partial syntax only as far as the compiler supports -it today. Planned syntax is listed so unsupported source can fail clearly -instead of becoming accidental behavior.</p><p>Detailed behavior stays in the feature pages linked from -<a href="/docs/language/">GOWDK Language</a>.</p><p>This prose is pinned by the machine-checked conformance corpus described in -<a href="/docs/language/conformance/">Conformance Corpus</a>: accepted syntax has an <code>accept/</code> case that -must check clean, and rejected syntax has a <code>reject/</code> case asserting its stable -diagnostic code. When this spec and the corpus disagree, the corpus is the -contract and one of them is a bug.</p><p>Per-construct stability and deprecation tiers (which blocks, metadata keywords, -and <code>g:</code> directives are stable, partial, planned, or deprecated) are published -in <a href="/docs/language/stability/">Language Construct Stability</a>.</p><h2 id="status-terms">Status Terms</h2><ul><li>Implemented: accepted by the current compiler and covered by tests or a -documented verification command.</li><li>Partial: accepted for a narrower slice than the final contract.</li><li>Planned: accepted direction, but not stable source behavior.</li><li>Unsupported: intentionally rejected or not accepted by the current parser.</li></ul><h2 id="file-model">File Model</h2><p><code>.gwdk</code> files are package-peer source files. They live beside normal <code>.go</code> -files and declare the same Go package name:</p><pre><code class="language-gwdk">package pages -</code></pre><p>The package declaration must be the first non-comment declaration. GOWDK source -files do not derive route identity from folders.</p><p>Current file kinds:</p><ul><li>Page files declare <code>route</code> and <code>view {}</code>. <code>guard</code> is optional but a page is -not public by default (see below). They may declare <code>page</code> when they need an -explicit stable page ID.</li><li>Component files declare <code>component</code> and usually <code>view {}</code>.</li><li>Layout files take their identity from the file name (<code>root.layout.gwdk</code> -declares the layout <code>root</code>) and declare <code>view {}</code> with exactly one <code>&lt;slot /&gt;</code>. -They may declare <code>layout</code> to name the parent layout(s) they nest within.</li></ul><p>Planned or partial file kinds:</p><ul><li>API-only files are planned separately. Current pages still own a page <code>GET</code> -route and must declare <code>view {}</code>.</li><li>Island-only files are not a separate stable file kind yet.</li></ul><h2 id="comments">Comments</h2><p>Line comments start with <code>//</code>. Empty lines and line comments are ignored by the -metadata parser outside block bodies.</p><h2 id="metadata">Metadata</h2><p>Metadata declarations start at the beginning of the trimmed line.</p><p>Implemented or partial metadata declarations:</p><ul><li><code>page &lt;id&gt;</code></li><li><code>route &#34;&lt;path&gt;&#34;</code></li><li><code>title &#34;&lt;text&gt;&#34;</code></li><li><code>description &#34;&lt;text&gt;&#34;</code></li><li><code>canonical &#34;&lt;url&gt;&#34;</code></li><li><code>image &#34;&lt;url&gt;&#34;</code></li><li><code>robots &#34;&lt;policy&gt;&#34;</code></li><li><code>noindex [true|false]</code></li><li><code>preload &#34;&lt;href&gt;&#34; [as &#34;&lt;type&gt;&#34;]</code></li><li><code>prefetch &#34;&lt;href&gt;&#34; [as &#34;&lt;type&gt;&#34;]</code></li><li><code>layout &lt;id&gt;[, &lt;id&gt;...]</code></li><li><code>cache &#34;&lt;policy&gt;&#34;</code></li><li><code>revalidate &lt;seconds|duration&gt;</code></li><li><code>error &#34;&lt;path.html&gt;&#34;</code></li><li><code>guard &lt;id&gt;[, &lt;id&gt;...]</code></li><li><code>component &lt;Name&gt;</code></li></ul><p>Unknown metadata declarations are errors. Lines starting with <code>@</code> are malformed -legacy metadata.</p><p><code>guard</code> is optional on page sources, but a page is not public by default. A -guardless page builds with a <code>missing_page_guard</code> warning and its route is -denied (403) at request time until access is stated. Use <code>guard public</code> to -serve a page on purpose, or custom/RBAC guard IDs such as <code>role:admin</code> when the -page is protected. The full access contract — default-deny enforcement, -<code>paths {}</code> and SSR coverage, and the backend-endpoint rule — lives in -<a href="/docs/language/guards/">guards.md</a>.</p><p><code>page</code> is optional for file-backed page sources. When omitted, the compiler -derives the page ID from the source filename by removing <code>.page.gwdk</code> or -<code>.gwdk</code>. For example, <code>src/pages/blog-post.page.gwdk</code> derives page ID -<code>blog-post</code>. Add <code>page blog.post</code> when a route, filename, or file location -change must not change page identity.</p><h2 id="imports-and-uses">Imports And Uses</h2><p>Go imports bind normal Go packages for build data, component props/state, and -handler references:</p><pre><code class="language-gwdk">import interop &#34;github.com/acme/app/interop&#34; -import &#34;github.com/acme/app/ui&#34; -</code></pre><p>GOWDK <code>use</code> declarations bind discovered <code>.gwdk</code> source packages for -cross-package component calls:</p><pre><code class="language-gwdk">use ui &#34;components&#34; -</code></pre><p>Go imports do not import <code>.gwdk</code> files. <code>use</code> values are package names from -discovered GOWDK sources, not Go import paths.</p><h2 id="routes">Routes</h2><p>Routes are explicit:</p><pre><code class="language-gwdk">route &#34;/patients/{id:int}&#34; -</code></pre><p>Current route rules:</p><ul><li>Routes must start with <code>/</code>.</li><li><code>/</code> is the only route that may end with <code>/</code>.</li><li>Query strings, fragments, backslashes, whitespace, control characters, empty -segments, <code>.</code>, and <code>..</code> are invalid.</li><li>Dynamic params are whole segments such as <code>{slug}</code> or <code>{id:int}</code>.</li><li>Param names use Go-like identifier spelling.</li><li>Supported param types are <code>string</code>, <code>int</code>, <code>int64</code>, <code>uint</code>, <code>uint64</code>, -<code>bool</code>, and <code>float64</code>.</li><li>Duplicate params in one route are invalid.</li><li>Duplicate route patterns are invalid.</li></ul><p>Dynamic SPA routes require <code>paths {}</code> unless the page selects request-time -rendering with <code>server {}</code> or <code>go server {}</code>.</p><h2 id="blocks">Blocks</h2><p>Implemented or partial top-level blocks:</p><ul><li><code>paths {}</code>: build-time dynamic SPA path declarations.</li><li><code>build {}</code>: build-time page data.</li><li><code>server {}</code>: request-time page data; requires the SSR addon.</li><li><code>view {}</code>: page, component, or layout markup.</li><li><code>style {}</code>: component/page-local CSS body capture.</li><li><code>go {}</code>: optional same-package Go extraction.</li><li><code>go server {}</code>: optional request-time load-handler extraction.</li><li><code>go client {}</code>: optional browser-side Go WASM mount extraction.</li><li><code>go addon.&lt;name&gt; {}</code>: addon-owned Go block validation and emission.</li><li><code>js &#34;&lt;relative-file.js|.mjs|.ts&gt;&#34;</code>: scoped browser module asset.</li><li><code>js {}</code>: inline scoped browser module asset for small cases.</li></ul><p>Unsupported top-level block declarations that look like <code>name ... {</code> are -rejected until their feature slice is implemented.</p><h2 id="build-time-data">Build-Time Data</h2><p><code>paths {}</code> supports the first literal record subset:</p><pre><code class="language-gwdk">paths { - =&gt; { slug: &#34;hello-gowdk&#34; } -} -</code></pre><p><code>build {}</code> supports literal records, references to earlier fields, route -params, and Go function calls from imported or same-package Go. Dynamic -<code>paths {}</code> output can pass route params to helpers that declare one -<code>gowdk.BuildParams</code> argument:</p><pre><code class="language-gwdk">build { - =&gt; { title: &#34;Hello&#34;, count: 2 } - =&gt; FeaturedCopyForBuild() - =&gt; interop.FeaturedCopyForBuild() -} -</code></pre><p>Arbitrary build-time Go statements are not stable source behavior.</p><h2 id="request-time-data">Request-Time Data</h2><p><code>server {}</code> selects the request-time page lane and requires SSR to be enabled. -Generated SSR supports declared field placeholders and same-package Go load -functions through <code>ssr.LoadContext</code> for the current slice.</p><p><code>go server {}</code> can provide generated SSR load handlers when request-time rendering -is enabled.</p><h2 id="endpoints">Endpoints</h2><p>Actions and APIs are top-level endpoint declarations:</p><pre><code class="language-gwdk">act Submit POST &#34;/signup&#34; -api Health GET &#34;/api/health&#34; -</code></pre><p>Endpoint-local error pages are supported:</p><pre><code class="language-gwdk">act Submit POST &#34;/signup&#34; error &#34;/errors/signup.html&#34; -</code></pre><p>Current rules:</p><ul><li>Action methods are currently <code>POST</code>.</li><li>API methods support <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code>, and <code>DELETE</code>.</li><li>Declarations name exact exported Go handler symbols.</li><li>Behavior lives in normal same-package Go handlers or supported extracted Go -blocks.</li><li>Old <code>act name { ... }</code> and <code>api name { ... }</code> blocks are rejected with -migration diagnostics.</li></ul><h2 id="view-markup">View Markup</h2><p><code>view {}</code> supports the current GOWDK markup subset:</p><ul><li>Lowercase HTML elements.</li><li>Text and quoted attribute interpolation.</li><li>Escaped text and attributes by default.</li><li>Self-closing component calls.</li><li>Same-package component calls by bare component name.</li><li>Cross-package component calls through <code>use</code> aliases.</li><li>Shorthand class and id attributes on HTML elements.</li><li>Boolean attributes and first-slice expression attributes.</li><li><code>&lt;slot /&gt;</code> in layouts and components.</li><li>First-slice form enhancement directives such as <code>g:post</code>, <code>g:target</code>, and -<code>g:swap</code>.</li><li>First-slice local island directives such as <code>g:on:*</code> and <code>g:island</code>.</li><li>The explicit <code>g:unsafe-html={Expr}</code> raw HTML directive on non-void elements.</li></ul><p><code>view {}</code> expands only through GOWDK-owned AST nodes and <code>g:</code> directives. The -current parser does not implement arbitrary external template semantics. -Unsupported template tags and unknown <code>g:</code> directives must fail with -diagnostics (<code>unsupported_markup_syntax</code> and <code>unsupported_markup_directive</code> -message families) rather than being treated as raw HTML or silently ignored.</p><h2 id="components">Components</h2><p>Components use <code>component &lt;Name&gt;</code>. They can define props and state contracts -through imported Go types and can render same-package or <code>use</code>-qualified child -components.</p><p>Current component support is partial:</p><ul><li>Scalar inline props and first typed Go prop/state contracts are supported.</li><li>Component CSS and assets can be scoped and emitted.</li><li>Component-level <code>wasm</code> can emit browser WASM island assets.</li><li>Broad lifecycle behavior, child-to-parent events, and a full reactive graph -are planned.</li></ul><h2 id="scoped-javascript">Scoped JavaScript</h2><p>Scoped browser modules are explicit source declarations:</p><pre><code class="language-gwdk">js &#34;./dashboard.ts&#34; - -js { - console.log(&#34;loaded&#34;) -} -</code></pre><p>Path-based modules are preferred. Script declarations are page- or -component-scoped. TypeScript is transform-only; GOWDK does not type-check it. -Bundling, minification, import-graph following, and JavaScript tree shaking are -not implemented.</p><p>Generated JavaScript is enhancement only. It must not own routing truth, auth, -trusted validation, server state, business rules, or cache policy.</p><h2 id="raw-html-policy">Raw HTML Policy</h2><p>Generated HTML escapes text and attributes by default; that default is -unchanged. The one explicit, stable escape hatch is the GOWDK-owned -<code>g:unsafe-html={Expr}</code> element directive: the element&#39;s attributes stay escaped and -the expression&#39;s resolved string is written as the element content without -escaping. Only trusted or sanitized HTML may be fed to <code>g:unsafe-html</code>; see -<a href="/docs/language/markup/">markup.md</a> for the full contract and restrictions. Raw HTML syntax -from other template languages, such as <code>{@html ...}</code>, remains unsupported and -fails loudly with guidance toward <code>g:unsafe-html</code>.</p><h2 id="diagnostics-policy">Diagnostics Policy</h2><p>Compiler failures should include a diagnostic code, source position, source -range when known, severity, message, and short suggestion when useful. Current -public diagnostics are listed in <a href="/docs/language/diagnostics/">diagnostics.md</a> and -<a href="/docs/reference/diagnostics/">Diagnostics Reference</a>.</p><p>Parser recovery is still partial. <code>parse_error</code> remains the broad parser code -until more specific parser diagnostics are stabilized.</p><h2 id="compatibility-policy">Compatibility Policy</h2><p>During 0.x, public contracts can still change. Compatibility rules for language -work:</p><ul><li>Implemented syntax should keep tests or documented verification.</li><li>Partial syntax must stay labeled partial in docs.</li><li>Planned syntax must not be silently accepted as generated behavior.</li><li>Deprecated syntax should fail with migration diagnostics before removal.</li><li>Unsupported syntax should fail before generated output is accepted.</li><li>Docs must change in the same commit as behavior changes.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/ssr/index.html b/docs-site/dist/site/docs/language/ssr/index.html deleted file mode 100644 index c8074563..00000000 --- a/docs-site/dist/site/docs/language/ssr/index.html +++ /dev/null @@ -1,187 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>SSR - GOWDK</title> - <meta name="description" content="SSR is optional and must not become the default framework identity."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="SSR - GOWDK"> - <meta property="og:description" content="SSR is optional and must not become the default framework identity."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="SSR - GOWDK"> - <meta name="twitter:description" content="SSR is optional and must not become the default framework identity."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>SSR</h1><p class="doc-lead">SSR is optional and must not become the default framework identity.</p></header><article class="prose"><p>SSR is optional and must not become the default framework identity.</p><h2 id="current-support">Current Support</h2><ul><li>Pages default to build-time SPA output.</li><li><code>server {}</code> selects request-time SSR and requires the SSR addon.</li><li><code>go server {}</code> also selects request-time SSR and requires the SSR addon.</li><li><code>gowdk build --ssr --app &lt;dir&gt; --bin &lt;file&gt;</code> can generate a binary that -serves concrete and dynamic request-time SSR pages rendered from <code>view {}</code>, -literal or imported <code>build {}</code> data, and declared <code>server {}</code> data.</li><li>Dynamic SSR routes such as <code>/blog/{slug}</code> can be matched by generated -binaries in the first supported slice. Route params render through generated -placeholders and request-time HTML escaping. Generated handlers attach raw -params through <code>runtime/app.Params(ctx)</code> and decoded typed params through -<code>runtime/app.TypedParams(ctx)</code> before guards, load functions, or rendering -run. Invalid typed params return 400; missing params return 404.</li><li>Generated SSR supports declared identifier and dotted-path fields such as -<code>server { =&gt; { user, title, account.plan } }</code> and calls a same-package exported -Go function named <code>Load&lt;PageID&gt;</code>. <code>&lt;PageID&gt;</code> is the explicit <code>page</code> value -when present, otherwise the filename-derived page ID.</li><li>Supported load function signatures are -<code>func LoadDashboard(ssr.LoadContext) map[string]any</code> and -<code>func LoadDashboard(ssr.LoadContext) (map[string]any, error)</code>. Returned -values replace generated SSR placeholders with request-time HTML escaping. -Dotted paths resolve through nested maps with string keys, structs, pointers, -interfaces, exported Go field names, and <code>json</code> tag names.</li><li>Load functions can return <code>ssr.RedirectTo(&#34;/login&#34;)</code> or -<code>ssr.Redirect(&#34;/login&#34;, http.StatusTemporaryRedirect)</code> to ask generated SSR -handlers to write a no-store local redirect. Redirect URLs must be local -absolute paths.</li><li><code>error &#34;/errors/dashboard.html&#34;</code> declares a route-local generated HTML -error document for SSR load failures, generated render failures, and route -panics before response headers are written on that page. The path is -output-relative, may be written with a leading slash, must end in <code>.html</code>, -and must not contain <code>..</code>, query strings, fragments, or backslashes.</li><li>Generated embedded apps load optional <code>404.html</code> and <code>500.html</code> documents -from build output, plus any route-local <code>error</code> documents selected by SSR -routes. Missing error documents fall back to <code>http.Error</code>.</li><li>Generated SSR route handlers run inside a runtime panic boundary. A panic -before response headers are written becomes a no-store HTTP 500 response, -using the route-local <code>error</code> page when declared or <code>500.html</code> when present, -without exposing the panic value.</li><li>Non-redirect <code>server {}</code> failures also use the same 5xx message policy: -ordinary error details are hidden, and only explicit -<code>response.HandlerError.Message</code> values are rendered to clients.</li><li>Page layouts compose around SSR pages at request time. Declared load data is -merged into the request render scope before the page and layout stack are -written.</li><li>Successful SSR HTML uses the page <code>cache</code>/<code>revalidate</code> policy when declared -and otherwise uses <code>Cache-Control: no-store</code>. Load redirects, guard failures, -route-local error pages, and panic boundaries are always no-store.</li><li>The SSR addon exposes a small router registration contract for generated SSR -page handlers.</li><li>The SSR addon provides a default HTTP 500 error handler contract for -request-time SSR failures.</li><li><code>guard</code> is optional, but a page is not public by default: a page that -declares no <code>guard</code> warns (<code>missing_page_guard</code>) and its route is denied -(403) at request time until access is stated (see -<a href="/docs/language/guards/">guards.md</a> for the full access contract). <code>guard public</code> marks an -intentionally public page and must stand alone. Non-public guards use -comma-separated guard IDs such as <code>guard auth.required, billing.active</code>. -Protected page guards require request-time page rendering so the page GET -route can be gated before HTML is returned. <code>runtime/guard</code> exposes -<code>Context</code>, <code>Registry</code>, and ordered guard execution contracts. Generated SSR, -action, API, and fragment handlers run declared guards before user -logic. A guarded generated app will not compile unless required guard backing -functions exist. Ordinary guard errors fail closed with HTTP 403. Guards can -intentionally return <code>runtime/guard.RedirectTo</code>, <code>runtime/guard.Redirect</code>, or -<code>runtime/guard.Respond</code> errors to write no-store redirects or custom -responses. Native RBAC guard IDs use <code>role:&lt;name&gt;</code> and -<code>permission:&lt;name&gt;</code> and resolve through an application-owned -<code>runtime/auth.Provider</code>.</li></ul><p>Generated app packages that include at least one guarded SSR, action, API, or -fragment route require backing functions in the generated app package unless -<code>auth.Addon</code> supplies them. With <code>auth.Addon(auth.Options{...})</code>, generated -startup configures the session manager, registers <code>auth.required</code>, and uses that -session manager for native <code>role:</code> / <code>permission:</code> guards.</p><pre><code class="language-go">func GOWDKGuardRegistry() gowdkguard.Registry // required when custom guard IDs are used -func GOWDKAuthProvider() auth.Provider // required when role:/permission: IDs are used without auth.Addon -</code></pre><p>Define custom guards in app startup code that is compiled with the generated app -package. If this function is missing while custom guard IDs are declared, <code>go build</code> fails.</p><pre><code class="language-go">package gowdkapp - -import gowdkguard &#34;github.com/cssbruno/gowdk/runtime/guard&#34; - -func GOWDKGuardRegistry() gowdkguard.Registry { - return gowdkguard.Registry{ - &#34;auth.required&#34;: func(ctx gowdkguard.Context) error { - return nil - }, - } -} -</code></pre><p>For native RBAC guards, define only the application-owned principal source. If -this function is missing while <code>role:</code> or <code>permission:</code> guard IDs are declared, -<code>go build</code> fails.</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - gowdkauth &#34;github.com/cssbruno/gowdk/runtime/auth&#34; -) - -func GOWDKAuthProvider() gowdkauth.Provider { - return gowdkauth.ProviderFunc(func(request *http.Request) (*gowdkauth.Principal, error) { - return &amp;gowdkauth.Principal{ - ID: &#34;user-1&#34;, - Roles: []string{&#34;admin&#34;}, - Permissions: []string{&#34;dashboard.read&#34;}, - }, nil - }) -} -</code></pre><p>Feature packages that declare page, action, or API handlers should not import -the generated <code>gowdkapp</code> package. Keep registration in the generated app -package to avoid import cycles.</p><p>Native RBAC guards are a defense-in-depth redundancy layer for generated -route/page access. They must never replace backend authorization for protected -resources in normal Go handlers and services.</p><h2 id="lane-inference-one-directive-two-lanes">Lane inference: one directive, two lanes</h2><p>GOWDK has two execution lanes for <code>g:for</code> and <code>g:if</code>, and the compiler picks the -lane from the <strong>data source</strong>, not from a separate directive:</p><ul><li>When the operand is a <strong><code>server {}</code> request-time field</strong> (or, when nested, the -enclosing row item), <code>g:for</code>/<code>g:if</code> render <strong>server-side</strong> at request time, with -escape-by-default interpolation — no HTML is built in Go and no client island is -involved.</li><li>When the operand is <strong>client <code>state</code>/<code>store</code></strong>, <code>g:for</code>/<code>g:if</code> bind a <strong>reactive -client island</strong>.</li></ul><p>So <code>g:for={col in columns}</code> over a <code>server {}</code> field is a server-rendered list, -while <code>g:for={todo in todos}</code> over component <code>state</code> is a client island — same -directive, lane chosen by where the data lives. A name that is neither a declared -<code>server {}</code> field nor client state is rejected. There are no separate <code>g:each</code> / -<code>g:when</code> directives; the lane is inferred.</p><h2 id="server-rendered-lists-gfor-over-server-">Server-rendered lists (<code>g:for</code> over <code>server {}</code>)</h2><p>Request-time pages render collection data — board columns, chat logs, activity -feeds, search results, inboxes — declaratively with <code>g:for</code> over a <code>server {}</code> -field. Every interpolated value is HTML-escaped.</p><pre><code class="language-gwdk">page board -route &#34;/board&#34; -guard public -server { =&gt; { columns } } -view { - &lt;section class=&#34;board&#34;&gt; - &lt;div class=&#34;column&#34; g:for={col in columns}&gt; - &lt;h2&gt;{col.title}&lt;/h2&gt; - &lt;article class=&#34;card&#34; g:for={issue in col.issues}&gt; - &lt;span&gt;{issue.id}&lt;/span&gt; {issue.title} - &lt;/article&gt; - &lt;/div&gt; - &lt;/section&gt; -} -</code></pre><pre><code class="language-go">func LoadBoard(ssr.LoadContext) (map[string]any, error) { - b := issues.Board() - return map[string]any{&#34;columns&#34;: b.Columns}, nil -} -</code></pre><p>Contract:</p><ul><li>A top-level <code>g:for</code> over a declared <code>server {}</code> field renders server-side. The -same <code>g:for</code> over component <code>state</code>/<code>store</code> is a client island instead — the -lane follows the source.</li><li>Rows interpolate the item with <code>{item.Field}</code> (dotted paths such as -<code>{item.author.name}</code> are supported) and the optional index with -<code>g:for={item, i in field}</code> then <code>{i}</code>. Field values are matched against map -keys, exported Go struct fields, or json tags, and are always escaped.</li><li>Server lists nest. A nested <code>g:for={child in item.children}</code> must reference the -enclosing row item; its slice is resolved per parent row. Nested directives -inherit the server lane.</li><li>Rows support static markup, item interpolation, nested <code>g:for</code>, and nested -<code>g:if</code> only. Components, other client directives (<code>g:on:*</code>, <code>g:bind:*</code>, -islands), and <code>g:unsafe-html</code> are not part of a server row. Request-time -(tainted) values remain rejected in URL, event-handler, <code>style</code>, and <code>srcdoc</code> -attributes.</li><li>A server-rendered <code>g:for</code> requires the SSR addon and a request-time page; it -has no SPA/static output form. <code>g:key</code> is accepted but ignored server-side.</li></ul><h2 id="server-rendered-conditionals-gif-over-server-">Server-rendered conditionals (<code>g:if</code> over <code>server {}</code>)</h2><p><code>g:if</code> over a <code>server {}</code> field renders its element (and subtree) at request time -only when the condition holds. This covers the everyday empty-state, auth-gated -section, and feature-flag patterns over request-time data.</p><pre><code class="language-gwdk">page board -route &#34;/board&#34; -guard public -server { =&gt; { count, status } } -view { - &lt;section&gt; - &lt;p g:if={count &gt; 0 &amp;&amp; status == &#34;open&#34;}&gt;You have {count} open items&lt;/p&gt; - &lt;p g:if={!count}&gt;No issues yet&lt;/p&gt; - &lt;/section&gt; -} -</code></pre><pre><code class="language-go">func LoadBoard(ssr.LoadContext) (map[string]any, error) { - b := issues.Board() - return map[string]any{&#34;count&#34;: b.Count, &#34;status&#34;: b.Status}, nil -} -</code></pre><p>Contract:</p><ul><li>A top-level <code>g:if</code> whose condition references a <code>server {}</code> field renders -server-side; over client <code>state</code>/<code>store</code> the same <code>g:if</code> is a client -conditional instead.</li><li>A top-level server <code>g:if</code> accepts a full bool expression — comparisons (<code>==</code>, -<code>!=</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>), logic (<code>&amp;&amp;</code>, <code>||</code>, <code>!</code>), and literals — over -<code>server {}</code> fields, evaluated at request time. A value with no operator is a -truthiness check (non-zero number, non-empty string, <code>true</code>, non-empty -slice/map). Evaluation that fails (e.g. a missing field) fails closed: the -branch is hidden. Function calls are not evaluated server-side — compute those -in Go and expose a field.</li><li>A <code>g:if</code> branch shares the enclosing scope: a top-level branch interpolates -<code>server {}</code> fields (<code>{count}</code>); a <code>g:if</code> inside a server <code>g:for</code> row references -the row item (<code>{issue.id}</code>), and a <strong>nested</strong> server <code>g:if</code> is a single row -field (<code>g:if={issue.urgent}</code>), not a compound expression.</li><li>Server <code>g:for</code> and <code>g:if</code> nest in either direction: a list inside a branch, a -conditional inside a row.</li><li>The empty/else branch is a sibling <code>g:if={!field}</code>. <code>g:else</code>/<code>g:else-if</code> are -client-only chains and cannot follow a server <code>g:if</code>.</li><li>A server-rendered <code>g:if</code> requires the SSR addon and a request-time page; it has -no SPA/static output form.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/stability/index.html b/docs-site/dist/site/docs/language/stability/index.html deleted file mode 100644 index 643be739..00000000 --- a/docs-site/dist/site/docs/language/stability/index.html +++ /dev/null @@ -1,50 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Language Construct Stability - GOWDK</title> - <meta name="description" content="This table is the per-construct stability and deprecation contract for the experimental 0.x .gwdk language. The diagnostics registry already records a stability tier per..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Language Construct Stability - GOWDK"> - <meta property="og:description" content="This table is the per-construct stability and deprecation contract for the experimental 0.x .gwdk language. The diagnostics registry already records a stability tier per..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Language Construct Stability - GOWDK"> - <meta name="twitter:description" content="This table is the per-construct stability and deprecation contract for the experimental 0.x .gwdk language. The diagnostics registry already records a stability tier per..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Language Construct Stability</h1><p class="doc-lead">This table is the per-construct stability and deprecation contract for the experimental 0.x .gwdk language. The diagnostics registry already records a stability tier per diagnostic code (internal/diagnostics/registry.go); this page does the same for the language constructs themselves, so a user or tooling author can tell which syntax is safe to depend on and which is still moving.</p></header><article class="prose"><p>This table is the per-construct stability and deprecation contract for the -experimental 0.x <code>.gwdk</code> language. The diagnostics registry already records a -stability tier per diagnostic code (<code>internal/diagnostics/registry.go</code>); this -page does the same for the language constructs themselves, so a user or tooling -author can tell which syntax is safe to depend on and which is still moving.</p><p>It complements, and is pinned by, the machine-checked -<a href="/docs/language/conformance/">Conformance Corpus</a>: a <code>Stable</code> or <code>Partial</code> construct should -have an <code>accept/</code> case, and a <code>Planned</code>/<code>Deprecated</code> construct should have a -<code>reject/</code> case asserting the diagnostic code named below.</p><h2 id="status-tiers">Status Tiers</h2><ul><li><strong>Stable</strong>: accepted by the current compiler and not expected to change shape -within 0.x without a deprecation step.</li><li><strong>Partial</strong>: accepted for a narrower slice than the final contract; the syntax -is real but its capability will grow.</li><li><strong>Planned</strong>: not accepted as source behavior yet; using it is rejected with -the listed diagnostic code so it cannot become accidental behavior.</li><li><strong>Deprecated</strong>: previously accepted spelling that is now rejected with a -migration diagnostic.</li></ul><p>The tiers below are the code-level registry <code>lang.ConstructStabilities()</code> (with -metadata keywords derived from <code>lang.MetadataKeywords</code> and directives checked -against <code>viewparse.SupportedDirectiveNames()</code>). <code>TestStabilityRegistryCoversCodeConstructs</code> -asserts the registry covers every keyword and directive in code, and -<code>TestStabilityTableMatchesRegistry</code> asserts this page matches the registry, so -neither the table nor the registry can drift without failing a test.</p><h2 id="top-level-blocks">Top-Level Blocks</h2><table><thead><tr><th>Construct</th><th>Tier</th><th>Notes</th></tr></thead><tbody><tr><td><code>package</code></td><td>Stable</td><td>Required first declaration.</td></tr><tr><td><code>import</code></td><td>Stable</td><td>Go import for colocated blocks.</td></tr><tr><td><code>use</code></td><td>Stable</td><td>Package-scoped component import.</td></tr><tr><td><code>paths {}</code></td><td>Partial</td><td>Literal <code>=&gt; { field: &#34;value&#34; }</code> records only.</td></tr><tr><td><code>build {}</code></td><td>Partial</td><td>Literal records and no-argument Go calls.</td></tr><tr><td><code>server {}</code></td><td>Partial</td><td>Request-time server-lane data; requires the SSR addon.</td></tr><tr><td><code>view {}</code></td><td>Stable</td><td>Markup; see directives below.</td></tr><tr><td><code>style {}</code></td><td>Stable</td><td>Scoped CSS body.</td></tr><tr><td><code>client {}</code></td><td>Partial</td><td>Bounded component client language.</td></tr><tr><td><code>go {}</code> / <code>go build {}</code> / <code>go server {}</code> / <code>go client {}</code> / <code>go addon.* {}</code></td><td>Partial</td><td>Colocated Go lanes.</td></tr><tr><td><code>store</code> / <code>props</code> / <code>state</code> / <code>emits</code></td><td>Partial</td><td>Component contracts.</td></tr><tr><td>Unknown top-level block</td><td>Planned</td><td>Rejected with <code>unsupported_top_level_block</code>.</td></tr></tbody></table><h2 id="metadata-keywords">Metadata Keywords</h2><p>All metadata keywords are <strong>Stable</strong>. The canonical list is <code>lang.MetadataKeywords</code>.</p><table><thead><tr><th>Keyword</th><th>Tier</th></tr></thead><tbody><tr><td><code>page</code></td><td>Stable</td></tr><tr><td><code>route</code></td><td>Stable</td></tr><tr><td><code>title</code></td><td>Stable</td></tr><tr><td><code>description</code></td><td>Stable</td></tr><tr><td><code>canonical</code></td><td>Stable</td></tr><tr><td><code>image</code></td><td>Stable</td></tr><tr><td><code>robots</code></td><td>Stable</td></tr><tr><td><code>noindex</code></td><td>Stable</td></tr><tr><td><code>preload</code></td><td>Stable</td></tr><tr><td><code>prefetch</code></td><td>Stable</td></tr><tr><td><code>layout</code></td><td>Stable</td></tr><tr><td><code>cache</code></td><td>Stable</td></tr><tr><td><code>revalidate</code></td><td>Stable</td></tr><tr><td><code>error</code></td><td>Stable</td></tr><tr><td><code>guard</code></td><td>Stable</td></tr><tr><td><code>css</code></td><td>Stable</td></tr><tr><td><code>component</code></td><td>Stable</td></tr><tr><td><code>wasm</code></td><td>Stable</td></tr><tr><td><code>asset</code></td><td>Stable</td></tr></tbody></table><p>Legacy <code>@</code>-prefixed metadata is <strong>Deprecated</strong> and rejected with -<code>malformed_legacy_metadata</code>.</p><h2 id="view-g-directives">View <code>g:</code> Directives</h2><p>Supported exact-name directives (the closed set in -<code>viewparse.SupportedDirectiveNames()</code>):</p><table><thead><tr><th>Directive</th><th>Tier</th><th>Notes</th></tr></thead><tbody><tr><td><code>g:if</code></td><td>Stable</td><td>Conditional render. Server-side over a <code>server {}</code> field; a client island over state/store. <code>g:else-if</code>/<code>g:else</code> are client-only chains.</td></tr><tr><td><code>g:for</code> / <code>g:key</code></td><td>Stable</td><td>List render. Server-side over a <code>server {}</code> field; a client island over state/store. The lane is inferred from the operand.</td></tr><tr><td><code>g:bind:value</code> / <code>g:bind:checked</code></td><td>Partial</td><td>Two-way bindings.</td></tr><tr><td><code>g:on:*</code></td><td>Partial</td><td>Event handlers with <code>.prevent</code>/<code>.stop</code>/<code>.once</code>/<code>.capture</code>/<code>.debounce</code>/<code>.throttle</code>.</td></tr><tr><td><code>g:post</code> / <code>g:target</code> / <code>g:swap</code></td><td>Partial</td><td>Progressive form/fragment submission.</td></tr><tr><td><code>g:message:*</code></td><td>Partial</td><td><code>required</code>, <code>minlength</code>, <code>maxlength</code>, <code>pattern</code>.</td></tr><tr><td><code>g:island</code></td><td>Partial</td><td><code>js</code> or <code>wasm</code> island.</td></tr><tr><td><code>g:command</code> / <code>g:query</code></td><td>Partial</td><td>Contract web adapters.</td></tr><tr><td><code>g:subscribe</code></td><td>Partial</td><td>Realtime presentation-event subscription metadata on query-owned elements.</td></tr><tr><td><code>g:event</code></td><td>Partial</td><td>Parses to explain backend-owned domain events.</td></tr><tr><td><code>g:unsafe-html</code></td><td>Stable</td><td>Raw HTML escape hatch; <code>unsafe_raw_html</code> is reported.</td></tr><tr><td><code>g:ref</code></td><td>Partial</td><td>Client reference.</td></tr><tr><td><code>g:slot</code></td><td>Partial</td><td>Named/scoped slot.</td></tr><tr><td><code>g:transition</code></td><td>Partial</td><td>CSS class/state hooks for client <code>g:if</code> branches and keyed client <code>g:for</code> rows.</td></tr><tr><td><code>g:animate</code></td><td>Partial</td><td>CSS class/state hooks for keyed client <code>g:for</code> row moves.</td></tr></tbody></table><p>Component calls also accept <code>g:bind:&lt;ExportedState&gt;</code> for exported child state -fields. HTML elements remain limited to <code>g:bind:value</code> and <code>g:bind:checked</code>.</p><h2 id="view-markup-blocks">View Markup Blocks</h2><table><thead><tr><th>Construct</th><th>Tier</th><th>Notes</th></tr></thead><tbody><tr><td><code>{#await}</code></td><td>Partial</td><td>Client-island async placeholder for <code>fetchJSON[T](urlExpr)</code> with pending, <code>{:then name}</code>, and optional <code>{:catch err}</code> branches.</td></tr></tbody></table><p>Planned directives are rejected. They currently surface as the generic -<code>parse_error</code> rather than the intended <code>unsupported_markup_directive</code> code; that -code lands when markup rejections carry their own code (see -<a href="/docs/language/conformance/">Conformance Corpus</a>).</p><table><thead><tr><th>Directive family</th><th>Tier</th><th>Replacement</th></tr></thead><tbody><tr><td><code>g:window</code>, <code>g:document</code>, <code>g:body</code>, <code>g:head</code></td><td>Planned</td><td>Page metadata or <code>g:on:*</code> on elements.</td></tr><tr><td><code>g:await</code>, <code>g:async</code></td><td>Planned</td><td>Use <code>{#await fetchJSON[T](urlExpr)}</code> for local island placeholders, or build/load data, actions, APIs, and fragments for server-owned data.</td></tr><tr><td><code>g:use</code>, <code>g:action</code>, <code>g:attach</code></td><td>Planned</td><td><code>client {}</code> with <code>g:ref</code>.</td></tr></tbody></table><p>Foreign template syntax (<code>{#if}</code>, <code>{@html}</code>, and similar) is <strong>Planned/Unsupported</strong> -and likewise currently surfaces as <code>parse_error</code> (intended: -<code>unsupported_markup_syntax</code>).</p><h2 id="endpoint-declarations">Endpoint Declarations</h2><table><thead><tr><th>Construct</th><th>Tier</th><th>Notes</th></tr></thead><tbody><tr><td><code>act</code></td><td>Stable</td><td><code>act &lt;Name&gt; POST &#34;&lt;path&gt;&#34;</code>; POST only today.</td></tr><tr><td><code>api</code></td><td>Stable</td><td><code>api &lt;Name&gt; &lt;METHOD&gt; &#34;&lt;path&gt;&#34;</code>; GET/POST/PUT/PATCH/DELETE.</td></tr><tr><td><code>fragment</code></td><td>Partial</td><td>First-slice partial updates.</td></tr><tr><td><code>act</code> block form</td><td>Deprecated</td><td><code>act &lt;name&gt; { ... }</code>; rejected with <code>old_action_block_syntax</code>.</td></tr><tr><td><code>api</code> block form</td><td>Deprecated</td><td><code>api &lt;name&gt; { ... }</code>; rejected with <code>old_api_block_syntax</code>.</td></tr></tbody></table></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/language/syntax/index.html b/docs-site/dist/site/docs/language/syntax/index.html deleted file mode 100644 index 61009d0b..00000000 --- a/docs-site/dist/site/docs/language/syntax/index.html +++ /dev/null @@ -1,408 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Syntax - GOWDK</title> - <meta name="description" content="The current parser recognizes a small top-level subset."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Syntax - GOWDK"> - <meta property="og:description" content="The current parser recognizes a small top-level subset."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Syntax - GOWDK"> - <meta name="twitter:description" content="The current parser recognizes a small top-level subset."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Language</p><h1>Syntax</h1><p class="doc-lead">The current parser recognizes a small top-level subset.</p></header><article class="prose"><p>The current parser recognizes a small top-level subset.</p><h2 id="comments">Comments</h2><p>Line comments start with <code>//</code>. Empty lines and line comments are ignored by the metadata parser.</p><h2 id="package">Package</h2><p>Every real page, component, and layout <code>.gwdk</code> file must start with a Go-style -package declaration as the first non-comment declaration:</p><pre><code class="language-gwdk">package auth -</code></pre><p>The package name must match sibling <code>.go</code> files in the same directory. -<code>gowdk.config.go</code> is project configuration and is not treated as a sibling -application package for this check.</p><p>Malformed package declarations are rejected with -<code>malformed_package_declaration</code>:</p><pre><code class="language-gwdk">package 123 -</code></pre><h2 id="metadata">Metadata</h2><p>Metadata must start at the beginning of the trimmed line:</p><pre><code class="language-gwdk">route &#34;/&#34; -title &#34;Home&#34; -description &#34;Compile-first Go web output.&#34; -canonical &#34;https://example.com/&#34; -image &#34;https://example.com/social.png&#34; -robots &#34;index,follow&#34; -noindex false -preload &#34;/assets/app.css&#34; as &#34;style&#34; -prefetch &#34;/docs&#34; -layout root, marketing -cache &#34;public, max-age=60&#34; -revalidate 5m -error &#34;/errors/home.html&#34; -guard public -component Hero -layout root -</code></pre><p>Supported metadata declarations:</p><ul><li><code>page &lt;id&gt;</code>: optional stable page ID override. When omitted from a -file-backed page, the ID derives from the filename by removing <code>.page.gwdk</code> -or <code>.gwdk</code>.</li><li><code>route &#34;&lt;path&gt;&#34;</code>: required route path. Quotes are trimmed.</li><li><code>title &#34;&lt;text&gt;&#34;</code>: optional HTML document title for generated page output.</li><li><code>description &#34;&lt;text&gt;&#34;</code>: optional HTML document description meta value.</li><li><code>canonical &#34;&lt;url&gt;&#34;</code>: optional canonical URL link for generated page output.</li><li><code>image &#34;&lt;url&gt;&#34;</code>: optional social preview image URL for Open Graph and -Twitter metadata.</li><li><code>robots &#34;&lt;policy&gt;&#34;</code>: optional robots meta content.</li><li><code>noindex [true|false]</code>: optional shorthand for adding <code>noindex</code> to the -robots meta content. A bare <code>noindex</code> line is treated as <code>true</code>.</li><li><code>preload &#34;&lt;href&gt;&#34; [as &#34;&lt;type&gt;&#34;]</code>: optional head preload link. Absolute -URLs must be <code>http</code> or <code>https</code>; protocol-relative and active-content URLs -are rejected.</li><li><code>prefetch &#34;&lt;href&gt;&#34; [as &#34;&lt;type&gt;&#34;]</code>: optional head prefetch link with the -same URL restrictions as <code>preload</code>.</li><li><code>layout &lt;id&gt;[, &lt;id&gt;...]</code>: optional page layout IDs, or a layout identity in -<code>.layout.gwdk</code> files.</li><li><code>cache &#34;&lt;policy&gt;&#34;</code>: optional page Cache-Control policy for successful -generated static SPA HTML and SSR HTML responses.</li><li><code>revalidate &lt;seconds|duration&gt;</code>: optional stale-while-revalidate duration -such as <code>60</code>, <code>60s</code>, <code>5m</code>, or <code>1h</code>; requires <code>cache</code>.</li><li><code>error &#34;&lt;path.html&gt;&#34;</code>: optional route-local generated HTML error page for -SSR load, generated render, and panic failures. The path is output-relative -after normalization and must stay inside generated output.</li><li><code>guard &lt;id&gt;[, &lt;id&gt;...]</code>: page access metadata. Optional, but a page is not -public by default: omitting <code>guard</code> warns (<code>missing_page_guard</code>) and the -route is denied (403) until stated. Use <code>guard public</code> for intentionally -public pages. Use custom guard IDs or native RBAC IDs such as <code>role:admin</code> and -<code>permission:posts.write</code> for protected pages.</li><li><code>component &lt;Name&gt;</code>: component ID for <code>.cmp.gwdk</code> build inputs.</li></ul><p>Unknown metadata declarations are rejected. Lines starting with <code>@</code> are rejected -as malformed legacy metadata.</p><p><code>guard public</code> must be the only guard on a page. Protected pages can declare -multiple non-public guards; generated handlers enforce them in declaration -order. Protected page guards require request-time page rendering for frontend -page access; add <code>server {}</code> or <code>go server {}</code> with the SSR addon when the page is -not public.</p><p>Current route validation accepts canonical absolute paths only:</p><ul><li>Routes must start with <code>/</code>.</li><li><code>/</code> is the only route that may end with a trailing slash.</li><li>Routes must not contain query strings, fragments, backslashes, whitespace, -control characters, empty segments, <code>.</code>, or <code>..</code>.</li><li>Dynamic route params must be whole path segments such as <code>/blog/{slug}</code> or -<code>/patients/{id:int}</code>.</li><li>Route param names use <code>[A-Za-z_][A-Za-z0-9_]*</code> and may not repeat in one -route.</li><li>Route param types are optional and support <code>string</code>, <code>int</code>, <code>int64</code>, <code>uint</code>, -<code>uint64</code>, <code>bool</code>, and <code>float64</code>.</li><li>Duplicate page route patterns are invalid. <code>/blog/{slug}</code> and <code>/blog/{id}</code> -are the same pattern.</li></ul><h2 id="scoped-javascript">Scoped JavaScript</h2><p>Pages and components can declare browser module files with top-level <code>js</code> -declarations:</p><pre><code class="language-gwdk">js &#34;./dashboard.ts&#34; -</code></pre><p>The path is relative to the declaring <code>.gwdk</code> file and must end in <code>.js</code>, -<code>.mjs</code>, or <code>.ts</code>. GOWDK copies JavaScript files into generated output, transforms -TypeScript files into <code>.js</code> module output, and emits <code>&lt;script type=&#34;module&#34;&gt;</code> -only for the page that declares it, or for pages that call a component that -declares it. TypeScript is transform-only; GOWDK does not type-check it.</p><p>Inline browser code is supported for small cases, but path-based modules are -preferred:</p><pre><code class="language-gwdk">js { - console.log(&#34;loaded&#34;) -} -</code></pre><p>This is scoped asset inclusion, not JavaScript bundling; imported JavaScript or -TypeScript dependencies are not followed yet.</p><h2 id="blocks">Blocks</h2><p>The parser recognizes these top-level block declarations:</p><pre><code class="language-gwdk">paths { -build { -server { -view { -</code></pre><p>Actions and APIs are top-level endpoint declarations, not blocks:</p><pre><code class="language-gwdk">act Submit POST &#34;/signup&#34; error &#34;/errors/signup.html&#34; -api Health GET &#34;/api/health&#34; error &#34;/errors/api-health.html&#34; -</code></pre><p>The endpoint-local <code>error</code> suffix is optional. When present on <code>act</code> or <code>api</code>, -generated action/API panic boundaries use that generated HTML page before -falling back to <code>500.html</code>.</p><p>Page files may also declare top-level Go imports before blocks:</p><pre><code class="language-gwdk">import interop &#34;github.com/cssbruno/gowdk/examples/go-interop&#34; -</code></pre><p>These are normal Go package imports used for Go types/functions. They do not -import other <code>.gwdk</code> files.</p><p>Malformed Go imports are rejected with <code>malformed_go_import</code>:</p><pre><code class="language-gwdk">import interop github.com/acme/app/interop -</code></pre><p>GOWDK source packages use a separate <code>use</code> declaration:</p><pre><code class="language-gwdk">use ui &#34;components&#34; -</code></pre><p>The quoted value is a discovered <code>.gwdk</code> package name, not a Go import path. -Pages and components use this for cross-package component calls:</p><pre><code class="language-gwdk">view { - &lt;ui.Hero title=&#34;GOWDK&#34; /&gt; -} -</code></pre><p>Same-package <code>.gwdk</code> and <code>.go</code> files are peers and need no import. A page can -call same-package components by bare component name, such as <code>&lt;Hero /&gt;</code>. -Cross-package page calls must use a declared alias, such as <code>&lt;ui.Hero /&gt;</code>. -Imported components still resolve their own same-package child components by -bare name inside the imported component body. -Component aliases are scoped to the component that declares them:</p><pre><code class="language-gwdk">package marketing - -use icons &#34;icons&#34; - -component Hero - -view { - &lt;section&gt;&lt;icons.Badge /&gt;&lt;/section&gt; -} -</code></pre><p>Component files can declare Go imports for typed props and state contracts:</p><pre><code class="language-gwdk">import ui &#34;github.com/acme/app/ui&#34; -import &#34;github.com/acme/app/components&#34; -</code></pre><p>Aliased imports use the explicit alias. Unaliased imports use the package name -reported by <code>go list</code>, matching ordinary Go import behavior. Relative import -paths are rejected for typed component contracts.</p><p>Build-time Go interop supports imported or same-package no-argument function -calls in <code>build {}</code>:</p><pre><code class="language-gwdk">build { - =&gt; interop.FeaturedCopyForBuild() - =&gt; FeaturedCopyForBuild() -} -</code></pre><p>The function must return <code>T</code> or <code>(T, error)</code> where <code>T</code> is a JSON-encodable -object. Scalar fields are exposed to <code>view {}</code> as string interpolation data.</p><p>Unsupported top-level block declarations that look like <code>name ... {</code> are -rejected until their feature slice is implemented.</p><p><code>internal/gwdkast</code> defines the typed GOWDK AST. <code>internal/parser.ParseSyntax</code> -returns that AST for the current subset: package declarations, metadata declarations, -Go imports, GOWDK uses, stores, typed component contracts, blocks, parsed -<code>view {}</code> markup nodes, literal <code>paths {}</code> and <code>build {}</code> records, endpoint -declarations, and source spans. -The manifest parser still preserves raw block body text for compatibility. -SPA builds can expand literal <code>paths {}</code> lines such as:</p><pre><code class="language-gwdk">=&gt; { slug: &#34;hello-gowdk&#34; } -</code></pre><p>SPA builds can also render multiple literal <code>build {}</code> lines such as:</p><pre><code class="language-gwdk">=&gt; { title: &#34;Hello&#34; } -=&gt; { count: 2, live: true } -=&gt; { headline: &#34;{title} {slug}&#34;, copy: field(&#34;headline&#34;) } -=&gt; { total: (count + 3) * 2, visible: live &amp;&amp; total &gt; 5 } -</code></pre><p>Literal build values can be strings, numbers, booleans, <code>nil</code>/<code>null</code>, -<code>param(&#34;name&#34;)</code>, <code>field(&#34;name&#34;)</code>, or a bare reference to an earlier build -field. Build expressions support string concatenation with <code>+</code>, numeric -<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, and <code>%</code>, boolean <code>!</code>, <code>&amp;&amp;</code>, and <code>||</code>, equality and ordered -comparisons, parentheses, and unary <code>+</code>/<code>-</code>. Duplicate build fields are -rejected.</p><p>Inside <code>view {}</code>, route params can be referenced explicitly with -<code>{param(&#34;slug&#34;)}</code> in text, quoted attributes, and component prop values. SPA -builds reject <code>param(...)</code> references that are not declared by the page route. -Inside quoted attributes, escape the inner quotes as <code>{param(\&#34;slug\&#34;)}</code>. -HTML elements can use first-slice shorthand classes and IDs:</p><pre><code class="language-gwdk">&lt;main #hero .text-4xl .font-bold class=&#34;lead&#34;&gt; -</code></pre><p>This is normalized to ordinary <code>id</code> and <code>class</code> attributes during spa -rendering. Duplicate IDs on one element are rejected. -Attributes can use quoted strings, booleans, or first-slice expression values -such as <code>data-title={post.Title}</code>.</p><p>Old <code>act name { ... }</code> and <code>api name { ... }</code> forms are rejected with migration -diagnostics.</p><p>Current page files must declare <code>view {}</code> because every page owns a page <code>GET</code> -route. API-only file or route semantics are planned separately.</p><p>Inside <code>view {}</code>, the current spa markup subset supports -<code>&lt;form g:post={Submit}&gt;</code> when <code>Submit</code> is a supported action on the same page. -Forms with <code>g:post</code> can also declare first-slice partial metadata:</p><pre><code class="language-gwdk">&lt;form g:post={Refresh} g:target=&#34;#patients&#34; g:swap=&#34;outerHTML&#34;&gt; -</code></pre><p><code>g:target</code> must be a spa id selector that references an <code>id</code> in the same -direct <code>view {}</code> markup subset. Current <code>g:swap</code> modes are <code>innerHTML</code> and -<code>outerHTML</code>. SPA builds emit the partial client runtime only for pages that -use partial form metadata with a fragment-producing action.</p><p>Layout files can declare a layout ID and <code>view {}</code> body:</p><pre><code class="language-gwdk">layout root - -view { - &lt;slot /&gt; -} -</code></pre><p>Component files can also declare string props:</p><pre><code class="language-gwdk">props { - title string -} -</code></pre><p>Component files can instead declare imported Go struct contracts:</p><pre><code class="language-gwdk">props ui.CounterProps -state ui.CounterState = ui.NewCounterState() -</code></pre><p>The state initializer must be a no-argument function whose return type matches -the declared state type.</p><p>Stateful component files can declare a component-local client block:</p><pre><code class="language-gwdk">client { - func Increment() { - Count++ - } - - func Add(step int) { - let next int = Count + step - Count = next - } -} - -view { - &lt;button g:on:click={Increment()}&gt;{Count}&lt;/button&gt; - &lt;button g:on:click={Add(Count + 1)}&gt;+ more&lt;/button&gt; - &lt;form g:on:submit.prevent={Save()}&gt;&lt;/form&gt; - &lt;input g:on:input.debounce(250ms)={Search()} /&gt; -} -</code></pre><p>The implemented client block slice supports <code>func Name(...) { ... }</code> handlers -and <code>async func Name(...) { ... }</code> handlers with <code>string</code>, <code>int</code>, <code>float</code>, and -<code>bool</code> parameters. The older <code>fn Name(...)</code> spelling remains accepted. Async -handlers cannot declare return types. <code>g:on:*</code> calls can pass typed scalar -expressions as arguments. Handler statements currently support field -increment/decrement, scalar locals such as -<code>let next int = Count + step</code>, and assignment from typed scalar expressions -using <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>%</code>, comparisons, <code>&amp;&amp;</code>, <code>||</code>, <code>!</code>, unary <code>-</code>, and -parentheses. Local variables are visible only to later statements in the same -client function, lifecycle block, or effect block. Expressions can read nested -fields and indexed values from Go-typed object and slice state, such as -<code>User.Name</code> and <code>Items[0].Name</code>. Expressions also support Go-ish conditional -values: <code>if Open { &#34;open&#34; } else { &#34;closed&#34; }</code>.</p><p>Async handlers can use the compiler-owned <code>await fetchJSON[T](urlExpr)</code> form -only in assignment statements, such as:</p><pre><code class="language-gwdk">client { - async fn Refresh() { - Items = await fetchJSON[[]ui.Item](&#34;/api/items&#34;) - } -} -</code></pre><p><code>await</code> is rejected outside async handlers and is not allowed in <code>let</code> -initializers. The target must be a state field whose type matches the fetched -type. Async handlers still follow source order for statements in the handler; -computed values and DOM bindings update after state assignments settle.</p><p>Component views can also render local async placeholders with a bounded await -block:</p><pre><code class="language-gwdk">{#await fetchJSON[[]ui.Item](&#34;/api/items&#34;)} - &lt;p&gt;Loading&lt;/p&gt; -{:then items} - &lt;ul&gt; - &lt;li g:for={item in items} g:key={item.ID}&gt;{item.Name}&lt;/li&gt; - &lt;/ul&gt; -{:catch err} - &lt;p&gt;{err.message}&lt;/p&gt; -{/await} -</code></pre><p>This markup form is client-island local behavior. It accepts only -<code>fetchJSON[T](urlExpr)</code>, not arbitrary promises or value-returning async helper -functions.</p><p>Client blocks can declare return-valued helper functions for internal -expression reuse:</p><pre><code class="language-gwdk">client { - fn Next(value int) int { - return value + 1 - } - - fn Add() { - Count = Next(Count) - } -} -</code></pre><p>Helpers must declare a scalar return type, contain exactly one <code>return expr</code> -statement, and are callable from client expressions such as assignments, local -initializers, handler arguments, and list mutation arguments. Helpers are not -event handlers, so <code>g:on:click={Next(Count)}</code> is rejected; events must call a -non-return handler such as <code>Add()</code>. Helper call graphs are validated at compile -time and recursive cycles are rejected. JavaScript-style ternaries, broader -built-ins such as date/time helpers, and recursion remain compile errors today.</p><p>Expressions support the first compiler-owned built-ins:</p><pre><code class="language-gwdk">client { - computed TotalLabel string { - return string(len(Items)) - } - - computed MatchesQuery bool { - return contains(lower(Name), lower(Query)) - } - - fn SetTotal() { - Count = len(Items) + int(&#34;1&#34;) - } -} -</code></pre><p><code>len(value)</code> accepts strings and arrays and returns <code>int</code>. <code>lower(value)</code> and -<code>upper(value)</code> accept strings and return strings. <code>contains(value, query)</code> -accepts strings and returns <code>bool</code>; it is intended for small component-local -filters such as <code>g:if={contains(lower(item.Name), lower(Query))}</code> inside -<code>g:for</code>. <code>string(value)</code> converts scalar values to <code>string</code>. <code>int(value)</code> and -<code>float(value)</code> accept strings or numeric values and return the requested numeric -type.</p><p>Generated island JavaScript does not evaluate arbitrary JavaScript source from -<code>client {}</code>. It interprets the compiler-owned expression subset above, -including conditionals, scalar operators, field/index reads, helper calls, async -fetch assignments, and the listed built-ins.</p><p>Client blocks can declare computed values:</p><pre><code class="language-gwdk">client { - computed Label string { - if Open { - return &#34;open&#34; - } - return &#34;closed&#34; - } - - computed Visible bool { - return Label == &#34;open&#34; - } -} -</code></pre><p>Computed values are read-only derived values. They can depend on props, state, -and other computed values. The compiler builds a dependency graph, emits -computed values in evaluation order, and rejects dependency cycles. The -generated island runtime recomputes computed values after state changes before -updating text, attributes, classes, styles, and <code>g:if</code> bindings.</p><p>State updates are batched by the generated island runtime around one event, -lifecycle, effect, or async continuation. The batch order is: apply state -statements, recompute computed values in dependency order, update text and -attribute bindings, update class/style/binding directives, then update -conditional and keyed-list DOM regions.</p><p>Event directives support <code>.prevent</code>, <code>.stop</code>, <code>.once</code>, <code>.capture</code>, -<code>.debounce(duration)</code>, and <code>.throttle(duration)</code> modifier chains. Durations -must be positive integer <code>ms</code> or <code>s</code> values. Debounce and throttle cannot be -combined on the same listener. Element event expressions can read the -compiler-owned DOM event object through <code>event.value</code>, <code>event.checked</code>, -<code>event.key</code>, <code>event.code</code>, <code>event.clientX</code>, and <code>event.clientY</code>.</p><p>Client blocks can run controlled lifecycle and effect statements:</p><pre><code class="language-gwdk">client { - on mount { - Open = true - } - - effect when Count { - Dirty = true - return { - Dirty = false - } - } - - on destroy { - Open = false - } -} -</code></pre><p>Lifecycle and effect statements use the same state-mutation subset as client -functions. <code>effect when Field</code> requires a state field dependency and reruns -after that state value changes. Effects can return a cleanup block with -<code>return { ... }</code>; cleanup statements run before the effect reruns and before -the island unloads. Effects are guarded by the generated runtime so cycles -cannot run forever. Arbitrary DOM access is not implemented.</p><p>Page-scoped stores are declared at page scope and used explicitly inside -component client blocks:</p><pre><code class="language-gwdk">store cart ui.CartState = ui.NewCartState() -</code></pre><pre><code class="language-gwdk">client { - use cart -} -</code></pre><p>A <code>use</code> may carry the store&#39;s Go type — <code>use cart ui.CartState</code> — to bind the -store&#39;s fields into the component&#39;s client scope so they can be referenced -without redeclaring a matching <code>state</code>. The type is resolved against the -component&#39;s imports. A <code>clear &lt;store&gt;</code> statement (valid inside client functions, -mount, destroy, and effect blocks) resets a used store to its build-time init -value and drops any persisted copy; clearing a store the component does not -<code>use</code> is a compile error.</p><p>Store types and init functions are validated with the same Go type machinery -as component state. Store names are page-local unless a component uses a -qualified GOWDK source alias such as <code>use stores.cart</code>. Store state is -serialized into browser-visible enhancement state and must not contain secrets -or trusted authorization, validation, database, or action state. JS and WASM -islands both share a store through the browser store registry and re-render on -cross-island changes; the current contract validates declarations and explicit -uses, but does not make stores global app state.</p><p>A page store may opt into browser persistence with a trailing <code>persist</code> scope:</p><pre><code class="language-gwdk">store cart ui.CartState = ui.NewCartState() persist &#34;local&#34; -</code></pre><p>The scope must be <code>&#34;local&#34;</code> (localStorage) or <code>&#34;session&#34;</code> (sessionStorage); any -other value is rejected with <code>page_store_persist_scope_invalid</code>. Persisted store -state is keyed by store name, restores over the build-time init value on load, -is discarded when the store&#39;s struct shape changes, and warns when a persisted -field name resembles a secret (nested fields included). Declaring the same store -name with a different <code>local</code>/<code>session</code> scope across pages warns with -<code>page_store_persist_scope_conflict</code>.</p><p>Client blocks can declare limited DOM refs for safe methods:</p><pre><code class="language-gwdk">client { - ref searchInput HTMLInputElement - - fn FocusSearch() { - searchInput.Focus() - } -} - -view { - &lt;input g:ref={searchInput} /&gt; - &lt;button g:on:click={FocusSearch()}&gt;Focus&lt;/button&gt; -} -</code></pre><p>Each declared ref must be bound exactly once with <code>g:ref</code>. The supported ref -methods are <code>Focus</code>, <code>Blur</code>, and <code>ScrollIntoView</code>; arbitrary DOM access is not -part of the client language.</p><p>Elements inside stateful components can use first-slice conditional rendering:</p><pre><code class="language-gwdk">view { - &lt;section g:if={Open}&gt;Open content&lt;/section&gt; - &lt;section g:else-if={Loading}&gt;Loading&lt;/section&gt; - &lt;section g:else&gt;Closed&lt;/section&gt; -} -</code></pre><p><code>g:if</code> and <code>g:else-if</code> must be bool expressions. <code>g:else</code> must immediately -follow a sibling <code>g:if</code> or <code>g:else-if</code> chain and must not have a value. Static -first render may include <code>hidden</code> on inactive branches. After island mount, the -generated runtime mounts the active branch and unmounts inactive branches.</p><p>Elements inside stateful components can render array state with first-slice -list rendering:</p><pre><code class="language-gwdk">view { - &lt;li g:for={item in Items} g:key={item.ID}&gt;{item.Name}&lt;/li&gt; - &lt;li g:for={item, i in Items} g:key={item.ID}&gt;{i}: {item.Name}&lt;/li&gt; -} -</code></pre><p><code>g:for</code> currently supports <code>item in Items</code> and <code>item, i in Items</code>, where -<code>Items</code> resolves to a Go-typed slice or array field. <code>g:key</code> is required and -must be a scalar expression in the loop scope. The first slice renders initial -rows from state, refreshes rows during island render passes, and reuses/reorders -existing row elements by key.</p><p>Client handlers can mutate state arrays with compiler-owned list built-ins:</p><pre><code class="language-gwdk">client { - fn AddItem() { - append(Items, { ID: &#34;third&#34;, Name: &#34;Third&#34;, Done: false }) - } - - fn RemoveFirst() { - remove(Items, 0) - } - - fn MoveSecondFirst() { - move(Items, 1, 0) - } -} -</code></pre><p><code>append</code> requires a state array and an object literal whose fields are checked -against the Go item type. <code>remove</code> and <code>move</code> require integer indices. These are -GOWDK client-language built-ins, not arbitrary JavaScript function calls.</p><p>Elements inside stateful components can toggle classes with bool expressions:</p><pre><code class="language-gwdk">view { - &lt;button class=&#34;tab&#34; class:active={Open}&gt;Toggle&lt;/button&gt; -} -</code></pre><p>SPA classes are preserved, and class toggles update through the generated -JavaScript island runtime.</p><p>Elements inside stateful components can bind individual style properties:</p><pre><code class="language-gwdk">view { - &lt;div style=&#34;overflow: hidden&#34; style:height.px={PanelHeight}&gt;&lt;/div&gt; - &lt;div style:width.%={WidthPercent}&gt;&lt;/div&gt; -} -</code></pre><p>Style binding expressions must be string or numeric. Unit suffixes append the -unit after evaluation; percent uses <code>.%</code>. SPA <code>style</code> declarations are -preserved. Raw <code>style={expr}</code> attributes remain rejected until broader style -safety rules exist.</p><p>Text controls inside stateful components can use first-slice two-way binding:</p><pre><code class="language-gwdk">view { - &lt;input g:bind:value={Query} /&gt; - &lt;textarea g:bind:value={Query}&gt;&lt;/textarea&gt; - &lt;select g:bind:value={SelectedID}&gt; - &lt;option value=&#34;a&#34;&gt;A&lt;/option&gt; - &lt;option value=&#34;b&#34;&gt;B&lt;/option&gt; - &lt;/select&gt; - &lt;input type=&#34;radio&#34; name=&#34;choice&#34; value=&#34;a&#34; g:bind:value={SelectedID} /&gt; - &lt;input type=&#34;radio&#34; name=&#34;choice&#34; value=&#34;b&#34; g:bind:value={SelectedID} /&gt; - &lt;p&gt;{Query}&lt;/p&gt; -} -</code></pre><p><code>g:bind:value</code> currently supports <code>&lt;input&gt;</code>, <code>&lt;textarea&gt;</code>, and <code>&lt;select&gt;</code>, and -the target must be a string state field. Numeric state fields can bind to -<code>&lt;input type=&#34;number&#34;&gt;</code>; the generated island runtime parses the control value -back into an integer or float. Radio inputs must declare a spa <code>value</code>, and -the bound string state stores the selected radio value.</p><p>Checkbox inputs can bind bool state:</p><pre><code class="language-gwdk">view { - &lt;input type=&#34;checkbox&#34; g:bind:checked={Enabled} /&gt; -} -</code></pre><p>Event object binding is planned separately.</p><p>Safe non-URL attributes inside stateful components can be reactive:</p><pre><code class="language-gwdk">view { - &lt;button disabled={Saving} aria-expanded={Open}&gt;Save&lt;/button&gt; -} -</code></pre><p>Boolean HTML attributes such as <code>disabled</code> are toggled as attributes. Scalar -and ARIA attributes are stringified. Reactive URL attributes, <code>style</code>, and -event-handler attributes are rejected until dedicated safety rules exist.</p><h2 id="lexer-tokens">Lexer Tokens</h2><p>Language tooling currently tokenizes metadata declarations, identifiers, strings, <code>{</code>, <code>}</code>, <code>,</code>, <code>:</code>, <code>?</code>, <code>=&gt;</code>, newlines, text, illegal tokens, and EOF.</p><p>Identifiers may include letters, digits, underscores, dots, and hyphens after the first character. Quoted strings support escaped characters and report an error if a newline appears before the closing quote.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/await-blocks-spec/index.html b/docs-site/dist/site/docs/product/await-blocks-spec/index.html deleted file mode 100644 index 53c45dca..00000000 --- a/docs-site/dist/site/docs/product/await-blocks-spec/index.html +++ /dev/null @@ -1,41 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: Bounded Await Blocks - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: Bounded Await Blocks - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: Bounded Await Blocks - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: Bounded Await Blocks</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Client islands that fetch JSON need local loading and error UI without hand -maintaining <code>Loading</code> and <code>Error</code> state fields around every async handler. -Before this feature, the markup parser rejected <code>{#await}</code> entirely, so island -authors had to spread async control flow across client state, handler code, and -conditional markup.</p><h2 id="goals">Goals</h2><ul><li>Support a bounded <code>{#await}</code> markup block inside JS client islands.</li><li>Render pending, resolved, and error branches around compiler-owned async -fetches.</li><li>Keep async execution deterministic and local to the island runtime.</li><li>Preserve the bounded client language: no arbitrary Promise or raw JavaScript -access from markup.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Supporting <code>g:await</code> or <code>g:async</code> directives.</li><li>Supporting arbitrary JavaScript promises.</li><li>Supporting value-returning async helper functions before the broader client -return-type work lands.</li></ul><h2 id="users-and-permissions">Users And Permissions</h2><ul><li>Primary users: GOWDK component authors building browser-enhanced islands.</li><li>Roles or permissions: no special roles.</li><li>Data visibility rules: fetched data is visible only to the client island that -requested it.</li></ul><h2 id="user-flow">User Flow</h2><ol><li>The author writes <code>{#await fetchJSON[T](urlExpr)}</code> in a component view.</li><li>The pending branch renders immediately.</li><li>The runtime fetches JSON, swaps in the <code>{:then name}</code> branch on success, or -swaps in the <code>{:catch err}</code> branch on failure.</li></ol><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li>Parse <code>{#await expr}</code>, <code>{:then name}</code>, optional <code>{:catch err}</code>, and <code>{/await}</code>.</li><li>Validate that <code>expr</code> is <code>fetchJSON[T](urlExpr)</code> and that <code>urlExpr</code> is a -bounded client expression.</li><li>Expose the resolved value to the <code>then</code> branch and an error object with -<code>message</code> to the <code>catch</code> branch.</li><li>Re-run nested client conditionals, loops, bindings, and event handlers after -a branch swap.</li><li>Abort stale fetches when an await expression is replaced or the island is -destroyed.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Performance: fetch and render only within the owning island.</li><li>Reliability: stale async results must not replace newer branch state.</li><li>Accessibility: authors control accessible pending/error markup.</li><li>Security/privacy: only root-relative or otherwise compiler-validated URL -expressions already allowed by <code>fetchJSON</code> may be used.</li><li>Observability: fetches keep the existing island trace lane.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Parser/model/render tests cover valid and invalid await blocks.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Browser/runtime tests cover pending, success, error, and nested branch -bindings.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Docs describe the supported syntax and exclusions.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Existing async handler behavior remains unchanged.</li></ul><h2 id="edge-cases">Edge Cases</h2><ul><li>Missing <code>{:then}</code> is rejected.</li><li>Duplicate <code>{:then}</code> or <code>{:catch}</code> is rejected.</li><li>Await blocks outside component islands are rejected.</li><li>Branch variables must be valid identifiers and must not collide with each -other.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Internal: view parser/model, view renderer, JS island runtime, client -expression validator.</li><li>External: browser <code>fetch</code> and <code>AbortController</code> when available.</li></ul><h2 id="open-questions">Open Questions</h2><ul><li>Value-returning async helper functions should be handled with #501 rather -than this bounded markup slice.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/contract-runtime-spec/index.html b/docs-site/dist/site/docs/product/contract-runtime-spec/index.html deleted file mode 100644 index 310124cc..00000000 --- a/docs-site/dist/site/docs/product/contract-runtime-spec/index.html +++ /dev/null @@ -1,50 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: Contract Runtime - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: Contract Runtime - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: Contract Runtime - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: Contract Runtime</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Go applications need a typed backend contract model that can be inspected, -executed locally, exposed through generated web adapters, and replayed from -worker processes without turning browser UI events into trusted backend facts.</p><h2 id="goals">Goals</h2><ul><li>Model queries, commands, events, and jobs as typed Go registrations.</li><li>Keep command ownership singular and reject duplicate command owners.</li><li>Capture domain, integration, and presentation events only after command -success.</li><li>Let generated <code>g:command</code> and <code>g:query</code> adapters execute web-role contracts.</li><li>Let domain events explicitly invalidate bound queries for generated realtime -refresh without inferring backend behavior from handler bodies.</li><li>Let worker and cron roles run the same registrations from user-owned Go -commands or generated helper APIs.</li><li>Provide CLI list, trace, and graph views over scanned contract metadata.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Generate separate worker or cron binaries as part of the runtime contract.</li><li>Treat browser UI events as backend events.</li><li>Add a mandatory broker, queue, database, or realtime dependency to the root -module.</li><li>Replace app-owned authorization, transactions, idempotency, or persistence.</li></ul><h2 id="users-and-permissions">Users And Permissions</h2><ul><li>Primary users: Go developers building GOWDK apps with typed backend behavior.</li><li>Roles or permissions: <code>web</code>, <code>worker</code>, <code>cron</code>, <code>api</code>, and <code>admin</code> runtime -role filtering.</li><li>Data visibility rules: generated web adapters execute only contracts -registered for the <code>web</code> role or no explicit role; non-web references are -compiler diagnostics.</li></ul><h2 id="user-flow">User Flow</h2><ol><li>Register contracts in normal Go with <code>runtime/contracts</code>.</li><li>Reference routable commands or queries from <code>.gwdk</code> with <code>g:command</code> or -<code>g:query</code>.</li><li>Optionally register <code>RegisterInvalidation[event, query]</code> when a domain event -should refresh query-owned UI regions.</li><li>Build a generated app and optionally register a command event sink.</li><li>Run subscribers locally, through an outbox/broker worker, or through cron -role job execution from user-owned Go.</li><li>Inspect registrations with <code>gowdk contracts</code>, <code>gowdk list</code>, <code>gowdk graph</code>, -and <code>gowdk trace</code>.</li></ol><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li>Typed registrations exist for queries, commands, events, and jobs.</li><li>Command/query web references are represented in IR, build reports, routes, -and generated adapters.</li><li>Command execution captures emitted events and dispatches them only after -success.</li><li>Event replay supports role filtering, ack/nack, seen-store deduplication, and -configurable nacked-batch backoff.</li><li>Generated app packages expose <code>RegisterContractEventSink</code>, -<code>NewContractRegistry</code>, and worker replay helpers for event sources.</li><li>CLI contract reports scan registrations, roles, command emissions, event -subscribers, jobs, diagnostics, graph, and trace output.</li><li>Contract scanning records explicit domain-event to query invalidation edges, -rejects unknown queries/events and events no scanned command emits, and -exposes validated edges to generated realtime output.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Performance: local dispatch is dependency-free and does not require a broker.</li><li>Reliability: durable adapters remain at-least-once and require idempotent -subscribers.</li><li>Accessibility: presentation events are output-only notifications and do not -define browser input semantics.</li><li>Security/privacy: browser UI events cannot declare backend facts; generated -web adapters preserve guard, rate-limit, and CSRF ordering.</li><li>Observability: metadata exposes stable operation names and labels.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./runtime/contracts</code></li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./internal/appgen</code></li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./internal/contractscan ./internal/buildgen ./internal/clientrt</code></li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go run ./cmd/gowdk build --config examples/contracts/gowdk.config.go --out /tmp/gowdk-contracts-build --app /tmp/gowdk-contracts-app --bin /tmp/gowdk-contracts-site examples/contracts/patients.page.gwdk</code></li></ul><h2 id="edge-cases">Edge Cases</h2><ul><li>Duplicate command owners fail scanning/check/build.</li><li>Non-web contract references fail before generated routes run.</li><li>Invalidations fail when they name unknown queries/events or a domain event no -scanned command emits.</li><li>Subscriber failures nack batches when the source supports nack.</li><li>Duplicate event IDs can be skipped only after dispatch and ack succeed.</li><li>Nil sinks default to in-process dispatch.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Internal: <code>runtime/contracts</code>, <code>internal/contractscan</code>, <code>internal/gwdkir</code>, -<code>internal/appgen</code>, <code>cmd/gowdk</code>.</li><li>External: optional nested Redis, NATS, and WebSocket adapter modules only when -applications import them.</li></ul><h2 id="open-questions">Open Questions</h2><ul><li>Which editor views should surface contract graph and route binding status -first?</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/diagnostics-and-navigation/index.html b/docs-site/dist/site/docs/product/diagnostics-and-navigation/index.html deleted file mode 100644 index 5d87e39f..00000000 --- a/docs-site/dist/site/docs/product/diagnostics-and-navigation/index.html +++ /dev/null @@ -1,83 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: Diagnostics And Navigation - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: Diagnostics And Navigation - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: Diagnostics And Navigation - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: Diagnostics And Navigation</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Authors need diagnostic codes and editor navigation to be stable enough for CI, -editors, bug reports, and docs before GOWDK adds broad parser recovery and -deeper workspace navigation.</p><h2 id="current-commands">Current Commands</h2><pre><code class="language-sh">gowdk check --json --warnings-as-errors --ssr --config gowdk.config.go -gowdk explain missing_ssr_addon -gowdk explain --json spa_dynamic_route_missing_paths -gowdk fix --dry-run --code old_action_block_syntax --ssr --config gowdk.config.go -gowdk routes --ssr --config gowdk.config.go -gowdk sitemap --ssr --config gowdk.config.go -gowdk lsp -</code></pre><h2 id="goals">Goals</h2><ul><li>Keep diagnostic codes as stable handles for CLI output, editor integrations, -CI policy, docs, and bug reports.</li><li>Make every emitted diagnostic code discoverable through <code>gowdk explain</code> and -the registry-backed reference docs.</li><li>Share safe fix metadata between <code>gowdk fix</code> and LSP code actions.</li><li>Let navigation tooling use compiler-owned metadata for pages, routes, -components, layouts, guards, stores, open Go handler symbols, and source -ranges.</li><li>Preserve GOWDK product rules: <code>.gwdk</code> declarations own web metadata, normal -Go owns app behavior, and generated Go remains adapter glue.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Broad parser recovery or replacing the current <code>parse_error</code> carrier with -specific parser codes in this spec.</li><li>Generated JavaScript ownership of routes, auth, business rules, validation, -server state, loading policy, or cache policy.</li><li>Replacing Go editor tooling for normal <code>.go</code> files.</li><li>Implicit route discovery from folders, frameworks, or generated app output.</li></ul><h2 id="contract">Contract</h2><p>Diagnostic output has three public surfaces:</p><ul><li><code>gowdk check</code> emits human text or JSON diagnostics.</li><li><code>gowdk explain</code> describes a diagnostic code, severity, stability, next steps, -and optional safe fix metadata.</li><li><code>gowdk fix</code> applies only registry-backed safe rewrites.</li></ul><p>Navigation tooling has three public surfaces:</p><ul><li><code>gowdk lsp</code> provides diagnostics, formatting, completions, hover, -definitions, references, quick fixes, and semantic tokens for open editor -documents.</li><li><code>gowdk routes</code> reports route and endpoint metadata from compiler IR.</li><li><code>gowdk sitemap</code> reports page source paths, dynamic params, and block -presence for editor and tool integrations.</li></ul><p>The diagnostic registry source of truth is -<code>internal/diagnostics/registry.go</code>. The public registry contract, current code -areas, stability policy, JSON shape, and safe-fix rules live in -<a href="/docs/reference/diagnostic-codes/"><code>docs/reference/diagnostic-codes.md</code></a>. -CLI diagnostic output shape and source-span behavior live in -<a href="/docs/language/diagnostics/"><code>docs/language/diagnostics.md</code></a>. The implemented -LSP slice lives in -<a href="/docs/product/language-server/"><code>docs/product/language-server.md</code></a>.</p><h2 id="implemented-today">Implemented Today</h2><ul><li>Stable and experimental diagnostic-code registry entries with severity, -area, summary, explanation, and optional safe fix metadata.</li><li><code>gowdk explain</code> plain text and JSON output.</li><li><code>gowdk check --json</code> diagnostics with 1-based positions and exclusive range -end columns.</li><li>Exact source ranges for high-value editor diagnostics that already have -parser or IR spans: parser diagnostics, route declarations and params, -action/API/fragment declarations, contract references, realtime -subscriptions, component view bindings, component client statements, -unbound DOM ref usage, accessibility warnings, duplicate <code>use</code> aliases, -layout references, and backend binding diagnostics.</li><li>Warning policy through <code>gowdk check --warnings-as-errors</code>.</li><li>Registry-backed <code>gowdk fix</code> rewrites and matching LSP quick fixes.</li><li>LSP diagnostics, formatting, completions, hover, open-document definitions, -references, code actions, and full-document semantic tokens.</li><li>CLI route and sitemap reports derived from compiler IR.</li></ul><h2 id="exact-range-gap-list">Exact-Range Gap List</h2><ul><li>Parser diagnostics still use broad <code>parse_error</code> until recovery has stable, -specific codes.</li><li>Some aggregate diagnostics still point at an owner declaration because the -problem is across multiple declarations rather than one token: cyclic layout -inheritance, ambiguous dynamic route families, persisted store schema/scope -conflicts, duplicate route method/path conflicts, and duplicate page, -component, or layout identities. These should keep related locations where a -prior declaration is known.</li><li>Go package and type-check diagnostics use <code>go/token</code> positions when the Go -toolchain provides them. Package-level failures without a precise Go -position may still point at the owning <code>.gwdk</code> import, state, props, or block -declaration.</li><li>Addon-provided <code>GoBlockDiagnostic</code> values can only be exact when the addon -returns source offset metadata. Until that interface grows, addon diagnostics -point at the owning <code>go addon.&lt;name&gt; {}</code> block.</li><li>Markup contract families currently surface through parser or view validation -ranges when available, but broader recovery and direct emitted family codes -remain planned for unsupported markup syntax/directive families.</li><li>Contract scan diagnostics for sibling Go registrations use scanner-provided -file/line/column data; they do not guess ranges in <code>.gwdk</code> editors when the -invalid source is a <code>.go</code> file.</li></ul><h2 id="unsupported-or-planned">Unsupported Or Planned</h2><ul><li>LSP navigation is limited to open editor documents and supported compiler -metadata. Workspace-wide route/type navigation remains planned.</li><li>Route/type navigation must use <code>.gwdk</code> declarations, compiler IR, and normal -Go symbol data. It must not infer behavior from framework route registration -or generated adapter source.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> The diagnostic catalogue and navigation contract is specified before -broad parser recovery or wider route/type navigation.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Current diagnostic code ownership, stability, JSON output, safe fixes, -and LSP surfaces link to their source-of-truth docs.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Unsupported and planned behavior is explicit.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Product boundaries are preserved: build-time pages remain default, -request-time rendering stays opt-in, app behavior stays in Go, and -generated Go remains adapter glue.</li></ul><h2 id="verification">Verification</h2><pre><code class="language-sh">go run ./cmd/gowdk explain missing_ssr_addon -go run ./cmd/gowdk explain --json spa_dynamic_route_missing_paths -go test ./internal/diagnostics ./internal/lang ./internal/lsp -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/language-server/index.html b/docs-site/dist/site/docs/product/language-server/index.html deleted file mode 100644 index d3701377..00000000 --- a/docs-site/dist/site/docs/product/language-server/index.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: GOWDK Language Server - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: GOWDK Language Server - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: GOWDK Language Server - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: GOWDK Language Server</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Developers editing <code>.gwdk</code> files need live feedback from the same language tooling used by the CLI. The current VS Code extension shells out to separate CLI commands for diagnostics and formatting, which works for one editor but does not give other editors a standard integration surface.</p><h2 id="goals">Goals</h2><ul><li>Provide a Language Server Protocol entrypoint through <code>gowdk lsp</code>.</li><li>Reuse existing lexer, parser, formatter, and compiler validation behavior.</li><li>Support unsaved editor buffers without writing temporary files.</li><li>Keep the first version dependency-free and small enough to evolve with the language grammar.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Implement semantic analysis beyond the current compiler validation rules.</li><li>Replace the site-map visualizer or file-moving VS Code commands.</li><li>Add request-time SSR behavior or compile/codegen features.</li><li>Add editor-specific packages to the Go compiler core.</li></ul><h2 id="users-and-permissions">Users And Permissions</h2><ul><li>Primary users: developers authoring <code>.gwdk</code> pages and components.</li><li>Roles or permissions: local editor process only.</li><li>Data visibility rules: diagnostics and edits are derived from local file contents and should not leave the machine.</li></ul><h2 id="user-flow">User Flow</h2><ol><li>User starts an LSP-capable editor for a workspace containing <code>.gwdk</code> files.</li><li>The editor launches <code>gowdk lsp</code> over stdio.</li><li>The language server validates opened buffers, publishes diagnostics, returns formatting edits, offers completions, returns hover text, jumps to declarations, finds references, offers quick fixes, and colors syntax through semantic tokens.</li></ol><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li>Start a JSON-RPC/LSP server with <code>gowdk lsp</code>.</li><li>Handle <code>initialize</code>, <code>initialized</code>, <code>shutdown</code>, and <code>exit</code>.</li><li>Accept full-document <code>textDocument/didOpen</code>, <code>textDocument/didChange</code>, <code>textDocument/didSave</code>, and <code>textDocument/didClose</code> notifications.</li><li>Publish diagnostics using the current GOWDK parser and validation rules.</li><li>Publish project-linked <code>g:command</code> and <code>g:query</code> binding diagnostics for dirty -buffers when a workspace root can be found.</li><li>Return whole-document formatting edits using <code>gowdk fmt</code> behavior.</li><li>Return keyword completions for metadata declarations, render modes, blocks, and <code>g:</code> directives.</li><li>Return project completions for open-document components, layouts, guards, -routes, page IDs, stores, local component props, and inferred component state -or value fields.</li><li>Return hover text for known metadata declarations, directives, blocks, routes, stores, -props, components, layouts, guards, and handler symbols from open documents.</li><li>Return go-to-definition locations for same-package and <code>use</code>-qualified -component calls from open documents.</li><li>Return go-to-definition locations for exported Go handler symbols when the -matching Go file is open in the editor session.</li><li>Return references for exact <code>.gwdk</code> project symbols across open documents, -including page IDs, routes, components, stores, and guards.</li><li>Return quick-fix code actions for old action/API block syntax migrations and -missing GOWDK <code>use</code> aliases.</li><li>Return full-document semantic tokens for <code>.gwdk</code> decorators, identifiers, -strings, and operators.</li><li>Return a document outline (top-level package, metadata, imports, uses, blocks, -endpoints, and component/page declarations) from the recursive-descent outline -pass over the shared tokenizer.</li><li>Return the source-linked inspect tree for open documents through a custom -<code>gowdk/tree</code> request. Params may include <code>{ &#34;textDocument&#34;: { &#34;uri&#34;: &#34;...&#34; } }</code>; -the result is the same versioned tree projection as <code>gowdk inspect tree</code>, -including ordered nodes, component composition edges, and tree diagnostics.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Performance: validate one open buffer quickly enough for interactive editing.</li><li>Reliability: malformed protocol messages should return JSON-RPC errors instead of crashing.</li><li>Accessibility: editor clients should receive standard diagnostics and completion metadata.</li><li>Security/privacy: no network access and no external process execution inside the language server.</li><li>Observability: protocol errors should be written to stderr.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>gowdk lsp</code> starts and answers an LSP <code>initialize</code> request.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Opening an invalid <code>.gwdk</code> buffer publishes diagnostics without requiring the buffer to be saved.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Opening a <code>.gwdk</code> buffer with a missing, invalid, or non-web-role -<code>g:command</code>/<code>g:query</code> reference publishes the linked contract diagnostic -on the directive source range.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/formatting</code> returns a replacement edit matching <code>gowdk fmt</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/completion</code> returns the same language keywords exposed by editor tooling.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/completion</code> returns open-project symbols for components, -layouts, guards, routes, stores, props, and component state/value fields.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/hover</code> returns concise markdown help for language tokens and open-project symbols.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/definition</code> returns component declaration locations for open-project component calls.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/definition</code> returns open-buffer Go declaration locations for exported handler symbols.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/references</code> returns open-document references for page IDs, routes, components, stores, and guards.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/codeAction</code> returns quick fixes for old endpoint syntax and missing GOWDK use aliases.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/semanticTokens/full</code> returns encoded token data for open <code>.gwdk</code> buffers.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>textDocument/documentSymbol</code> returns a top-level outline parsed by the -recursive-descent outline pass over the shared tokenizer (ADR 0010).</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>gowdk/tree</code> returns the versioned inspect tree projection for open -project documents.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./...</code> and <code>go build ./cmd/gowdk</code> pass.</li></ul><h2 id="edge-cases">Edge Cases</h2><ul><li>Missing <code>route</code> or <code>guard</code> should publish a diagnostic at the relevant -source location when available. <code>page</code> is optional for file-backed pages.</li><li>Closing a document should clear diagnostics for that URI.</li><li>Unknown LSP requests should return a method-not-found error.</li><li>Notifications without params should be ignored when safe.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Internal: <code>internal/lang</code>, <code>internal/parser</code>, <code>internal/compiler</code>, <code>internal/gwdkir</code>.</li><li>External: none.</li></ul><h2 id="open-questions">Open Questions</h2><ul><li>Workspace-wide compiler validation can reuse the existing duplicate page and -route checks once the LSP maintains project-wide IR.</li><li>Incremental sync can replace full-document sync if large <code>.gwdk</code> files become common.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/markup-transitions-spec/index.html b/docs-site/dist/site/docs/product/markup-transitions-spec/index.html deleted file mode 100644 index 71c7511d..00000000 --- a/docs-site/dist/site/docs/product/markup-transitions-spec/index.html +++ /dev/null @@ -1,48 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: Bounded Markup Transitions - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: Bounded Markup Transitions - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: Bounded Markup Transitions - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: Bounded Markup Transitions</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Stateful components can mount and unmount <code>g:if</code> branches and keyed <code>g:for</code> -rows, but authors have no compiler-owned way to attach CSS-driven enter, leave, -or reorder states to those lifecycle points. Using unsupported -<code>g:transition</code>/<code>g:animate</code> currently fails, so authors must duplicate lifecycle -state by hand.</p><h2 id="goals">Goals</h2><ul><li>Support a bounded <code>g:transition</code> directive for client <code>g:if</code> branches and -keyed client <code>g:for</code> rows.</li><li>Support a bounded <code>g:animate</code> directive for keyed client <code>g:for</code> row reorder -animation hooks.</li><li>Keep animation values in user or addon CSS; the runtime only toggles stable -classes and data attributes.</li><li>Preserve deterministic island updates and enhancement-only behavior.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>No JavaScript animation engine or built-in animation durations/easings.</li><li>No dynamic transition-name expressions in this slice.</li><li>No server-lane <code>server {}</code> transition behavior.</li><li>No component-call lifecycle directives in this slice; the existing client -lifecycle is attached to HTML elements.</li></ul><h2 id="users-and-permissions">Users And Permissions</h2><ul><li>Primary users: GOWDK component authors.</li><li>Roles or permissions: none.</li><li>Data visibility rules: no new data is exposed; directive values are literal -CSS hook names.</li></ul><h2 id="user-flow">User Flow</h2><ol><li>Author declares CSS for the generated transition or animation classes.</li><li>Author adds <code>g:transition=&#34;fade&#34;</code> to a client <code>g:if</code> branch or keyed -<code>g:for</code> row.</li><li>Author optionally adds <code>g:animate=&#34;reorder&#34;</code> to a keyed <code>g:for</code> row.</li><li>The generated island runtime toggles classes when rows or branches enter, -leave, or move.</li></ol><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li><code>g:transition</code> accepts one literal motion name on the same element as a -client <code>g:if</code>, <code>g:else-if</code>, <code>g:else</code>, or keyed client <code>g:for</code>.</li><li><code>g:animate</code> accepts one literal motion name on the same element as keyed -client <code>g:for</code>.</li><li>Generated HTML emits <code>data-gowdk-transition</code> and <code>data-gowdk-animate</code>.</li><li>Runtime transition classes are: -<code>gowdk-transition</code>, <code>gowdk-transition-&lt;name&gt;</code>, -<code>gowdk-transition-enter</code>, <code>gowdk-transition-enter-from</code>, -<code>gowdk-transition-enter-to</code>, <code>gowdk-transition-leave</code>, -<code>gowdk-transition-leave-from</code>, and <code>gowdk-transition-leave-to</code>.</li><li>Runtime animation classes are: -<code>gowdk-animate</code>, <code>gowdk-animate-&lt;name&gt;</code>, and <code>gowdk-animate-move</code>.</li><li>Misuse fails at build/render time with a targeted error.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Performance: list diffing remains keyed and local to the island root.</li><li>Reliability: interrupted leave transitions can be reversed without removing -the node.</li><li>Accessibility: docs direct authors to honor <code>prefers-reduced-motion</code>.</li><li>Security/privacy: literal names are validated as CSS-safe identifiers.</li><li>Observability: no new runtime telemetry.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Parser accepts <code>g:transition</code> and <code>g:animate</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Build output emits the expected data attributes for client lifecycle -elements.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> JS island runtime toggles enter, leave, interrupted-leave, and move -classes.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Misuse diagnostics cover static elements, invalid names, and <code>g:animate</code> -outside keyed lists.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Language docs and stability tables describe the supported slice.</li></ul><h2 id="edge-cases">Edge Cases</h2><ul><li>A hidden initial branch should not animate until it is mounted by the client.</li><li>A leave transition interrupted by a remount cancels the pending removal.</li><li>A removed keyed row with no CSS transition still falls back to deterministic -removal.</li><li>A moved keyed row only receives move classes when its keyed position changes.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Internal: <code>internal/viewparse</code>, <code>internal/viewrender</code>, -<code>internal/clientrt/assets/island.js</code>, <code>internal/buildgen</code> browser tests.</li><li>External: browser <code>transitionend</code> / <code>animationend</code> events; user-authored CSS.</li></ul><h2 id="open-questions">Open Questions</h2><ul><li>Whether a later slice should add <code>g:transition:in</code> / <code>g:transition:out</code>.</li><li>Whether <code>g:animate</code> should eventually apply true FLIP transforms or remain a -class/state contract.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/observability-tracing-spec/index.html b/docs-site/dist/site/docs/product/observability-tracing-spec/index.html deleted file mode 100644 index c9c47d25..00000000 --- a/docs-site/dist/site/docs/product/observability-tracing-spec/index.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: GOWDK Trace - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: GOWDK Trace - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: GOWDK Trace - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: GOWDK Trace</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>GOWDK needs a tracing core that can be used by plain Go applications and later -by generated runtime paths without taking a dependency on OpenTelemetry, -Sentry, or a hosted observability backend.</p><h2 id="goals">Goals</h2><ul><li>Provide a dependency-free <code>runtime/trace</code> package.</li><li>Use W3C Trace Context IDs and <code>traceparent</code> propagation.</li><li>Support backend, frontend, and worker surfaces plus GOWDK lanes such as -route, guard, handler, SSR, action, API, fragment, contract, job, island, -navigation, and user spans.</li><li>Provide context helpers: <code>Start</code>, <code>SpanFrom</code>, span events, attributes, and -status.</li><li>Provide pluggable sinks: console, JSON Lines, in-memory ring, multi-sink, and -exporter adapter.</li><li>Provide sampling: always on, always off, ratio, and test-counted sampling.</li><li>Provide a self-contained collector handler that serves recent spans as JSON -and streams spans over SSE.</li><li>Keep the root module dependency graph unchanged.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Add OpenTelemetry SDK or OTLP dependencies to the root module.</li><li>Persist traces durably.</li><li>Define <code>.gwdk</code> tracing syntax.</li></ul><h2 id="users">Users</h2><ul><li>Go developers who want lightweight local trace output in plain Go programs.</li><li>Future generated GOWDK app wiring that needs a stable runtime trace API.</li><li>Tooling that wants recent in-process traces without a collector service.</li></ul><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li><code>runtime/trace</code> exposes W3C-compatible <code>TraceID</code> and <code>SpanID</code> values.</li><li><code>trace.Start(ctx, name, opts...)</code> starts a sampled span and returns a context -carrying that span.</li><li><code>trace.SpanFrom(ctx)</code> returns the active sampled span.</li><li>Span methods are nil-safe: <code>End</code>, <code>Event</code>, <code>Set</code>, and <code>SetStatus</code> can be -called even when sampling returned <code>nil</code>.</li><li><code>trace.Inject</code> and <code>trace.Extract</code> round-trip <code>traceparent</code> through carriers -such as <code>http.Header</code>.</li><li><code>trace.RingSink</code> keeps the newest spans, drops oldest on overflow, and -exposes a drop count.</li><li><code>trace.Collector</code> implements a sink and serves recent spans as JSON or SSE.</li><li>The exporter adapter produces an OTLP-like span shape without importing -OpenTelemetry packages.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Runtime package imports must stay standard-library only.</li><li><code>AlwaysOff</code> with no start options must allocate zero objects on the hot path.</li><li>Sinks must be safe for concurrent use.</li><li>The ring sink must not block on external I/O.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./runtime/trace</code></li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./runtime/trace -run &#39;^$&#39; -bench BenchmarkStartAlwaysOff -benchmem</code></li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>go test ./...</code></li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> No root <code>go.mod</code> dependency changes.</li></ul><h2 id="current-limits">Current Limits</h2><ul><li>Generated instrumentation is debug-gated through <code>addons/observability</code>; -production sampling, access policy, and durable storage remain app-owned.</li><li>Collector data is in-memory only and process-local.</li><li>The SSE stream is a local inspection aid, not a durable delivery channel.</li><li>Concrete OTLP transport lives in the nested optional <code>runtime/trace/otel</code> -module.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/playground-hosted-execution-spec/index.html b/docs-site/dist/site/docs/product/playground-hosted-execution-spec/index.html deleted file mode 100644 index 74888251..00000000 --- a/docs-site/dist/site/docs/product/playground-hosted-execution-spec/index.html +++ /dev/null @@ -1,45 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: Playground Hosted Execution And Export - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: Playground Hosted Execution And Export - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: Playground Hosted Execution And Export - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: Playground Hosted Execution And Export</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>Website onboarding needs runnable or exportable examples without making hosted -execution a required part of learning GOWDK. A hosted playground can expose -repository secrets, user credentials, host filesystem state, or outbound -network access unless the sandbox contract exists before execution is wired.</p><h2 id="goals">Goals</h2><ul><li>Provide a CLI-visible sandbox policy for website and ops integrations.</li><li>Export playground projects as ordinary GOWDK source archives.</li><li>Support an opt-in local sandbox build bridge for hosted runner development.</li><li>Keep hosted execution disabled by default.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>No production hosting service.</li><li>No hidden dependency downloads, npm installs, database access, or framework -runtime.</li><li>No broad host filesystem or network access.</li><li>No hosted-only project API.</li></ul><h2 id="users-and-permissions">Users And Permissions</h2><ul><li>Primary users: learners, docs website visitors, and maintainers wiring a -future hosted playground.</li><li>Roles or permissions: local CLI users can inspect policy and export projects; -execution requires an explicit <code>--allow-hosted-execution</code> flag.</li><li>Data visibility rules: source export excludes generated output, secrets, -private files, local env files, dependency vendor folders, and generated -reports.</li></ul><h2 id="user-flow">User Flow</h2><ol><li>A learner inspects examples on the website or locally.</li><li>The learner exports the project with <code>gowdk playground export</code>.</li><li>A future hosted runner may stage allowed files into an isolated workspace and -execute only after the caller accepts the sandbox policy.</li></ol><h2 id="requirements">Requirements</h2><h3 id="functional">Functional</h3><ul><li><code>gowdk playground policy [--json]</code> prints the execution-disabled sandbox -policy.</li><li><code>gowdk playground export --dir &lt;project&gt; --out &lt;project.zip&gt; [--json]</code> -creates a deterministic source archive.</li><li><code>gowdk playground run --dir &lt;project&gt; --out &lt;dir&gt;</code> refuses execution unless -<code>--allow-hosted-execution</code> is present.</li><li>Sandboxed run copies allowed files into a disposable workspace and writes -output to the explicit output directory.</li></ul><h3 id="non-functional">Non-Functional</h3><ul><li>Performance: source collection is bounded by file count and byte limits.</li><li>Reliability: archives and staged workspaces are deterministic and clean up -temporary directories.</li><li>Accessibility: website examples remain inspectable without execution.</li><li>Security/privacy: no secrets, generated output, private keys, local env files, -or host credentials are exported or mounted; Go dependency lookup is offline -by default.</li><li>Observability: JSON policy/export output is suitable for website or ops -tooling.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Hosted execution is disabled by default and isolated from user secrets and -repository credentials.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Website can demonstrate examples without broad network/filesystem access.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Exported projects build locally with documented commands.</li></ul><h2 id="edge-cases">Edge Cases</h2><ul><li>Missing <code>gowdk.config.go</code> rejects export and run.</li><li>Secret-looking environment variable names are rejected from sandbox env.</li><li>Oversized files, too many files, or oversized total input fail before archive -or workspace execution.</li><li>Generated output and dependency directories are skipped even when nested.</li></ul><h2 id="dependencies">Dependencies</h2><ul><li>Internal: compiler build command, local config loading, generated output -writer.</li><li>External: Go toolchain for local sandbox builds.</li></ul><h2 id="open-questions">Open Questions</h2><ul><li>Whether a future hosted site uses a worker, container, or separate sandbox -service is intentionally undecided.</li><li>Future dependency mirrors require a separate policy before enabling outbound -resolution.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/playground/index.html b/docs-site/dist/site/docs/product/playground/index.html deleted file mode 100644 index 3ec219bf..00000000 --- a/docs-site/dist/site/docs/product/playground/index.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Playground Onboarding and Sandboxing - GOWDK</title> - <meta name="description" content="Status: partial implementation. Local policy inspection, source export, and opt-in sandboxed local execution are implemented in gowdk playground. Hosted website execution remains..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Playground Onboarding and Sandboxing - GOWDK"> - <meta property="og:description" content="Status: partial implementation. Local policy inspection, source export, and opt-in sandboxed local execution are implemented in gowdk playground. Hosted website execution remains..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Playground Onboarding and Sandboxing - GOWDK"> - <meta name="twitter:description" content="Status: partial implementation. Local policy inspection, source export, and opt-in sandboxed local execution are implemented in gowdk playground. Hosted website execution remains..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Playground Onboarding and Sandboxing</h1><p class="doc-lead">Status: partial implementation. Local policy inspection, source export, and opt-in sandboxed local execution are implemented in gowdk playground. Hosted website execution remains optional and must follow the same contract before it can run user code.</p></header><article class="prose"><p>Status: partial implementation. Local policy inspection, source export, and -opt-in sandboxed local execution are implemented in <code>gowdk playground</code>. Hosted -website execution remains optional and must follow the same contract before it -can run user code.</p><h2 id="current-safe-path">Current Safe Path</h2><p>Use local examples and local preview commands for runnable onboarding. This -starts a local server and keeps running until stopped:</p><pre><code class="language-sh">go run ./cmd/gowdk preview --out /tmp/gowdk-preview \ - examples/pages/home.page.gwdk \ - examples/pages/hero.cmp.gwdk -</code></pre><p>For a broader path, use <a href="/docs/learning/native/">Native Learning Path</a> and the -full-stack <a href="/docs/../examples/flagship/">flagship example</a>.</p><h2 id="playground-cli">Playground CLI</h2><p>Inspect the sandbox policy:</p><pre><code class="language-sh">gowdk playground policy -gowdk playground policy --json -</code></pre><p>Export a normal source project archive:</p><pre><code class="language-sh">gowdk playground export --dir my-site --out /tmp/my-site.zip -gowdk playground export --dir my-site --out /tmp/my-site.zip --json -</code></pre><p>Run a local sandbox build only when the caller explicitly opts into execution:</p><pre><code class="language-sh">gowdk playground run --dir my-site --out /tmp/my-site-dist \ - --allow-hosted-execution --module-cache /tmp/session-modcache -</code></pre><p><code>run</code> stages allowed files into a disposable workspace and then <strong>re-executes the -<code>gowdk</code> binary inside an OS-level sandbox</strong> before building: fresh Linux user, -mount, PID, network, IPC, and UTS namespaces; a <code>pivot_root</code> into a minimal tree -that exposes only a read-only toolchain, the chosen module cache, the staged -workspace, and the output directory; no network; resource limits; dropped -capabilities; and <code>no_new_privs</code>. The build runs with a synthesized environment -(<code>GOPROXY=off</code>, <code>GOSUMDB=off</code>, <code>GOWORK=off</code>, no inherited host variables).</p><p>This sandbox is <strong>Linux-only and fails closed</strong>: on a non-Linux host, or where -unprivileged user namespaces are unavailable, <code>run</code> refuses instead of building -unconfined. Two flags are required to choose how dependencies are resolved -offline, because the module cache is readable by the submitted build:</p><ul><li><code>--module-cache &lt;dir&gt;</code> — mount a caller-supplied per-session cache (required on -shared/multi-tenant runners so one session cannot read another&#39;s modules);</li><li><code>--allow-shared-module-cache</code> — deliberately expose the host <code>GOMODCACHE</code> (fine -for local single-user use; prints a warning).</li></ul><p><code>--out</code> must be a fresh, empty, service-owned directory (the build writes there -through a host bind). This is a local bridge for website playground -infrastructure, not a complete production hosting boundary — see the hosted -execution rules below.</p><h2 id="website-onboarding">Website Onboarding</h2><p>The website should start with non-executing, inspectable examples:</p><ul><li>install command and version check;</li><li>current experimental 0.x warning;</li><li>links to native examples and the learning path;</li><li>copyable snippets for page, component, action, API, fragment, SSR, guard, and -one-binary flows;</li><li>static previews of generated route manifests, build reports, and generated -output layout.</li></ul><p>This keeps the first website playground useful without hosting arbitrary code -execution.</p><h2 id="hosted-execution-rules">Hosted Execution Rules</h2><p>Hosted playground execution is disabled by default. The <code>run</code> command now -confines the build in an OS-level namespace sandbox (above), but that is the -<strong>inner</strong> boundary only. A hosted runner must still:</p><ul><li>wrap each session in an <strong>outer VM or container boundary</strong> with its own network -egress controls and cgroup memory/pids limits (the inner sandbox has no seccomp -filter yet and does not impose cgroup caps);</li><li>pass <code>--module-cache</code> pointing at a <strong>per-session cache</strong> containing only that -session&#39;s dependencies — never the shared host <code>GOMODCACHE</code>, whose modules are -readable by the submitted build;</li><li>run each session in an isolated disposable environment;</li><li>mount an empty workspace with no repository secrets or host credentials;</li><li>set CPU, memory, process, file count, output size, and wall-clock limits;</li><li>disable outbound network by default;</li><li>keep Go dependency resolution offline with <code>GOPROXY=off</code> and <code>GOSUMDB=off</code> -unless a future policy explicitly allows a pinned mirror;</li><li>pin the GOWDK binary version used by the session;</li><li>allow only documented optional tools, and never download hidden dependencies -during ordinary builds;</li><li>redact logs and reject environment variables that look like secrets;</li><li>persist nothing unless the user explicitly exports a project archive;</li><li>make generated output downloadable only as ordinary source/build artifacts;</li><li>treat abuse controls, rate limits, audit logs, and cleanup failures as part of -the feature, not follow-up polish.</li></ul><h2 id="export-contract">Export Contract</h2><p>An exported playground project is a normal GOWDK app:</p><ul><li>includes <code>gowdk.config.go</code> and source files;</li><li>omits generated <code>.gowdk/</code>, <code>dist/</code>, <code>bin/</code>, <code>gowdk_cache/</code>, dependency -vendor folders, secrets, private files, local env files, temp files, and -generated reports;</li><li>builds locally with documented commands such as <code>gowdk build</code>, <code>gowdk dev</code>, -or <code>gowdk preview</code>;</li><li>does not rely on hosted-only APIs.</li></ul><p>The export command enforces size limits: 128 files, 256 KiB per file, and -2 MiB total source input by default.</p><h2 id="non-goals">Non-Goals</h2><ul><li>Do not make hosted execution required for learning GOWDK.</li><li>Do not add hidden network, npm, Tailwind, database, or framework dependencies.</li><li>Do not treat the playground as a production hosting service.</li><li>Do not let generated browser JavaScript own routing, auth, validation, server -state, database access, or cache policy.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/requirements/index.html b/docs-site/dist/site/docs/product/requirements/index.html deleted file mode 100644 index 84733f6c..00000000 --- a/docs-site/dist/site/docs/product/requirements/index.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Product Requirements - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Product Requirements - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Product Requirements - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Product Requirements</h1></header><article class="prose"><h2 id="current-status">Current Status</h2><p>The product direction is Go-first full web app compilation: GOWDK is the -<code>.gwdk</code> component/page compiler, and GOWDK Runtime is the app/runtime layer. -Build-time page output is the default, actions/APIs/fragments are first-class -request-time endpoint behavior, and <code>server {}</code> / <code>go server {}</code> select the -integrated non-default request-time page-rendering lane per page.</p><p>Current user-facing documentation now separates implemented behavior from -planned behavior across the README, CLI/config/routing/deployment references, -language references, compiler docs, and examples.</p><h2 id="status-legend">Status Legend</h2><ul><li>Implemented: available in the current codebase, documented, and covered by -tests or an explicit verification command.</li><li>Partial: available for a narrower slice than the full requirement, with -remaining limits called out in the notes.</li><li>Experimental: available to try, but the public contract may still change.</li><li>Planned: accepted product direction with no stable implementation yet.</li><li>Intentionally out of scope: rejected for the current product direction.</li></ul><h2 id="requirements">Requirements</h2><table><thead><tr><th>ID</th><th>Requirement</th><th>Priority</th><th>Status</th><th>Notes</th></tr></thead><tbody><tr><td>PRD-001</td><td>Compile portable package-peer <code>.gwdk</code> files that declare <code>package</code>, optional <code>page</code>, <code>route</code>, <code>guard</code>, <code>layout</code>, blocks, and endpoints.</td><td>High</td><td>Partial</td><td>Discovery, package parsing, metadata parsing, parser syntax validation, filename-derived page IDs, default build discovery, route shape/conflict validation, required page-view and page-guard validation, explicit component-file build input, typed GOWDK AST, AST analyzer, versioned compiler IR, endpoint comment discovery, and endpoint conflict diagnostics are implemented; full downstream migration to the IR remains planned.</td></tr><tr><td>PRD-002</td><td>Default render mode must be <code>spa</code>.</td><td>High</td><td>Implemented</td><td>Root <code>RenderConfig.DefaultMode()</code> defaults to <code>gowdk.SPA</code>.</td></tr><tr><td>PRD-003</td><td>Support render modes <code>spa</code>, <code>action</code>, <code>hybrid</code>, and <code>ssr</code>.</td><td>High</td><td>Implemented</td><td>Root <code>RenderMode</code> constants exist.</td></tr><tr><td>PRD-004</td><td>Reject request-time page behavior unless the SSR feature is enabled in config or CLI options.</td><td>High</td><td>Implemented</td><td><code>internal/compiler.ValidatePage</code> emits <code>missing_ssr_addon</code>.</td></tr><tr><td>PRD-005</td><td>Require <code>paths {}</code> for dynamic SPA routes.</td><td>High</td><td>Implemented</td><td>Dynamic SPA routes without paths are rejected; action endpoints on those pages inherit generated concrete page paths. Malformed routes, duplicate route params, duplicate page route patterns, and route-method conflicts are rejected; the first literal string <code>paths {}</code> subset can prerender dynamic SPA routes.</td></tr><tr><td>PRD-006</td><td>Keep typed actions available without SSR.</td><td>High</td><td>Partial</td><td>SPA pages with exported <code>act Name POST &#34;/path&#34;</code> endpoint declarations validate without SSR. Generated apps can serve POST action handlers with generated typed decoders, unexpected-field rejection, generated validation for direct literal <code>required</code>, <code>minlength</code>, <code>maxlength</code>, and supported anchored <code>pattern</code> form controls, generated validation fragments for partial requests, partial fragment responses, same-package action handlers using no-input, typed value, typed pointer, or <code>form.Values</code> signatures returning <code>response.Response</code>, and generated CSRF token injection/validation by default unless <code>Build.CSRF.Disabled</code> is set. Direct file inputs and multipart generated action forms are rejected because uploads belong in user-owned API/server handlers. User-defined domain validation patterns remain in normal Go handlers.</td></tr><tr><td>PRD-007</td><td>Treat <code>server {}</code> as request-time behavior requiring the SSR addon.</td><td>High</td><td>Implemented</td><td>Pages with <code>load</code> infer request-time SSR and fail unless SSR is enabled.</td></tr><tr><td>PRD-008</td><td>Keep runtime render core reusable across build-time pages, backend fragments, and request-time pages.</td><td>High</td><td>Implemented</td><td><code>runtime/render</code> exists independently from <code>addons/ssr</code>; SSR is integrated through compiler/runtime hooks and enabled by feature registration.</td></tr><tr><td>PRD-009</td><td>Generate build-output/prerender output for v0.1.</td><td>High</td><td>Partial</td><td><code>gowdk build --out</code> emits app-shell HTML, <code>gowdk-routes.json</code>, <code>gowdk-assets.json</code>, and <code>gowdk-build-report.json</code> for simple build-time pages, the first literal dynamic path subset, literal build data, imported and same-package Go build data functions returning <code>T</code> or <code>(T, error)</code> with optional <code>gowdk.BuildParams</code> route params, scalar build fields, earlier-field references, string concatenation, numeric arithmetic, boolean logic, comparisons, and explicit or discovered components. <code>Build.ObfuscateAssets</code> / <code>gowdk build --obfuscate-assets</code> provide deterministic production obfuscation for compiler-owned generated browser JavaScript and record transformed assets in the asset manifest and build report. Generated app handlers exist for the supported action/API/fragment/SSR slices; arbitrary build-time statements beyond expression records and full component semantics remain planned.</td></tr><tr><td>PRD-010</td><td>Provide CSS processor addon extension points without adding Tailwind to the compiler core or runtime core.</td><td>High</td><td>Partial</td><td><code>FeatureCSS</code>, <code>addons/css</code>, configured stylesheet links, compile-time CSS processors, discovered CSS inputs, extracted literal classes, <code>css</code> page selection, generated page CSS output, CSS asset manifest entries, page-aware processor stylesheet selections, component CSS AST/IR scope and hash metadata, emitted scoped component CSS linked only from pages that use the component, emitted component <code>asset</code> files, scoped selector/keyframe rewriting, deterministic CSS ordering, AST-only config loading for built-in addons, executable config loading for external importable addons, an experimental Tailwind v4 standalone-CLI wrapper, and generated CSS/component asset content-hashed emitted filenames are implemented; richer CSS processor addon capabilities remain planned.</td></tr><tr><td>PRD-011</td><td>Support embedded assets and one-binary serving.</td><td>High</td><td>Partial</td><td><code>addons/embed</code> and <code>runtime/asset</code> boundaries exist; <code>gowdk serve</code> can serve generated build output locally; <code>gowdk build --app</code> can generate an embedded app, <code>--bin</code> can compile it into one binary, <code>--docker</code> can emit a minimal non-root Dockerfile and <code>.dockerignore</code> beside that binary, <code>--deploy-recipe</code> can emit optional static/systemd/Caddy/Nginx/split frontend-backend starter files, and <code>--wasm</code> can compile a Go <code>js/wasm</code> artifact for SPA pages, feature-bound action/API handlers, action redirects, action fragments, standalone concrete or dynamic fragments, concrete or dynamic SSR pages with declared <code>server {}</code> identifier or dotted paths, and concrete or dynamic hybrid request-time pages with or without declared <code>server {}</code> data. CI now starts the generated one-binary embed example and verifies both <code>/_gowdk/health</code> and the embedded page response.</td></tr><tr><td>PRD-012</td><td>Support server fragments for partial updates without full-page SSR.</td><td>Medium</td><td>Partial</td><td><code>addons/partial</code>, generated client runtime emission, generated action fragment responses for partial POSTs, standalone concrete and dynamic fragment routes with raw and typed route params for request-time hooks, generated required-field validation fragments for partial POSTs, generated CSRF validation when enabled, and first-slice generated JavaScript islands for local component state are implemented. Richer fragment rendering and broader local client-side reactivity remain planned.</td></tr><tr><td>PRD-013</td><td>Complete request-time page rendering with <code>server {}</code>, guards, layouts, and error handling.</td><td>Medium</td><td>Partial</td><td><code>addons/ssr</code> registers the SSR feature and provides load context aliases, route registration, request-aware layout composition, safe local redirect errors, default error-handler contracts, and declared load path resolution. <code>runtime/guard</code> provides shared guard context/registry/execution plus no-store redirect/custom-response helpers for generated SSR/action/API/fragment routes, and <code>runtime/auth</code> provides thin native RBAC principal/provider helpers for defense-in-depth generated route access gates; backend authorization remains normal Go code and is never replaced by guard metadata. Generated embedded apps can serve concrete and dynamic request-time SSR pages rendered from <code>view {}</code> and literal or imported <code>build {}</code> data, generated SSR/action/API/fragment routes use <code>auth.Addon</code> defaults for <code>auth.required</code> and native <code>role:</code>/<code>permission:</code> session guards when configured; otherwise they require <code>GOWDKGuardRegistry</code> for custom guard IDs and <code>GOWDKAuthProvider</code> for native RBAC guard IDs, fail Go compilation when required backing hooks are missing, run declared guards before user logic, and have generated-binary coverage for registered guard success and redirect paths, <code>server { =&gt; { field, user.name } }</code> execution calls same-package Go load functions through <code>ssr.LoadContext</code>, optional generated <code>404.html</code>/<code>500.html</code> pages are used by runtime app error responses, SSR routes can declare <code>error &#34;/errors/page.html&#34;</code> for route-local generated load/render failure and route panic pages, action/API declarations can declare endpoint-local <code>error</code> pages for generated panic boundaries, and generated SSR/action/API lanes have no-store panic boundaries.</td></tr><tr><td>PRD-014</td><td>Add optional WASM islands after the core compiler and action flow are stable.</td><td>Low</td><td>Partial</td><td>Component-level <code>wasm</code> declarations make normal calls to that component emit WASM and loader assets under <code>assets/gowdk/islands/</code>; explicit <code>g:island=&#34;wasm&#34;</code> remains supported as a call-site override. Declared <code>wasm</code> browser-side Go packages and page-level <code>go client {}</code> mounts are compiled with <code>GOOS=js GOARCH=wasm</code>, checked for browser-unsafe imports, ship the Go <code>wasm_exec.js</code> runtime asset, instantiate through Go runtime imports when needed, and validate required GOWDK ABI exports. Browser-runtime integration coverage exercises the generated host loader mount, event, patch, emit, cleanup, invalid-patch rejection, shared page-store participation, and persistence contract; <code>runtime/wasm</code> exposes payload/result helpers for Go exports. Fuller user-code runtime validation remains planned.</td></tr><tr><td>PRD-015</td><td>Provide language tools for <code>.gwdk</code> token inspection, formatting, validation, manifest output, and LSP editor integration.</td><td>High</td><td>Implemented</td><td><code>internal/lang</code>, <code>internal/lsp</code>, <code>internal/inspectreport</code>, and CLI commands exist, including source-linked inspect tree, endpoint graph output, and Go binding inspection.</td></tr><tr><td>PRD-016</td><td>Keep hybrid route behavior internal until a source contract is chosen.</td><td>High</td><td>Partial</td><td>Hybrid route metadata exists internally; <code>.gwdk</code> source selects request-time rendering with <code>server {}</code> or <code>go server {}</code>.</td></tr><tr><td>PRD-017</td><td>Define cache and revalidation behavior for static files, SPA routes, backend endpoints, partial responses, SSR routes, and hybrid pages.</td><td>Medium</td><td>Partial</td><td>Generated binaries apply asset-manifest cache policies for generated assets, default SPA HTML to <code>no-cache</code>, default request-time handlers to <code>no-store</code>, and apply explicit page <code>cache</code> policies to successful generated static SPA HTML and SSR HTML responses. <code>revalidate</code> accepts positive second or duration values, requires <code>cache</code>, and compiles into a <code>stale-while-revalidate=&lt;seconds&gt;</code> Cache-Control directive for generated static SPA HTML and SSR HTML. Richer hybrid cache policy syntax remains planned.</td></tr><tr><td>PRD-018</td><td>Escape generated HTML by default and require any raw HTML escape hatch to be explicit.</td><td>High</td><td>Implemented</td><td>Rendering escapes text and attributes by default. <code>g:unsafe-html={Expr}</code> is the single explicit raw HTML escape hatch: attributes stay escaped, markup children are rejected, and it is refused on void elements, in stateful/island/loop contexts, and for route-param-tainted values. Foreign raw HTML syntax such as <code>{@html}</code> fails loudly and points at <code>g:unsafe-html</code>. URL-bearing attributes reject active-content schemes, protocol-relative URLs, and control characters; raw <code>on*</code> handlers, <code>srcdoc</code>, and literal <code>&lt;script&gt;</code> tags are rejected in <code>view {}</code>. See <code>docs/language/markup.md</code>.</td></tr><tr><td>PRD-019</td><td>Provide optional rate limiting for request-time handlers without making it core.</td><td>Medium</td><td>Implemented</td><td><code>FeatureRateLimit</code> and <code>addons/ratelimit</code> expose HTTP middleware, fixed-window decisions, an in-memory store, and a Redis-backed store adapter. Generated action, API, fragment, SSR, and split-backend proxy handlers expose <code>RegisterRateLimiter(*ratelimit.Limiter)</code> when the addon is enabled and call the registered limiter before guards and user logic. Docs include an in-memory registration example and a concrete go-redis adapter.</td></tr><tr><td>PRD-020</td><td>Allow generated apps and binaries to package selected configured modules.</td><td>High</td><td>Implemented</td><td><code>Build.Targets</code> statically declares module sets, output dirs, generated app dirs, and binaries. <code>gowdk build</code> runs all configured targets, <code>--target</code> selects named targets, and ad hoc repeated or comma-separated <code>--module</code> flags remain supported.</td></tr><tr><td>PRD-021</td><td>Provide a dependency-free fast local development loop.</td><td>High</td><td>Implemented</td><td><code>gowdk dev</code> polls discovered inputs without production dependencies, compares content hashes, caches watched input snapshots between ticks, rebuilds only on real input changes, incrementally renders page/component/layout affected SPA output when possible, falls back to full builds for config/CSS/source-set/app/binary/WASM changes, serves the generated output, live reloads browsers after successful rebuilds, keeps the last successful output after failed rebuilds, and can build/restart generated app targets. SPA/app generation skips identical file writes.</td></tr><tr><td>PRD-022</td><td>Allow generated app output to compile to a WASM deploy artifact.</td><td>Medium</td><td>Partial</td><td><code>gowdk build --wasm &lt;file&gt;</code> and <code>Build.Targets[].WASM</code> compile the generated app with <code>GOOS=js GOARCH=wasm</code>. CI verifies the emitted artifact is a real WASM module by checking the WebAssembly magic header. This remains separate from component-level browser island assets emitted for <code>wasm</code> components; host runtime/loader integration is deploy-platform owned.</td></tr><tr><td>PRD-023</td><td>Keep current documentation aligned with implemented CLI, config, compiler, language, routing, deployment, and examples.</td><td>High</td><td>Implemented</td><td><code>README.md</code>, <code>docs/getting-started.md</code>, <code>docs/cookbook/README.md</code>, reference docs, language docs, compiler docs, and <code>examples/README.md</code> describe current support, link to the right source of truth, and call out planned behavior.</td></tr><tr><td>PRD-024</td><td>Require project config before compiling or validating <code>.gwdk</code> code.</td><td>High</td><td>Implemented</td><td><code>check</code>, <code>audit</code>, <code>manifest</code>, <code>sitemap</code>, <code>routes</code>, <code>build</code>, and <code>dev</code> require <code>gowdk.config.go</code> in the current directory or an explicit <code>--config &lt;file&gt;</code>, even when explicit <code>.gwdk</code> file paths are provided.</td></tr><tr><td>PRD-025</td><td>Keep framework integrations optional and outside compiler/runtime core.</td><td>Medium</td><td>Implemented</td><td>Generated apps expose standard <code>net/http</code> handlers and framework-neutral code by default. Optional <code>runtime/adapters/chi</code>, <code>runtime/adapters/echo</code>, <code>runtime/adapters/gin</code>, and <code>runtime/adapters/fiber</code> nested modules wrap the same generated <code>http.Handler</code>; route-aware Chi/Echo/Gin mounting can consume generated OpenAPI metadata, and docs cover middleware overlap and Fiber adaptor caveats.</td></tr><tr><td>PRD-026</td><td>Provide declarative security posture and baseline audit gating.</td><td>High</td><td>Partial</td><td><code>internal/securitymanifest</code> projects validated IR into a route/endpoint/contract/frontend posture, <code>internal/auditspec</code> evaluates the built-in baseline plus declared <code>*.audit.gwdk</code> policies, <code>gowdk audit</code> reports human/JSON findings with registry-backed severities and exits non-zero on error findings, and <code>gowdk build</code> evaluates the same baseline before writing output. Production builds fail on error-severity findings unless <code>--allow-insecure</code> is set; non-production builds print a warning summary. The baseline covers action/command/state-changing API CSRF, guardless action/fragment/command/query endpoints, public-by-omission APIs, roleless contracts, bundle secret leaks, client-visible guardless routes, and raw-HTML sinks; policy rules can require headers. <code>gowdk audit --emit-tests</code> writes readable standalone <code>_test.go</code> posture tests, and <code>--run</code> builds a temporary generated app and executes its generated app audit test through <code>runtime/testkit</code>; broader auth/session ownership, role fixture injection, and deeper browser/data-flow analysis remain planned or app-owned.</td></tr><tr><td>PRD-027</td><td>Provide opt-in browser presentation-event fanout without adding WebSocket dependencies to the root module.</td><td>Medium</td><td>Implemented</td><td><code>FeatureRealtime</code> and <code>addons/realtime</code> provide config and <code>gowdk add realtime</code> wiring for presentation-event fanout. Dependency-free SSE fanout remains in the root module through <code>runtime/contracts/sse</code> and <code>realtime.NewSSE</code>; WebSocket fanout remains isolated in the nested <code>runtime/contracts/websocketfanout</code> module. Docs cover SSE versus WebSocket setup, deployment caveats, and the M14 boundary for live DOM reactivity.</td></tr><tr><td>PRD-028</td><td>Provide compiler-validated realtime UI subscription metadata.</td><td>Medium</td><td>Partial</td><td>ADR 0012 defines <code>g:subscribe</code> on query-owned elements. The compiler parses the directive, lowers it to <code>Program.RealtimeSubscriptions</code>, requires <code>realtime.Addon()</code>, validates referenced Go contracts as presentation events available to the web role, emits exact-span diagnostics, renders <code>data-gowdk-subscribe</code> and validated <code>data-gowdk-subscribe-type</code> markers, records build-report metadata, generated apps mount subscription-filtered SSE fanout at <code>/_gowdk/realtime/events</code> for bound subscriptions, generated stream handlers run inherited guards before opening SSE responses, the SSE adapter declares browser retry timing and drops events for full per-client buffers instead of blocking command execution, generated <code>gowdk.js</code> applies explicit <code>replaceHTML</code> realtime patches to subscribed query regions, and <code>examples/contracts</code> demonstrates the live flow. The compiler also scans explicit Go <code>RegisterInvalidation[event, query]</code> edges, lowers validated bound edges to <code>Program.QueryInvalidations</code>, rejects unknown queries/events or events no scanned command emits, records <code>query_invalidation</code> build-report events, prints <code>invalidates</code> graph edges, renders <code>data-gowdk-query-type</code> markers, emits generated <code>gowdk.query.invalidate</code> presentation events after command event dispatch, and refetches the current document to replace matching non-subscribed query regions. Custom retry/backoff/replay, active session-change stream revocation, richer patch shapes, fragment/API-specific query execution, and route-specific refresh endpoints remain planned hardening work.</td></tr><tr><td>PRD-029</td><td>Provide optional SEO build output for sitemap and robots files without making crawler policy core.</td><td>Medium</td><td>Partial</td><td><code>addons/seo</code> registers <code>FeatureSEO</code> and <code>gowdk.SEOProvider</code>; <code>gowdk build</code> emits <code>sitemap.xml</code> and <code>robots.txt</code> only when the addon supplies a valid <code>BaseURL</code>. The sitemap includes public static and <code>paths {}</code>-expanded SPA routes plus configured extra URLs, while request-time and guardless default-denied pages are excluded and listed in <code>gowdk-build-report.json</code>. JSON-LD and request-time sitemap serving remain planned/out of scope for this slice.</td></tr><tr><td>PRD-030</td><td>Provide dependency-free runtime trace primitives and opt-in generated app instrumentation.</td><td>Medium</td><td>Partial</td><td>ADR 0013 defines <code>runtime/trace</code> as the root-module observability core. It provides W3C-compatible trace/span IDs, <code>traceparent</code> propagation, context spans, GOWDK surface/lane/source metadata, attributes/events/status, always-on/off and ratio sampling, console/JSONL/ring/multi/exporter sinks, a bounded JSON/SSE collector, browser span ingest, and a self-contained local viewer. <code>addons/observability</code> gates debug-only generated route/guard/handler/SSR-load/browser/island tracing, <code>runtime/contracts</code> propagates trace context through events/jobs/workers/outbox records, and the nested <code>runtime/trace/otel</code> module provides optional OTLP HTTP export without root OpenTelemetry dependencies. Durable production storage, hosted analysis, and production sampling/access policy remain app-owned.</td></tr></tbody></table><h2 id="p0p1p2-decision-backlog">P0/P1/P2 Decision Backlog</h2><p>This backlog records product decisions without treating deferred work as -implemented.</p><table><thead><tr><th>Area</th><th>Requirement Direction</th><th>Status</th></tr></thead><tbody><tr><td>Markup language</td><td>Expand <code>view {}</code> only through GOWDK-owned AST nodes and directives; support bounded client-island await blocks and CSS-driven motion hooks while deferring async placeholder directives, DOM/document targets, and DOM actions until separate contracts exist.</td><td>Partial — the directive contract is closed: unknown <code>g:*</code> directives and deferred families (DOM/document/window targets, <code>g:await</code>/<code>g:async</code>, DOM actions) fail at parse time with family-specific guidance under <code>unsupported_markup_directive</code>/<code>unsupported_markup_syntax</code>; <code>{#await fetchJSON[T](urlExpr)}</code> is supported inside JS islands, <code>g:transition</code>/<code>g:animate</code> provide CSS class/state hooks for client <code>g:if</code> and keyed <code>g:for</code>, and raw HTML has its explicit contract via <code>g:unsafe-html={Expr}</code> (PRD-018).</td></tr><tr><td>Snippets and slots</td><td>Keep slots as the stable reusable markup primitive; defer first-class snippet/render values.</td><td>Partial — default, named, and scoped slots are implemented and documented as the reusable-markup contract; first-class snippet/render values remain deferred.</td></tr><tr><td>Component props</td><td>Keep imported Go structs as the primary typed prop path; inline scalar <code>string</code>/<code>int</code>/<code>float</code>/<code>bool</code> props, scalar defaults, same-named <code>{...props}</code> forwarding, <code>target:source</code> prop renaming, and component <code>g:bind:&lt;ExportedState&gt;</code> for exported child state are supported; recursive rendering and dynamic component selection remain explicit rejections.</td><td>Partial</td></tr><tr><td>Client reactivity</td><td>Keep bounded compiler-owned <code>client {}</code>; generated JS must not own routing, auth, business rules, database access, server validation, action behavior, global app state, or page loading policy.</td><td>Partial — component-local state, computed values, dependency ordering and cycle diagnostics, handlers, events, effects, lifecycle cleanup, refs, bindings, conditionals, lists, typed exports, and bounded async helpers are implemented; broader browser-owned app behavior remains out of scope.</td></tr><tr><td>Shared state</td><td>Keep stores page/island scoped until cross-package or app-global stores have explicit ownership, serialization, subscription, and teardown contracts.</td><td>Partial — page-scoped stores, explicit component <code>use</code>, optional local/session persistence, shape invalidation, and SPA-navigation hydration are implemented; app-global stores remain deferred.</td></tr><tr><td>Load/data lifecycle</td><td>Keep <code>build {}</code> build-time, <code>server {}</code> request-time, and actions/APIs/fragments as endpoint lanes; defer universal/browser-owned load policy.</td><td>Partial</td></tr><tr><td>Hybrid</td><td>Keep hybrid route metadata internal until the source contract is stable; defer streaming, data refresh, and non-HTTP revalidation.</td><td>Partial</td></tr><tr><td>Hooks</td><td>Compose app-wide hooks as <code>net/http</code> middleware plus explicit generated registration points and generated-binary lifecycle services; defer route rewriting and fetch interception.</td><td>Partial — generated embedded and backend-only apps expose <code>RegisterMiddleware(runtime/app.Middleware)</code> for ordered app-wide middleware, <code>gowdkapp.App()</code> for generated-binary startup, and <code>runtime/app.Service</code> lifecycle hooks for app-owned workers or extra servers. Route rewriting, response transformation, fetch/navigation interception, and protocol-specific built-ins such as MCP remain out of core.</td></tr><tr><td>Errors</td><td>Keep <code>error</code> for route-local SSR and action/API boundaries; define expected error types and layout boundaries later.</td><td>Partial</td></tr><tr><td>Dev server</td><td>Keep dependency-free live reload as baseline; add browser error overlay before component-aware HMR.</td><td>Partial — <code>gowdk dev</code> polls without production dependencies, skips no-op rebuilds, supports incremental SPA rebuilds, runs generated app targets, prints stable change/rebuild/runtime-proxy log lines, shows browser overlays for SPA/static serving, generated-app rebuild failures, and generic generated-app runtime 5xx failures through a dev-only proxy bridge, and hot-swaps changed JS island component roots when the dependency graph maps the change to the current page. Page/layout/source-set/runtime changes, unmatched component roots, WASM islands, and broader state-preserving HMR fall back to full reload or remain deferred to <a href="https://github.com/cssbruno/GoWDK/issues/424">#424</a>.</td></tr><tr><td>Playground</td><td>Own playground onboarding in website/docs first with local preview commands and static examples; keep hosted code execution optional, sandboxed, and exportable as a normal GOWDK app.</td><td>Partial — <a href="/docs/product/playground/">playground.md</a> defines the onboarding path, sandbox rules, export contract, and non-goals. <code>gowdk playground policy/export/run</code> implements local policy inspection, normal source archive export, and an opt-in staged build bridge for future hosted runners; production hosted execution remains app-owned infrastructure.</td></tr><tr><td>Routing</td><td>Add rest params and trailing-slash policy first while keeping explicit route declarations; defer optional params, route groups, and same-path page/API negotiation.</td><td>Partial — rest params <code>{name...}</code> are supported as the final segment of SSR page routes (string-only, one or more segments joined with <code>/</code>) with duplicate/ambiguity validation, and the trailing-slash policy is explicit (canonical declarations; GET/HEAD trailing-slash requests 308-redirect to the canonical path). Optional params, route groups, and same-path negotiation remain deferred with explicit diagnostics; see <code>docs/reference/routing.md</code>.</td></tr><tr><td>Typed generated APIs</td><td>Generate typed route-param accessors first; defer typed load/action data accessors until result contracts are stable.</td><td>Partial — generated SSR and fragment request-time handlers attach raw route params through <code>app.Params(ctx)</code> and decoded typed params through <code>app.TypedParams(ctx)</code>; per-route param structs and typed load/action result accessors remain planned.</td></tr><tr><td>Inline Go authoring</td><td>Allow optional Go code blocks inside <code>.gwdk</code> only when they extract to normal importable, formatted, testable package Go. Separate <code>.go</code> files remain supported and generated adapters remain glue. Saved default <code>go {}</code> blocks are type-checked with sibling Go files during validation, default <code>go {}</code> blocks can provide build-time functions for <code>build { =&gt; LocalFunc() }</code> with optional <code>gowdk.BuildParams</code> route params and same-page action/API/fragment handlers, page-level <code>go client {}</code> blocks can opt into client-side Go by exporting <code>GOWDKMount&lt;PageID&gt;</code> for generated WASM page mounts, generated app source materializes default <code>go {}</code> and <code>go server {}</code> blocks under <code>gowdk_go/</code>, <code>go server {}</code> can provide generated SSR load handlers, and configured addons implementing <code>gowdk.GoBlockConsumer</code> can validate <code>go addon.&lt;name&gt; {}</code> blocks and emit generated app Go files through both literal and executable config loading. Source-adjacent extraction remains planned.</td><td>Partial</td></tr><tr><td>Forms</td><td>Keep progressive-enhancement-first form behavior; full POST and enhanced POST share action result semantics; domain validation stays in user Go.</td><td>Partial</td></tr><tr><td>APIs</td><td>Broaden APIs through public request/response helpers and typed body/query helpers, not framework-specific adapters.</td><td>Partial — <code>addons/api</code> provides strict JSON body decoding, typed query helpers, and JSON/error/no-content response helpers for current <code>func(context.Context, *http.Request) (response.Response, error)</code> handlers. Generated typed handler signatures, per-route result contracts, CORS policy, and richer examples remain planned.</td></tr><tr><td>Contract runtime</td><td>Add typed Go queries, commands, backend-owned domain/integration events, presentation events, and jobs after endpoint/adapter IR is stable. Frontend UI events trigger commands or queries, commands have one owner, domain events are emitted after backend state changes succeed, local in-process dispatch is default, and broker/outbox/worker roles are optional. Runtime registry, role filtering, event capture/replay, outbox/broker/fanout/EventSource/seen-store interfaces, worker ack/nack/backoff, file/in-memory/Redis/NATS adapters, SSE/WebSocket fanout, generated command event sinks, generated registries, generated worker replay helpers, Go AST scanning, <code>go/types</code> diagnostics, duplicate-owner and emitted-event diagnostics, contract/list/graph/trace CLI, <code>g:command</code>/<code>g:query</code> metadata, query-bounded <code>g:subscribe</code>, explicit <code>RegisterInvalidation[event, query]</code> metadata, import-path-aware reference/subscription/invalidation linking, <code>g:event</code> rejection, IR binding status, app adapter IR, generated web command/query adapters, page-route query JSON negotiation, stable JSON success/error response shape, formatted generated adapter source, page-guard propagation, rate-limit/guard/CSRF ordering, report metadata, enforced scan diagnostics, generated subscription-filtered guarded SSE fanout, generated client <code>replaceHTML</code> patches, generated <code>gowdk.query.invalidate</code> events, and current-document refresh for matching non-subscribed invalidated query regions are implemented. Separate worker/cron binary generators, fragment/API-specific query execution, remaining exact diagnostic spans, richer realtime patch shapes, durable retry operations, and editor-first visualizations remain planned outside the milestone-14 runtime contract.</td><td>Implemented</td></tr><tr><td>Observability</td><td>Keep root tracing dependency-free while making generated instrumentation opt-in and debug-gated.</td><td>Partial — <code>runtime/trace</code> provides W3C-compatible IDs, <code>traceparent</code> propagation, context spans, GOWDK surface/lane/source metadata, span attributes/events/status, always-on/off and ratio sampling, console/JSONL/ring/multi/exporter sinks, OTLP-shaped snapshots, bounded JSON/SSE local collection, browser ingest, and a self-contained viewer. <code>addons/observability</code> enables debug-only generated backend, SSR/load, frontend, and island tracing; contracts/outbox records carry optional trace context; <code>runtime/trace/otel</code> isolates OTLP HTTP export in a nested module. Durable storage, hosted analysis, and production sampling/access policy remain app-owned.</td></tr><tr><td>Cache</td><td>Keep <code>cache</code> and <code>revalidate</code> as HTTP cache policy; keep action-driven data refresh explicit through redirects, fragments, JSON, or reload responses.</td><td>Partial — route reports include route/endpoint cache metadata, build reports summarize generated cache policies, generated binaries apply immutable asset cache, SPA <code>no-cache</code>, request-time <code>no-store</code>, and page <code>cache</code>/<code>revalidate</code> for successful SPA/SSR HTML.</td></tr><tr><td>Guards</td><td>Extend guards with safe local redirects and response helpers before richer request-local state.</td><td>Partial — guards keep the <code>func(runtime/guard.Context) error</code> signature. Ordinary errors fail closed with 403, while <code>runtime/guard.RedirectTo</code>, <code>runtime/guard.Redirect</code>, and <code>runtime/guard.Respond</code> intentionally write no-store redirects or custom responses. Richer request-local state is still deferred.</td></tr><tr><td>Component CSS</td><td>Make component CSS explicit, compiler-scoped, and documented; Tailwind and processors remain optional.</td><td>Partial</td></tr><tr><td>Accessibility</td><td>Add accessibility diagnostics as compiler warnings with stable codes and spans.</td><td>Partial — <code>missing_img_alt</code>, <code>missing_form_label</code>, <code>empty_link_text</code>, <code>missing_button_type</code>, and <code>heading_order_skip</code> warn on literal view markup in pages, components, and layouts. Broader ARIA and full WCAG rule coverage remain outside the current compiler slice.</td></tr><tr><td>Diagnostics and LSP</td><td>Expand diagnostic catalogue before broad parser recovery; prioritize hover, semantic tokens, go-to-definition, and route/type navigation.</td><td>Partial — the diagnostic registry, <code>gowdk explain</code>, JSON check output, safe fix metadata, exact ranges for high-value parser/IR-backed diagnostics, LSP diagnostics/formatting/completions/hover/definitions/references/code actions/semantic tokens, dirty-buffer <code>g:command</code>/<code>g:query</code> binding diagnostics, CLI route/sitemap/inspect reports, and <a href="/docs/product/diagnostics-and-navigation/">diagnostics/navigation contract</a> exist; parser recovery, remaining aggregate/addon exact-span gaps, direct markup-family emitted codes, and workspace route/type navigation remain planned.</td></tr><tr><td>Testing and scaffolding</td><td>Add optional Go handler tests, generated app smoke tests, template/addon selection, and editable generated examples.</td><td>Partial — <code>gowdk init --tests</code> writes an optional build smoke test, <code>runtime/testkit</code> provides HTTP scenario helpers for generated-handler tests plus in-memory contract registry/event assertions, <code>examples/contracts/patients/contracts_test.go</code> demonstrates command event capture, <code>gowdk audit --run</code> builds a temporary generated app and runs generated runtime audit tests, and explicit repository scripts cover parser fuzz smoke, generated-app integration, and generated-output/report determinism. Broader IR-generated endpoint test files and browser/E2E scaffolds remain planned.</td></tr><tr><td>Deployment and operations</td><td>Prefer docs and optional generators for static hosts, Docker, systemd, reverse proxies, CDN policy, health checks, metrics, logging, binary deploy, rollback, and CSRF secret rotation.</td><td>Partial — <a href="/docs/reference/deployment/">deployment.md</a> documents static output, one-binary, generated Docker contexts, split frontend/backend, backend-only, Docker, systemd, reverse proxy, CDN/cache, health, metrics, logging, readiness, graceful shutdown, artifact layout, rollback, CSRF secret rotation, backup ownership, and incident boundaries. <code>gowdk build --docker</code> emits a minimal non-root Dockerfile and <code>.dockerignore</code> beside a compiled one-binary artifact. <code>gowdk build --deploy-recipe</code> and <code>Build.Targets[].DeployRecipes</code> emit optional static-host, systemd, Caddy, Nginx, and split frontend/backend starting points without owning secrets, domains, TLS, CDN policy, storage, backups, incident response, or rollout logic.</td></tr><tr><td>Full-page hydration</td><td>Keep full-page hydration out of the repository core; use static pages, progressive enhancement, server fragments, and explicit islands.</td><td>Intentionally out of scope</td></tr><tr><td>Island ergonomics</td><td>Improve compiler-owned island syntax, lifecycle cleanup, focus helpers, local batching, and diagnostics without exposing arbitrary JavaScript as the app contract.</td><td>Partial — generated JS islands support idempotent mount/remount, cleanup, lifecycle/effect blocks, bounded refs such as focus/blur/scroll, local batching, and diagnostics; broader HMR-style ergonomics remain deferred.</td></tr><tr><td>Client builtins</td><td>Add deterministic formatting, collection, async-safe UI, focus, and selection helpers only with generated-output tests.</td><td>Partial — scalar expression helpers, list mutation built-ins, <code>fetchJSON</code>, and safe DOM ref methods are implemented in the bounded client language; broader formatting, selection, and date/time helpers remain deferred.</td></tr><tr><td>WASM islands</td><td>Keep browser-side Go explicit and separate from backend handlers; improve ABI docs, validation, and examples.</td><td>Partial — component-level WASM islands have a versioned <code>gowdk-wasm-island-v1</code> ABI, required export and signature validation, browser-unsafe import diagnostics, loader/browser tests for mount/event/patch/emit/destroy/store participation, <code>wasm_exec.js</code> size/version reporting, <code>runtime/wasm</code> payload/result helpers, and a runnable component WASM ABI example under <code>examples/components/wasm/</code>; richer user-code runtime validation remains deferred.</td></tr><tr><td>PWA/offline</td><td>Keep service workers and PWA behavior optional and documentation-first; no hidden offline/cache defaults.</td><td>Documented — GOWDK emits no service worker, manifest, offline shell, or install prompt by default. <code>docs/reference/pwa-offline.md</code> documents user-owned registration, deploy-owned static files, conservative cache rules, and the current lack of root-scope service-worker embedding for one-binary deploys.</td></tr><tr><td>Images</td><td>Document image optimization patterns first; optional integrations may emit assets or metadata without turning core into an image pipeline.</td><td>Documented — <code>docs/reference/images.md</code> covers pre-build/CDN optimization, responsive literal markup, <code>missing_img_alt</code>, social images, component asset packaging, and the current non-goal of automatic variant generation or URL rewriting.</td></tr><tr><td>Addon discovery</td><td>Start with repository/website docs or registry metadata; add CLI discovery only after addon versioning, trust, and compatibility rules exist.</td><td>Partial — the <a href="/docs/reference/addons/#discovery-policy">addon discovery policy</a> limits default <code>gowdk add --list</code> to addable built-ins, keeps external addons explicit through Go imports, and defines checked-in registry metadata for kind, lifecycle, compatibility, ownership, trust, public interfaces, process/network behavior, external tools, and security notes. <code>gowdk add --list --registry</code> and <code>--json</code> expose the local registry for docs/website rendering without installing or executing addon code. Remote registry sync and automatic compatibility enforcement remain planned hardening work.</td></tr><tr><td>Performance profiling</td><td>Document measurement for build time, output size, generated JS size, SSR/action latency, binary size, and cache behavior before adding automation.</td><td>Partial</td></tr><tr><td>Migration guides</td><td>Core docs avoid migration-guide positioning during 0.x hardening. Native GOWDK concepts, examples, and diagnostics come first.</td><td>Intentionally out of scope</td></tr></tbody></table><h2 id="non-functional-requirements">Non-Functional Requirements</h2><ul><li>Performance: SPA pages should be generated at build time and served directly from disk or embedded assets.</li><li>Reliability: compiler diagnostics must fail fast for invalid render modes, SSR used without the feature enabled, and dynamic SPA routes without paths.</li><li>Security: state-changing generated endpoints need CSRF, typed input decoding, validation, and safe redirects before production use; audit posture reports must not be served as public build output.</li><li>Privacy: generated logs and diagnostics must not expose secrets or sensitive form data.</li><li>Packaging: generated binaries and WASM artifacts must embed only the selected module output for that build.</li><li>Developer loop: failed rebuilds must not stop the last successful served output, no-op generated writes should not retrigger dev loops, and page-local build-output edits should not force full output rendering.</li><li>Accessibility: generated components should preserve semantic HTML and support focus restoration for partial updates.</li><li>Localization: route and content generation should not assume one locale.</li><li>Supportability: manifest output should include route, render mode, layouts, paths presence, and guards for debugging.</li><li>Project shape: project-level compiler commands must fail fast when no config file is loaded.</li></ul><h2 id="out-of-scope">Out Of Scope</h2><ul><li>Full SPA runtime as the default experience.</li><li>Mandatory full-page SSR.</li><li>User-written JavaScript for normal forms, actions, and partial update flows.</li><li>WASM islands as the default component runtime.</li></ul><h2 id="open-questions">Open Questions</h2><ul><li>Which remaining diagnostics, reports, and LSP metadata need exact source spans -first?</li><li>Should hybrid pages get additional cache policy syntax beyond page-level -<code>cache</code> and <code>revalidate</code>?</li><li>Should processor-emitted CSS become selectable named <code>css</code> inputs through a -future page-aware processor contract?</li><li>Should build targets eventually support per-target addon and render-mode -overrides?</li><li>What generated adapter shape should execute <code>g:command</code> and <code>g:query</code> -contracts without replacing existing endpoint declarations prematurely?</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/roadmap/index.html b/docs-site/dist/site/docs/product/roadmap/index.html deleted file mode 100644 index 1434c786..00000000 --- a/docs-site/dist/site/docs/product/roadmap/index.html +++ /dev/null @@ -1,130 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Product Roadmap - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Product Roadmap - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Product Roadmap - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Product Roadmap</h1></header><article class="prose"><h2 id="product-shape">Product Shape</h2><p>GOWDK is a Go-first full web app platform built from two coordinated parts:</p><pre><code class="language-text">GOWDK Compiler -component/page compiler - + -GOWDK Runtime -app/runtime layer - = -Go-first full web app -</code></pre><p>GOWDK Compiler is the <code>.gwdk</code> language and component/page compiler. It turns -package-peer <code>.gwdk</code> files and normal Go packages into page output, CSS, client -assets, manifests, endpoint metadata, generated adapter Go, and deployable -artifacts. GOWDK Runtime is the app/runtime layer that serves those artifacts and -runs request-time behavior.</p><p>The public naming rule is deliberately narrow:</p><ul><li><code>GOWDK</code> means the product and repository wordmark.</li><li><code>GOWDK Compiler</code> means compiler/language layer.</li><li><code>GOWDK Runtime</code> means app/runtime layer.</li><li><code>gowdk</code> means CLI, Go package/module spelling, and generated file prefixes.</li><li><code>addon</code> means optional feature-registration or integration package inside -the compiler/runtime ecosystem, not a separate product.</li><li>Never write <code>GOWDK Kit</code>; it is the redundant &#34;kit kit&#34; form because the <code>K</code> -in <code>GOWDK</code> already carries that meaning.</li><li>Avoid bare <code>core</code>; use <code>compiler core</code>, <code>runtime core</code>, or <code>repository core</code>.</li></ul><p>GOWDK has three execution lanes:</p><ul><li>Build-time page lane: full pages default to static SPA/prerender output.</li><li>Backend endpoint lane: actions, APIs, and fragments run at request time -without making the page itself request-rendered.</li><li>Request-time page lane: pages with <code>server {}</code> or <code>go server {}</code> are compiled into -generated SSR handlers and run through GOWDK Runtime. This lane is integrated -into the codebase; it is not a separate product layer. It is selected per -page and currently enabled through the SSR feature gate in config or <code>--ssr</code>.</li></ul><h2 id="ownership-boundaries">Ownership Boundaries</h2><p>Application Go code owns behavior: handlers, validation, auth, storage, typed -inputs, service calls, and business rules stay in Go. Separate <code>.go</code> files are -the default path today; optional inline Go authoring in <code>.gwdk</code> is planned only -when extracted code remains normal importable, testable package Go.</p><p><code>.gwdk</code> files own web declarations: package, page identity, route, layouts, -component usage, build-time data, request-time data, dynamic paths, endpoint -declarations, stores, client blocks, and view markup.</p><p>GOWDK Compiler owns parsing, formatting, diagnostics, manifests, route -metadata, endpoint metadata, component/page compilation, CSS and asset planning, -build reports, and generated adapter source.</p><p>The generated adapter owns glue: request decoding, route and endpoint dispatch, -calling exported Go handlers, writing <code>runtime/response.Response</code>, and returning -clear <code>501</code> responses for missing or unsupported bindings where that mode is -allowed.</p><p>GOWDK Runtime owns <code>http.Handler</code> serving, embedded assets, backend -routing, request context helpers, form decoding primitives, response envelopes, -CSRF, partial fragments, SSR contracts, and one-binary or split-binary wiring.</p><p>Addons are package-level extension points around those layers. They can enable -or extend compiler behavior or runtime behavior, but they must not become a -third app framework model with different ownership rules.</p><p>Generated JavaScript may enhance navigation, forms, fragments, and local -component state, but it must not become the source of truth for routes, auth, -business rules, trusted validation, server state, or cache policy.</p><h2 id="product-rules">Product Rules</h2><p>These are the durable rules. Changing them should require an ADR.</p><ol><li>Routes are declared inside <code>.gwdk</code> files; folder placement is not route truth.</li><li><code>.gwdk</code> files are peers of Go files and declare <code>package &lt;name&gt;</code>.</li><li>Full pages default to build-time SPA output.</li><li>Dynamic SPA routes require <code>paths {}</code> unless the page uses request-time -rendering.</li><li><code>build {}</code> is build-time page data.</li><li><code>server {}</code> is request-time page data and requires the SSR addon.</li><li><code>act</code> and <code>api</code> declarations name exact exported Go symbols.</li><li>Actions and APIs are endpoint metadata, not page route kinds.</li><li>User behavior stays in Go code. Inline Go authoring is optional and must -extract to normal package Go.</li><li>Generated Go is adapter glue, not generated application logic.</li><li>Actions, APIs, and fragments can work without full-page request rendering.</li><li>SSR is an integrated non-default request-time page-rendering lane.</li><li>One-binary deploy must work with and without request-time page rendering.</li><li>Core stays <code>net/http</code> compatible; Chi, Gin, Echo, Fiber, and similar frameworks -are optional adapters, not core dependencies.</li><li>CSS and styling tooling are addon-driven; Tailwind is optional.</li><li>Normal app flows should not require user-written JavaScript.</li></ol><h2 id="current-baseline">Current Baseline</h2><p><code>docs/product/requirements.md</code> records product status and broader product -decisions. Status terms must match <code>docs/product/requirements.md</code>: implemented, -partial, experimental, planned, and intentionally out of scope. At a high -level, the current baseline already includes:</p><ul><li>project config loading, source discovery, build targets, module selection, -manifests, route validation, sitemap output, formatting, diagnostics, a -shared tokenizer with parser recovery across declaration boundaries, CLI -route/endpoint/inspect reports, and LSP support;</li><li>package-first <code>.gwdk</code> files, package mismatch diagnostics, package source -spans, package-scoped <code>use alias &#34;package&#34;</code> component imports, exact -<code>act Name POST &#34;/path&#34;</code> and <code>api Name METHOD &#34;/path&#34;</code> declarations, optional -<code>//gowdk:act</code> and <code>//gowdk:api</code> Go endpoint comments, and migration -diagnostics for old action/API block syntax;</li><li>build-time SPA output for simple pages, dynamic <code>paths {}</code> subsets, literal, -imported, same-package, and default <code>go {}</code> build data subsets, layouts, components, CSS -assets, route manifests, asset manifests, build reports, generated app -output, non-served security posture reports, embedded assets, local binaries, -generated Docker contexts for one-binary deploys, optional deployment recipe -files, WASM deploy artifacts, optional sitemap/robots output, optional -production generated-asset obfuscation, and a polling dev server with live -reload;</li><li>component discovery, imported props/state contracts, slots, generated -JavaScript islands, component-level WASM island assets, and a first-slice client -language for local component behavior;</li><li>same-package Go handler binding through <code>go/packages</code> and <code>go/types</code>, exact -exported handler matching, typed action input decoding, -generated <code>501</code> responses for missing or unsupported bindings, deterministic -import aliases, and formatted generated app source;</li><li>shared backend routing primitives in <code>runtime/app</code>, runtime action/API -adapter helpers, generated app <code>App()</code> startup, lifecycle service -supervision, one generated backend hook, request body limits, and no-store -defaults for request-time responses;</li><li>typed backend adapter IR driving generated action/API/fragment/contract route -registrations, backend imports, split frontend proxy route matching, -backend-only route presence, guard/rate-limit/CSRF endpoint checks, and -generated <code>501</code> fallback metadata;</li><li>first-slice action/API execution, partial fragment responses, dynamic -standalone fragment routes, and concrete or dynamic request-time SSR pages -with declared <code>server {}</code> fields through buildgen, appgen, <code>runtime/app</code>, and -<code>runtime/route</code>.</li><li>compiler-validated query-bounded <code>g:subscribe</code> metadata for presentation -events and explicit <code>RegisterInvalidation[event, query]</code> metadata for -domain-event query refresh, including IR records, build-report events, exact -event/query-type HTML markers, generated client <code>replaceHTML</code> patches, -current-document refresh for non-subscribed invalidated query regions, and -missing/invalid/non-web-role diagnostics.</li><li><code>gowdk audit</code> posture and policy evaluation for routes, backend endpoints, -command/query contract web endpoints, and frontend audit surfaces, with -declared <code>*.audit.gwdk</code> policies, generated runtime audit tests, -registry-backed findings, and CI-friendly JSON output.</li><li>dependency-free <code>runtime/trace</code> primitives for W3C trace IDs, -<code>traceparent</code> propagation, context spans, sinks, sampling, local JSON/SSE -trace collection, browser span ingest, a self-contained viewer, debug-gated -generated app instrumentation through <code>addons/observability</code>, contract/event -propagation, and nested-module OTLP export.</li></ul><p>Do not roadmap those completed slices as future work. Future work should -stabilize their contracts, remove generation debt, and fill the missing -production pieces below.</p><p><code>docs/product/requirements.md</code> records product decisions for comparison-driven -gaps. Treat those decisions as constraints on roadmap execution: planned work -may implement the GOWDK-native contract, defer it with clear docs or -diagnostics, or keep it intentionally out of scope. Do not turn deferred -comparison features into implicit commitments.</p><h2 id="roadmap">Roadmap</h2><p>This order follows dependencies. Some later areas already have first-slice code, -but they are not product-stable until the earlier metadata and adapter contracts -are stable.</p><table><thead><tr><th>Step</th><th>Theme</th><th>Definition of Done</th></tr></thead><tbody><tr><td>1</td><td>GOWDK AST and analyzer</td><td>The compiler has explicit AST nodes for package declarations, metadata declarations, routes, imports, stores, blocks, component contracts, client blocks, and source spans. A real analyzer lowers that AST into normalized package, route, endpoint, component, type, asset, and generated-output metadata.</td></tr><tr><td>2</td><td>Stable internal IR</td><td>Templates, client behavior, routes, assets, CSS, endpoints, SSR pages, and generated output are represented by typed compiler IR instead of ad hoc parser/buildgen/appgen structs leaking across phases.</td></tr><tr><td>3</td><td>Source import semantics</td><td>Cross-package component calls have explicit page/component-scoped <code>use</code> semantics. Layouts, stores, and assets have explicit <code>use</code> semantics or are rejected with clear diagnostics. Qualified layout references are either implemented or intentionally deferred with documented diagnostics.</td></tr><tr><td>4</td><td>Build-time data and diagnostics</td><td>Build data moves beyond the first literal/imported subset. Imported and same-package build functions can use the supported <code>T</code>, <code>(T, error)</code>, and <code>gowdk.BuildParams</code>-aware shapes, while broader arbitrary build-time statements remain deferred. Parser, route, view, component, client, package, and build errors have useful spans and suggestions.</td></tr><tr><td>5</td><td>Unified endpoint metadata</td><td>Actions and APIs normalize into one framework-neutral endpoint model containing source, kind, package path, package name, symbol, method, path, signature kind, input type, source span, and binding status. Route metadata remains limited to static, SPA, SSR, and hybrid page routes.</td></tr><tr><td>6</td><td>Endpoint discovery policy</td><td>Optional Go endpoint comments such as <code>//gowdk:act POST /login</code> and <code>//gowdk:api GET /api/session</code> can feed the same endpoint model. The compiler never auto-discovers endpoints by function name and never scans Chi/Gin/Echo/Fiber route registration as a source of truth. Conflicts are hard diagnostics.</td></tr><tr><td>7</td><td>Binding severity policy</td><td>Missing or unsupported handlers can remain non-fatal in dev/migration mode, but strict production builds fail unless an explicit stub flag allows <code>501</code> output. Feature packages are documented as not importing generated app output.</td></tr><tr><td>8</td><td>Generated adapter IR</td><td>Implemented. Backend adapter generation is driven by typed IR for imports, endpoint registrations, request decoding, handler calls, response writing, and <code>501</code> fallbacks. One-binary, split frontend proxy, and backend-only app generation consume the same backend metadata.</td></tr><tr><td>9</td><td>Go AST generation cleanup</td><td>API handlers, backend route registration, app shells, embed wiring, split app code, and remaining generated Go move to <code>go/ast</code>/<code>go/printer</code> plus <code>go/format</code>. Hardcoded line writing and source snippets are banned except for documented temporary exceptions.</td></tr><tr><td>10</td><td>Secure actions and forms</td><td>Generated action adapters wire CSRF token generation and validation, define token exposure, invalid-CSRF status/body shape, submit-button intent handling, validation fragment patterns, and production-safe action/API docs.</td></tr><tr><td>11</td><td>Guards and runtime context</td><td>Generated guards work for SSR, actions, and APIs. The request context helper contract is documented around <code>context.Context</code>, <code>app.Request(ctx)</code>, <code>app.Params(ctx)</code>, <code>app.CSRF(ctx)</code>, and <code>app.Session(ctx)</code>, or the project deliberately switches to an explicit app context.</td></tr><tr><td>12</td><td>Request-time page rendering</td><td>Generated SSR handlers execute <code>server {}</code>, enforce guards, decode typed route params, expose route-level metadata, support redirects and error pages, and run full request-time user logic through the integrated request-time page lane.</td></tr><tr><td>13</td><td>Errors, cache, and hybrid</td><td>SSR/action/API error boundaries are defined. Static files, SPA routes, backend endpoints, partial responses, SSR routes, and hybrid pages get cache and revalidation policy. Hybrid pages use the explicit request-time lane while streaming, data refresh, and non-HTTP revalidation remain separate planned capabilities.</td></tr><tr><td>14</td><td>Contract-driven runtime</td><td>Implemented. Queries, commands, domain events, integration events, presentation events, and jobs are typed Go contracts. Frontend UI events trigger commands or queries. Commands have one owner. Domain and integration events are backend-owned facts emitted after backend success. Presentation events notify realtime UI through explicit, query-bounded subscription metadata, generated subscription-filtered SSE fanout, and generated bounded client patches. Domain events can explicitly invalidate bound queries through <code>RegisterInvalidation[event, query]</code>, generated <code>gowdk.query.invalidate</code> events, and generated current-document refresh for matching non-subscribed query regions. Local in-process dispatch is default, optional worker/cron roles can run the same registrations through runtime and generated helper APIs, worker replay supports ack/nack, seen-store deduplication, and explicit backoff hooks, and CLI tooling can list, trace, or graph contracts including <code>invalidates</code> edges.</td></tr><tr><td>15</td><td>Static-first SPA navigation</td><td>SPA routes remain real URLs that work on direct open and refresh. Generated JS may intercept internal links, fetch built page shells or fragments, swap page regions, preserve scroll/focus, prefetch static route assets, and show loading/error UI, but it must not own routing, auth, business rules, validation, backend behavior, global app state, loading policy, or cache policy.</td></tr><tr><td>16</td><td>Components and client language</td><td>Components gain real <code>g:if</code> mount/unmount, keyed <code>g:for</code>, CSS-driven <code>g:transition</code>/<code>g:animate</code> hooks, richer expression props, child-to-parent events, bindable state, typed exports, named/scoped slots, scoped CSS/assets, a documented component contract, a proper reactive dependency graph, predictable batching, and cycle diagnostics.</td></tr><tr><td>17</td><td>Islands and WASM</td><td>Generated JavaScript islands stay compiler-owned local UI behavior. Component-level WASM islands get a production ABI, browser-side Go logic contracts, and entrypoint/export validation. Deploy-target WASM artifacts remain separate from browser island WASM.</td></tr><tr><td>18</td><td>CSS, assets, and packaging</td><td>External addon loading is hardened, richer page-aware CSS processor contracts are stable, and Tailwind/CSS deployment docs stay explicit that external tooling is user-installed. Implemented CSS asset hashing, component CSS scope/hash metadata, component non-CSS asset emission, and binary cache policy remain stable. Module selection remains artifact packaging, not runtime module orchestration.</td></tr><tr><td>19</td><td>Framework adapters</td><td>GOWDK Runtime remains <code>net/http</code> first. Optional Chi, Echo, Gin, and Fiber adapters wrap the same generated <code>http.Handler</code>; Chi/Echo/Gin can mount routes from generated OpenAPI metadata, and generated code stays framework-neutral by default.</td></tr><tr><td>20</td><td>Dev and tooling</td><td><code>gowdk dev</code> can run generated app/runtime flows for backend routes and SSR, skip unchanged rebuilds, cache watched input state, show SPA/static and generated-app rebuild failures with diagnostic codes, source ranges, last-good build time, and changed files, show generic generated-app runtime 5xx failures without request details through the dev-only proxy bridge, and hot-swap changed JS island component roots when the current page has matching island boundaries. Generated app runtime mode now uses the proxy for browser overlay delivery and live reload after generated-app restarts. State-preserving/broader component HMR, richer LSP completions, and editor navigation remain tracked in <a href="https://github.com/cssbruno/GoWDK/issues/424">#424</a>.</td></tr><tr><td>21</td><td>Observability</td><td>Partial. Generated apps can opt into GOWDK trace spans across route, guard, handler, SSR, action, API, fragment, contract, job, island, nav, and user lanes while keeping the root runtime dependency-free. <code>runtime/trace</code>, <code>addons/observability</code>, a local viewer, contract/event propagation, browser propagation, WASM island bridge reuse, and nested-module OTLP HTTP export are implemented. Durable trace storage, hosted analysis, and production sampling/access policy remain app-owned hardening work.</td></tr><tr><td>22</td><td>Documentation sync</td><td>README, requirements, architecture, deployment, roadmap, and examples stay synchronized with implemented behavior and commands.</td></tr></tbody></table><h2 id="candidate-release-order">Candidate Release Order</h2><p>The exact version numbers can change, but the release order should not skip the -contract work that later features depend on. -<code>docs/engineering/release-plan.md</code> tracks the open-ended 0.x hardening backlog -without making any minor version a production-readiness target.</p><h3 id="compiler-contract-release">Compiler Contract Release</h3><ul><li>GOWDK AST and analyzer.</li><li>Stable internal IR.</li><li>Explicit source import semantics.</li><li>Better spans and diagnostics.</li><li>Broader build-time data contract.</li><li>P0/P1 language decisions from <code>docs/product/requirements.md</code> remain enforced: -no arbitrary JavaScript, no external template semantics, and no generated JS -ownership of trusted app behavior.</li></ul><h3 id="endpoint-and-adapter-release">Endpoint And Adapter Release</h3><ul><li>Unified endpoint metadata.</li><li>Endpoint discovery policy.</li><li>Binding severity policy.</li><li>Generated adapter IR.</li><li>Remaining generated Go emitted through AST/printer/format.</li></ul><h3 id="secure-backend-release">Secure Backend Release</h3><ul><li>CSRF-wired generated action adapters.</li><li>Form token exposure and invalid-token response policy.</li><li>Submit intent handling.</li><li>Structured validation and fragment response patterns.</li><li>Production-safe action/API docs.</li></ul><h3 id="request-time-page-release">Request-Time Page Release</h3><ul><li>Typed route params.</li><li>Route-level metadata.</li><li>Custom SSR/action/API error-boundary syntax and examples.</li><li>Cache/no-store policy for request-time page rendering.</li></ul><h3 id="spa-and-hybrid-release">SPA And Hybrid Release</h3><ul><li>Static-first SPA navigation enhancements.</li><li>Progressive form enhancement.</li><li>Bare hybrid pages as generated request-time routes.</li><li>Revalidation syntax and hybrid cache enforcement.</li></ul><h3 id="contract-runtime-release">Contract Runtime Release</h3><ul><li>Typed query, command, event, and job registry.</li><li>Command owner and event subscriber validation.</li><li>Domain events are backend-owned facts emitted after state changes succeed.</li><li>Presentation events can notify realtime UI without becoming trusted input.</li><li>Local in-process dispatch as the default.</li><li>Optional web, worker, cron, API, and admin runtime roles.</li><li>CLI contract listing, trace, and graph output.</li><li>No backend bus messages for low-level UI events.</li></ul><h3 id="component-and-island-release">Component And Island Release</h3><ul><li>Richer component contract.</li><li>Proper client reactivity.</li><li>Slots, component CSS/assets, and typed exports.</li><li>Production WASM island ABI.</li><li>Bounded <code>client {}</code> remains the reactivity model unless a later ADR replaces -it with an equally Go-owned contract.</li><li>Full-page hydration remains out of the repository core; browser behavior should stay static -output, progressive enhancement, server fragments, and explicit islands.</li></ul><h3 id="platform-tooling-release">Platform Tooling Release</h3><ul><li>Full CSS processor addon loading.</li><li>Generated app dev loop.</li><li>Stronger editor tooling.</li><li>Production operations docs must cover secrets, CSRF rotation, reverse -proxies, cache/CDN policy, health checks, metrics, logging, binary deploy, -generated Docker contexts, opt-in deployment recipe starters, richer platform -manifests, and rollback before any production-ready claim.</li><li>P2 ecosystem polish is owned by optional docs, examples, website pages, or -CLI generators: playground onboarding/export, addon discovery, performance -profiling, migration guides, image guidance, SEO metadata beyond -sitemap/robots, and PWA/offline guidance must not add mandatory npm, -framework, hosted execution, or platform dependencies to the repository core.</li></ul><h2 id="non-goals-for-repository-core">Non-Goals For Repository Core</h2><ul><li>Making full-page request rendering the default.</li><li>Making browser JavaScript the app contract.</li><li>Generating user domain logic, services, stores, auth, storage, or business -validation.</li><li>Requiring npm, Tailwind, Chi, Gin, Echo, Fiber, or another framework in the -repository core.</li><li>Making WASM islands the default component runtime.</li><li>Treating folder placement as route truth.</li><li>Auto-discovering backend endpoints from function names.</li></ul><h2 id="planning-sources">Planning Sources</h2><ul><li><code>docs/product/requirements.md</code>: requirement status.</li><li><code>docs/product/playground.md</code>: playground onboarding, sandboxing, export, and -opt-in local execution contract.</li><li><code>docs/product/playground-hosted-execution-spec.md</code>: playground sandbox/export -feature spec.</li><li><code>docs/product/contract-runtime-spec.md</code>: milestone-14 contract runtime -closure criteria.</li><li><code>docs/product/observability-tracing-spec.md</code>: runtime trace primitives and -generated instrumentation direction.</li><li><code>docs/engineering/architecture.md</code>: architecture and implemented boundaries.</li><li><code>docs/engineering/release-plan.md</code>: open-ended 0.x hardening checklist.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/security-audit-spec/index.html b/docs-site/dist/site/docs/product/security-audit-spec/index.html deleted file mode 100644 index c31a899a..00000000 --- a/docs-site/dist/site/docs/product/security-audit-spec/index.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Feature Spec: Declarative Security Audit (M8) - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Feature Spec: Declarative Security Audit (M8) - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Feature Spec: Declarative Security Audit (M8) - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Feature Spec: Declarative Security Audit (M8)</h1></header><article class="prose"><h2 id="problem">Problem</h2><p>GOWDK enforces security in scattered places — default-deny guards, generated -CSRF, body caps, panic boundaries, secret redaction, and the diagnostic registry — but -there is no single, declarative, auditable view of an app&#39;s whole security -posture, no way to declare the intended posture and have it checked, and no -integration-test framework that proves the runtime behaves as declared. The -production-readiness gates in <code>docs/engineering/security.md</code> exist only as prose. -Teams (and LLMs reviewing a change) cannot answer &#34;is this app&#39;s security -posture acceptable?&#34; from one artifact.</p><h2 id="goals">Goals</h2><ul><li>A declarative, machine- and human-readable security posture derived from the -IR (<code>gowdk-security.json</code>), covering routes, backend endpoints, contracts, and -the frontend surface.</li><li>A <code>gowdk audit</code> command that evaluates a built-in baseline (the documented -production-readiness gates, made executable) against that posture and reports -registry-coded findings with <code>file:line</code> and remediation.</li><li>Composable, declared policies in a new <code>*.audit.gwdk</code> file kind that extend or -override the baseline (named policies, <code>extends</code>, selector-applied to many -targets).</li><li>Frontend coverage: secret/data-leak scan of embedded output, client route-guard -coverage, required response headers/CSP, and raw-HTML (XSS) sink allowlisting.</li><li>An integration-test framework (<code>test {}</code> blocks → generated <code>httptest</code> tests) -that verifies the runtime matches the declared posture.</li></ul><h2 id="non-goals">Non-Goals</h2><ul><li>Owning authentication, sessions, RBAC storage, or backend resource -authorization — those stay in app Go. Guards and audits are defense-in-depth.</li><li>Running generated-app audit tests as part of <code>gowdk build</code>. The build command -runs the static baseline gate, but runtime audit tests stay explicit through -<code>gowdk audit --run</code>.</li><li>Browser/E2E testing or testing user domain logic.</li><li>Full data-flow/taint analysis of raw-HTML sinks (M8 flags sinks; it does not -trace tainted inputs).</li></ul><h2 id="users-and-permissions">Users And Permissions</h2><ul><li>Primary users: app authors and reviewers (human or LLM) who need a trustworthy, -one-glance security posture and a CI gate.</li><li>The audit reads guard/CSRF/body-limit/contract-role metadata already in the IR; -it grants no access and changes no runtime behavior.</li></ul><h2 id="trust-model">Trust Model</h2><p>Three-way consistency: declared policy ⟷ static posture (from IR) ⟷ runtime -behavior (integration tests) must agree. <code>gowdk audit</code> checks policy-vs-static; -<code>gowdk audit --run</code> adds runtime-vs-declared. Severity for every finding comes -only from the diagnostic registry, so the baseline never hardcodes severity.</p><h2 id="anti-magic-guarantees">Anti-Magic Guarantees</h2><ul><li>The posture manifest is a pure projection (like <code>gowdk-routes.json</code>); it -describes, never acts.</li><li><code>gowdk build</code> runs only the static baseline gate. The full report surface and -generated runtime audit tests stay explicit through <code>gowdk audit</code>.</li><li>Every finding cites a named rule, a diagnostic code, and a source <code>file:line</code>; -<code>gowdk explain &lt;code&gt;</code> gives the reasoning.</li><li>The baseline is the gates already written in <code>security.md</code>, made executable — -not new hidden policy.</li><li>Integration tests are emitted as readable <code>_test.go</code> files the user owns; the -generated app audit test is the runtime truth. The <code>--run</code> convenience builds -a temporary generated app and runs that app&#39;s generated audit test.</li></ul><h2 id="acceptance-criteria">Acceptance Criteria</h2><ul><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>gowdk-security.json</code> is emitted to a non-served build report path and by -<code>gowdk audit --json</code>.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>gowdk audit</code> applies the baseline, cites findings by code + <code>file:line</code>, -and exits non-zero on error findings.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> New <code>audit_*</code> / <code>policy_*</code> codes are registered and <code>gowdk explain</code>-able.</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"> Frontend audits (secret leak, route-guard coverage, headers/CSP, raw-HTML).</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>*.audit.gwdk</code> parser → IR → composable policy engine (<code>extends</code>, selectors).</li><li><input checked="" disabled="" type="checkbox" aria-label="Completed task"><code>test {}</code> blocks → generated <code>httptest</code> tests; <code>gowdk audit --emit-tests</code> -and <code>--run</code>; <code>runtime/app</code> security-header capability.</li></ul><h2 id="delivery-phases">Delivery Phases</h2><ul><li><strong>Phase 0–1 (shipped in this slice):</strong> diagnostic codes; <code>internal/auditspec</code> -(composable policy model, selector matcher, <code>extends</code>, baseline, engine); -<code>internal/securitymanifest</code> (IR → posture); <code>gowdk audit</code> with the baseline; -<code>gowdk-security.json</code> at build time outside the served output directory. Unit -<ul><li>CLI tests.</li></ul></li><li><strong>Phase 2 (shipped):</strong> the four frontend audits as baseline rules.</li><li><strong>Phase 3 (shipped):</strong> the <code>*.audit.gwdk</code> file kind and declared composable policies.</li><li><strong>Phase 4 (shipped):</strong><code>runtime/testkit</code>, generated <code>_test.go</code>, -standalone <code>--emit-tests</code>, generated-app <code>--run</code>, and the <code>runtime/app</code> -security-header capability.</li></ul><h2 id="issue-alignment">Issue Alignment</h2><p>Advances/closes #179 (IR-driven test harness; Phase 4 testkit). Relates to #120 -(CSRF tests), #119 (fail-closed secret), #67 (testing umbrella), #182 (features -from IR metadata), and diagnostics issues #328/#255/#107/#109.</p><h2 id="verification">Verification</h2><pre><code class="language-sh">go build ./cmd/gowdk -go test ./internal/securitymanifest ./internal/auditspec ./internal/parser ./internal/lang ./internal/appgen ./runtime/app ./runtime/testkit ./cmd/gowdk ./internal/diagnostics -go run ./cmd/gowdk audit --json --config gowdk.config.go -go run ./cmd/gowdk audit --emit-tests --run --config gowdk.config.go -go run ./cmd/gowdk explain audit_api_public_by_omission -go run ./cmd/gowdk build --out /tmp/gowdk-build examples/pages/home.page.gwdk \ - examples/pages/hero.cmp.gwdk &amp;&amp; test -f /tmp/.gowdk/reports/gowdk-build/gowdk-security.json -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/product/vision/index.html b/docs-site/dist/site/docs/product/vision/index.html deleted file mode 100644 index 7ff2c978..00000000 --- a/docs-site/dist/site/docs/product/vision/index.html +++ /dev/null @@ -1,79 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Product Vision - GOWDK</title> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Product Vision - GOWDK"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Product Vision - GOWDK"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Product</p><h1>Product Vision</h1></header><article class="prose"><h2 id="product-name">Product Name</h2><p>GOWDK</p><p>WDK does not have a canonical expansion. No one knows what it stands for; GOWDK -just ships apps.</p><h2 id="one-line-description">One-Line Description</h2><p>GOWDK ships Go web apps through GOWDK Compiler plus GOWDK Runtime.</p><h2 id="product-layer-names">Product Layer Names</h2><ul><li>GOWDK: the product name and repository wordmark.</li><li>GOWDK Compiler: the <code>.gwdk</code> language, parser, analyzer, component/page -compiler, diagnostics, LSP, and generated adapter source.</li><li>GOWDK Runtime: the app/runtime layer for serving, routing, request context, form -decoding, response envelopes, actions, APIs, CSRF, partial fragments, SSR -contracts, embedded assets, and one-binary or split-binary wiring.</li><li><code>gowdk</code>: the CLI that runs the compiler, produces build artifacts, and wires -GOWDK Runtime output.</li></ul><p>This keeps the Svelte/SvelteKit-style separation without saying <code>GOWDK Kit</code>, -because the <code>K</code> already carries the kit idea in the product wordmark. It does -not rename Go module paths or public runtime packages yet.</p><p>Use the names this way:</p><table><thead><tr><th>Name</th><th>Product Meaning</th></tr></thead><tbody><tr><td>GOWDK</td><td>Product name and wordmark.</td></tr><tr><td>GOWDK Compiler</td><td>Language/compiler layer. It owns <code>.gwdk</code>, AST/analyzer/IR, generated Go adapter source, build output, manifests, route metadata, asset metadata, diagnostics, formatting, and LSP.</td></tr><tr><td>GOWDK Runtime</td><td>Runtime/app layer. It owns <code>runtime/</code>, <code>addons/</code>, generated <code>net/http</code> serving, backend routing, form decoding, responses, actions, APIs, fragments, SSR hooks, embedded assets, contract runtime, and one-binary or split-binary wiring.</td></tr><tr><td><code>gowdk</code></td><td>CLI and Go package/module spelling. The CLI drives both layers.</td></tr></tbody></table><p>Avoid treating <code>GOWDK World</code>, <code>GOWDK Core</code>, or <code>GOWDK Framework</code> as separate -public names. In docs, use <code>compiler core</code>, <code>runtime core</code>, or <code>repository core</code> -when <code>core</code> is unavoidable.</p><h2 id="product-shape">Product Shape</h2><p>GOWDK grows as two coordinated parts:</p><pre><code class="language-text">GOWDK Compiler -component/page compiler - + -GOWDK Runtime -app/runtime layer - = -Go-first full web app -</code></pre><p>GOWDK Compiler owns package-peer <code>.gwdk</code> files, pages, layouts, components, -build-time output, CSS, islands, manifests, diagnostics, endpoint metadata, and -generated adapter source. GOWDK Runtime owns serving, routing, request context -helpers, form decoding, response envelopes, actions, APIs, CSRF, partial -fragments, SSR contracts, embedded assets, contract runtime, and one-binary or -split-binary wiring.</p><p>User application behavior stays in Go. Separate <code>.go</code> files remain the default -path today, and optional inline Go authoring in <code>.gwdk</code> is accepted as planned -surface only when it extracts to normal importable, testable Go package code. -GOWDK should improve Go web authoring through <code>.gwdk</code> compilation, GOWDK Runtime -contracts, and generated adapters before considering any custom Go compiler -work.</p><h2 id="execution-lanes">Execution Lanes</h2><ul><li>Build-time page lane: full pages default to static SPA/prerender output.</li><li>Backend endpoint lane: actions, APIs, and fragments run at request time -without making the page itself request-rendered.</li><li>Request-time page lane: pages with <code>server {}</code> or <code>go server {}</code> are compiled into -generated SSR handlers and run through GOWDK Runtime.</li></ul><p>SSR is integrated into the compiler/runtime code path and selected per page. The -current <code>addons/ssr</code> package and <code>--ssr</code> flag are feature gates for enabling -that lane in config and CLI flows; they are not a separate product layer.</p><h2 id="target-users">Target Users</h2><ul><li>Go developers building product applications who want build-time page output, -typed backend behavior, and one-binary deployment.</li><li>Small teams that want Go-first UI authoring without a large JavaScript -application stack.</li><li>Builders who want request-time page rendering only where request context, -guards, sessions, or per-request data actually matter.</li></ul><h2 id="problem">Problem</h2><p>Modern web frameworks often force teams into one rendering ideology: full SSR, -full SPA, or deploy-only static output. GOWDK should let Go teams compile -portable <code>.gwdk</code> files into build-time pages, components, typed backend -endpoints, partial updates, request-time pages, and deployable Go binaries while -keeping the route, handler, and runtime contracts explicit.</p><h2 id="differentiation">Differentiation</h2><ul><li>Files are portable: routes and layouts are declared in files, not implied by -folder nesting.</li><li>Full pages default to build-time SPA output.</li><li>Actions, APIs, and fragments are request-time endpoint behavior, not page -route kinds.</li><li>Partial updates use server fragments instead of full-page request rendering.</li><li>SSR is an integrated non-default request-time page lane selected per page.</li><li>User behavior stays in Go; generated Go is adapter glue.</li><li>Production can ship as one Go binary with embedded frontend assets and -generated request-time handlers.</li></ul><h2 id="success-metrics">Success Metrics</h2><ul><li>Developers can explain GOWDK in one sentence: GOWDK ships Go web apps through -GOWDK Compiler plus GOWDK Runtime.</li><li>The compiler can produce real build-time page output, route metadata, endpoint -metadata, CSS/assets, generated adapter Go, and deployable artifacts from -package-peer <code>.gwdk</code> files.</li><li>Actions and APIs bind to exact exported Go handlers with typed form decoding, -explicit request context, safe response envelopes, CSRF, and production-safe -error handling.</li><li>Request-time SSR pages can execute <code>server {}</code>, guards, typed route params, -request-aware layouts, redirects, and error boundaries through generated SSR -handlers.</li><li>One-binary and split-binary deployments use the same route and endpoint -metadata.</li></ul><h2 id="constraints">Constraints</h2><ul><li>Language: Go-first compiler, runtime, and deployment.</li><li>Behavior: domain logic, auth, validation, storage, and services stay in user -Go packages.</li><li>Generated code: generated Go is adapter glue, not generated application -logic.</li><li>Styling: CSS tooling is addon-driven. Tailwind is optional, not core.</li><li>JavaScript: generated JavaScript may enhance navigation, forms, fragments, and -local UI state, but normal app contracts must not depend on user-written -JavaScript.</li><li>Rendering: full pages default to build-time SPA output; request-time page -rendering is explicit with <code>server {}</code> or <code>go server {}</code>.</li><li>Deployment: one-binary production deploy must work with and without -request-time page rendering.</li><li>Extensibility: actions, APIs, partials, SSR, embed, CSS processor addons, framework -adapters, and WASM islands should remain modular implementation boundaries -around the same core metadata.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/addons/index.html b/docs-site/dist/site/docs/reference/addons/index.html deleted file mode 100644 index 3f4099dc..00000000 --- a/docs-site/dist/site/docs/reference/addons/index.html +++ /dev/null @@ -1,344 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Addons Reference - GOWDK</title> - <meta name="description" content="Addons register feature IDs with the compiler. Core framework capabilities such as SSR, actions, APIs, auth, DB, contracts, and rate limiting are fixed GOWDK-owned features;..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Addons Reference - GOWDK"> - <meta property="og:description" content="Addons register feature IDs with the compiler. Core framework capabilities such as SSR, actions, APIs, auth, DB, contracts, and rate limiting are fixed GOWDK-owned features;..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Addons Reference - GOWDK"> - <meta name="twitter:description" content="Addons register feature IDs with the compiler. Core framework capabilities such as SSR, actions, APIs, auth, DB, contracts, and rate limiting are fixed GOWDK-owned features;..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Addons Reference</h1><p class="doc-lead">Addons register feature IDs with the compiler. Core framework capabilities such as SSR, actions, APIs, auth, DB, contracts, and rate limiting are fixed GOWDK-owned features; enabling their feature IDs selects compiler and generator logic in GOWDK itself. External addon behavior is limited to documented public interfaces: gowdk.CSSProcessor for build-time CSS output, gowdk.SEOProvider for build-time SEO files, and gowdk.GoBlockConsumer for targeted go addon.&lt;name&gt; {} blocks.</p></header><article class="prose"><p>Addons register feature IDs with the compiler. Core framework capabilities -such as SSR, actions, APIs, auth, DB, contracts, and rate limiting are fixed -GOWDK-owned features; enabling their feature IDs selects compiler and generator -logic in GOWDK itself. External addon behavior is limited to documented public -interfaces: <code>gowdk.CSSProcessor</code> for build-time CSS output, -<code>gowdk.SEOProvider</code> for build-time SEO files, and <code>gowdk.GoBlockConsumer</code> for -targeted <code>go addon.&lt;name&gt; {}</code> blocks.</p><p>The config loader parses built-in addon constructors from <code>gowdk.config.go</code> -through the Go AST when possible. If an addon constructor comes from another -importable Go module, the loader uses an executable config bridge so -GitHub-hosted addons can return real <code>gowdk.Addon</code> values and preserve supported -extension interfaces.</p><h2 id="addon-lifecycle">Addon Lifecycle</h2><p>An addon participates in up to four ordered phases. Each phase corresponds to a -specific interface, and an addon implements only the interfaces for the phases -it needs. The base <code>gowdk.Addon</code> (<code>Name()</code>, <code>Features()</code>) is always required; -the rest are opt-in extension points.</p><ol><li><strong>Config loading</strong> — <code>gowdk.Addon</code>. The loader resolves the constructor from -<code>gowdk.config.go</code> (Go AST for built-ins, executable bridge for external -modules) and reads <code>Features()</code>. Feature IDs gate compiler and generator -logic through <code>Config.HasFeature</code>.</li><li><strong>Compiler validation</strong> — <code>gowdk.GoBlockConsumer.ValidateGoBlock</code> validates -<code>go addon.&lt;name&gt; {}</code> blocks and may return addon-owned diagnostics. Built-in -feature gates also run here (for example, a page using <code>server {}</code> or -<code>go server {}</code> requires the <code>ssr</code> feature).</li><li><strong>Generated output</strong> — build-time emitters run while writing output: -<code>gowdk.CSSProcessor.ProcessCSS</code> (CSS), <code>gowdk.SEOProvider.SEOOptions</code> -(<code>sitemap.xml</code>/<code>robots.txt</code>), and <code>gowdk.GoBlockConsumer.GeneratedGo</code> (files -relative to the generated app directory, formatted before writing).</li><li><strong>Runtime hook registration</strong> — generated apps register runtime hooks from -user-owned Go in the generated package, for example -<code>RegisterRateLimiter(*ratelimit.Limiter)</code>, custom <code>GOWDKGuardRegistry</code> -entries, <code>GOWDKAuthProvider() auth.Provider</code>, or -<code>RegisterContractEventSink(...)</code>. The built-in auth addon is the narrow -exception: <code>auth.Addon(auth.Options{...})</code> wires its own session provider and -<code>auth.required</code> guard. GOWDK never calls third-party runtime code implicitly; -the app wires it. External addons do not become implicit runtime services; -app-owned background work is declared separately through -<code>Config.Lifecycle.Services</code>.</li></ol><h3 id="addon-categories">Addon categories</h3><p>The contract distinguishes addon categories by which interfaces they implement. -The registry records this in each entry&#39;s <code>publicInterfaces</code>:</p><table><thead><tr><th>Category</th><th>Interface(s)</th><th>Phase</th></tr></thead><tbody><tr><td>Marker / feature addon</td><td><code>gowdk.Addon</code> only</td><td>config loading (feature gate)</td></tr><tr><td>Compiler addon</td><td><code>gowdk.GoBlockConsumer</code></td><td>compiler validation + generated output</td></tr><tr><td>CSS processor</td><td><code>gowdk.CSSProcessor</code></td><td>generated output</td></tr><tr><td>Build-time provider</td><td><code>gowdk.SEOProvider</code></td><td>generated output</td></tr><tr><td>Runtime addon</td><td>generated-app registration hooks</td><td>runtime hook registration</td></tr></tbody></table><p>A single addon can span categories (for example <code>addons/css</code> implements both -<code>gowdk.Addon</code> and <code>gowdk.CSSProcessor</code>).</p><h2 id="version-and-feature-handshake">Version and Feature Handshake</h2><p>Addons declare what they target two ways:</p><ul><li><strong>Feature handshake.</strong><code>Features()</code> declares feature IDs (see below). -<code>Config.HasFeature</code> gates the matching compiler and generator logic; a page -that uses a capability without its feature addon is reported by a diagnostic -(for example <code>missing_ssr_addon</code>).</li><li><strong>Version handshake.</strong> A registry entry declares the GOWDK line it supports -with <code>minGOWDK</code> and optional <code>maxGOWDK</code>. <code>addonregistry.Entry.SupportsVersion</code> -checks a concrete CLI version against those inclusive bounds and returns -<code>VersionSupported</code>, <code>VersionUnsupported</code>, or <code>VersionUnknown</code> (when a bound or -the queried version is unset or unparseable, so tooling warns rather than -wrongly blocking). <code>Registry.UnsupportedFor(version)</code> lists entries a given -CLI version excludes. The curated <code>compatibility</code> field -(<code>compatible</code>/<code>incompatible</code>/<code>unknown</code>) is the human-reviewed signal that -complements the computed bound check. Both are covered by -<code>internal/addonregistry</code> tests.</li></ul><h2 id="failure-modes">Failure Modes</h2><ul><li><strong>Unsupported addon go block</strong> — <code>go addon.&lt;name&gt; {}</code> targeting an enabled -addon that does not implement <code>gowdk.GoBlockConsumer</code>, or whose -<code>GoBlockTargets</code> omits the exact target, fails <code>gowdk check</code> and builds with -<code>unsupported_addon_go_block_target</code>.</li><li><strong>Missing required external tool</strong> — an addon that shells out to a tool (for -example <code>addons/tailwind</code>) fails the build with an install-required error when -the tool is absent; GOWDK does not download it.</li><li><strong>Missing feature addon</strong> — using a capability without enabling its addon is a -compiler diagnostic, not a silent no-op.</li><li><strong>Version-incompatible addon</strong> — <code>SupportsVersion</code> returns <code>VersionUnsupported</code> -for a CLI version outside an entry&#39;s <code>minGOWDK</code>/<code>maxGOWDK</code>. Tooling can surface -this; build-time auto-enforcement of the version bound remains a deliberate -follow-up (see Discovery Policy).</li><li><strong>Deprecated or experimental lifecycle</strong> — surfaced in <code>gowdk add --list --registry</code> output so users see stability before wiring an addon.</li><li><strong>External addon resolution</strong> — external addons resolve through normal Go -module tooling; missing modules surface as ordinary Go build errors.</li></ul><p>Current feature IDs:</p><ul><li><code>spa</code></li><li><code>actions</code></li><li><code>partial</code></li><li><code>ssr</code></li><li><code>api</code></li><li><code>embed</code></li><li><code>css</code></li><li><code>ratelimit</code></li><li><code>contracts</code></li><li><code>realtime</code></li><li><code>observability</code></li><li><code>auth</code></li><li><code>db</code></li><li><code>seo</code></li></ul><p>Current packages:</p><ul><li><code>addons/static</code></li><li><code>addons/spa</code></li><li><code>addons/actions</code></li><li><code>addons/partial</code></li><li><code>addons/ssr</code></li><li><code>addons/api</code></li><li><code>addons/embed</code></li><li><code>addons/css</code></li><li><code>addons/tailwind</code></li><li><code>addons/ratelimit</code></li><li><code>addons/contracts</code></li><li><code>addons/realtime</code></li><li><code>addons/observability</code></li><li><code>addons/auth</code></li><li><code>addons/db</code></li><li><code>addons/seo</code></li></ul><p>Request-time helpers live under <code>runtime/</code> even when an addon enables the -feature. Config files still import <code>addons/&lt;name&gt;</code> and call <code>&lt;name&gt;.Addon()</code>. -Generated apps and request-time extension code should import the runtime package -for helpers:</p><table><thead><tr><th>Config addon</th><th>Request-time helpers</th></tr></thead><tbody><tr><td><code>addons/actions</code></td><td><code>runtime/actions</code></td></tr><tr><td><code>addons/api</code></td><td><code>runtime/api</code></td></tr><tr><td><code>addons/partial</code></td><td><code>runtime/partial</code></td></tr><tr><td><code>addons/ratelimit</code></td><td><code>runtime/ratelimit</code></td></tr><tr><td><code>addons/realtime</code></td><td><code>runtime/realtime</code></td></tr><tr><td><code>addons/ssr</code></td><td><code>runtime/ssr</code></td></tr></tbody></table><p>The addon packages re-export their runtime helpers for 0.x compatibility, but -new generated app code imports <code>runtime/&lt;name&gt;</code> so request-time binaries do not -pull in the root build-time config package through addon markers.</p><p><code>addons/static</code> is the build-time static page output boundary. <code>addons/spa</code> -remains available for existing configs and static-first SPA navigation; both -enable the existing <code>spa</code> feature ID.</p><p>Use <code>gowdk add --list</code> to print the addable built-in names the CLI can wire into -<code>gowdk.config.go</code>:</p><pre><code class="language-sh">gowdk add --list -gowdk add --list --registry -gowdk add --list --registry --json -gowdk add ssr actions partial realtime observability -gowdk add seo --base-url https://example.com -</code></pre><p><code>gowdk add &lt;name&gt;</code> inserts the canonical addon import and appends -<code>&lt;name&gt;.Addon()</code> to a literal <code>Config.Addons</code> list. It skips constructors that -are already present, including aliased imports. It does not install external Go -modules or discover third-party addons. <code>gowdk add seo</code> also requires -<code>--base-url</code> so the generated config can pass SEO build validation.</p><h2 id="discovery-policy">Discovery Policy</h2><p>Current addon discovery is intentionally narrow and metadata-first:</p><ul><li><code>gowdk add --list</code> prints only built-in addons that the CLI can wire safely.</li><li><code>gowdk add --list --registry</code> prints the checked-in addon registry metadata.</li><li><code>gowdk add --list --registry --json</code> prints the same metadata as JSON so -docs and website tooling can render entries without importing or executing -addon code.</li><li>Repository docs are the source of truth for documented external addons.</li><li>External addons are resolved by normal Go module tooling after the app imports -and configures them explicitly.</li><li>Registry metadata may list addons, but it must not install, execute, or trust -addon code.</li></ul><p>The machine-readable registry lives in <code>internal/addonregistry/registry.json</code>. -Each entry must describe:</p><ul><li><code>name</code>, <code>summary</code>, and <code>description</code>;</li><li><code>kind</code>: <code>built-in</code> or <code>documented-external</code>;</li><li><code>lifecycle</code>: <code>stable</code>, <code>experimental</code>, or <code>deprecated</code>;</li><li><code>compatibility</code>: <code>compatible</code>, <code>incompatible</code>, or <code>unknown</code>;</li><li><code>minGOWDK</code> and optional <code>maxGOWDK</code>;</li><li><code>modulePath</code>, <code>packagePath</code>, and <code>importPath</code>;</li><li><code>owner</code>, <code>sourceRepository</code>, <code>license</code>, and <code>documentation</code>;</li><li>enabled <code>features</code>;</li><li>implemented <code>publicInterfaces</code>, such as <code>gowdk.Addon</code>, -<code>gowdk.CSSProcessor</code>, <code>gowdk.SEOProvider</code>, or <code>gowdk.GoBlockConsumer</code>;</li><li><code>requiredExternalTools</code>;</li><li><code>networkBehavior</code>, <code>processBehavior</code>, and <code>securityNotes</code>;</li><li><code>trust.level</code> and <code>trust.notes</code>;</li><li><code>constructor.addable</code>, <code>constructor.package</code>, <code>constructor.function</code>, and -optional constructor option metadata.</li></ul><p><code>constructor.addable</code> is intentionally separate from registry visibility. A -registry entry can be visible to docs and CLI discovery while still requiring -manual Go-module setup. Documented external addons must not be addable by -<code>gowdk add</code>; users import and configure them through normal Go module tooling. -The bundled registry currently contains built-in entries only, plus addable and -non-addable built-in distinctions such as <code>addons/tailwind</code>. The schema and CLI -table are ready for documented external, deprecated, and incompatible entries -when the project has real entries to publish.</p><p>The registry now provides a computed version handshake -(<code>addonregistry.Entry.SupportsVersion</code> / <code>Registry.UnsupportedFor</code>, see -<a href="#version-and-feature-handshake">Version and Feature Handshake</a>) on top of the -curated <code>compatibility</code> field. Even so, GOWDK must not scan GitHub or module -proxies for addons, execute unknown constructors to build a list, download -hidden dependencies, auto-add external modules, or enable an external addon that -is not already present in project Go code. Remote registry sync and <em>build-time</em> -automatic compatibility enforcement (failing a build on an out-of-range -<code>minGOWDK</code>) remain out of scope for the local registry slice; the handshake is -available for tooling to warn.</p><p><code>gowdk.NewAddon(name, features...)</code> creates a marker addon for feature checks. -It does not by itself make the compiler, app generator, or runtime call -third-party code; implement <code>CSSProcessor</code>, <code>SEOProvider</code>, or -<code>GoBlockConsumer</code> when the addon needs build-time behavior. Runtime background -services stay app-owned and are imported through <code>Config.Lifecycle.Services</code>.</p><p>The current compiler validator checks whether SSR is enabled when a page uses -<code>server {}</code> or <code>go server {}</code>. SPA builds invoke addons that implement -<code>gowdk.CSSProcessor</code> or <code>gowdk.SEOProvider</code>. Generated app builds invoke -configured addons that implement <code>gowdk.GoBlockConsumer</code> for -<code>go addon.&lt;name&gt; {}</code> blocks.</p><p>The literal config loader recognizes no-argument constructors for most -built-ins and the literal SEO options subset for <code>addons/seo</code>:</p><pre><code class="language-go">Addons: []gowdk.Addon{ - static.Addon(), - spa.Addon(), - actions.Addon(), - partial.Addon(), - ssr.Addon(), - api.Addon(), - auth.Addon(), - embed.Addon(), - css.Addon(), - db.Addon(), - ratelimit.Addon(), - contracts.Addon(), - observability.Addon(), - seo.Addon(seo.Options{ - BaseURL: &#34;https://example.com&#34;, - }), - realtime.Addon(), -} -</code></pre><p><code>addons/contracts</code> registers the contract-driven runtime feature. The current -runtime registry lives in <code>runtime/contracts</code>; generated adapters can use local -in-process dispatch, file outbox, in-memory broker, SSE, or optional nested -Redis Streams, NATS, and WebSocket adapter modules. The addon enables compiler -integration and generated route plumbing; apps still choose their sink in Go -with <code>RegisterContractEventSink</code>. See <code>docs/reference/contracts.md</code> for Redis, -NATS, SSE, WebSocket, outbox, worker backoff, and composite sink examples. -Separate worker/cron binary generators remain planned deployment tooling.</p><p><code>addons/realtime</code> registers the browser presentation-event fanout feature. It -does not import the optional WebSocket transport dependency or patch the DOM. -Use dependency-free <code>runtime/contracts/sse</code> through <code>realtime.NewSSE</code> for -one-way browser notifications, or opt into the nested -<code>runtime/contracts/websocketfanout</code> module when the app needs WebSocket -sessions. See <code>docs/reference/realtime.md</code>.</p><p><code>addons/observability</code> registers the generated trace instrumentation feature. -Debug builds wire route, endpoint, guard, browser navigation, and island spans -to the dependency-free <code>runtime/trace</code> collector and local viewer. Optional OTLP -export is isolated in the nested <code>runtime/trace/otel</code> module. See -<code>docs/reference/observability.md</code>.</p><h2 id="auth-addon">Auth Addon</h2><p><code>addons/auth</code> is experimental 0.x authentication plumbing. It enables the -<code>auth</code> feature and provides:</p><ul><li><code>PasswordHasher</code>, with <code>PBKDF2Hasher</code> as the default.</li><li><code>HashPassword</code>, <code>HashPasswordWithIterations</code>, and <code>VerifyPassword</code> helpers -backed by Go standard-library PBKDF2-HMAC-SHA256.</li><li>Signed-cookie <code>Sessions</code> that implement <code>runtime/auth.Provider</code> for native -<code>role:</code> and <code>permission:</code> guards.</li><li>Generated app startup wiring for <code>auth.required</code>, <code>role:</code>, and -<code>permission:</code> guards when <code>auth.Addon</code> is enabled.</li></ul><p>The cryptography and dependency stance is recorded in -<a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011</a>.</p><p>Use the default hasher:</p><pre><code class="language-go">encoded, err := auth.HashPassword(password) -if err != nil { - return err -} -if !auth.VerifyPassword(password, encoded) { - return errors.New(&#34;invalid credentials&#34;) -} -</code></pre><p><code>HashPasswordWithIterations</code> and <code>PBKDF2Hasher{Iterations: ...}</code> reject values -below <code>MinIterations</code>; leave <code>Iterations</code> unset to use <code>DefaultIterations</code>. -Verification also rejects malformed PBKDF2 encodings that do not match the -canonical salt, key, and iteration policy emitted by <code>HashPassword</code>.</p><p>Or replace it behind the small interface:</p><pre><code class="language-go">type PasswordStore struct { - Hasher auth.PasswordHasher -} -</code></pre><p>Session secrets fail closed. Pass a direct <code>Secret</code> or read from a runtime -environment variable with <code>SecretEnv</code>; do not set both. Either value must be at -least 32 bytes. Environment secret values are used as exact bytes. Errors name -the setting, never the secret value.</p><pre><code class="language-go">sessions, err := auth.New(auth.Options{ - SecretEnv: auth.DefaultSessionSecretEnv, - CookieName: &#34;myapp_session&#34;, - TTL: 12 * time.Hour, -}) -if err != nil { - return err -} -</code></pre><p><code>CookieName</code> must be a valid HTTP cookie name. A zero <code>TTL</code> uses -<code>DefaultSessionTTL</code>; explicit positive values must be at least one second, and -negative values are rejected. Issued sessions require a non-empty -<code>Principal.ID</code>.</p><p>In generated apps, configure the addon instead of writing guard hook files:</p><pre><code class="language-go">auth.Addon(auth.Options{ - SecretEnv: &#34;GOWDK_AUTH_SESSION_SECRET&#34;, - CookieName: &#34;myapp_session&#34;, - TTL: 12 * time.Hour, - Insecure: true, // local HTTP development only -}) -</code></pre><p>Generated startup constructs the session manager, registers it as the native -RBAC provider, and adds the default <code>auth.required</code> guard. Login/logout handlers -can issue or clear the same cookie through the configured manager:</p><pre><code class="language-go">sessions, err := auth.DefaultSessions() -if err != nil { - return response.Response{}, err -} -cookie, err := sessions.Cookie(auth.Principal{ID: userID, Roles: []string{&#34;user&#34;}}) -</code></pre><p>Custom guard IDs still require <code>GOWDKGuardRegistry</code>. Native <code>role:</code> and -<code>permission:</code> guards require <code>GOWDKAuthProvider</code> only when the auth addon is not -configured.</p><p>GOWDK owns generated guard dispatch, CSRF validation, signed session cookie -helpers, and native RBAC checks. Application Go owns user lookup, credential -policy, MFA, OAuth, account recovery, durable storage, session lifetime, -custom guard decisions, and backend resource authorization.</p><p>For generated actions, ordering matters:</p><ul><li>A public login action has no guard, so generated CSRF validation runs before -form decoding and before the login handler.</li><li>A protected action, such as logout, runs rate limiting and guards first. A -missing or invalid session fails at the guard step before CSRF validation.</li><li>If the guard succeeds but the CSRF token is missing or invalid, generated -code returns HTTP 403 <code>invalid csrf token</code> with <code>Cache-Control: no-store</code>.</li></ul><p>See <code>examples/auth-guard</code> for a small public-login and protected-dashboard -flow.</p><h2 id="db-addon">DB Addon</h2><p><code>addons/db</code> registers the database helper feature and provides thin -<code>database/sql</code> plumbing: <code>Open</code>, readiness checks, <code>WithTx</code>, and ordered -user-authored SQL migration application. It imports no SQL driver and owns no -schema, query generation, repository abstraction, or domain logic. See -<code>docs/reference/db.md</code> for the migration tracking contract and sqlc -walkthrough.</p><p>External addons use normal Go imports:</p><pre><code class="language-go">import brand &#34;github.com/example/gowdk-brand&#34; - -Addons: []gowdk.Addon{ - brand.Addon(), -} -</code></pre><p>External addons are regular importable Go packages. They can live in GitHub -modules, private modules, or local modules referenced with <code>replace</code>, and they -can import their own Go dependencies. The project module must already be able -to resolve the addon and its dependency graph with the Go toolchain through -<code>go.mod</code>, <code>go.sum</code>, <code>replace</code>, <code>GOPRIVATE</code>, or the user&#39;s configured module -proxy settings. GOWDK does not vendor, sandbox, or rewrite addon imports.</p><p>Custom addons are configured in Go, not declared by <code>.plugin.gwdk</code> source -files. Use addon constructor options for addon-level configuration, implement -<code>gowdk.CSSProcessor</code> for build-time CSS output, and implement -<code>gowdk.GoBlockConsumer</code> when the addon needs source-local input through -<code>go addon.&lt;name&gt; {}</code> blocks.</p><h2 id="targeted-go-blocks">Targeted Go Blocks</h2><p>External addons can opt into targeted inline Go through -<code>gowdk.GoBlockConsumer</code>:</p><pre><code class="language-go">type GoBlockConsumer interface { - GoBlockTargets() []string - ValidateGoBlock(gowdk.GoBlockTarget, gowdk.GoBlockContext) []gowdk.GoBlockDiagnostic - GeneratedGo(gowdk.GoBlockTarget, gowdk.GoBlockContext) ([]gowdk.GoBlockFile, error) -} -</code></pre><p>For a <code>.gwdk</code> block like <code>go addon.contracts {}</code>, the addon named -<code>contracts</code> receives target <code>addon.contracts</code>. <code>GoBlockTargets</code> controls which -targets the addon accepts. <code>ValidateGoBlock</code> can return addon-owned diagnostics. -<code>GeneratedGo</code> can return files relative to the generated app directory; <code>.go</code> -files are formatted before writing. File paths must stay relative to the -generated app directory. The AST config loader and executable config bridge both -preserve this interface; external addons are not downgraded to inert feature -markers when they implement <code>GoBlockConsumer</code>. If <code>go addon.&lt;name&gt; {}</code> targets -an enabled addon that does not implement <code>GoBlockConsumer</code>, or whose -<code>GoBlockTargets</code> does not include the exact target, <code>gowdk check</code> and builds -fail with <code>unsupported_addon_go_block_target</code>.</p><p><code>addons/tailwind</code> is an experimental Tailwind v4 CSS processor wrapper around -the standalone CLI. When <code>Options.Command</code> is omitted it uses <code>tailwindcss</code> from -<code>PATH</code>. If the executable is missing, builds fail with an install-required -error. GOWDK does not download Tailwind, use npm, add Tailwind to the compiler -core or runtime core, or generate Tailwind v3 content configuration. The literal -config loader recognizes <code>tailwind.Addon</code> with a literal <code>tailwind.Options</code> -value.</p><p><code>runtime/ratelimit</code> provides request-time HTTP middleware with fixed-window -decisions, rate-limit response headers, a process-local in-memory store, and a -Redis-backed store adapter. It does not add a Redis client dependency or choose -an application policy automatically. When <code>ratelimit.Addon()</code> is enabled and a -generated app has action, API, fragment, SSR, or split-backend proxy routes, the -generated package exposes <code>RegisterRateLimiter(*ratelimit.Limiter)</code>.</p><p><code>addons/seo</code> emits <code>sitemap.xml</code> and <code>robots.txt</code> at build time. It requires -<code>seo.Options.BaseURL</code>, includes public static and <code>paths {}</code>-expanded SPA -routes, and records request-time or default-denied route exclusions in the build -report. See <a href="/docs/reference/seo/">seo.md</a>.</p><pre><code class="language-go">store := ratelimit.NewInMemoryStore(ratelimit.InMemoryOptions{}) -limiter, err := ratelimit.New(ratelimit.Options{ - Limit: 60, - Window: time.Minute, - Store: store, -}) -if err != nil { - return err -} - -handler := limiter.Middleware(next) -</code></pre><p>Generated apps can register the same limiter from user-owned Go in the -generated package:</p><pre><code class="language-go">package gowdkapp - -import ( - &#34;time&#34; - - &#34;github.com/cssbruno/gowdk/runtime/ratelimit&#34; -) - -func init() { - store := ratelimit.NewInMemoryStore(ratelimit.InMemoryOptions{}) - limiter, err := ratelimit.New(ratelimit.Options{ - Limit: 60, - Window: time.Minute, - Store: store, - }) - if err != nil { - panic(err) - } - RegisterRateLimiter(limiter) -} -</code></pre><p>Generated action, API, fragment, SSR, and split-backend proxy handlers call the -registered limiter before guards and user handler logic. If no limiter is -registered, the generated handlers continue normally.</p><p>Distributed deployments can use <code>ratelimit.NewRedisStore</code> with a small -<code>RedisClient</code> adapter:</p><pre><code class="language-go">redisStore, err := ratelimit.NewRedisStore(ratelimit.RedisOptions{ - Client: redisClientAdapter, -}) -if err != nil { - return err -} - -limiter, err := ratelimit.New(ratelimit.Options{ - Limit: 300, - Window: time.Minute, - Store: redisStore, -}) -</code></pre><p>Example adapter for <code>github.com/redis/go-redis/v9</code>:</p><pre><code class="language-go">import ( - &#34;context&#34; - &#34;fmt&#34; - - &#34;github.com/redis/go-redis/v9&#34; -) - -type GoRedisRateLimitClient struct { - Client *redis.Client -} - -func (client GoRedisRateLimitClient) EvalInt64s(ctx context.Context, script string, keys []string, args ...string) ([]int64, error) { - values, err := client.Client.Eval(ctx, script, keys, args).Slice() - if err != nil { - return nil, err - } - out := make([]int64, 0, len(values)) - for _, value := range values { - switch typed := value.(type) { - case int64: - out = append(out, typed) - case int: - out = append(out, int64(typed)) - default: - return nil, fmt.Errorf(&#34;unexpected redis rate-limit value %T&#34;, value) - } - } - return out, nil -} -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/cli/index.html b/docs-site/dist/site/docs/reference/cli/index.html deleted file mode 100644 index e2426d9f..00000000 --- a/docs-site/dist/site/docs/reference/cli/index.html +++ /dev/null @@ -1,381 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>CLI Reference - GOWDK</title> - <meta name="description" content="The current CLI includes language tooling, an initial build-output command, generated embedded app output, and a local output-serving command for development."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="CLI Reference - GOWDK"> - <meta property="og:description" content="The current CLI includes language tooling, an initial build-output command, generated embedded app output, and a local output-serving command for development."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="CLI Reference - GOWDK"> - <meta name="twitter:description" content="The current CLI includes language tooling, an initial build-output command, generated embedded app output, and a local output-serving command for development."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>CLI Reference</h1><p class="doc-lead">The current CLI includes language tooling, an initial build-output command, generated embedded app output, and a local output-serving command for development.</p></header><article class="prose"><p>The current CLI includes language tooling, an initial build-output command, -generated embedded app output, and a local output-serving command for -development.</p><h2 id="commands">Commands</h2><pre><code class="language-sh">gowdk version -gowdk init [--force] [--tests] [--template &lt;site|minimal&gt;] [dir] -gowdk add &lt;addon&gt; [--config &lt;file&gt;] [--base-url &lt;url&gt;] -gowdk add --list [--registry] [--json] -gowdk tokens &lt;file.gwdk&gt; -gowdk fmt [--write] &lt;files&gt; -gowdk check [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--json] [--warnings-as-errors] [--ssr] [files...] -gowdk fix [--dry-run] [--code &lt;diagnostic-code&gt;] [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [files...] -gowdk manifest [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [files...] -gowdk sitemap [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [files...] -gowdk routes [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [files...] -gowdk endpoints [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [files...] -gowdk inspect ir|tree|endpoint-graph|asset-graph|go-bindings [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--json] [--ssr] [files...] -gowdk generate stubs [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [files...] -gowdk explain [--json] &lt;diagnostic-code&gt; -gowdk doctor [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [--json] [files...] -gowdk audit [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--module &lt;name&gt;] [--ssr] [--json] [--emit-tests[=&lt;file&gt;]] [--run] [files...] -gowdk contracts [--json] [dir] -gowdk graph [--json] [dir] -gowdk trace &lt;contract&gt; [--json] [dir] -gowdk list commands|queries|events|jobs [--json] [dir] -gowdk build [--config &lt;file&gt;] [--env-file &lt;file&gt;] [--debug] [--timings[=&lt;file&gt;]] [--ssr] [--allow-missing-backend] [--allow-insecure] [--obfuscate-assets] [--target &lt;name&gt;] [--module &lt;name&gt;] [--out &lt;dir&gt;] [--app &lt;dir&gt;] [--bin &lt;file&gt;] [--docker] [--docker-base &lt;distroless|scratch&gt;] [--deploy-recipe &lt;caddy|nginx|split|static|systemd&gt;] [--wasm &lt;file&gt;] [--backend-app &lt;dir&gt;] [--backend-bin &lt;file&gt;] [files...] -gowdk clean [--config &lt;file&gt;] [--target &lt;name&gt;] [--out &lt;dir&gt;] [--dry-run] [--json] -gowdk dev [--addr &lt;addr&gt;] [--interval &lt;duration&gt;] [build flags...] -gowdk preview [--addr &lt;addr&gt;] [--hot] [build flags...] -gowdk serve --dir &lt;dir&gt; [--addr &lt;addr&gt;] -gowdk playground policy [--json] -gowdk playground export --dir &lt;project&gt; --out &lt;project.zip&gt; [--json] -gowdk playground run --dir &lt;project&gt; --out &lt;dir&gt; --allow-hosted-execution (--module-cache &lt;dir&gt; | --allow-shared-module-cache) -gowdk lsp [--ssr] -</code></pre><h2 id="flags">Flags</h2><ul><li><code>--ssr</code>: enables SSR validation by adding the SSR addon to the in-memory config.</li><li><code>--force</code>: supported by <code>init</code>; overwrites starter files that already exist.</li><li><code>--tests</code>: supported by <code>init</code>; adds <code>tests/gowdk_smoke_test.go</code>, an optional generated app smoke test that runs only when <code>GOWDK_BIN</code> points at a built <code>gowdk</code> CLI.</li><li><code>--template</code>: supported by <code>init</code>; selects <code>site</code> or <code>minimal</code>. Defaults to <code>site</code>.</li><li><code>--list</code>: supported by <code>add</code>; prints addable built-in addon names the command can wire.</li><li><code>--registry</code>: supported by <code>add --list</code>; prints checked-in addon registry -metadata, including built-in/documented-external kind, lifecycle, -compatibility, and whether <code>gowdk add</code> can wire it.</li><li><code>--base-url</code>: supported by <code>add seo</code>; writes the required -<code>seo.Options.BaseURL</code> value. The value must be an absolute <code>http</code> or -<code>https</code> URL.</li><li><code>--json</code>: supported by <code>check</code>, <code>doctor</code>, <code>audit</code>, <code>explain</code>, <code>inspect</code>, <code>contracts</code>, <code>graph</code>, <code>trace</code>, <code>list</code>, <code>clean</code>, <code>playground policy</code>, and <code>playground export</code>; prints -editor/tooling-friendly JSON. Contract JSON includes same-file handler -signature diagnostics when available. <code>gowdk check --json</code> uses diagnostic -schema version <code>1</code>. <code>gowdk inspect</code> emits JSON by default; <code>--json</code> is -accepted for scripts that pass a format flag consistently.</li><li><code>--warnings-as-errors</code>: supported by <code>check</code>; exits non-zero when warning -diagnostics are present.</li><li><code>gowdk doctor --json</code>: prints a versioned health report with overall status, -summary counts, environment metadata, and check records.</li><li><code>gowdk audit</code>: derives the security posture from validated IR, evaluates the -built-in security baseline against it, and reports findings. It exits non-zero -when any error-severity finding exists, so it can gate CI. -<code>--json</code> prints the posture manifest plus findings and a summary. Every finding -carries a diagnostic code; run <code>gowdk explain &lt;code&gt;</code> for details. -<code>--emit-tests</code> writes a readable standalone <code>gowdk_audit_test.go</code> file (or the -path from <code>--emit-tests=&lt;file&gt;</code>) that drives a <code>runtime/app</code> posture harness -through <code>runtime/testkit</code>. <code>--run</code> builds a temporary generated app from the -same validated IR and runs the generated app&#39;s audit test with -<code>go test ./gowdkapp</code>; a failed expectation is reported as -<code>audit_test_failed</code>. -<code>gowdk build</code> runs the same baseline gate, blocks production builds on -error-severity findings unless <code>--allow-insecure</code> is set, and writes the -posture alone to a non-served <code>.gowdk/reports/&lt;output-name&gt;/gowdk-security.json</code> -path outside the selected output directory.</li><li><code>--write</code>: supported by <code>fmt</code>; overwrites formatted files.</li><li><code>--dry-run</code>: supported by <code>fix</code> and <code>clean</code>; for <code>fix</code> it prints files with -available registered fixes without writing changes, and for <code>clean</code> it lists -the build outputs that would be removed without deleting anything.</li><li><code>--code</code>: supported by <code>fix</code>; limits rewrites to one diagnostic code that has -a registered fix.</li><li><code>--config</code>: supported by <code>add</code>, <code>check</code>, <code>doctor</code>, <code>audit</code>, <code>manifest</code>, <code>sitemap</code>, -<code>routes</code>, <code>endpoints</code>, <code>inspect</code>, <code>generate stubs</code>, and <code>build</code>; selects the -config file. Compile commands load a literal config subset from the given -path instead of the required default <code>gowdk.config.go</code>.</li><li><code>--env-file</code>: supported by project-aware compile/report commands that load -<code>gowdk.config.go</code>, including <code>check</code>, <code>doctor</code>, <code>audit</code>, <code>manifest</code>, -<code>sitemap</code>, <code>routes</code>, <code>endpoints</code>, <code>inspect</code>, <code>generate stubs</code>, and <code>build</code>; -forwarded through <code>dev</code> and <code>preview</code> as a build flag. Values from the file -are applied only when the process environment does not already define the -name. Without the flag, commands auto-load <code>.env.&lt;GOWDK_ENV&gt;</code> from the -project root when <code>GOWDK_ENV</code> is set and that file exists, otherwise <code>.env</code> -when present. Secret values are never printed; <code>doctor --json</code> reports only -the env-file path and variable names for file/process sources.</li><li><code>--debug</code>: supported by <code>build</code> and forwarded by <code>dev</code>; prints the structured SPA build report to stderr while generated paths remain on stdout.</li><li><code>--timings[=&lt;file&gt;]</code>: supported by <code>build</code>; writes a separate versioned JSON -timing report. Without an explicit file, the report is written to -<code>gowdk-build-timings.json</code> in the output root. Generated paths remain the -only stdout payload.</li><li><code>gowdk build</code> writes <code>contract_reference</code> build-report events for -<code>g:command</code> forms and <code>g:query</code> elements with <code>unknown</code>, <code>bound</code>, <code>missing</code>, -or <code>invalid</code> status.</li><li><code>gowdk check</code> and CLI <code>gowdk build</code> fail on linked <code>missing</code> or <code>invalid</code> -contract references, invalid contract handler signatures, and duplicate -command owners.</li><li><code>--allow-missing-backend</code>: supported by <code>build</code> and forwarded by <code>dev</code>; in production mode, allows missing or unsupported action/API handlers to generate HTTP 501 stubs instead of failing the build.</li><li>Security audit gate: <code>gowdk build</code> runs the same baseline as <code>gowdk audit</code> (see <a href="/docs/engineering/security/">security.md</a>). A production build (<code>Build.Mode = gowdk.Production</code>) fails on any error-severity finding (missing CSRF, guardless or public-by-omission endpoints, roleless contracts, bundled secrets, raw-HTML sinks); non-production builds print a prominent summary without blocking. <code>--allow-insecure</code> downgrades the production gate to a warning for 0.x experimentation. Run <code>gowdk audit</code> for the full report and to gate CI explicitly.</li><li><code>--obfuscate-assets</code>: supported by <code>build</code> and forwarded by <code>dev</code>; enables -deterministic production obfuscation/minification for compiler-owned -generated browser JavaScript, forces <code>Build.Mode</code> to <code>gowdk.Production</code> for -that build, records transformed assets in <code>gowdk-assets.json</code>, and writes -<code>asset_obfuscation</code> / <code>asset_obfuscated</code> build-report events. This is an -optimization/hardening option, not a security boundary.</li><li><code>--target</code>: supported by <code>build</code> and <code>clean</code>; may be repeated or comma-separated. For <code>build</code> it runs the selected <code>Build.Targets</code> entries; for <code>clean</code> it restricts removal to the selected targets&#39; outputs.</li><li><code>--module</code>: supported by <code>check</code>, <code>doctor</code>, <code>audit</code>, <code>manifest</code>, <code>sitemap</code>, <code>routes</code>, -<code>endpoints</code>, <code>inspect</code>, <code>generate stubs</code>, and <code>build</code>; may be repeated or -comma-separated, and limits discovery to selected configured modules when no -explicit file list is passed.</li><li><code>--out</code>: supported by <code>build</code> and <code>clean</code>; for <code>build</code> it selects the output directory and overrides <code>Build.Output</code>, and for <code>clean</code> it adds an extra output directory to remove alongside the configured outputs. <code>playground export</code> uses <code>--out</code> as the archive path. <code>playground run</code> uses <code>--out</code> as the generated output directory and never writes build output into the source project.</li><li><code>--app</code>: supported by <code>build</code>; writes generated Go app source that embeds the selected output directory.</li><li><code>--bin</code>: supported by <code>build</code>; requires <code>--app</code> and compiles the generated app with <code>go build -o &lt;file&gt;</code>.</li><li><code>--docker</code>: supported by <code>build</code>; requires <code>--bin</code> and emits <code>Dockerfile</code> -plus <code>.dockerignore</code> beside the compiled binary. The generated Dockerfile -runs <code>/app/site</code> as a non-root user on port <code>8080</code>.</li><li><code>--docker-base</code>: supported by <code>build</code> with <code>--docker</code>; selects -<code>distroless</code> or <code>scratch</code>. The default is <code>distroless</code>. <code>scratch</code> requires a -statically linked Linux ELF binary.</li><li><code>--deploy-recipe</code>: supported by <code>build</code>; may be repeated or comma-separated -and emits optional starter deployment recipes. Supported values are <code>static</code>, -<code>systemd</code>, <code>caddy</code>, <code>nginx</code>, and <code>split</code>. Recipes are starting points and do -not own secrets, domains, TLS, storage, backups, CDN policy, or rollout logic.</li><li><code>--wasm</code>: supported by <code>build</code>; requires <code>--app</code> and compiles the generated app with <code>GOOS=js GOARCH=wasm go build -o &lt;file&gt;</code>.</li><li><code>--backend-app</code>: supported by <code>build</code>; writes generated backend-only Go app source for feature-bound action/API endpoints.</li><li><code>--backend-bin</code>: supported by <code>build</code>; requires <code>--backend-app</code> and compiles the generated backend app with <code>go build -o &lt;file&gt;</code>.</li><li><code>--addr</code>: supported by <code>dev</code>, <code>preview</code>, and <code>serve</code>; selects the listen address and defaults to <code>127.0.0.1:8080</code>.</li><li><code>--interval</code>: supported by <code>dev</code>; sets the polling interval, such as <code>500ms</code>, <code>1s</code>, or <code>2s</code>.</li><li><code>--hot</code>: supported by <code>preview</code>; runs the dev loop against the preview output instead of serving a one-shot build.</li><li><code>--dir</code>: supported by <code>serve</code>; selects the generated build output directory. <code>playground export</code> and <code>playground run</code> use <code>--dir</code> as the source project directory and require a <code>gowdk.config.go</code> file there.</li><li><code>--allow-hosted-execution</code>: supported by <code>playground run</code>; explicitly opts into the local sandbox build bridge. Without it, playground execution fails closed because hosted execution is disabled by default.</li><li><code>--module-cache</code>: supported by <code>playground run</code>; mounts a caller-supplied per-session Go module cache as the (readable) lower layer inside the sandbox. Required on shared/multi-tenant runners so one session cannot read another&#39;s cached modules.</li><li><code>--allow-shared-module-cache</code>: supported by <code>playground run</code>; deliberately exposes the host <code>GOMODCACHE</code> to the sandbox instead of a per-session cache. Intended for local single-user use; <code>playground run</code> fails closed if neither this nor <code>--module-cache</code> is given.</li></ul><h2 id="examples">Examples</h2><pre><code class="language-sh">go run ./cmd/gowdk init --template site my-site -go run ./cmd/gowdk init --tests --template site my-tested-site -go run ./cmd/gowdk init --template minimal my-minimal-site -go run ./cmd/gowdk add --list -go run ./cmd/gowdk add --list --registry -go run ./cmd/gowdk add --list --registry --json -go run ./cmd/gowdk add ssr actions partial -go run ./cmd/gowdk add seo --base-url https://example.com -go run ./cmd/gowdk check examples/pages/home.page.gwdk -go run ./cmd/gowdk check --config gowdk.config.go -go run ./cmd/gowdk check --env-file .env.dev --config gowdk.config.go -go run ./cmd/gowdk check --warnings-as-errors --config gowdk.config.go -go run ./cmd/gowdk fix --dry-run --code old_action_block_syntax --config gowdk.config.go -go run ./cmd/gowdk check --ssr examples/ssr/dashboard.page.gwdk -go run ./cmd/gowdk explain missing_ssr_addon -go run ./cmd/gowdk explain --json spa_dynamic_route_missing_paths -go run ./cmd/gowdk audit --config gowdk.config.go -go run ./cmd/gowdk audit --json --ssr --config gowdk.config.go -go run ./cmd/gowdk audit --emit-tests --run --config gowdk.config.go -go run ./cmd/gowdk doctor -go run ./cmd/gowdk doctor --json -go run ./cmd/gowdk doctor --module frontend --ssr -go run ./cmd/gowdk manifest --module frontend --ssr -go run ./cmd/gowdk sitemap --module frontend --ssr -go run ./cmd/gowdk trace patients.CreatePatient -go run ./cmd/gowdk routes --module frontend --ssr -go run ./cmd/gowdk endpoints --module frontend --ssr -go run ./cmd/gowdk inspect ir --module frontend --ssr -go run ./cmd/gowdk inspect tree --json --module frontend --ssr -go run ./cmd/gowdk inspect endpoint-graph --json --module frontend --ssr -go run ./cmd/gowdk inspect asset-graph --json --module frontend --ssr -go run ./cmd/gowdk contracts --json . -go run ./cmd/gowdk graph . -go run ./cmd/gowdk list commands . -go run ./cmd/gowdk list events --json . -go run ./cmd/gowdk build --out /tmp/gowdk-build examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -go run ./cmd/gowdk build --debug --out /tmp/gowdk-build examples/pages/home.page.gwdk -go run ./cmd/gowdk build --allow-missing-backend --out /tmp/gowdk-build examples/actions/signup.page.gwdk -go run ./cmd/gowdk build --ssr --out /tmp/gowdk-ssr-build --app /tmp/gowdk-ssr-app --bin /tmp/gowdk-ssr-site examples/ssr/simple-ssr.page.gwdk -go run ./cmd/gowdk preview --out /tmp/gowdk-preview examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -go run ./cmd/gowdk dev --ssr --out /tmp/gowdk-ssr-build --app /tmp/gowdk-ssr-app examples/ssr/simple-ssr.page.gwdk -go run ./cmd/gowdk build --module frontend --module backend --out /tmp/gowdk-build -go run ./cmd/gowdk build --out /tmp/gowdk-build --app /tmp/gowdk-app --bin /tmp/gowdk-site examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -GOOS=linux CGO_ENABLED=0 gowdk build --out /tmp/gowdk-build --app /tmp/gowdk-app --bin /tmp/gowdk-site --docker examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-build --deploy-recipe static examples/pages/home.page.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-build --app /tmp/gowdk-app --bin /tmp/gowdk-site --deploy-recipe systemd,caddy examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -go run ./cmd/gowdk build --out /tmp/gowdk-build --app /tmp/gowdk-app --wasm /tmp/gowdk-site.wasm examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -go run ./cmd/gowdk build --module admin --out dist/admin --app .gowdk/admin --bin bin/admin -go run ./cmd/gowdk build --module admin --out dist/admin --app .gowdk/admin --wasm bin/admin.wasm -go run ./cmd/gowdk build --module public,admin --out dist/app --app .gowdk/app --bin bin/app -go run ./cmd/gowdk build --target admin -go run ./cmd/gowdk dev --out /tmp/gowdk-build examples/pages/home.page.gwdk examples/pages/hero.cmp.gwdk -go run ./cmd/gowdk dev --target admin --addr 127.0.0.1:8090 -go run ./cmd/gowdk serve --dir /tmp/gowdk-build -go run ./cmd/gowdk playground policy --json -go run ./cmd/gowdk playground export --dir my-site --out /tmp/my-site.zip -go run ./cmd/gowdk playground run --dir my-site --out /tmp/my-site-dist --allow-hosted-execution -</code></pre><p><code>init</code> creates a buildable starter project in the selected directory, or the -current directory when omitted. The default <code>site</code> template writes:</p><pre><code class="language-text">gowdk.config.go -src/pages/home.page.gwdk -src/components/hero.cmp.gwdk -styles/global.css -</code></pre><p>Passing <code>--tests</code> also writes:</p><pre><code class="language-text">tests/gowdk_smoke_test.go -</code></pre><p>The smoke test skips by default. Set <code>GOWDK_BIN=/path/to/gowdk</code> to make it run -<code>gowdk build</code> from the scaffolded project root and assert that <code>index.html</code> and -<code>bin/site</code> were generated.</p><p><code>add</code> rewrites <code>gowdk.config.go</code> through the Go AST and <code>go/format</code>. It knows -the built-in addon packages listed in <a href="/docs/reference/addons/">addons.md</a>, inserts missing -imports, appends <code>&lt;addon&gt;.Addon()</code> to <code>Config.Addons</code>, and skips constructors -that are already present. It does not install third-party modules or rewrite -non-literal config expressions.</p><p>The generated config discovers <code>src/**/*.gwdk</code>, discovers CSS under -<code>styles/**/*.css</code>, declares a <code>site</code> build target, generates app source in -<code>.gowdk/site</code>, compiles <code>bin/site</code>, and writes <code>.gitignore</code> entries for -generated outputs. The target&#39;s intermediate build output is inferred as -<code>.gowdk/output/site</code>. Existing starter files are not overwritten unless -<code>--force</code> is passed. The <code>minimal</code> template skips the starter component and -writes only the config, <code>.gitignore</code>, one page, and one CSS file.</p><p><code>check</code>, <code>audit</code>, <code>manifest</code>, <code>sitemap</code>, <code>routes</code>, <code>build</code>, and <code>dev</code> require a config -file before they compile or validate <code>.gwdk</code> code. By default they load -<code>gowdk.config.go</code> from the current directory; <code>--config &lt;file&gt;</code> can point at a -different config for project examples or one-off checks.</p><p>These commands accept explicit file paths, but explicit paths do not remove the -config requirement. If no files are passed, commands discover configured root -<code>Source.Include</code> globs plus configured module sources, or <code>**/*.gwdk</code> when the -loaded config does not declare source includes. <code>--module</code> limits discovery to -selected configured modules and skips root <code>Source.Include</code>; explicit file -paths still bypass discovery. A module with a name and no explicit include uses -<code>&lt;module-name&gt;/**/*.gwdk</code>. Discovery excludes <code>.git</code>, <code>vendor</code>, <code>node_modules</code>, -<code>testdata</code>, root/module <code>Source.Exclude</code> globs, and the configured build output -directory when one exists. <code>build --out</code> overrides <code>Build.Output</code>; one of them -is required for <code>build</code>. Every successful disk build writes -<code>gowdk-build-report.json</code> to the output root. The report includes validation, -planning, write, manifest, cache-policy, cleanup, and completion events; -request-time SSR/hybrid pages that are intentionally skipped from static -prerender output appear as <code>request_time_page_skipped</code> events. Passing <code>--debug</code> -prints the same build report to stderr without changing stdout artifact-path -output. Passing -<code>--timings</code> writes <code>gowdk-build-timings.json</code> next to the build report, or -<code>--timings=&lt;file&gt;</code> writes the timing JSON to a custom path; timing data is kept -out of <code>gowdk-build-report.json</code> so normal build reports stay deterministic. -<code>gowdk dev</code> -uses <code>gowdk_cache</code> as its default output directory unless <code>--out &lt;dir&gt;</code> or one -selected build target supplies or infers an output directory.</p><p>For generated apps and binaries, the selected modules are the packaging set: -<code>--app</code> copies the selected build output; <code>--bin</code> and <code>--wasm</code> embed it. Prefer -<code>Build.Targets</code> in <code>gowdk.config.go</code> for repeatable packaging. Target <code>Output</code> -is optional; when omitted, it defaults to <code>.gowdk/output/&lt;target-name&gt;</code>. With -targets configured, <code>gowdk build</code> runs all targets when no ad hoc output, -module, app, binary, or explicit file arguments are passed; <code>gowdk build --target &lt;name&gt;</code> runs selected targets. <code>--target</code> cannot be combined with -<code>--module</code>, <code>--out</code>, <code>--app</code>, <code>--bin</code>, <code>--wasm</code>, or explicit files. The ad hoc -flags remain useful for one-off builds.</p><p><code>clean</code> removes the generated build outputs declared by the project config: the -top-level <code>Build.Output</code> directory and, when <code>Build.Targets</code> are configured, -each target&#39;s <code>Output</code>, <code>App</code>, <code>Binary</code>, <code>WASM</code>, <code>BackendApp</code>, and -<code>BackendBinary</code> paths. <code>--target</code> restricts removal to selected targets and -<code>--out</code> adds an extra directory. It only ever deletes configured output paths -inside the project root — it refuses to remove the project root itself or any -path that resolves outside it, and it never touches the source tree. Use -<code>--dry-run</code> to list what would be removed and <code>--json</code> for tooling. This is more -than <code>rm -rf</code>: it reads <code>gowdk.config.go</code> so the right paths are removed even -when outputs are customized or spread across targets.</p><p><code>env</code> and <code>benchmark</code> were considered and intentionally <strong>not</strong> added. <code>env</code> -would duplicate <code>gowdk doctor</code> (which already reports the resolved Go toolchain, -CLI version, config, and tool availability, with <code>--json</code>) and Go&#39;s own -<code>go env</code>. <code>benchmark</code> would duplicate <code>gowdk build --timings</code>, which already -writes per-phase compiler timings, and Go&#39;s native <code>go test -bench</code>; broader -performance work is tracked in issue #414. Adding either would split one source -of truth across redundant commands.</p><p><code>doctor</code> checks the local GOWDK environment and current project without writing -files. It verifies the Go toolchain, CLI version, config loading, source -discovery, language validation, route metadata construction, and relevant -optional tools such as Tailwind or Node. Missing config and language failures -are errors. Missing optional tools are warnings when the project appears to use -them. The command exits non-zero only when at least one check is an error.</p><p><code>audit</code> reports the security posture, not the environment. It derives a -declarative posture from validated IR — every route, backend endpoint, and -contract with its guards, CSRF state, body limit, and source location — and -evaluates the built-in security baseline against it. The baseline encodes the -production-readiness gates from <code>docs/engineering/security.md</code> (for example: -actions, commands, and state-changing APIs must enforce CSRF, and APIs must not -be public by omission). -Findings carry a diagnostic code, a <code>file:line</code>, and remediation; run -<code>gowdk explain &lt;code&gt;</code> for details. <code>gowdk build</code> runs the same baseline gate -before writing output: production builds fail on error-severity findings unless -<code>--allow-insecure</code> is set, while non-production builds warn. The posture alone is -also emitted as <code>gowdk-security.json</code> by <code>gowdk build</code>, but outside the selected -output directory in a non-served <code>.gowdk/reports/&lt;output-name&gt;/</code> path. -Declared <code>*.audit.gwdk</code> policies are discovered with the rest of the source -set. <code>--emit-tests</code> writes a committable standalone <code>_test.go</code>; <code>--run</code> builds a -temporary generated app, executes <code>go test ./gowdkapp</code>, and folds failures back -into the audit report.</p><p><code>--wasm</code> produces a Go <code>js/wasm</code> compile artifact from the generated app. This -is a deploy artifact for hosts that can run Go WebAssembly; it is separate from -component-level browser island assets emitted for <code>wasm</code> components.</p><p><code>dev</code> is the one-command SPA development loop. It forwards non-dev flags to -<code>build</code>, resolves the output directory from <code>--out</code>, exactly one selected -<code>Build.Targets</code> entry, or the default <code>gowdk_cache</code> dev output, serves that -directory, polls explicit or discovered build inputs plus the loaded config -file, prints changed/added/removed input paths, rebuilds after content changes, -and injects a tiny server-sent-events live-reload script into served HTML pages. -Rebuild failures are printed and the last successful output keeps serving. See -<a href="/docs/reference/dev/">dev.md</a> for HMR, polling, browser overlay, restart, and last-good-build -behavior.</p><p>Build output, route/asset manifests, generated <code>go.mod</code>, generated -<code>gowdkapp/app.go</code>, generated <code>cmd/server/main.go</code>, and embedded build output -files are only rewritten when their bytes change, which keeps local dev loops -from retriggering on no-op generation. For plain SPA <code>--out</code> builds, page-only -source edits use an incremental SPA renderer that validates the full compiler -IR, refreshes manifests, writes only changed page output, and removes stale route -output for changed pages. Component, layout, CSS, config, source-set, target, -app, binary, and WASM changes use the full build path.</p><p>Generated apps created with <code>--app</code> read <code>GOWDK_APP_ID</code>, <code>GOWDK_MODULE_NAME</code>, -and <code>GOWDK_INSTANCE_ID</code>, expose <code>/_gowdk/health</code>, and include identity in -<code>X-GOWDK-*</code> response headers. If <code>GOWDK_INSTANCE_ID</code> is omitted, the generated -app creates one at process start; set it explicitly when deployment code needs a -stable ID. <code>GOWDK_MODULE_NAME</code> is runtime identity metadata; it does not change -which modules were embedded. Embedded module composition is fixed at build time -by <code>Build.Targets</code> or the selected <code>--module</code> flags.</p><p><code>gowdk routes</code> prints validated route and endpoint metadata as JSON. The current -schema is version <code>1</code>. The <code>routes</code> list is the generated method/path table: -it includes page/file route kinds such as <code>static</code>, <code>spa</code>, <code>ssr</code>, and <code>hybrid</code>, -plus generated endpoint rows for actions, APIs, fragments, and routable command -or query contracts. Route records include package, guards, source file, source -span, and planned handler. Page rows include render/cache metadata, route -params, and layouts. Endpoint rows include <code>endpointSource</code>, <code>directive</code>, -symbol or contract name, no-store backend cache policy, route params when -declared, CSRF applicability, and binding status when known.</p><p>Backend actions, APIs, fragments, and routable command/query contracts also -appear in the separate <code>endpoints</code> list with detailed backend or contract -binding metadata. Backend binding metadata includes the Go -package name, import path when known, handler symbol, signature/input metadata -when bound, status, and binding message. Non-fatal route-mode notes, such as -request-time page rendering disabled on a SPA route or static SPA output -disabled on an SSR route, appear in <code>info</code> and are also mirrored to stderr as -<code>info:</code> console lines.</p><p><code>gowdk endpoints</code> uses the same project loading, validation, binding, and -contract-reference scan as <code>gowdk routes</code>, but prints only the versioned -<code>endpoints</code> report. Use it when tooling needs backend surface metadata without -page route records or route-mode notes.</p><p><code>gowdk inspect ir</code> prints the validated compiler IR. <code>gowdk inspect tree</code> prints -a versioned source-linked node tree with <code>program</code>, <code>package</code>, <code>page</code>, -<code>component</code>, <code>layout</code>, <code>route</code>, <code>endpoint</code>, <code>contract-reference</code>, <code>view</code>, -<code>element</code>, <code>component-call</code>, and <code>text</code> nodes. Each node has a stable <code>id</code>, -<code>kind</code>, optional <code>name</code>, source path, source span when known, node-specific -<code>props</code>, and ordered <code>children</code>. The tree report also exposes additive -<code>renders_component</code> edges for resolved component calls, plus -<code>component_composition_cycle</code> diagnostics when component composition cycles are -found.</p><p><code>gowdk inspect endpoint-graph</code> prints a versioned graph with <code>page</code>, <code>route</code>, -<code>endpoint</code>, <code>handler</code>, <code>guard</code>, <code>contract</code>, and <code>structural</code> nodes plus -deterministic <code>declares</code>, <code>owns_endpoint</code>, <code>handled_by</code>, <code>uses_guard</code>, -<code>references_contract</code>, and <code>dispatches</code> edges. Structural nodes represent -source view elements that declare <code>g:post</code>, <code>g:command</code>, <code>g:query</code>, or -<code>g:on:*</code>; resolvable action and command/query elements point at the generated -endpoint node they dispatch to. Endpoint nodes include method/path, source -kind, cache, guards, CSRF policy, binding status, signature, and input type -when available. The graph is additive on top of <code>gowdk routes</code>/<code>gowdk endpoints</code>; keep those commands for stable route and endpoint report -integrations.</p><p><code>gowdk inspect asset-graph</code> prints a versioned graph with source owners, -templates, and declared assets. Asset nodes include kind, package, owner, -source path, declared asset path, inline status, use alias/package metadata, -and scope/hash metadata when available. Use it to debug which page or component -introduced CSS, JavaScript, component file assets, or WASM asset declarations -before checking generated build output manifests.</p><p><code>gowdk inspect go-bindings</code> prints a versioned report of Go interop bindings: -actions, APIs, fragments, SSR load functions, build-time Go function calls, and -web command/query contract references where those surfaces exist. Records -include source, package, expected symbol, package path when known, method/path -for request-time handlers, binding status, signature/input metadata, message, -and a suggested next step for missing or unsupported bindings.</p><p><code>gowdk playground policy</code> prints the sandbox contract used by local and future -hosted playground execution. <code>gowdk playground export</code> creates a normal source -project archive and omits generated <code>.gowdk/</code>, <code>dist/</code>, <code>bin/</code>, <code>gowdk_cache/</code>, -dependency vendor folders, local env files, private keys, temp files, and -generated reports. <code>gowdk playground run</code> stages the same allowed files into a -disposable workspace and then re-executes the <code>gowdk</code> binary inside an OS-level -Linux namespace sandbox (no network, <code>pivot_root</code> away from the host filesystem, -resource limits, dropped capabilities, <code>no_new_privs</code>) with isolated Go caches -and <code>GOPROXY=off</code>, <code>GOSUMDB=off</code>, <code>GOWORK=off</code>. It requires -<code>--allow-hosted-execution</code> and a module-cache choice (<code>--module-cache &lt;dir&gt;</code> or -<code>--allow-shared-module-cache</code>), needs a fresh empty <code>--out</code> directory, and fails -closed where the sandbox is unavailable (non-Linux hosts or disabled -unprivileged user namespaces).</p><p><code>gowdk generate stubs</code> writes missing action/API handler stubs to -<code>gowdk_stubs.go</code> beside the owning source package. It refuses to overwrite an -existing stub file and does not generate load, fragment, command, query, or -unsupported-signature replacements. The generated code is normal importable Go -that should be edited or moved into app-owned files before serious use.</p><p><code>openapi.json</code> describes the routable web surface: actions, APIs, fragments, -and web-routable command/query contract references. It includes paths, methods, -path/query/form request schemas when input fields are known, and deterministic -named response schema references. Command/query result structs are expanded -when the scanner can resolve supported exported JSON fields; otherwise the -report keeps the deterministic shallow named schema with the Go type marker.</p><p><code>asyncapi.json</code> describes integration-event contract registrations. Local event -payload structs and resolvable imported event payload structs contribute -JSON-field schemas. Unsupported or unresolvable imported payloads fall back to -deterministic shallow named object schemas with the Go type marker. Domain and -presentation events are excluded from the default report.</p><p><code>gowdk inspect ir</code> prints the validated <code>internal/gwdkir.Program</code> compiler IR as -JSON. This is an M2 compiler-spine debugging and snapshot surface, not a stable -public schema yet. It uses the same project config, discovery, validation, -backend binding, and contract-reference checks as the other compile commands.</p><p><code>gowdk explain &lt;diagnostic-code&gt;</code> prints the registry metadata, stability, -summary, next steps, and examples when available for a diagnostic code. It does -not read project config or source files. Unknown codes fail with close-code -suggestions. Use <code>--json</code> for editor and tooling integrations. See -<a href="/docs/reference/diagnostic-codes/">diagnostic-codes.md</a> for the registry and stability -policy.</p><p>Current <code>build</code> limitations: it emits app-shell HTML files, -<code>gowdk-routes.json</code>, <code>gowdk-assets.json</code>, <code>openapi.json</code>, <code>asyncapi.json</code>, -<code>gowdk-build-report.json</code>, generated embedded app source, and an optional -generated binary for build-time pages with non-dynamic routes or literal -<code>paths {}</code> dynamic routes, literal <code>build {}</code> data, lowercase HTML markup, -imported or same-package Go build data functions returning <code>T</code>, <code>(T, error)</code>, -or the equivalent <code>gowdk.BuildParams</code> route-aware signatures, -component files with string props, supported action redirect handlers with form -decoder wrappers and required-field validation, and supported action fragment -responses for partial requests.</p><p>Current generated binary limitations: it serves embedded build output files for -the selected build output and local POST endpoints for the supported action -subset, including form input decoder wrappers, required-field validation, CSRF -validation by default for generated action POSTs, command POSTs, and -state-changing APIs, action fragment responses for -<code>X-GOWDK-Partial</code> requests, standalone fragment routes, feature-bound API -handlers, guards, and concrete or dynamic SSR pages rendered from <code>view {}</code> -and literal or imported <code>build {}</code> data. Hybrid pages use the same generated -request-time page path with or without declared <code>server {}</code> data and appear as -<code>hybrid</code> routes in <code>gowdk routes</code>. It does not stream hybrid responses, refresh -hybrid server data in place, or run non-HTTP revalidation today.</p><p>Current <code>serve</code> limitations: it serves generated build output files only. It does not -run generated actions, APIs, partial fragments, or SSR routes.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/config/index.html b/docs-site/dist/site/docs/reference/config/index.html deleted file mode 100644 index 177055bb..00000000 --- a/docs-site/dist/site/docs/reference/config/index.html +++ /dev/null @@ -1,494 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Config Reference - GOWDK</title> - <meta name="description" content="The root package exposes config types used by compiler and future generated app behavior."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Config Reference - GOWDK"> - <meta property="og:description" content="The root package exposes config types used by compiler and future generated app behavior."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Config Reference - GOWDK"> - <meta name="twitter:description" content="The root package exposes config types used by compiler and future generated app behavior."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Config Reference</h1><p class="doc-lead">The root package exposes config types used by compiler and future generated app behavior.</p></header><article class="prose"><p>The root package exposes config types used by compiler and future generated app behavior.</p><pre><code class="language-go">type Config struct { - AppName string - Source SourceConfig - Modules []ModuleConfig - Render RenderConfig - Env EnvConfig - Lifecycle LifecycleConfig - Build BuildConfig - CSS CSSConfig - Addons []Addon -} -</code></pre><h2 id="source">Source</h2><p><code>gowdk.config.go</code> is required for CLI commands that compile, validate, inspect, -or serve a development loop for <code>.gwdk</code> code: <code>check</code>, <code>manifest</code>, <code>sitemap</code>, -<code>routes</code>, <code>inspect ir</code>, <code>build</code>, and <code>dev</code>. Those commands load -<code>gowdk.config.go</code> from the current directory by default, or the file passed -with <code>--config &lt;file&gt;</code>.</p><p><code>SourceConfig</code> has include and exclude patterns. Discovery support exists in -<code>internal/discover</code>, and <code>gowdk build</code> reads literal <code>Source.Include</code> and -<code>Source.Exclude</code> fields from the loaded config when no explicit files are -supplied. Explicit file paths still require a loaded config.</p><p><code>Modules</code> declares named source groups. Build discovery treats modules as -source selectors. Generated app and binary composition is controlled by the -modules selected for a specific build command.</p><p>Supported initial config subset:</p><pre><code class="language-go">package app - -import &#34;github.com/cssbruno/gowdk&#34; - -var Config = gowdk.Config{ - Source: gowdk.SourceConfig{ - Include: []string{&#34;src/**/*.gwdk&#34;}, - Exclude: []string{&#34;src/**/draft.page.gwdk&#34;}, - }, - Modules: []gowdk.ModuleConfig{ - {Name: &#34;frontend&#34;, Type: &#34;frontend&#34;}, - { - Name: &#34;frontend2&#34;, - Type: &#34;marketing-ui&#34;, - Source: gowdk.SourceConfig{ - Include: []string{&#34;ui2/**/*.gwdk&#34;}, - }, - }, - { - Name: &#34;backendmicroservice&#34;, - Type: &#34;backendmicroservice&#34;, - Source: gowdk.SourceConfig{ - Include: []string{&#34;services/backend/**/*.gwdk&#34;}, - Exclude: []string{&#34;services/backend/**/draft.page.gwdk&#34;}, - }, - }, - }, - Build: gowdk.BuildConfig{ - Output: &#34;dist/site&#34;, - Mode: gowdk.Production, - Head: gowdk.HeadConfig{ - SiteName: &#34;Example&#34;, - Favicon: &#34;/favicon.ico&#34;, - Image: &#34;https://example.com/social.png&#34;, - TwitterCard: &#34;summary&#34;, - }, - Stylesheets: []gowdk.Stylesheet{ - {Href: &#34;/assets/app.css&#34;}, - }, - Scripts: []gowdk.Script{ - {Src: &#34;/assets/app.js&#34;, Type: &#34;module&#34;}, - }, - Targets: []gowdk.BuildTargetConfig{ - { - Name: &#34;admin&#34;, - Modules: []string{&#34;admin&#34;}, - Output: &#34;dist/admin&#34;, - App: &#34;.gowdk/admin&#34;, - Binary: &#34;bin/admin&#34;, - WASM: &#34;bin/admin.wasm&#34;, - DeployRecipes: []string{&#34;systemd&#34;}, - }, - { - Name: &#34;public-admin&#34;, - Modules: []string{&#34;public&#34;, &#34;admin&#34;}, - Output: &#34;dist/public-admin&#34;, - App: &#34;.gowdk/public-admin&#34;, - Binary: &#34;bin/public-admin&#34;, - }, - }, - }, - Env: gowdk.EnvConfig{ - Vars: []gowdk.EnvVar{ - {Name: &#34;GOWDK_BACKEND_ORIGIN&#34;, Required: true}, - {Name: &#34;GOWDK_ADDR&#34;, Default: &#34;127.0.0.1:8080&#34;}, - }, - Secrets: []gowdk.SecretEnv{ - {Name: &#34;DATABASE_URL&#34;, Required: true}, - {Name: &#34;GOWDK_CSRF_SECRET&#34;, Required: true}, - }, - }, - Lifecycle: gowdk.LifecycleConfig{ - Services: []gowdk.ServiceRef{ - {ImportPath: &#34;example.com/site/services&#34;, Function: &#34;Services&#34;}, - }, - }, - CSS: gowdk.CSSConfig{ - Include: []string{&#34;styles/**/*.css&#34;}, - Default: []string{&#34;global&#34;, &#34;tokens&#34;}, - }, -} -</code></pre><p>The CLI first parses this file as a literal config subset. Unknown top-level -<code>gowdk.Config</code> fields are rejected instead of silently ignored. When a supported -field contains non-literal Go that the subset cannot reduce safely, the loader -falls back to the executable config bridge described below.</p><p>Addon constructors outside the built-in AST subset are loaded through a small -Go helper that imports the config package. That means addon packages are normal -Go modules:</p><pre><code class="language-go">import brand &#34;github.com/example/gowdk-brand&#34; - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - brand.Addon(), - }, -} -</code></pre><p>The addon module may import other GitHub/private/local modules. The project -<code>go.mod</code> remains the source of truth for resolving those imports, including -<code>require</code>, <code>replace</code>, <code>GOPRIVATE</code>, and module proxy configuration.</p><h2 id="lifecycle-services">Lifecycle Services</h2><p><code>Lifecycle.Services</code> declares app-owned service providers imported by the -generated app binary:</p><pre><code class="language-go">type LifecycleConfig struct { - Services []ServiceRef -} - -type ServiceRef struct { - ImportPath string - Function string -} -</code></pre><p>Each provider must be an exported no-argument function with this signature:</p><pre><code class="language-go">func Services() ([]app.Service, error) -</code></pre><p>Provider packages import <code>github.com/cssbruno/gowdk/runtime/app</code> and return -<code>app.Service</code> values. The config loader validates that <code>ImportPath</code> and -<code>Function</code> are present; the generated app Go build validates that the symbol -exists and has the right signature.</p><p>Lifecycle services are generic process hooks. Use them for workers, metrics -listeners, protocol bridges, and app-owned servers. MCP adapters belong in app -code or an external package that returns lifecycle services; GOWDK does not -ship a core MCP addon or runtime package.</p><h2 id="generated-app-request-guards">Generated App Request Guards</h2><p>When generated SSR, action, API, or fragment routes declare <code>guard</code>, the -generated app package can expose guard registration hooks. If <code>auth.Addon</code> is -configured, generated startup registers the default <code>auth.required</code> guard and a -session-backed provider for native <code>role:</code> / <code>permission:</code> guard IDs from the -addon options.</p><p>Custom guard IDs still require a generated app hook:</p><pre><code class="language-go">package gowdkapp - -import gowdkguard &#34;github.com/cssbruno/gowdk/runtime/guard&#34; - -func GOWDKGuardRegistry() gowdkguard.Registry { - return gowdkguard.Registry{ - &#34;auth.required&#34;: func(ctx gowdkguard.Context) error { - return nil - }, - } -} -</code></pre><p>Native RBAC guard IDs such as <code>role:admin</code> and <code>permission:patients.read</code> use -an application-owned principal source instead of a custom guard function:</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - gowdkauth &#34;github.com/cssbruno/gowdk/runtime/auth&#34; -) - -func GOWDKAuthProvider() gowdkauth.Provider { - return gowdkauth.ProviderFunc(func(request *http.Request) (*gowdkauth.Principal, error) { - return &amp;gowdkauth.Principal{ID: &#34;user-1&#34;, Roles: []string{&#34;admin&#34;}}, nil - }) -} -</code></pre><p>This file belongs with generated app startup code, not inside feature packages -that declare handlers. Missing required backing functions fail the generated app -Go build when no addon supplies them. Guard errors still return HTTP 403 before -SSR load functions, action decoding, API handlers, or user business logic run.</p><p>Native RBAC guards are a defense-in-depth redundancy layer for generated -route/page access. They must never replace backend authorization inside -handlers, services, repositories, or external systems.</p><p>See <a href="/docs/reference/hooks/">hooks.md</a> for guard, rate-limit, and middleware ordering.</p><h2 id="modules">Modules</h2><p><code>ModuleConfig</code> names a logical source group:</p><pre><code class="language-go">type ModuleConfig struct { - Name string - Type string - Source SourceConfig -} -</code></pre><p><code>Type</code> is user-defined metadata in the current build slice. GOWDK does not -validate or reserve type values, so projects can use values such as <code>frontend</code>, -<code>frontend2</code>, <code>backend</code>, <code>backendmicroservice</code>, <code>worker</code>, or any local module -role. Deployment code remains user-owned; GOWDK does not infer Kubernetes or -deployment settings from module type.</p><p>When <code>gowdk build</code> discovers files and a module has a name but no -<code>Source.Include</code>, it uses <code>&lt;module-name&gt;/**/*.gwdk</code>. For example, -<code>{Name: &#34;frontend&#34;}</code> discovers <code>frontend/**/*.gwdk</code>. Explicit module include -patterns override that default for the module. Root <code>Source.Exclude</code> and module -<code>Source.Exclude</code> patterns are both honored. <code>gowdk build --module &lt;name&gt;</code> limits -discovery to selected configured modules.</p><p>The selected modules define what gets compiled into the build output and, when -<code>--app</code> or <code>--bin</code> is used, what is copied into the generated app and embedded -in the generated binary. Ad hoc CLI flags can still package modules directly:</p><pre><code class="language-sh"># Single-module binary. -gowdk build --module admin --out dist/admin --app .gowdk/admin --bin bin/admin - -# Multi-module binary. -gowdk build --module public --module admin --out dist/app --app .gowdk/app --bin bin/app - -# Separate binaries with different module sets. -gowdk build --module public --out dist/public --app .gowdk/public --bin bin/public -gowdk build --module admin,api --out dist/admin-api --app .gowdk/admin-api --bin bin/admin-api -</code></pre><p>Use distinct <code>--out</code> and <code>--app</code> directories for separate binaries so stale -artifacts from another module selection cannot be copied into the next binary.</p><h2 id="render">Render</h2><p><code>RenderConfig.Default</code> controls the default render mode. When omitted, default mode is <code>spa</code>.</p><h2 id="env">Env</h2><p><code>EnvConfig</code> declares the runtime environment contract. Config owns the names, -required flags, and safe non-secret defaults. Deployment owns all values.</p><pre><code class="language-go">type EnvConfig struct { - Vars []gowdk.EnvVar - Secrets []gowdk.SecretEnv -} - -type EnvVar struct { - Name string - Required bool - Default string -} - -type SecretEnv struct { - Name string - Required bool -} -</code></pre><p>Use <code>Vars</code> for normal runtime settings:</p><pre><code class="language-go">Env: gowdk.EnvConfig{ - Vars: []gowdk.EnvVar{ - {Name: &#34;GOWDK_ADDR&#34;, Default: &#34;127.0.0.1:8080&#34;}, - {Name: &#34;GOWDK_BACKEND_ORIGIN&#34;, Required: true}, - }, -} -</code></pre><p>Use <code>Secrets</code> for secret names:</p><pre><code class="language-go">Env: gowdk.EnvConfig{ - Secrets: []gowdk.SecretEnv{ - {Name: &#34;DATABASE_URL&#34;, Required: true}, - {Name: &#34;GOWDK_CSRF_SECRET&#34;, Required: true}, - }, -} -</code></pre><p>Validation runs when <code>gowdk.config.go</code> is loaded. Required names that are unset -or blank in the host environment fail with a direct diagnostic such as -<code>DATABASE_URL is required but is not set</code>. Required vars with <code>Default</code> are -treated as satisfied by the default. Secrets have no <code>Default</code> or value field by -type; <code>Default</code> and <code>Value</code> are rejected in literal config parsing too.</p><p>Project-aware CLI commands can load local env files before validation:</p><pre><code class="language-sh">gowdk check --env-file .env.dev -gowdk build --env-file .env.production -</code></pre><p>If <code>--env-file</code> is omitted, GOWDK auto-loads <code>.env.&lt;GOWDK_ENV&gt;</code> from the -project root when <code>GOWDK_ENV</code> is set and the file exists, otherwise <code>.env</code> when -present. Process environment values always win over file values. The file is -only a value source for the same validation contract; it does not bypass -<code>Required</code> or <code>MinBytes</code>.</p><p>The same name cannot appear in both <code>Vars</code> and <code>Secrets</code>. Secret-looking var -names ending in <code>_SECRET</code>, <code>_TOKEN</code>, <code>_PASSWORD</code>, or <code>_KEY</code> are rejected and -must move to <code>Secrets</code>. Diagnostics print names only and never print values.</p><p>Generated app binaries repeat the required env check before serving requests. -For direct binary runs, set <code>GOWDK_ENV_FILE=/path/to/.env</code> or place <code>.env</code> in -the process working directory. This is a startup redundancy layer only. It does -not replace backend -authorization, handler validation, database checks, deployment secrets, or -runtime-specific security controls.</p><h2 id="build">Build</h2><p><code>BuildConfig.Output</code>, <code>BuildConfig.Mode</code>, <code>BuildConfig.Assets</code>, -<code>BuildConfig.ObfuscateAssets</code>, -<code>BuildConfig.Head</code>, <code>BuildConfig.CSRF</code>, <code>BuildConfig.SecurityHeaders</code>, <code>BuildConfig.BodyLimits</code>, -<code>BuildConfig.AllowMissingBackend</code>, <code>BuildConfig.Stylesheets</code>, -<code>BuildConfig.Scripts</code>, and <code>BuildConfig.Targets</code> are target build settings. -Current <code>gowdk build</code> reads literal <code>Build.Output</code>, <code>Build.Mode</code>, -<code>Build.ObfuscateAssets</code>, <code>Build.Head</code>, <code>Build.CSRF</code>, -<code>Build.SecurityHeaders</code>, <code>Build.BodyLimits</code>, <code>Build.AllowMissingBackend</code>, -<code>Build.Stylesheets</code>, <code>Build.Scripts</code>, and <code>Build.Targets</code> from -<code>gowdk.config.go</code>; <code>--out</code> overrides <code>Build.Output</code> for ad hoc builds and -<code>--obfuscate-assets</code> overrides <code>Build.Mode</code> to production for that build. -<code>BuildConfig.Assets</code> remains planned.</p><p><code>Build.Targets</code> declares repeatable module-to-output packaging:</p><pre><code class="language-go">type BuildConfig struct { - Output string - Mode gowdk.BuildMode - Assets gowdk.AssetMode - ObfuscateAssets bool - Head gowdk.HeadConfig - CSRF gowdk.CSRFConfig - SecurityHeaders gowdk.SecurityHeadersConfig - BodyLimits gowdk.BodyLimitsConfig - AllowMissingBackend bool - Stylesheets []gowdk.Stylesheet - Scripts []gowdk.Script - Targets []gowdk.BuildTargetConfig -} - -type HeadConfig struct { - SiteName string - Favicon string - Image string - TwitterCard string -} - -type CSRFConfig struct { - Enabled bool - Disabled bool - SecretEnv string - CookieName string - FieldName string - HeaderName string - Insecure bool -} - -type SecurityHeadersConfig struct { - Enabled bool - Headers map[string]string -} - -type BodyLimitsConfig struct { - ActionBytes int64 - APIBytes int64 -} - -type Script struct { - Src string - Type string -} - -type BuildTargetConfig struct { - Name string - Modules []string - Output string - App string - Binary string - WASM string - BackendApp string - BackendBinary string - DeployRecipes []string -} -</code></pre><p><code>Mode</code> controls development metadata in generated frontend artifacts. The -default omitted mode behaves like <code>gowdk.Development</code> and emits JavaScript -island source maps. Set <code>Mode: gowdk.Production</code> to omit <code>.js.map</code> artifacts and -<code>sourceMappingURL</code> comments and to compact generated island JavaScript.</p><p><code>ObfuscateAssets</code> is a production-only optimization/hardening switch for -compiler-owned generated browser JavaScript such as the SPA/partial runtime, -store runtime, island runtime/stubs, and WASM loader glue. It uses deterministic -minification/identifier shortening, disables generated source maps through -production mode, records transformed assets in <code>gowdk-assets.json</code>, and writes -<code>asset_obfuscation</code> / <code>asset_obfuscated</code> build-report events. It is not a -security boundary and does not replace server-side auth, guards, CSRF, -validation, or handler authorization. Configs that set <code>ObfuscateAssets: true</code> -must also set <code>Mode: gowdk.Production</code>; the CLI flag <code>--obfuscate-assets</code> -sets both for the current build.</p><p>Production mode also requires explicitly declared <code>act</code> and <code>api</code> endpoints to -bind to supported same-package Go handlers. Missing or unsupported handlers fail -the build by default. Set <code>AllowMissingBackend: true</code> or pass -<code>--allow-missing-backend</code> when intentionally generating HTTP 501 stubs during a -migration.</p><p><code>Head</code> controls app-level document head tags. <code>Favicon</code> emits -<code>&lt;link rel=&#34;icon&#34;&gt;</code>. <code>SiteName</code>, <code>Image</code>, and <code>TwitterCard</code> enable generated -Open Graph and Twitter metadata. A page-level <code>image</code> overrides <code>Head.Image</code> -for that page.</p><p><code>Scripts</code> declares global script tags emitted into every GOWDK-generated HTML -document. Use page or component <code>js &#34;./file.js&#34;</code>, <code>js &#34;./file.ts&#34;</code>, or inline -<code>js {}</code> declarations when a browser module should be emitted and linked only -where that page/component is used.</p><p><code>CSRF</code> controls generated action and web-command CSRF wiring. CSRF is enabled by -default for generated state-changing form endpoints. Generated apps require a -signing secret from <code>SecretEnv</code> or <code>GOWDK_CSRF_SECRET</code>, inject a hidden token -field into served HTML POST forms, and validate POSTs before generated decoding -or user handlers run. Invalid or missing tokens return HTTP 403 with -<code>invalid csrf token</code> and <code>Cache-Control: no-store</code>. Set <code>Disabled: true</code> only -for an intentional non-production/test opt-out. <code>Enabled</code> is retained for older -configs but is no longer required. <code>CookieName</code>, <code>FieldName</code>, and <code>HeaderName</code> -override the generated token transport names. -<code>Insecure</code> is for local HTTP development only: it disables the Secure cookie -flag, uses the default cookie name <code>gowdk-csrf</code> instead of -<code>__Host-gowdk-csrf</code>, and rejects explicit <code>__Host-</code>/<code>__Secure-</code> cookie names -because browsers require those prefixes to be Secure.</p><p><code>SecurityHeaders</code> controls additional headers written by generated app -handlers. When <code>Enabled</code> is true, each entry in <code>Headers</code> is passed to -<code>runtime/app</code> and emitted on every generated response path, including health -checks and generated errors. Use it for app-owned headers such as -<code>X-Content-Type-Options</code>, <code>Referrer-Policy</code>, <code>Content-Security-Policy</code>, and -<code>X-Frame-Options</code>. Keep TLS-boundary headers such as <code>Strict-Transport-Security</code> -at the HTTPS edge unless the generated app is directly responsible for TLS.</p><p><code>BodyLimits</code> controls generated request body caps in bytes. Omitted or -non-positive values use the default 1 MiB cap. <code>ActionBytes</code> applies to -generated action POST handlers and web command form adapters before form -decoding. <code>APIBytes</code> applies to generated API handlers before user code reads -the request body.</p><p><code>Name</code> is required. <code>Output</code> is optional and defaults to -<code>.gowdk/output/&lt;target-name&gt;</code> when omitted. <code>Modules</code> selects configured -modules; omit it to use the default configured discovery set. <code>App</code> is optional -and writes a generated Go app that embeds the target output. <code>Binary</code> is -optional, requires <code>App</code>, and compiles that generated app for the local -platform. <code>WASM</code> is optional, requires <code>App</code>, and compiles the generated app -with <code>GOOS=js GOARCH=wasm</code>.</p><p><code>BackendApp</code> is optional and writes a generated backend-only Go app for -feature-bound action/API endpoints. <code>BackendBinary</code> is optional, requires -<code>BackendApp</code>, and compiles that backend app. When a target has both frontend -<code>App</code>/<code>Binary</code> and <code>BackendApp</code>/<code>BackendBinary</code>, the frontend binary proxies -generated backend routes to <code>GOWDK_BACKEND_ORIGIN</code>.</p><p><code>DeployRecipes</code> is optional and accepts <code>static</code>, <code>systemd</code>, <code>caddy</code>, <code>nginx</code>, -and <code>split</code>. The values map to <code>gowdk build --deploy-recipe</code> and emit starter -deployment files for the target shape. They do not add secrets, domains, TLS -policy, platform-specific rollout logic, storage, backups, or CDN settings.</p><p>When <code>Build.Targets</code> is present, <code>gowdk build</code> runs every configured target -unless ad hoc build flags or explicit files are passed. Use <code>gowdk build --target &lt;name&gt;</code> to run one or more named targets; <code>--target</code> may be repeated or -comma-separated.</p><h2 id="css">CSS</h2><p><code>CSSConfig</code> controls discovered CSS inputs and generated page CSS output:</p><pre><code class="language-go">type CSSConfig struct { - Include []string - Exclude []string - Default []string - Output CSSOutputConfig -} - -type CSSOutputConfig struct { - Dir string - HrefPrefix string -} -</code></pre><p>When omitted, CSS discovery scans <code>**/*.css</code>, excludes <code>.git</code>, <code>vendor</code>, -<code>node_modules</code>, <code>.gowdk</code>, <code>dist</code>, and the selected build output directory, and -uses <code>global.css</code> as the default CSS input when present.</p><p><code>CSS.Default</code> names discovered CSS inputs used by the <code>default</code> built-in in -<code>css</code>. Generated page CSS defaults to <code>assets/gowdk/&lt;page-id&gt;.css</code> and hrefs -under <code>/assets/gowdk/</code>.</p><h2 id="addons">Addons</h2><p><code>Addons</code> registers optional features such as spa, actions, partial, SSR, API, -embed, CSS, contracts, realtime, auth, DB helpers, rate limiting, and SEO -output. Current validation uses feature registration for render-mode, -realtime, and other compiler checks; SPA builds invoke addons that implement -<code>gowdk.CSSProcessor</code> or <code>gowdk.SEOProvider</code>.</p><p>DB helper usage is ordinary Go code around <code>database/sql</code>; see <a href="/docs/reference/db/">db.md</a> -for migrations, transactions, readiness, and sqlc usage.</p><p>Use <code>gowdk add --list</code> to print addable built-in addon names, and -<code>gowdk add --list --registry</code> to inspect the local discovery metadata. Use -<code>gowdk add &lt;name&gt;</code> to insert the canonical import and <code>&lt;name&gt;.Addon()</code> -constructor into <code>gowdk.config.go</code>. <code>gowdk add seo</code> requires -<code>--base-url &lt;url&gt;</code> because SEO build output requires <code>seo.Options.BaseURL</code>. The -command rewrites literal <code>Config.Addons</code> lists only; if <code>Addons</code> is computed by -Go code, edit the config manually.</p><p>The literal config loader recognizes built-in addon constructors when they are -imported from their canonical package paths. Most are no-argument constructors; -<code>addons/auth</code> accepts the generated-app-safe session options subset -(<code>SecretEnv</code>, <code>CookieName</code>, <code>TTL</code>, <code>Insecure</code>), and <code>addons/seo</code> accepts the -literal SEO options subset:</p><pre><code class="language-go">import ( - &#34;github.com/cssbruno/gowdk/addons/actions&#34; - &#34;github.com/cssbruno/gowdk/addons/api&#34; - &#34;github.com/cssbruno/gowdk/addons/auth&#34; - &#34;github.com/cssbruno/gowdk/addons/contracts&#34; - &#34;github.com/cssbruno/gowdk/addons/css&#34; - &#34;github.com/cssbruno/gowdk/addons/db&#34; - &#34;github.com/cssbruno/gowdk/addons/embed&#34; - &#34;github.com/cssbruno/gowdk/addons/partial&#34; - &#34;github.com/cssbruno/gowdk/addons/ratelimit&#34; - &#34;github.com/cssbruno/gowdk/addons/realtime&#34; - &#34;github.com/cssbruno/gowdk/addons/seo&#34; - &#34;github.com/cssbruno/gowdk/addons/spa&#34; - &#34;github.com/cssbruno/gowdk/addons/ssr&#34; - &#34;github.com/cssbruno/gowdk/addons/static&#34; -) - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - static.Addon(), - spa.Addon(), - actions.Addon(), - partial.Addon(), - ssr.Addon(), - api.Addon(), - auth.Addon(auth.Options{ - SecretEnv: &#34;GOWDK_AUTH_SESSION_SECRET&#34;, - CookieName: &#34;gowdk_session&#34;, - }), - contracts.Addon(), - embed.Addon(), - css.Addon(), - db.Addon(), - ratelimit.Addon(), - realtime.Addon(), - seo.Addon(seo.Options{ - BaseURL: &#34;https://example.com&#34;, - }), - }, -} -</code></pre><p>If <code>Addons</code> contains a constructor outside that AST-only subset, the loader -uses an executable config bridge: it creates a temporary helper inside the -project module, imports the config package as normal Go, and reads the resulting -<code>gowdk.Config</code>. That allows addons from other modules, including GitHub-hosted -addons, to participate through the regular <code>gowdk.Addon</code>, -<code>gowdk.CSSProcessor</code>, <code>gowdk.SEOProvider</code>, and <code>gowdk.GoBlockConsumer</code> -interfaces:</p><pre><code class="language-go">import ( - &#34;github.com/cssbruno/gowdk&#34; - &#34;github.com/example/gowdk-brand&#34; -) - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - brand.Addon(), - }, -} -</code></pre><p>External addon dependencies must already be resolvable by the project module, -for example with <code>go get github.com/example/gowdk-brand</code>. Config packages must -be importable Go packages, not <code>package main</code>.</p><p>The literal loader also recognizes the known literal Tailwind addon options -subset without needing the executable bridge:</p><pre><code class="language-go">import &#34;github.com/cssbruno/gowdk/addons/tailwind&#34; - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - tailwind.Addon(tailwind.Options{ - Input: &#34;styles/app.css&#34;, - Minify: true, - }), - }, -} -</code></pre><p>When <code>Command</code> is omitted, the Tailwind addon uses <code>tailwindcss</code> from <code>PATH</code>. -If the executable is missing, builds fail with an install-required error. The -executable bridge runs project config code only when the AST-only loader finds -addon constructors it cannot reduce safely.</p><p>When <code>ratelimit.Addon()</code> is enabled, generated apps with request-time action, -API, fragment, SSR, or split-backend proxy routes expose -<code>gowdkapp.RegisterRateLimiter(*ratelimit.Limiter)</code>. User-owned Go still creates -the limiter and chooses the in-memory store, Redis store adapter, key function, -limit, and window.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/contracts/index.html b/docs-site/dist/site/docs/reference/contracts/index.html deleted file mode 100644 index a9891b51..00000000 --- a/docs-site/dist/site/docs/reference/contracts/index.html +++ /dev/null @@ -1,654 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Contracts - GOWDK</title> - <meta name="description" content="runtime/contracts is the first runtime slice of the GOWDK Runtime contract-driven backend model. It is usable from normal Go today. .gwdk command and query references are..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Contracts - GOWDK"> - <meta property="og:description" content="runtime/contracts is the first runtime slice of the GOWDK Runtime contract-driven backend model. It is usable from normal Go today. .gwdk command and query references are..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Contracts - GOWDK"> - <meta name="twitter:description" content="runtime/contracts is the first runtime slice of the GOWDK Runtime contract-driven backend model. It is usable from normal Go today. .gwdk command and query references are..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Contracts</h1><p class="doc-lead">runtime/contracts is the first runtime slice of the GOWDK Runtime contract-driven backend model. It is usable from normal Go today. .gwdk command and query references are discoverable in compiler IR, build reports, and generated web adapters when they have a routable method/path.</p></header><article class="prose"><p><code>runtime/contracts</code> is the first runtime slice of the GOWDK Runtime -contract-driven backend model. It is usable from normal Go today. <code>.gwdk</code> -command and query references are discoverable in compiler IR, build reports, -and generated web adapters when they have a routable method/path.</p><h2 id="trust-boundary">Trust Boundary</h2><pre><code class="language-text">frontend UI event -&gt; command/query -&gt; backend handler -&gt; backend-owned event -frontend &lt;- result or presentation event -</code></pre><ul><li>UI events are browser-local clicks, submits, inputs, and changes.</li><li>Commands are backend intent and have one owner handler.</li><li>Queries read state and should not change state.</li><li>Domain events are backend facts emitted after command success.</li><li>Integration events are backend facts intended for durable delivery later.</li><li>Presentation events are browser-facing notifications; they are not trusted -input.</li><li>Contract scanning rejects first browser-UI and vague event-name anti-patterns -such as <code>ButtonClicked</code>, <code>FormSubmitted</code>, and <code>PatientChanged</code>.</li></ul><h2 id="runtime-api">Runtime API</h2><p>Enable compiler integration with:</p><pre><code class="language-go">Addons: []gowdk.Addon{ - contractsaddon.Addon(), -} -</code></pre><p>Enable <code>addons/realtime</code> alongside <code>addons/contracts</code> when the app wants an -explicit config feature for browser presentation-event fanout.</p><p>The runtime registry, generated <code>g:command</code> / <code>g:query</code> adapters, and generated -worker helper APIs are implemented for the current contract-driven runtime -slice.</p><p>Go does not support generic methods, so the API uses generic functions over a -registry. Keep this shape while the repository targets Go 1.26; revisit it when -the project upgrades to Go 1.27 and the language supports generic methods:</p><pre><code class="language-go">r := contracts.NewRegistry() - -contracts.RegisterQuery[GetPatientPage, PatientPageData](r, LoadPatientPage) -contracts.RegisterCommand[CreatePatient, CreatePatientResult](r, HandleCreatePatient) -contracts.RegisterDomainEvent[PatientCreated](r, SendWelcomeEmail) -contracts.RegisterDomainEvent[PatientCreated](r, WriteAuditLog) -contracts.RegisterJob[SyncPatients](r, RunPatientSync) -</code></pre><p>Run contracts:</p><pre><code class="language-go">page, err := contracts.ExecuteQuery[GetPatientPage, PatientPageData](ctx, r, query) -result, err := contracts.ExecuteCommand[CreatePatient, CreatePatientResult](ctx, r, command) -err := contracts.ExecuteJob(ctx, r, job) -</code></pre><p>Run a role-filtered runtime:</p><pre><code class="language-go">result, err := contracts.ExecuteCommandForRole[CreatePatient, CreatePatientResult]( - ctx, - r, - contracts.RoleWeb, - command, -) - -err := contracts.PublishDomainForRole(ctx, r, contracts.RoleWorker, PatientCreated{ID: id}) -err := contracts.ExecuteJobForRole(ctx, r, contracts.RoleCron, SyncPatients{}) -metadata := r.ContractsForRole(contracts.RoleWeb) -</code></pre><p>Default execution helpers run the whole in-process registry for small -single-binary apps. Role-specific helpers run handlers with no explicit roles -and handlers registered for the selected role. They skip handlers registered -only for another role and return <code>role_not_allowed</code> when the selected role -tries to execute a command, query, or job that is not available to that role.</p><p>Generated web adapters always execute command/query references with -<code>contracts.RoleWeb</code>. A <code>.gwdk</code><code>g:command</code> or <code>g:query</code> reference to a -worker/cron/admin/API-only contract is a compiler diagnostic, not a generated -route that fails later.</p><h2 id="local-single-binary-app-path">Local Single-Binary App Path</h2><p>The supported milestone-14 path is local-first: one generated binary can serve -the page, execute <code>g:command</code> and <code>g:query</code> web adapters through the web role, -and replay captured backend events through local runtime helpers. User-owned -worker and cron commands can run the same generated registry helpers; separate -worker/cron binary generators remain future deployment tooling.</p><p>Minimal page:</p><pre><code class="language-gwdk">package contracts - -import patients &#34;github.com/acme/clinic/patients&#34; - -page patients -route &#34;/patients&#34; -guard public - -view { - &lt;main&gt; - &lt;form method=&#34;post&#34; action=&#34;/patients&#34; g:command=&#34;patients.CreatePatient&#34;&gt; - &lt;input name=&#34;name&#34; /&gt; - &lt;button&gt;Create patient&lt;/button&gt; - &lt;/form&gt; - &lt;section g:query=&#34;patients.GetPatientPage&#34;&gt;&lt;/section&gt; - &lt;/main&gt; -} -</code></pre><p><code>g:command</code> is the reactive, contract-governed write. Any page that declares one -— build-time or request-time (<code>server {}</code>, SSR, hybrid) — ships the small client -runtime, which intercepts the submit, posts the command in the background, and -applies a single-flight region refresh: the generated adapter computes which -<code>g:query</code> regions the command&#39;s domain events invalidate and names them in the -<code>X-GOWDK-Queries</code> response header, so the submitter&#39;s regions update immediately -without waiting for the realtime fanout that refreshes every other connected -client.</p><p>For a parameterless region whose data comes from the page&#39;s <code>load {}</code>, the -adapter goes one step further and renders the invalidated region inline — true -single-flight. It returns a <code>{ result, patches: [{ query, html }] }</code> envelope -(signalled by the <code>X-GOWDK-Patches</code> response header) and the client swaps the -region HTML directly, with no second page fetch. Regions that need route context -the command request lacks (a dynamic route param) stay in the <code>X-GOWDK-Queries</code> -header only and the client refetches them — the same path used when JavaScript -re-runs the page render. The raw command result body is preserved whenever no -region renders, so non-browser callers are unaffected.</p><p>The typed result rides on the <code>gowdk:command-success</code> event for optional -optimistic UI. With realtime configured, the same invalidation also fans out over -SSE to other clients (<code>g:subscribe</code> / invalidated <code>g:query</code> regions), reusing the -client&#39;s region-swap routine so the embedded and fanned-out paths converge.</p><p>Two caveats the <code>ssr_command_no_client</code> warning surfaces. First, with client -JavaScript disabled a bare submit still navigates to the adapter&#39;s JSON — use a -<code>g:post</code> action handler returning a <code>response.Response</code> (for example -<code>response.RedirectTo</code>) when a no-JavaScript write path matters. Second, a -<code>g:command</code> with no <code>g:query</code> region for it to refresh is a non-reactive write: -it only fires <code>gowdk:command-success</code>. The warning fires only in that second -case (a request-time command with no read region); add a bound <code>g:query</code> region -or switch to <code>g:post</code>.</p><p>Normal Go owns the contracts and handlers:</p><pre><code class="language-go">package patients - -import ( - &#34;context&#34; - - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; -) - -type GetPatientPage struct{ Filter string } -type PatientPageData struct{ Source string `json:&#34;source&#34;` } -type CreatePatient struct{ Name string } -type CreatePatientResult struct{ ID string `json:&#34;id&#34;` } -type PatientCreated struct{ ID string } - -func Register(registry *contracts.Registry) { - contracts.RegisterQuery[GetPatientPage, PatientPageData](registry, LoadPatientPage, contracts.RoleWeb) - contracts.RegisterCommand[CreatePatient, CreatePatientResult](registry, HandleCreatePatient, contracts.RoleWeb) - contracts.RegisterDomainEvent[PatientCreated](registry, SendWelcomeEmail, contracts.RoleWorker) -} - -func LoadPatientPage(ctx context.Context, query GetPatientPage) (PatientPageData, error) { - return PatientPageData{Source: &#34;db&#34;}, nil -} - -func HandleCreatePatient(ctx context.Context, command CreatePatient) (CreatePatientResult, error) { - if err := contracts.EmitDomain(ctx, PatientCreated{ID: &#34;patient-1&#34;}); err != nil { - return CreatePatientResult{}, err - } - return CreatePatientResult{ID: &#34;patient-1&#34;}, nil -} - -func SendWelcomeEmail(ctx context.Context, event PatientCreated) error { return nil } -</code></pre><p>The generated command adapter captures events emitted by <code>HandleCreatePatient</code> -only after the command succeeds. Browser events remain untrusted UI input; -backend facts must be emitted from Go handlers with <code>EmitDomain</code>, -<code>EmitIntegration</code>, or <code>EmitPresentation</code>.</p><p>The repository example is <code>examples/contracts/</code>:</p><pre><code class="language-sh">go run ./cmd/gowdk build --config examples/contracts/gowdk.config.go \ - --out /tmp/gowdk-contracts-build \ - --app /tmp/gowdk-contracts-app \ - --bin /tmp/gowdk-contracts-site \ - examples/contracts/patients.page.gwdk -</code></pre><p>Verify adapter metadata through the build report:</p><pre><code class="language-sh">grep -F &#39;&#34;name&#34;: &#34;patients.CreatePatient&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;kind&#34;: &#34;command&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;path&#34;: &#34;/contracts/patients&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;guards&#34;: &#34;public&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;name&#34;: &#34;patients.GetPatientPage&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;kind&#34;: &#34;query&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -</code></pre><h2 id="observability">Observability</h2><p><code>runtime/contracts</code> exposes stable operation names and labels for logs, -metrics, and traces. These names are API values, not CLI display text.</p><pre><code class="language-go">metadata := r.ContractsForRole(contracts.RoleWeb) -observation := metadata[0].ObservationForRole( - contracts.ObservationExecuteCommand, - contracts.RoleWeb, -) -</code></pre><p>The stable operation names include:</p><table><thead><tr><th>Operation</th><th>Name</th></tr></thead><tbody><tr><td>Register query</td><td><code>gowdk.contract.register.query</code></td></tr><tr><td>Register command</td><td><code>gowdk.contract.register.command</code></td></tr><tr><td>Register event</td><td><code>gowdk.contract.register.event</code></td></tr><tr><td>Register job</td><td><code>gowdk.contract.register.job</code></td></tr><tr><td>Execute query</td><td><code>gowdk.contract.execute.query</code></td></tr><tr><td>Execute command</td><td><code>gowdk.contract.execute.command</code></td></tr><tr><td>Capture command events</td><td><code>gowdk.contract.capture.command</code></td></tr><tr><td>Execute job</td><td><code>gowdk.contract.execute.job</code></td></tr><tr><td>Publish event</td><td><code>gowdk.contract.publish.event</code></td></tr><tr><td>Store command events in outbox</td><td><code>gowdk.contract.outbox.store</code></td></tr><tr><td>Publish broker events</td><td><code>gowdk.contract.broker.publish</code></td></tr><tr><td>Send presentation events</td><td><code>gowdk.contract.presentation.send</code></td></tr><tr><td>Worker receive batch</td><td><code>gowdk.contract.worker.receive</code></td></tr><tr><td>Worker ack batch</td><td><code>gowdk.contract.worker.ack</code></td></tr><tr><td>Worker nack batch</td><td><code>gowdk.contract.worker.nack</code></td></tr><tr><td>Worker dedup skip</td><td><code>gowdk.contract.worker.dedup_skip</code></td></tr></tbody></table><p><code>Metadata.ObservationLabels()</code> returns the stable contract labels: kind, event -category, contract type name, result type name, role, roles, and handler count -when known. <code>EventEnvelope.ObservationLabels()</code> returns the event kind, -category, stable event ID, and captured event contract type. -<code>ContractName[T]()</code> returns the same Go contract type name used by metadata and -event envelopes. -<code>ObservationForRole</code> records the runtime role that performed the operation.</p><p>Inside a command handler, emit backend-owned events through the command context:</p><pre><code class="language-go">func HandleCreatePatient(ctx context.Context, cmd CreatePatient) (CreatePatientResult, error) { - id := &#34;patient-1&#34; - if err := contracts.EmitDomain(ctx, PatientCreated{ID: id}); err != nil { - return CreatePatientResult{}, err - } - return CreatePatientResult{ID: id}, nil -} -</code></pre><p>Emitted events are dispatched only after the command handler returns -successfully. If the command returns an error, recorded events are discarded.</p><p>Capture events instead of dispatching subscribers when a command needs an -outbox boundary:</p><pre><code class="language-go">result, events, err := contracts.CaptureCommandEvents[CreatePatient, CreatePatientResult]( - ctx, - r, - command, -) -</code></pre><p>Each captured <code>EventEnvelope</code> contains a stable event ID, event category, Go -type name, and typed value. Capturing does not run event subscribers.</p><p>For tests, <code>runtime/testkit</code> wraps this path with an in-memory registry helper -and typed event assertions. See <code>docs/reference/testing.md</code> and -<code>examples/contracts/patients/contracts_test.go</code>.</p><p>For dependency-free outbox integration, implement the small <code>Outbox</code> interface:</p><pre><code class="language-go">type PatientOutbox struct{} - -func (PatientOutbox) StoreEvents(ctx context.Context, events []contracts.EventEnvelope) error { - return nil -} - -result, err := contracts.ExecuteCommandToOutbox[CreatePatient, CreatePatientResult]( - ctx, - r, - PatientOutbox{}, - command, -) -</code></pre><p><code>ExecuteCommandToOutbox</code> stores events only after the command handler succeeds. -It does not dispatch subscribers. Database transactions, outbox tables, retry -policy, idempotency, broker publication, and worker delivery remain adapter -responsibilities outside the core package.</p><p>For durable domain events, adapter code should preserve this order:</p><pre><code class="language-text">start transaction -apply state change -store domain event in outbox -commit transaction -publish from worker -</code></pre><p>Use plain <code>ExecuteCommand</code> for small single-binary apps where in-process -subscriber dispatch is enough. Use <code>CaptureCommandEvents</code> or -<code>ExecuteCommandToOutbox</code> when subscribers should run from a later worker or -broker delivery path.</p><p>GOWDK Runtime also includes a dependency-free file outbox adapter for local -durable JSON Lines storage:</p><pre><code class="language-go">import &#34;github.com/cssbruno/gowdk/runtime/contracts/fileoutbox&#34; - -outbox := fileoutbox.New( - &#34;var/gowdk-outbox.jsonl&#34;, - fileoutbox.WithJSONTypeDecoder[PatientCreated](), - fileoutbox.WithDeadLetter(&#34;var/gowdk-outbox.dead.jsonl&#34;, 5), -) - -_, err := contracts.ExecuteCommandToOutbox[CreatePatient, CreatePatientResult]( - ctx, - r, - outbox, - command, -) - -err = contracts.RunEventWorker(ctx, r, outbox) -</code></pre><p>The file outbox implements both <code>contracts.Outbox</code> and -<code>contracts.EventSource</code>. It stores captured envelopes as JSON Lines records, -rewrites pending and dead-letter files through temp-file replacement, decodes -records through explicitly registered decoders, removes records only after -worker <code>Ack</code>, and keeps records after <code>Nack</code> for retry. Nack records the attempt -count, last attempt time, and last error in the durable record. It is useful for -local development, small single-host deployments, and tests. -When <code>WithDeadLetter(path, maxAttempts)</code> is configured, records move to the -dead-letter JSON Lines file after the configured failed delivery count. -Applications that need database transactions, cross-process locking, retry -backoff, broker delivery, or operational dead-letter processing should use a -database-backed or broker-backed adapter.</p><p>Delivery guarantees:</p><ul><li>Local in-process dispatch is process-local exactly once for that command -execution because subscribers run before the command response is written.</li><li>Outbox and broker delivery is at-least-once. Use <code>RunEventWorkerWithSeenStore</code> -or <code>RunEventWorkerForRoleWithSeenStore</code> with a <code>contracts.SeenStore</code> to skip -duplicate event IDs inside a configured deduplication window. Duplicate -batches are acknowledged without invoking subscribers.</li><li>A deduplication window is not an exactly-once guarantee. Subscribers must -still tolerate redelivery outside the window, after store loss, after seen -store write failures, or across concurrent workers. Event IDs are marked seen -only after worker dispatch and source <code>Ack</code> both succeed.</li></ul><p>GOWDK Runtime provides three seen-store adapters:</p><ul><li><code>contracts.NewMemorySeenStore(limit)</code> keeps a bounded process-local LRU -window for local single-binary apps and tests.</li><li><code>fileoutbox.NewSeenStore(path, fileoutbox.WithSeenLimit(limit))</code> keeps a -dependency-free JSON Lines window next to the file outbox.</li><li><code>redisstream.NewSeenStore(client, prefix, ttl)</code> checks IDs with Redis -<code>EXISTS</code>, records IDs with <code>SET</code>, and applies an expiration TTL for Redis -Streams worker deployments.</li></ul><p>Subscriber handlers must still be idempotent for any durable delivery adapter. -Use a stable domain key, event ID, outbox record ID, or application-level -dedupe table to make repeated deliveries safe. GOWDK Runtime does not hide -retries behind generated JavaScript or browser state.</p><p>External broker adapters can implement the dependency-free <code>Broker</code> interface:</p><pre><code class="language-go">type PatientBroker struct{} - -func (PatientBroker) PublishEvents(ctx context.Context, events []contracts.EventEnvelope) error { - return nil -} - -result, err := contracts.ExecuteCommandToBroker[CreatePatient, CreatePatientResult]( - ctx, - r, - PatientBroker{}, - command, -) -</code></pre><p><code>ExecuteCommandToBroker</code> publishes captured events only after the command -handler succeeds. It does not dispatch local subscribers. Broker adapters own -serialization, acknowledgements, retries, dead-letter behavior, and delivery -guarantees.</p><p>Realtime adapters can implement <code>PresentationFanout</code> for browser-facing output:</p><pre><code class="language-go">type PatientFanout struct{} - -func (PatientFanout) SendPresentationEvents(ctx context.Context, events []contracts.EventEnvelope) error { - return nil -} - -result, err := contracts.ExecuteCommandToPresentationFanout[CreatePatient, CreatePatientResult]( - ctx, - r, - PatientFanout{}, - command, -) -</code></pre><p>Only presentation events are sent to fanout. Domain and integration events are -filtered out. Fanout adapters own SSE/WebSocket sessions, serialization, client -targeting, buffering, and disconnect behavior.</p><p>Worker or broker adapter code can replay captured events through the same typed -subscriber registry:</p><pre><code class="language-go">err := contracts.PublishEnvelopesForRole(ctx, r, contracts.RoleWorker, events) -</code></pre><p>Envelope replay keeps the original event category and type. Subscribers still -run through role filtering. If a subscriber returns an error, replay stops and -returns <code>subscriber_failed</code>; adapter retry and idempotency policy stays outside -the core runtime.</p><p>Queue or outbox adapters can drive worker subscribers with <code>EventSource</code>:</p><pre><code class="language-go">type PatientEventSource struct{} - -func (PatientEventSource) ReceiveEventBatch(ctx context.Context) (contracts.EventBatch, error) { - return contracts.EventBatch{}, contracts.ErrEventSourceClosed -} - -err := contracts.RunEventWorker(ctx, r, PatientEventSource{}) -</code></pre><p><code>RunEventWorker</code> dispatches batches with <code>RoleWorker</code>, calls <code>Ack</code> after -successful subscriber replay, calls <code>Nack</code> when subscriber replay fails, stops -cleanly when the source returns <code>ErrEventSourceClosed</code>, and returns the context -error when <code>ctx</code> is canceled. <code>RunEventWorkerForRole</code> can be used for another -runtime role. <code>ErrEventSourceClosed</code> means a finite source drained cleanly, as -with the file outbox or in-memory broker; long-lived brokers such as Redis -Streams and NATS should keep blocking until the worker context is canceled or -the adapter is genuinely closed.</p><p>Generated command routes use the same event-plumbing boundary through one -configurable sink:</p><pre><code class="language-go">gowdkapp.RegisterContractEventSink(contracts.OutboxCommandEventSink(outbox)) -</code></pre><p>The generated app API exists when routable command contract adapters are -generated. Passing <code>nil</code> restores the default in-process sink:</p><pre><code class="language-go">gowdkapp.RegisterContractEventSink(nil) -</code></pre><p>Available sink helpers:</p><ul><li><code>InProcessCommandEventSink()</code> dispatches captured events through the local -registry with role filtering.</li><li><code>OutboxCommandEventSink(outbox)</code> stores captured events without local -subscriber dispatch.</li><li><code>BrokerCommandEventSink(broker)</code> publishes captured events to a broker.</li><li><code>PresentationFanoutCommandEventSink(fanout)</code> sends only presentation events.</li><li><code>CompositeCommandEventSink(...)</code> sends the same captured event batch to -multiple sinks in order.</li></ul><p>Apps that need more than one destination can implement -<code>contracts.CommandEventSink</code> directly or use <code>CompositeCommandEventSink</code>.</p><p>Choose the sink based on where subscribers should run:</p><table><thead><tr><th>Need</th><th>Sink</th></tr></thead><tbody><tr><td>Small single-binary app</td><td><code>InProcessCommandEventSink()</code></td></tr><tr><td>Local durable queue or test fixture</td><td><code>OutboxCommandEventSink(fileoutbox.New(...))</code></td></tr><tr><td>Local in-memory queue</td><td><code>BrokerCommandEventSink(membroker.New())</code></td></tr><tr><td>Redis Streams queue</td><td><code>BrokerCommandEventSink(redisstream.New(...))</code></td></tr><tr><td>Core NATS live pub/sub</td><td><code>BrokerCommandEventSink(natsbroker.New(...))</code></td></tr><tr><td>Browser notifications over SSE or WebSocket</td><td><code>PresentationFanoutCommandEventSink(hub)</code></td></tr><tr><td>More than one destination</td><td><code>CompositeCommandEventSink(...)</code></td></tr></tbody></table><p><code>CompositeCommandEventSink</code> sends the same captured batch to each sink in -order. A later sink is not called after an earlier sink returns an error. -Presentation fanout sinks filter non-presentation events themselves. Broker and -outbox sinks receive the full event batch.</p><p>Generated packages with executable contract registrations also expose:</p><pre><code class="language-go">shared := gowdkapp.ContractRegistry() -fresh := gowdkapp.NewContractRegistry() -err := gowdkapp.RunContractEventWorker(ctx, source) -err = gowdkapp.RunContractEventWorkerWithOptions( - ctx, - source, - contracts.WithEventWorkerBackoff(backoff), -) -err = gowdkapp.RunContractEventWorkerWithSeenStore(ctx, source, seen) -err = gowdkapp.RunContractEventWorkerWithSeenStoreAndOptions( - ctx, - source, - seen, - contracts.WithEventWorkerBackoff(backoff), -) -</code></pre><p><code>ContractRegistry</code> returns the generated app&#39;s shared in-process registry. -Generated web command/query routes use the same registry, and lifecycle -services can read it from <code>runtime/app.ServiceContext.Values</code> with key -<code>runtime/app.ServiceValueContractRegistry</code>. <code>NewContractRegistry</code> creates a -fresh registry using the scanned registration functions. <code>RunContractEventWorker</code> -replays an <code>EventSource</code> through a fresh registry with the worker role. -<code>RunContractEventWorkerWithSeenStore</code> uses the same worker role and skips -duplicate event IDs through the provided <code>contracts.SeenStore</code>. The -<code>WithOptions</code> variants pass runtime worker options, including nacked-batch -backoff, through to <code>runtime/contracts</code>.</p><p>These helpers are deliberately local process APIs. Use them from the generated -binary, a user-owned worker or cron command, or a test fixture. Generated -worker/cron binaries, supervisor configs, queue topology, and deployment -recipe starters are platform tooling, not part of the milestone-14 runtime -contract.</p><h2 id="worker-backoff">Worker Backoff</h2><p>By default, an event worker immediately asks the source for another batch after -the source accepts <code>Nack</code>. Pass <code>contracts.WithEventWorkerBackoff</code> when a -worker should wait after nacked subscriber delivery:</p><pre><code class="language-go">backoff := func(retry contracts.EventWorkerRetry) time.Duration { - delay := 250 * time.Millisecond - for i := 1; i &lt; retry.Attempt &amp;&amp; delay &lt; 5*time.Second; i++ { - delay *= 2 - } - if delay &gt; 5*time.Second { - return 5 * time.Second - } - return delay -} - -err := gowdkapp.RunContractEventWorkerWithSeenStoreAndOptions( - ctx, - source, - seen, - contracts.WithEventWorkerBackoff(backoff), -) -</code></pre><p>Use <code>contracts.ConstantEventWorkerBackoff(duration)</code> for a fixed delay. -Backoff runs only after subscriber replay fails and the <code>EventSource</code> accepts -<code>Nack</code>; ack failures, receive failures, missing <code>Nack</code>, and context -cancellation still return errors. Durable adapters still own their persistent -attempt counters, dead-letter files, pending-message behavior, and operational -retry policy.</p><p>Dependency-free adapters:</p><ul><li><code>runtime/contracts/fileoutbox</code> stores JSON Lines records on disk and -implements both <code>Outbox</code> and <code>EventSource</code>. Each record has its own durable -record ID plus the event envelope ID used by worker deduplication.</li><li><code>runtime/contracts/membroker</code> provides an in-memory <code>Broker</code> and -<code>EventSource</code> for tests, local development, and single-process apps.</li><li><code>runtime/contracts/sse</code> provides an <code>http.Handler</code> and -<code>PresentationFanout</code> for server-sent browser presentation events. -<code>addons/realtime</code> re-exports this dependency-free SSE hub as <code>NewSSE</code>.</li></ul><p>Optional broker and realtime adapters:</p><ul><li><code>runtime/contracts/redisstream</code> uses Redis Streams as a <code>Broker</code> and -<code>EventSource</code>.</li><li><code>runtime/contracts/natsbroker</code> uses core NATS publish/subscribe as a -<code>Broker</code> and <code>EventSource</code>.</li><li><code>runtime/contracts/websocketfanout</code> provides an <code>http.Handler</code> and -<code>PresentationFanout</code> for browser WebSocket clients.</li></ul><p>These concrete optional adapters are nested Go modules. Add only the adapter an -application uses:</p><pre><code class="language-sh">go get github.com/cssbruno/gowdk/runtime/contracts/redisstream -go get github.com/cssbruno/gowdk/runtime/contracts/natsbroker -go get github.com/cssbruno/gowdk/runtime/contracts/websocketfanout -</code></pre><p>See <code>docs/reference/realtime.md</code> for the transport choice, config setup, and -deployment caveats.</p><h2 id="sink-recipes">Sink Recipes</h2><h3 id="redis-streams">Redis Streams</h3><p>Use Redis Streams when command routes should append events to a queue and a -worker should replay subscribers later:</p><pre><code class="language-go">import ( - &#34;time&#34; - - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts/redisstream&#34; - redis &#34;github.com/redis/go-redis/v9&#34; -) - -client := redis.NewClient(&amp;redis.Options{Addr: &#34;127.0.0.1:6379&#34;}) - -events := redisstream.New( - client, - &#34;gowdk:events&#34;, - &#34;gowdk-workers&#34;, - &#34;worker-1&#34;, - redisstream.WithBlock(5*time.Second), - redisstream.WithJSONDecoder[PatientCreated](&#34;patients.PatientCreated&#34;), -) - -if err := events.EnsureGroup(ctx); err != nil { - return err -} - -gowdkapp.RegisterContractEventSink(contracts.BrokerCommandEventSink(events)) -</code></pre><p>A worker can use the same adapter as an <code>EventSource</code>:</p><pre><code class="language-go">if err := gowdkapp.RunContractEventWorker(ctx, events); err != nil { - return err -} -</code></pre><p><code>Ack</code> calls <code>XACK</code> and then <code>XDEL</code>. Subscriber failures leave messages pending -for the Redis consumer group to handle according to app-owned retry policy. -Register JSON decoders for event types that need typed Go values when replayed -through subscribers.</p><h3 id="nats">NATS</h3><p>Use the NATS adapter for live event distribution where subscribers are expected -to be online:</p><pre><code class="language-go">import ( - &#34;time&#34; - - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts/natsbroker&#34; - nats &#34;github.com/nats-io/nats.go&#34; -) - -conn, err := nats.Connect(nats.DefaultURL) -if err != nil { - return err -} - -events := natsbroker.New( - conn, - &#34;gowdk.events&#34;, - natsbroker.WithQueue(&#34;gowdk-workers&#34;), - natsbroker.WithTimeout(5*time.Second), - natsbroker.WithJSONDecoder[PatientCreated](&#34;patients.PatientCreated&#34;), -) -defer events.Close() - -gowdkapp.RegisterContractEventSink(contracts.BrokerCommandEventSink(events)) -</code></pre><p>Worker replay uses the same adapter:</p><pre><code class="language-go">if err := gowdkapp.RunContractEventWorker(ctx, events); err != nil { - return err -} -</code></pre><p>This adapter uses core NATS publish/subscribe. It does not provide durable -replay for offline subscribers. Use Redis Streams, the file outbox, or a -custom JetStream adapter when events must survive worker downtime. When a batch -drain encounters a later malformed message after already decoding earlier -messages, the adapter returns the decoded events so they can still be -dispatched.</p><h3 id="sse-presentation-fanout">SSE Presentation Fanout</h3><p>Use SSE when the app needs one-way browser presentation events:</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts/sse&#34; -) - -hub := sse.New() -http.Handle(&#34;/gowdk/events&#34;, hub) - -gowdkapp.RegisterContractEventSink( - contracts.PresentationFanoutCommandEventSink(hub), -) -</code></pre><p>The browser receives <code>event: gowdk-presentation</code> messages whose <code>data</code> value is -the JSON <code>contracts.EventEnvelope</code>. Domain and integration events are ignored.</p><h3 id="websocket-presentation-fanout">WebSocket Presentation Fanout</h3><p>Use WebSocket fanout when clients need a persistent bidirectional transport for -presentation events:</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - &#34;github.com/coder/websocket&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts/websocketfanout&#34; -) - -hub := websocketfanout.New(websocketfanout.WithAcceptOptions(websocket.AcceptOptions{ - OriginPatterns: []string{&#34;https://example.com&#34;}, -})) -http.Handle(&#34;/gowdk/events/ws&#34;, hub) - -gowdkapp.RegisterContractEventSink( - contracts.PresentationFanoutCommandEventSink(hub), -) -</code></pre><p>Each presentation event is written as one text JSON <code>contracts.EventEnvelope</code>. -Slow clients can drop queued messages when their buffer fills; tune -<code>WithBufferSize</code> for the app&#39;s realtime behavior.</p><h3 id="fanout-plus-queue">Fanout Plus Queue</h3><p>Apps can send browser presentation events immediately and still queue the full -event batch for backend workers:</p><pre><code class="language-go">sink := contracts.CompositeCommandEventSink( - contracts.PresentationFanoutCommandEventSink(hub), - contracts.BrokerCommandEventSink(events), -) - -gowdkapp.RegisterContractEventSink(sink) -</code></pre><p>The generated command route fails before writing JSON success if any sink -returns an error.</p><h2 id="gwdk-command-references"><code>.gwdk</code> Command References</h2><p>Use <code>g:command</code> on forms to declare backend command intent:</p><pre><code class="language-html">&lt;form method=&#34;post&#34; action=&#34;/patients&#34; g:command=&#34;patients.CreatePatient&#34;&gt; - &lt;input name=&#34;name&#34;&gt; - &lt;button&gt;Create patient&lt;/button&gt; -&lt;/form&gt; -</code></pre><p>Current behavior:</p><ul><li>Renders <code>data-gowdk-command=&#34;patients.CreatePatient&#34;</code>.</li><li>Adds a command reference to <code>internal/gwdkir.Program.ContractRefs</code>.</li><li>Records the reference alias, imported package path when declared with a -<code>.gwdk import</code>, local command type, bound result type, binding status, and -handler/register function names and runtime roles in IR/build-report -metadata when known.</li><li>Records literal form <code>method</code> and <code>action</code> as command adapter IR -method/path. If a page-owned <code>g:command</code> form omits <code>action</code>, the command -adapter path is the owning page route, matching the browser&#39;s default form -submission target.</li><li><code>gowdk build</code> links command references to scanned Go command registrations -and adds <code>contract_reference</code> events with status and source line/column to -<code>gowdk-build-report.json</code>. Command events include method/path when present.</li><li>Generated apps register the scanned package registration function once in a -local <code>runtime/contracts.Registry</code>, route the form method/action through the -backend router, capture emitted backend events with -<code>CaptureCommandEventsForRole(..., contracts.RoleWeb, input)</code>, send captured -events to the configured command event sink, and return the command result as -no-store JSON.</li><li>Success responses are <code>200 application/json</code> with the command result encoded -directly as JSON. Error responses are <code>application/json</code> with -<code>{&#34;error&#34;:&#34;...&#34;}</code> and <code>Cache-Control: no-store</code>; ordinary 5xx errors use the -generic HTTP status text, while <code>response.NewHandlerError(status, message, cause)</code> can opt into an explicit client-safe status and message. Form parse, -oversized body, CSRF, and typed input decode failures use the same JSON error -shape.</li><li>When the scanner can see the exported command input struct fields, generated -adapters parse submitted form values, allow only the scanned fields, decode -supported scalar fields, and pass the typed command input to the registry.</li><li>When generated CSRF is enabled, command contract forms receive the same -hidden token injection as POST action forms, and generated command adapters -validate the submitted token before dispatch.</li><li>Command references on guarded pages inherit the page guards. When rate -limiting is enabled, generated command adapters run rate limiting first, -guards second, then form parsing, CSRF validation, typed input decoding, and -command execution.</li><li><code>gowdk check</code> and CLI <code>gowdk build</code> fail when a command reference is missing, -linked to an invalid Go handler signature, or bound only to non-web runtime -roles.</li><li>Requires a package-qualified Go reference such as <code>patients.CreatePatient</code>.</li><li>Must not be combined with <code>g:post</code>.</li></ul><p>If the scanner cannot see the command input fields yet, generated command -adapters construct a zero-value command input before dispatch.</p><h2 id="gwdk-query-references"><code>.gwdk</code> Query References</h2><p>Use <code>g:query</code> on HTML elements to declare readonly backend query intent:</p><pre><code class="language-html">&lt;section g:query=&#34;patients.GetPatientPage&#34;&gt; - &lt;h1&gt;Patients&lt;/h1&gt; -&lt;/section&gt; -</code></pre><p>Current behavior:</p><ul><li>Renders <code>data-gowdk-query=&#34;patients.GetPatientPage&#34;</code>.</li><li>Adds a query reference to <code>internal/gwdkir.Program.ContractRefs</code>.</li><li>Records the reference alias, imported package path when declared with a -<code>.gwdk import</code>, local query type, bound result type, binding status, and -handler/register function names and runtime roles in IR/build-report -metadata when known.</li><li><code>gowdk build</code> links query references to scanned Go query registrations and -adds <code>contract_reference</code> events with status and source line/column to -<code>gowdk-build-report.json</code>.</li><li>Page-owned query references record <code>GET</code> plus the page route as first -request-time source metadata.</li><li>Generated apps register the scanned package registration function once in a -local <code>runtime/contracts.Registry</code>, route page-owned query references through -the backend router, execute the query with <code>ExecuteQueryForRole(..., contracts.RoleWeb, input)</code>, and return the query result as no-store JSON.</li><li>Success responses are <code>200 application/json</code> with the query result encoded -directly as JSON. Error responses are <code>application/json</code> with -<code>{&#34;error&#34;:&#34;...&#34;}</code> and <code>Cache-Control: no-store</code>; ordinary 5xx errors use the -generic HTTP status text, while <code>response.NewHandlerError(status, message, cause)</code> can opt into an explicit client-safe status and message.</li><li>Page-owned query routes share the page path, so generated apps dispatch them -only for explicit query requests: <code>Accept: application/json</code>, another -<code>+json</code> media type, or <code>X-GOWDK-Query: true</code>. Normal document requests keep -serving the page HTML at the same route.</li><li>When the scanner can see the exported query input struct fields, generated -adapters decode supported URL query parameters into the typed query input.</li><li>Query references on guarded pages inherit the page guards. When rate limiting -is enabled, generated query adapters run rate limiting first, guards second, -then typed URL query decoding and query execution.</li><li><code>gowdk check</code> and CLI <code>gowdk build</code> fail when a query reference is missing, -linked to an invalid Go handler signature, or bound only to non-web runtime -roles.</li><li>Requires a package-qualified Go reference such as <code>patients.GetPatientPage</code>.</li><li>Must not be combined with <code>g:post</code> or <code>g:command</code> on the same form.</li></ul><p>If the scanner cannot see the query input fields yet, generated query adapters -construct a zero-value query input before dispatch.</p><h2 id="gwdk-realtime-subscriptions"><code>.gwdk</code> Realtime Subscriptions</h2><p>Use <code>g:subscribe</code> beside <code>g:query</code> to bind a query-owned region to a -browser-facing presentation event:</p><pre><code class="language-html">&lt;section g:query=&#34;patients.GetPatientPage&#34; g:subscribe=&#34;patients.PatientNotice&#34;&gt; - &lt;h1&gt;Patients&lt;/h1&gt; -&lt;/section&gt; -</code></pre><p>Current behavior:</p><ul><li>Renders <code>data-gowdk-subscribe=&#34;patients.PatientNotice&#34;</code> and a validated -<code>data-gowdk-subscribe-type</code> marker beside the <code>data-gowdk-query</code> marker.</li><li>Adds a subscription record to -<code>internal/gwdkir.Program.RealtimeSubscriptions</code>.</li><li>Records query and event aliases, imported package paths when declared with -<code>.gwdk import</code>, local query/event types, owner metadata, guards, and exact -source spans.</li><li>Requires <code>realtime.Addon()</code> in project config.</li><li><code>gowdk check</code> and CLI <code>gowdk build</code> fail when the event reference is missing, -linked to an invalid Go handler signature, registered as a domain or -integration event, or bound only to non-web runtime roles.</li><li><code>gowdk build</code> adds <code>realtime_subscription</code> events with status and source -line/column to <code>gowdk-build-report.json</code>.</li><li>Generated apps with bound subscriptions expose <code>RealtimeEventsPath</code>, mount -<code>/_gowdk/realtime/events</code>, and stream only subscribed presentation event -types through the dependency-free SSE fanout by default.</li><li>Generated realtime streams inherit subscribed page guards. The generated -handler chooses page guards from <code>?path=...</code> or the same-origin referer path -when available, otherwise it fails closed by requiring the union of guarded -subscriptions before opening the SSE response.</li><li><code>RegisterRealtimeFanout(realtime.PresentationFanout)</code> can replace the -generated fanout for app-owned transport setup.</li><li>Generated <code>gowdk.js</code> connects subscribed pages to the SSE stream and applies -explicit <code>replaceHTML</code> patches from presentation event payloads to matching -query-owned regions.</li><li>Requires package-qualified Go references such as -<code>patients.PatientNotice</code>.</li><li>Must be on the same element as <code>g:query</code>; unbounded subscriptions are -rejected.</li></ul><p>Only explicit <code>replaceHTML</code> client patches are supported today. The -dependency-free SSE adapter sends a <code>retry: 1000</code> directive for browser -EventSource reconnects and uses bounded per-client buffers; events are dropped -for clients whose buffers are full rather than blocking command execution. -Custom retry/backoff/replay, active session-change stream revocation, and -richer patch shapes remain separate follow-up pieces.</p><h2 id="query-invalidations">Query Invalidations</h2><p>Use <code>contracts.RegisterInvalidation[event, query]</code> in Go when a domain event -should refresh query-owned regions:</p><pre><code class="language-go">func Register(registry *contracts.Registry) { - contracts.RegisterQuery[GetPatientPage, PatientPageData](registry, LoadPatientPage, contracts.RoleWeb) - contracts.RegisterCommand[CreatePatient, CreatePatientResult](registry, HandleCreatePatient, contracts.RoleWeb) - contracts.RegisterDomainEvent[PatientCreated](registry, SendWelcomeEmail, contracts.RoleWorker) - contracts.RegisterInvalidation[PatientCreated, GetPatientPage](registry) -} -</code></pre><p>Current behavior:</p><ul><li>Scans invalidation edges beside normal contract registrations.</li><li>Rejects edges that name an unknown query, an unknown domain event, or a -domain event no scanned command emits.</li><li>Joins validated edges with bound <code>g:query</code> references into -<code>internal/gwdkir.Program.QueryInvalidations</code>.</li><li>Requires <code>realtime.Addon()</code> when a bound query uses generated invalidation -refresh.</li><li><code>gowdk build</code> adds <code>query_invalidation</code> events with status and source -line/column to <code>gowdk-build-report.json</code>.</li><li><code>gowdk graph</code> prints <code>invalidates</code> edges from domain events to queries.</li><li>Generated HTML renders validated <code>data-gowdk-query-type</code> markers for -invalidated query regions.</li><li>Generated command adapters emit a <code>gowdk.query.invalidate</code> presentation event -after successful command event dispatch when captured domain events -invalidate bound queries.</li><li>Generated <code>gowdk.js</code> refetches the current document and replaces matching -non-subscribed query regions. Regions with <code>g:subscribe</code> are left to explicit -presentation patches.</li></ul><p>Invalidations are explicit Go metadata, not compiler inference from handler -bodies. The first slice refreshes matching regions from the current document; -fragment/API-specific query execution and richer refresh policies remain -future work.</p><p>Templates must not declare backend facts:</p><pre><code class="language-html">&lt;!-- rejected --&gt; -&lt;form g:event=&#34;PatientCreated&#34;&gt; -</code></pre><p>Use <code>g:on:*</code> for local UI/component events and <code>g:command</code> for backend intent.</p><h2 id="current-limits">Current Limits</h2><ul><li>Generated command/query adapters execute bound references through -<code>runtime/contracts</code> when the <code>.gwdk</code> reference has a routable method/path, -an import path, a local contract type, a result type, and a scanned package -registration function.</li><li><code>.gwdk</code> command/query reference linking matches the full reference name, the -captured local contract type, and the scanned Go contract type import path -when the <code>.gwdk</code> import alias differs from the Go package name.</li><li>Form-local <code>g:command</code> references and element-local <code>g:query</code> references -include exact source line and column in IR and build reports.</li><li>Missing, invalid, or non-web-only command/query references produce -<code>contract_reference_*</code> diagnostics in <code>gowdk check</code>, in LSP dirty-buffer -diagnostics, and stop CLI builds. Diagnostic suggestions point to -<code>gowdk contracts list</code> and <code>gowdk contracts graph</code> when scanned registration -state needs inspection.</li><li>Generated fallback contract routes that remain in appgen for allowed -non-bound modes return explicit HTTP 501 no-store responses.</li><li>Other contract diagnostics do not all have exact source spans yet.</li><li><code>gowdk contracts</code>, <code>gowdk list commands|queries|events|jobs</code>, <code>gowdk graph</code>, -and <code>gowdk trace &lt;contract&gt;</code> can scan Go AST registration calls today.</li><li>Contract scan reports include <code>go/types</code> diagnostics for command, query, -event, and job handler signatures across local package files and imported -handler symbols when the standard Go importer can resolve them.</li><li>Contract scanning caches package import/export inspection by package directory -and import set inside each scan.</li><li>Contract scanning rejects feature packages that import generated app output -such as <code>gowdk-generated-app/gowdkapp</code>, because that dependency direction -creates generated app import cycles.</li><li>Contract scan reports include the top-level package registration function -that accepts <code>*contracts.Registry</code>, when the registration call is inside one.</li><li>Contract scan roles are propagated into linked IR, app adapter IR, and -build-report metadata.</li><li>Page guards are propagated into linked IR and app adapter IR for generated -command/query routes.</li><li>Contract scan reports include same-package exported command/query input struct -fields for generated form/query decoders.</li><li>Contract scan reports validate local and imported contract/result types -resolved by <code>go/types</code> as exported struct symbols where the scanner can -resolve them.</li><li>Contract scan reports include exported JSON fields for supported local and -imported command/query result structs and integration-event payload structs -when those structs can be resolved. Unsupported imported payload/result -shapes stay as shallow named schemas with the Go type marker.</li><li>Contract scan reports duplicate command owner registrations.</li><li><code>gowdk check</code> and CLI <code>gowdk build</code> fail on contract scan diagnostics such -as invalid handler signatures and duplicate command owners.</li><li><code>gowdk graph</code> detects command-emitted events when command handlers call -<code>contracts.EmitDomain</code>, <code>contracts.EmitIntegration</code>, or -<code>contracts.EmitPresentation</code> with a visible event type.</li><li>Contract scanning reports <code>contract_event_category_invalid</code> when a command -emits a visible event type under one category but the scanner only sees -registrations for that event type under another category.</li><li><code>gowdk trace &lt;contract&gt;</code> reports a single command/query/event/job, command -emitted events, event subscribers, source locations, handlers, and roles.</li><li><code>runtime/contracts</code> can capture command-emitted events as <code>EventEnvelope</code> -values and pass them to a dependency-free <code>Outbox</code> interface without -dispatching subscribers.</li><li><code>EventEnvelope</code> carries a stable event ID for outbox/broker replay and worker -deduplication.</li><li>Captured event envelopes can be replayed later with -<code>PublishEnvelope</code>, <code>PublishEnvelopes</code>, and role-filtered variants.</li><li><code>runtime/contracts/fileoutbox</code> provides a dependency-free JSON Lines adapter -that implements <code>contracts.Outbox</code> and <code>contracts.EventSource</code>, including -atomic file replacement, nack retry metadata, and an opt-in dead-letter file.</li><li><code>contracts.NewMemorySeenStore</code>, <code>fileoutbox.NewSeenStore</code>, and -<code>redisstream.NewSeenStore</code> provide deduplication windows for event workers.</li><li>External broker adapters can implement the dependency-free <code>Broker</code> -interface and receive captured envelopes through <code>ExecuteCommandToBroker</code> or -<code>PublishEventsToBroker</code>.</li><li>Realtime adapters can implement the dependency-free <code>PresentationFanout</code> -interface and receive only presentation envelopes through -<code>ExecuteCommandToPresentationFanout</code> or <code>SendPresentationEventsToFanout</code>.</li><li>Generated command adapters expose <code>RegisterContractEventSink</code>; a registered -<code>CommandEventSink</code> receives captured command events before the generated -adapter writes the JSON command result.</li><li>Generated contract packages expose <code>ContractRegistry</code>, <code>NewContractRegistry</code>, and -<code>RunContractEventWorker</code> / <code>RunContractEventWorkerWithSeenStore</code> when -executable contract registrations are present.</li><li>Queue/outbox adapters can implement the dependency-free <code>EventSource</code> -interface and drive worker-role subscribers through <code>RunEventWorker</code>.</li><li><code>internal/appgen</code> records command/query contract exposure metadata in backend -adapter IR, including reference name, alias, import path, local contract -type, result type, runtime roles, decoded input fields, binding status, -handler, register function, owner, and source.</li><li>Generated app adapter source is assembled from Go AST nodes, printed with -<code>go/printer</code>, and normalized with <code>go/format</code>; contract adapter emitters do -not use string line writing.</li><li><code>gowdk routes</code> includes routable <code>g:command</code> and <code>g:query</code> references as -backend endpoint metadata with contract binding details.</li><li><code>gowdk build</code> writes <code>openapi.json</code> for the routable web surface and -<code>asyncapi.json</code> for contract integration events. The AsyncAPI report excludes -domain and presentation events by default. Its CloudEvents mapping is: -<code>type</code> = contract event type, <code>source</code> = the application/module boundary, -<code>id</code> = event envelope identifier supplied by the transport, <code>time</code> = event -envelope time supplied by the transport, and <code>datacontenttype</code> = -<code>application/json</code>. Resolvable local and imported integration-event payload -structs contribute JSON-field schemas; unsupported or unresolvable imported -payloads emit shallow named schemas with the Go type marker.</li><li>Command contract adapter IR includes the form method and either the literal -form action or, for page-owned forms that omit <code>action</code>, the page route.</li><li>Page-owned query contract adapter IR includes <code>GET</code> plus the page route.</li><li>Page-owned generated query routes use JSON/query request negotiation so they -do not replace normal static, SPA, or SSR page responses.</li><li>Cross-package contract input field discovery remains planned.</li><li>Separate web/worker/cron binary generators remain planned platform tooling. -User-owned worker and cron commands can use -<code>NewContractRegistry</code>, <code>RunContractEventWorker*</code>, and -<code>contracts.ExecuteJobForRole</code> with the same registrations today. Schedule -ownership, overlap prevention, durable retry operations, failure reporting, -restart behavior, and production supervision stay app-owned until platform -tooling is designed.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/css/index.html b/docs-site/dist/site/docs/reference/css/index.html deleted file mode 100644 index 9e198683..00000000 --- a/docs-site/dist/site/docs/reference/css/index.html +++ /dev/null @@ -1,201 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>CSS Reference - GOWDK</title> - <meta name="description" content="GOWDK has an initial compile-time CSS extension point. It is intentionally small: Tailwind and other CSS tools are addons, not core dependencies."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="CSS Reference - GOWDK"> - <meta property="og:description" content="GOWDK has an initial compile-time CSS extension point. It is intentionally small: Tailwind and other CSS tools are addons, not core dependencies."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="CSS Reference - GOWDK"> - <meta name="twitter:description" content="GOWDK has an initial compile-time CSS extension point. It is intentionally small: Tailwind and other CSS tools are addons, not core dependencies."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>CSS Reference</h1><p class="doc-lead">GOWDK has an initial compile-time CSS extension point. It is intentionally small: Tailwind and other CSS tools are addons, not core dependencies.</p></header><article class="prose"><p>GOWDK has an initial compile-time CSS extension point. It is intentionally small: -Tailwind and other CSS tools are addons, not core dependencies.</p><h2 id="discovered-page-css">Discovered Page CSS</h2><p>SPA builds discover CSS files by filename. A file named <code>forms.css</code> exports -the CSS input <code>forms</code>; a file named <code>blog.post.css</code> exports <code>blog.post</code>.</p><p>Configure discovery when the default <code>**/*.css</code> scan is too broad:</p><pre><code class="language-go">var Config = gowdk.Config{ - CSS: gowdk.CSSConfig{ - Include: []string{&#34;styles/**/*.css&#34;}, - Exclude: []string{&#34;styles/old.css&#34;}, - }, -} -</code></pre><p>When a page omits <code>css</code>, GOWDK behaves as if the page declared:</p><pre><code class="language-gwdk">css default page -</code></pre><p>Built-in CSS inputs:</p><ul><li><code>default</code>: <code>CSS.Default</code>, or <code>global</code> when <code>global.css</code> exists.</li><li><code>page</code>: CSS matching the page ID, such as <code>blog.post.css</code> for -<code>page blog.post</code>.</li><li><code>none</code>: no GOWDK-managed page CSS, and it must be used alone.</li></ul><p>Examples:</p><pre><code class="language-gwdk">route &#34;/blog/{slug}&#34; -guard public -</code></pre><p>Uses <code>global.css</code> plus page-ID CSS when those files exist. With a derived page -ID from <code>blog-post.page.gwdk</code>, the page-specific file is <code>blog-post.css</code>; with -explicit <code>page blog.post</code>, it is <code>blog.post.css</code>.</p><pre><code class="language-gwdk">route &#34;/dashboard&#34; -guard public -css reset tokens forms -</code></pre><p>Uses only <code>reset.css</code>, <code>tokens.css</code>, and <code>forms.css</code>.</p><pre><code class="language-gwdk">route &#34;/embed&#34; -guard public -css none -</code></pre><p>Disables discovered page CSS inputs. A sibling <code>style {}</code> block still emits -generated CSS for the page.</p><p>Generated page CSS defaults to:</p><pre><code class="language-text">assets/gowdk/&lt;page-id&gt;.css -</code></pre><p>That path is the logical asset name. Build output writes a minified, -content-hashed physical filename such as -<code>assets/gowdk/home.46d269b964e6.css</code>, updates generated stylesheet links to the -hashed URL, and records the logical-to-emitted mapping in <code>gowdk-assets.json</code>.</p><p>Change the output path and href prefix with:</p><pre><code class="language-go">var Config = gowdk.Config{ - CSS: gowdk.CSSConfig{ - Output: gowdk.CSSOutputConfig{ - Dir: &#34;assets/pages&#34;, - HrefPrefix: &#34;/assets/pages&#34;, - }, - }, -} -</code></pre><h2 id="style-blocks">Style Blocks</h2><p>Pages, components, and layouts can declare a sibling <code>style {}</code> block outside -<code>view {}</code>:</p><pre><code class="language-gwdk">view { - &lt;main class=&#34;hero&#34;&gt;Home&lt;/main&gt; -} - -style { - .hero { - color: red; - } -} -</code></pre><p>The style block is parsed separately from the view body. GOWDK emits the CSS as -generated CSS assets instead of inline <code>&lt;style&gt;</code> tags:</p><ul><li>Page style blocks are appended to that page&#39;s generated CSS asset.</li><li>Component style blocks are scoped like component <code>css</code> files.</li><li>Layout style blocks are linked by pages that declare that layout.</li></ul><h2 id="configured-stylesheets">Configured Stylesheets</h2><p>SPA builds emit literal stylesheet links from <code>BuildConfig.Stylesheets</code>:</p><pre><code class="language-go">var Config = gowdk.Config{ - Build: gowdk.BuildConfig{ - Stylesheets: []gowdk.Stylesheet{ - {Href: &#34;/assets/app.css&#34;}, - }, - }, -} -</code></pre><p>Generated pages include:</p><pre><code class="language-html">&lt;link rel=&#34;stylesheet&#34; href=&#34;/assets/app.css&#34;&gt; -</code></pre><p><code>href</code> values are HTML-escaped.</p><h2 id="component-css-and-assets">Component CSS And Assets</h2><p>Component CSS is explicit. A component declares stylesheet inputs with -component-local <code>css</code> metadata declarations:</p><pre><code class="language-gwdk">package components - -component Hero -css &#34;./hero.css&#34; - -view { - &lt;section class=&#34;hero&#34;&gt;...&lt;/section&gt; -} -</code></pre><p>The path is relative to the component source file. GOWDK parses the metadata declaration -and lowers it into the typed <code>.gwdk</code> AST and stable IR with owner metadata, -source path, CSS path, deterministic hash key, and deterministic scope ID. -See <code>examples/components/css/</code> for a component-local CSS metadata example.</p><p>Component assets use the same explicit model:</p><pre><code class="language-gwdk">package components - -component Hero -asset &#34;./hero.png&#34; -</code></pre><p><code>asset</code> paths are also relative to the component source file. GOWDK emits -those files under <code>assets/gowdk/components/&lt;package&gt;/&lt;component&gt;/</code> with -content-hashed filenames, records the logical-to-emitted mapping in -<code>gowdk-assets.json</code>, and serves them from generated binaries with immutable -cache headers. GOWDK does not implicitly bundle arbitrary sibling files.</p><p>Current implementation status:</p><ul><li>Page CSS discovery, page <code>style {}</code> CSS, configured stylesheets, -processor-emitted CSS, minified hashed filenames, asset manifest mappings, -and generated binary cache headers are implemented for build output.</li><li>Component <code>css</code> metadata declarations are parsed, analyzed, emitted as scoped CSS -files, content-hashed, linked from pages whose composed view recursively calls -the component, recorded in <code>gowdk-assets.json</code>, and served with immutable -generated binary cache headers. Component <code>style {}</code> CSS uses the same scoped -emission path.</li><li>Component <code>asset</code> metadata declarations are parsed, analyzed, emitted as -content-hashed files, recorded in <code>gowdk-assets.json</code>, and served with -immutable generated binary cache headers.</li><li>Full component AST bodies are not yet passed to CSS processors. Processors -receive source metadata and the current extracted class subset.</li></ul><p>The component CSS scoping contract is:</p><ul><li>Component CSS is scoped by default when emitted by GOWDK.</li><li>The generated scope marker comes from the component CSS scope ID and is -attached to compiler-owned component output.</li><li>Local selectors are rewritten with the generated scope marker. Rewriting must -avoid surprising specificity changes; when browser support allows it, GOWDK -uses <code>:where(...)</code> around the generated scope marker so scoping adds no -extra selector specificity.</li><li>Local <code>@keyframes</code> names are scoped with the same scope ID, and local -<code>animation</code> and <code>animation-name</code> references are rewritten to the scoped -keyframe name.</li><li>Global CSS does not leak out of component CSS by accident. Use page/global -CSS for application-wide styles. A future explicit <code>:global(...)</code> escape can -be added, but implicit global selectors in component CSS are not part of the -contract.</li><li>Emitted component CSS and <code>asset</code> files are content-hashed, recorded in -<code>gowdk-assets.json</code>, and served with the same generated binary cache policy -as other immutable emitted assets.</li></ul><p>Relationship to other CSS features:</p><ul><li>Page CSS is the implemented build-output path today.</li><li>Component CSS is the component-local authoring and emitted build-output path -today.</li><li>Stylesheet order is deterministic: configured global stylesheets, processor -global stylesheets, processor page-specific stylesheets, generated page CSS, -layout <code>style {}</code> CSS, then scoped CSS for components used by the page.</li><li>CSS processors and Tailwind are optional. They can operate on discovered -source metadata and emitted assets, but they must not become mandatory core -dependencies.</li><li>Generated filenames are content-hashed for emitted GOWDK-managed CSS assets. -Logical-to-emitted mappings and cache headers are recorded in the asset -manifest.</li></ul><h2 id="processor-contract">Processor Contract</h2><p>Compile-time CSS processor addons implement:</p><pre><code class="language-go">type CSSProcessor interface { - gowdk.Addon - ProcessCSS(gowdk.CSSContext) (gowdk.CSSResult, error) -} -</code></pre><p><code>CSSContext</code> includes:</p><ul><li><code>Sources</code>: discovered page/component source metadata.</li><li><code>Sources[*].CSSClasses</code>: extracted literal class names from the current view -subset.</li><li><code>OutputDir</code>: the current build output directory.</li><li><code>Build</code>: the active build config.</li><li><code>CSS</code>: the active CSS config.</li></ul><p>Component <code>css</code> metadata declarations are represented in the typed <code>.gwdk</code> AST and -stable IR with deterministic owner, scope ID, and hash-key metadata for future -scoping and emitted filename decisions. Full component AST bodies are not yet -passed to CSS processors; processors should use source metadata and extracted -classes in the current contract. <code>CSSResult</code> can return global stylesheet -links, page-specific stylesheet links through <code>PageStylesheets</code>, and CSS -assets. Page-specific stylesheet map keys must match known page IDs. CSS asset -paths must be relative and stay inside the output directory.</p><p>Processor-emitted CSS files are recorded in <code>gowdk-assets.json</code>:</p><pre><code class="language-json">{ - &#34;version&#34;: 2, - &#34;files&#34;: { - &#34;assets/app.css&#34;: &#34;assets/app.7ada5a1234b1.css&#34; - }, - &#34;hashes&#34;: { - &#34;assets/app.css&#34;: &#34;sha256:7ada5a1234b1...&#34; - }, - &#34;cache&#34;: { - &#34;assets/app.css&#34;: &#34;public, max-age=31536000, immutable&#34; - } -} -</code></pre><p>GOWDK minifies processor-emitted and discovered page CSS before hashing. A -processor stylesheet link such as <code>/assets/app.css</code> is rewritten to the hashed -emitted file when the processor also emits <code>assets/app.css</code>.</p><p>Configured stylesheet links are not asset manifest entries unless a processor -also emits the referenced file.</p><p><code>addons/css.Addon()</code> registers the <code>css</code> feature. Real processors can implement -<code>gowdk.CSSProcessor</code> directly or use the aliases in <code>addons/css</code>.</p><h2 id="tailwind-addon">Tailwind Addon</h2><p><code>addons/tailwind</code> provides an experimental Tailwind v4-oriented processor that -uses the standalone CLI:</p><pre><code class="language-go">Addons: []gowdk.Addon{ - tailwind.Addon(tailwind.Options{ - Input: &#34;assets/app.css&#34;, - Minify: true, - }), -} -</code></pre><p>Defaults:</p><ul><li><code>Command</code>: use <code>tailwindcss</code> from <code>PATH</code>.</li><li><code>OutputPath</code>: <code>assets/app.css</code></li><li><code>Href</code>: <code>/assets/app.css</code></li></ul><p>At build time the addon creates a temporary Tailwind input file that imports the -configured <code>Input</code> CSS and adds <code>@source</code> declarations for discovered GOWDK -source files. This follows Tailwind v4&#39;s CSS/source directive model. It then -runs the standalone executable with <code>-i &lt;temp-input&gt; -o &lt;temp-output&gt;</code>.</p><p>The addon does not use npm, run <code>npx</code>, or run through a shell. If <code>Command</code> is -omitted and <code>tailwindcss</code> is not available on <code>PATH</code>, <code>gowdk build</code> fails with -an install-required error. GOWDK does not download Tailwind. Install Tailwind -through your approved toolchain and use an explicit executable when builds need -a pinned binary:</p><pre><code class="language-go">tailwind.Addon(tailwind.Options{ - Input: &#34;assets/app.css&#34;, - Command: &#34;.gowdk/bin/tailwindcss&#34;, -}) -</code></pre><p>Minimal setup:</p><pre><code class="language-sh">mkdir -p assets -printf &#39;@import &#34;tailwindcss&#34;;\n&#39; &gt; assets/app.css -tailwindcss --help &gt;/dev/null -</code></pre><p>Windows PowerShell setup:</p><pre><code class="language-powershell">New-Item -ItemType Directory -Force assets -Set-Content -Path assets/app.css -Value &#39;@import &#34;tailwindcss&#34;;&#39; -tailwindcss --help | Out-Null -</code></pre><p>Then configure GOWDK:</p><pre><code class="language-go">package main - -import ( - &#34;github.com/cssbruno/gowdk&#34; - &#34;github.com/cssbruno/gowdk/addons/tailwind&#34; -) - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - tailwind.Addon(tailwind.Options{ - Input: &#34;assets/app.css&#34;, - Minify: true, - }), - }, -} -</code></pre><p>Build output, generated app output, and generated binaries all receive the -processor-emitted stylesheet link and generated CSS asset:</p><pre><code class="language-sh">gowdk build --out dist/site -gowdk build --out dist/site --app .gowdk/app --bin bin/site -</code></pre><p>The literal <code>gowdk.config.go</code> parser supports this known literal constructor -shape when <code>tailwind</code> is imported from -<code>github.com/cssbruno/gowdk/addons/tailwind</code>. It also recognizes built-in -no-argument addon constructors. External CSS processor addons can be imported -from other Go modules; when the AST-only loader cannot reduce the constructor, -GOWDK uses the executable config bridge and proxies <code>ProcessCSS</code> back to that -importable addon.</p><p>GOWDK does not generate Tailwind v3 <code>content</code> configuration in this slice.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/db/index.html b/docs-site/dist/site/docs/reference/db/index.html deleted file mode 100644 index c98fac84..00000000 --- a/docs-site/dist/site/docs/reference/db/index.html +++ /dev/null @@ -1,138 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>DB Addon - GOWDK</title> - <meta name="description" content="addons/db is experimental 0.x database/sql plumbing. It does not own schemas, migrations, sqlc output, repositories, domain validation, tenants, or resource authorization."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="DB Addon - GOWDK"> - <meta property="og:description" content="addons/db is experimental 0.x database/sql plumbing. It does not own schemas, migrations, sqlc output, repositories, domain validation, tenants, or resource authorization."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="DB Addon - GOWDK"> - <meta name="twitter:description" content="addons/db is experimental 0.x database/sql plumbing. It does not own schemas, migrations, sqlc output, repositories, domain validation, tenants, or resource authorization."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>DB Addon</h1><p class="doc-lead">addons/db is experimental 0.x database/sql plumbing. It does not own schemas, migrations, sqlc output, repositories, domain validation, tenants, or resource authorization.</p></header><article class="prose"><p><code>addons/db</code> is experimental 0.x <code>database/sql</code> plumbing. It does not own -schemas, migrations, sqlc output, repositories, domain validation, tenants, or -resource authorization.</p><h2 id="open-a-database">Open A Database</h2><p>Import the driver in app-owned Go, then open the database through the helper:</p><pre><code class="language-go">package data - -import ( - &#34;database/sql&#34; - &#34;os&#34; - - gowdkdb &#34;github.com/cssbruno/gowdk/addons/db&#34; - _ &#34;github.com/jackc/pgx/v5/stdlib&#34; -) - -func Open() (*sql.DB, error) { - return gowdkdb.OpenWithOptions(&#34;pgx&#34;, os.Getenv(&#34;DATABASE_URL&#34;), gowdkdb.Options{ - MaxOpenConns: 10, - MaxIdleConns: 5, - }) -} -</code></pre><p>The DB addon imports no SQL driver. Keep driver dependencies in the application -module or in an optional nested module.</p><h2 id="apply-sql-migrations">Apply SQL Migrations</h2><p>Embed user-authored SQL files and apply them in lexical order:</p><pre><code class="language-go">package data - -import ( - &#34;context&#34; - &#34;database/sql&#34; - &#34;embed&#34; - - gowdkdb &#34;github.com/cssbruno/gowdk/addons/db&#34; -) - -//go:embed migrations/*.sql -var migrationFiles embed.FS - -func ApplyMigrations(ctx context.Context, database *sql.DB) error { - _, err := gowdkdb.ApplyMigrations(ctx, database, migrationFiles, gowdkdb.MigrationOptions{ - Dir: &#34;migrations&#34;, - Placeholder: gowdkdb.DollarPlaceholder, - }) - return err -} -</code></pre><p>Tracking contract:</p><ul><li>The default tracking table is <code>gowdk_schema_migrations</code>.</li><li>Each row stores migration file name, SHA-256 checksum, and applied timestamp. -Migration names are limited to 255 characters so the tracking table can use a -bounded primary key on MySQL-compatible drivers.</li><li>Re-running the same file with the same checksum skips it.</li><li>Re-running the same file name with different content fails with a checksum -mismatch.</li><li>Before user SQL runs, <code>ApplyMigrations</code> reserves the migration name in the -tracking table and finalizes the checksum after the SQL succeeds. Concurrent -runners are serialized by that primary-key reservation; a runner that sees an -incomplete reservation fails closed instead of executing the same file again.</li><li><code>MigrationResult</code> is returned only after the transaction commits. If a -migration, reservation, tracking update, or commit fails, the returned result -is empty.</li><li><code>MigrationOptions.Table</code> can rename the tracking table, but only simple SQL -identifiers are accepted.</li><li><code>QuestionPlaceholder</code> is the default. Use <code>DollarPlaceholder</code> for -PostgreSQL-style drivers.</li></ul><p>GOWDK does not split SQL files, generate migration files, infer schema state, or -own rollback/down semantics. Keep those policies in normal Go and SQL tooling.</p><h2 id="transactions">Transactions</h2><p>Use <code>WithTx</code> when an action, API, command, or service method needs one -transaction:</p><pre><code class="language-go">func CreatePatient(ctx context.Context, database *sql.DB, input CreatePatientInput) error { - return gowdkdb.WithTx(ctx, database, nil, func(ctx context.Context, tx *sql.Tx) error { - queries := patientdb.New(tx) - return queries.CreatePatient(ctx, patientdb.CreatePatientParams{ - Name: input.Name, - }) - }) -} -</code></pre><p><code>WithTx</code> begins with the provided context, commits when the function returns -nil, rolls back when it returns an error, and rolls back before re-panicking if -the function panics. Context cancellation before <code>BeginTx</code> prevents the -function from running.</p><h2 id="readiness">Readiness</h2><p>Generated apps already expose <code>/_gowdk/health</code> for process and artifact status. -Database readiness is app-owned because DSNs, tenants, credentials, and failure -policy are app-specific. Expose it through a normal generated API when needed:</p><pre><code class="language-gwdk">api DatabaseReady GET &#34;/api/ready&#34; -</code></pre><pre><code class="language-go">func DatabaseReady(ctx context.Context, _ *http.Request) (response.Response, error) { - readiness := gowdkdb.CheckReadiness(ctx, database) - status := http.StatusOK - if !readiness.Ready { - status = http.StatusServiceUnavailable - } - return response.JSONValue(status, readiness) -} -</code></pre><p>Do not return DSNs, credentials, tenant IDs, or query results from readiness -endpoints. <code>CheckReadiness</code> returns a generic public error string on failure; -use <code>Ping</code> directly when server-side startup or logging code needs the wrapped -database error.</p><h2 id="sqlc-walkthrough">sqlc Walkthrough</h2><p>Install and run sqlc in the application module; GOWDK does not run it for you:</p><pre><code class="language-sh">go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest -sqlc generate -go test ./... -</code></pre><p>Minimal app layout:</p><pre><code class="language-text">db/schema.sql -db/query.sql -internal/patientdb/ # generated by sqlc -src/patients.go # GOWDK action/API handlers call patientdb -</code></pre><p><code>sqlc.yaml</code>:</p><pre><code class="language-yaml">version: &#34;2&#34; -sql: - - engine: &#34;postgresql&#34; - schema: &#34;db/schema.sql&#34; - queries: &#34;db/query.sql&#34; - gen: - go: - package: &#34;patientdb&#34; - out: &#34;internal/patientdb&#34; -</code></pre><p><code>db/query.sql</code>:</p><pre><code class="language-sql">-- name: CreatePatient :one -INSERT INTO patients (name) VALUES ($1) -RETURNING id, name; -</code></pre><p>Handler usage:</p><pre><code class="language-go">func SavePatient(ctx context.Context, values form.Values) (response.Response, error) { - name := strings.TrimSpace(values.First(&#34;name&#34;)) - err := gowdkdb.WithTx(ctx, database, nil, func(ctx context.Context, tx *sql.Tx) error { - queries := patientdb.New(tx) - _, err := queries.CreatePatient(ctx, name) - return err - }) - if err != nil { - return response.Response{}, err - } - return response.RedirectTo(&#34;/patients&#34;), nil -} -</code></pre><p>Test the GOWDK helper package and the isolated real-driver module from this -repository:</p><pre><code class="language-sh">go test ./addons/db -(cd addons/db/sqlitetest &amp;&amp; go test ./...) -scripts/test-go-modules.sh -</code></pre><p><code>scripts/test-go-modules.sh</code> includes <code>addons/db/sqlitetest</code>, so CI covers the -real-driver SQLite smoke without adding that driver to the root module graph.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/deployment/index.html b/docs-site/dist/site/docs/reference/deployment/index.html deleted file mode 100644 index c32868b1..00000000 --- a/docs-site/dist/site/docs/reference/deployment/index.html +++ /dev/null @@ -1,315 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Deployment - GOWDK</title> - <meta name="description" content="GOWDK currently supports three practical output shapes:"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Deployment - GOWDK"> - <meta property="og:description" content="GOWDK currently supports three practical output shapes:"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Deployment - GOWDK"> - <meta name="twitter:description" content="GOWDK currently supports three practical output shapes:"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Deployment</h1><p class="doc-lead">GOWDK currently supports three practical output shapes:</p></header><article class="prose"><p>GOWDK currently supports three practical output shapes:</p><ul><li>Build output files from <code>gowdk build --out</code>.</li><li>A generated Go app from <code>gowdk build --out --app</code>.</li><li>A local-platform binary or Go <code>js/wasm</code> artifact from the generated app.</li></ul><p>Deployment orchestration is user-owned. GOWDK can emit a minimal Docker context -for one-binary deploys and optional starter recipes for common static, process, -reverse-proxy, and split frontend/backend shapes, but it does not generate -Kubernetes manifests, platform adapters, secrets, TLS policy, storage, -backups, incident response, rollout logic, or CDN configuration.</p><table><thead><tr><th>Shape</th><th>Use When</th><th>Current Command Surface</th></tr></thead><tbody><tr><td>Static output</td><td>The app has no generated request-time handlers.</td><td><code>gowdk build --out &lt;dir&gt;</code></td></tr><tr><td>Single binary</td><td>Static output and generated request-time handlers ship together.</td><td><code>gowdk build --out &lt;dir&gt; --app &lt;dir&gt; --bin &lt;file&gt;</code></td></tr><tr><td>Split frontend/backend</td><td>Static frontend and generated backend routes deploy separately.</td><td><code>gowdk build --out &lt;dir&gt; --app &lt;dir&gt; --bin &lt;file&gt; --backend-app &lt;dir&gt; --backend-bin &lt;file&gt;</code></td></tr><tr><td>Backend-only</td><td>A generated backend route app is deployed behind another frontend.</td><td><code>gowdk build --backend-app &lt;dir&gt; --backend-bin &lt;file&gt;</code></td></tr><tr><td>Go WASM artifact</td><td>A host can execute a Go <code>js/wasm</code> generated app artifact.</td><td><code>gowdk build --out &lt;dir&gt; --app &lt;dir&gt; --wasm &lt;file&gt;</code></td></tr></tbody></table><h2 id="optional-recipes">Optional Recipes</h2><p><code>gowdk build --deploy-recipe &lt;name&gt;</code> emits starter deployment files after the -selected build artifacts are written. The flag may be repeated or -comma-separated:</p><pre><code class="language-sh">gowdk build --out dist/site --deploy-recipe static -gowdk build --out dist/site --app .gowdk/app --bin bin/site --deploy-recipe systemd,caddy -gowdk build --out dist/site --backend-app .gowdk/backend --backend-bin bin/backend --deploy-recipe split -</code></pre><p>Supported recipes:</p><table><thead><tr><th>Recipe</th><th>Requires</th><th>Output</th></tr></thead><tbody><tr><td><code>static</code></td><td><code>--out</code></td><td><code>&lt;out&gt;/deploy/static-host.md</code></td></tr><tr><td><code>systemd</code></td><td><code>--bin</code> or <code>--backend-bin</code></td><td><code>&lt;binary-dir&gt;/gowdk-&lt;binary&gt;.service</code></td></tr><tr><td><code>caddy</code></td><td><code>--bin</code> or <code>--backend-bin</code></td><td><code>&lt;binary-dir&gt;/Caddyfile</code></td></tr><tr><td><code>nginx</code></td><td><code>--bin</code> or <code>--backend-bin</code></td><td><code>&lt;binary-dir&gt;/nginx.gowdk.conf</code></td></tr><tr><td><code>split</code></td><td><code>--out</code> and <code>--backend-bin</code></td><td><code>&lt;out&gt;/deploy/split-frontend-backend.md</code></td></tr></tbody></table><p>Recipes are starting points, not production guarantees. Review every -environment-specific setting before using them. Keep domains, TLS, CDN policy, -secrets, storage, backups, health checks beyond <code>/_gowdk/health</code>, and rollout -strategy in app-owned infrastructure.</p><h2 id="build-output-files">Build Output Files</h2><p>Build build output:</p><pre><code class="language-sh">gowdk build --out dist/site -</code></pre><p>Deploy the contents of <code>dist/site</code> with any asset host that can serve -directory indexes:</p><pre><code class="language-text">dist/site/ - index.html - routes... - assets... - gowdk-routes.json - gowdk-assets.json - openapi.json - asyncapi.json - gowdk-build-report.json -</code></pre><p>Local smoke test:</p><pre><code class="language-sh">gowdk serve --dir dist/site --addr 127.0.0.1:8080 -</code></pre><p><code>gowdk serve</code> serves generated build output from disk. It does not run generated -request-time features.</p><h2 id="single-binary">Single Binary</h2><p>Build build output, generated app source, and a local binary:</p><pre><code class="language-sh">gowdk build --out dist/site --app .gowdk/app --bin bin/site -</code></pre><p>Run the binary:</p><pre><code class="language-sh">./bin/site -</code></pre><p>Smoke-test a known generated route from the repository root:</p><pre><code class="language-sh">GOWDK_SMOKE_ADDR=127.0.0.1:18085 scripts/smoke-generated-binary.sh bin/site / -</code></pre><p>The generated app embeds the selected build output and serves it through -<code>runtime/app</code>. It also exposes:</p><ul><li><code>/_gowdk/health</code></li><li><code>X-GOWDK-*</code> identity response headers</li></ul><p>Generated apps may attach <code>runtime/app.Metrics</code> to the runtime handler. When -present, <code>/_gowdk/health</code> includes a snapshot of request, static, backend, -action, API, SSR, not-found, method-not-allowed, and CSRF-unavailable counters.</p><p>Runtime identity environment variables:</p><ul><li><code>GOWDK_APP_ID</code>: application identity metadata.</li><li><code>GOWDK_MODULE_NAME</code>: module identity metadata.</li><li><code>GOWDK_INSTANCE_ID</code>: stable runtime instance ID. If omitted, one is generated -at process start.</li></ul><p>The selected module set is fixed at build time. <code>GOWDK_MODULE_NAME</code> does not -change which files were embedded.</p><p>Single-binary deploy is the primary GOWDK differentiator. Prefer this path when -the app needs generated actions, APIs, partial fragments, guards, CSRF, SSR, or -embedded assets in one artifact.</p><h2 id="split-frontend-and-backend">Split Frontend And Backend</h2><p>Use split frontend/backend output when static pages and backend routes have -different scaling, network, or deployment requirements. A split build creates:</p><ul><li>frontend build output and, when requested, a frontend binary that serves that -output;</li><li>a backend-only generated app and binary for generated action, API, fragment, -SSR, and contract routes;</li><li>frontend proxy metadata for generated backend routes.</li></ul><p>The frontend process forwards generated backend routes to -<code>GOWDK_BACKEND_ORIGIN</code>. Set that variable to the internal backend origin, such -as <code>http://127.0.0.1:8081</code> on one host or a private service URL in a platform -network. Keep CSRF secrets and backend-only service credentials on the backend -process. Keep TLS, public host routing, compression, and request-ID generation -at the edge or reverse proxy.</p><p>Deploy frontend and backend artifacts together when route manifests, endpoint -metadata, CSRF policy, or generated asset paths changed. Roll them back -together for the same reason.</p><h2 id="backend-only">Backend-Only</h2><p><code>gowdk build --backend-app &lt;dir&gt; --backend-bin &lt;file&gt;</code> writes a generated -backend route app without embedding frontend output. Use this for API/action -services behind an app-owned frontend or split deployment. A backend-only app -still exposes <code>/_gowdk/health</code>, generated headers, registered middleware, -guards, rate limits, CSRF checks where applicable, and request-time route -dispatch.</p><p>Backend-only output does not serve static pages. Pair it with static output, a -frontend binary, or a non-GOWDK frontend only when route ownership is explicit -and the frontend knows where generated endpoints live.</p><h2 id="process-lifecycle-and-logs">Process Lifecycle And Logs</h2><p>The generated <code>cmd/server</code> entrypoint is intentionally small: it constructs the -generated application with <code>gowdkapp.App()</code>, reads <code>GOWDK_ADDR</code>, installs the -documented <code>http.Server</code> timeout and header limits, logs startup, and calls -<code>runtime/app.Run</code>. The runtime supervisor mounts configured lifecycle services, -starts the HTTP server, cancels on service/server error or SIGINT/SIGTERM, and -uses a 10 second graceful shutdown timeout.</p><p>Apps that need a different drain policy can use the generated package from -app-owned startup code:</p><pre><code class="language-go">application, err := gowdkapp.App() -if err != nil { - return err -} -server := &amp;http.Server{Addr: &#34;:8080&#34;, Handler: application.Handler} -return gowdkruntime.Run(ctx, server, application, gowdkruntime.RunOptions{ShutdownTimeout: 30 * time.Second}) -</code></pre><p>Request logging, structured logs, route logging, OpenTelemetry instrumentation, -compression, optional ETags, and protocol-specific background services are -app-owned middleware, lifecycle services, or reverse-proxy concerns. GOWDK keeps -generated panic responses generic and redacts secret-like text from generated -panic logs.</p><h2 id="docker">Docker</h2><p><code>gowdk build --docker</code> emits a <code>Dockerfile</code> and <code>.dockerignore</code> beside the -compiled <code>--bin</code> artifact:</p><pre><code class="language-sh">GOOS=linux CGO_ENABLED=0 gowdk build --out dist/site --app .gowdk/app --bin bin/site --docker -cd bin -docker build -t my-gowdk-site . -docker run --rm -p 8080:8080 my-gowdk-site -</code></pre><p>The default Dockerfile uses a distroless base:</p><pre><code class="language-dockerfile">FROM gcr.io/distroless/base-debian12 -WORKDIR /app -COPY [&#34;site&#34;, &#34;/app/site&#34;] -ENV GOWDK_ADDR=0.0.0.0:8080 -EXPOSE 8080 -USER nonroot:nonroot -ENTRYPOINT [&#34;/app/site&#34;] -</code></pre><p>Use <code>--docker-base scratch</code> only with a statically linked Linux binary:</p><pre><code class="language-sh">GOOS=linux CGO_ENABLED=0 gowdk build --out dist/site --app .gowdk/app --bin bin/site --docker --docker-base scratch -</code></pre><p><code>--docker</code> requires <code>--bin</code>; it packages the generated app binary and does not -build or push an image. <code>--docker-base scratch</code> rejects dynamically linked ELF -binaries, and all Dockerfile generation rejects non-ELF binaries with guidance -to build with <code>GOOS=linux</code>.</p><p>Pass app secrets, CSRF secrets, database URLs, and service credentials as -runtime environment variables owned by your deployment platform. For local -generated-binary runs, <code>GOWDK_ENV_FILE=/path/to/.env</code> can point the binary at a -dotenv file; host environment values still take precedence over file values.</p><h2 id="csrf-secret-rotation">CSRF Secret Rotation</h2><p>Generated CSRF currently validates tokens with one active signing secret from -<code>Build.CSRF.SecretEnv</code> or <code>GOWDK_CSRF_SECRET</code>. CSRF is enabled by default for -generated action and web-command POSTs; generated apps fail closed at startup if -those endpoints are present and the secret is absent. There is no multi-key -grace period yet.</p><p>Rotate CSRF secrets as a coordinated deploy:</p><ol><li>Build and smoke-test the new binary.</li><li>Set the new secret in the deployment platform.</li><li>Restart or replace every generated app instance that serves action POSTs.</li><li>Confirm <code>/_gowdk/health</code> is reachable on every instance.</li><li>Expect forms rendered before the rotation to fail with HTTP 403 -<code>invalid csrf token</code>; users should reload the page and resubmit.</li></ol><p>Do not run mixed old/new CSRF secrets behind the same load balancer for longer -than the deploy window. If a rollback is needed, restore both the previous -binary and the previous CSRF secret.</p><h2 id="systemd">systemd</h2><p>Generate a starter unit beside a compiled frontend or backend binary:</p><pre><code class="language-sh">gowdk build --out dist/site --app .gowdk/app --bin bin/site --deploy-recipe systemd -</code></pre><p>The generated <code>&lt;binary-dir&gt;/gowdk-&lt;binary&gt;.service</code> is a starting point for a -Linux VM. A typical unit shape is:</p><pre><code class="language-ini">[Unit] -Description=GOWDK site -After=network.target - -[Service] -WorkingDirectory=/opt/gowdk-site -ExecStart=/opt/gowdk-site/bin/site -Environment=GOWDK_ADDR=127.0.0.1:8080 -Environment=GOWDK_APP_ID=site -Restart=on-failure -RestartSec=2s -User=gowdk -Group=gowdk - -[Install] -WantedBy=multi-user.target -</code></pre><p>Keep secrets in systemd drop-ins, an environment file with correct filesystem -permissions, or the host secret manager. Do not commit them to the repository.</p><h2 id="reverse-proxies">Reverse Proxies</h2><p>Generated binaries speak plain HTTP. Put TLS, HTTP/2, compression, and public -host routing in a normal reverse proxy.</p><p>Generate starter proxy snippets beside a compiled frontend or backend binary:</p><pre><code class="language-sh">gowdk build --out dist/site --app .gowdk/app --bin bin/site --deploy-recipe caddy --deploy-recipe nginx -</code></pre><p>Caddy:</p><pre><code class="language-caddyfile">example.com { - reverse_proxy 127.0.0.1:8080 -} -</code></pre><p>nginx:</p><pre><code class="language-nginx">server { - listen 80; - server_name example.com; - - location / { - proxy_pass http://127.0.0.1:8080; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } -} -</code></pre><p>Configure trusted proxy behavior in app-owned middleware when handlers depend -on forwarded IP, host, or scheme values.</p><h2 id="security-headers">Security Headers</h2><p>Generated binaries can emit configured response headers through -<code>Build.SecurityHeaders</code>. Edge or app-owned middleware can still add deployment -headers that belong at the proxy/TLS boundary. Before making request-time routes -public, configure the generated app, reverse proxy, or app middleware for:</p><ul><li><code>X-Content-Type-Options: nosniff</code>.</li><li><code>Referrer-Policy: strict-origin-when-cross-origin</code> for most sites, or -<code>no-referrer</code> for apps with sensitive URLs.</li><li><code>Content-Security-Policy</code> scoped to the app&#39;s real asset needs. Start from -<code>default-src &#39;self&#39;</code>; add only the script, style, image, font, connect, WASM, -and API origins the generated app and user code actually use.</li><li>Frame policy through <code>Content-Security-Policy: frame-ancestors &#39;none&#39;</code> or -<code>&#39;self&#39;</code>. Use <code>X-Frame-Options: DENY</code> or <code>SAMEORIGIN</code> only as a compatibility -header for older clients.</li><li><code>Strict-Transport-Security</code> only at the HTTPS edge, after TLS, redirects, and -rollback behavior are verified. Do not send HSTS from local HTTP dev servers.</li></ul><p>Preserve generated <code>Cache-Control: no-store</code> responses for actions, APIs, -fragments, SSR failures, generated errors, and CSRF-mutated HTML.</p><h2 id="cookie-policy">Cookie Policy</h2><p>Generated CSRF cookies use <code>HttpOnly</code>, <code>Secure</code>, and <code>SameSite=Lax</code> by default. -<code>Build.CSRF.Insecure</code> is only for local HTTP development and disables the -<code>Secure</code> flag because browsers reject secure-prefixed cookies over plain HTTP.</p><p>Application-owned cookies remain application-owned. When handlers use -<code>runtime/response.WithCookie</code>, <code>http.SetCookie</code>, or addon helpers, set:</p><ul><li><code>HttpOnly</code> for cookies that JavaScript should not read.</li><li><code>Secure</code> for every non-local deployment.</li><li><code>SameSite=Lax</code> or <code>SameSite=Strict</code> unless a cross-site flow explicitly needs -<code>SameSite=None; Secure</code>.</li><li><code>Path</code> to the narrowest route prefix that needs the cookie.</li><li><code>Domain</code> only when sharing across subdomains is intentional; omit it for -host-only cookies.</li><li>Short, explicit <code>MaxAge</code>/<code>Expires</code> values for session and action-flow cookies.</li></ul><p>Do not store bearer tokens, API keys, private keys, passwords, CSRF secrets, or -database credentials in client cookies.</p><h2 id="operations-security">Operations Security</h2><p>Terminate TLS at the reverse proxy, load balancer, or platform edge. Generated -binaries should usually bind to <code>127.0.0.1:&lt;port&gt;</code> behind that edge on VMs, or -to <code>0.0.0.0:&lt;port&gt;</code> only inside a container or platform network that provides -the public TLS boundary.</p><p>Generate or sanitize request IDs at the trusted edge and pass them through a -single header such as <code>X-Request-ID</code>. Do not trust arbitrary client-supplied -request IDs for audit or correlation without validation. App-owned middleware -can attach the trusted request ID to logs and handler context.</p><p>Use <code>/_gowdk/health</code> for process and artifact identity checks. Treat it as an -operational endpoint: keep it internal when possible, or expose it only when -the identity fields and counters are acceptable for public visibility. Do not -put secrets, tenant data, user data, or database connectivity details in health -responses.</p><p>Generated runtime metrics are process-local counters exposed through -<code>runtime/app.Metrics</code> when the generated handler is configured with a collector. -Export, scrape, or aggregate them through app-owned telemetry code. Keep metrics -labels low-cardinality and avoid user identifiers, tokens, submitted values, or -full URLs with sensitive query strings.</p><h2 id="logging-readiness-and-shutdown">Logging, Readiness, And Shutdown</h2><p>Generated server entrypoints log startup and fatal listen errors with the Go -standard logger. App-owned middleware and handlers own request logs, structured -logs, sampling, trace IDs, and log sinks. Do not log secrets, raw submitted form -values, bearer tokens, CSRF tokens, private keys, database URLs, or full query -strings that may contain user data.</p><p>Use <code>/_gowdk/health</code> as a process/readiness check after the binary starts and -after each deployment step. If the app depends on a database, queue, cache, or -third-party service, expose those checks in app-owned endpoints or middleware; -GOWDK health responses must not include secret or tenant-specific details.</p><p>Generated entrypoints use the standard HTTP server shape. Platform shutdown, -drain time, signal handling, and connection draining remain deployment-owned: -configure systemd, containers, load balancers, or app-owned wrappers to stop -sending traffic before replacing the process.</p><h2 id="artifact-layout">Artifact Layout</h2><p>Keep deploy artifacts immutable and grouped by build:</p><pre><code class="language-text">release-YYYY-MM-DD/ - bin/site - dist/site/ - .gowdk/app/ # optional generated source for debugging/rebuilds - checksums.txt - gowdk-build-report.json - gowdk-routes.json - gowdk-assets.json - gowdk-security.json -</code></pre><p>Do not serve <code>.gowdk/</code> or non-public reports directly from a static host. For a -single binary, the embedded output is already inside <code>bin/site</code>; keep the source -reports next to the artifact for audit and rollback, not as public web files.</p><h2 id="cache-defaults">Cache Defaults</h2><p>Generated binaries use explicit cache headers:</p><ul><li>Embedded SPA HTML uses <code>Cache-Control: no-cache</code> by default, so browsers may -store it but must revalidate before reuse. A page-level <code>cache</code> overrides -this default for successful static SPA HTML generated by that page.</li><li>Generated CSS and generated browser runtime assets recorded in -<code>gowdk-assets.json</code> use their recorded cache policy. The current generated -policy is <code>Cache-Control: public, max-age=31536000, immutable</code> with SHA-256 -content hashes in the asset manifest. Generated CSS is minified and emitted -with a content-hashed filename; the asset manifest maps the stable logical -CSS path to the emitted hashed path.</li><li>CSRF-personalized HTML, action responses, API responses, partial fragments, -SSR HTML without an explicit <code>cache</code>, SSR load redirects, generated handler -errors, generated error pages, and invalid-CSRF responses use -<code>Cache-Control: no-store</code>.</li><li>Page-level <code>cache</code> records route response cache intent in compiler, route, -build-report, manifest, generated asset metadata, and generated SSR route -metadata. -Generated binaries apply it to successful static SPA HTML and SSR HTML -responses for that page. It does not override the no-store safety policy for -actions, APIs, partial responses, load redirects, generated errors, or -CSRF-mutated HTML.</li><li>Page-level <code>revalidate</code> requires <code>cache</code> and appends -<code>stale-while-revalidate=&lt;seconds&gt;</code> to the generated Cache-Control header for -successful static SPA HTML and SSR HTML responses. Accepted values are whole -seconds or whole-second durations such as <code>60s</code>, <code>5m</code>, or <code>1h</code>.</li></ul><h2 id="static-hosts-and-cdn">Static Hosts And CDN</h2><p>For pure build-time output, deploy <code>gowdk build --out dist/site</code> to any static -host that supports directory indexes.</p><p>Recommended CDN policy:</p><ul><li>Respect generated <code>Cache-Control</code> headers when serving through a generated -binary.</li><li>For static-file hosting, cache content-hashed assets under <code>assets/</code> for a -long time.</li><li>Revalidate HTML unless the page has an explicit <code>cache</code> policy.</li><li>Do not cache action/API/fragment/SSR error responses from a generated binary.</li></ul><p>Cloudflare Pages, Vercel, and Netlify can serve static <code>dist/site</code> output when -the app does not need generated request-time handlers. Use a generated binary, -container, VM, or platform that can run Go when the app needs actions, APIs, -fragments, SSR, guards, CSRF, or server validation.</p><p>Cloudflare Workers compatibility is limited to generated static output or the -separate Go <code>js/wasm</code> deploy artifact. GOWDK does not currently emit a Workers -adapter.</p><p>Kubernetes guidance is intentionally not generated. Use normal container and -service manifests around the Docker/single-binary shape only when your -deployment environment already requires Kubernetes.</p><h2 id="rollback">Rollback</h2><p>Keep each release artifact immutable:</p><ul><li>the generated binary;</li><li>the generated build output used to create that binary;</li><li>the config and environment variable set used at runtime;</li><li>the checksum and attestation for the artifact.</li></ul><p>Rollback means restoring the previous known-good artifact and its matching -runtime configuration. For single-binary deploys, keep the previous binary on -the host or in the image registry and switch the process manager, container tag, -or deployment descriptor back to that version. For static hosts, redeploy the -previous <code>dist/site</code> output directory. For split frontend/backend deploys, -rollback both sides together when route, endpoint, CSRF, or asset manifests -changed.</p><p>After rollback, verify:</p><pre><code class="language-sh">curl -fsS http://127.0.0.1:8080/_gowdk/health -</code></pre><p>Then smoke-test one static page and one generated request-time route if the app -uses actions, APIs, fragments, SSR, guards, or CSRF.</p><h2 id="backups-incidents-and-dependencies">Backups, Incidents, And Dependencies</h2><p>GOWDK does not own application data backups, restore testing, incident response, -dependency update policy, or platform patching. Treat generated artifacts as -replaceable build output. Back up app-owned databases, object storage, queues, -event logs, user uploads, secrets, and deployment descriptors according to the -platform that owns them.</p><p>Before a release, record the GOWDK version, Go version, module checksums, -enabled addons, build target, artifact checksum, and runtime environment names. -During an incident, use generated route, asset, build, and security reports to -identify which routes and endpoints are present, then debug user-owned handlers -and infrastructure through the app&#39;s normal observability stack.</p><h2 id="module-and-target-builds">Module And Target Builds</h2><p>Use modules for source selection:</p><pre><code class="language-sh">gowdk build --module public --out dist/public --app .gowdk/public --bin bin/public -gowdk build --module admin,api --out dist/admin-api --app .gowdk/admin-api --bin bin/admin-api -</code></pre><p>Use <code>Build.Targets</code> for repeatable packaging:</p><pre><code class="language-go">Build: gowdk.BuildConfig{ - Targets: []gowdk.BuildTargetConfig{ - { - Name: &#34;public&#34;, - Modules: []string{&#34;public&#34;}, - Output: &#34;dist/public&#34;, - App: &#34;.gowdk/public&#34;, - Binary: &#34;bin/public&#34;, - }, - { - Name: &#34;admin&#34;, - Modules: []string{&#34;admin&#34;}, - Output: &#34;dist/admin&#34;, - App: &#34;.gowdk/admin&#34;, - Binary: &#34;bin/admin&#34;, - }, - }, -} -</code></pre><p>Run every target:</p><pre><code class="language-sh">gowdk build -</code></pre><p>Run one target:</p><pre><code class="language-sh">gowdk build --target admin -</code></pre><p>Use distinct <code>Output</code> and <code>App</code> directories for separate binaries.</p><p>Configured build targets can also request deployment recipes:</p><pre><code class="language-go">Build: gowdk.BuildConfig{ - Targets: []gowdk.BuildTargetConfig{ - { - Name: &#34;site&#34;, - Output: &#34;dist/site&#34;, - App: &#34;.gowdk/site&#34;, - Binary: &#34;bin/site&#34;, - DeployRecipes: []string{&#34;systemd&#34;, &#34;caddy&#34;}, - }, - }, -} -</code></pre><h2 id="wasm-deploy-artifact">WASM Deploy Artifact</h2><p><code>--wasm</code> compiles the generated app with <code>GOOS=js GOARCH=wasm</code>:</p><pre><code class="language-sh">gowdk build --out dist/site --app .gowdk/app --wasm bin/site.wasm -</code></pre><p>Smoke-test the emitted module header:</p><pre><code class="language-sh">scripts/smoke-generated-wasm.sh bin/site.wasm -</code></pre><p>This is a Go <code>js/wasm</code> deploy artifact for runtimes that can execute that -artifact. It is separate from browser island assets emitted for component-level -<code>wasm</code> declarations. GOWDK does not emit a generic host runtime or loader for -this deploy artifact; that integration belongs to the selected deploy platform.</p><h2 id="addons">Addons</h2><p>Addons are normal Go packages imported by <code>gowdk.config.go</code>:</p><pre><code class="language-go">import ( - &#34;github.com/cssbruno/gowdk/addons/actions&#34; - &#34;github.com/cssbruno/gowdk/addons/partial&#34; -) - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - actions.Addon(), - partial.Addon(), - }, -} -</code></pre><p>Third-party addons should ship as Go modules. Versioning follows Go module -versions, not hidden CLI discovery. GOWDK should not load production addons -from runtime filesystem scans, network registries, or hidden project metadata.</p><h2 id="request-time-feature-limits">Request-Time Feature Limits</h2><p>Generated binaries currently support:</p><ul><li>Embedded app file serving.</li><li>Feature-bound same-package action handlers with no-input, typed value, typed -pointer, or <code>form.Values</code> signatures.</li><li>Feature-bound same-package API handlers.</li><li>Configurable action and API request body caps through -<code>Build.BodyLimits</code>, defaulting to 1 MiB.</li><li>No-store panic boundaries for generated SSR, action, and API request-time -lanes.</li><li>First-slice same-page POST action redirects.</li><li>CSRF-wired generated action handlers when the configured secret environment -variable is present. CSRF is enabled by default unless <code>Build.CSRF.Disabled</code> -is set.</li><li>First-slice required-field validation for directly declared form controls.</li><li>First-slice partial action fragment responses.</li><li>Standalone concrete and dynamic fragment routes with raw and typed route -params exposed to fragment hooks.</li><li>First-slice concrete and dynamic request-time SSR pages with declared -<code>server {}</code> identifier or dotted paths.</li><li>Optional split frontend/backend generation with <code>--backend-app</code> and -<code>--backend-bin</code>; the frontend proxies backend routes to -<code>GOWDK_BACKEND_ORIGIN</code>.</li></ul><p>Generated binaries do not yet support:</p><ul><li>Hybrid streaming, data refresh, and non-HTTP revalidation.</li></ul><h2 id="local-development">Local Development</h2><p><code>dev</code> rebuilds generated build output, serves it locally, and live reloads the -browser after successful rebuilds:</p><pre><code class="language-sh">gowdk dev --out dist/site -gowdk dev --target admin -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/dev/index.html b/docs-site/dist/site/docs/reference/dev/index.html deleted file mode 100644 index 5b3355e9..00000000 --- a/docs-site/dist/site/docs/reference/dev/index.html +++ /dev/null @@ -1,79 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Dev Loop - GOWDK</title> - <meta name="description" content="gowdk dev is a dependency-free development loop for GOWDK projects."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Dev Loop - GOWDK"> - <meta property="og:description" content="gowdk dev is a dependency-free development loop for GOWDK projects."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Dev Loop - GOWDK"> - <meta name="twitter:description" content="gowdk dev is a dependency-free development loop for GOWDK projects."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Dev Loop</h1><p class="doc-lead">gowdk dev is a dependency-free development loop for GOWDK projects.</p></header><article class="prose"><p><code>gowdk dev</code> is a dependency-free development loop for GOWDK projects.</p><h2 id="current-contract">Current Contract</h2><p>The command:</p><ul><li>forwards build flags to <code>gowdk build</code>;</li><li>writes to <code>gowdk_cache</code> unless <code>--out</code> or one selected build target supplies -or infers an output directory;</li><li>serves build output for SPA/static development;</li><li>polls explicit or discovered <code>.gwdk</code>, CSS, and config inputs;</li><li>compares watched input content hashes and skips no-op rebuild ticks;</li><li>prints changed, added, and removed input paths when a rebuild starts;</li><li>injects a small server-sent-events live-reload script into served HTML;</li><li>shows a browser overlay for rebuild compiler/build failures with diagnostic -code, source range, last-good build time, and changed-file context when -available;</li><li>keeps serving the last successful output when rebuilds fail.</li></ul><p>When <code>--app &lt;dir&gt;</code> or a selected target has <code>App</code>, <code>dev</code> also builds the -generated app, compiles a local binary, starts it with <code>GOWDK_ADDR</code>, and -restarts that process after successful rebuilds. The generated app runs on an -internal loopback port behind a dev-only proxy at the requested <code>--addr</code>, so -HTML responses get the same live-reload and build-error overlay bridge as -plain SPA/static dev serving. Runtime stdout and stderr stay attached to the -terminal.</p><p>Terminal startup output uses stable wording for the serving mode:</p><pre><code class="language-text">Static dev server: serving &lt;output-dir&gt; at http://&lt;addr&gt; -Generated app runtime: proxy http://&lt;addr&gt; -&gt; http://&lt;internal-addr&gt; (binary &lt;path&gt;) -</code></pre><p><code>&lt;addr&gt;</code> is the public dev address. <code>&lt;internal-addr&gt;</code> is the loopback address -assigned to the generated app process through <code>GOWDK_ADDR</code>; it is an -implementation detail for local dev proxying and should not be used in deploy -docs.</p><h2 id="rebuild-scope">Rebuild Scope</h2><p>For plain SPA <code>--out</code> builds, page, component, and layout edits use the -incremental SPA renderer when the changed files are already in the source set. -The dev loop validates the full compiler IR, derives page/component/layout -reverse dependencies, refreshes manifests, writes affected page output, and -removes stale route output for changed pages.</p><p>These changes use the full build path:</p><ul><li>CSS files;</li><li>config files;</li><li>source-set changes;</li><li>target changes;</li><li>generated app, binary, backend, or WASM output.</li></ul><p>When build flags include <code>--timings</code>, incremental rebuilds update the timings -sidecar with counters for input changes, affected pages, component/layout/page -changes, files written, and identical writes skipped.</p><p>The dev loop stores a watched-input snapshot in the output directory. A later -poll tick can reuse that snapshot when the source set and output are still -present, which avoids reloading config and rewalking the tree on no-op ticks.</p><p>On each detected change, terminal output starts with stable change-summary -wording:</p><pre><code class="language-text">Change detected at &lt;RFC3339 timestamp&gt;: &lt;n&gt; changed, &lt;n&gt; added, &lt;n&gt; removed - changed: &lt;path&gt; - added: &lt;path&gt; - removed: &lt;path&gt; -</code></pre><p>After a successful rebuild, the loop prints one of:</p><pre><code class="language-text">Dev rebuild complete: static output refreshed at &lt;output-dir&gt; -Dev rebuild complete: generated app restarted: proxy http://&lt;addr&gt; -&gt; http://&lt;internal-addr&gt; (binary &lt;path&gt;) -</code></pre><h2 id="hmr">HMR</h2><p><code>gowdk dev</code> supports conservative component-aware HMR for generated JavaScript -islands in plain SPA/static serving. When a changed component source maps to the -current page and the browser can find matching <code>&lt;gowdk-island&gt;</code> roots, the dev -bridge fetches the fresh document, swaps those island roots, remounts islands, -and emits <code>gowdk:component-hmr</code>.</p><p>The dev bridge falls back to full-page reload for page changes, layout changes, -source-set changes, generated app/runtime mode, WASM islands, and component -changes that do not have a matching island boundary on the current page. Local -island state preservation is not a current contract.</p><p>Generated-app rebuild and runtime 5xx overlay delivery use the dev-only proxy -bridge. Broader state-preserving component HMR remains tracked in -<a href="https://github.com/cssbruno/GoWDK/issues/424">#424</a>.</p><h2 id="browser-overlay">Browser Overlay</h2><p>For plain SPA/static dev serving, rebuild compiler/build failures are printed -to the terminal and sent to the browser over the existing live-reload event -stream. The injected script shows a fixed overlay while the last successful -output continues to serve.</p><p>The overlay includes, when available:</p><ul><li>diagnostic code, severity, message, source file, and source range;</li><li>last successful build time;</li><li>files that triggered the failed rebuild;</li><li>generated route/endpoint attribution when the failing build report carries -that metadata.</li></ul><p>The overlay is removed on the next successful rebuild and page reload.</p><p>Generated app runtime mode keeps runtime stdout/stderr attached to the terminal -and serves browser traffic through the dev-only proxy bridge. Rebuild failures -from generated app compilation are sent to the same browser overlay. Request-time -5xx HTML responses from the generated app trigger a generic runtime overlay with -the HTTP status only; the payload does not include request paths, query strings, -cookies, submitted form values, response bodies, panic values, or stack traces. -The terminal remains the source for redacted runtime panic logs.</p><h2 id="file-watching">File Watching</h2><p>The current watcher is portable polling controlled by <code>--interval</code>.</p><p>Native filesystem watching is deferred until there is a small cross-platform -implementation that does not add fragile dependencies or platform-specific -runtime assumptions.</p><h2 id="doctor">Doctor</h2><p>Use <code>gowdk doctor</code> for setup and project-health checks that do not write build -output. It verifies the local Go/GOWDK toolchain, config loading, source -discovery, language validation, route metadata construction, and relevant -optional tools. Use <code>gowdk doctor --json</code> for CI or editor integrations.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/diagnostic-codes/index.html b/docs-site/dist/site/docs/reference/diagnostic-codes/index.html deleted file mode 100644 index 639b13fd..00000000 --- a/docs-site/dist/site/docs/reference/diagnostic-codes/index.html +++ /dev/null @@ -1,160 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Diagnostic Codes - GOWDK</title> - <meta name="description" content="Diagnostic codes are the stable handle for compiler, parser, build, and editor findings. Use them for bug reports, editor integrations, CI policy, and user-facing help."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Diagnostic Codes - GOWDK"> - <meta property="og:description" content="Diagnostic codes are the stable handle for compiler, parser, build, and editor findings. Use them for bug reports, editor integrations, CI policy, and user-facing help."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Diagnostic Codes - GOWDK"> - <meta name="twitter:description" content="Diagnostic codes are the stable handle for compiler, parser, build, and editor findings. Use them for bug reports, editor integrations, CI policy, and user-facing help."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Diagnostic Codes</h1><p class="doc-lead">Diagnostic codes are the stable handle for compiler, parser, build, and editor findings. Use them for bug reports, editor integrations, CI policy, and user-facing help.</p></header><article class="prose"><p>Diagnostic codes are the stable handle for compiler, parser, build, and editor -findings. Use them for bug reports, editor integrations, CI policy, and -user-facing help.</p><h2 id="explain-a-code">Explain A Code</h2><p>Use <code>gowdk explain</code> when a diagnostic includes a <code>code</code>:</p><pre><code class="language-sh">gowdk explain missing_ssr_addon -gowdk explain --json spa_dynamic_route_missing_paths -</code></pre><p>Plain text is for humans. <code>--json</code> is for editors and tools.</p><p>Unknown codes return a non-zero exit status with close-code suggestions:</p><pre><code class="language-sh">gowdk explain missing_ssr_adon -</code></pre><h2 id="json-shape">JSON Shape</h2><p><code>gowdk explain --json &lt;code&gt;</code> prints:</p><pre><code class="language-json">{ - &#34;code&#34;: &#34;missing_ssr_addon&#34;, - &#34;area&#34;: &#34;rendering&#34;, - &#34;stability&#34;: &#34;stable&#34;, - &#34;severity&#34;: &#34;error&#34;, - &#34;summary&#34;: &#34;request-time page behavior requires the SSR addon&#34;, - &#34;details&#34;: &#34;The source selects request-time page rendering...&#34;, - &#34;nextSteps&#34;: [ - &#34;Enable ssr.Addon() in gowdk.config.go when request-time page rendering is intentional.&#34; - ], - &#34;invalid&#34;: &#34;...&#34;, - &#34;fixed&#34;: &#34;...&#34; -} -</code></pre><p>Optional fields are omitted when no detailed explanation exists yet.</p><h2 id="registry-source">Registry Source</h2><p>The implementation source of truth is <code>internal/diagnostics/registry.go</code>. -The registry stores:</p><ul><li><code>code</code>: lower snake case diagnostic ID.</li><li><code>area</code>: broad subsystem such as <code>parser</code>, <code>routing</code>, <code>components</code>, or -<code>contracts</code>.</li><li><code>stability</code>: compatibility level.</li><li><code>severity</code>: default severity, one of <code>error</code>, <code>warning</code>, or <code>info</code>.</li><li><code>fix</code>: optional safe rewrite metadata with a title, description, and named -rewriter.</li><li><code>summary</code>: short description.</li></ul><p><code>go test ./internal/diagnostics</code> scans non-test Go source for emitted -diagnostic-code literals and fails when a new emitted code is missing from the -registry.</p><h2 id="stability">Stability</h2><ul><li><code>stable</code>: safe for CLI, editor, and docs references during the 0.x line -unless release notes call out a migration.</li><li><code>experimental</code>: emitted by partial feature slices and may change while the -feature hardens.</li><li><code>addon</code>: emitted by addon-owned validation or fallback addon diagnostics.</li></ul><p>Most diagnostics use severity <code>error</code>. Accessibility diagnostics and -guardless-page diagnostics can use severity <code>warning</code>; route-mode notes can use -severity <code>info</code>. Warnings are reported by <code>gowdk check</code> but do not make the -command fail unless <code>--warnings-as-errors</code> is passed.</p><h2 id="fixes">Fixes</h2><p>Some diagnostics have registry-backed fixes. <code>gowdk fix</code> applies those safe -single-file rewrites, and LSP code actions use the same metadata:</p><pre><code class="language-sh">gowdk fix --dry-run --code old_action_block_syntax -gowdk fix --code unknown_gowdk_use_alias -</code></pre><p>Old endpoint syntax fixes migrate empty blocks. Blocks that still contain -behavior are refused because moving behavior into Go is not mechanically safe.</p><h2 id="naming">Naming</h2><p>Code names use lower snake case. Prefer predictable forms:</p><ul><li><code>&lt;surface&gt;_&lt;problem&gt;</code>, such as <code>component_field_error</code>.</li><li><code>duplicate_&lt;thing&gt;</code>, <code>missing_&lt;thing&gt;</code>, <code>unknown_&lt;thing&gt;</code>, -<code>invalid_&lt;thing&gt;</code>, and <code>unsupported_&lt;thing&gt;</code>.</li><li><code>&lt;feature&gt;_requires_&lt;dependency&gt;</code>.</li></ul><p>Parser diagnostics emit stable codes for common unsupported syntax and keep -<code>parse_error</code> as the fallback for unknown parser failures.</p><h2 id="current-areas">Current Areas</h2><ul><li>Parser and lexer: <code>parse_error</code>, <code>package_must_be_first</code>, -<code>malformed_package_declaration</code>, <code>malformed_legacy_metadata</code>, -<code>old_action_block_syntax</code>, <code>old_api_block_syntax</code>, <code>malformed_go_import</code>, -<code>malformed_gowdk_use</code>, -<code>unsupported_literal_record_syntax</code>, <code>unsupported_top_level_block</code>, -<code>unsupported_layout_metadata</code>, <code>invalid_component_prop</code>, -<code>unsupported_component_prop_type</code>, <code>unterminated_string</code>.</li><li>Packages and imports: <code>missing_package_declaration</code>, <code>package_mismatch</code>, -<code>go_package_error</code>, <code>invalid_go_import</code>, <code>duplicate_go_import_alias</code>.</li><li>GOWDK source imports: <code>duplicate_gowdk_use_alias</code>, -<code>unknown_gowdk_use_package</code>, <code>unknown_gowdk_use_alias</code>, -<code>unknown_gowdk_component</code>, <code>unsupported_gowdk_use_scope</code>.</li><li>Pages, routes, guards, and render lanes: <code>duplicate_page_id</code>, -<code>malformed_route</code>, <code>duplicate_route_param</code>, <code>duplicate_route</code>, -<code>ambiguous_dynamic_route</code>, <code>route_method_conflict</code>, <code>missing_view_block</code>, -<code>missing_ssr_addon</code>, <code>spa_dynamic_route_missing_paths</code>, -<code>server_requires_request_render</code>, <code>spa_disabled</code>, <code>ssr_disabled</code>, -<code>missing_page_guard</code>, <code>public_guard_exclusive</code>, and -<code>guard_requires_request_render</code>.</li><li>Server-lane view directives (<code>g:for</code>/<code>g:if</code> over <code>server {}</code> data): -<code>server_for_invalid</code>, <code>server_for_nested_scope</code>, <code>server_if_invalid</code>, -<code>server_if_nested_scope</code>, <code>server_load_field_conflict</code>, -<code>server_region_directive</code>, <code>server_url_tainted</code>, <code>ghtml_over_load_data</code>.</li><li>Backend endpoints: <code>invalid_backend_handler_name</code>, -<code>invalid_go_endpoint_handler</code>, <code>malformed_go_endpoint_comment</code>, -<code>go_endpoint_parse_error</code>, <code>duplicate_go_endpoint_comment</code>, -<code>unsupported_action_method</code>, <code>backend_binding_required</code>, -<code>unsupported_backend_signature</code>, <code>unexported_backend_handler</code>, -<code>ambiguous_backend_handler</code>.</li><li>Layouts, CSS, and cache: <code>duplicate_layout_id</code>, <code>unknown_layout_id</code>, -<code>invalid_css_selection</code>, <code>duplicate_css_selection</code>, -<code>revalidate_requires_cache</code>, <code>duplicate_revalidate_policy</code>.</li><li>Components, stores, and markup: <code>duplicate_component_name</code>, -<code>redundant_component_implementation</code>, <code>component_contract_error</code>, -<code>component_field_error</code>, <code>component_client_error</code>, -<code>component_composition_cycle</code>, -<code>duplicate_component_emit</code>, <code>duplicate_page_store</code>, <code>page_store_error</code>, -<code>page_store_persist_key_conflict</code>, <code>page_store_persist_scope_conflict</code>, -<code>page_store_persist_scope_invalid</code>, <code>page_store_persist_secret_field</code>, -<code>unknown_component_store</code>, <code>view_parse_error</code>.</li><li>Accessibility: <code>missing_img_alt</code>, <code>missing_form_label</code>, -<code>empty_link_text</code>, <code>missing_button_type</code>, <code>heading_order_skip</code>.</li><li>Go blocks and generated app wiring: <code>invalid_go_block</code>, -<code>go_client_requires_page</code>, <code>go_ssr_requires_request_render</code>, -<code>unknown_go_block_target</code>, <code>unknown_addon_go_block_target</code>, -<code>unsupported_addon_go_block_target</code>, <code>addon_go_block_diagnostic</code>, -<code>generated_app_import_cycle</code>.</li><li>Partials and fragments: <code>unsupported_fragment_method</code>.</li><li>Contracts: <code>contract_handler_invalid</code>, <code>contract_handler_missing</code>, -<code>contract_type_invalid</code>, <code>contract_result_invalid</code>, -<code>contract_input_invalid</code>, <code>contract_event_name_invalid</code>, -<code>contract_event_category_invalid</code>, <code>duplicate_command_owner</code>, -<code>contract_route_invalid</code>, <code>contract_reference_missing</code>, -<code>contract_reference_invalid</code>, -<code>contract_reference_role_not_allowed</code>.</li><li>Realtime: <code>missing_realtime_addon</code>, <code>realtime_subscription_parse_error</code>, -<code>realtime_subscription_missing</code>, <code>realtime_subscription_invalid</code>, -<code>realtime_subscription_role_not_allowed</code>.</li><li>Contract web adapters: <code>ssr_command_no_client</code> (a request-time page declares a -<code>g:command</code> write form with no <code>g:query</code> region for it to refresh, so the write -is non-reactive and falls back to raw JSON when JavaScript is disabled).</li><li>WASM and browser Go: <code>unsupported_wasm_import</code>, -<code>wasm_package_build_error</code>, <code>wasm_package_entrypoint_error</code>, -<code>wasm_package_export_error</code>, <code>client_go_block_wasm_source_error</code>, -<code>client_go_block_wasm_build_error</code>, -<code>client_go_block_wasm_entrypoint_error</code>, -<code>client_go_block_wasm_import_error</code>, -<code>client_go_block_wasm_export_error</code>.</li><li>Security audit (<code>gowdk audit</code>): <code>audit_action_missing_csrf</code>, -<code>audit_api_missing_csrf</code>, <code>audit_api_public_by_omission</code>, -<code>audit_command_missing_csrf</code>, <code>audit_contract_roleless</code>, -<code>audit_guardless_endpoint_page</code>, <code>audit_bundle_secret</code>, -<code>audit_client_route_unguarded</code>, -<code>audit_headers_missing</code>, <code>audit_headers_runtime_missing</code>, -<code>audit_raw_html_sink</code>, <code>audit_max_body_exceeds_policy</code>, -<code>audit_public_not_allowed</code>, <code>audit_required_guard_missing</code>, -<code>audit_runtime_mismatch</code>, <code>audit_test_failed</code>, <code>policy_duplicate_name</code>, -<code>policy_extends_cycle</code>, <code>policy_unknown_extends</code>, -<code>policy_unknown_selector</code>, <code>policy_selector_matched_nothing</code>. These are -experimental and emitted by <code>gowdk audit</code>, declared audit policies, or the -optional runtime audit test runner.</li></ul><h2 id="source-ranges">Source Ranges</h2><p>Diagnostics carry an exact source span (<code>internal/source.SourceSpan</code>) when one -is available at the emit site; the LSP and dev overlay use it directly and fall -back to a file/owner-level range only when no precise span exists.</p><p>Exact ranges now cover the backend-binding family, which point at the declaring -<code>act</code> / <code>api</code> / <code>fragment</code> block (or standalone <code>//gowdk:</code> endpoint): -<code>ambiguous_backend_handler</code>, <code>unsupported_backend_signature</code>, -<code>unexported_backend_handler</code>, and <code>backend_binding_required</code>. The -<code>source.BackendBinding</code> produced by <code>compiler.BindBackendHandlers</code> captures the -block span so both <code>gowdk check</code>/build diagnostics and the editor highlight the -exact declaration.</p><p>Exact ranges also cover <code>g:for</code> / <code>g:key</code> row bodies (<code>component_field_error</code>). -Errors inside a list row — invalid <code>g:on:</code> handlers, <code>g:if</code> / <code>g:else-if</code> -conditionals, <code>g:bind:value</code> / <code>g:bind:checked</code> targets, <code>class:</code> / <code>style:</code> -toggles, reactive attribute expressions, and <code>{}</code> interpolations — point at the -offending expression or text node. The view-contract collector skips loop -subtrees, so the list-directive validator is the only source for these and used -to fall back to the whole <code>view {}</code> block; it now maps the parsed -<code>viewmodel.Attr</code> / text offsets through <code>componentViewBodyOffsetSpan</code>.</p><p>Known gaps (no precise span available; file/owner- or line-level only):</p><ul><li><code>go_package_error</code> for an unparseable sibling <code>.go</code> file or a missing package -clause — these arise before a Go AST exists, so only the file path is known. -Inline <code>go {}</code> block package errors already carry the block span.</li><li>Go contract-scan diagnostics (<code>contract_handler_*</code>, <code>contract_reference_*</code>, -<code>duplicate_command_owner</code>, and peers from <code>internal/contractscan</code>) carry the -registration call&#39;s line and column but no end, so the editor marks a point -rather than a token range. <code>contractscan.Diagnostic</code> records only <code>Line</code> / -<code>Column</code>; an exact range needs the Go AST node end threaded through the scan -report model.</li><li>Untyped parser errors (<code>parse_error</code>) wrapped with <code>withLine</code> in -<code>internal/parser</code> (currently three call sites) carry only a line number, so -the range is the whole line. Most parser diagnostics are typed via -<code>lineDiagnosticError</code> and are already exact.</li><li>Component <code>client {}</code> block errors (<code>component_client_error</code>) are -line-accurate but not column-accurate: <code>clientlang.Span</code> carries <code>StartLine</code> / -<code>EndLine</code> only.</li><li>Interpolation errors inside a list row resolve to the enclosing text node or -attribute, not the individual <code>{expr}</code>, when several interpolations share one -node.</li></ul><p>The LSP (<code>internal/lsp/diagnostics.go</code>) consumes <code>Diagnostic.Range</code> directly and -only derives a position-based range when <code>Range</code> is nil, so there is no -editor-only range guessing for diagnostics. Cursor-driven features -(hover, go-to-definition, find-references) still locate the token under the -caret by scanning, which is inherent to those features and unrelated to -diagnostic ranges.</p><h2 id="adding-a-code">Adding A Code</h2><p>When adding or renaming a diagnostic code:</p><ol><li>Add or update the registry entry in <code>internal/diagnostics/registry.go</code>, -including severity and any safe fix metadata.</li><li>Add or update <code>gowdk explain</code> detail when the next step is not obvious.</li><li>Update this page when a new area or stability rule appears.</li><li>Run <code>go test ./internal/diagnostics</code>.</li></ol></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/diagnostics/index.html b/docs-site/dist/site/docs/reference/diagnostics/index.html deleted file mode 100644 index 3a2e4703..00000000 --- a/docs-site/dist/site/docs/reference/diagnostics/index.html +++ /dev/null @@ -1,89 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Diagnostics Reference - GOWDK</title> - <meta name="description" content="gowdk check --json prints:"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Diagnostics Reference - GOWDK"> - <meta property="og:description" content="gowdk check --json prints:"> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Diagnostics Reference - GOWDK"> - <meta name="twitter:description" content="gowdk check --json prints:"> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Diagnostics Reference</h1><p class="doc-lead">gowdk check --json prints:</p></header><article class="prose"><p><code>gowdk check --json</code> prints:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;diagnostics&#34;: [ - { - &#34;file&#34;: &#34;examples/actions/signup.page.gwdk&#34;, - &#34;code&#34;: &#34;old_action_block_syntax&#34;, - &#34;pos&#34;: {&#34;line&#34;: 6, &#34;column&#34;: 1}, - &#34;range&#34;: { - &#34;start&#34;: {&#34;line&#34;: 6, &#34;column&#34;: 1}, - &#34;end&#34;: {&#34;line&#34;: 8, &#34;column&#34;: 2} - }, - &#34;severity&#34;: &#34;error&#34;, - &#34;fix&#34;: { - &#34;title&#34;: &#34;Replace old endpoint block header&#34;, - &#34;description&#34;: &#34;Replace the removed endpoint block form with the current metadata declaration.&#34;, - &#34;rewriter&#34;: &#34;endpoint_header_from_message&#34; - }, - &#34;message&#34;: &#34;line 6: old action block syntax is not supported; use `act Submit POST \&#34;&lt;path&gt;\&#34;` and move behavior to Go&#34; - } - ] -} -</code></pre><p>Current diagnostic fields:</p><ul><li><code>version</code>: diagnostic JSON schema version. Current value is <code>1</code>.</li><li><code>file</code>: source file path when known.</li><li><code>code</code>: stable diagnostic category when known.</li><li><code>pos.line</code>: 1-based line when known; zero means no exact position is available.</li><li><code>pos.column</code>: 1-based column when known; zero means no exact position is available.</li><li><code>range</code>: optional 1-based source range. End is exclusive.</li><li><code>severity</code>: <code>error</code>, <code>warning</code>, or <code>info</code>.</li><li><code>fix</code>: optional registry-backed machine-readable fix metadata. A fix includes -a title, description, and named rewriter used by <code>gowdk fix</code> and LSP code -actions.</li><li><code>message</code>: user-facing diagnostic message.</li><li><code>suggestion</code>: optional editor-facing fix hint for common mistakes.</li></ul><p>Run registered safe rewrites with:</p><pre><code class="language-sh">gowdk fix --dry-run --code old_action_block_syntax -gowdk fix --code old_api_block_syntax -</code></pre><p><code>gowdk fix</code> applies single-file non-overlapping edits only. Old endpoint block -fixes migrate empty blocks and refuse blocks that still contain behavior.</p><h2 id="code-registry">Code Registry</h2><p>The dedicated diagnostic-code reference is -<a href="/docs/reference/diagnostic-codes/">diagnostic-codes.md</a>. It covers the registry source, -stability policy, naming rules, current code areas, and <code>gowdk explain</code>.</p><p>Use <code>gowdk explain &lt;diagnostic-code&gt;</code> for details and next steps:</p><pre><code class="language-sh">gowdk explain missing_ssr_addon -gowdk explain --json spa_dynamic_route_missing_paths -</code></pre><p>Unknown codes return a non-zero exit status with close-code suggestions.</p><p>Parser diagnostics include line-level ranges. Compiler diagnostics include -ranges when the source span is known. Component <code>client {}</code> diagnostics point -to the offending statement line when available, and supported expression -validation failures can narrow the range to the failing expression columns. -Common route, render-mode, endpoint-comment, client-field, view-field, event, -and <code>g:for</code> mistakes include structured suggestions when GOWDK can offer a -concrete next step.</p><h2 id="span-coverage">Span Coverage</h2><p>Current v0.1-supported language surfaces report source locations as follows:</p><ul><li>Parser syntax errors, including unsupported <code>paths {}</code> and <code>build {}</code> forms, -report the offending source line with a line range.</li><li>Route validation uses metadata declaration, block, and route-param spans where -available, including route declarations, request-time blocks, and dynamic -route params.</li><li>View and component field validation uses parsed view-node spans for the -offending directive, field, component call, or interpolation expression.</li><li>Component <code>client {}</code> validation reports the offending statement line and -narrows supported expression failures to expression columns.</li><li>Duplicate or conflicting component <code>client {}</code> declarations report the exact -declaration line when the client parser already owns that span.</li><li>Package validation points at the <code>.gwdk</code> package declaration or the nearest -page/component/layout declaration when the package declaration is missing.</li><li>Build-data validation rejects unsupported statement shapes during parsing and -reports the offending line; build execution errors that come from external Go -execution keep their command/error context rather than a precise <code>.gwdk</code> -expression range.</li></ul><p>Remaining known exact-range gaps:</p><ul><li>Internal compiler invariant failures report no <code>.gwdk</code> range because they -describe a broken compiler handoff, not an author-owned source construct.</li><li>External Go execution and package-loading failures keep the Go toolchain file, -line, or command context. GOWDK does not synthesize a <code>.gwdk</code> range when the -failure happens inside user Go or generated temporary Go.</li><li>Aggregate dependency diagnostics, such as computed dependency cycles, point at -the owning client block until the client dependency graph records edge-level -source spans.</li><li>Addon-owned diagnostics are exact only when the addon returns source spans; -otherwise GOWDK can only attach the owning block or source file.</li><li>Dev runtime overlay events intentionally have no source range. The proxy only -reports a generic generated-app runtime 5xx status so it does not expose -request paths, query strings, cookies, submitted values, response bodies, -panic values, or stack traces.</li></ul><h2 id="p0p1-constraint-diagnostics">P0/P1 Constraint Diagnostics</h2><p>GOWDK keeps the v0.1 language boundary explicit through diagnostics and tests:</p><ul><li>No arbitrary JavaScript as the app contract: unsupported <code>client {}</code> -statements, unknown client values/functions, unsafe reactive URL attributes, -and unsupported event modifiers fail with <code>component_client_error</code> or -<code>component_field_error</code>.</li><li>No external template semantics: familiar external-template blocks such as -<code>{#if}</code>, <code>{@html}</code>, snippets, and debug tags fail as parse/view diagnostics -with guidance toward GOWDK-native constructs.</li><li>No generated JavaScript as trusted business logic: frontend templates must not -declare backend facts with <code>g:event</code>; command/query/action behavior remains -backend-owned and invalid references fail compiler diagnostics before build -output or generated adapters are accepted.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/errors/index.html b/docs-site/dist/site/docs/reference/errors/index.html deleted file mode 100644 index ae720e45..00000000 --- a/docs-site/dist/site/docs/reference/errors/index.html +++ /dev/null @@ -1,67 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Errors And Boundaries - GOWDK</title> - <meta name="description" content="GOWDK separates expected handler results from unexpected generated-lane failures."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Errors And Boundaries - GOWDK"> - <meta property="og:description" content="GOWDK separates expected handler results from unexpected generated-lane failures."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Errors And Boundaries - GOWDK"> - <meta name="twitter:description" content="GOWDK separates expected handler results from unexpected generated-lane failures."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Errors And Boundaries</h1><p class="doc-lead">GOWDK separates expected handler results from unexpected generated-lane failures.</p></header><article class="prose"><p>GOWDK separates expected handler results from unexpected generated-lane -failures.</p><h2 id="current-contracts">Current Contracts</h2><p>Expected errors are user-owned handler results:</p><ul><li>Return <code>runtime/response.Response</code> values for normal not-found, forbidden, -invalid request, conflict, validation, redirect, HTML, fragment, and JSON -outcomes.</li><li>Return <code>response.NewHandlerError(status, message, cause)</code> when a generated -action or API handler should fail with a specific HTTP status.</li><li>Return ordinary Go errors only for failures where HTTP 500 is acceptable. -Generated action and API adapters use <code>response.HandlerStatus</code>, defaulting to -HTTP 500.</li><li>Return <code>ssr.RedirectTo(&#34;/path&#34;)</code> or <code>ssr.Redirect(&#34;/path&#34;, status)</code> from SSR -load functions for safe local redirects.</li></ul><p>Unexpected errors are generated-lane failures:</p><ul><li>Generated SSR, action, and API lanes recover panics before response headers -are written.</li><li>Panic values are not rendered.</li><li>Generated request-shape failures use generic messages such as <code>invalid form</code>, -<code>invalid csrf token</code>, or <code>validation failed</code>.</li><li>Generated form decoding and validation do not echo submitted values.</li></ul><h2 id="generated-error-pages">Generated Error Pages</h2><p>Generated embedded apps load these optional HTML files from build output:</p><table><thead><tr><th>File</th><th>Used for</th></tr></thead><tbody><tr><td><code>404.html</code></td><td>Not-found responses from generated app serving.</td></tr><tr><td><code>500.html</code></td><td>Internal generated error responses when no route-local page applies.</td></tr></tbody></table><p>Example output:</p><pre><code class="language-text">dist/ - index.html - 404.html - 500.html - errors/ - dashboard.html -</code></pre><p>Route-local SSR error pages use <code>error</code>:</p><pre><code class="language-gwdk">route &#34;/dashboard&#34; -guard auth.required -error &#34;/errors/dashboard.html&#34; - -server { -} -</code></pre><p>Endpoint-local action and API error pages also use <code>error</code>:</p><pre><code class="language-gwdk">act Submit POST &#34;/signup&#34; error &#34;/errors/signup.html&#34; -api Health GET &#34;/api/health&#34; error &#34;/errors/api-health.html&#34; -</code></pre><p><code>error</code> paths are output-relative. They may start with <code>/</code>, must end in -<code>.html</code>, and must not contain <code>..</code>, query strings, fragments, or backslashes. -Missing error documents fall back to <code>http.Error</code>.</p><h2 id="cache-policy">Cache Policy</h2><p>Generated error responses use <code>Cache-Control: no-store</code>.</p><p>This includes generated <code>404.html</code>, <code>500.html</code>, route-local <code>error</code> pages, -panic-boundary responses, invalid generated forms, invalid CSRF responses, -validation failures, guard failures, missing backend stubs, and SSR load -failures. Successful SSR pages use their declared page cache policy instead.</p><h2 id="boundaries">Boundaries</h2><p>Supported boundary syntax:</p><ul><li>Page/route boundary: <code>error</code> on SSR pages.</li><li>Endpoint boundary: <code>error</code> on <code>act</code> and <code>api</code>.</li><li>Global fallback pages: <code>404.html</code> and <code>500.html</code>.</li></ul><p>Not supported today:</p><ul><li>Layout-level error boundary syntax.</li><li>Component-level error boundary syntax.</li><li>Fragment-specific error boundary syntax.</li><li>Generated response-transform hooks.</li><li>Rendering panic values, submitted form values, secrets, or stack traces.</li></ul><h2 id="logging-and-rendering">Logging And Rendering</h2><p>Generated panic boundaries render safe fixed messages or generated HTML error -documents. They intentionally do not render panic values.</p><p>Generated action, API, fragment, contract, SSR load, and addon 5xx responses -hide ordinary returned error details. Apps can expose an intentional -client-facing message by returning <code>response.HandlerError</code> with an explicit -<code>Message</code>; 4xx handler errors keep their application message contract.</p><p>Runtime panic logs and compiler diagnostics apply conservative redaction before -writing to logs, terminal output, JSON diagnostics, or LSP diagnostics. The -redaction policy masks common credential surfaces:</p><ul><li>DSN passwords such as <code>postgres://user:password@host</code>.</li><li>Bearer and Basic authorization header values.</li><li><code>password</code>, <code>passwd</code>, <code>pwd</code>, <code>secret</code>, <code>token</code>, <code>_gowdk_csrf</code>, -<code>csrf_token</code>, <code>cookie</code>, <code>set-cookie</code>, <code>auth_token</code>, <code>session</code>, -<code>session_id</code>, <code>jwt</code>, <code>api_key</code>, <code>access_key</code>, <code>access_token</code>, -<code>refresh_token</code>, <code>id_token</code>, <code>client_secret</code>, and <code>private_key</code> values when -they appear as <code>name=value</code> or <code>name: value</code>.</li></ul><p>Limitations: app-owned logging is outside GOWDK&#39;s control, and explicit -client-facing <code>HandlerError.Message</code> values are trusted as app-owned text. Do -not put secrets, credentials, submitted sensitive values, SQL details, or -internal service details in messages intended for clients.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/framework-integrations/index.html b/docs-site/dist/site/docs/reference/framework-integrations/index.html deleted file mode 100644 index 8b7e25af..00000000 --- a/docs-site/dist/site/docs/reference/framework-integrations/index.html +++ /dev/null @@ -1,133 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Framework Integrations - GOWDK</title> - <meta name="description" content="Generated GOWDK apps expose standard net/http handlers. The generated server uses the same handler that other Go routers can mount or wrap."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Framework Integrations - GOWDK"> - <meta property="og:description" content="Generated GOWDK apps expose standard net/http handlers. The generated server uses the same handler that other Go routers can mount or wrap."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Framework Integrations - GOWDK"> - <meta name="twitter:description" content="Generated GOWDK apps expose standard net/http handlers. The generated server uses the same handler that other Go routers can mount or wrap."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Framework Integrations</h1><p class="doc-lead">Generated GOWDK apps expose standard net/http handlers. The generated server uses the same handler that other Go routers can mount or wrap.</p></header><article class="prose"><p>Generated GOWDK apps expose standard <code>net/http</code> handlers. The generated server -uses the same handler that other Go routers can mount or wrap.</p><h2 id="generated-api">Generated API</h2><p>Generated apps include an importable package:</p><pre><code class="language-go">import &#34;gowdk-generated-app/gowdkapp&#34; - -handler, err := gowdkapp.Handler() -mux, err := gowdkapp.ServeMux() -</code></pre><p><code>Handler()</code> returns <code>http.Handler</code>. <code>ServeMux()</code> returns the concrete -<code>*http.ServeMux</code>.</p><p>Route-aware framework adapters can also consume the generated <code>openapi.json</code> -report:</p><pre><code class="language-go">openAPI, err := os.ReadFile(&#34;dist/site/openapi.json&#34;) -if err != nil { - log.Fatal(err) -} -</code></pre><p>Use <code>WithPrefix(&#34;/app&#34;)</code> when the host framework serves the generated GOWDK app -below a prefix. The adapter registers host-framework routes under that prefix -and strips it before dispatching to the generated handler, so the generated -router still sees the original GOWDK paths. The adapter also keeps a generated -handler fallback mounted for page and asset routes that are not listed in -OpenAPI, and rewrites same-origin root-relative <code>Location</code> headers and generated -HTML URLs under the prefix.</p><p>When publishing the generated OpenAPI report for a prefixed mount, rewrite its -server URL with the dependency-free helper:</p><pre><code class="language-go">import gowdkadapters &#34;github.com/cssbruno/gowdk/runtime/adapters&#34; - -prefixedSpec, err := gowdkadapters.OpenAPIWithServerURL(openAPI, &#34;/app&#34;) -</code></pre><h2 id="chi">Chi</h2><p>The Chi adapter is a nested optional module. Add it only when the application -uses Chi:</p><pre><code class="language-sh">go get github.com/cssbruno/gowdk/runtime/adapters/chi -</code></pre><pre><code class="language-go">import gowdkchi &#34;github.com/cssbruno/gowdk/runtime/adapters/chi&#34; -import &#34;github.com/go-chi/chi/v5&#34; -</code></pre><pre><code class="language-go">gowdkHandler, err := gowdkapp.Handler() -if err != nil { - log.Fatal(err) -} - -router := chi.NewRouter() -if err := gowdkchi.MountOpenAPI(router, openAPI, gowdkHandler, gowdkchi.WithPrefix(&#34;/app&#34;)); err != nil { - log.Fatal(err) -} -</code></pre><h2 id="echo">Echo</h2><p>The Echo adapter is a nested optional module. Add it only when the application -uses Echo:</p><pre><code class="language-sh">go get github.com/cssbruno/gowdk/runtime/adapters/echo -</code></pre><pre><code class="language-go">import gowdkecho &#34;github.com/cssbruno/gowdk/runtime/adapters/echo&#34; -import &#34;github.com/labstack/echo/v5&#34; - -gowdkHandler, err := gowdkapp.Handler() -if err != nil { - log.Fatal(err) -} - -app := echo.New() -if err := gowdkecho.MountOpenAPI(app, openAPI, gowdkHandler, gowdkecho.WithPrefix(&#34;/app&#34;)); err != nil { - log.Fatal(err) -} -</code></pre><p>Code reached by the generated handler can read the active Echo context when the -app is mounted through this adapter:</p><pre><code class="language-go">echoContext, ok := gowdkecho.Context(ctx) -</code></pre><h2 id="gin">Gin</h2><p>GOWDK does not recommend Gin for new GOWDK applications. Prefer the generated -<code>net/http</code> handler directly, or use a smaller router such as Chi when the host -application needs one. The Gin adapter remains available for existing Gin -codebases and teams that deliberately choose Gin anyway. For background on the -dependency weight, API surface, and migration cost concerns, see -<a href="https://eblog.fly.dev/ginbad.html">this critique of Gin</a>.</p><p>The Gin adapter is a nested optional module. Add it only when the application -already uses Gin:</p><pre><code class="language-sh">go get github.com/cssbruno/gowdk/runtime/adapters/gin -</code></pre><pre><code class="language-go">import gowdkgin &#34;github.com/cssbruno/gowdk/runtime/adapters/gin&#34; -import &#34;github.com/gin-gonic/gin&#34; - -gowdkHandler, err := gowdkapp.Handler() -if err != nil { - log.Fatal(err) -} - -engine := gin.Default() -if err := gowdkgin.MountOpenAPI(engine, openAPI, gowdkHandler, gowdkgin.WithPrefix(&#34;/app&#34;)); err != nil { - log.Fatal(err) -} -</code></pre><p>Code reached by the generated handler can read the active Gin context when the -app is mounted through this adapter:</p><pre><code class="language-go">ginContext, ok := gowdkgin.Context(ctx) -</code></pre><p>Gin rejects ambiguous route patterns such as two same-method dynamic routes that -could match the same request. <code>MountOpenAPI</code> returns a mount-time error naming -the conflicting GOWDK routes instead of letting Gin panic during registration.</p><h2 id="fiber">Fiber</h2><p>The Fiber adapter is a nested optional module. Add it only when the application -uses Fiber:</p><pre><code class="language-sh">go get github.com/cssbruno/gowdk/runtime/adapters/fiber -</code></pre><pre><code class="language-go">import gowdkfiber &#34;github.com/cssbruno/gowdk/runtime/adapters/fiber&#34; -import &#34;github.com/gofiber/fiber/v2&#34; - -gowdkHandler, err := gowdkapp.Handler() -if err != nil { - log.Fatal(err) -} - -app := fiber.New() -gowdkfiber.Mount(app, &#34;/*&#34;, gowdkHandler) -</code></pre><p>Code reached by the generated handler can read the active Fiber context when the -app is mounted through this adapter:</p><pre><code class="language-go">fiberContext, ok := gowdkfiber.Context(ctx) -</code></pre><p>Fiber is not built on <code>net/http</code>, so <code>runtime/adapters/fiber</code> uses Fiber&#39;s -adaptor package internally. That bridge adds adapter overhead and -Fiber-specific semantics around request and response objects, middleware -ordering, context cancellation, streaming, and protocol features. Keep security, -auth, validation, and persistence in normal Go handlers behind GOWDK&#39;s -<code>net/http</code> contract, and test behavior through the final Fiber stack before -deploying.</p><h2 id="contract">Contract</h2><p>GOWDK&#39;s generated app package is <code>net/http</code>-first. Framework compatibility comes -from the standard handler contract, so applications can choose Gin, Chi, Echo, -Fiber through an adaptor, or plain <code>net/http</code> without changing GOWDK Runtime or the -generated app contract. -Generated apps do not emit framework-specific code by default; optional adapter -packages wrap the same generated <code>http.Handler</code>. -Framework context accessors are integration escape hatches for applications -that intentionally opt into a framework adapter. GOWDK route declarations, -handler binding, CSRF, fragments, APIs, and SSR behavior still use the generated -<code>net/http</code> request flow as the source of truth.</p><p>Adapters register host-framework routes from generated metadata only; they do -not move generated protections into framework middleware. Keep middleware order -simple: framework recovery, request logging, and app-owned auth can wrap the -mounted routes, but do not duplicate generated request body limits, CSRF checks, -panic boundaries, or response writing unless the app deliberately replaces that -policy and tests the final stack.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/go-interop/index.html b/docs-site/dist/site/docs/reference/go-interop/index.html deleted file mode 100644 index 444b6303..00000000 --- a/docs-site/dist/site/docs/reference/go-interop/index.html +++ /dev/null @@ -1,96 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Go Interop - GOWDK</title> - <meta name="description" content="GOWDK source declares web surface. Normal Go packages own behavior."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Go Interop - GOWDK"> - <meta property="og:description" content="GOWDK source declares web surface. Normal Go packages own behavior."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Go Interop - GOWDK"> - <meta name="twitter:description" content="GOWDK source declares web surface. Normal Go packages own behavior."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Go Interop</h1><p class="doc-lead">GOWDK source declares web surface. Normal Go packages own behavior.</p></header><article class="prose"><p>GOWDK source declares web surface. Normal Go packages own behavior.</p><h2 id="build-data">Build Data</h2><p><code>build {}</code> can call one Go function:</p><pre><code class="language-gwdk">import interop &#34;github.com/acme/site/content&#34; - -build { - =&gt; interop.HomePage() -} -</code></pre><p>Bare same-package calls are also supported when the page directory is a -buildable Go package:</p><pre><code class="language-gwdk">build { - =&gt; HomePage() -} -</code></pre><p>Supported return shapes:</p><pre><code class="language-go">func HomePage() HomeCopy -func HomePage() (HomeCopy, error) -func HomePage(gowdk.BuildParams) HomeCopy -func HomePage(gowdk.BuildParams) (HomeCopy, error) -</code></pre><p>The returned value must JSON-encode to a non-empty object. Scalar object fields -become string interpolation data for <code>view {}</code>. Build-helper stderr is kept -separate from the JSON payload; successful logging does not corrupt build data, -and failed helpers include stderr in the error message.</p><p>For dynamic SPA routes expanded by <code>paths {}</code>, route params can be used in -literal <code>build {}</code> expressions with <code>param(&#34;name&#34;)</code> or passed to Go build -functions with <code>gowdk.BuildParams</code>:</p><pre><code class="language-go">func PostPage(params gowdk.BuildParams) PostCopy { - slug, _ := params.Param(&#34;slug&#34;) - return PostCopy{Title: &#34;Post &#34; + slug} -} -</code></pre><h2 id="actions-and-apis">Actions And APIs</h2><p>Actions and APIs bind exported same-package Go functions or default <code>go {}</code> -block functions with these signatures:</p><pre><code class="language-go">func Submit(context.Context) (response.Response, error) -func Submit(context.Context, SignupInput) (response.Response, error) -func Submit(context.Context, *SignupInput) (response.Response, error) -func Submit(context.Context, form.Values) (response.Response, error) -func Health(context.Context, *http.Request) (response.Response, error) -</code></pre><p><code>SignupInput</code> must be an exported same-package struct with supported scalar -form fields. Missing handlers are non-fatal in development builds and produce -generated HTTP 501 handlers. Production builds require bound handlers unless -<code>Build.AllowMissingBackend</code> or <code>--allow-missing-backend</code> is set.</p><p>Use:</p><pre><code class="language-sh">gowdk inspect go-bindings --ssr -gowdk generate stubs -</code></pre><p><code>inspect go-bindings</code> reports actions, APIs, fragments, SSR load functions, -build-time Go calls, and web command/query references with status, package, -symbol, signature, input metadata, reason, and next-step suggestions.</p><p><code>generate stubs</code> starts conservatively with missing action/API handlers. It -writes <code>gowdk_stubs.go</code> next to the owning source package and refuses to -overwrite an existing stub file.</p><p><code>gowdk check</code> and <code>gowdk build</code> also surface binding near-misses as non-fatal -warnings, so a wrong signature or a casing mistake is visible without reading -the JSON report or running a strict production build:</p><ul><li><code>unsupported_backend_signature</code> — a same-named Go function exists but its -signature is not a supported action/API/load/fragment shape.</li><li><code>unexported_backend_handler</code> — a same-named Go function exists but is not -exported, so binding cannot see it (for example <code>func submit</code> when the block -expects <code>Submit</code>).</li><li><code>ambiguous_backend_handler</code> — the same handler is declared in both -same-package Go and an inline <code>go {}</code> block. (When both live in the same -compiled package, Go&#39;s own redeclaration error surfaces first.)</li></ul><p>A handler with no candidate function stays silent because the default workflow -generates 501 stubs for not-yet-implemented handlers; strict production builds -still fail closed through <code>backend_binding_required</code>.</p><p>When the sibling Go package fails to compile, binding does not fall back to an -inline <code>go {}</code> block and report a misleading bound handler: the load/action/API -binding stays &#34;could not be inspected&#34; and the package error itself is reported -by <code>go_package_error</code>.</p><h2 id="load-functions">Load Functions</h2><p>Request-time pages with <code>server {}</code> bind same-package functions named -<code>Load&lt;PageID&gt;</code>:</p><pre><code class="language-go">func LoadDashboard(ssr.LoadContext) map[string]any -func LoadDashboard(ssr.LoadContext) (map[string]any, error) -</code></pre><p><code>context.Context</code> is available through <code>ssr.LoadContext</code> / -<code>runtime/guard.Context</code>. Route, endpoint, params, typed params, CSRF, session, -and request metadata are available through <code>runtime/app</code> helpers where the -generated route attaches them.</p><h2 id="route-params">Route Params</h2><p>Generated request-time route handlers attach raw params through -<code>app.Params(ctx)</code> and decoded typed params through <code>app.TypedParams(ctx)</code>. -The lower-level <code>runtime/route</code> helpers decode <code>string</code>, <code>int</code>, <code>int64</code>, -<code>uint</code>, <code>uint64</code>, <code>bool</code>, and <code>float64</code> from raw params without echoing raw -request values in errors.</p><p>Generated per-route param struct types are deferred. Typed load-result and -action-result accessors are also deferred until those result contracts are -stable.</p><h2 id="middleware-and-hooks">Middleware And Hooks</h2><p>Generated apps expose ordinary <code>net/http</code> entry points:</p><pre><code class="language-go">gowdkapp.RegisterMiddleware(middleware) -handler, err := gowdkapp.Handler() -mux, err := gowdkapp.ServeMux() -application, err := gowdkapp.App() -</code></pre><p>Register app-wide middleware before calling <code>Handler()</code> or <code>ServeMux()</code>, or -wrap the returned handler in startup code. <code>App()</code> is the generated-binary -startup shape used with <code>runtime/app.Run</code>; it includes the mux, handler, -identity, configured lifecycle services, and lifecycle values. Generated route -rewriting, response transformation hooks, and fetch/navigation interception -hooks are not part of the current contract.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/hooks/index.html b/docs-site/dist/site/docs/reference/hooks/index.html deleted file mode 100644 index 63cb4095..00000000 --- a/docs-site/dist/site/docs/reference/hooks/index.html +++ /dev/null @@ -1,168 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Hooks, Guards, And Middleware - GOWDK</title> - <meta name="description" content="GOWDK&#39;s current hook model is small and net/http-first."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Hooks, Guards, And Middleware - GOWDK"> - <meta property="og:description" content="GOWDK&#39;s current hook model is small and net/http-first."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Hooks, Guards, And Middleware - GOWDK"> - <meta name="twitter:description" content="GOWDK&#39;s current hook model is small and net/http-first."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Hooks, Guards, And Middleware</h1><p class="doc-lead">GOWDK&#39;s current hook model is small and net/http-first.</p></header><article class="prose"><p>GOWDK&#39;s current hook model is small and <code>net/http</code>-first.</p><h2 id="current-contracts">Current Contracts</h2><table><thead><tr><th>Extension point</th><th>Type</th><th>Scope</th></tr></thead><tbody><tr><td>Generated app handler</td><td><code>http.Handler</code></td><td>Wrap with normal Go middleware in app startup.</td></tr><tr><td>Generated app middleware</td><td><code>runtime/app.Middleware</code></td><td>Register ordered app-wide middleware before building the generated handler.</td></tr><tr><td>Generated binary lifecycle</td><td><code>runtime/app.Service</code></td><td>Mount routes or run app-owned background services when the generated binary starts.</td></tr><tr><td>Guards</td><td><code>runtime/guard.Registry</code>, <code>runtime/auth.Provider</code></td><td>Generated action, API, fragment, and SSR routes with <code>guard</code>.</td></tr><tr><td>Rate limiting</td><td><code>*ratelimit.Limiter</code></td><td>Generated action, API, fragment, SSR, and split-backend proxy routes when the addon is enabled.</td></tr><tr><td>Handler context</td><td><code>context.Context</code></td><td>User handlers read request metadata, raw route params, and typed route params through <code>runtime/app</code> helpers.</td></tr></tbody></table><p>Generated apps expose <code>App() (*runtime/app.Application, error)</code> for generated -binary startup, plus request-only <code>Handler() (http.Handler, error)</code> and -<code>ServeMux() (*http.ServeMux, error)</code>. They also expose -<code>RegisterMiddleware(runtime/app.Middleware)</code> for app-owned middleware that -should wrap the full generated app dispatch chain:</p><pre><code class="language-go">gowdkapp.RegisterMiddleware(func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - next.ServeHTTP(w, r) - }) -}) -handler, err := gowdkapp.Handler() -if err != nil { - panic(err) -} -http.ListenAndServe(&#34;:8080&#34;, handler) -</code></pre><p>Register middleware before calling <code>Handler()</code> or <code>ServeMux()</code>. Middleware runs -in registration order; a middleware that does not call <code>next</code> owns the response -and skips generated headers, metrics, static serving, and request-time route -dispatch for that request. App-owned startup code can still wrap the returned -handler with ordinary middleware:</p><pre><code class="language-go">handler, err := gowdkapp.Handler() -if err != nil { - panic(err) -} -wrapped := myMiddleware(handler) -http.ListenAndServe(&#34;:8080&#34;, wrapped) -</code></pre><h2 id="lifecycle-services">Lifecycle Services</h2><p>Generated binaries call <code>gowdkapp.App()</code> and <code>runtime/app.Run</code>. Services -declared in <code>gowdk.Config.Lifecycle.Services</code> are imported by the generated app -and started with the binary:</p><pre><code class="language-go">package services - -import ( - &#34;context&#34; - &#34;net/http&#34; - - gowdkapp &#34;github.com/cssbruno/gowdk/runtime/app&#34; -) - -func Services() ([]gowdkapp.Service, error) { - return []gowdkapp.Service{ - gowdkapp.ServiceHooks{ - ServiceName: &#34;metrics&#34;, - MountFunc: func(ctx gowdkapp.ServiceContext) error { - ctx.Mux.HandleFunc(&#34;/metrics&#34;, func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNoContent) - }) - return nil - }, - RunFunc: func(ctx context.Context, _ gowdkapp.ServiceContext) error { - &lt;-ctx.Done() - return nil - }, - }, - }, nil -} -</code></pre><p><code>Mount</code> runs before the HTTP server starts. <code>Run</code> receives the same -cancellation context used for SIGINT/SIGTERM, service errors, and generated -HTTP shutdown. Services that only mount routes can omit <code>RunFunc</code>; services -that only run a worker can omit <code>MountFunc</code>.</p><p>When executable contract registrations exist, generated apps expose a shared -<code>ContractRegistry()</code> and put it in <code>ServiceContext.Values</code> under -<code>runtime/app.ServiceValueContractRegistry</code>. <code>NewContractRegistry()</code> still -creates a fresh isolated registry.</p><h2 id="guards">Guards</h2><p><code>guard</code> is optional, but a page is not public by default: a page that declares -no <code>guard</code> warns (<code>missing_page_guard</code>) and its route is denied (403) at request -time until access is stated. Use <code>guard public</code> to serve the page on purpose. -<code>public</code> is a compile-time marker, must be the only guard on that page, and does -not require runtime backing code.</p><p>Routes with non-public <code>guard</code> IDs require backing code unless the auth addon -provides it. <code>auth.Addon(auth.Options{...})</code> configures signed-cookie sessions, -registers the default <code>auth.required</code> guard, and supplies the provider used by -native <code>role:</code> / <code>permission:</code> guard IDs. Non-public page guards also require -request-time page rendering for the page GET route; build-time SPA pages emit -static HTML and cannot enforce frontend access.</p><p>Custom guard IDs still belong in generated app startup code:</p><pre><code class="language-go">import gowdkguard &#34;github.com/cssbruno/gowdk/runtime/guard&#34; - -func GOWDKGuardRegistry() gowdkguard.Registry { - return gowdkguard.Registry{ - &#34;auth.required&#34;: func(ctx gowdkguard.Context) error { - return nil - }, - } -} -</code></pre><p><code>addons/ssr.GuardRegistry</code> and <code>addons/ssr.LoadContext</code> remain aliases for -existing SSR-facing guard code.</p><p>Native RBAC guards reuse <code>guard</code> IDs:</p><pre><code class="language-gwdk">guard role:admin, permission:patients.read -</code></pre><p>With <code>auth.Addon</code>, generated startup resolves those IDs through the configured -session manager. App handlers can issue or clear the same session cookie through -<code>auth.DefaultSessions()</code>.</p><p>Without <code>auth.Addon</code>, generated app packages with native RBAC guard IDs require:</p><pre><code class="language-go">func GOWDKAuthProvider() auth.Provider -</code></pre><p>Define the application-owned principal source from generated app startup code:</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - gowdkauth &#34;github.com/cssbruno/gowdk/runtime/auth&#34; -) - -func GOWDKAuthProvider() gowdkauth.Provider { - return gowdkauth.ProviderFunc(func(request *http.Request) (*gowdkauth.Principal, error) { - return &amp;gowdkauth.Principal{ - ID: &#34;user-1&#34;, - Roles: []string{&#34;admin&#34;}, - Permissions: []string{&#34;patients.read&#34;}, - }, nil - }) -} -</code></pre><p>RBAC guard behavior:</p><ul><li><code>role:&lt;name&gt;</code> requires the principal to have that role.</li><li><code>permission:&lt;name&gt;</code> requires the principal to have that permission.</li><li>Multiple guard IDs are enforced in declaration order, so multiple RBAC guards -are an AND check.</li><li>A missing <code>GOWDKAuthProvider</code> function fails at Go compile time when no auth -addon provider is configured. A nil principal, provider error, or missing -role/permission fails closed with HTTP 403.</li><li>GOWDK does not manage users, passwords, OAuth, sessions, tenants, or storage. -The auth provider adapts application-owned identity into <code>auth.Principal</code>.</li><li>Native RBAC guards are a defense-in-depth redundancy layer for generated -route/page access. They must never replace backend authorization around -protected resources, data access, or service methods.</li></ul><p>Guard behavior (see <a href="/docs/language/guards/">guards.md</a> for the full access -contract):</p><ul><li>Missing <code>guard</code> is a <code>missing_page_guard</code> warning and the route is denied -(403) at request time — except on a page that also declares <code>act</code>/<code>api</code>/ -<code>fragment</code> endpoints, where it is a build error.</li><li><code>guard public</code> marks intentional public access and cannot be combined with -protected guard IDs.</li><li>Non-public page guards on build-time SPA/action page routes fail validation; -add <code>server {}</code> or <code>go server {}</code> with the SSR addon when the page itself is -protected.</li><li>Guards run in declaration order.</li><li>Missing custom guard backing code fails at Go compile time.</li><li>Guard errors fail closed with HTTP 403.</li><li>Guards run before action decoding, API handler calls, fragment hooks, SSR -<code>server {}</code>, and user business logic.</li><li>Guards return <code>nil</code> or <code>error</code>. Ordinary errors fail closed with HTTP 403. -<code>runtime/guard.RedirectTo</code>, <code>runtime/guard.Redirect</code>, and -<code>runtime/guard.Respond</code> are the explicit no-store redirect/custom-response -helpers for guard failures.</li></ul><p>Guard redirect and response helpers keep the guard signature small while making -the few intentional non-403 outcomes visible in code:</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - gowdkguard &#34;github.com/cssbruno/gowdk/runtime/guard&#34; - gowdkresponse &#34;github.com/cssbruno/gowdk/runtime/response&#34; -) - -func GOWDKGuardRegistry() gowdkguard.Registry { - return gowdkguard.Registry{ - &#34;auth.required&#34;: func(ctx gowdkguard.Context) error { - return gowdkguard.RedirectTo(&#34;/login&#34;) - }, - &#34;api.auth&#34;: func(ctx gowdkguard.Context) error { - return gowdkguard.Respond(gowdkresponse.JSONBody(http.StatusUnauthorized, `{&#34;error&#34;:&#34;login required&#34;}`)) - }, - } -} -</code></pre><p>Guard redirects must be local absolute paths. Protocol-relative URLs, -backslashes, newlines, and non-3xx redirect statuses are rejected before the -generated app can write them.</p><h2 id="rate-limiting">Rate Limiting</h2><p>When <code>ratelimit.Addon()</code> is enabled, generated apps expose:</p><pre><code class="language-go">gowdkapp.RegisterRateLimiter(limiter) -</code></pre><p>Generated request-time routes call the registered limiter before guards and -user handler logic. If no limiter is registered, requests continue.</p><h2 id="ordering">Ordering</h2><p>App-wide middleware registered with <code>RegisterMiddleware</code> wraps the entire -generated handler before the route-time sequence below.</p><p>Current generated request-time order:</p><ol><li>Attach route or endpoint context metadata, including raw and typed route -params when the route declares them.</li><li>Install panic boundary for supported generated lanes.</li><li>Run rate limiter when enabled and registered.</li><li>Run guards when declared.</li><li>Run CSRF validation for generated action POSTs when enabled.</li><li>Decode generated action input when applicable.</li><li>Call user Go handler, fragment hook, or SSR load/render path.</li><li>Write the returned <code>runtime/response.Response</code> or generated HTML.</li></ol><p>For auth-backed generated actions, this means a public login action validates -CSRF before calling the login handler, while a guarded logout action checks the -session guard first and only validates CSRF after the guard allows the request. -Guard failures use the guard response contract; CSRF failures return HTTP 403 -<code>invalid csrf token</code> with <code>Cache-Control: no-store</code>.</p><h2 id="non-goals">Non-Goals</h2><ul><li>No generated route rewriting hook.</li><li>No generated response transform hook.</li><li>No generated fetch/navigation interception hook.</li><li>No core MCP protocol implementation. MCP adapters belong in app code or an -external lifecycle service provider.</li><li>No custom GOWDK context type; user code receives <code>context.Context</code>.</li><li>No framework-specific middleware in generated core. Chi, Echo, Gin, and Fiber -adapters wrap the same <code>http.Handler</code>.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/images/index.html b/docs-site/dist/site/docs/reference/images/index.html deleted file mode 100644 index 0911926a..00000000 --- a/docs-site/dist/site/docs/reference/images/index.html +++ /dev/null @@ -1,68 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Images - GOWDK</title> - <meta name="description" content="GOWDK does not optimize, resize, transcode, or rewrite images today. Image optimization is app-owned, CDN-owned, or addon-owned. The compiler core keeps image handling explicit so..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Images - GOWDK"> - <meta property="og:description" content="GOWDK does not optimize, resize, transcode, or rewrite images today. Image optimization is app-owned, CDN-owned, or addon-owned. The compiler core keeps image handling explicit so..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Images - GOWDK"> - <meta name="twitter:description" content="GOWDK does not optimize, resize, transcode, or rewrite images today. Image optimization is app-owned, CDN-owned, or addon-owned. The compiler core keeps image handling explicit so..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Images</h1><p class="doc-lead">GOWDK does not optimize, resize, transcode, or rewrite images today. Image optimization is app-owned, CDN-owned, or addon-owned. The compiler core keeps image handling explicit so it does not need native image libraries, npm tools, or remote optimization services.</p></header><article class="prose"><p>GOWDK does not optimize, resize, transcode, or rewrite images today. Image -optimization is app-owned, CDN-owned, or addon-owned. The compiler core keeps -image handling explicit so it does not need native image libraries, npm tools, -or remote optimization services.</p><h2 id="current-contract">Current Contract</h2><ul><li>Literal <code>&lt;img&gt;</code>, <code>&lt;picture&gt;</code>, <code>&lt;source&gt;</code>, <code>src</code>, and <code>srcset</code> markup is -supported in <code>view {}</code>.</li><li>URL-valued attributes are checked for unsafe schemes. <code>srcset</code> candidates are -checked individually.</li><li><code>missing_img_alt</code> warns when a literal <code>&lt;img&gt;</code> has no explicit <code>alt</code>.</li><li>Page <code>image</code> metadata and <code>Build.Head.Image</code> can emit Open Graph/Twitter -image metadata. They do not create image files.</li><li>Component <code>asset</code> metadata can package image files into generated output and -record them in <code>gowdk-assets.json</code>, but GOWDK does not rewrite literal -<code>&lt;img src&gt;</code> URLs to those content-hashed paths.</li></ul><h2 id="recommended-pipeline">Recommended Pipeline</h2><p>Optimize images before <code>gowdk build</code>, or at the CDN/static host:</p><ol><li>Keep source images in app-owned folders such as <code>assets/source/</code>.</li><li>Generate deploy variants such as AVIF, WebP, and fallback JPEG/PNG with a -tool chosen by the app.</li><li>Copy optimized files to stable deploy paths or serve them through a CDN.</li><li>Reference those paths explicitly from <code>.gwdk</code> markup.</li><li>Use <code>width</code>, <code>height</code>, <code>loading</code>, <code>decoding</code>, <code>sizes</code>, and <code>srcset</code> so the -browser can choose the right asset.</li></ol><p>Example:</p><pre><code class="language-gwdk">view { - &lt;picture&gt; - &lt;source - type=&#34;image/avif&#34; - srcset=&#34;/images/hero-640.avif 640w, /images/hero-1280.avif 1280w&#34; - sizes=&#34;(max-width: 700px) 100vw, 700px&#34; /&gt; - &lt;source - type=&#34;image/webp&#34; - srcset=&#34;/images/hero-640.webp 640w, /images/hero-1280.webp 1280w&#34; - sizes=&#34;(max-width: 700px) 100vw, 700px&#34; /&gt; - &lt;img - src=&#34;/images/hero-1280.jpg&#34; - alt=&#34;Product dashboard&#34; - width=&#34;1280&#34; - height=&#34;720&#34; - loading=&#34;lazy&#34; - decoding=&#34;async&#34; /&gt; - &lt;/picture&gt; -} -</code></pre><h2 id="component-assets">Component Assets</h2><p>Use component <code>asset</code> metadata when the image is owned by a component and should -be visible in the generated asset manifest:</p><pre><code class="language-gwdk">component ProductBadge -asset &#34;./badge.png&#34; -</code></pre><p>GOWDK emits the file under -<code>assets/gowdk/components/&lt;package&gt;/&lt;component&gt;/</code> with a content hash and records -the logical-to-emitted mapping in <code>gowdk-assets.json</code>. The component markup -still owns its image URL. Use a stable deploy path or consume the manifest in -app-owned code when the hashed path must be referenced.</p><h2 id="social-images">Social Images</h2><p>Use page metadata or <code>Build.Head.Image</code> for social cards:</p><pre><code class="language-gwdk">page launch -route &#34;/launch&#34; -guard public -image &#34;https://cdn.example.com/social/launch.png&#34; -</code></pre><p><code>image</code> emits metadata only. The referenced file must already exist at the -given URL.</p><h2 id="non-goals">Non-Goals</h2><p>GOWDK does not currently:</p><ul><li>Generate responsive image variants.</li><li>Download or install image tools.</li><li>Rewrite image references through a CDN.</li><li>Inline image data.</li><li>Infer <code>alt</code> text.</li><li>Turn <code>asset</code> metadata into automatic <code>&lt;img&gt;</code> URLs.</li></ul><p>Future optional integrations may emit optimized variants or metadata, but they -must stay opt-in and outside the compiler/runtime core dependency surface.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/index.html b/docs-site/dist/site/docs/reference/index.html deleted file mode 100644 index 23dcebb7..00000000 --- a/docs-site/dist/site/docs/reference/index.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Reference - GOWDK</title> - <meta name="description" content="Reference docs describe current command, language-adjacent, runtime, and data contracts. For task-oriented examples, start with the [native cookbook](../cookbook/README.md). For..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Reference - GOWDK"> - <meta property="og:description" content="Reference docs describe current command, language-adjacent, runtime, and data contracts. For task-oriented examples, start with the [native cookbook](../cookbook/README.md). For..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Reference - GOWDK"> - <meta name="twitter:description" content="Reference docs describe current command, language-adjacent, runtime, and data contracts. For task-oriented examples, start with the [native cookbook](../cookbook/README.md). For..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Reference</h1><p class="doc-lead">Reference docs describe current command, language-adjacent, runtime, and data contracts. For task-oriented examples, start with the [native cookbook](../cookbook/README.md). For full lessons, use the [native learning path](../learning/native.md).</p></header><article class="prose"><p>Reference docs describe current command, language-adjacent, runtime, and data -contracts. For task-oriented examples, start with the -<a href="/docs/cookbook/">native cookbook</a>. For full lessons, use the -<a href="/docs/learning/native/">native learning path</a>.</p><h2 id="cli-and-project-shape">CLI And Project Shape</h2><ul><li><a href="/docs/reference/cli/">CLI</a>: current <code>gowdk</code> command surface.</li><li><a href="/docs/reference/config/">Config</a>: current Go config types and build target fields.</li><li><a href="/docs/reference/dev/">Dev server</a>: <code>gowdk dev</code> rebuild, live reload, generated-app restart, -overlay, and HMR behavior.</li><li><a href="/docs/reference/deployment/">Deployment</a>: output shapes, generated binaries, Docker, and -optional operations recipes.</li><li><a href="/docs/reference/testing/">Testing</a>: scaffolded smoke tests, browser smoke, accessibility, -and performance checks.</li></ul><h2 id="language-and-generated-output-contracts">Language And Generated Output Contracts</h2><ul><li><a href="/docs/reference/routing/">Routing</a>: route declarations, dynamic route behavior, and output -paths.</li><li><a href="/docs/reference/manifest/">Manifest</a>: current manifest JSON.</li><li><a href="/docs/reference/go-interop/">Go interop</a>: Go binding, build-data, typed param, and -stub-generation behavior.</li><li><a href="/docs/reference/hooks/">Hooks</a>: lifecycle services, middleware, guard, and rate-limit ordering.</li><li><a href="/docs/reference/errors/">Errors</a>: error pages, panic boundaries, and cache policy.</li><li><a href="/docs/reference/diagnostics/">Diagnostics</a>: diagnostic output formats.</li><li><a href="/docs/reference/diagnostic-codes/">Diagnostic codes</a>: diagnostic registry, stability, and -<code>gowdk explain</code>.</li></ul><h2 id="runtime-and-addons">Runtime And Addons</h2><ul><li><a href="/docs/reference/addons/">Addons</a>: current addon feature registration and discovery.</li><li><a href="/docs/reference/contracts/">Contracts</a>: runtime contract registry and generated -command/query adapters.</li><li><a href="/docs/reference/realtime/">Realtime</a>: presentation-event fanout setup, SSE default, and -WebSocket opt-in behavior.</li><li><a href="/docs/reference/tracing/">Tracing</a>: dependency-free runtime trace IDs, spans, sinks, -sampling, propagation, and local collection.</li><li><a href="/docs/reference/observability/">Observability</a>: generated tracing addon and debug-gated -instrumentation.</li><li><a href="/docs/reference/db/">Database</a>: current database addon conventions and boundaries.</li><li><a href="/docs/reference/framework-integrations/">Framework integrations</a>: adapter integration notes.</li></ul><h2 id="frontend-and-metadata">Frontend And Metadata</h2><ul><li><a href="/docs/reference/css/">CSS</a>: current CSS extension point.</li><li><a href="/docs/reference/images/">Images</a>: image optimization patterns and current non-goals.</li><li><a href="/docs/reference/seo/">SEO</a>: optional sitemap.xml and robots.txt emission.</li><li><a href="/docs/reference/pwa-offline/">PWA/offline</a>: optional user-owned service worker and -manifest guidance.</li></ul><h2 id="source-of-truth">Source Of Truth</h2><ul><li>Language syntax and semantics live under <a href="/docs/language/">language</a>.</li><li>Compiler pipeline and generated-output details live under -<a href="/docs/compiler/">compiler</a>.</li><li>Cookbook/example coverage and remaining docs gaps live in the -<a href="/docs/cookbook/#coverage-and-gaps">native cookbook coverage table</a>.</li><li>Product status lives in <a href="/docs/product/requirements/">requirements</a>.</li><li>Production hardening guidance lives in -<a href="/docs/engineering/security/">engineering/security</a> and -<a href="/docs/engineering/operations/">engineering/operations</a>.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/manifest/index.html b/docs-site/dist/site/docs/reference/manifest/index.html deleted file mode 100644 index 7f93f5a6..00000000 --- a/docs-site/dist/site/docs/reference/manifest/index.html +++ /dev/null @@ -1,163 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Manifest Reference - GOWDK</title> - <meta name="description" content="gowdk manifest prints validated route metadata for explicit .gwdk files."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Manifest Reference - GOWDK"> - <meta property="og:description" content="gowdk manifest prints validated route metadata for explicit .gwdk files."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Manifest Reference - GOWDK"> - <meta name="twitter:description" content="gowdk manifest prints validated route metadata for explicit .gwdk files."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Manifest Reference</h1><p class="doc-lead">gowdk manifest prints validated route metadata for explicit .gwdk files.</p></header><article class="prose"><p><code>gowdk manifest</code> prints validated route metadata for explicit <code>.gwdk</code> files.</p><pre><code class="language-sh">go run ./cmd/gowdk manifest --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk examples/go-interop/*.gwdk examples/components/base/*.gwdk examples/components/css/*.gwdk examples/components/assets/*.gwdk examples/components/wasm/*.gwdk examples/embed/*.gwdk examples/css/*.gwdk examples/tailwind/*.gwdk -</code></pre><p>Current JSON shape:</p><pre><code class="language-json">{ - &#34;version&#34;: 1, - &#34;pages&#34;: { - &#34;dashboard&#34;: { - &#34;source&#34;: &#34;examples/ssr/dashboard.page.gwdk&#34;, - &#34;kind&#34;: &#34;page&#34;, - &#34;package&#34;: &#34;dashboard&#34;, - &#34;route&#34;: &#34;/dashboard&#34;, - &#34;render&#34;: &#34;ssr&#34;, - &#34;uses&#34;: [ - {&#34;alias&#34;: &#34;ui&#34;, &#34;package&#34;: &#34;components&#34;} - ], - &#34;layouts&#34;: [&#34;root&#34;, &#34;dashboard&#34;], - &#34;guard&#34;: [&#34;auth.required&#34;], - &#34;css&#34;: [&#34;default&#34;, &#34;page&#34;, &#34;forms&#34;], - &#34;components&#34;: [&#34;Hero&#34;], - &#34;assets&#34;: [&#34;/assets/dashboard.png&#34;], - &#34;cssClasses&#34;: [&#34;dashboard&#34;, &#34;panel&#34;], - &#34;styleAttributes&#34;: [&#34;color: red;&#34;], - &#34;blocks&#34;: { - &#34;paths&#34;: false, - &#34;build&#34;: false, - &#34;load&#34;: true, - &#34;view&#34;: true - } - }, - &#34;signup&#34;: { - &#34;source&#34;: &#34;examples/actions/signup.page.gwdk&#34;, - &#34;kind&#34;: &#34;page&#34;, - &#34;route&#34;: &#34;/signup&#34;, - &#34;render&#34;: &#34;action&#34;, - &#34;artifacts&#34;: [ - {&#34;kind&#34;: &#34;html&#34;, &#34;path&#34;: &#34;signup/index.html&#34;} - ], - &#34;blocks&#34;: { - &#34;paths&#34;: false, - &#34;build&#34;: false, - &#34;load&#34;: false, - &#34;view&#34;: true, - &#34;actions&#34;: [&#34;submit&#34;] - }, - &#34;actions&#34;: [ - { - &#34;name&#34;: &#34;submit&#34;, - &#34;inputName&#34;: &#34;input&#34;, - &#34;inputType&#34;: &#34;SignupInput&#34;, - &#34;validatesInput&#34;: true, - &#34;redirect&#34;: &#34;/signup?ok=1&#34;, - &#34;fragments&#34;: [ - {&#34;target&#34;: &#34;#signup-result&#34;} - ] - } - ], - &#34;apis&#34;: [ - { - &#34;name&#34;: &#34;health&#34;, - &#34;method&#34;: &#34;GET&#34;, - &#34;route&#34;: &#34;/api/health&#34; - } - ] - } - }, - &#34;components&#34;: { - &#34;Hero&#34;: { - &#34;source&#34;: &#34;examples/pages/hero.cmp.gwdk&#34;, - &#34;kind&#34;: &#34;component&#34;, - &#34;package&#34;: &#34;components&#34;, - &#34;props&#34;: [ - {&#34;name&#34;: &#34;title&#34;, &#34;type&#34;: &#34;string&#34;}, - {&#34;name&#34;: &#34;tagline&#34;, &#34;type&#34;: &#34;string&#34;} - ], - &#34;emits&#34;: [ - { - &#34;name&#34;: &#34;select&#34;, - &#34;params&#34;: [ - {&#34;name&#34;: &#34;id&#34;, &#34;type&#34;: &#34;string&#34;}, - {&#34;name&#34;: &#34;active&#34;, &#34;type&#34;: &#34;bool&#34;} - ] - } - ] - } - } -} -</code></pre><p>Fields:</p><ul><li><code>version</code>: public manifest schema version.</li><li><code>source</code>: source file path.</li><li><code>kind</code>: file kind, currently <code>page</code> or <code>component</code>.</li><li><code>package</code>: <code>.gwdk</code> package name when declared.</li><li><code>uses</code>: optional GOWDK source package imports declared as -<code>use alias &#34;package&#34;</code>; these are separate from normal Go imports.</li><li><code>route</code>: declared route path.</li><li><code>render</code>: effective render mode after applying default <code>spa</code>.</li><li><code>metadata</code>: optional page document metadata from <code>title</code>, <code>description</code>, -<code>canonical</code>, <code>image</code>, <code>robots</code>, <code>noindex</code>, <code>preload</code>, and <code>prefetch</code>. -<code>preload</code> and <code>prefetch</code> entries are arrays of <code>{ &#34;href&#34;: &#34;...&#34;, &#34;as&#34;: &#34;...&#34; }</code> objects; <code>as</code> is omitted when the source declaration did not set it.</li><li><code>layouts</code>: optional ordered layout references. Bare names are same-package or -package-less layout IDs; qualified names such as <code>chrome.root</code> resolve through -page <code>use chrome &#34;package&#34;</code> declarations.</li><li><code>dynamicParams</code>: route param names declared in dynamic route segments.</li><li><code>routeParams</code>: route param names and scalar types. Untyped params are -reported as <code>string</code>.</li><li><code>cache</code>: optional concrete page Cache-Control response metadata from <code>cache</code> -and <code>revalidate</code>.</li><li><code>paths</code>: optional boolean present when <code>paths {}</code> exists.</li><li><code>guard</code>: explicit page access metadata. Real page sources must declare it; -intentionally public pages report <code>[&#34;public&#34;]</code>.</li><li><code>css</code>: optional <code>css</code> page selection metadata.</li><li><code>js</code>: optional path-based scoped browser script declarations.</li><li><code>inlineJS</code>: optional generated names for inline <code>js {}</code> browser script -declarations. The manifest does not include inline code bodies.</li><li><code>blocks</code>: declared page block presence and action/API block names.</li><li><code>actions</code>: optional action metadata for the first supported action body -subset, including input metadata, validation intent, local redirects, and -fragment targets declared with <code>fragment &#34;#id&#34; {}</code>.</li><li><code>apis</code>: optional API block metadata, including method and route when declared -with the first supported API endpoint metadata subset.</li><li>page <code>components</code>: optional sorted component names directly referenced by the -current literal <code>view {}</code> parser subset.</li><li><code>assets</code>: optional sorted literal <code>src</code>, <code>href</code>, and <code>poster</code> -references directly visible in the current literal <code>view {}</code> parser subset. -Interpolated and external URLs are omitted.</li><li><code>cssClasses</code>: optional sorted class names directly visible in literal <code>class</code> -attributes.</li><li><code>styleAttributes</code>: optional sorted literal inline <code>style</code> attribute values.</li><li><code>artifacts</code>: optional generated artifact path metadata. SPA and action -pages list the generated HTML path pattern relative to the build output -directory, such as <code>index.html</code>, <code>newsletter/index.html</code>, or -<code>blog/{slug}/index.html</code>. SSR-only pages omit app-shell HTML artifacts.</li><li><code>components</code>: component declarations known to the manifest. -Component declarations may include <code>css</code>, <code>js</code>, <code>inlineJS</code>, <code>assets</code>, inline -<code>props</code>, typed <code>propsType</code>/<code>state</code> contracts, typed public <code>exports</code>, and emitted -browser-island event metadata under <code>emits</code>.</li><li><code>backendBindings</code>: action/API handler binding metadata. Entries include -endpoint kind, source, page ID, declared block name, method, endpoint path, -Go package/import details, exact handler symbol, signature/input metadata when -supported, binding status, and binding message.</li></ul><p>The site-map command emits broader editor-facing JSON that includes source -paths, dynamic route params, block presence, and the normalized route graph. -The route graph adds <code>routes</code> entries for page/file routes and <code>endpoints</code> -entries for action, API, fragment, and command/query contract declarations. -Route and endpoint entries include method, path, page ID, source path, source -span when known, package, handler, status/binding summary fields, and contract -binding details for command/query references.</p><p><code>gowdk build</code> also writes a separate SPA route manifest named -<code>gowdk-routes.json</code> in the selected output directory. That generated file records -emitted page IDs, declared routes, and relative build output paths under -<code>routes</code>. Dynamic SPA routes are recorded once for each generated concrete -route. The same file also records generated request-time backend route metadata -under <code>endpoints</code> for actions, APIs, fragments, and routable command/query -adapters, including <code>dynamicParams</code> and typed <code>routeParams</code> for dynamic -endpoint routes.</p><p>SPA builds also write <code>gowdk-assets.json</code> in the selected output directory:</p><pre><code class="language-json">{ - &#34;version&#34;: 2, - &#34;files&#34;: { - &#34;assets/app.css&#34;: &#34;assets/app.7ada5a1234b1.css&#34; - } -} -</code></pre><p>Today it records CSS files emitted by compile-time CSS processors, generated -page CSS, and page-level cache policies for generated SPA HTML. Keys are stable -logical asset names. Values are emitted slash-separated paths relative to the -selected output directory; generated CSS is minified and emitted with -content-hashed filenames. The <code>cache</code> map may include route HTML paths such as -<code>index.html</code> without adding those route files to <code>files</code>; when a page declares -<code>revalidate</code>, the recorded cache policy includes the generated -<code>stale-while-revalidate=&lt;seconds&gt;</code> directive. The optional <code>obfuscated</code> map -marks compiler-owned generated browser assets transformed by production asset -obfuscation.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/observability/index.html b/docs-site/dist/site/docs/reference/observability/index.html deleted file mode 100644 index 92dd088e..00000000 --- a/docs-site/dist/site/docs/reference/observability/index.html +++ /dev/null @@ -1,56 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Observability - GOWDK</title> - <meta name="description" content="addons/observability enables generated GOWDK Trace wiring for debug builds. It registers FeatureObservability; runtime/trace remains the dependency-free root runtime, and optional..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Observability - GOWDK"> - <meta property="og:description" content="addons/observability enables generated GOWDK Trace wiring for debug builds. It registers FeatureObservability; runtime/trace remains the dependency-free root runtime, and optional..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Observability - GOWDK"> - <meta name="twitter:description" content="addons/observability enables generated GOWDK Trace wiring for debug builds. It registers FeatureObservability; runtime/trace remains the dependency-free root runtime, and optional..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Observability</h1><p class="doc-lead">addons/observability enables generated GOWDK Trace wiring for debug builds. It registers FeatureObservability; runtime/trace remains the dependency-free root runtime, and optional OTLP export lives in the nested runtime/trace/otel module.</p></header><article class="prose"><p><code>addons/observability</code> enables generated GOWDK Trace wiring for debug builds. -It registers <code>FeatureObservability</code>; <code>runtime/trace</code> remains the dependency-free -root runtime, and optional OTLP export lives in the nested -<code>runtime/trace/otel</code> module.</p><p>Enable it:</p><pre><code class="language-sh">gowdk add observability -gowdk build --debug --app /tmp/gowdk-app pages/home.page.gwdk -</code></pre><p>Generated development builds mount the local trace viewer at:</p><pre><code class="language-text">/_gowdk/traces -</code></pre><p>The viewer is off unless the addon is enabled and <code>Build.DebugAssets()</code> is true -(<code>Build.Mode != gowdk.Production</code>). Outside dev, generated apps mount the viewer -behind <code>runtime/app.LocalTraceAccess</code>, which only allows direct localhost or -loopback requests and rejects forwarded reverse-proxy requests unless the app -supplies an explicit <code>TraceAccess</code> function.</p><p>Current generated instrumentation:</p><ul><li>Backend request route spans extract incoming <code>traceparent</code>.</li><li>Generated SSR route and <code>load {}</code> spans record route IDs, render lane, -source refs, response status, and load errors without storing raw request -bodies or headers.</li><li>Generated action, API, fragment, command, and query routes record handler -spans with <code>.gwdk</code> source refs when debug metadata is enabled.</li><li>Guards and contract command/query/job/event/worker operations record child -spans when a tracer is present in context.</li><li><code>runtime/contracts.EventEnvelope</code> and file outbox records carry an optional -<code>traceparent</code>; old records without it remain readable.</li><li>Generated browser runtime spans partial submits and SPA navigation, injects -<code>traceparent</code>, and posts frontend spans to the local collector.</li><li>JS islands, WASM island loaders, and page-level client Go WASM loaders reuse -<code>window.__gowdkTrace</code>.</li></ul><p>The generated local collector keeps a bounded in-memory ring of 1024 completed -spans. Generated code records stable route/endpoint IDs and source metadata, and -uses runtime redaction helpers for query strings, error messages, and app-owned -trace events.</p><p>For app-owned Go handlers, record a user event on the active span:</p><pre><code class="language-go">app.Trace(ctx, &#34;loaded patient&#34;, map[string]any{&#34;patientID&#34;: id}) -</code></pre><p>Export to OTLP from an app that opts into the nested module:</p><pre><code class="language-go">sink, err := otel.NewSink(ctx, otel.WithEndpoint(&#34;localhost:4318&#34;), otel.WithInsecure()) -if err != nil { - return err -} -defer sink.Shutdown(ctx) - -tracer := trace.NewTracer(trace.WithSink(sink)) -</code></pre><p>Do not treat the local collector or viewer as a production observability -backend. Production deployments should set sampling deliberately, keep viewer -access gated or disabled, and send spans to app-owned telemetry infrastructure.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/pwa-offline/index.html b/docs-site/dist/site/docs/reference/pwa-offline/index.html deleted file mode 100644 index c0384168..00000000 --- a/docs-site/dist/site/docs/reference/pwa-offline/index.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>PWA And Offline - GOWDK</title> - <meta name="description" content="GOWDK does not emit a service worker, web app manifest, offline page, or install prompt by default. PWA behavior is app-owned and opt-in because hidden offline caching can break..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="PWA And Offline - GOWDK"> - <meta property="og:description" content="GOWDK does not emit a service worker, web app manifest, offline page, or install prompt by default. PWA behavior is app-owned and opt-in because hidden offline caching can break..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="PWA And Offline - GOWDK"> - <meta name="twitter:description" content="GOWDK does not emit a service worker, web app manifest, offline page, or install prompt by default. PWA behavior is app-owned and opt-in because hidden offline caching can break..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>PWA And Offline</h1><p class="doc-lead">GOWDK does not emit a service worker, web app manifest, offline page, or install prompt by default. PWA behavior is app-owned and opt-in because hidden offline caching can break generated actions, APIs, fragments, SSR pages, auth, CSRF, and cache policy.</p></header><article class="prose"><p>GOWDK does not emit a service worker, web app manifest, offline page, or -install prompt by default. PWA behavior is app-owned and opt-in because hidden -offline caching can break generated actions, APIs, fragments, SSR pages, auth, -CSRF, and cache policy.</p><h2 id="current-contract">Current Contract</h2><ul><li>Static SPA output can be cached by a user-owned service worker.</li><li>Generated request-time routes keep their normal HTTP cache headers. Do not -override <code>no-store</code> action, API, fragment, SSR, auth, or error responses.</li><li><code>Build.Scripts</code> can register a global script tag, but it does not copy the -referenced file. Copy <code>register-sw.js</code>, <code>sw.js</code>, <code>manifest.webmanifest</code>, and -icons with your deploy pipeline or static host.</li><li>Root-scope service workers for one-binary deploys are not a GOWDK contract -yet. If an app needs <code>/sw.js</code> from the root scope, serve that file at the -deploy edge or a static host in front of the generated binary.</li><li><code>BuildConfig.Assets</code> and a first-class PWA addon remain planned.</li></ul><h2 id="minimal-registration">Minimal Registration</h2><p>Add a user-owned registration script to the generated pages:</p><pre><code class="language-go">var Config = gowdk.Config{ - Build: gowdk.BuildConfig{ - Scripts: []gowdk.Script{ - {Src: &#34;/register-sw.js&#34;, Type: &#34;module&#34;}, - }, - }, -} -</code></pre><p>Copy <code>register-sw.js</code> next to the deployed output:</p><pre><code class="language-js">if (&#34;serviceWorker&#34; in navigator) { - window.addEventListener(&#34;load&#34;, () =&gt; { - navigator.serviceWorker.register(&#34;/sw.js&#34;, { scope: &#34;/&#34; }); - }); -} -</code></pre><p>Link a web app manifest outside GOWDK today, for example through a static host -template or post-build HTML transform:</p><pre><code class="language-html">&lt;link rel=&#34;manifest&#34; href=&#34;/manifest.webmanifest&#34;&gt; -</code></pre><h2 id="service-worker-rules">Service Worker Rules</h2><p>Keep the service worker conservative:</p><pre><code class="language-js">const CACHE = &#34;site-v1&#34;; -const PRECACHE = [&#34;/&#34;, &#34;/gowdk-assets.json&#34;]; - -self.addEventListener(&#34;install&#34;, (event) =&gt; { - event.waitUntil(caches.open(CACHE).then((cache) =&gt; cache.addAll(PRECACHE))); -}); - -self.addEventListener(&#34;fetch&#34;, (event) =&gt; { - const url = new URL(event.request.url); - if (event.request.method !== &#34;GET&#34;) return; - if (url.pathname.startsWith(&#34;/api/&#34;)) return; - if (url.pathname.startsWith(&#34;/_gowdk/&#34;)) return; - if (url.pathname.includes(&#34;/fragments/&#34;)) return; - - event.respondWith( - caches.match(event.request).then((cached) =&gt; { - return cached || fetch(event.request); - }), - ); -}); -</code></pre><p>Use explicit allowlists for pages and immutable generated assets. Avoid -catch-all offline fallbacks for request-time pages unless the app can tolerate -stale or unauthenticated content.</p><h2 id="what-gowdk-will-not-do-implicitly">What GOWDK Will Not Do Implicitly</h2><ul><li>Register service workers.</li><li>Cache generated action/API/fragment/SSR responses.</li><li>Cache CSRF tokens, auth state, session-specific HTML, or error responses.</li><li>Rewrite routes to an offline shell.</li><li>Install Workbox, npm packages, or browser build tooling.</li></ul><p>Document any app-owned offline behavior beside the deploy recipe so operators -know how to roll back a bad service worker version.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/realtime/index.html b/docs-site/dist/site/docs/reference/realtime/index.html deleted file mode 100644 index 87cdf247..00000000 --- a/docs-site/dist/site/docs/reference/realtime/index.html +++ /dev/null @@ -1,178 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Realtime - GOWDK</title> - <meta name="description" content="addons/realtime registers FeatureRealtime for browser-facing presentation event fanout. Current support covers delivery of contracts.PresentationEvent envelopes to browser..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Realtime - GOWDK"> - <meta property="og:description" content="addons/realtime registers FeatureRealtime for browser-facing presentation event fanout. Current support covers delivery of contracts.PresentationEvent envelopes to browser..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Realtime - GOWDK"> - <meta name="twitter:description" content="addons/realtime registers FeatureRealtime for browser-facing presentation event fanout. Current support covers delivery of contracts.PresentationEvent envelopes to browser..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Realtime</h1><p class="doc-lead">addons/realtime registers FeatureRealtime for browser-facing presentation event fanout. Current support covers delivery of contracts.PresentationEvent envelopes to browser clients, compiler metadata for g:subscribe query regions, generated SSE fanout for bound subscriptions, bounded generated client patches for query-owned regions, and explicit domain-event to query invalidation refresh.</p></header><article class="prose"><p><code>addons/realtime</code> registers <code>FeatureRealtime</code> for browser-facing presentation -event fanout. Current support covers delivery of -<code>contracts.PresentationEvent</code> envelopes to browser clients, compiler metadata -for <code>g:subscribe</code> query regions, generated SSE fanout for bound subscriptions, -bounded generated client patches for query-owned regions, and explicit -domain-event to query invalidation refresh.</p><p>Use it with contract web adapters when commands emit presentation events:</p><pre><code class="language-go">import ( - &#34;github.com/cssbruno/gowdk&#34; - &#34;github.com/cssbruno/gowdk/addons/contracts&#34; - &#34;github.com/cssbruno/gowdk/addons/realtime&#34; -) - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - contracts.Addon(), - realtime.Addon(), - }, -} -</code></pre><p><code>gowdk add realtime</code> inserts the same config entry.</p><h2 id="gwdk-subscriptions"><code>.gwdk</code> Subscriptions</h2><p>Use <code>g:subscribe</code> on the same element as <code>g:query</code> to declare that a query-owned -region should listen for a presentation event:</p><pre><code class="language-gwdk">view { - &lt;section - g:query=&#34;patients.GetPatientPage&#34; - g:subscribe=&#34;patients.PatientNotice&#34;&gt; - &lt;h1&gt;Patients&lt;/h1&gt; - &lt;/section&gt; -} -</code></pre><p>Current behavior:</p><ul><li>Requires <code>realtime.Addon()</code> in <code>gowdk.config.go</code>.</li><li>Adds a subscription record to <code>internal/gwdkir.Program.RealtimeSubscriptions</code>.</li><li>Validates the event reference against scanned <code>runtime/contracts</code> -presentation-event registrations.</li><li>Rejects unknown events, invalid event registrations, domain/integration event -categories, and registrations that are not available to the <code>web</code> role.</li><li>Renders <code>data-gowdk-query</code>, <code>data-gowdk-subscribe</code>, and validated -<code>data-gowdk-subscribe-type</code> markers for compiler-owned runtime hookup.</li><li>Adds <code>realtime_subscription</code> events to <code>gowdk-build-report.json</code> when present.</li><li>Generated apps with bound subscriptions mount a dependency-free SSE stream at -<code>/_gowdk/realtime/events</code>.</li><li>Generated command adapters dispatch command-emitted presentation events to a -subscription-filtered fanout, so only explicitly subscribed event types are -streamed.</li><li>Generated stream handlers run inherited subscribed-page guards before opening -an SSE response. They choose page guards from <code>?path=...</code> or the request -referer path when available; if no page path can be identified, guarded -subscriptions fail closed by requiring the union of subscribed guard IDs.</li><li>Generated <code>gowdk.js</code> connects pages with subscribed regions to the SSE stream -and applies explicit <code>replaceHTML</code> patches to matching query-owned elements.</li><li>Generated apps expose <code>RealtimeEventsPath</code> and -<code>RegisterRealtimeFanout(realtime.PresentationFanout)</code> for app-owned server -setup.</li></ul><p>Current limits:</p><ul><li>Subscriptions must be query-bounded; <code>g:subscribe</code> without <code>g:query</code> is -rejected.</li><li>Only explicit <code>replaceHTML</code> patches are supported in the generated client -runtime; richer patch shapes are deferred.</li><li>Custom retry/backoff/replay, active server-side session-change stream -revocation, richer patch shapes, and route-specific refresh endpoints remain -follow-up work.</li></ul><h2 id="query-invalidations">Query Invalidations</h2><p>Use <code>contracts.RegisterInvalidation[event, query]</code> in Go when a backend-owned -domain event should refresh query-owned regions:</p><pre><code class="language-go">func Register(registry *contracts.Registry) { - contracts.RegisterQuery[GetPatientPage, PatientPageData](registry, LoadPatientPage, contracts.RoleWeb) - contracts.RegisterCommand[CreatePatient, CreatePatientResult](registry, HandleCreatePatient, contracts.RoleWeb) - contracts.RegisterDomainEvent[PatientCreated](registry, SendWelcomeEmail, contracts.RoleWorker) - contracts.RegisterInvalidation[PatientCreated, GetPatientPage](registry) -} -</code></pre><p>Current behavior:</p><ul><li>Requires <code>realtime.Addon()</code> when the invalidated query is bound by <code>.gwdk</code>.</li><li>Scans invalidation edges beside normal contract registrations.</li><li>Rejects edges that name an unknown query, an unknown domain event, or a -domain event no scanned command emits.</li><li>Joins edges with bound <code>g:query</code> references into -<code>Program.QueryInvalidations</code>.</li><li>Adds <code>query_invalidation</code> events to <code>gowdk-build-report.json</code>.</li><li>Prints invalidation edges in <code>gowdk graph</code>.</li><li>Renders validated <code>data-gowdk-query-type</code> markers.</li><li>Generated command adapters send a <code>gowdk.query.invalidate</code> presentation event -after successful command event dispatch when captured domain events invalidate -bound queries.</li><li>Generated <code>gowdk.js</code> refetches the current document and replaces matching -non-subscribed query regions. Regions with <code>g:subscribe</code> are left to explicit -presentation patches so a document refetch does not overwrite a patch.</li></ul><p>The generated invalidation event value is:</p><pre><code class="language-json">{ - &#34;queries&#34;: [&#34;github.com/acme/clinic/patients.GetPatientPage&#34;], - &#34;events&#34;: [&#34;domain:github.com/acme/clinic/patients.PatientCreated&#34;] -} -</code></pre><h2 id="live-example">Live Example</h2><p><code>examples/contracts/patients.page.gwdk</code> demonstrates the current live-update -contract:</p><ul><li><code>.gwdk</code> owns <code>g:query=&#34;patients.GetPatientPage&#34;</code> and -<code>g:subscribe=&#34;patients.PatientNotice&#34;</code> on the live region, plus a -non-subscribed query region refreshed through invalidation.</li><li>User Go owns the command, query, presentation-event registration, and the -server-generated <code>replaceHTML</code> patch payload. It also registers -<code>RegisterInvalidation[PatientCreated, GetPatientPage]</code>.</li><li>Generated Go owns the command/query web adapters, subscription-filtered SSE -stream, invalidation presentation events, inherited guard checks, and command -event sink composition.</li><li>Generated <code>gowdk.js</code> owns the EventSource connection and applies the patch to -the subscribed query region or refetches invalidated query regions.</li></ul><p>Build and run it:</p><pre><code class="language-sh">go run ./cmd/gowdk build --config examples/contracts/gowdk.config.go --out /tmp/gowdk-contracts-build --app /tmp/gowdk-contracts-app --bin /tmp/gowdk-contracts-site examples/contracts/patients.page.gwdk -/tmp/gowdk-contracts-site -</code></pre><p>Open <code>http://127.0.0.1:8080/contracts/patients</code>. With JavaScript enabled, the -generated runtime opens <code>/_gowdk/realtime/events</code>; submitting the form runs the -Go command, emits <code>patients.PatientNotice</code>, and replaces the subscribed status -region with the patch HTML from user Go. The same command emits -<code>patients.PatientCreated</code>, which triggers a generated query invalidation event -for the non-subscribed query region. Without JavaScript, the page still renders -the static query regions and the form posts to the generated command endpoint.</p><p>Useful smoke checks:</p><pre><code class="language-sh">test -f /tmp/gowdk-contracts-build/assets/gowdk/gowdk.js -grep -F &#39;&#34;kind&#34;: &#34;realtime_subscription&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;kind&#34;: &#34;query_invalidation&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;&#34;event&#34;: &#34;patients.PatientNotice&#34;&#39; /tmp/gowdk-contracts-build/gowdk-build-report.json -grep -F &#39;data-gowdk-subscribe-type=&#39; /tmp/gowdk-contracts-build/contracts/patients/index.html -grep -F &#39;data-gowdk-query-type=&#39; /tmp/gowdk-contracts-build/contracts/patients/index.html -go test ./examples/contracts/patients -</code></pre><h2 id="client-patch-payloads">Client Patch Payloads</h2><p>Generated clients consume <code>gowdk-presentation</code> SSE messages whose envelope -<code>Value</code> contains either one <code>patch</code> object or a <code>patches</code> array:</p><pre><code class="language-json">{ - &#34;patch&#34;: { - &#34;op&#34;: &#34;replaceHTML&#34;, - &#34;html&#34;: &#34;&lt;p&gt;Updated&lt;/p&gt;&#34;, - &#34;swap&#34;: &#34;innerHTML&#34; - } -} -</code></pre><p>Supported patch fields:</p><ul><li><code>op</code>: must be <code>replaceHTML</code>.</li><li><code>html</code>: replacement HTML string.</li><li><code>swap</code>: optional, <code>innerHTML</code> by default; <code>outerHTML</code> is also accepted.</li></ul><p>The browser runtime applies patches only to regions whose validated -<code>data-gowdk-subscribe-type</code> matches the presentation event type. Unsupported -patch operations, missing HTML, malformed payloads, and unsupported swaps emit -<code>gowdk:realtime-error</code> and leave the DOM unchanged.</p><h2 id="stream-failure-and-backpressure">Stream Failure And Backpressure</h2><p>Generated streams are ordinary same-origin SSE responses. Before the response -is opened, generated code runs the guard IDs inherited by subscribed page -regions. Guard failures return the existing no-store guard failure response -instead of an SSE stream, so browsers do not receive protected events after -access is denied.</p><p>The dependency-free SSE adapter sends <code>retry: 1000</code>, so browser EventSource -clients use a one-second reconnect delay for ordinary transport failures. GOWDK -does not add custom browser retry state in this slice.</p><p>Each SSE client has a bounded queue (<code>16</code> messages by default, configurable -with <code>realtime.WithSSEBufferSize</code>). When a client queue is full, new events for -that client are dropped instead of blocking command execution or other clients. -Use a broker/outbox/replay path for applications that require guaranteed -delivery after disconnects or slow clients.</p><p>Active server-side session changes are enforced on the next stream open or -reconnect. Immediate revocation of already-open streams remains app-owned or -future GOWDK runtime work.</p><h2 id="transport-choice">Transport Choice</h2><p>Generated apps use SSE first when the browser only needs server-to-client -presentation events. SSE is dependency-free in the root module, uses normal -HTTP, and works well for notifications, progress updates, and invalidation -signals.</p><p>For app-owned routes or custom setup outside generated subscriptions:</p><pre><code class="language-go">import ( - &#34;net/http&#34; - - &#34;github.com/cssbruno/gowdk/addons/realtime&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; -) - -hub := realtime.NewSSE(realtime.WithSSEBufferSize(32)) -http.Handle(&#34;/gowdk/events&#34;, hub) - -gowdkapp.RegisterContractEventSink( - contracts.PresentationFanoutCommandEventSink(hub), -) -</code></pre><p>The browser receives <code>event: gowdk-presentation</code> messages whose <code>data</code> field is -a JSON <code>contracts.EventEnvelope</code>. Domain and integration events are filtered -out before delivery.</p><p>Use WebSocket when the app already needs a persistent bidirectional socket, a -WebSocket-specific deployment path, or protocol-level client messages. The -current GOWDK WebSocket adapter only fans presentation events out to connected -clients; inbound WebSocket commands remain app-owned Go.</p><p>WebSocket support is a nested module so <code>github.com/coder/websocket</code> does not -enter the root module graph:</p><pre><code class="language-sh">go get github.com/cssbruno/gowdk/runtime/contracts/websocketfanout -</code></pre><pre><code class="language-go">import ( - &#34;net/http&#34; - - &#34;github.com/coder/websocket&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts&#34; - &#34;github.com/cssbruno/gowdk/runtime/contracts/websocketfanout&#34; -) - -hub := websocketfanout.New(websocketfanout.WithAcceptOptions(websocket.AcceptOptions{ - OriginPatterns: []string{&#34;https://example.com&#34;}, -})) -http.Handle(&#34;/gowdk/events/ws&#34;, hub) - -gowdkapp.RegisterContractEventSink( - contracts.PresentationFanoutCommandEventSink(hub), -) -</code></pre><p>Each presentation event is written as one text JSON <code>contracts.EventEnvelope</code>.</p><h2 id="deployment-notes">Deployment Notes</h2><ul><li>In-process SSE and WebSocket hubs only know about clients connected to the -same process. Multi-instance deployments should pair fanout with a broker, -outbox, or external pub/sub path when all clients must see the same event.</li><li>SSE responses set <code>X-Accel-Buffering: no</code>; reverse proxies may still need -explicit buffering and timeout settings for long-lived streams.</li><li>WebSocket deployments should set origin checks and proxy upgrade headers.</li><li>Presentation events are untrusted browser output. Do not treat client -messages or presentation-event names as authorization.</li></ul><h2 id="verification">Verification</h2><pre><code class="language-sh">go run ./cmd/gowdk add --list -go run ./cmd/gowdk add --list --registry -go test ./runtime/contracts/sse -go test ./internal/appgen -run &#39;TestGenerateGuardsRealtimeStreamForSubscribedPages|TestGeneratedBinaryRealtimeStreamGuardDenialClosesStream&#39; -(cd runtime/contracts/websocketfanout &amp;&amp; go test ./...) -</code></pre></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/routing/index.html b/docs-site/dist/site/docs/reference/routing/index.html deleted file mode 100644 index 4e9be204..00000000 --- a/docs-site/dist/site/docs/reference/routing/index.html +++ /dev/null @@ -1,274 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Routing Reference - GOWDK</title> - <meta name="description" content="Routes are declared inside .gwdk files. File location does not define route identity."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Routing Reference - GOWDK"> - <meta property="og:description" content="Routes are declared inside .gwdk files. File location does not define route identity."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Routing Reference - GOWDK"> - <meta name="twitter:description" content="Routes are declared inside .gwdk files. File location does not define route identity."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Routing Reference</h1><p class="doc-lead">Routes are declared inside .gwdk files. File location does not define route identity.</p></header><article class="prose"><p>Routes are declared inside <code>.gwdk</code> files. File location does not define route -identity.</p><h2 id="page-routes">Page Routes</h2><p>Every current page file must declare a route. <code>guard</code> is optional, but a page -is not public by default: a guardless page warns (<code>missing_page_guard</code>) and its -route is denied (403) until <code>guard public</code> (or a protective guard) is added. -See <a href="/docs/language/guards/">guards.md</a> for the full access contract. Page ID -derives from the filename unless <code>page</code> is present:</p><pre><code class="language-gwdk">route &#34;/&#34; -guard public - -view { - &lt;main&gt; - &lt;h1&gt;Home&lt;/h1&gt; - &lt;/main&gt; -} -</code></pre><p>Use explicit <code>page</code> only when page identity should not follow the filename.</p><p>Current route rules:</p><ul><li>Routes must start with <code>/</code>.</li><li><code>/</code> is the only route that may end with <code>/</code>.</li><li>Routes must not include query strings, fragments, backslashes, whitespace, -control characters, empty segments, <code>.</code>, or <code>..</code>.</li><li>Dynamic params must be whole path segments, such as <code>/blog/{slug}</code>.</li><li>Param names use <code>[A-Za-z_][A-Za-z0-9_]*</code>.</li><li>A route cannot repeat the same param name.</li><li>Duplicate page route patterns are rejected. <code>/blog/{slug}</code> and <code>/blog/{id}</code> -are the same route pattern, and <code>/docs/{path...}</code> and <code>/docs/{rest...}</code> are -the same route pattern.</li><li>Generated app request matching and SPA file lookup reject request paths that -contain empty, <code>.</code>, or <code>..</code> segments before cleaning. Encoded dot segments -such as <code>%2e%2e</code> therefore return 404 instead of resolving to a different -generated route or asset.</li></ul><h3 id="rest-params">Rest Params</h3><p>A page route may declare one rest (catch-all) param as its final segment:</p><pre><code class="language-gwdk">route &#34;/docs/{path...}&#34; -guard public - -go server {} - -view { - &lt;main&gt; - &lt;h1&gt;{param(&#34;path&#34;)}&lt;/h1&gt; - &lt;/main&gt; -} -</code></pre><p>Rest param contract:</p><ul><li><code>{name...}</code> is allowed only as the final route segment. A rest param before -the end of the route is rejected with a <code>malformed_route</code> diagnostic.</li><li>A rest param matches one or more remaining request path segments. <code>/docs</code> -does not match <code>/docs/{path...}</code>; <code>/docs/intro</code> and <code>/docs/guides/routing</code> -do. Each matched segment still rejects empty, <code>.</code>, and <code>..</code> values.</li><li>The captured value is the remaining segments joined with <code>/</code>, for example -<code>guides/routing</code>. Read it with <code>param(&#34;name&#34;)</code> in the view, or in request-time -Go through <code>app.Params(ctx)</code> and <code>route.Required(params, &#34;name&#34;)</code>.</li><li>Rest params are always strings. Typed rest params such as <code>{path...:int}</code> are -rejected.</li><li>Rest params require request-time (SSR) rendering when used on page routes, -because build-time SPA paths cannot enumerate and escape multi-segment -values. Declare <code>server {}</code> or <code>go server {}</code> on the page.</li><li>Rest params are supported on request-time fragment endpoint routes. Action, -API, and Go comment endpoint paths reject rest params. An action or API that -omits its path inherits the page route, so inline endpoints on a rest page -are rejected the same way unless they declare their own concrete path.</li><li>Rest routes participate in ambiguity validation: <code>/docs/{path...}</code> overlaps -<code>/docs/{slug}</code>, <code>/docs/{section}/{slug}</code>, and concrete routes such as -<code>/docs/guides/intro</code>, so those combinations are rejected as -<code>ambiguous_dynamic_route</code>. The same applies to a same-method endpoint inside -a rest route&#39;s namespace (for example a <code>GET</code> API at <code>/docs/guides/intro</code> -beside <code>/docs/{path...}</code>), which would otherwise shadow part of the page.</li></ul><p>Unsupported route forms today:</p><ul><li>Optional params such as <code>/docs/{slug?}</code>. The diagnostic is explicit: optional -route parameters are not supported; declare explicit routes for each shape -(rest parameters <code>{name...}</code> are supported as the final segment).</li><li>Route groups that affect URL shape independently from explicit <code>route</code>.</li><li>Page/API same-path content negotiation. A page route and endpoint may share a -path only when their HTTP methods do not conflict, such as <code>GET /signup</code> page -plus <code>POST /signup</code> action.</li></ul><h3 id="trailing-slash-policy">Trailing Slash Policy</h3><p>Routes are canonical without a trailing slash. The policy is explicit:</p><ul><li>Declarations: omit trailing slashes except for <code>/</code>. <code>route &#34;/blog/hello/&#34;</code> -is rejected with <code>malformed_route</code>.</li><li>Requests: generated servers respond to <code>GET</code> and <code>HEAD</code> requests whose path -carries a trailing slash (and is not <code>/</code>) with a <code>308 Permanent Redirect</code> to -the cleaned canonical path, preserving the query string. <code>GET /blog/hello/?page=2</code> -redirects to <code>/blog/hello?page=2</code> instead of serving duplicate content.</li><li><code>POST</code> behavior is unchanged: generated action handlers tolerate a trailing -slash on concrete POST routes as a compatibility fallback and redirect to the -declared target when configured.</li></ul><p>Pages may declare response cache intent with <code>cache</code>. The value is carried as -route metadata and should be a literal HTTP <code>Cache-Control</code> value:</p><pre><code class="language-gwdk">route &#34;/docs&#34; -guard public -cache &#34;public, max-age=60&#34; -</code></pre><p>Pages may also declare stale-while-revalidate behavior with <code>revalidate</code>. -Values may be whole seconds or Go-style whole-second durations such as <code>60s</code>, -<code>5m</code>, or <code>1h</code>. <code>revalidate</code> requires <code>cache</code> and appends a concrete -<code>stale-while-revalidate=&lt;seconds&gt;</code> directive to the generated Cache-Control -header:</p><pre><code class="language-gwdk">route &#34;/docs&#34; -guard public -cache &#34;public, max-age=60&#34; -revalidate 5m -</code></pre><p>Generated binaries apply explicit page <code>cache</code> values to successful static SPA -HTML and SSR HTML responses. When <code>revalidate</code> is present, generated binaries -send the appended stale-while-revalidate directive for the same successful -responses. Request-time safety policies still win for actions, APIs, partial -responses, SSR load redirects, CSRF HTML mutation, and generated request-time -errors; those use <code>no-store</code>.</p><h2 id="spa-routes">SPA Routes</h2><p>SPA render is the default:</p><pre><code class="language-gwdk">route &#34;/docs&#34; -guard public - -view { - &lt;main&gt; - &lt;h1&gt;Docs&lt;/h1&gt; - &lt;/main&gt; -} -</code></pre><p><code>gowdk build --out &lt;dir&gt;</code> writes the route as spa HTML. For <code>/docs</code>, the -current output is <code>&lt;dir&gt;/docs/index.html</code>. For <code>/</code>, the output is -<code>&lt;dir&gt;/index.html</code>.</p><p>When a SPA page, layout, or referenced component contains a literal internal -link such as <code>&lt;a href=&#34;/docs&#34;&gt;</code>, the build emits the small -<code>assets/gowdk/gowdk.js</code> enhancement runtime. That runtime intercepts normal -same-origin link clicks, fetches the real generated HTML page, replaces the -current document head/body, updates browser history, and preserves focus/scroll -where possible. It does not define routes or decide whether a route exists; the -generated files or generated server remain the source of truth, and direct page -open/refresh must keep working.</p><h2 id="dynamic-spa-routes">Dynamic SPA Routes</h2><p>Dynamic SPA routes require <code>paths {}</code>. Action endpoints on a dynamic SPA page -inherit that page&#39;s generated concrete paths:</p><pre><code class="language-gwdk">route &#34;/blog/{slug}&#34; -guard public - -paths { - =&gt; { slug: &#34;hello-gowdk&#34; } - =&gt; { slug: &#34;compile-first&#34; } -} - -view { - &lt;main&gt; - &lt;h1&gt;{slug}&lt;/h1&gt; - &lt;p&gt;{param(&#34;slug&#34;)}&lt;/p&gt; - &lt;/main&gt; -} -</code></pre><p>The implemented <code>paths {}</code> subset accepts literal string records. Route params -from those records are available to the current spa interpolation scope and -to literal <code>build {}</code> string interpolation.</p><p>Build:</p><pre><code class="language-sh">gowdk build --out /tmp/gowdk-dynamic examples/pages/blog-post.page.gwdk -</code></pre><p>Generated output:</p><pre><code class="language-text">/tmp/gowdk-dynamic/blog/hello-gowdk/index.html -/tmp/gowdk-dynamic/blog/compile-first/index.html -</code></pre><p>Imported and same-package Go build functions can receive the current -<code>paths {}</code> route params by declaring one <code>gowdk.BuildParams</code> argument.</p><h2 id="action-endpoints">Action Endpoints</h2><p>An <code>act</code> declaration on a page adds a <code>POST</code> endpoint in the current generated -app slice:</p><pre><code class="language-gwdk">package signup - -route &#34;/signup&#34; -guard public - -act Submit POST &#34;/signup&#34; - -view { - &lt;form g:post={Submit}&gt; - &lt;input name=&#34;email&#34; required /&gt; - &lt;button type=&#34;submit&#34;&gt;Sign up&lt;/button&gt; - &lt;/form&gt; -} -</code></pre><p>App-shell HTML lowers <code>g:post={Submit}</code> to a normal POST form. Generated apps -built with <code>--app --bin</code> serve concrete action endpoints. If the same directory -as the <code>.gwdk</code> file contains an exported Go function with the exact declared -symbol, the generated handler calls it when it uses one of these signatures:</p><pre><code class="language-go">func Submit(context.Context) (response.Response, error) -func Submit(context.Context, SignupInput) (response.Response, error) -func Submit(context.Context, *SignupInput) (response.Response, error) -func Submit(context.Context, form.Values) (response.Response, error) -</code></pre><p>Missing or unsupported functions generate HTTP 501 handlers.</p><p>Actions can also be declared on the exported Go handler itself:</p><pre><code class="language-go">//gowdk:act POST /signup -func Submit(context.Context, SignupInput) (response.Response, error) -</code></pre><p>Go comment action endpoints are standalone backend endpoints. They use the same -binding and generated adapter pipeline as <code>.gwdk</code> action declarations, but they -do not infer page-local form schemas, fragments, or guards from <code>.gwdk</code> page -markup. -Malformed <code>//gowdk:</code> comments, unknown endpoint kinds, and missing method or -path fields fail with <code>malformed_go_endpoint_comment</code>.</p><p>Generated action and web-command handlers validate CSRF tokens by default before -generated decoding or user handlers run. Missing or invalid tokens return HTTP -403 with <code>invalid csrf token</code> and <code>Cache-Control: no-store</code>.</p><p>For a broader runnable action cookbook, see <code>examples/endpoints/src/endpoints/contact.page.gwdk</code> -and <code>examples/endpoints/src/endpoints/settings.page.gwdk</code>.</p><h2 id="api-routes">API Routes</h2><p>API endpoint metadata is parsed, appears in route plans, and can bind to -same-package Go handlers:</p><pre><code class="language-gwdk">package api - -route &#34;/status&#34; -guard public - -api Health GET &#34;/api/health&#34; - -view { - &lt;main&gt; - &lt;h1&gt;Status&lt;/h1&gt; - &lt;/main&gt; -} -</code></pre><p>Supported methods today: <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code>, and <code>DELETE</code>.</p><p><code>api Health GET &#34;/api/health&#34;</code> maps to exported Go function <code>Health</code> in the -same package as the <code>.gwdk</code> file when the function has signature -<code>func(context.Context, *http.Request) (response.Response, error)</code>. Missing or -unsupported functions generate HTTP 501 handlers.</p><p>APIs can also be declared on the exported Go handler itself:</p><pre><code class="language-go">//gowdk:api GET /api/health -func Health(context.Context, *http.Request) (response.Response, error) -</code></pre><p>The compiler discovers Go endpoint comments only in selected source packages, -does not infer endpoints from function names, and does not scan framework route -registrations. If a Go comment endpoint and a <code>.gwdk</code> endpoint declare the same -method/path pair, validation fails with a route conflict diagnostic.</p><p>For session, search, JSON CRUD, and webhook API examples, see -<code>examples/endpoints/src/endpoints/api.page.gwdk</code>.</p><h2 id="ssr-routes">SSR Routes</h2><p>SSR is optional and must be enabled for validation:</p><pre><code class="language-sh">gowdk check --ssr examples/ssr/simple-ssr.page.gwdk -</code></pre><p>First-slice concrete and dynamic request-time SSR pages with declared <code>server {}</code> -fields can be -generated into an embedded app and binary:</p><pre><code class="language-sh">gowdk build --ssr --out /tmp/gowdk-ssr-build \ - --app /tmp/gowdk-ssr-app \ - --bin /tmp/gowdk-ssr-site \ - examples/ssr/dynamic-ssr.page.gwdk -</code></pre><p>Dynamic SSR route params render through generated placeholders and request-time -HTML escaping. Dynamic fragment endpoint params are attached to fragment hook -contexts. Params can be declared as <code>{name}</code>, <code>{name:type}</code>, or — as the final -segment only — <code>{name...}</code> (always a string). Supported types are <code>string</code>, -<code>int</code>, <code>int64</code>, <code>uint</code>, <code>uint64</code>, <code>bool</code>, and <code>float64</code>. Generated SSR handlers -attach route metadata through <code>runtime/app.Route(ctx)</code>, including render mode, -guard IDs, dynamic params, typed route-param metadata, and declared layouts. -Generated SSR and fragment handlers attach raw dynamic params through -<code>runtime/app.Params(ctx)</code> and decoded typed params through -<code>runtime/app.TypedParams(ctx)</code>.</p><p>There are no generated per-route param struct types yet. Request-time user code -should use <code>app.Params(ctx)</code>, <code>app.TypedParams(ctx)</code>, or the <code>runtime/route</code> -typed helpers. Per-route structs may be added later only if the generated API -stays stable and simpler than the current helpers.</p><p>User Go can still decode raw params with <code>runtime/route</code> helpers:</p><pre><code class="language-go">params := app.Params(ctx) -id, ok, err := route.Int(params, &#34;id&#34;) -if err != nil { - return response.HTMLBody(400, &#34;invalid route param&#34;), err -} -if !ok { - return response.HTMLBody(404, &#34;missing route param&#34;), nil -} -_ = id -</code></pre><p>The helpers support <code>String</code>, <code>Int</code>, <code>Int64</code>, <code>Uint</code>, <code>Uint64</code>, <code>Bool</code>, and -<code>Float64</code>. <code>Required</code> returns a missing-param error when a required param is not -present. Decode errors name the param and expected type without echoing the raw -request value. Generated typed SSR and fragment bindings return <code>400</code> for -invalid typed route params and <code>404</code> for missing route params before guards, -page rendering, or fragment hooks run.</p><p>For standalone fragment and action-driven partial examples, see -<code>examples/endpoints/src/endpoints/fragments.page.gwdk</code>.</p><p>Endpoint user code can read generated endpoint metadata with -<code>runtime/app.Endpoint(ctx)</code>. This is the stable accessor for action, API, and -fragment handler metadata today. Typed load-result and action-result data -accessors are deferred until those result contracts are stable.</p><p><code>server { =&gt; { field, user.name } }</code> execution calls same-package Go -<code>Load&lt;PageID&gt;</code> functions at request time through <code>ssr.LoadContext</code>. Returned -declared identifiers and dotted paths are resolved from nested maps with string -keys, structs, pointers, interfaces, exported Go field names, and <code>json</code> tag -names, then HTML-escaped into generated placeholders.</p><h2 id="route-plans">Route Plans</h2><p>Use <code>gowdk routes</code> to inspect validated route and endpoint metadata:</p><pre><code class="language-sh">gowdk routes --ssr examples/pages/*.gwdk examples/actions/*.gwdk examples/partials/*.gwdk examples/api/*.gwdk examples/ssr/*.gwdk -gowdk endpoints --ssr examples/actions/*.gwdk examples/api/*.gwdk -</code></pre><p>The current JSON schema is version <code>1</code>. <code>routes</code> is the generated route table: -it includes page/file route kinds such as <code>static</code>, <code>spa</code>, <code>ssr</code>, and <code>hybrid</code>, -plus generated endpoint route rows for actions, APIs, fragments, and routable -<code>g:command</code>/<code>g:query</code> contract references. Route records include the HTTP -method/path, page ID, <code>.gwdk</code> package, guards, source file, source span, and -planned handler. Page rows also include effective render mode, layouts, dynamic -route params, and cache policy when declared. Endpoint rows include -<code>endpointSource</code>, <code>directive</code> (<code>act</code>, <code>api</code>, <code>fragment</code>, <code>g:command</code>, or -<code>g:query</code>), symbol/contract name, no-store backend cache policy, CSRF -applicability, route params when declared, and binding status when known.</p><p><code>endpoints</code> contains the detailed framework-neutral backend endpoint records -for the same action, API, fragment, and contract adapter routes. Endpoint -records repeat the route table fields and add Go package path/name when known, -backend binding details, and contract binding details. Backend binding details -repeat the Go package name, import path when known, handler symbol, and -supported signature/input metadata when the handler is bound. Contract binding -details include the contract kind, reference name, binding status, local input -type, result type, roles, handler, register function, and message when known. -The -<code>info</code> list reports disabled route-mode lanes, for example SSR disabled on a -SPA route.</p><p><code>gowdk endpoints</code> prints the same versioned endpoint records without page route -records or <code>info</code> notes. Route/method conflicts remain hard validation -diagnostics; <code>gowdk check --json</code> reports the conflicting declaration with a -source range and a related location for the first declaration when available.</p><p>Use <code>gowdk inspect ir</code> when route debugging needs the full typed compiler IR -instead of the route-report schema. The IR output is for M2 compiler debugging -and snapshots; keep <code>gowdk routes</code> for route and endpoint report integrations.</p><p>Use <code>gowdk inspect endpoint-graph --json</code> when route debugging needs the -dispatch graph. The current graph schema is version <code>1</code> and includes <code>page</code>, -<code>route</code>, <code>endpoint</code>, <code>handler</code>, <code>guard</code>, <code>contract</code>, and <code>structural</code> nodes. -Edges describe route declarations, page-owned endpoints, planned/generated -handlers, inherited guard policy, routable command/query contract references, -and structural <code>dispatches</code> links from <code>g:post</code>, <code>g:command</code>, and <code>g:query</code> -view elements to generated endpoint nodes. Endpoint nodes carry method/path, -source kind, cache, guards, CSRF policy, binding status, signature, input type, -and source span when available.</p><p>Use <code>gowdk inspect asset-graph --json</code> when debugging which source owner -introduced CSS, JavaScript, component file assets, or WASM declarations. The -current graph schema is version <code>1</code> and includes owner, template, and asset -nodes with deterministic <code>has_template</code>, <code>declares_asset</code>, and <code>uses_package</code> -edges.</p><p>Use <code>gowdk inspect tree --json</code> when source navigation needs the unified node -tree instead of a route-only projection. The current tree schema is version <code>1</code> -and includes package, page, component, layout, route, endpoint, -contract-reference, view, element, component-call, and text nodes with stable -IDs, source paths, source spans when known, properties, and ordered children. -Resolved component calls also produce <code>renders_component</code> edges, and component -composition cycles are reported as tree diagnostics.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/seo/index.html b/docs-site/dist/site/docs/reference/seo/index.html deleted file mode 100644 index 02a7ce4c..00000000 --- a/docs-site/dist/site/docs/reference/seo/index.html +++ /dev/null @@ -1,61 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>SEO Addon - GOWDK</title> - <meta name="description" content="addons/seo emits sitemap.xml and robots.txt during gowdk build. It is disabled by default because sitemap URLs need site-level deploy policy."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="SEO Addon - GOWDK"> - <meta property="og:description" content="addons/seo emits sitemap.xml and robots.txt during gowdk build. It is disabled by default because sitemap URLs need site-level deploy policy."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="SEO Addon - GOWDK"> - <meta name="twitter:description" content="addons/seo emits sitemap.xml and robots.txt during gowdk build. It is disabled by default because sitemap URLs need site-level deploy policy."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>SEO Addon</h1><p class="doc-lead">addons/seo emits sitemap.xml and robots.txt during gowdk build. It is disabled by default because sitemap URLs need site-level deploy policy.</p></header><article class="prose"><p><code>addons/seo</code> emits <code>sitemap.xml</code> and <code>robots.txt</code> during <code>gowdk build</code>. -It is disabled by default because sitemap URLs need site-level deploy policy.</p><p>Configure it in <code>gowdk.config.go</code>:</p><pre><code class="language-sh">gowdk add seo --base-url https://example.com -</code></pre><pre><code class="language-go">package app - -import ( - &#34;github.com/cssbruno/gowdk&#34; - &#34;github.com/cssbruno/gowdk/addons/seo&#34; -) - -var Config = gowdk.Config{ - Addons: []gowdk.Addon{ - seo.Addon(seo.Options{ - BaseURL: &#34;https://example.com&#34;, - Disallow: []string{&#34;/drafts&#34;}, - ExtraURLs: []seo.URL{ - {Loc: &#34;/rss.xml&#34;}, - }, - }), - }, -} -</code></pre><p>Build:</p><pre><code class="language-sh">gowdk build --config gowdk.config.go --out dist/site -</code></pre><p>Output:</p><pre><code class="language-text">dist/site/ - sitemap.xml - robots.txt -</code></pre><p><code>BaseURL</code> is required and must be an absolute <code>http</code> or <code>https</code> URL. Page routes -are joined onto it. If <code>BaseURL</code> includes a path such as -<code>https://example.com/docs</code>, generated URLs stay under that path.</p><p><code>sitemap.xml</code> includes build-time-enumerable page routes:</p><ul><li>public static SPA/action pages;</li><li>public dynamic SPA routes expanded from literal <code>paths {}</code> declarations;</li><li>optional <code>ExtraURLs</code>, which may be absolute URLs or root-relative paths.</li></ul><p>Request-time pages are not included because <code>gowdk build</code> cannot know their -runtime URL set. Guardless pages are also excluded because generated apps deny -those routes until access is stated with <code>guard public</code> or a protective guard. -The build report records one <code>seo_route_excluded</code> event for each excluded page, -including a <code>reason</code> and render <code>mode</code>.</p><p><code>robots.txt</code> emits:</p><pre><code class="language-text">User-agent: * -Disallow: /drafts -Sitemap: https://example.com/sitemap.xml -</code></pre><p>When <code>Disallow</code> is empty, the file emits an empty <code>Disallow:</code> directive.</p><p>Dynamic extra URLs can be supplied with <code>ExtraURLProvider</code> in normal Go config. -The executable config bridge materializes those URLs before build output is -generated.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/testing/index.html b/docs-site/dist/site/docs/reference/testing/index.html deleted file mode 100644 index aee84269..00000000 --- a/docs-site/dist/site/docs/reference/testing/index.html +++ /dev/null @@ -1,67 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Testing Reference - GOWDK</title> - <meta name="description" content="Use Go tests for compiler, runtime, handler, and generated-binary behavior. Use browser tests only for behavior that requires a browser: navigation, partial DOM swaps, focus,..."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Testing Reference - GOWDK"> - <meta property="og:description" content="Use Go tests for compiler, runtime, handler, and generated-binary behavior. Use browser tests only for behavior that requires a browser: navigation, partial DOM swaps, focus,..."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Testing Reference - GOWDK"> - <meta name="twitter:description" content="Use Go tests for compiler, runtime, handler, and generated-binary behavior. Use browser tests only for behavior that requires a browser: navigation, partial DOM swaps, focus,..."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Testing Reference</h1><p class="doc-lead">Use Go tests for compiler, runtime, handler, and generated-binary behavior. Use browser tests only for behavior that requires a browser: navigation, partial DOM swaps, focus, accessibility, and layout/performance smoke checks.</p></header><article class="prose"><p>Use Go tests for compiler, runtime, handler, and generated-binary behavior. Use -browser tests only for behavior that requires a browser: navigation, partial DOM -swaps, focus, accessibility, and layout/performance smoke checks.</p><h2 id="scaffolded-smoke-test">Scaffolded Smoke Test</h2><p>Create a starter app with an optional generated smoke test:</p><pre><code class="language-sh">gowdk init --tests --template site my-app -cd my-app -GOWDK_BIN=/path/to/gowdk go test ./tests -</code></pre><p><code>tests/gowdk_smoke_test.go</code> skips when <code>GOWDK_BIN</code> is unset. When set, it runs -<code>gowdk build --out &lt;tempdir&gt;</code> from the project root and asserts that -<code>index.html</code> exists.</p><h2 id="audit-tests">Audit Tests</h2><p>Use <code>gowdk audit --emit-tests</code> to write a readable <code>gowdk_audit_test.go</code> file -that drives a standalone <code>runtime/app</code> posture harness through -<code>runtime/testkit</code>. Use <code>gowdk audit --run</code> in CI when runtime behavior should -gate the audit report; it builds a temporary generated app and runs -<code>go test ./gowdkapp</code> against the generated app&#39;s real <code>Handler()</code>. Failed -expectations are reported as <code>audit_test_failed</code>.</p><h2 id="endpoint-handler-tests">Endpoint Handler Tests</h2><p>Use <code>runtime/testkit</code> for table-driven generated-handler checks when a test can -import a generated app handler or an adapter under test:</p><pre><code class="language-go">testkit.Run(t, handler, []testkit.Scenario{{ - Name: &#34;search API&#34;, - Method: http.MethodGet, - Path: &#34;/api/search?q=go&#34;, - WantStatus: http.StatusOK, -}}) -</code></pre><p>Keep user domain logic in ordinary Go unit tests. Use generated-handler tests -for route existence, method behavior, CSRF/body-limit responses, fragment -headers, and generated adapter wiring.</p><h2 id="contract-event-tests">Contract Event Tests</h2><p>Use the in-memory contract helpers when a command should emit backend-owned -events:</p><pre><code class="language-go">registry := testkit.ContractRegistry(Register) -result, events := testkit.CaptureCommandEvents[CreatePatient, CreatePatientResult]( - t, - registry, - CreatePatient{Name: &#34;Ada&#34;}, -) - -testkit.AssertEmitted[PatientCreated](t, events, contracts.DomainEvent, func(event PatientCreated) { - if event.ID != result.ID { - t.Fatalf(&#34;event ID = %q, want %q&#34;, event.ID, result.ID) - } -}) -</code></pre><p>The repository example is -<code>examples/contracts/patients/contracts_test.go</code>.</p><h2 id="browser-smoke">Browser Smoke</h2><p>For generated apps, keep the first browser smoke test narrow:</p><pre><code class="language-sh">gowdk build --app .gowdk/app --bin bin/app -GOWDK_ADDR=127.0.0.1:8090 bin/app -npx playwright test -</code></pre><p>Recommended first checks:</p><ul><li>Home route returns HTTP 200.</li><li>Important generated routes render expected headings.</li><li>Partial actions update the declared target.</li><li>Form POST without JavaScript redirects or returns the expected status.</li><li>SSR routes do not fall through to stale SPA output.</li></ul><h2 id="accessibility">Accessibility</h2><p>Accessibility checks should run against built pages, not compiler internals. -Start with:</p><ul><li>Every page has one visible primary heading.</li><li>Interactive controls have accessible names.</li><li>Forms have labels and visible validation/error text.</li><li>Keyboard focus reaches navigation, forms, and partial-update controls.</li><li>Generated fragments do not remove focus without app-owned focus handling.</li></ul><p>Use Playwright assertions or an accessibility scanner in app tests. GOWDK -compiler diagnostics are a first pass, not a replacement for browser checks.</p><h2 id="performance-smoke">Performance Smoke</h2><p>Keep performance checks coarse and repeatable:</p><ul><li><code>gowdk build</code> completes within the app team&#39;s expected local budget.</li><li>Generated asset size stays within a recorded budget.</li><li>Static pages return cache headers expected by the app.</li><li>SSR routes respond under a small local threshold after warmup.</li><li>Generated JavaScript stays bounded to islands/partial runtime behavior.</li></ul><p>Record budgets in the app repository. The repository core should not add -mandatory browser-performance dependencies to scaffolded apps.</p></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/docs/reference/tracing/index.html b/docs-site/dist/site/docs/reference/tracing/index.html deleted file mode 100644 index 863d82a0..00000000 --- a/docs-site/dist/site/docs/reference/tracing/index.html +++ /dev/null @@ -1,76 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Tracing - GOWDK</title> - <meta name="description" content="runtime/trace is the first GOWDK Trace runtime slice. It is dependency-free and can be used from normal Go programs without generated app wiring."> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:title" content="Tracing - GOWDK"> - <meta property="og:description" content="runtime/trace is the first GOWDK Trace runtime slice. It is dependency-free and can be used from normal Go programs without generated app wiring."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="Tracing - GOWDK"> - <meta name="twitter:description" content="runtime/trace is the first GOWDK Trace runtime slice. It is dependency-free and can be used from normal Go programs without generated app wiring."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Reference</p><h1>Tracing</h1><p class="doc-lead">runtime/trace is the first GOWDK Trace runtime slice. It is dependency-free and can be used from normal Go programs without generated app wiring.</p></header><article class="prose"><p><code>runtime/trace</code> is the first GOWDK Trace runtime slice. It is dependency-free -and can be used from normal Go programs without generated app wiring.</p><p>Use <a href="/docs/reference/observability/">Observability</a> for generated app instrumentation, -the local viewer, and optional OTLP export.</p><h2 id="basic-usage">Basic Usage</h2><pre><code class="language-go">package main - -import ( - &#34;context&#34; - &#34;os&#34; - - gowdktrace &#34;github.com/cssbruno/gowdk/runtime/trace&#34; -) - -func main() { - tracer := gowdktrace.NewTracer( - gowdktrace.WithSink(gowdktrace.NewJSONLSink(os.Stdout)), - ) - - ctx, span := tracer.Start(context.Background(), &#34;GET /patients&#34;, - gowdktrace.WithSurface(gowdktrace.SurfaceBackend), - gowdktrace.WithLane(gowdktrace.LaneRoute), - gowdktrace.WithAttributes(map[string]any{ - gowdktrace.AttrHTTPRoute: &#34;/patients&#34;, - }), - ) - defer span.End() - - _ = ctx - span.Event(&#34;info&#34;, &#34;loaded patients&#34;, nil) - span.SetStatus(gowdktrace.StatusOK, &#34;&#34;) -} -</code></pre><p><code>Start</code> returns <code>nil</code> for the span when sampling is disabled. Span methods are -nil-safe, so <code>defer span.End()</code> remains valid.</p><h2 id="trace-context">Trace Context</h2><p>Use <code>Inject</code> and <code>Extract</code> with carriers such as <code>http.Header</code>:</p><pre><code class="language-go">headers := http.Header{} -gowdktrace.Inject(ctx, headers) - -ctx = gowdktrace.Extract(context.Background(), headers) -</code></pre><p>The wire format is W3C <code>traceparent</code>:</p><pre><code class="language-text">00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01 -</code></pre><h2 id="sinks">Sinks</h2><p>Current sinks:</p><ul><li><code>NewConsoleSink(io.Writer)</code>: one readable line per completed span.</li><li><code>NewJSONLSink(io.Writer)</code>: one JSON span per line.</li><li><code>NewRingSink(limit)</code>: bounded in-memory recent spans, dropping oldest on -overflow.</li><li><code>MultiSink(...)</code>: sends spans to multiple sinks in order.</li><li><code>ExporterSink(exporter)</code>: adapts an OTLP-like exporter interface.</li><li><code>NewCollector(limit)</code>: sink plus local JSON/SSE HTTP handler and browser span -ingest.</li></ul><h2 id="collector">Collector</h2><pre><code class="language-go">collector := gowdktrace.NewCollector(256) -tracer := gowdktrace.NewTracer(gowdktrace.WithSink(collector)) - -http.Handle(&#34;/_gowdk/traces&#34;, collector.Handler()) -</code></pre><p><code>GET /_gowdk/traces</code> returns:</p><pre><code class="language-json">{ - &#34;spans&#34;: [], - &#34;dropped&#34;: 0 -} -</code></pre><p><code>GET /_gowdk/traces/events</code> or a request with <code>Accept: text/event-stream</code> -streams <code>event: gowdk-trace</code> messages for existing and future spans. The viewer -handler adds <code>GET /</code> for the self-contained UI and <code>POST /browser</code> for generated -browser spans.</p><h2 id="sampling">Sampling</h2><ul><li><code>AlwaysOn()</code></li><li><code>AlwaysOff()</code></li><li><code>RatioSampler(0.10)</code></li></ul><p>The disabled <code>AlwaysOff</code> path with no start options is allocation-free.</p><h2 id="current-limits">Current Limits</h2><ul><li>Collector storage is in-memory and process-local.</li><li>Generated app instrumentation is opt-in through <code>addons/observability</code> and -debug builds.</li><li>Concrete OTLP export lives in the nested <code>runtime/trace/otel</code> module so the -root module does not depend on OpenTelemetry.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/favicon.ico b/docs-site/dist/site/favicon.ico deleted file mode 100644 index 532b78f07aa56d240d18c25389781aa27050bf2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3065 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 Hu0mjfkiE5p diff --git a/docs-site/dist/site/gowdk-assets.json b/docs-site/dist/site/gowdk-assets.json deleted file mode 100644 index 8e195e89..00000000 --- a/docs-site/dist/site/gowdk-assets.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": 2, - "files": { - "assets/app.css": "assets/app.f8be0ea9d706.css", - "assets/gowdk/components/site/CookieNotice/inline-gowdk.js": "assets/gowdk/components/site/CookieNotice/inline-gowdk.js", - "assets/gowdk/components/site/DocsPage/inline-gowdk.js": "assets/gowdk/components/site/DocsPage/inline-gowdk.js", - "assets/gowdk/gowdk.js": "assets/gowdk/gowdk.js" - }, - "hashes": { - "assets/app.css": "sha256:f8be0ea9d706db8fd5b04c5377d835e4cd12e676dc3532d1045ec222ccaa92a9", - "assets/gowdk/components/site/CookieNotice/inline-gowdk.js": "sha256:3a4a5e90103f41890a168cb49fa012ed3e8a86bbab052e7289d60b8d6b5d6ca4", - "assets/gowdk/components/site/DocsPage/inline-gowdk.js": "sha256:82f8049eb47250af1581c0ca68f2eb5ff23968cfac1897b164564a472eb96fd4", - "assets/gowdk/gowdk.js": "sha256:b3f6fbbc7a47a2d53920d2bc6b21032cbbf08b04c4b3228b8b38ebc812f4ef7d" - }, - "cache": { - "assets/app.css": "public, max-age=31536000, immutable", - "assets/app.f8be0ea9d706.css": "public, max-age=31536000, immutable", - "assets/gowdk/components/site/CookieNotice/inline-gowdk.js": "no-cache", - "assets/gowdk/components/site/DocsPage/inline-gowdk.js": "no-cache", - "assets/gowdk/gowdk.js": "no-cache" - }, - "sizes": { - "assets/app.css": 25872, - "assets/app.f8be0ea9d706.css": 25872, - "assets/gowdk/components/site/CookieNotice/inline-gowdk.js": 579, - "assets/gowdk/components/site/DocsPage/inline-gowdk.js": 7744, - "assets/gowdk/gowdk.js": 41039 - } -} diff --git a/docs-site/dist/site/gowdk-build-report.json b/docs-site/dist/site/gowdk-build-report.json deleted file mode 100644 index 10f904a9..00000000 --- a/docs-site/dist/site/gowdk-build-report.json +++ /dev/null @@ -1,1076 +0,0 @@ -{ - "version": 1, - "mode": "build", - "outputDir": "dist/site", - "events": [ - { - "level": "info", - "stage": "start", - "kind": "build_started", - "message": "SPA build started", - "data": { - "components": "4", - "layouts": "2", - "pages": "101" - } - }, - { - "level": "info", - "stage": "validate", - "kind": "ir_valid", - "message": "compiler IR validation completed" - }, - { - "level": "info", - "stage": "plan", - "kind": "artifacts_planned", - "message": "app artifacts planned", - "data": { - "assets": "3", - "css": "1", - "pages": "101" - } - }, - { - "level": "info", - "stage": "plan", - "kind": "asset_obfuscation", - "message": "generated asset obfuscation summarized", - "data": { - "assets": "0", - "enabled": "false" - } - }, - { - "level": "debug", - "stage": "write", - "kind": "css_written", - "message": "CSS artifact written", - "path": "assets/app.f8be0ea9d706.css" - }, - { - "level": "debug", - "stage": "write", - "kind": "asset_written", - "message": "runtime asset written", - "path": "assets/gowdk/components/site/CookieNotice/inline-gowdk.js" - }, - { - "level": "debug", - "stage": "write", - "kind": "asset_written", - "message": "runtime asset written", - "path": "assets/gowdk/components/site/DocsPage/inline-gowdk.js" - }, - { - "level": "debug", - "stage": "write", - "kind": "asset_written", - "message": "runtime asset written", - "path": "assets/gowdk/gowdk.js" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler", - "route": "/docs/compiler", - "path": "docs/compiler/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.browser-compiler", - "route": "/docs/compiler/browser-compiler", - "path": "docs/compiler/browser-compiler/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.build-report", - "route": "/docs/compiler/build-report", - "path": "docs/compiler/build-report/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.endpoint-binding-inspection", - "route": "/docs/compiler/endpoint-binding-inspection", - "path": "docs/compiler/endpoint-binding-inspection/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.generated-output", - "route": "/docs/compiler/generated-output", - "path": "docs/compiler/generated-output/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.incremental-cache-keys", - "route": "/docs/compiler/incremental-cache-keys", - "path": "docs/compiler/incremental-cache-keys/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.manifest", - "route": "/docs/compiler/manifest", - "path": "docs/compiler/manifest/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.pipeline", - "route": "/docs/compiler/pipeline", - "path": "docs/compiler/pipeline/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.project-structure", - "route": "/docs/compiler/project-structure", - "path": "docs/compiler/project-structure/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.compiler.syntax-contributors", - "route": "/docs/compiler/syntax-contributors", - "path": "docs/compiler/syntax-contributors/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.architecture", - "route": "/docs/engineering/architecture", - "path": "docs/engineering/architecture/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.await-blocks-plan", - "route": "/docs/engineering/await-blocks-plan", - "path": "docs/engineering/await-blocks-plan/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.ci", - "route": "/docs/engineering/ci", - "path": "docs/engineering/ci/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.code-quality", - "route": "/docs/engineering/code-quality", - "path": "docs/engineering/code-quality/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.conventions", - "route": "/docs/engineering/conventions", - "path": "docs/engineering/conventions/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions", - "route": "/docs/engineering/decisions", - "path": "docs/engineering/decisions/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0001-llm-ready-project-structure", - "route": "/docs/engineering/decisions/0001-llm-ready-project-structure", - "path": "docs/engineering/decisions/0001-llm-ready-project-structure/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0002-compile-first-render-model", - "route": "/docs/engineering/decisions/0002-compile-first-render-model", - "path": "docs/engineering/decisions/0002-compile-first-render-model/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0003-js-default-explicit-wasm-islands", - "route": "/docs/engineering/decisions/0003-js-default-explicit-wasm-islands", - "path": "docs/engineering/decisions/0003-js-default-explicit-wasm-islands/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0004-production-wasm-island-abi", - "route": "/docs/engineering/decisions/0004-production-wasm-island-abi", - "path": "docs/engineering/decisions/0004-production-wasm-island-abi/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0005-generated-go-emission-boundary", - "route": "/docs/engineering/decisions/0005-generated-go-emission-boundary", - "path": "docs/engineering/decisions/0005-generated-go-emission-boundary/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0006-gowdk-compiler-and-runtime-boundary", - "route": "/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary", - "path": "docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0007-static-first-spa-navigation", - "route": "/docs/engineering/decisions/0007-static-first-spa-navigation", - "path": "docs/engineering/decisions/0007-static-first-spa-navigation/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0008-bounded-client-language", - "route": "/docs/engineering/decisions/0008-bounded-client-language", - "path": "docs/engineering/decisions/0008-bounded-client-language/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0009-optional-inline-go-authoring", - "route": "/docs/engineering/decisions/0009-optional-inline-go-authoring", - "path": "docs/engineering/decisions/0009-optional-inline-go-authoring/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0010-tokenizer-recursive-descent-parser", - "route": "/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser", - "path": "docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0011-auth-addon-cryptography", - "route": "/docs/engineering/decisions/0011-auth-addon-cryptography", - "path": "docs/engineering/decisions/0011-auth-addon-cryptography/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0012-realtime-subscribe-surface", - "route": "/docs/engineering/decisions/0012-realtime-subscribe-surface", - "path": "docs/engineering/decisions/0012-realtime-subscribe-surface/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0013-built-in-tracing-observability", - "route": "/docs/engineering/decisions/0013-built-in-tracing-observability", - "path": "docs/engineering/decisions/0013-built-in-tracing-observability/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0014-addon-runtime-config-split", - "route": "/docs/engineering/decisions/0014-addon-runtime-config-split", - "path": "docs/engineering/decisions/0014-addon-runtime-config-split/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.decisions.0015-generated-binary-lifecycle-services", - "route": "/docs/engineering/decisions/0015-generated-binary-lifecycle-services", - "path": "docs/engineering/decisions/0015-generated-binary-lifecycle-services/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.dependency-policy", - "route": "/docs/engineering/dependency-policy", - "path": "docs/engineering/dependency-policy/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.generated-code-policy", - "route": "/docs/engineering/generated-code-policy", - "path": "docs/engineering/generated-code-policy/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.markup-transitions-plan", - "route": "/docs/engineering/markup-transitions-plan", - "path": "docs/engineering/markup-transitions-plan/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.naming-conventions", - "route": "/docs/engineering/naming-conventions", - "path": "docs/engineering/naming-conventions/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.operations", - "route": "/docs/engineering/operations", - "path": "docs/engineering/operations/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.release-plan", - "route": "/docs/engineering/release-plan", - "path": "docs/engineering/release-plan/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.release", - "route": "/docs/engineering/release", - "path": "docs/engineering/release/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.security-threat-model", - "route": "/docs/engineering/security-threat-model", - "path": "docs/engineering/security-threat-model/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.security", - "route": "/docs/engineering/security", - "path": "docs/engineering/security/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.engineering.testing", - "route": "/docs/engineering/testing", - "path": "docs/engineering/testing/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.getting-started", - "route": "/docs/getting-started", - "path": "docs/getting-started/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language", - "route": "/docs/language", - "path": "docs/language/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.actions", - "route": "/docs/language/actions", - "path": "docs/language/actions/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.api", - "route": "/docs/language/api", - "path": "docs/language/api/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.audit", - "route": "/docs/language/audit", - "path": "docs/language/audit/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.blocks", - "route": "/docs/language/blocks", - "path": "docs/language/blocks/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.components", - "route": "/docs/language/components", - "path": "docs/language/components/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.conformance", - "route": "/docs/language/conformance", - "path": "docs/language/conformance/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.data", - "route": "/docs/language/data", - "path": "docs/language/data/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.diagnostics", - "route": "/docs/language/diagnostics", - "path": "docs/language/diagnostics/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.formatting", - "route": "/docs/language/formatting", - "path": "docs/language/formatting/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.forms", - "route": "/docs/language/forms", - "path": "docs/language/forms/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.grammar", - "route": "/docs/language/grammar", - "path": "docs/language/grammar/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.guards", - "route": "/docs/language/guards", - "path": "docs/language/guards/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.hybrid", - "route": "/docs/language/hybrid", - "path": "docs/language/hybrid/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.layouts", - "route": "/docs/language/layouts", - "path": "docs/language/layouts/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.markup", - "route": "/docs/language/markup", - "path": "docs/language/markup/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.partials", - "route": "/docs/language/partials", - "path": "docs/language/partials/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.semantics", - "route": "/docs/language/semantics", - "path": "docs/language/semantics/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.spec", - "route": "/docs/language/spec", - "path": "docs/language/spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.ssr", - "route": "/docs/language/ssr", - "path": "docs/language/ssr/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.stability", - "route": "/docs/language/stability", - "path": "docs/language/stability/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.language.syntax", - "route": "/docs/language/syntax", - "path": "docs/language/syntax/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.await-blocks-spec", - "route": "/docs/product/await-blocks-spec", - "path": "docs/product/await-blocks-spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.contract-runtime-spec", - "route": "/docs/product/contract-runtime-spec", - "path": "docs/product/contract-runtime-spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.diagnostics-and-navigation", - "route": "/docs/product/diagnostics-and-navigation", - "path": "docs/product/diagnostics-and-navigation/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.language-server", - "route": "/docs/product/language-server", - "path": "docs/product/language-server/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.markup-transitions-spec", - "route": "/docs/product/markup-transitions-spec", - "path": "docs/product/markup-transitions-spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.observability-tracing-spec", - "route": "/docs/product/observability-tracing-spec", - "path": "docs/product/observability-tracing-spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.playground-hosted-execution-spec", - "route": "/docs/product/playground-hosted-execution-spec", - "path": "docs/product/playground-hosted-execution-spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.playground", - "route": "/docs/product/playground", - "path": "docs/product/playground/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.requirements", - "route": "/docs/product/requirements", - "path": "docs/product/requirements/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.roadmap", - "route": "/docs/product/roadmap", - "path": "docs/product/roadmap/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.security-audit-spec", - "route": "/docs/product/security-audit-spec", - "path": "docs/product/security-audit-spec/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.product.vision", - "route": "/docs/product/vision", - "path": "docs/product/vision/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference", - "route": "/docs/reference", - "path": "docs/reference/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.addons", - "route": "/docs/reference/addons", - "path": "docs/reference/addons/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.cli", - "route": "/docs/reference/cli", - "path": "docs/reference/cli/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.config", - "route": "/docs/reference/config", - "path": "docs/reference/config/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.contracts", - "route": "/docs/reference/contracts", - "path": "docs/reference/contracts/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.css", - "route": "/docs/reference/css", - "path": "docs/reference/css/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.db", - "route": "/docs/reference/db", - "path": "docs/reference/db/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.deployment", - "route": "/docs/reference/deployment", - "path": "docs/reference/deployment/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.dev", - "route": "/docs/reference/dev", - "path": "docs/reference/dev/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.diagnostic-codes", - "route": "/docs/reference/diagnostic-codes", - "path": "docs/reference/diagnostic-codes/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.diagnostics", - "route": "/docs/reference/diagnostics", - "path": "docs/reference/diagnostics/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.errors", - "route": "/docs/reference/errors", - "path": "docs/reference/errors/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.framework-integrations", - "route": "/docs/reference/framework-integrations", - "path": "docs/reference/framework-integrations/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.go-interop", - "route": "/docs/reference/go-interop", - "path": "docs/reference/go-interop/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.hooks", - "route": "/docs/reference/hooks", - "path": "docs/reference/hooks/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.images", - "route": "/docs/reference/images", - "path": "docs/reference/images/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.manifest", - "route": "/docs/reference/manifest", - "path": "docs/reference/manifest/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.observability", - "route": "/docs/reference/observability", - "path": "docs/reference/observability/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.pwa-offline", - "route": "/docs/reference/pwa-offline", - "path": "docs/reference/pwa-offline/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.realtime", - "route": "/docs/reference/realtime", - "path": "docs/reference/realtime/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.routing", - "route": "/docs/reference/routing", - "path": "docs/reference/routing/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.seo", - "route": "/docs/reference/seo", - "path": "docs/reference/seo/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.testing", - "route": "/docs/reference/testing", - "path": "docs/reference/testing/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "docs.reference.tracing", - "route": "/docs/reference/tracing", - "path": "docs/reference/tracing/index.html" - }, - { - "level": "debug", - "stage": "write", - "kind": "page_written", - "message": "page artifact written", - "pageId": "home", - "route": "/", - "path": "index.html" - }, - { - "level": "info", - "stage": "manifest", - "kind": "route_manifest_written", - "message": "route manifest written", - "path": "gowdk-routes.json" - }, - { - "level": "info", - "stage": "manifest", - "kind": "asset_manifest_written", - "message": "asset manifest written", - "path": "gowdk-assets.json" - }, - { - "level": "info", - "stage": "report", - "kind": "cache_policy", - "message": "cache policies summarized", - "data": { - "assetPolicies": "{\"no-cache\":3}", - "assets": "3", - "css": "1", - "cssPolicies": "{\"public, max-age=31536000, immutable\":1}", - "defaultPageHTML": "no-cache", - "defaultRequestTime": "no-store", - "pageHTMLPolicies": "{\"no-cache\":101}", - "pageHtml": "101" - } - }, - { - "level": "info", - "stage": "report", - "kind": "asset_size", - "message": "generated asset size recorded", - "path": "assets/gowdk/components/site/CookieNotice/inline-gowdk.js", - "data": { - "bytes": "579", - "cache": "no-cache", - "hash": "sha256:3a4a5e90103f41890a168cb49fa012ed3e8a86bbab052e7289d60b8d6b5d6ca4", - "kind": "javascript" - } - }, - { - "level": "info", - "stage": "report", - "kind": "asset_size", - "message": "generated asset size recorded", - "path": "assets/gowdk/components/site/DocsPage/inline-gowdk.js", - "data": { - "bytes": "7744", - "cache": "no-cache", - "hash": "sha256:82f8049eb47250af1581c0ca68f2eb5ff23968cfac1897b164564a472eb96fd4", - "kind": "javascript" - } - }, - { - "level": "info", - "stage": "report", - "kind": "asset_size", - "message": "generated asset size recorded", - "path": "assets/gowdk/gowdk.js", - "data": { - "bytes": "41039", - "cache": "no-cache", - "hash": "sha256:b3f6fbbc7a47a2d53920d2bc6b21032cbbf08b04c4b3228b8b38ebc812f4ef7d", - "kind": "javascript" - } - }, - { - "level": "info", - "stage": "report", - "kind": "openapi_written", - "message": "OpenAPI report written", - "path": "openapi.json" - }, - { - "level": "info", - "stage": "manifest", - "kind": "security_manifest_written", - "message": "security manifest written", - "path": "/tmp/gowdk-distfix/docs-site/dist/.gowdk/reports/site/gowdk-security.json" - }, - { - "level": "info", - "stage": "complete", - "kind": "build_complete", - "message": "SPA build completed", - "data": { - "assets": "3", - "css": "1", - "pages": "101" - } - } - ] -} diff --git a/docs-site/dist/site/gowdk-routes.json b/docs-site/dist/site/gowdk-routes.json deleted file mode 100644 index 4ffefc67..00000000 --- a/docs-site/dist/site/gowdk-routes.json +++ /dev/null @@ -1,510 +0,0 @@ -{ - "version": 1, - "routes": [ - { - "page": "home", - "route": "/", - "path": "index.html" - }, - { - "page": "docs.compiler", - "route": "/docs/compiler", - "path": "docs/compiler/index.html" - }, - { - "page": "docs.compiler.browser-compiler", - "route": "/docs/compiler/browser-compiler", - "path": "docs/compiler/browser-compiler/index.html" - }, - { - "page": "docs.compiler.build-report", - "route": "/docs/compiler/build-report", - "path": "docs/compiler/build-report/index.html" - }, - { - "page": "docs.compiler.endpoint-binding-inspection", - "route": "/docs/compiler/endpoint-binding-inspection", - "path": "docs/compiler/endpoint-binding-inspection/index.html" - }, - { - "page": "docs.compiler.generated-output", - "route": "/docs/compiler/generated-output", - "path": "docs/compiler/generated-output/index.html" - }, - { - "page": "docs.compiler.incremental-cache-keys", - "route": "/docs/compiler/incremental-cache-keys", - "path": "docs/compiler/incremental-cache-keys/index.html" - }, - { - "page": "docs.compiler.manifest", - "route": "/docs/compiler/manifest", - "path": "docs/compiler/manifest/index.html" - }, - { - "page": "docs.compiler.pipeline", - "route": "/docs/compiler/pipeline", - "path": "docs/compiler/pipeline/index.html" - }, - { - "page": "docs.compiler.project-structure", - "route": "/docs/compiler/project-structure", - "path": "docs/compiler/project-structure/index.html" - }, - { - "page": "docs.compiler.syntax-contributors", - "route": "/docs/compiler/syntax-contributors", - "path": "docs/compiler/syntax-contributors/index.html" - }, - { - "page": "docs.engineering.architecture", - "route": "/docs/engineering/architecture", - "path": "docs/engineering/architecture/index.html" - }, - { - "page": "docs.engineering.await-blocks-plan", - "route": "/docs/engineering/await-blocks-plan", - "path": "docs/engineering/await-blocks-plan/index.html" - }, - { - "page": "docs.engineering.ci", - "route": "/docs/engineering/ci", - "path": "docs/engineering/ci/index.html" - }, - { - "page": "docs.engineering.code-quality", - "route": "/docs/engineering/code-quality", - "path": "docs/engineering/code-quality/index.html" - }, - { - "page": "docs.engineering.conventions", - "route": "/docs/engineering/conventions", - "path": "docs/engineering/conventions/index.html" - }, - { - "page": "docs.engineering.decisions", - "route": "/docs/engineering/decisions", - "path": "docs/engineering/decisions/index.html" - }, - { - "page": "docs.engineering.decisions.0001-llm-ready-project-structure", - "route": "/docs/engineering/decisions/0001-llm-ready-project-structure", - "path": "docs/engineering/decisions/0001-llm-ready-project-structure/index.html" - }, - { - "page": "docs.engineering.decisions.0002-compile-first-render-model", - "route": "/docs/engineering/decisions/0002-compile-first-render-model", - "path": "docs/engineering/decisions/0002-compile-first-render-model/index.html" - }, - { - "page": "docs.engineering.decisions.0003-js-default-explicit-wasm-islands", - "route": "/docs/engineering/decisions/0003-js-default-explicit-wasm-islands", - "path": "docs/engineering/decisions/0003-js-default-explicit-wasm-islands/index.html" - }, - { - "page": "docs.engineering.decisions.0004-production-wasm-island-abi", - "route": "/docs/engineering/decisions/0004-production-wasm-island-abi", - "path": "docs/engineering/decisions/0004-production-wasm-island-abi/index.html" - }, - { - "page": "docs.engineering.decisions.0005-generated-go-emission-boundary", - "route": "/docs/engineering/decisions/0005-generated-go-emission-boundary", - "path": "docs/engineering/decisions/0005-generated-go-emission-boundary/index.html" - }, - { - "page": "docs.engineering.decisions.0006-gowdk-compiler-and-runtime-boundary", - "route": "/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary", - "path": "docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/index.html" - }, - { - "page": "docs.engineering.decisions.0007-static-first-spa-navigation", - "route": "/docs/engineering/decisions/0007-static-first-spa-navigation", - "path": "docs/engineering/decisions/0007-static-first-spa-navigation/index.html" - }, - { - "page": "docs.engineering.decisions.0008-bounded-client-language", - "route": "/docs/engineering/decisions/0008-bounded-client-language", - "path": "docs/engineering/decisions/0008-bounded-client-language/index.html" - }, - { - "page": "docs.engineering.decisions.0009-optional-inline-go-authoring", - "route": "/docs/engineering/decisions/0009-optional-inline-go-authoring", - "path": "docs/engineering/decisions/0009-optional-inline-go-authoring/index.html" - }, - { - "page": "docs.engineering.decisions.0010-tokenizer-recursive-descent-parser", - "route": "/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser", - "path": "docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/index.html" - }, - { - "page": "docs.engineering.decisions.0011-auth-addon-cryptography", - "route": "/docs/engineering/decisions/0011-auth-addon-cryptography", - "path": "docs/engineering/decisions/0011-auth-addon-cryptography/index.html" - }, - { - "page": "docs.engineering.decisions.0012-realtime-subscribe-surface", - "route": "/docs/engineering/decisions/0012-realtime-subscribe-surface", - "path": "docs/engineering/decisions/0012-realtime-subscribe-surface/index.html" - }, - { - "page": "docs.engineering.decisions.0013-built-in-tracing-observability", - "route": "/docs/engineering/decisions/0013-built-in-tracing-observability", - "path": "docs/engineering/decisions/0013-built-in-tracing-observability/index.html" - }, - { - "page": "docs.engineering.decisions.0014-addon-runtime-config-split", - "route": "/docs/engineering/decisions/0014-addon-runtime-config-split", - "path": "docs/engineering/decisions/0014-addon-runtime-config-split/index.html" - }, - { - "page": "docs.engineering.decisions.0015-generated-binary-lifecycle-services", - "route": "/docs/engineering/decisions/0015-generated-binary-lifecycle-services", - "path": "docs/engineering/decisions/0015-generated-binary-lifecycle-services/index.html" - }, - { - "page": "docs.engineering.dependency-policy", - "route": "/docs/engineering/dependency-policy", - "path": "docs/engineering/dependency-policy/index.html" - }, - { - "page": "docs.engineering.generated-code-policy", - "route": "/docs/engineering/generated-code-policy", - "path": "docs/engineering/generated-code-policy/index.html" - }, - { - "page": "docs.engineering.markup-transitions-plan", - "route": "/docs/engineering/markup-transitions-plan", - "path": "docs/engineering/markup-transitions-plan/index.html" - }, - { - "page": "docs.engineering.naming-conventions", - "route": "/docs/engineering/naming-conventions", - "path": "docs/engineering/naming-conventions/index.html" - }, - { - "page": "docs.engineering.operations", - "route": "/docs/engineering/operations", - "path": "docs/engineering/operations/index.html" - }, - { - "page": "docs.engineering.release", - "route": "/docs/engineering/release", - "path": "docs/engineering/release/index.html" - }, - { - "page": "docs.engineering.release-plan", - "route": "/docs/engineering/release-plan", - "path": "docs/engineering/release-plan/index.html" - }, - { - "page": "docs.engineering.security", - "route": "/docs/engineering/security", - "path": "docs/engineering/security/index.html" - }, - { - "page": "docs.engineering.security-threat-model", - "route": "/docs/engineering/security-threat-model", - "path": "docs/engineering/security-threat-model/index.html" - }, - { - "page": "docs.engineering.testing", - "route": "/docs/engineering/testing", - "path": "docs/engineering/testing/index.html" - }, - { - "page": "docs.getting-started", - "route": "/docs/getting-started", - "path": "docs/getting-started/index.html" - }, - { - "page": "docs.language", - "route": "/docs/language", - "path": "docs/language/index.html" - }, - { - "page": "docs.language.actions", - "route": "/docs/language/actions", - "path": "docs/language/actions/index.html" - }, - { - "page": "docs.language.api", - "route": "/docs/language/api", - "path": "docs/language/api/index.html" - }, - { - "page": "docs.language.audit", - "route": "/docs/language/audit", - "path": "docs/language/audit/index.html" - }, - { - "page": "docs.language.blocks", - "route": "/docs/language/blocks", - "path": "docs/language/blocks/index.html" - }, - { - "page": "docs.language.components", - "route": "/docs/language/components", - "path": "docs/language/components/index.html" - }, - { - "page": "docs.language.conformance", - "route": "/docs/language/conformance", - "path": "docs/language/conformance/index.html" - }, - { - "page": "docs.language.data", - "route": "/docs/language/data", - "path": "docs/language/data/index.html" - }, - { - "page": "docs.language.diagnostics", - "route": "/docs/language/diagnostics", - "path": "docs/language/diagnostics/index.html" - }, - { - "page": "docs.language.formatting", - "route": "/docs/language/formatting", - "path": "docs/language/formatting/index.html" - }, - { - "page": "docs.language.forms", - "route": "/docs/language/forms", - "path": "docs/language/forms/index.html" - }, - { - "page": "docs.language.grammar", - "route": "/docs/language/grammar", - "path": "docs/language/grammar/index.html" - }, - { - "page": "docs.language.guards", - "route": "/docs/language/guards", - "path": "docs/language/guards/index.html" - }, - { - "page": "docs.language.hybrid", - "route": "/docs/language/hybrid", - "path": "docs/language/hybrid/index.html" - }, - { - "page": "docs.language.layouts", - "route": "/docs/language/layouts", - "path": "docs/language/layouts/index.html" - }, - { - "page": "docs.language.markup", - "route": "/docs/language/markup", - "path": "docs/language/markup/index.html" - }, - { - "page": "docs.language.partials", - "route": "/docs/language/partials", - "path": "docs/language/partials/index.html" - }, - { - "page": "docs.language.semantics", - "route": "/docs/language/semantics", - "path": "docs/language/semantics/index.html" - }, - { - "page": "docs.language.spec", - "route": "/docs/language/spec", - "path": "docs/language/spec/index.html" - }, - { - "page": "docs.language.ssr", - "route": "/docs/language/ssr", - "path": "docs/language/ssr/index.html" - }, - { - "page": "docs.language.stability", - "route": "/docs/language/stability", - "path": "docs/language/stability/index.html" - }, - { - "page": "docs.language.syntax", - "route": "/docs/language/syntax", - "path": "docs/language/syntax/index.html" - }, - { - "page": "docs.product.await-blocks-spec", - "route": "/docs/product/await-blocks-spec", - "path": "docs/product/await-blocks-spec/index.html" - }, - { - "page": "docs.product.contract-runtime-spec", - "route": "/docs/product/contract-runtime-spec", - "path": "docs/product/contract-runtime-spec/index.html" - }, - { - "page": "docs.product.diagnostics-and-navigation", - "route": "/docs/product/diagnostics-and-navigation", - "path": "docs/product/diagnostics-and-navigation/index.html" - }, - { - "page": "docs.product.language-server", - "route": "/docs/product/language-server", - "path": "docs/product/language-server/index.html" - }, - { - "page": "docs.product.markup-transitions-spec", - "route": "/docs/product/markup-transitions-spec", - "path": "docs/product/markup-transitions-spec/index.html" - }, - { - "page": "docs.product.observability-tracing-spec", - "route": "/docs/product/observability-tracing-spec", - "path": "docs/product/observability-tracing-spec/index.html" - }, - { - "page": "docs.product.playground", - "route": "/docs/product/playground", - "path": "docs/product/playground/index.html" - }, - { - "page": "docs.product.playground-hosted-execution-spec", - "route": "/docs/product/playground-hosted-execution-spec", - "path": "docs/product/playground-hosted-execution-spec/index.html" - }, - { - "page": "docs.product.requirements", - "route": "/docs/product/requirements", - "path": "docs/product/requirements/index.html" - }, - { - "page": "docs.product.roadmap", - "route": "/docs/product/roadmap", - "path": "docs/product/roadmap/index.html" - }, - { - "page": "docs.product.security-audit-spec", - "route": "/docs/product/security-audit-spec", - "path": "docs/product/security-audit-spec/index.html" - }, - { - "page": "docs.product.vision", - "route": "/docs/product/vision", - "path": "docs/product/vision/index.html" - }, - { - "page": "docs.reference", - "route": "/docs/reference", - "path": "docs/reference/index.html" - }, - { - "page": "docs.reference.addons", - "route": "/docs/reference/addons", - "path": "docs/reference/addons/index.html" - }, - { - "page": "docs.reference.cli", - "route": "/docs/reference/cli", - "path": "docs/reference/cli/index.html" - }, - { - "page": "docs.reference.config", - "route": "/docs/reference/config", - "path": "docs/reference/config/index.html" - }, - { - "page": "docs.reference.contracts", - "route": "/docs/reference/contracts", - "path": "docs/reference/contracts/index.html" - }, - { - "page": "docs.reference.css", - "route": "/docs/reference/css", - "path": "docs/reference/css/index.html" - }, - { - "page": "docs.reference.db", - "route": "/docs/reference/db", - "path": "docs/reference/db/index.html" - }, - { - "page": "docs.reference.deployment", - "route": "/docs/reference/deployment", - "path": "docs/reference/deployment/index.html" - }, - { - "page": "docs.reference.dev", - "route": "/docs/reference/dev", - "path": "docs/reference/dev/index.html" - }, - { - "page": "docs.reference.diagnostic-codes", - "route": "/docs/reference/diagnostic-codes", - "path": "docs/reference/diagnostic-codes/index.html" - }, - { - "page": "docs.reference.diagnostics", - "route": "/docs/reference/diagnostics", - "path": "docs/reference/diagnostics/index.html" - }, - { - "page": "docs.reference.errors", - "route": "/docs/reference/errors", - "path": "docs/reference/errors/index.html" - }, - { - "page": "docs.reference.framework-integrations", - "route": "/docs/reference/framework-integrations", - "path": "docs/reference/framework-integrations/index.html" - }, - { - "page": "docs.reference.go-interop", - "route": "/docs/reference/go-interop", - "path": "docs/reference/go-interop/index.html" - }, - { - "page": "docs.reference.hooks", - "route": "/docs/reference/hooks", - "path": "docs/reference/hooks/index.html" - }, - { - "page": "docs.reference.images", - "route": "/docs/reference/images", - "path": "docs/reference/images/index.html" - }, - { - "page": "docs.reference.manifest", - "route": "/docs/reference/manifest", - "path": "docs/reference/manifest/index.html" - }, - { - "page": "docs.reference.observability", - "route": "/docs/reference/observability", - "path": "docs/reference/observability/index.html" - }, - { - "page": "docs.reference.pwa-offline", - "route": "/docs/reference/pwa-offline", - "path": "docs/reference/pwa-offline/index.html" - }, - { - "page": "docs.reference.realtime", - "route": "/docs/reference/realtime", - "path": "docs/reference/realtime/index.html" - }, - { - "page": "docs.reference.routing", - "route": "/docs/reference/routing", - "path": "docs/reference/routing/index.html" - }, - { - "page": "docs.reference.seo", - "route": "/docs/reference/seo", - "path": "docs/reference/seo/index.html" - }, - { - "page": "docs.reference.testing", - "route": "/docs/reference/testing", - "path": "docs/reference/testing/index.html" - }, - { - "page": "docs.reference.tracing", - "route": "/docs/reference/tracing", - "path": "docs/reference/tracing/index.html" - } - ] -} diff --git a/docs-site/dist/site/index.html b/docs-site/dist/site/index.html deleted file mode 100644 index 927557d9..00000000 --- a/docs-site/dist/site/index.html +++ /dev/null @@ -1,28 +0,0 @@ -<!doctype html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>GOWDK Documentation - Compile-first web apps in Go</title> - <meta name="description" content="Learn the GOWDK language, compiler pipeline, CLI loop, addons, and deployment targets for Go-first web apps."> - <link rel="canonical" href="https://gowdk.com/"> - <link rel="icon" href="/favicon.ico"> - <meta property="og:site_name" content="GOWDK"> - <meta property="og:type" content="website"> - <meta property="og:url" content="https://gowdk.com/"> - <meta property="og:title" content="GOWDK Documentation - Compile-first web apps in Go"> - <meta property="og:description" content="Learn the GOWDK language, compiler pipeline, CLI loop, addons, and deployment targets for Go-first web apps."> - <meta property="og:image" content="https://gowdk.com/assets/wdk_logo.png"> - <meta name="twitter:card" content="summary"> - <meta name="twitter:title" content="GOWDK Documentation - Compile-first web apps in Go"> - <meta name="twitter:description" content="Learn the GOWDK language, compiler pipeline, CLI loop, addons, and deployment targets for Go-first web apps."> - <meta name="twitter:image" content="https://gowdk.com/assets/wdk_logo.png"> - <link rel="stylesheet" href="/assets/app.f8be0ea9d706.css"> - <script type="module" src="/assets/gowdk/components/site/CookieNotice/inline-gowdk.js" defer></script> - <script type="module" src="/assets/gowdk/components/site/DocsPage/inline-gowdk.js" defer></script> - <script src="/assets/gowdk/gowdk.js" defer></script> -</head> -<body> -<div class="site-frame"><div class="site-banner" role="alert"><span class="site-banner-badge">Experimental</span><span class="site-banner-text">GOWDK is <strong>0.x</strong> and not production-ready — the language, generated output, and APIs can change between releases.</span><a class="site-banner-link" href="https://github.com/cssbruno/GoWDK/releases">Release status</a></div><header class="site-header"><a class="brand-link" href="/" aria-label="GOWDK documentation"><span class="brand-mark" aria-hidden="true">❯</span><span class="brand-name">GOWDK</span><span class="brand-tag">docs</span></a><nav class="top-nav" aria-label="Main navigation"><a href="/docs/getting-started/">Getting Started</a><a href="/docs/reference/cli/">CLI</a><a class="github-link" href="https://github.com/cssbruno/gowdk" aria-label="GOWDK on GitHub"><span class="github-icon">GH</span><span>GitHub</span></a></nav></header><div class="site-body"><div class="docs-shell"><aside class="docs-sidebar"><button class="docs-search-btn" type="button" data-docs-search aria-label="Search documentation"><span class="docs-search-ico" aria-hidden="true">⌕</span><span class="docs-search-label">Search docs</span><kbd class="docs-search-kbd">⌘K</kbd></button><nav class="docs-nav" aria-label="Documentation" data-docs-nav><a href="/">Overview</a><p class="docs-nav-group">Start</p><a href="/docs/getting-started/">Getting Started</a><p class="docs-nav-group">Language</p><a href="/docs/language/">GOWDK Language</a><a href="/docs/language/spec/">Current .gwdk Language Spec</a><a href="/docs/language/syntax/">Syntax</a><a href="/docs/language/semantics/">Semantics</a><a href="/docs/language/grammar/">Grammar</a><a href="/docs/language/blocks/">Blocks</a><a href="/docs/language/markup/">Markup</a><a href="/docs/language/components/">Components</a><a href="/docs/language/layouts/">Layouts</a><a href="/docs/language/data/">Data Lifecycle</a><a href="/docs/language/actions/">Actions</a><a href="/docs/language/api/">API</a><a href="/docs/language/forms/">Forms And Progressive Enhancement</a><a href="/docs/language/partials/">Partials</a><a href="/docs/language/ssr/">SSR</a><a href="/docs/language/hybrid/">Hybrid Rendering</a><a href="/docs/language/formatting/">Formatting</a><a href="/docs/language/diagnostics/">Diagnostics</a><a href="/docs/language/audit/">Audit Policy Files</a><a href="/docs/language/conformance/">.gwdk Conformance Corpus</a><a href="/docs/language/guards/">Guards And Default-Deny Page Access</a><a href="/docs/language/stability/">Language Construct Stability</a><p class="docs-nav-group">Reference</p><a href="/docs/reference/">Reference</a><a href="/docs/reference/routing/">Routing Reference</a><a href="/docs/reference/cli/">CLI Reference</a><a href="/docs/reference/config/">Config Reference</a><a href="/docs/reference/css/">CSS Reference</a><a href="/docs/reference/hooks/">Hooks, Guards, And Middleware</a><a href="/docs/reference/addons/">Addons Reference</a><a href="/docs/reference/contracts/">Contracts</a><a href="/docs/reference/errors/">Errors And Boundaries</a><a href="/docs/reference/diagnostics/">Diagnostics Reference</a><a href="/docs/reference/diagnostic-codes/">Diagnostic Codes</a><a href="/docs/reference/dev/">Dev Loop</a><a href="/docs/reference/deployment/">Deployment</a><a href="/docs/reference/testing/">Testing Reference</a><a href="/docs/reference/framework-integrations/">Framework Integrations</a><a href="/docs/reference/manifest/">Manifest Reference</a><a href="/docs/reference/db/">DB Addon</a><a href="/docs/reference/go-interop/">Go Interop</a><a href="/docs/reference/images/">Images</a><a href="/docs/reference/observability/">Observability</a><a href="/docs/reference/pwa-offline/">PWA And Offline</a><a href="/docs/reference/realtime/">Realtime</a><a href="/docs/reference/seo/">SEO Addon</a><a href="/docs/reference/tracing/">Tracing</a><p class="docs-nav-group">Compiler</p><a href="/docs/compiler/">Compiler</a><a href="/docs/compiler/project-structure/">Project Structure</a><a href="/docs/compiler/pipeline/">Compiler Pipeline</a><a href="/docs/compiler/generated-output/">Generated Output</a><a href="/docs/compiler/browser-compiler/">Browser-Facing Output</a><a href="/docs/compiler/build-report/">Build Report</a><a href="/docs/compiler/manifest/">Manifest</a><a href="/docs/compiler/endpoint-binding-inspection/">Feature Spec: go/packages Endpoint Binding Inspection</a><a href="/docs/compiler/incremental-cache-keys/">Incremental Cache Keys</a><a href="/docs/compiler/syntax-contributors/">Syntax Contributor Checklist</a><p class="docs-nav-group">Engineering</p><a href="/docs/engineering/architecture/">Architecture</a><a href="/docs/engineering/security/">Security Baseline</a><a href="/docs/engineering/conventions/">Engineering Conventions</a><a href="/docs/engineering/naming-conventions/">Naming And Full-Name Conventions</a><a href="/docs/engineering/code-quality/">Code Quality</a><a href="/docs/engineering/generated-code-policy/">Generated Code Policy</a><a href="/docs/engineering/dependency-policy/">Dependency Policy</a><a href="/docs/engineering/operations/">Operations</a><a href="/docs/engineering/testing/">Testing Strategy</a><a href="/docs/engineering/ci/">CI</a><a href="/docs/engineering/release/">Release</a><a href="/docs/engineering/await-blocks-plan/">Implementation Plan: Bounded Await Blocks</a><a href="/docs/engineering/markup-transitions-plan/">Implementation Plan: Bounded Markup Transitions</a><a href="/docs/engineering/release-plan/">0.x Improvement Checklist</a><a href="/docs/engineering/security-threat-model/">Security Threat Model</a><p class="docs-nav-group">Decisions</p><a href="/docs/engineering/decisions/">Architecture Decision Records</a><a href="/docs/engineering/decisions/0001-llm-ready-project-structure/">ADR 0001: LLM-Ready Project Structure</a><a href="/docs/engineering/decisions/0002-compile-first-render-model/">ADR 0002: Compile-First Render Model</a><a href="/docs/engineering/decisions/0003-js-default-explicit-wasm-islands/">ADR 0003: JS Default, Component-Declared WASM Islands</a><a href="/docs/engineering/decisions/0004-production-wasm-island-abi/">ADR 0004: Production WASM Island ABI</a><a href="/docs/engineering/decisions/0005-generated-go-emission-boundary/">ADR 0005: Generated Go Emission Boundary</a><a href="/docs/engineering/decisions/0006-gowdk-compiler-and-runtime-boundary/">ADR 0006: GOWDK Compiler And Runtime Boundary</a><a href="/docs/engineering/decisions/0007-static-first-spa-navigation/">ADR 0007: Static-First SPA Navigation</a><a href="/docs/engineering/decisions/0008-bounded-client-language/">ADR 0008: Bounded Client Language</a><a href="/docs/engineering/decisions/0009-optional-inline-go-authoring/">ADR 0009: Optional Inline Go Authoring</a><a href="/docs/engineering/decisions/0010-tokenizer-recursive-descent-parser/">ADR 0010: Tokenizer and Recursive-Descent Parser Direction</a><a href="/docs/engineering/decisions/0011-auth-addon-cryptography/">ADR 0011: Auth Addon Cryptography Stance</a><a href="/docs/engineering/decisions/0012-realtime-subscribe-surface/">ADR 0012: Realtime Subscribe Surface</a><a href="/docs/engineering/decisions/0013-built-in-tracing-observability/">ADR 0013: Built-In Tracing Observability</a><a href="/docs/engineering/decisions/0014-addon-runtime-config-split/">ADR 0014: Addon Runtime Config Split</a><a href="/docs/engineering/decisions/0015-generated-binary-lifecycle-services/">ADR 0015: Generated Binary Lifecycle Services</a><p class="docs-nav-group">Product</p><a href="/docs/product/vision/">Product Vision</a><a href="/docs/product/roadmap/">Product Roadmap</a><a href="/docs/product/requirements/">Product Requirements</a><a href="/docs/product/language-server/">Feature Spec: GOWDK Language Server</a><a href="/docs/product/await-blocks-spec/">Feature Spec: Bounded Await Blocks</a><a href="/docs/product/contract-runtime-spec/">Feature Spec: Contract Runtime</a><a href="/docs/product/diagnostics-and-navigation/">Feature Spec: Diagnostics And Navigation</a><a href="/docs/product/markup-transitions-spec/">Feature Spec: Bounded Markup Transitions</a><a href="/docs/product/observability-tracing-spec/">Feature Spec: GOWDK Trace</a><a href="/docs/product/playground/">Playground Onboarding and Sandboxing</a><a href="/docs/product/playground-hosted-execution-spec/">Feature Spec: Playground Hosted Execution And Export</a><a href="/docs/product/security-audit-spec/">Feature Spec: Declarative Security Audit (M8)</a></nav></aside><div class="doc-area"><main class="doc-page"><div class="doc-body"><div class="doc-main-col"><nav class="doc-breadcrumb" aria-label="Breadcrumb" data-doc-breadcrumb hidden></nav><header class="doc-hero"><p class="eyebrow">Documentation</p><h1>GOWDK Documentation</h1><p class="doc-lead">GOWDK is a compile-first web kit for Go. You write portable <code>.gwdk</code> files; the compiler turns them into HTML, CSS, route metadata, and generated Go adapter code. A runtime only enters the picture when a route needs request-time behavior.</p><div class="status-badges" aria-label="Project status"><a href="https://github.com/cssbruno/GoWDK/actions/workflows/ci.yml" aria-label="CI status"><img src="https://img.shields.io/github/actions/workflow/status/cssbruno/GoWDK/ci.yml?branch=main&amp;label=CI" alt="CI status"></a><a href="https://github.com/cssbruno/GoWDK/releases" aria-label="Latest release"><img src="https://img.shields.io/github/v/release/cssbruno/GoWDK?include_prereleases&amp;label=release&amp;color=00add8" alt="Latest release"></a><a href="https://github.com/cssbruno/GoWDK/blob/main/LICENSE" aria-label="License"><img src="https://img.shields.io/github/license/cssbruno/GoWDK" alt="License"></a><a href="https://github.com/cssbruno/GoWDK" aria-label="Project stability"><img src="https://img.shields.io/badge/stability-experimental%200.x-e8821a" alt="Stability: experimental 0.x"></a></div><p class="doc-status-note">GOWDK is in active <strong>0.x</strong> development. Badges link to the authoritative GitHub sources for build health, the latest release, and license.</p></header><article class="prose"><h2 id="start-here">Start here</h2><p>If you are new, read these in order. Each one builds on the last.</p><ul><li><a href="/docs/getting-started/">Getting Started</a> installs the CLI and builds your first page end to end.</li><li><a href="/docs/language/">The Language</a> covers the mental model: pages, components, layouts, build-time versus request-time, and guards.</li><li><a href="/docs/engineering/architecture/">Architecture</a> explains how the compiler, generated adapters, and runtime fit together.</li></ul><h2 id="the-language">The language</h2><ul><li><a href="/docs/language/">Language overview</a> is the full <code>.gwdk</code> reference: annotations, blocks, render modes, markup, components, and slots.</li><li><a href="/docs/language/forms/">Forms &amp; progressive enhancement</a> shows how forms and links work without JavaScript, then enhance into fragment requests.</li><li><a href="/docs/language/ssr/">SSR &amp; request-time</a> explains opting into request-time rendering with <code>load</code> and <code>go ssr</code>.</li></ul><h2 id="reference">Reference</h2><ul><li><a href="/docs/reference/routing/">Routing</a> covers routes, dynamic params, rest params, and the trailing-slash policy.</li><li><a href="/docs/reference/config/">Config</a> documents source discovery, modules, build output, CSS settings, render defaults, and addons.</li><li><a href="/docs/reference/cli/">CLI</a> lists every command for scaffolding, checking, building, watching, and serving a project.</li><li><a href="/docs/reference/deployment/">Deployment</a> walks through publishing static files, generating a Go app, and shipping a single binary.</li></ul><h2 id="what-makes-gowdk-different">What makes GOWDK different</h2><ul><li><strong>Go owns the build.</strong> No Node toolchain is required. The CLI is one Go binary and your project is normal Go code.</li><li><strong>Compile first, serve later.</strong> Pages render at build time by default and you opt into SPA or SSR behavior only where it is needed.</li><li><strong>Everything is explicit.</strong> Routes, guards, render lanes, and component usage are declared in the source file, never inferred from folder layout.</li><li><strong>Portable output.</strong> Ship static files to a CDN, run the generated app, or package the whole site into a single executable.</li></ul></article><nav class="doc-pager" aria-label="Pagination" data-doc-pager hidden></nav></div><aside class="doc-toc" data-doc-toc-wrap hidden><p class="doc-toc-title">On this page</p><nav aria-label="On this page" data-doc-toc></nav></aside></div></main></div></div><div class="docs-modal" data-docs-modal hidden><div class="docs-modal-panel" role="dialog" aria-modal="true" aria-label="Search documentation"><div class="docs-modal-search"><span class="docs-modal-ico" aria-hidden="true">⌕</span><input class="docs-modal-input" type="text" placeholder="Search documentation" data-docs-search-input aria-label="Search documentation"><kbd class="docs-modal-esc">Esc</kbd></div><div class="docs-modal-results" data-docs-results></div></div></div><aside class="cookie-notice" data-cookie-notice aria-label="Cookie notice" hidden><div class="cookie-copy"><strong>One cookie</strong><p>This site stores a single cookie to remember you dismissed this notice. No tracking, no analytics.</p></div><button class="button cookie-dismiss" type="button" data-cookie-dismiss>Got it</button></aside></div><footer class="site-footer"><div class="site-footer-inner"><span>GOWDK - Go-native web apps that rebuild fast.</span><nav class="site-footer-nav" aria-label="Footer"><a href="/">Docs</a><a href="/docs/getting-started/">Getting Started</a><a href="https://github.com/cssbruno/gowdk">GitHub</a></nav></div></footer></div> -</body> -</html> diff --git a/docs-site/dist/site/openapi.json b/docs-site/dist/site/openapi.json deleted file mode 100644 index a42b5de6..00000000 --- a/docs-site/dist/site/openapi.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "GOWDK routable web surface", - "version": "0" - }, - "servers": [ - { - "url": "/" - } - ], - "paths": {}, - "components": {}, - "x-gowdk": { - "schema": "gowdk.openapi.v1" - } -} diff --git a/docs-site/render.yaml b/docs-site/render.yaml index e92aa9df..4618bf4d 100644 --- a/docs-site/render.yaml +++ b/docs-site/render.yaml @@ -7,23 +7,17 @@ services: # before compiling the Go server binary. buildCommand: | set -euo pipefail - mkdir -p tools - tailwind_version="v4.3.1" - tailwind_sha256="2526d063ba03b71f9a3ea7d5cee14f0aec147f117f222d5adc97b1d736d45999" - curl -fsSL -o tools/tailwindcss \ - "https://github.com/tailwindlabs/tailwindcss/releases/download/${tailwind_version}/tailwindcss-linux-x64" - echo "${tailwind_sha256} tools/tailwindcss" | sha256sum -c - - chmod +x tools/tailwindcss - (cd .. && go build -o docs-site/tools/gowdk ./cmd/gowdk) - go run ./cmd/syncdocs - rm -rf dist/site - ./tools/gowdk build - mkdir -p dist/site/assets - cp -R assets/. dist/site/assets/ - cp assets/favicon.ico dist/site/favicon.ico - go build -tags netgo -ldflags '-s -w' -o app . + scripts/install-tailwind-linux.sh + scripts/build-production.sh startCommand: ./app buildFilter: paths: - docs-site/** - docs/** + - addons/** + - cmd/** + - internal/** + - runtime/** + - gowdk.go + - go.mod + - go.sum diff --git a/docs-site/scripts/build-production.sh b/docs-site/scripts/build-production.sh new file mode 100755 index 00000000..b5e6b493 --- /dev/null +++ b/docs-site/scripts/build-production.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env sh +set -eu + +site_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +repo_root=$(CDPATH= cd -- "${site_root}/.." && pwd) + +cd "${site_root}" + +if [ ! -x tools/tailwindcss ]; then + echo "docs-site/tools/tailwindcss is missing; install the Tailwind standalone CLI first." >&2 + exit 1 +fi + +(cd "${repo_root}" && go build -o docs-site/tools/gowdk ./cmd/gowdk) +go run ./cmd/syncdocs +rm -rf dist/site +./tools/gowdk build +mkdir -p dist/site/assets +cp -R assets/. dist/site/assets/ +cp assets/favicon.ico dist/site/favicon.ico +go build -tags netgo -ldflags '-s -w' -o app . diff --git a/docs-site/scripts/install-tailwind-linux.sh b/docs-site/scripts/install-tailwind-linux.sh new file mode 100755 index 00000000..4d76f257 --- /dev/null +++ b/docs-site/scripts/install-tailwind-linux.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh +set -eu + +site_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +cd "${site_root}" + +tailwind_version="v4.3.1" +tailwind_sha256="2526d063ba03b71f9a3ea7d5cee14f0aec147f117f222d5adc97b1d736d45999" + +mkdir -p tools +curl -fsSL -o tools/tailwindcss \ + "https://github.com/tailwindlabs/tailwindcss/releases/download/${tailwind_version}/tailwindcss-linux-x64" +echo "${tailwind_sha256} tools/tailwindcss" | sha256sum -c - +chmod +x tools/tailwindcss diff --git a/docs-site/scripts/smoke-production.sh b/docs-site/scripts/smoke-production.sh new file mode 100755 index 00000000..7633f5c8 --- /dev/null +++ b/docs-site/scripts/smoke-production.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env sh +set -eu + +site_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +cd "${site_root}" + +addr=${GOWDK_SMOKE_ADDR:-127.0.0.1:18091} +base_url="http://${addr}" +log_file=$(mktemp "${TMPDIR:-/tmp}/gowdk-docs-site.XXXXXX.log") + +cleanup() { + if [ -n "${server_pid:-}" ]; then + kill "${server_pid}" 2>/dev/null || true + wait "${server_pid}" 2>/dev/null || true + fi + rm -f "${log_file}" +} +trap cleanup EXIT INT TERM + +GOWDK_ADDR="${addr}" ./app >"${log_file}" 2>&1 & +server_pid=$! + +ready=0 +for _ in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do + if curl -fsS "${base_url}/" >/dev/null 2>&1; then + ready=1 + break + fi + sleep 1 +done + +if [ "${ready}" -ne 1 ]; then + echo "docs-site smoke: server did not start" >&2 + cat "${log_file}" >&2 + exit 1 +fi + +assert_contains() { + url=$1 + text=$2 + page_file=$(mktemp "${TMPDIR:-/tmp}/gowdk-docs-page.XXXXXX.html") + if ! curl -fsS "${url}" -o "${page_file}"; then + rm -f "${page_file}" + echo "docs-site smoke: failed to fetch ${url}" >&2 + exit 1 + fi + if ! grep -q "${text}" "${page_file}"; then + rm -f "${page_file}" + echo "docs-site smoke: expected ${url} to contain ${text}" >&2 + exit 1 + fi + rm -f "${page_file}" +} + +assert_contains "${base_url}/" "GOWDK Documentation" +assert_contains "${base_url}/docs/language/" "GOWDK Language" +assert_contains "${base_url}/docs/reference/cli/" "CLI" +curl -fsS "${base_url}/favicon.ico" >/dev/null +curl -fsS "${base_url}/assets/wdk_logo.png" >/dev/null + +echo "docs-site production smoke ok" diff --git a/docs-site/src/components/docs-page.cmp.gwdk b/docs-site/src/components/docs-page.cmp.gwdk index f4dfcdd8..7b123201 100644 --- a/docs-site/src/components/docs-page.cmp.gwdk +++ b/docs-site/src/components/docs-page.cmp.gwdk @@ -164,17 +164,23 @@ js { // Copy buttons on every code block (generated <pre> and authored figures). var blocks = document.querySelectorAll(".prose pre, .prose figure.code"); Array.prototype.forEach.call(blocks, function (block) { + if (block.tagName === "PRE" && block.closest("figure.code")) return; var pre = block.tagName === "PRE" ? block : block.querySelector("pre"); if (!pre || block.querySelector(".code-copy")) return; var btn = el("button", "code-copy", "Copy"); btn.type = "button"; + btn.setAttribute("aria-label", "Copy code block"); btn.addEventListener("click", function () { var code = pre.querySelector("code"); var text = code ? code.textContent : pre.textContent; if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(function () { btn.textContent = "Copied"; - setTimeout(function () { btn.textContent = "Copy"; }, 1500); + btn.setAttribute("aria-label", "Code copied"); + setTimeout(function () { + btn.textContent = "Copy"; + btn.setAttribute("aria-label", "Copy code block"); + }, 1500); }); } }); diff --git a/docs/compiler/build-report.md b/docs/compiler/build-report.md index 90f0cbf8..adc48d2f 100644 --- a/docs/compiler/build-report.md +++ b/docs/compiler/build-report.md @@ -82,6 +82,8 @@ Current report events include: build-time sitemap, with `data.reason` and render `mode`. Reasons include request-time rendering, missing dynamic `paths {}`, and guardless routes that the generated app denies by default. +- `structured_data`: emitted for each page that declares supported `jsonld` + metadata. The event records the page, route, schema kind list, and count. ## CLI Debug Output diff --git a/docs/engineering/architecture.md b/docs/engineering/architecture.md index d34d0407..6363592d 100644 --- a/docs/engineering/architecture.md +++ b/docs/engineering/architecture.md @@ -194,7 +194,7 @@ manifest report (`internal/lang/testdata/manifest_golden`). | `internal/compiler` | Validate manifests and coordinate compilation metadata. | Compiler | Render-mode, duplicate identity, redundant component implementation, component Go contract, saved default `go {}` package type-checking with sibling Go files, route shape, duplicate route param, duplicate route pattern, route-method, required page-view validation, default `go {}` backend endpoint binding fallback, `go/packages`-backed backend binding, and realtime subscription addon/binding validation implemented. CLI route/endpoint reports now convert through `internal/gwdkir.Program`. | | `internal/securitymanifest` | Project compiler IR into declarative security posture. | Tools | Builds `gowdk-security.json` posture records for routes, backend endpoints, command/query web contract endpoints, contract metadata, guards, CSRF state, body limits, public/default-deny classification, source locations, frontend bundle-secret candidates, raw-HTML sinks, unguarded client-visible routes, and configured security header names. It describes posture only; policy evaluation lives in `internal/auditspec`. | | `internal/auditspec` | Evaluate security posture against audit policy. | Tools | Provides the policy model, selector matcher, `extends` composition, built-in baseline, declared `*.audit.gwdk` policy lowering, frontend audit rules, and registry-backed findings for `gowdk audit`. | -| `internal/buildgen` | Emit route-derived spa HTML files for build-time pages and SSR render artifacts. | Compiler | Disk builds, memory builds, incremental SPA builds, and SSR artifact planning consume `internal/gwdkir.Program`. Initial simple page, literal build data, imported Go build data calls with optional `gowdk.BuildParams`, locale-expanded page output through `Config.I18N`, literal dynamic path expansion, component expansion, partial runtime asset emission, default JS island asset emission, component-level non-CSS asset emission, component-level WASM island asset emission, page-level `go client {}` WASM mount asset emission, concrete and dynamic SSR page rendering with declared `server {}` placeholders, route manifest emission, asset manifest emission, optional SEO sitemap/robots emission, optional production obfuscation of compiler-owned generated browser JavaScript, OpenAPI report emission, non-served security posture report emission, mandatory build report emission with cache-policy, contract-reference, realtime-subscription, and request-time skip events, identical-output write skipping, and incremental changed-page spa rendering implemented. | +| `internal/buildgen` | Emit route-derived spa HTML files for build-time pages and SSR render artifacts. | Compiler | Disk builds, memory builds, incremental SPA builds, and SSR artifact planning consume `internal/gwdkir.Program`. Initial simple page, literal build data, imported Go build data calls with optional `gowdk.BuildParams`, locale-expanded page output through `Config.I18N`, literal dynamic path expansion, component expansion, partial runtime asset emission, default JS island asset emission, component-level non-CSS asset emission, component-level WASM island asset emission, page-level `go client {}` WASM mount asset emission, concrete and dynamic SSR page rendering with declared `server {}` placeholders, route manifest emission, asset manifest emission, optional SEO sitemap/robots and JSON-LD structured-data emission, optional production obfuscation of compiler-owned generated browser JavaScript, OpenAPI report emission, non-served security posture report emission, mandatory build report emission with cache-policy, contract-reference, realtime-subscription, structured-data, and request-time skip events, identical-output write skipping, and incremental changed-page spa rendering implemented. | | `internal/appgen` | Emit generated Go app source for embedded spa output and request-time routes. | Compiler | Auto route planning consumes `internal/gwdkir.Program`, backend adapter planning uses typed appgen IR, and generated app Go files are assembled with `go/ast`/`go/printer` before `go/format`. Generates `go.mod`, `main.go`, copied spa assets, thin `runtime/app` server wiring, generated app middleware registration hooks, auth addon session/guard startup when configured, configured runtime security headers, generated audit `_test.go` files, `runtime/app.BackendRouter` registrations for feature-bound action/API/fragment/contract routes, split frontend proxy route matching from the same backend metadata, backend-only app routing, 501 stubs for missing/unsupported handlers, POST redirect and partial fragment action handlers backed by `runtime/form`, `runtime/response`, `runtime/validation`, and `addons/partial`, form input decoders, concrete and dynamic standalone fragment routes, concrete and dynamic SSR route handlers backed by `runtime/route`, declared SSR load path calls with redirect/error-page handling through `runtime/ssr`, shared request-time guard checks through `runtime/guard`, generated `gowdk_go/` packages for default `go {}` and `go server {}` blocks, addon `GoBlockConsumer` Go files, split backend apps, command/query contract exposure metadata in adapter IR including runtime roles, subscription-filtered and guard-checked realtime SSE fanout route generation for bound `g:subscribe` metadata, identical-output write skipping, stale embedded spa cleanup, and can invoke `go build` for local binaries or Go `js/wasm` artifacts. | | `internal/clientrt` | Own embedded browser runtime sources for partial updates, static-first SPA navigation, stores, JS islands, WASM loaders, and realtime subscription patches. | Runtime | Framework-owned runtime source is kept as `.js` files under `internal/clientrt/assets/` and embedded with `go:embed`. First partial form enhancement runtime emits lifecycle hooks, target/swap request headers, swaps, focus restoration, loading state metadata, island remounts, and page-level `go client {}` remounts after SPA navigation. WASM island loaders merge page-store values into payloads, decode Go-style JSON result pointers, write returned store values back to the store registry, and subscribe for external store updates. Realtime subscription runtime connects to generated SSE streams for query-owned regions and applies explicit `replaceHTML` patches with safe rejection for unsupported shapes. | | `runtime/render` | Core rendering engine used by static output, actions, partials, and SSR. | Runtime | Renderer and generated-code builder implemented; expression text writes escape by default. | diff --git a/docs/engineering/ci.md b/docs/engineering/ci.md index 77245339..b78ba321 100644 --- a/docs/engineering/ci.md +++ b/docs/engineering/ci.md @@ -16,6 +16,8 @@ Required pull-request lanes: - `VS Code extension`: extension version sync, Node syntax checks, and unit tests. - `Documentation links`: `scripts/check-docs-links.sh`. +- `Documentation style`: `scripts/check-docs-style.sh` checks heading order and + language-tagged fenced code blocks. Long prose paragraphs are warnings. - `Removed source syntax`: `scripts/check-removed-syntax.sh` (runs in the `Documentation links` job) flags pre-v0.6.0 source forms that the script lists but that linger in docs as if still active. They are allowed only in changelog, @@ -66,10 +68,18 @@ Run the same local checks before handoff when relevant: ```sh scripts/check-docs-links.sh + scripts/check-docs-style.sh scripts/check-removed-syntax.sh + scripts/check-doc-versions.sh scripts/check-example-reports.sh ``` +- Docs-site production check: + + ```sh + (cd docs-site && scripts/install-tailwind-linux.sh && scripts/build-production.sh && scripts/smoke-production.sh) + ``` + - Fuzz, integration, and determinism checks: ```sh @@ -192,11 +202,22 @@ set with `-exclude` and scope a run with `-root`: scripts/check-docs-links.sh -root docs -exclude .git,node_modules ``` -Markdown *style* linting is intentionally not part of this gate. The available -formatters flagged mostly cosmetic line-wrap and list-indent differences across -the existing docs — high churn, low signal — so the gate is limited to link and -anchor correctness, which catches real breakage. Revisit if a style check earns -its keep without mass reformatting. +Markdown style checks live in `scripts/check-docs-style.sh`. That gate is kept +small on purpose: missing fence languages and skipped heading levels fail; +long paragraphs warn without blocking. The authoring rules live in +`docs/engineering/documentation-style.md`. + +## Docs Site Build + +The docs site is tested through the same production path Render uses. The +`docs-site` CI job installs the pinned Linux Tailwind standalone CLI, runs +`docs-site/scripts/build-production.sh`, starts the compiled binary through +`docs-site/scripts/smoke-production.sh`, then runs `go test ./...` and +`go vet ./...` in the docs-site module. + +`docs-site/dist/site` is build output, not committed source. The source of +truth is the repo Markdown, docs-site `.gwdk`/CSS/assets, and the in-tree +compiler used by `build-production.sh`. ## Cache Maintenance diff --git a/docs/engineering/conventions.md b/docs/engineering/conventions.md index 94194f68..1194184f 100644 --- a/docs/engineering/conventions.md +++ b/docs/engineering/conventions.md @@ -24,5 +24,7 @@ Keep top-level directories purposeful: quality, testing, and dependency discipline. - `docs/engineering/naming-conventions.md`: product name, full-name, file, artifact, runtime, and Go identifier naming rules. +- `docs/engineering/documentation-style.md`: Markdown authoring rules and + docs-site rendering checks. - `docs/engineering/dependency-policy.md`: dependency selection and review policy. diff --git a/docs/engineering/documentation-style.md b/docs/engineering/documentation-style.md new file mode 100644 index 00000000..e78a5cc9 --- /dev/null +++ b/docs/engineering/documentation-style.md @@ -0,0 +1,40 @@ +# Documentation Style + +This is the authoring contract for Markdown rendered by `docs-site`. + +## Rules + +- Start each page with one `#` heading and one short lead paragraph. +- Do not repeat the lead in the body. `docs-site/cmd/syncdocs` promotes it into + the page header. +- Use headings in order. Do not skip from `##` to `####`. +- Tag every fenced code block with a language such as `gwdk`, `go`, `sh`, + `json`, `toml`, `yaml`, or `text`. +- Prefer short paragraphs. Long paragraphs warn in + `scripts/check-docs-style.sh` because they are hard to scan on the docs site. +- Put practical examples before explanation. +- Use inline code for source forms, commands, file names, flags, config keys, + diagnostics, and generated artifact names. +- Keep status precise: say what works, what is partial, what is planned, and + what is intentionally app-owned. +- Link to the source of truth instead of duplicating long status sections. +- Do not commit generated docs-site pages, generated sidebar files, or + `docs-site/dist/site` output. + +## Checks + +Run the docs gates before handing off documentation changes: + +```sh +scripts/check-docs-links.sh +scripts/check-docs-style.sh +scripts/check-removed-syntax.sh +scripts/check-doc-versions.sh +``` + +Run the production docs-site path when site rendering, CSS, generated docs +pages, or deployment behavior changes: + +```sh +(cd docs-site && scripts/build-production.sh && scripts/smoke-production.sh) +``` diff --git a/docs/engineering/seo-structured-data-dynamic-sitemap-plan.md b/docs/engineering/seo-structured-data-dynamic-sitemap-plan.md new file mode 100644 index 00000000..21b53c01 --- /dev/null +++ b/docs/engineering/seo-structured-data-dynamic-sitemap-plan.md @@ -0,0 +1,77 @@ +# Implementation Plan: SEO Structured Data And Dynamic Sitemap + +## Context + +Spec: `docs/product/seo-structured-data-and-dynamic-sitemap.md` + +Issue: #637 + +## Assumptions + +- GOWDK owns deterministic output for build-time public pages. +- Apps own request-time inventory, auth, and crawler visibility for dynamic + URLs. +- The first structured-data slice supports only `WebPage` and `Article`. + +## Proposed Changes + +- Parse `jsonld <kind>` as page metadata and store it in IR. +- Validate supported kinds and reject duplicates with stable diagnostics. +- Render JSON-LD through Go JSON serialization and existing script escaping. +- Add runtime SEO sitemap helpers for deterministic URL normalization and XML + response handling. +- Extend SEO addon options with a dynamic provider import path/function and + runtime caps/cache settings. +- Generate `/sitemap.xml` in embedded apps when the dynamic provider is + configured. +- Document and example the new contracts. + +## Files Expected To Change + +- Parser/analyzer/IR: `internal/parser`, `internal/compiler`, + `internal/gwdkir`, `internal/lang`. +- Output/app generation: `internal/buildgen`, `internal/appgen`. +- Public API/addon/runtime: `gowdk.go`, `addons/seo`, `runtime/seo`. +- Docs/examples: `docs/reference/seo.md`, `docs/reference/config.md`, + `docs/language`, `examples/seo`. + +## Data And API Impact + +- New public config field: `SEOOptions.DynamicSitemap`. +- New public type aliases: `SEOURL` now points at `runtime/seo.URL`; + `addons/seo.DynamicSitemap` aliases the root dynamic sitemap type. +- Manifest metadata gains `metadata.jsonld`. +- Build report gains `seo/structured_data` events. + +## Tests + +- Unit: parser metadata, compiler validation, runtime sitemap normalization and + handler behavior. +- Integration: build output JSON-LD rendering, appgen dynamic sitemap route, + config loading. +- End-to-end: SEO example build. +- Manual: inspect generated HTML and `/sitemap.xml` output when serving a + generated app. + +## Verification Commands + +```sh +go test ./runtime/seo +go test ./internal/parser ./internal/compiler +go test ./internal/buildgen +go test ./internal/appgen ./internal/project +go run ./cmd/gowdk build --config examples/seo/gowdk.config.go --out /tmp/gowdk-seo-build examples/seo/*.gwdk +``` + +## Rollback Plan + +- Remove `DynamicSitemap` from SEO options and appgen route registration. +- Remove `jsonld` metadata parsing/validation and JSON-LD rendering. +- Keep static `sitemap.xml` and `robots.txt` behavior unchanged. + +## Risks + +- Provider functions can expose private URLs if app code skips its own policy; + docs must state that the provider owns visibility. +- More schema kinds can create compatibility pressure; keep this slice narrow + until concrete examples justify expansion. diff --git a/docs/language/README.md b/docs/language/README.md index edb2bbfc..82067ab0 100644 --- a/docs/language/README.md +++ b/docs/language/README.md @@ -2,30 +2,68 @@ This directory documents the current `.gwdk` language contract. -The current implementation supports line-oriented page metadata, page-level Go -imports for build-time data, GOWDK `use` declarations for page-level -cross-package component calls, explicit component metadata, top-level block -detection, the first typed action input/redirect/fragment-metadata subset, the -first API method/route metadata subset, minimal literal `view {}` markup parsing, -metadata capture for `go {}` inline Go authoring blocks, -first-slice `g:post`, `g:target`, and `g:swap` lowering, literal dynamic SPA -route expansion, literal build data, imported Go build data functions with -optional `gowdk.BuildParams` route params, default `go {}` build-data functions, package -type-checking for saved default `go {}` blocks, generated -`gowdk_go/` packages for default `go {}` and `go server {}` blocks, -same-page action/API/fragment handlers from default `go {}` blocks, -page-level `go client {}` WASM mounts, `go server {}` load -handlers, configured-addon -`go addon.<name> {}` validation and generated app Go file emission through -`gowdk.GoBlockConsumer`, route/build-data -interpolation in views, Go-typed component props/state contracts, first-slice -generated JavaScript islands for stateful components, component-level `wasm` -island asset emission, formatting, diagnostics, manifest output, build output -for simple SPA pages/components, generated partial fragment responses for -embedded apps, and LSP/editor integration. It does not yet implement full typed -action semantics, API request/response -bodies, broad local client-side reactivity, or full semantic/type analysis -outside the component contract and inline package-go-block slices. +`.gwdk` files declare pages, components, layouts, metadata, routes, build-time +data, request-time endpoints, and bounded client behavior. Normal Go packages +own domain logic, persistence, auth, and production policy. + +## Minimal Page + +```gwdk +package pages + +route "/" +guard public + +build { + => { title: "GOWDK ships apps" } +} + +view { + <main> + <h1>{title}</h1> + </main> +} +``` + +## Implemented + +- Line-oriented page metadata, including `route`, `guard`, `title`, + `description`, `canonical`, `noindex`, and supported `jsonld` declarations. +- Top-level page, component, layout, action, API, fragment, build, paths, + server, view, client, CSS, import, and use declarations for the supported + slices. +- Build-time SPA output for simple pages and components. +- Literal dynamic SPA route expansion through `paths {}`. +- Literal build data and imported Go build-data functions, including optional + `gowdk.BuildParams`. +- Default `go {}` and `go server {}` package emission under generated + `gowdk_go/` packages. +- Same-page action, API, and fragment handlers from default `go {}` blocks. +- Request-time page loading through `server {}` or `go server {}` when SSR is + enabled. +- Route/build-data interpolation in views. +- Go-typed component props and state contracts. +- First-slice generated JavaScript islands, page-level `go client {}` WASM + mounts, and component-level `wasm` island assets. +- Formatting, diagnostics, manifest output, build reports, and LSP/editor + integration. + +## Partial + +- Typed actions cover the first input, redirect, and fragment-metadata subset. +- APIs cover the first method/route metadata and supported handler signatures. +- View parsing accepts the current literal markup subset and selected + directives such as `g:post`, `g:target`, and `g:swap`. +- Configured `go addon.<name> {}` blocks validate known addon consumers and can + emit generated app Go files through `gowdk.GoBlockConsumer`. + +## Not Yet Implemented + +- Full typed action semantics. +- Full API request/response body modeling. +- Broad local client-side reactivity. +- Full semantic/type analysis outside component contracts and inline package Go + block slices. ## Current Files diff --git a/docs/language/semantics.md b/docs/language/semantics.md index 81e43c19..0230d2fd 100644 --- a/docs/language/semantics.md +++ b/docs/language/semantics.md @@ -32,12 +32,13 @@ derives from the source filename by removing `.page.gwdk` or `.gwdk`. Explicit `page` keeps page identity stable across file renames. - `title`, `description`, `canonical`, `image`, `robots`, `noindex`, - `preload`, and `prefetch` record document head metadata used by generated - HTML output. If `title` is omitted, generated output falls back to the page - ID. `image` feeds generated Open Graph and Twitter image tags when social - head output is enabled by page or config metadata. `noindex` adds `noindex` - to the robots meta value and excludes otherwise public pages from generated - SEO sitemaps. + `jsonld`, `preload`, and `prefetch` record document head metadata used by + generated HTML output. If `title` is omitted, generated output falls back to + the page ID. `image` feeds generated Open Graph and Twitter image tags when + social head output is enabled by page or config metadata. `noindex` adds + `noindex` to the robots meta value and excludes otherwise public pages from + generated SEO sitemaps. `jsonld` declares supported structured-data kinds and + emits escaped `application/ld+json` script payloads for generated pages. - `layout` records ordered page layout references. Bare references resolve to same-package layout IDs or legacy package-less layouts. Cross-package layouts require `use alias "package"` and qualified refs such as `alias.root`. diff --git a/docs/language/spec.md b/docs/language/spec.md index a90becbf..8fefdcf6 100644 --- a/docs/language/spec.md +++ b/docs/language/spec.md @@ -73,6 +73,7 @@ Implemented or partial metadata declarations: - `image "<url>"` - `robots "<policy>"` - `noindex [true|false]` +- `jsonld <WebPage|Article>` - `preload "<href>" [as "<type>"]` - `prefetch "<href>" [as "<type>"]` - `layout <id>[, <id>...]` diff --git a/docs/language/stability.md b/docs/language/stability.md index 04f72698..4a6dec81 100644 --- a/docs/language/stability.md +++ b/docs/language/stability.md @@ -60,6 +60,7 @@ All metadata keywords are **Stable**. The canonical list is `lang.MetadataKeywor | `image` | Stable | | `robots` | Stable | | `noindex` | Stable | +| `jsonld` | Partial | | `preload` | Stable | | `prefetch` | Stable | | `layout` | Stable | diff --git a/docs/language/syntax.md b/docs/language/syntax.md index bba23582..43fc8dc2 100644 --- a/docs/language/syntax.md +++ b/docs/language/syntax.md @@ -38,6 +38,7 @@ canonical "https://example.com/" image "https://example.com/social.png" robots "index,follow" noindex false +jsonld WebPage preload "/assets/app.css" as "style" prefetch "/docs" layout root, marketing @@ -63,6 +64,9 @@ Supported metadata declarations: - `robots "<policy>"`: optional robots meta content. - `noindex [true|false]`: optional shorthand for adding `noindex` to the robots meta content. A bare `noindex` line is treated as `true`. +- `jsonld <WebPage|Article>`: optional structured-data schema declaration. + Supported kinds are validated, duplicates are rejected, and generated HTML + emits deterministic JSON-LD. - `preload "<href>" [as "<type>"]`: optional head preload link. Absolute URLs must be `http` or `https`; protocol-relative and active-content URLs are rejected. diff --git a/docs/product/requirements.md b/docs/product/requirements.md index 3ffc46b8..ed24e54e 100644 --- a/docs/product/requirements.md +++ b/docs/product/requirements.md @@ -54,7 +54,7 @@ language references, compiler docs, and examples. | PRD-026 | Provide declarative security posture and baseline audit gating. | High | Partial | `internal/securitymanifest` projects validated IR into a route/endpoint/contract/frontend posture, `internal/auditspec` evaluates the built-in baseline plus declared `*.audit.gwdk` policies, `gowdk audit` reports human/JSON findings with registry-backed severities and exits non-zero on error findings, and `gowdk build` evaluates the same baseline before writing output plus scans final emitted artifact files after generation. Production builds fail on error-severity findings unless `--allow-insecure` is set; non-production builds print a warning summary. The baseline covers action/command/state-changing API CSRF, guardless action/fragment/command/query endpoints, public-by-omission APIs, roleless contracts, bundle secret leaks, client-visible guardless routes, and raw-HTML sinks; policy rules can require headers. `gowdk audit --emit-tests` writes readable standalone `_test.go` posture tests without overwriting user-owned files unless `--force` is passed, and `--run` builds a temporary generated app and executes its generated app audit test through `runtime/testkit` without auto-authorizing app-owned custom guards. Richer role fixture injection and deeper browser/data-flow analysis remain planned; authentication, sessions, RBAC storage, and backend resource authorization stay app-owned by design. | | PRD-027 | Provide opt-in browser presentation-event fanout without adding WebSocket dependencies to the root module. | Medium | Implemented | `FeatureRealtime` and `addons/realtime` provide config and `gowdk add realtime` wiring for presentation-event fanout. Dependency-free SSE fanout remains in the root module through `runtime/contracts/sse` and `realtime.NewSSE`; WebSocket fanout remains isolated in the nested `runtime/contracts/websocketfanout` module. Docs cover SSE versus WebSocket setup, deployment caveats, and the M14 boundary for live DOM reactivity. | | PRD-028 | Provide compiler-validated realtime UI subscription metadata. | Medium | Partial | ADR 0012 defines `g:subscribe` on query-owned elements. The compiler parses the directive, lowers it to `Program.RealtimeSubscriptions`, requires `realtime.Addon()`, validates referenced Go contracts as presentation events available to the web role, emits exact-span diagnostics, renders `data-gowdk-subscribe` and validated `data-gowdk-subscribe-type` markers, records build-report metadata, generated apps mount subscription-filtered SSE fanout at `/_gowdk/realtime/events` for bound subscriptions, generated stream handlers run inherited guards before opening SSE responses, the SSE adapter declares browser retry timing and drops events for full per-client buffers instead of blocking command execution, generated `gowdk.js` applies explicit `replaceHTML` realtime patches to subscribed query regions, and `examples/contracts` demonstrates the live flow. The compiler also scans explicit Go `RegisterInvalidation[event, query]` edges, lowers validated bound edges to `Program.QueryInvalidations`, rejects unknown queries/events or events no scanned command emits, records `query_invalidation` build-report events, prints `invalidates` graph edges, renders `data-gowdk-query-type` markers, emits generated `gowdk.query.invalidate` presentation events after command event dispatch, and refetches the current document to replace matching non-subscribed query regions. Custom retry/backoff/replay, active session-change stream revocation, richer patch shapes, fragment/API-specific query execution, and route-specific refresh endpoints remain planned hardening work. | -| PRD-029 | Provide optional SEO build output for sitemap and robots files without making crawler policy core. | Medium | Partial | `addons/seo` registers `FeatureSEO` and `gowdk.SEOProvider`; `gowdk build` emits `sitemap.xml` and `robots.txt` only when the addon supplies a valid `BaseURL`. The sitemap includes public static and `paths {}`-expanded SPA routes plus configured extra URLs, while request-time and guardless default-denied pages are excluded and listed in `gowdk-build-report.json`. JSON-LD and request-time sitemap serving remain planned/out of scope for this slice. | +| PRD-029 | Provide optional SEO build output for sitemap, robots, and structured page metadata without making crawler policy core. | Medium | Partial | `addons/seo` registers `FeatureSEO` and `gowdk.SEOProvider`; `gowdk build` emits `sitemap.xml` and `robots.txt` only when the addon supplies a valid `BaseURL`. The sitemap includes public static and `paths {}`-expanded SPA routes plus configured extra URLs, while request-time, `noindex`, and guardless default-denied pages are excluded and listed in `gowdk-build-report.json`. Pages can declare supported `jsonld` kinds for generated JSON-LD, and generated apps can serve `/sitemap.xml` with an app-owned dynamic provider. Broader schema kinds and crawler operations remain planned or app-owned. | | PRD-030 | Provide dependency-free runtime trace primitives and opt-in generated app instrumentation. | Medium | Partial | ADR 0013 defines `runtime/trace` as the root-module observability core. It provides W3C-compatible trace/span IDs, `traceparent`/`tracestate` propagation with bounded header parsing, context spans, GOWDK surface/lane/source metadata, attributes/events/status, always-on/off and ratio sampling, console/JSONL/ring/multi/exporter sinks, a bounded JSON/SSE collector, hardened browser span ingest, and a self-contained local viewer with dropped/rejected counters. `addons/observability` gates debug-only generated route/guard/handler/SSR-load/browser/island tracing, `runtime/contracts` propagates trace context through events/jobs/workers/outbox records, and the nested `runtime/trace/otel` module provides optional OTLP HTTP export without root OpenTelemetry dependencies. Durable production storage, hosted analysis, and production sampling/access policy remain app-owned. | | PRD-031 | Provide a config-owned localization contract for generated page routes and typed message catalogs. | Medium | Partial | `Config.I18N` declares locale codes, optional path prefixes, default locale, and default-prefix omission. Build-time SPA routes, dynamic `paths {}` output, request-time SSR/hybrid page routes, route metadata, site-map JSON, route manifests, and SEO sitemap output expand per locale. Build helpers receive `gowdk.BuildParams.Locale`, generated HTML receives `lang`, SSR handlers attach `runtime/app.Locale(ctx)`, and `runtime/i18n` provides typed Go catalog/bundle helpers. Message extraction, ICU/plural/date formatting, translated diagnostics, and per-endpoint locale policies remain planned or app-owned. | diff --git a/docs/product/roadmap.md b/docs/product/roadmap.md index ac15cdba..fab31f8f 100644 --- a/docs/product/roadmap.md +++ b/docs/product/roadmap.md @@ -286,8 +286,8 @@ without making any minor version a production-readiness target. manifests, and rollback before any production-ready claim. - P2 ecosystem polish is owned by optional docs, examples, website pages, or CLI generators: playground onboarding/export, addon discovery, performance - profiling, migration guides, image guidance, SEO metadata beyond - sitemap/robots, and PWA/offline guidance must not add mandatory npm, + profiling, migration guides, image guidance, broader SEO metadata beyond + current JSON-LD/sitemap/robots, and PWA/offline guidance must not add mandatory npm, framework, hosted execution, or platform dependencies to the repository core. ## Non-Goals For Repository Core diff --git a/docs/product/seo-structured-data-and-dynamic-sitemap.md b/docs/product/seo-structured-data-and-dynamic-sitemap.md new file mode 100644 index 00000000..ed3c252d --- /dev/null +++ b/docs/product/seo-structured-data-and-dynamic-sitemap.md @@ -0,0 +1,99 @@ +# Feature Spec: SEO Structured Data And Dynamic Sitemap + +## Problem + +GOWDK can emit static SEO files, but content-heavy apps need structured data in +generated pages and a way to include request-time or database-owned URLs in a +sitemap without making the compiler guess app inventory policy. + +## Goals + +- Let pages declare supported JSON-LD schema kinds with `.gwdk` metadata. +- Validate unsupported or duplicate structured-data declarations at compile + time. +- Emit deterministic, safely escaped JSON-LD for generated pages. +- Let generated apps serve `/sitemap.xml` from static public URLs plus an + optional app-owned dynamic provider. +- Preserve guard, `noindex`, and request-time visibility rules for + compiler-owned sitemap entries. +- Expose the behavior through docs, examples, manifest metadata, and build + report events. + +## Non-Goals + +- Owning Search Console setup, CDN policy, or crawler operations. +- Discovering database-backed URLs automatically. +- Modeling every schema.org type in the first slice. +- Overriding app authorization policy for request-time-only URLs. + +## Users And Permissions + +- Primary users: GOWDK app authors and docs/tooling authors. +- Roles or permissions: public pages can contribute static sitemap URLs; app Go + code owns dynamic URL visibility. +- Data visibility rules: guardless, protected, and `noindex` pages are excluded + from GOWDK-owned static sitemap entries. + +## User Flow + +1. The author adds `jsonld WebPage` or `jsonld Article` to a page. +2. `gowdk check` rejects unsupported or duplicate schema declarations. +3. `gowdk build` emits JSON-LD in generated HTML and records report metadata. +4. The author optionally configures `seo.DynamicSitemap` with an app-owned Go + provider. +5. The generated app serves `/sitemap.xml` by merging public static URLs and + provider URLs. + +## Requirements + +### Functional + +- Support `jsonld WebPage` and `jsonld Article`. +- Emit one `application/ld+json` script per declaration. +- Include structured-data kinds in `gowdk manifest`. +- Record `seo/structured_data` build report events. +- Generate a runtime `/sitemap.xml` route only when `DynamicSitemap` is fully + configured. +- Normalize, sort, deduplicate, and cap dynamic sitemap URLs. + +### Non-Functional + +- Performance: sitemap normalization is bounded by `MaxURLs`; default runtime + cap applies when no explicit cap is configured. +- Reliability: provider errors return `503` with `Cache-Control: no-store`. +- Accessibility: no visual UI impact. +- Security/privacy: generated JSON uses structured serialization and script + escaping; dynamic providers own app-specific visibility. +- Observability: diagnostics, manifest metadata, and build report events expose + the feature. + +## Acceptance Criteria + +- [x] Unsupported structured-data kinds fail validation. +- [x] Duplicate structured-data kinds fail validation with related source span. +- [x] SPA HTML includes deterministic JSON-LD before stylesheets. +- [x] Generated app code registers dynamic `/sitemap.xml` before the page + fallback route. +- [x] Runtime sitemap handler handles GET/HEAD, URL normalization, caps, + provider errors, and cache headers. +- [x] SEO docs and examples show structured data and the dynamic provider. + +## Edge Cases + +- Request-time pages are excluded from build-time sitemap output unless the app + provider returns their public URLs. +- Root-relative dynamic URLs are resolved against `BaseURL`. +- Absolute dynamic URLs must be `http` or `https`. +- Provider overflow and provider errors fail the request without exposing error + details to crawlers. + +## Dependencies + +- Internal: parser metadata, compiler validation, buildgen head rendering, + appgen route registration, runtime SEO helper package. +- External: none. + +## Open Questions + +- Broader schema kinds are planned follow-up work once concrete app examples + need them. diff --git a/docs/reference/addons.md b/docs/reference/addons.md index f45d8bfd..1e09fbde 100644 --- a/docs/reference/addons.md +++ b/docs/reference/addons.md @@ -467,10 +467,12 @@ an application policy automatically. When `ratelimit.Addon()` is enabled and a generated app has action, API, fragment, SSR, or split-backend proxy routes, the generated package exposes `RegisterRateLimiter(*ratelimit.Limiter)`. -`addons/seo` emits `sitemap.xml` and `robots.txt` at build time. It requires -`seo.Options.BaseURL`, includes public static and `paths {}`-expanded SPA -routes, and records request-time or default-denied route exclusions in the build -report. See [seo.md](seo.md). +`addons/seo` emits `sitemap.xml` and `robots.txt` at build time, enables +supported `jsonld` structured-data metadata, and can configure a generated app +runtime `/sitemap.xml` provider. It requires `seo.Options.BaseURL`, includes +public static and `paths {}`-expanded SPA routes, and records request-time, +`noindex`, or default-denied route exclusions in the build report. See +[seo.md](seo.md). ```go store := ratelimit.NewInMemoryStore(ratelimit.InMemoryOptions{}) diff --git a/docs/reference/config.md b/docs/reference/config.md index 5136d30e..413e9136 100644 --- a/docs/reference/config.md +++ b/docs/reference/config.md @@ -159,6 +159,42 @@ The addon module may import other GitHub/private/local modules. The project `go.mod` remains the source of truth for resolving those imports, including `require`, `replace`, `GOPRIVATE`, and module proxy configuration. +## SEO Addon Options + +`addons/seo` is opt-in. `BaseURL` is required because generated sitemap URLs +need deploy-owned origin policy. `ExtraURLs` adds build-time known URLs, and +`DynamicSitemap` lets generated apps serve request-time sitemap URLs from an +app-owned Go provider: + +```go +package app + +import ( + "github.com/cssbruno/gowdk" + "github.com/cssbruno/gowdk/addons/seo" +) + +var Config = gowdk.Config{ + Addons: []gowdk.Addon{ + seo.Addon(seo.Options{ + BaseURL: "https://example.com", + ExtraURLs: []seo.URL{ + {Loc: "/rss.xml"}, + }, + DynamicSitemap: seo.DynamicSitemap{ + ImportPath: "github.com/acme/site/sitemap", + Function: "DynamicURLs", + MaxURLs: 500, + CacheSeconds: 300, + }, + }), + }, +} +``` + +See [SEO Addon](seo.md) for `jsonld` page metadata, static sitemap rules, and +the dynamic provider signature. + ## Localization `I18N` declares locale-prefixed page output. When `Locales` is empty, route diff --git a/docs/reference/manifest.md b/docs/reference/manifest.md index 817136d5..523c40b1 100644 --- a/docs/reference/manifest.md +++ b/docs/reference/manifest.md @@ -105,9 +105,11 @@ Fields: - `route`: declared route path. - `render`: effective render mode after applying default `spa`. - `metadata`: optional page document metadata from `title`, `description`, - `canonical`, `image`, `robots`, `noindex`, `preload`, and `prefetch`. - `preload` and `prefetch` entries are arrays of `{ "href": "...", "as": - "..." }` objects; `as` is omitted when the source declaration did not set it. + `canonical`, `image`, `robots`, `noindex`, `preload`, `prefetch`, and + `jsonld`. `preload` and `prefetch` entries are arrays of `{ "href": "...", + "as": "..." }` objects; `as` is omitted when the source declaration did not + set it. `jsonld` lists supported structured-data schema kinds such as + `Article` or `WebPage`. - `layouts`: optional ordered layout references. Bare names are same-package or package-less layout IDs; qualified names such as `chrome.root` resolve through page `use chrome "package"` declarations. diff --git a/docs/reference/seo.md b/docs/reference/seo.md index de66f295..eec2a27f 100644 --- a/docs/reference/seo.md +++ b/docs/reference/seo.md @@ -73,3 +73,126 @@ When `Disallow` is empty, the file emits an empty `Disallow:` directive. Dynamic extra URLs can be supplied with `ExtraURLProvider` in normal Go config. The executable config bridge materializes those URLs before build output is generated. + +## Structured Data + +Pages can declare supported JSON-LD schema kinds with `jsonld` metadata: + +```gwdk +package pages + +route "/blog/launch" +guard public +title "Launch" +description "GOWDK launch notes" +canonical "https://example.com/blog/launch" +image "https://example.com/assets/launch.png" +jsonld Article + +build { + => { + headline: "Launch", + author: "Ada", + datePublished: "2026-06-22", + } +} + +view { + <main> + <h1>{headline}</h1> + </main> +} +``` + +Supported kinds today: + +- `WebPage` +- `Article` + +The compiler rejects unknown kinds with `invalid_structured_data` and duplicate +kinds on the same page with `duplicate_structured_data`. + +Generated HTML writes one deterministic, escaped +`<script type="application/ld+json">` block per declaration. GOWDK serializes +the JSON with Go's structured JSON encoder and escapes script-breaking +characters, so page data such as `<GOWDK>` is emitted safely. + +Payload fields are derived from page metadata first, then build data where the +schema needs page-specific values: + +- `WebPage`: `name`, `description`, `url`, and `image`. +- `Article`: `headline`, `description`, `url`, `image`, `datePublished`, and + `author`. + +For `Article`, build data keys `headline`, `author` or `authorName`, and +`datePublished`, `published`, or `date` populate the schema when present. + +Structured-data metadata is inspectable: + +- `gowdk manifest` includes page metadata as `"jsonld": ["Article"]`. +- `gowdk build` records a `seo` / `structured_data` event in + `gowdk-build-report.json` for each page with structured data. + +## Dynamic Sitemap Hook + +Build-time `sitemap.xml` intentionally includes only URLs known during the +build. Generated apps can also serve `/sitemap.xml` at request time by declaring +a dynamic sitemap provider: + +```go +package app + +import ( + "github.com/cssbruno/gowdk" + "github.com/cssbruno/gowdk/addons/seo" +) + +var Config = gowdk.Config{ + Addons: []gowdk.Addon{ + seo.Addon(seo.Options{ + BaseURL: "https://example.com", + DynamicSitemap: seo.DynamicSitemap{ + ImportPath: "github.com/acme/site/sitemap", + Function: "DynamicURLs", + MaxURLs: 500, + CacheSeconds: 300, + }, + }), + }, +} +``` + +Provider package: + +```go +package sitemap + +import ( + "context" + + "github.com/cssbruno/gowdk/runtime/seo" +) + +func DynamicURLs(ctx context.Context) ([]seo.URL, error) { + return []seo.URL{ + {Loc: "/products/widget", LastMod: "2026-06-22"}, + }, nil +} +``` + +The generated app imports the provider and registers `/sitemap.xml` before the +fallback page route. The runtime handler merges: + +- public build-time page URLs known to GOWDK; +- `ExtraURLs`; +- URLs returned by the dynamic provider. + +URLs are normalized against `BaseURL`, deduplicated, sorted, and serialized as +standard sitemap XML. `MaxURLs` caps provider output, and `CacheSeconds` +controls the successful response cache header. Provider errors or cap overflow +return `503` with `Cache-Control: no-store`; the error detail stays server-side. + +Guardless pages, non-public pages, and `noindex` pages remain excluded from the +GOWDK-owned static URL set. If an app wants request-time-only or database-owned +URLs in the sitemap, the provider must apply the app's own visibility policy +before returning them. diff --git a/examples/seo/blog-post.page.gwdk b/examples/seo/blog-post.page.gwdk index 2cb80f8a..d0f6f5b4 100644 --- a/examples/seo/blog-post.page.gwdk +++ b/examples/seo/blog-post.page.gwdk @@ -3,15 +3,22 @@ package seoexample page seo.blog route "/seo/blog/{slug}" guard public +title "SEO dynamic route" +description "Dynamic SPA paths can include Article structured data." +jsonld Article paths { => { slug: "hello-gowdk" } => { slug: "compile-first" } } +build { + => { headline: "SEO dynamic route", author: "GOWDK", datePublished: "2026-06-22" } +} + view { <main> - <h1>SEO dynamic route</h1> + <h1>{headline}</h1> <p>Dynamic SPA paths are included in sitemap.xml.</p> </main> } diff --git a/examples/seo/gowdk.config.go b/examples/seo/gowdk.config.go index 46118137..df4d2e59 100644 --- a/examples/seo/gowdk.config.go +++ b/examples/seo/gowdk.config.go @@ -16,6 +16,12 @@ var Config = gowdk.Config{ ExtraURLs: []seo.URL{ {Loc: "/rss.xml"}, }, + DynamicSitemap: seo.DynamicSitemap{ + ImportPath: "github.com/cssbruno/gowdk/examples/seo", + Function: "DynamicSitemapURLs", + MaxURLs: 25, + CacheSeconds: 300, + }, }), }, } diff --git a/examples/seo/site.page.gwdk b/examples/seo/site.page.gwdk index c5903fec..15e3c62f 100644 --- a/examples/seo/site.page.gwdk +++ b/examples/seo/site.page.gwdk @@ -3,6 +3,9 @@ package seoexample page seo.home route "/seo" guard public +title "SEO example" +description "Build-time sitemap, robots, and structured data output." +jsonld WebPage view { <main> diff --git a/examples/seo/sitemap.go b/examples/seo/sitemap.go new file mode 100644 index 00000000..64b904ad --- /dev/null +++ b/examples/seo/sitemap.go @@ -0,0 +1,13 @@ +package seoexample + +import ( + "context" + + "github.com/cssbruno/gowdk/runtime/seo" +) + +func DynamicSitemapURLs(ctx context.Context) ([]seo.URL, error) { + return []seo.URL{ + {Loc: "/seo/runtime-only", LastMod: "2026-06-22"}, + }, nil +} diff --git a/gowdk.go b/gowdk.go index 3de5f6d1..8863b224 100644 --- a/gowdk.go +++ b/gowdk.go @@ -6,6 +6,8 @@ import ( "strings" "time" "unicode" + + runtimeseo "github.com/cssbruno/gowdk/runtime/seo" ) // Config describes how a GOWDK application should be discovered, compiled, @@ -778,11 +780,20 @@ type AuthSessionProvider interface { // SEOURL describes one additional URL that an SEO addon can add to the // generated sitemap. Loc may be absolute or root-relative. -type SEOURL struct { - Loc string - LastMod string - ChangeFreq string - Priority string +type SEOURL = runtimeseo.URL + +// SEODynamicSitemap configures an app-owned request-time sitemap provider for +// generated binaries. ImportPath and Function name a Go function with the +// signature: +// +// func(context.Context) ([]seo.URL, error) +// +// The generated handler combines those URLs with build-time public URLs. +type SEODynamicSitemap struct { + ImportPath string + Function string + MaxURLs int + CacheSeconds int } // SEOOptions configures build-time sitemap.xml and robots.txt emission. @@ -791,6 +802,7 @@ type SEOOptions struct { Disallow []string ExtraURLs []SEOURL ExtraURLProvider func() []SEOURL `json:"-"` + DynamicSitemap SEODynamicSitemap } // SEOProvider is implemented by addons that can supply build-time SEO output diff --git a/internal/appgen/appgen_test.go b/internal/appgen/appgen_test.go index 04942c44..d43d401e 100644 --- a/internal/appgen/appgen_test.go +++ b/internal/appgen/appgen_test.go @@ -19,6 +19,7 @@ import ( "github.com/cssbruno/gowdk" authaddon "github.com/cssbruno/gowdk/addons/auth" + "github.com/cssbruno/gowdk/addons/seo" "github.com/cssbruno/gowdk/internal/compiler" "github.com/cssbruno/gowdk/internal/gwdkanalysis" "github.com/cssbruno/gowdk/internal/gwdkir" @@ -133,6 +134,56 @@ func TestGenerateWritesEmbeddedSPAApp(t *testing.T) { } } +func TestGenerateWritesDynamicSitemapRoute(t *testing.T) { + root := t.TempDir() + outputDir := filepath.Join(root, "dist") + appDir := filepath.Join(root, "generated-app") + writeTestFile(t, filepath.Join(outputDir, "index.html"), "<main>Home</main>") + writeTestFile(t, filepath.Join(outputDir, "sitemap.xml"), "<urlset></urlset>") + writeTestFile(t, filepath.Join(outputDir, "gowdk-assets.json"), `{"version":1}`) + + ir := gwdkir.Program{Pages: []gwdkir.Page{{ + ID: "home", + Route: "/", + Guards: []string{"public"}, + Blocks: gwdkir.Blocks{ + View: true, + ViewBody: `<main>Home</main>`, + }, + }}} + config := gowdk.Config{Addons: []gowdk.Addon{seo.Addon(seo.Options{ + BaseURL: "https://example.com", + DynamicSitemap: gowdk.SEODynamicSitemap{ + ImportPath: "github.com/acme/site/sitemap", + Function: "DynamicURLs", + MaxURLs: 25, + CacheSeconds: 60, + }, + })}} + result, err := GenerateWithOptions(outputDir, appDir, OptionsFromIR(config, &ir)) + if err != nil { + t.Fatal(err) + } + payload, err := os.ReadFile(result.PackagePath) + if err != nil { + t.Fatal(err) + } + source := string(payload) + for _, want := range []string{ + `gowdkseo "github.com/cssbruno/gowdk/runtime/seo"`, + `gowdkseositemap "github.com/acme/site/sitemap"`, + `mux.Handle("/sitemap.xml", gowdkseo.Handler(gowdkseo.HandlerOptions{BaseURL: "https://example.com", StaticURLs: []gowdkseo.URL{gowdkseo.URL{Loc: "/"}}, MaxDynamicURLs: 25, CacheSeconds: 60}, gowdkseositemap.DynamicURLs))`, + } { + if !strings.Contains(source, want) { + t.Fatalf("expected generated source to contain %q:\n%s", want, source) + } + } + assertSourceOrder(t, source, + `mux.Handle("/sitemap.xml", gowdkseo.Handler`, + `mux.Handle("/", gowdkruntime.ApplyMiddlewares`, + ) +} + func TestGenerateWiresConfiguredLifecycleServices(t *testing.T) { root := t.TempDir() outputDir := filepath.Join(root, "dist") diff --git a/internal/appgen/auto_routes.go b/internal/appgen/auto_routes.go index e3d8df81..d99a402e 100644 --- a/internal/appgen/auto_routes.go +++ b/internal/appgen/auto_routes.go @@ -43,11 +43,16 @@ func resolveOptions(outputDir string, options Options) (Options, error) { if err != nil { return Options{}, err } + sitemap, err := buildgen.RuntimeSitemapPlanFromIR(options.Config, ir) + if err != nil { + return Options{}, err + } resolved.Actions = append(append([]ActionEndpoint(nil), options.Actions...), actions...) resolved.APIs = append(append([]APIEndpoint(nil), options.APIs...), apis...) resolved.Fragments = append(append([]FragmentEndpoint(nil), options.Fragments...), fragments...) resolved.SSR = append(append([]SSRRoute(nil), options.SSR...), ssrRoutes(ssrArtifacts)...) + resolved.Sitemap = sitemap normalizeTraceSources(&resolved, filepath.Dir(outputDir), &ir) assignBackendAliases(&resolved) return resolved, nil diff --git a/internal/appgen/source.go b/internal/appgen/source.go index d3f5ae8c..e593d0fc 100644 --- a/internal/appgen/source.go +++ b/internal/appgen/source.go @@ -107,6 +107,10 @@ func runtimeImportMap(options Options) map[string]string { if generatedObservabilityEnabled(options) { imports["gowdktrace"] = "github.com/cssbruno/gowdk/runtime/trace" } + if generatedDynamicSitemapEnabled(options) { + imports["gowdkseo"] = "github.com/cssbruno/gowdk/runtime/seo" + imports["gowdkseositemap"] = strings.TrimSpace(options.Sitemap.Dynamic.ImportPath) + } if generatedRealtimeStreamUsesRouteMatching(options) { imports["gowdkroute"] = "github.com/cssbruno/gowdk/runtime/route" imports["neturl"] = "net/url" @@ -457,6 +461,9 @@ func newServeMuxDecl(options Options, embedded bool) ast.Decl { ) } stmts = append(stmts, define([]ast.Expr{id("mux")}, call(sel("http", "NewServeMux")))) + if embedded && generatedDynamicSitemapEnabled(options) { + stmts = append(stmts, exprStmt(call(selExpr(id("mux"), "Handle"), stringLit("/sitemap.xml"), dynamicSitemapHandlerExpr(options)))) + } if generatedRealtimeEnabled(options) { stmts = append(stmts, exprStmt(call(selExpr(id("mux"), "Handle"), id("RealtimeEventsPath"), call(id("realtimeEventsHandler"))))) } @@ -481,6 +488,55 @@ func newServeMuxDecl(options Options, embedded bool) ast.Decl { }, stmts) } +func generatedDynamicSitemapEnabled(options Options) bool { + if !options.Sitemap.Enabled { + return false + } + return strings.TrimSpace(options.Sitemap.Dynamic.ImportPath) != "" && strings.TrimSpace(options.Sitemap.Dynamic.Function) != "" +} + +func dynamicSitemapHandlerExpr(options Options) ast.Expr { + dynamic := options.Sitemap.Dynamic + fields := []ast.Expr{ + keyValue("BaseURL", stringLit(options.Sitemap.BaseURL)), + keyValue("StaticURLs", sitemapURLsExpr(options.Sitemap.StaticURLs)), + } + if dynamic.MaxURLs > 0 { + fields = append(fields, keyValue("MaxDynamicURLs", intLit(dynamic.MaxURLs))) + } + if dynamic.CacheSeconds > 0 { + fields = append(fields, keyValue("CacheSeconds", intLit(dynamic.CacheSeconds))) + } + return call(sel("gowdkseo", "Handler"), &ast.CompositeLit{ + Type: sel("gowdkseo", "HandlerOptions"), + Elts: fields, + }, sel("gowdkseositemap", strings.TrimSpace(dynamic.Function))) +} + +func sitemapURLsExpr(urls []gowdk.SEOURL) ast.Expr { + elts := make([]ast.Expr, 0, len(urls)) + for _, candidate := range urls { + fields := []ast.Expr{keyValue("Loc", stringLit(candidate.Loc))} + if strings.TrimSpace(candidate.LastMod) != "" { + fields = append(fields, keyValue("LastMod", stringLit(candidate.LastMod))) + } + if strings.TrimSpace(candidate.ChangeFreq) != "" { + fields = append(fields, keyValue("ChangeFreq", stringLit(candidate.ChangeFreq))) + } + if strings.TrimSpace(candidate.Priority) != "" { + fields = append(fields, keyValue("Priority", stringLit(candidate.Priority))) + } + elts = append(elts, &ast.CompositeLit{ + Type: sel("gowdkseo", "URL"), + Elts: fields, + }) + } + return &ast.CompositeLit{ + Type: &ast.ArrayType{Elt: sel("gowdkseo", "URL")}, + Elts: elts, + } +} + func needsBackendRouter(options Options, embedded bool) bool { if !hasBackendRoutes(options) { return false diff --git a/internal/appgen/types.go b/internal/appgen/types.go index 0a715877..acfb9adc 100644 --- a/internal/appgen/types.go +++ b/internal/appgen/types.go @@ -2,6 +2,7 @@ package appgen import ( "github.com/cssbruno/gowdk" + "github.com/cssbruno/gowdk/internal/buildgen" "github.com/cssbruno/gowdk/internal/gwdkir" "github.com/cssbruno/gowdk/internal/source" ) @@ -27,6 +28,7 @@ type Options struct { ProxyBackend bool Config gowdk.Config IR *gwdkir.Program + Sitemap buildgen.RuntimeSitemapPlan } // OptionsFromIR returns the production generator options for compiler IR-driven diff --git a/internal/buildgen/build.go b/internal/buildgen/build.go index de87c9c5..8363292c 100644 --- a/internal/buildgen/build.go +++ b/internal/buildgen/build.go @@ -360,6 +360,7 @@ func prepareBuildPlan(kind string, startMessage string, outputDir string, config }) reportAssetObfuscation(reporter, config.Build.ObfuscateAssets, planned.obfuscations) reportSkippedPrerenderPages(reporter, config, ir) + reportStructuredData(reporter, ir) return reporter, planned, nil } @@ -573,6 +574,28 @@ func reportQueryInvalidations(reporter *buildReporter, invalidations []gwdkir.Qu } } +func reportStructuredData(reporter *buildReporter, ir gwdkir.Program) { + for _, page := range ir.Pages { + if len(page.Metadata.Structured) == 0 { + continue + } + var kinds []string + for _, structured := range page.Metadata.Structured { + if kind := strings.TrimSpace(structured.Kind); kind != "" { + kinds = append(kinds, kind) + } + } + reporter.info("seo", "structured_data", "structured data metadata planned", BuildEvent{ + PageID: page.ID, + Route: page.Route, + Data: map[string]string{ + "kinds": strings.Join(kinds, ","), + "count": fmt.Sprint(len(kinds)), + }, + }) + } +} + func BuildIncremental(config gowdk.Config, sources gwdkanalysis.Sources, outputDir string, changedPageSources []string) (Result, error) { ir, bindings, err := compiler.AssembleProgram(config, sources) if err != nil { @@ -605,6 +628,7 @@ func buildIncrementalFromIR(config gowdk.Config, ir gwdkir.Program, backendBindi reportBackendBindings(reporter, backendBindings) reportContractReferences(reporter, ir.ContractRefs) reportRealtimeSubscriptions(reporter, ir.RealtimeSubscriptions) + reportStructuredData(reporter, ir) if err := compiler.ValidateBackendBindingPolicyIR(config, ir); err != nil { return Result{}, reporter.fail("bind", err) } diff --git a/internal/buildgen/build_report_test.go b/internal/buildgen/build_report_test.go index ca0bee41..c3865c14 100644 --- a/internal/buildgen/build_report_test.go +++ b/internal/buildgen/build_report_test.go @@ -317,6 +317,64 @@ func TestBuildWritesPageMetadataToSPAHTMLHead(t *testing.T) { ) } +func TestBuildWritesStructuredDataToSPAHTMLHead(t *testing.T) { + outputDir := t.TempDir() + app := gwdkanalysis.Sources{Pages: []gwdkir.Page{{ + ID: "post", + Route: "/blog/launch", + Guards: []string{"public"}, + Metadata: gwdkir.PageMetadata{ + Title: "Launch", + Description: "GOWDK launch notes", + Canonical: "https://gowdk.com/blog/launch", + Image: "https://gowdk.com/assets/launch.png", + Structured: []gwdkir.StructuredData{{Kind: "Article"}}, + }, + Blocks: gwdkir.Blocks{ + Build: true, + BuildBody: `=> { headline: "Launch <GOWDK>", author: "Ada", datePublished: "2026-06-22" }`, + View: true, + ViewBody: `<main><h1>{headline}</h1></main>`, + }, + }}} + + result, err := Build(gowdk.Config{}, app, outputDir) + if err != nil { + t.Fatal(err) + } + payload, err := os.ReadFile(filepath.Join(outputDir, "blog", "launch", "index.html")) + if err != nil { + t.Fatal(err) + } + output := string(payload) + for _, want := range []string{ + `<script type="application/ld+json">`, + `"@context":"https://schema.org"`, + `"@type":"Article"`, + `"headline":"Launch \u003cGOWDK\u003e"`, + `"author":{"@type":"Person","name":"Ada"}`, + `"datePublished":"2026-06-22"`, + `"url":"https://gowdk.com/blog/launch"`, + `</script>`, + } { + if !strings.Contains(output, want) { + t.Fatalf("expected %q in output:\n%s", want, output) + } + } + assertHTMLOrder(t, output, + `<meta name="twitter:image" content="https://gowdk.com/assets/launch.png">`, + `<script type="application/ld+json">`, + ) + event := findBuildReportEvent(result.Report, "seo", "structured_data") + if event == nil { + t.Fatalf("missing structured_data event in %#v", result.Report.Events) + } + if event.PageID != "post" || event.Route != "/blog/launch" || + event.Data["kinds"] != "Article" || event.Data["count"] != "1" { + t.Fatalf("unexpected structured_data event: %#v", event) + } +} + func TestBuildMemoryReturnsSPAArtifactsWithoutWriting(t *testing.T) { outputDir := filepath.Join(t.TempDir(), "dist") app := gwdkanalysis.Sources{Pages: []gwdkir.Page{{ diff --git a/internal/buildgen/render.go b/internal/buildgen/render.go index 57e81df8..9f9f61b8 100644 --- a/internal/buildgen/render.go +++ b/internal/buildgen/render.go @@ -73,7 +73,7 @@ func renderPage(config gowdk.Config, page gwdkir.Page, route string, components return "", ssrRegions{}, fmt.Errorf("%s: %w", page.ID, err) } regions := ssrRegions{Lists: convertSSRListSpecs(lists), Conds: convertSSRCondSpecs(conds)} - return document(config, page, body, stylesheets, storeSeeds, scripts, locale), regions, nil + return document(config, page, route, body, stylesheets, storeSeeds, scripts, locale, data), regions, nil } // ssrRegions carries the server-rendered g:for lists and g:if conditionals @@ -607,7 +607,7 @@ func storeSchemaHash(resolved gotypes.Struct, seedJSON string) string { return strconv.FormatUint(uint64(digest.Sum32()), 16) } -func document(config gowdk.Config, page gwdkir.Page, body string, stylesheets []gowdk.Stylesheet, storeSeeds []pageStoreSeed, scripts []gowdk.Script, locale string) string { +func document(config gowdk.Config, page gwdkir.Page, route string, body string, stylesheets []gowdk.Stylesheet, storeSeeds []pageStoreSeed, scripts []gowdk.Script, locale string, data map[string]string) string { title := page.ID if page.Metadata.Title != "" { title = page.Metadata.Title @@ -672,6 +672,9 @@ func document(config gowdk.Config, page gwdkir.Page, body string, stylesheets [] head = append(head, " <meta name=\"twitter:image\""+gowhtml.Attr("content", image)+">") } } + for _, payload := range structuredDataPayloads(page, route, title, image, data) { + head = append(head, " <script type=\"application/ld+json\">"+escapeScriptJSON(payload)+"</script>") + } for _, stylesheet := range nonEmptyStylesheets(stylesheets) { head = append(head, " <link rel=\"stylesheet\""+gowhtml.Attr("href", stylesheet.Href)+">") } @@ -720,6 +723,96 @@ func document(config gowdk.Config, page gwdkir.Page, body string, stylesheets [] "</html>\n" } +func structuredDataPayloads(page gwdkir.Page, route string, title string, image string, data map[string]string) []string { + if len(page.Metadata.Structured) == 0 { + return nil + } + payloads := make([]string, 0, len(page.Metadata.Structured)) + for _, item := range page.Metadata.Structured { + payload, ok := structuredDataPayload(page, route, title, image, data, item.Kind) + if ok { + payloads = append(payloads, payload) + } + } + return payloads +} + +func structuredDataPayload(page gwdkir.Page, route string, title string, image string, data map[string]string, kind string) (string, bool) { + node := map[string]any{ + "@context": "https://schema.org", + "@type": strings.TrimSpace(kind), + } + url := firstNonEmpty(page.Metadata.Canonical, route) + description := firstDataValue(data, "description", "summary") + if description == "" { + description = page.Metadata.Description + } + switch strings.TrimSpace(kind) { + case "WebPage": + node["name"] = firstDataValue(data, "name", "title") + if node["name"] == "" { + node["name"] = title + } + if description != "" { + node["description"] = description + } + if url != "" { + node["url"] = url + } + if image != "" { + node["image"] = image + } + case "Article": + node["headline"] = firstDataValue(data, "headline", "title") + if node["headline"] == "" { + node["headline"] = title + } + if description != "" { + node["description"] = description + } + if url != "" { + node["url"] = url + } + if image != "" { + node["image"] = image + } + if published := firstDataValue(data, "datePublished", "published", "date"); published != "" { + node["datePublished"] = published + } + if author := firstDataValue(data, "author", "authorName"); author != "" { + node["author"] = map[string]string{ + "@type": "Person", + "name": author, + } + } + default: + return "", false + } + payload, err := json.Marshal(node) + if err != nil { + return "", false + } + return string(payload), true +} + +func firstDataValue(data map[string]string, keys ...string) string { + for _, key := range keys { + if value := strings.TrimSpace(data[key]); value != "" { + return value + } + } + return "" +} + +func firstNonEmpty(values ...string) string { + for _, value := range values { + if strings.TrimSpace(value) != "" { + return strings.TrimSpace(value) + } + } + return "" +} + func nonEmptyScripts(scripts []gowdk.Script) []gowdk.Script { out := make([]gowdk.Script, 0, len(scripts)) for _, script := range scripts { diff --git a/internal/buildgen/seo.go b/internal/buildgen/seo.go index 3ccac489..0396fcc1 100644 --- a/internal/buildgen/seo.go +++ b/internal/buildgen/seo.go @@ -3,6 +3,8 @@ package buildgen import ( "encoding/xml" "fmt" + "go/ast" + "go/token" "net/url" "path/filepath" "sort" @@ -11,6 +13,7 @@ import ( "github.com/cssbruno/gowdk" "github.com/cssbruno/gowdk/internal/gwdkir" gowdkauth "github.com/cssbruno/gowdk/runtime/auth" + runtimeseo "github.com/cssbruno/gowdk/runtime/seo" ) type seoPlan struct { @@ -41,6 +44,13 @@ type seoExclusion struct { Mode string } +type RuntimeSitemapPlan struct { + Enabled bool + BaseURL string + StaticURLs []runtimeseo.URL + Dynamic gowdk.SEODynamicSitemap +} + func planSEOArtifacts(config gowdk.Config, ir gwdkir.Program, artifacts []Artifact) (seoPlan, error) { options, enabled, err := seoOptionsFromConfig(config) if err != nil || !enabled { @@ -71,6 +81,73 @@ func planSEOArtifacts(config gowdk.Config, ir gwdkir.Program, artifacts []Artifa }, nil } +func RuntimeSitemapPlanFromIR(config gowdk.Config, ir gwdkir.Program) (RuntimeSitemapPlan, error) { + options, enabled, err := seoOptionsFromConfig(config) + if err != nil || !enabled { + return RuntimeSitemapPlan{}, err + } + if _, err := parseSEOBaseURL(options.BaseURL); err != nil { + return RuntimeSitemapPlan{}, err + } + dynamic := options.DynamicSitemap + if err := validateDynamicSitemap(dynamic); err != nil { + return RuntimeSitemapPlan{}, err + } + publicPages := publicSEOPageIDs(ir) + var urls []runtimeseo.URL + for _, page := range ir.Pages { + if !publicPages[page.ID] || isRequestTimePage(config, page) { + continue + } + outputs, err := pageOutputs(config, page) + if err != nil { + return RuntimeSitemapPlan{}, fmt.Errorf("%s: %w", page.ID, err) + } + for _, output := range outputs { + urls = append(urls, runtimeseo.URL{Loc: output.route}) + } + } + for _, extra := range options.ExtraURLs { + urls = append(urls, runtimeseo.URL(extra)) + } + return RuntimeSitemapPlan{ + Enabled: true, + BaseURL: options.BaseURL, + StaticURLs: urls, + Dynamic: dynamic, + }, nil +} + +func validateDynamicSitemap(options gowdk.SEODynamicSitemap) error { + importPath := strings.TrimSpace(options.ImportPath) + function := strings.TrimSpace(options.Function) + if importPath == "" && function == "" { + return nil + } + if importPath == "" { + return fmt.Errorf("seo DynamicSitemap.ImportPath is required when Function is set") + } + if function == "" { + return fmt.Errorf("seo DynamicSitemap.Function is required when ImportPath is set") + } + if strings.ContainsAny(importPath, "\r\n") { + return fmt.Errorf("seo DynamicSitemap.ImportPath must stay on one line") + } + if strings.ContainsAny(function, "\r\n") || !token.IsIdentifier(function) { + return fmt.Errorf("seo DynamicSitemap.Function must be an exported function name") + } + if !ast.IsExported(function) { + return fmt.Errorf("seo DynamicSitemap.Function must be exported") + } + if options.MaxURLs < 0 { + return fmt.Errorf("seo DynamicSitemap.MaxURLs must be non-negative") + } + if options.CacheSeconds < 0 { + return fmt.Errorf("seo DynamicSitemap.CacheSeconds must be non-negative") + } + return nil +} + func seoOptionsFromConfig(config gowdk.Config) (gowdk.SEOOptions, bool, error) { var found bool var options gowdk.SEOOptions diff --git a/internal/buildgen/seo_test.go b/internal/buildgen/seo_test.go index 360cd5cd..5b0ab1a2 100644 --- a/internal/buildgen/seo_test.go +++ b/internal/buildgen/seo_test.go @@ -231,6 +231,103 @@ func TestBuildExcludesNoIndexRoutesFromSEOSitemap(t *testing.T) { } } +func TestRuntimeSitemapPlanIncludesStaticPublicURLsAndDynamicHook(t *testing.T) { + config := gowdk.Config{Addons: []gowdk.Addon{ + seo.Addon(seo.Options{ + BaseURL: "https://example.com/docs", + ExtraURLs: []seo.URL{{ + Loc: "/rss.xml", + ChangeFreq: "daily", + }}, + DynamicSitemap: gowdk.SEODynamicSitemap{ + ImportPath: "github.com/acme/site/seo", + Function: "DynamicURLs", + MaxURLs: 50, + CacheSeconds: 300, + }, + }), + ssr.Addon(), + }} + plan, err := RuntimeSitemapPlanFromIR(config, gwdkir.Program{Pages: []gwdkir.Page{ + seoHomePage(), + { + ID: "post", + Route: "/blog/{slug}", + Guards: []string{"public"}, + Blocks: gwdkir.Blocks{ + Paths: true, + PathsBody: `=> { slug: "hello" }`, + View: true, + ViewBody: `<main>Post</main>`, + }, + }, + { + ID: "dashboard", + Route: "/dashboard", + Render: gowdk.SSR, + Guards: []string{"public"}, + Blocks: gwdkir.Blocks{ + View: true, + ViewBody: `<main>Dashboard</main>`, + }, + }, + { + ID: "draft", + Route: "/draft", + Guards: []string{"public"}, + Metadata: gwdkir.PageMetadata{ + NoIndex: true, + }, + Blocks: gwdkir.Blocks{ + View: true, + ViewBody: `<main>Draft</main>`, + }, + }, + }}) + if err != nil { + t.Fatal(err) + } + if !plan.Enabled || plan.BaseURL != "https://example.com/docs" { + t.Fatalf("unexpected plan: %#v", plan) + } + if plan.Dynamic.ImportPath != "github.com/acme/site/seo" || plan.Dynamic.Function != "DynamicURLs" || plan.Dynamic.MaxURLs != 50 || plan.Dynamic.CacheSeconds != 300 { + t.Fatalf("unexpected dynamic hook: %#v", plan.Dynamic) + } + var locs []string + for _, url := range plan.StaticURLs { + locs = append(locs, url.Loc) + } + joined := strings.Join(locs, ",") + for _, expected := range []string{"/", "/blog/hello", "/rss.xml"} { + if !strings.Contains(joined, expected) { + t.Fatalf("expected %q in static runtime sitemap URLs: %#v", expected, locs) + } + } + for _, excluded := range []string{"/dashboard", "/draft"} { + if strings.Contains(joined, excluded) { + t.Fatalf("did not expect %q in static runtime sitemap URLs: %#v", excluded, locs) + } + } +} + +func TestRuntimeSitemapPlanRejectsPartialDynamicHook(t *testing.T) { + config := gowdk.Config{Addons: []gowdk.Addon{ + seo.Addon(seo.Options{ + BaseURL: "https://example.com", + DynamicSitemap: gowdk.SEODynamicSitemap{ + Function: "DynamicURLs", + }, + }), + }} + _, err := RuntimeSitemapPlanFromIR(config, gwdkir.Program{Pages: []gwdkir.Page{seoHomePage()}}) + if err == nil { + t.Fatal("expected partial dynamic sitemap hook to fail") + } + if !strings.Contains(err.Error(), "DynamicSitemap.ImportPath") { + t.Fatalf("unexpected error: %v", err) + } +} + func TestBuildMemoryCollectsSEOArtifacts(t *testing.T) { config := gowdk.Config{Addons: []gowdk.Addon{seo.Addon(seo.Options{BaseURL: "https://example.com"})}} app := gwdkanalysis.Sources{Pages: []gwdkir.Page{seoHomePage()}} diff --git a/internal/compiler/validate_page.go b/internal/compiler/validate_page.go index 9e40862c..80e6eb70 100644 --- a/internal/compiler/validate_page.go +++ b/internal/compiler/validate_page.go @@ -21,6 +21,7 @@ func ValidatePage(config gowdk.Config, page gwdkir.Page) []ValidationError { diagnostics = append(diagnostics, validateProtectedPageGuardRender(page, mode)...) diagnostics = append(diagnostics, validatePageStores(page)...) diagnostics = append(diagnostics, validatePageCachePolicy(page)...) + diagnostics = append(diagnostics, validatePageStructuredData(page)...) diagnostics = append(diagnostics, validatePageContractClient(page, mode)...) for _, action := range page.Blocks.Actions { if !isExportedHandlerName(action.Name) { @@ -204,6 +205,52 @@ func ValidatePage(config gowdk.Config, page gwdkir.Page) []ValidationError { return normalizeValidationErrors(diagnostics) } +func validatePageStructuredData(page gwdkir.Page) []ValidationError { + if len(page.Metadata.Structured) == 0 { + return nil + } + supported := map[string]bool{ + "Article": true, + "WebPage": true, + } + seen := map[string]source.NamedSpan{} + var diagnostics []ValidationError + for index, item := range page.Metadata.Structured { + kind := strings.TrimSpace(item.Kind) + span := firstStructuredDataSpan(page, index) + if !supported[kind] { + diagnostics = append(diagnostics, ValidationError{ + Code: "invalid_structured_data", + PageID: page.ID, + Source: page.Source, + Span: span.Span, + Message: fmt.Sprintf("%s declares unsupported jsonld kind %q; supported kinds are Article and WebPage", page.ID, kind), + }) + continue + } + if first, ok := seen[kind]; ok { + diagnostics = append(diagnostics, ValidationError{ + Code: "duplicate_structured_data", + PageID: page.ID, + Source: page.Source, + Span: span.Span, + Related: []source.RelatedSpan{{Source: page.Source, Span: first.Span, Message: "first declaration"}}, + Message: fmt.Sprintf("%s declares duplicate jsonld kind %q; keep one declaration per kind", page.ID, kind), + }) + continue + } + seen[kind] = span + } + return diagnostics +} + +func firstStructuredDataSpan(page gwdkir.Page, index int) source.NamedSpan { + if index >= 0 && index < len(page.Spans.Structured) { + return page.Spans.Structured[index] + } + return source.NamedSpan{Span: firstSpan(page.Spans.Page, page.Spans.Route)} +} + func validatePageGuards(page gwdkir.Page) []ValidationError { if len(page.Guards) == 0 { // A guardless page route is denied (403) at request time, so warning is diff --git a/internal/compiler/validate_test.go b/internal/compiler/validate_test.go index 675b3dba..3fb0d8ea 100644 --- a/internal/compiler/validate_test.go +++ b/internal/compiler/validate_test.go @@ -5469,6 +5469,59 @@ func TestValidatePageRejectsDuplicateCSSSelection(t *testing.T) { } } +func TestValidatePageRejectsUnsupportedStructuredDataKind(t *testing.T) { + diagnostics := ValidatePage(gowdk.Config{}, irPage(gwdkir.Page{ + ID: "home", + Route: "/", + Guards: []string{"public"}, + Metadata: gwdkir.PageMetadata{ + Structured: []gwdkir.StructuredData{{Kind: "Recipe"}}, + }, + Spans: gwdkir.PageSpans{ + Structured: []source.NamedSpan{{Name: "Recipe", Span: span(4, 1, 14)}}, + }, + Blocks: gwdkir.Blocks{ + View: true, + ViewBody: `<main>Home</main>`, + }, + })) + diagnostic := firstDiagnostic(diagnostics, "invalid_structured_data") + if diagnostic == nil { + t.Fatalf("expected invalid structured-data diagnostic, got %#v", diagnostics) + } + if diagnostic.Span.Start.Line != 4 { + t.Fatalf("unexpected diagnostic span: %#v", diagnostic.Span) + } +} + +func TestValidatePageRejectsDuplicateStructuredDataKind(t *testing.T) { + diagnostics := ValidatePage(gowdk.Config{}, irPage(gwdkir.Page{ + ID: "home", + Route: "/", + Guards: []string{"public"}, + Metadata: gwdkir.PageMetadata{ + Structured: []gwdkir.StructuredData{{Kind: "Article"}, {Kind: "Article"}}, + }, + Spans: gwdkir.PageSpans{ + Structured: []source.NamedSpan{ + {Name: "Article", Span: span(4, 1, 15)}, + {Name: "Article", Span: span(5, 1, 15)}, + }, + }, + Blocks: gwdkir.Blocks{ + View: true, + ViewBody: `<main>Home</main>`, + }, + })) + diagnostic := firstDiagnostic(diagnostics, "duplicate_structured_data") + if diagnostic == nil { + t.Fatalf("expected duplicate structured-data diagnostic, got %#v", diagnostics) + } + if diagnostic.Span.Start.Line != 5 || len(diagnostic.Related) != 1 || diagnostic.Related[0].Span.Start.Line != 4 { + t.Fatalf("unexpected duplicate diagnostic locations: %#v", diagnostic) + } +} + func hasDiagnosticCode(diagnostics []ValidationError, code string) bool { for _, diagnostic := range diagnostics { if diagnostic.Code == code { diff --git a/internal/diagnostics/registry.go b/internal/diagnostics/registry.go index 7fb4e54e..f6565ea6 100644 --- a/internal/diagnostics/registry.go +++ b/internal/diagnostics/registry.go @@ -140,6 +140,7 @@ var Registry = []Code{ {Code: "duplicate_revalidate_policy", Area: "cache", Stability: StabilityStable, Severity: SeverityError, Summary: "page combines revalidate with a cache policy that already declares stale-while-revalidate"}, {Code: "duplicate_route", Area: "routing", Stability: StabilityStable, Severity: SeverityError, Summary: "page route pattern is duplicated"}, {Code: "duplicate_route_param", Area: "routing", Stability: StabilityStable, Severity: SeverityError, Summary: "route declares the same param more than once"}, + {Code: "duplicate_structured_data", Area: "seo", Stability: StabilityExperimental, Severity: SeverityError, Summary: "page declares the same structured-data kind more than once"}, {Code: "empty_link_text", Area: "accessibility", Stability: StabilityStable, Severity: SeverityWarning, Summary: "link with href has no accessible text"}, {Code: "env_name_required", Area: "config", Stability: StabilityStable, Severity: SeverityError, Summary: "environment variable contract entry is missing a name"}, {Code: "generated_app_import_cycle", Area: "generated-go", Stability: StabilityStable, Severity: SeverityError, Summary: "generated app would import itself through user code"}, @@ -158,6 +159,7 @@ var Registry = []Code{ {Code: "invalid_go_block", Area: "go-block", Stability: StabilityExperimental, Severity: SeverityError, Summary: "inline Go block does not parse as valid Go"}, {Code: "invalid_go_endpoint_handler", Area: "backend", Stability: StabilityStable, Severity: SeverityError, Summary: "Go endpoint comment is not attached to an exported package-level function"}, {Code: "invalid_go_import", Area: "packages", Stability: StabilityStable, Severity: SeverityError, Summary: "GOWDK source Go import declaration is invalid"}, + {Code: "invalid_structured_data", Area: "seo", Stability: StabilityExperimental, Severity: SeverityError, Summary: "page structured-data metadata uses an unsupported kind"}, {Code: "layout_self_reference", Area: "layouts", Stability: StabilityStable, Severity: SeverityError, Summary: "layout lists itself in layout; a layout cannot inherit from itself"}, {Code: "layout_slot_count", Area: "layouts", Stability: StabilityStable, Severity: SeverityError, Summary: "layout must contain exactly one <slot /> placeholder"}, {Code: "malformed_go_endpoint_comment", Area: "backend", Stability: StabilityStable, Severity: SeverityError, Summary: "Go endpoint comment uses an unsupported //gowdk shape"}, diff --git a/internal/gwdkir/ir.go b/internal/gwdkir/ir.go index ef430992..4e56dbf4 100644 --- a/internal/gwdkir/ir.go +++ b/internal/gwdkir/ir.go @@ -127,6 +127,11 @@ type PageMetadata struct { NoIndex bool Preload []HeadResource Prefetch []HeadResource + Structured []StructuredData +} + +type StructuredData struct { + Kind string } type HeadResource struct { @@ -197,6 +202,7 @@ type PageSpans struct { NoIndex source.SourceSpan Preload []source.NamedSpan Prefetch []source.NamedSpan + Structured []source.NamedSpan Layouts []source.NamedSpan Guard []source.NamedSpan CSS []source.NamedSpan diff --git a/internal/lang/conformance_coverage_test.go b/internal/lang/conformance_coverage_test.go index 591fe9df..cbee269c 100644 --- a/internal/lang/conformance_coverage_test.go +++ b/internal/lang/conformance_coverage_test.go @@ -89,6 +89,7 @@ var integrationCoverage = map[string]string{ "image": "../compiler/validate_test.go", "robots": "../parser/page_test.go", "noindex": "../parser/page_test.go", + "jsonld": "../parser/page_test.go", "preload": "../parser/page_test.go", "prefetch": "../parser/page_test.go", "layout": "../compiler/validate_test.go", diff --git a/internal/lang/manifest_json.go b/internal/lang/manifest_json.go index f5dad919..6ca018fc 100644 --- a/internal/lang/manifest_json.go +++ b/internal/lang/manifest_json.go @@ -88,6 +88,7 @@ type metadataJSON struct { NoIndex bool `json:"noindex,omitempty"` Preload []headResourceJSON `json:"preload,omitempty"` Prefetch []headResourceJSON `json:"prefetch,omitempty"` + Structured []string `json:"jsonld,omitempty"` } type headResourceJSON struct { @@ -264,7 +265,7 @@ func marshalManifestJSON(result CheckResult, defaultMode gowdk.RenderMode) ([]by func metadataJSONFor(metadata gwdkir.PageMetadata) *metadataJSON { if metadata.Title == "" && metadata.Description == "" && metadata.Canonical == "" && metadata.Image == "" && - metadata.Robots == "" && !metadata.NoIndex && len(metadata.Preload) == 0 && len(metadata.Prefetch) == 0 { + metadata.Robots == "" && !metadata.NoIndex && len(metadata.Preload) == 0 && len(metadata.Prefetch) == 0 && len(metadata.Structured) == 0 { return nil } return &metadataJSON{ @@ -276,9 +277,21 @@ func metadataJSONFor(metadata gwdkir.PageMetadata) *metadataJSON { NoIndex: metadata.NoIndex, Preload: headResourcesJSON(metadata.Preload), Prefetch: headResourcesJSON(metadata.Prefetch), + Structured: structuredDataJSON(metadata.Structured), } } +func structuredDataJSON(items []gwdkir.StructuredData) []string { + if len(items) == 0 { + return nil + } + out := make([]string, 0, len(items)) + for _, item := range items { + out = append(out, item.Kind) + } + return out +} + func headResourcesJSON(resources []gwdkir.HeadResource) []headResourceJSON { if len(resources) == 0 { return nil diff --git a/internal/parser/metadata.go b/internal/parser/metadata.go index f6efb15a..86ce4c3c 100644 --- a/internal/parser/metadata.go +++ b/internal/parser/metadata.go @@ -116,6 +116,13 @@ func applyMetadata(page *gwdkir.Page, name, rawValue string, lineNumber int, raw } page.Metadata.Prefetch = append(page.Metadata.Prefetch, resource) page.Spans.Prefetch = append(page.Spans.Prefetch, source.NamedSpan{Name: resource.Href, Span: span}) + case "jsonld": + kind, err := metadataText(name, value) + if err != nil { + return err + } + page.Metadata.Structured = append(page.Metadata.Structured, gwdkir.StructuredData{Kind: kind}) + page.Spans.Structured = append(page.Spans.Structured, source.NamedSpan{Name: kind, Span: span}) case "guard": if value == "" { return fmt.Errorf("guard requires a value") diff --git a/internal/parser/page_test.go b/internal/parser/page_test.go index f8b487a3..f9c7b97e 100644 --- a/internal/parser/page_test.go +++ b/internal/parser/page_test.go @@ -347,6 +347,7 @@ robots "index,follow" noindex false preload "/assets/app.css" as "style" prefetch "/docs" +jsonld Article view { <main>Home</main> @@ -376,8 +377,12 @@ view { if len(page.Metadata.Prefetch) != 1 || page.Metadata.Prefetch[0].Href != "/docs" || page.Metadata.Prefetch[0].As != "" { t.Fatalf("unexpected prefetch metadata: %#v", page.Metadata.Prefetch) } + if len(page.Metadata.Structured) != 1 || page.Metadata.Structured[0].Kind != "Article" { + t.Fatalf("unexpected structured metadata: %#v", page.Metadata.Structured) + } if page.Spans.Title.Start.Line != 4 || page.Spans.Description.Start.Line != 5 || page.Spans.Canonical.Start.Line != 6 || page.Spans.Image.Start.Line != 7 || - page.Spans.Robots.Start.Line != 8 || page.Spans.NoIndex.Start.Line != 9 || page.Spans.Preload[0].Span.Start.Line != 10 || page.Spans.Prefetch[0].Span.Start.Line != 11 { + page.Spans.Robots.Start.Line != 8 || page.Spans.NoIndex.Start.Line != 9 || page.Spans.Preload[0].Span.Start.Line != 10 || page.Spans.Prefetch[0].Span.Start.Line != 11 || + page.Spans.Structured[0].Span.Start.Line != 12 { t.Fatalf("unexpected metadata spans: %#v", page.Spans) } } diff --git a/internal/parser/patterns.go b/internal/parser/patterns.go index 2d2540d7..135d52a4 100644 --- a/internal/parser/patterns.go +++ b/internal/parser/patterns.go @@ -130,7 +130,7 @@ func parseMetadataLine(line string) []string { func isMetadataKeyword(name string) bool { switch name { - case "page", "route", "title", "description", "canonical", "image", "robots", "noindex", "preload", "prefetch", "layout", "cache", "revalidate", "error", "guard", "css", "component", "wasm", "asset": + case "page", "route", "title", "description", "canonical", "image", "robots", "noindex", "preload", "prefetch", "jsonld", "layout", "cache", "revalidate", "error", "guard", "css", "component", "wasm", "asset": return true default: return false diff --git a/internal/project/config.go b/internal/project/config.go index dd4c052f..400ade9c 100644 --- a/internal/project/config.go +++ b/internal/project/config.go @@ -1270,6 +1270,12 @@ func parseSEOOptions(expression ast.Expr, imports map[string]string) (seo.Option return seo.Options{}, false } options.ExtraURLs = values + case "DynamicSitemap": + value, ok := parseSEODynamicSitemap(field.Value, imports) + if !ok { + return seo.Options{}, false + } + options.DynamicSitemap = value default: return seo.Options{}, false } @@ -1358,6 +1364,50 @@ func isSEOURLType(expression ast.Expr, imports map[string]string) bool { return ok && imports[packageName.Name] == seo.ImportPath } +func parseSEODynamicSitemap(expression ast.Expr, imports map[string]string) (gowdk.SEODynamicSitemap, bool) { + literal, ok := expression.(*ast.CompositeLit) + if !ok || !isSEODynamicSitemapType(literal.Type, imports) { + return gowdk.SEODynamicSitemap{}, false + } + fields, ok := strictConfigLiteralFields(expression) + if !ok { + return gowdk.SEODynamicSitemap{}, false + } + var dynamic gowdk.SEODynamicSitemap + for _, field := range fields { + switch field.Name { + case "ImportPath": + value, ok := parseLiteralString(field.Value) + if !ok { + return gowdk.SEODynamicSitemap{}, false + } + dynamic.ImportPath = value + case "Function": + value, ok := parseLiteralString(field.Value) + if !ok { + return gowdk.SEODynamicSitemap{}, false + } + dynamic.Function = value + case "MaxURLs": + dynamic.MaxURLs = parseInt(field.Value) + case "CacheSeconds": + dynamic.CacheSeconds = parseInt(field.Value) + default: + return gowdk.SEODynamicSitemap{}, false + } + } + return dynamic, true +} + +func isSEODynamicSitemapType(expression ast.Expr, imports map[string]string) bool { + selector, ok := expression.(*ast.SelectorExpr) + if !ok || selector.Sel.Name != "DynamicSitemap" { + return false + } + packageName, ok := selector.X.(*ast.Ident) + return ok && imports[packageName.Name] == seo.ImportPath +} + func parseTailwindAddon(expression ast.Expr, imports map[string]string) (gowdk.Addon, bool) { call, ok := expression.(*ast.CallExpr) if !ok { diff --git a/internal/project/config_test.go b/internal/project/config_test.go index 1b41f832..81aec167 100644 --- a/internal/project/config_test.go +++ b/internal/project/config_test.go @@ -953,6 +953,12 @@ var Config = gowdk.Config{ ExtraURLs: []seoaddon.URL{ {Loc: "/rss.xml", LastMod: "2026-06-14", ChangeFreq: "daily", Priority: "0.8"}, }, + DynamicSitemap: seoaddon.DynamicSitemap{ + ImportPath: "example.com/site/sitemap", + Function: "DynamicURLs", + MaxURLs: 25, + CacheSeconds: 60, + }, }), }, } @@ -978,6 +984,10 @@ var Config = gowdk.Config{ if len(options.ExtraURLs) != 1 || options.ExtraURLs[0].Loc != "/rss.xml" || options.ExtraURLs[0].Priority != "0.8" { t.Fatalf("unexpected SEO extra URLs: %#v", options.ExtraURLs) } + if options.DynamicSitemap.ImportPath != "example.com/site/sitemap" || options.DynamicSitemap.Function != "DynamicURLs" || + options.DynamicSitemap.MaxURLs != 25 || options.DynamicSitemap.CacheSeconds != 60 { + t.Fatalf("unexpected dynamic sitemap options: %#v", options.DynamicSitemap) + } } func TestLoadConfigFileFallsBackForDynamicSEOOptions(t *testing.T) { diff --git a/internal/syntax/keywords.go b/internal/syntax/keywords.go index 67ae1731..88a550f5 100644 --- a/internal/syntax/keywords.go +++ b/internal/syntax/keywords.go @@ -16,6 +16,7 @@ var MetadataKeywords = []string{ "noindex", "preload", "prefetch", + "jsonld", "layout", "cache", "revalidate", diff --git a/runtime/seo/seo.go b/runtime/seo/seo.go new file mode 100644 index 00000000..9a4c8cc2 --- /dev/null +++ b/runtime/seo/seo.go @@ -0,0 +1,206 @@ +package seo + +import ( + "context" + "encoding/xml" + "fmt" + "net/http" + "net/url" + "sort" + "strings" +) + +const defaultMaxDynamicURLs = 1000 + +// URL describes one sitemap URL. Loc may be absolute or root-relative before +// normalization. +type URL struct { + Loc string + LastMod string + ChangeFreq string + Priority string +} + +// Provider supplies request-time sitemap URLs owned by application code. +type Provider func(context.Context) ([]URL, error) + +// HandlerOptions configures a generated sitemap handler. +type HandlerOptions struct { + BaseURL string + StaticURLs []URL + MaxDynamicURLs int + CacheSeconds int +} + +type urlEntry struct { + Loc string `xml:"loc"` + LastMod string `xml:"lastmod,omitempty"` + ChangeFreq string `xml:"changefreq,omitempty"` + Priority string `xml:"priority,omitempty"` +} + +type urlSet struct { + XMLName xml.Name `xml:"urlset"` + XMLNS string `xml:"xmlns,attr"` + URLs []urlEntry `xml:"url"` +} + +// Handler returns an HTTP handler that merges generated static URLs with an +// optional app-owned provider. Provider errors return a generic unavailable +// response and do not expose application error text. +func Handler(options HandlerOptions, provider Provider) http.Handler { + return http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) { + if request.Method != http.MethodGet && request.Method != http.MethodHead { + response.Header().Set("Allow", "GET, HEAD") + http.Error(response, "method not allowed", http.StatusMethodNotAllowed) + return + } + urls := append([]URL(nil), options.StaticURLs...) + if provider != nil { + dynamic, err := provider(request.Context()) + if err != nil { + writeUnavailable(response) + return + } + limit := options.MaxDynamicURLs + if limit <= 0 { + limit = defaultMaxDynamicURLs + } + if len(dynamic) > limit { + writeUnavailable(response) + return + } + urls = append(urls, dynamic...) + } + payload, err := Sitemap(options.BaseURL, urls) + if err != nil { + writeUnavailable(response) + return + } + response.Header().Set("Content-Type", "application/xml; charset=utf-8") + if options.CacheSeconds > 0 { + response.Header().Set("Cache-Control", fmt.Sprintf("public, max-age=%d", options.CacheSeconds)) + } else { + response.Header().Set("Cache-Control", "no-store") + } + response.WriteHeader(http.StatusOK) + if request.Method != http.MethodHead { + _, _ = response.Write(payload) + } + }) +} + +func writeUnavailable(response http.ResponseWriter) { + response.Header().Set("Cache-Control", "no-store") + http.Error(response, "sitemap unavailable", http.StatusServiceUnavailable) +} + +// Sitemap normalizes, de-duplicates, sorts, and serializes sitemap URLs. +func Sitemap(baseURL string, urls []URL) ([]byte, error) { + base, err := ParseBaseURL(baseURL) + if err != nil { + return nil, err + } + entries, err := normalizeURLs(base, urls) + if err != nil { + return nil, err + } + payload, err := xml.MarshalIndent(urlSet{ + XMLNS: "http://www.sitemaps.org/schemas/sitemap/0.9", + URLs: entries, + }, "", " ") + if err != nil { + return nil, err + } + out := append([]byte(xml.Header), payload...) + out = append(out, '\n') + return out, nil +} + +func normalizeURLs(base *url.URL, urls []URL) ([]urlEntry, error) { + seen := map[string]bool{} + entries := make([]urlEntry, 0, len(urls)) + for _, candidate := range urls { + loc := strings.TrimSpace(candidate.Loc) + if loc == "" { + return nil, fmt.Errorf("sitemap URL loc is required") + } + absolute, err := NormalizeURL(base, loc) + if err != nil { + return nil, err + } + if seen[absolute] { + continue + } + seen[absolute] = true + entries = append(entries, urlEntry{ + Loc: absolute, + LastMod: strings.TrimSpace(candidate.LastMod), + ChangeFreq: strings.TrimSpace(candidate.ChangeFreq), + Priority: strings.TrimSpace(candidate.Priority), + }) + } + sort.Slice(entries, func(i, j int) bool { + return entries[i].Loc < entries[j].Loc + }) + return entries, nil +} + +// ParseBaseURL validates the configured site base URL. +func ParseBaseURL(value string) (*url.URL, error) { + raw := strings.TrimSpace(value) + if raw == "" { + return nil, fmt.Errorf("seo BaseURL is required") + } + parsed, err := url.Parse(raw) + if err != nil { + return nil, fmt.Errorf("seo BaseURL is invalid: %w", err) + } + if (parsed.Scheme != "http" && parsed.Scheme != "https") || parsed.Host == "" { + return nil, fmt.Errorf("seo BaseURL must be an absolute http or https URL") + } + parsed.RawQuery = "" + parsed.Fragment = "" + return parsed, nil +} + +// NormalizeURL validates one sitemap URL and returns its absolute form. +func NormalizeURL(base *url.URL, loc string) (string, error) { + parsed, err := url.Parse(loc) + if err != nil { + return "", fmt.Errorf("sitemap URL %q is invalid: %w", loc, err) + } + if parsed.IsAbs() { + if (parsed.Scheme != "http" && parsed.Scheme != "https") || parsed.Host == "" { + return "", fmt.Errorf("sitemap URL %q must be an absolute http(s) URL or a root-relative path", loc) + } + parsed.RawQuery = "" + parsed.Fragment = "" + return parsed.String(), nil + } + if !strings.HasPrefix(loc, "/") { + return "", fmt.Errorf("sitemap URL %q must be absolute or root-relative", loc) + } + return AbsoluteURL(base, loc), nil +} + +// AbsoluteURL joins a root-relative route under the configured base URL. +func AbsoluteURL(base *url.URL, route string) string { + resolved := *base + resolved.RawQuery = "" + resolved.Fragment = "" + resolved.RawPath = "" + + basePath := strings.TrimRight(resolved.Path, "/") + routePath := "/" + strings.TrimLeft(route, "/") + if routePath == "/" { + if basePath == "" { + resolved.Path = "/" + } else { + resolved.Path = basePath + "/" + } + return resolved.String() + } + resolved.Path = basePath + routePath + return resolved.String() +} diff --git a/runtime/seo/seo_test.go b/runtime/seo/seo_test.go new file mode 100644 index 00000000..97d1ca2b --- /dev/null +++ b/runtime/seo/seo_test.go @@ -0,0 +1,92 @@ +package seo + +import ( + "context" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestSitemapNormalizesSortsAndDeduplicatesURLs(t *testing.T) { + payload, err := Sitemap("https://example.com/docs?ignored=1#top", []URL{ + {Loc: "/b", LastMod: " 2026-06-01 "}, + {Loc: "https://example.com/a?x=1#fragment", ChangeFreq: " daily "}, + {Loc: "/b"}, + }) + if err != nil { + t.Fatal(err) + } + text := string(payload) + assertContains(t, text, `<loc>https://example.com/a</loc>`) + assertContains(t, text, `<changefreq>daily</changefreq>`) + assertContains(t, text, `<loc>https://example.com/docs/b</loc>`) + assertContains(t, text, `<lastmod>2026-06-01</lastmod>`) + if strings.Count(text, `<loc>`) != 2 { + t.Fatalf("expected two unique URLs, got:\n%s", text) + } +} + +func TestSitemapRejectsInvalidURL(t *testing.T) { + if _, err := Sitemap("https://example.com", []URL{{Loc: "relative/path"}}); err == nil { + t.Fatal("expected relative sitemap URL to fail") + } +} + +func TestHandlerMergesDynamicURLs(t *testing.T) { + handler := Handler(HandlerOptions{ + BaseURL: "https://example.com", + StaticURLs: []URL{{Loc: "/static"}}, + }, func(context.Context) ([]URL, error) { + return []URL{{Loc: "/dynamic"}}, nil + }) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/sitemap.xml", nil)) + + if recorder.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", recorder.Code, recorder.Body.String()) + } + assertContains(t, recorder.Body.String(), "https://example.com/static") + assertContains(t, recorder.Body.String(), "https://example.com/dynamic") + if cache := recorder.Header().Get("Cache-Control"); cache != "no-store" { + t.Fatalf("unexpected cache header: %q", cache) + } +} + +func TestHandlerRejectsProviderOverflow(t *testing.T) { + handler := Handler(HandlerOptions{ + BaseURL: "https://example.com", + MaxDynamicURLs: 1, + }, func(context.Context) ([]URL, error) { + return []URL{{Loc: "/one"}, {Loc: "/two"}}, nil + }) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/sitemap.xml", nil)) + + if recorder.Code != http.StatusServiceUnavailable { + t.Fatalf("status = %d, body = %s", recorder.Code, recorder.Body.String()) + } + if strings.Contains(recorder.Body.String(), "/one") { + t.Fatalf("overflow response leaked sitemap data: %s", recorder.Body.String()) + } +} + +func TestHandlerRejectsUnsupportedMethod(t *testing.T) { + handler := Handler(HandlerOptions{BaseURL: "https://example.com"}, nil) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, httptest.NewRequest(http.MethodPost, "/sitemap.xml", nil)) + + if recorder.Code != http.StatusMethodNotAllowed { + t.Fatalf("status = %d", recorder.Code) + } + if allow := recorder.Header().Get("Allow"); allow != "GET, HEAD" { + t.Fatalf("unexpected allow header: %q", allow) + } +} + +func assertContains(t *testing.T, value, want string) { + t.Helper() + if !strings.Contains(value, want) { + t.Fatalf("expected %q in:\n%s", want, value) + } +} diff --git a/scripts/check-docs-style.sh b/scripts/check-docs-style.sh new file mode 100755 index 00000000..366a0bf5 --- /dev/null +++ b/scripts/check-docs-style.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env sh +set -eu + +# Small Markdown authoring checks for the docs rendered by docs-site. +# Link/anchor correctness stays in scripts/check-docs-links.sh. + +repo_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +cd "${repo_root}" + +status=0 +files=$(find README.md docs docs-site/README.md -type f -name '*.md' 2>/dev/null | sort) + +for file in ${files}; do + if ! awk -v file="${file}" ' + function flush_para() { + if (para_words > 140) { + printf "%s:%d: warning: long prose paragraph has %d words\n", file, para_start, para_words > "/dev/stderr" + } + para_words = 0 + para_start = 0 + } + function heading_level(line) { + match(line, /^#+/) + return RLENGTH + } + BEGIN { + inside_fence = 0 + last_heading = 0 + bad = 0 + } + /^```/ { + flush_para() + if (!inside_fence) { + if ($0 ~ /^```[[:space:]]*$/) { + printf "%s:%d: fenced code block must declare a language\n", file, FNR > "/dev/stderr" + bad = 1 + } + inside_fence = 1 + } else { + inside_fence = 0 + } + next + } + inside_fence { next } + /^#{1,6}[[:space:]]/ { + flush_para() + level = heading_level($0) + if (last_heading > 0 && level > last_heading + 1) { + printf "%s:%d: skipped heading level H%d -> H%d\n", file, FNR, last_heading, level > "/dev/stderr" + bad = 1 + } + last_heading = level + next + } + /^[[:space:]]*$/ || /^[[:space:]]*[-*+][[:space:]]/ || /^[[:space:]]*[0-9]+\.[[:space:]]/ || /^[[:space:]]*[>|]/ { + flush_para() + next + } + { + if (!para_start) { + para_start = FNR + } + para_words += NF + } + END { + flush_para() + exit bad + } + ' "${file}"; then + status=1 + fi +done + +if [ "${status}" -ne 0 ]; then + cat >&2 <<'EOF' +Docs style check failed. +Use language-tagged fenced code blocks such as ```gwdk, ```go, ```sh, or +```text, and keep headings in order without skipping levels. +EOF + exit 1 +fi + +echo "docs style ok" From c1ceeefdcdabd2eab61b27a2665aeb3df13246ce Mon Sep 17 00:00:00 2001 From: Bruno Carvalho <bruno.cs.soares@gmail.com> Date: Mon, 22 Jun 2026 15:05:11 -0300 Subject: [PATCH 2/2] address pr review feedback --- cmd/gowdk/main_test.go | 25 +++++++++++++++ cmd/gowdk/test.go | 26 ++++++++++++++- internal/appgen/appgen_test.go | 17 ++++++++++ internal/appgen/module.go | 3 ++ internal/buildgen/seo.go | 13 +++++++- internal/buildgen/seo_test.go | 6 ++++ internal/project/config.go | 56 ++++++++++++++++++++++++++------- internal/project/config_test.go | 55 ++++++++++++++++++++++++++++++++ runtime/seo/seo.go | 13 +++++++- runtime/seo/seo_test.go | 9 ++++-- 10 files changed, 207 insertions(+), 16 deletions(-) diff --git a/cmd/gowdk/main_test.go b/cmd/gowdk/main_test.go index 79d89365..7df368bc 100644 --- a/cmd/gowdk/main_test.go +++ b/cmd/gowdk/main_test.go @@ -1189,6 +1189,31 @@ func TestTestCommandRunsInitializedProjectAppStageWithJSON(t *testing.T) { }) } +func TestResolveExplicitTestPathsUsesLaunchDirectory(t *testing.T) { + launchRoot := t.TempDir() + relative := filepath.Join("site", "pages", "home.page.gwdk") + absolute := filepath.Join(launchRoot, "site", "pages", "about.page.gwdk") + + var paths []string + var launchCwd string + withWorkingDir(t, launchRoot, func() { + var err error + launchCwd, err = os.Getwd() + if err != nil { + t.Fatal(err) + } + paths, err = resolveExplicitTestPaths([]string{relative, absolute}) + if err != nil { + t.Fatal(err) + } + }) + + wantRelative := filepath.Join(launchCwd, relative) + if len(paths) != 2 || paths[0] != wantRelative || paths[1] != absolute { + t.Fatalf("unexpected resolved test paths: %#v", paths) + } +} + func TestTestCommandRejectsUpdateFlag(t *testing.T) { _, err := parseTestOptions([]string{"--update"}) if err == nil || !strings.Contains(err.Error(), `unknown test flag "--update"`) { diff --git a/cmd/gowdk/test.go b/cmd/gowdk/test.go index 171956b1..f5c68d66 100644 --- a/cmd/gowdk/test.go +++ b/cmd/gowdk/test.go @@ -328,13 +328,18 @@ func buildTestWorkdir(cli cliOptions, options testOptions, modules []string) (*t } } + paths, err := resolveExplicitTestPaths(options.Paths) + if err != nil { + cleanup() + return nil, nil, err + } fmt.Fprintf(os.Stderr, "gowdk test [build]: %s\n", work.Root) request := buildRequest{ OutputDir: work.OutputDir, AppDir: work.AppDir, BinaryPath: work.BinaryPath, Modules: modules, - Paths: append([]string(nil), options.Paths...), + Paths: paths, } if err := runInWorkingDir(cli.ProjectRoot, func() error { return runTestBuildOnce(cli, request, options.JSON) @@ -345,6 +350,25 @@ func buildTestWorkdir(cli cliOptions, options testOptions, modules []string) (*t return work, cleanup, nil } +func resolveExplicitTestPaths(paths []string) ([]string, error) { + if len(paths) == 0 { + return nil, nil + } + cwd, err := os.Getwd() + if err != nil { + return nil, err + } + resolved := make([]string, 0, len(paths)) + for _, path := range paths { + if filepath.IsAbs(path) { + resolved = append(resolved, filepath.Clean(path)) + continue + } + resolved = append(resolved, filepath.Clean(filepath.Join(cwd, path))) + } + return resolved, nil +} + func runTestBuildOnce(cli cliOptions, request buildRequest, quietStdout bool) error { if !quietStdout { return buildOnce(cli, request, newBuildTimingRecorder(false)) diff --git a/internal/appgen/appgen_test.go b/internal/appgen/appgen_test.go index d43d401e..08347350 100644 --- a/internal/appgen/appgen_test.go +++ b/internal/appgen/appgen_test.go @@ -20,6 +20,7 @@ import ( "github.com/cssbruno/gowdk" authaddon "github.com/cssbruno/gowdk/addons/auth" "github.com/cssbruno/gowdk/addons/seo" + "github.com/cssbruno/gowdk/internal/buildgen" "github.com/cssbruno/gowdk/internal/compiler" "github.com/cssbruno/gowdk/internal/gwdkanalysis" "github.com/cssbruno/gowdk/internal/gwdkir" @@ -5603,6 +5604,22 @@ func TestLifecycleServiceImportsParticipateInModuleDetection(t *testing.T) { } } +func TestDynamicSitemapImportsParticipateInModuleDetection(t *testing.T) { + options := Options{Sitemap: buildgen.RuntimeSitemapPlan{ + Enabled: true, + Dynamic: gowdk.SEODynamicSitemap{ + ImportPath: "example.com/site/sitemap", + Function: "DynamicURLs", + }, + }} + if !appHasLocalModuleImports(options) { + t.Fatal("expected dynamic sitemap provider imports to require app module wiring") + } + if !optionsUsesModuleImports(options, "example.com/site") { + t.Fatal("expected dynamic sitemap provider imports to mark example.com/site as used") + } +} + func TestIsLocalModuleImportPath(t *testing.T) { cases := map[string]bool{ "context": false, diff --git a/internal/appgen/module.go b/internal/appgen/module.go index c06fada1..ff32cb23 100644 --- a/internal/appgen/module.go +++ b/internal/appgen/module.go @@ -188,6 +188,9 @@ func appBackendImportPaths(options Options) map[string]bool { for _, provider := range lifecycleServiceProviders(options) { paths[provider.ImportPath] = true } + if generatedDynamicSitemapEnabled(options) { + paths[strings.TrimSpace(options.Sitemap.Dynamic.ImportPath)] = true + } return paths } diff --git a/internal/buildgen/seo.go b/internal/buildgen/seo.go index 0396fcc1..0e26715f 100644 --- a/internal/buildgen/seo.go +++ b/internal/buildgen/seo.go @@ -258,7 +258,7 @@ func absoluteSEOURL(base *url.URL, route string) string { resolved.RawPath = "" basePath := strings.TrimRight(resolved.Path, "/") - routePath := "/" + strings.TrimLeft(route, "/") + routePath := "/" + strings.TrimLeft(rootRelativeSEOPath(route), "/") if routePath == "/" { if basePath == "" { resolved.Path = "/" @@ -271,6 +271,17 @@ func absoluteSEOURL(base *url.URL, route string) string { return resolved.String() } +func rootRelativeSEOPath(route string) string { + parsed, err := url.Parse(route) + if err != nil || parsed.IsAbs() || parsed.Host != "" || !strings.HasPrefix(route, "/") { + return route + } + if parsed.Path == "" { + return "/" + } + return parsed.Path +} + func sitemapPayload(urls []sitemapURLEntry) ([]byte, error) { payload, err := xml.MarshalIndent(sitemapURLSet{ XMLNS: "http://www.sitemaps.org/schemas/sitemap/0.9", diff --git a/internal/buildgen/seo_test.go b/internal/buildgen/seo_test.go index 5b0ab1a2..3a74b75b 100644 --- a/internal/buildgen/seo_test.go +++ b/internal/buildgen/seo_test.go @@ -42,6 +42,8 @@ func TestBuildEmitsSEOArtifactsWhenAddonEnabled(t *testing.T) { LastMod: "2026-06-14", ChangeFreq: "daily", Priority: "0.8", + }, { + Loc: "/feed.xml?page=2#top", }}, })}} app := gwdkanalysis.Sources{Pages: []gwdkir.Page{ @@ -72,6 +74,7 @@ func TestBuildEmitsSEOArtifactsWhenAddonEnabled(t *testing.T) { `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`, `<loc>https://example.com/docs/</loc>`, `<loc>https://example.com/docs/blog/hello-gowdk</loc>`, + `<loc>https://example.com/docs/feed.xml</loc>`, `<loc>https://example.com/docs/rss.xml</loc>`, `<lastmod>2026-06-14</lastmod>`, `<changefreq>daily</changefreq>`, @@ -81,6 +84,9 @@ func TestBuildEmitsSEOArtifactsWhenAddonEnabled(t *testing.T) { t.Fatalf("expected sitemap to contain %q:\n%s", expected, sitemap) } } + if strings.Contains(sitemap, "%3F") || strings.Contains(sitemap, "page=2") { + t.Fatalf("root-relative extra URL query leaked into sitemap:\n%s", sitemap) + } robots := readFile(t, result.RobotsPath) for _, expected := range []string{ diff --git a/internal/project/config.go b/internal/project/config.go index 400ade9c..d72ccfc9 100644 --- a/internal/project/config.go +++ b/internal/project/config.go @@ -1389,9 +1389,17 @@ func parseSEODynamicSitemap(expression ast.Expr, imports map[string]string) (gow } dynamic.Function = value case "MaxURLs": - dynamic.MaxURLs = parseInt(field.Value) + value, ok := parseLiteralInt(field.Value) + if !ok { + return gowdk.SEODynamicSitemap{}, false + } + dynamic.MaxURLs = value case "CacheSeconds": - dynamic.CacheSeconds = parseInt(field.Value) + value, ok := parseLiteralInt(field.Value) + if !ok { + return gowdk.SEODynamicSitemap{}, false + } + dynamic.CacheSeconds = value default: return gowdk.SEODynamicSitemap{}, false } @@ -1563,7 +1571,22 @@ func parseLiteralBool(expression ast.Expr) (bool, bool) { // outside the platform int range so a malformed config value cannot wrap into a // small or negative length on 32-bit platforms. func parseInt(expression ast.Expr) int { - value := parseInt64(expression) + value, ok := parseLiteralInt64(expression) + if !ok { + return 0 + } + return clampInt(value) +} + +func parseLiteralInt(expression ast.Expr) (int, bool) { + value, ok := parseLiteralInt64(expression) + if !ok { + return 0, false + } + return clampInt(value), true +} + +func clampInt(value int64) int { switch { case value > math.MaxInt: return math.MaxInt @@ -1575,28 +1598,39 @@ func parseInt(expression ast.Expr) int { } func parseInt64(expression ast.Expr) int64 { + value, ok := parseLiteralInt64(expression) + if !ok { + return 0 + } + return value +} + +func parseLiteralInt64(expression ast.Expr) (int64, bool) { switch typed := expression.(type) { case *ast.BasicLit: if typed.Kind != token.INT { - return 0 + return 0, false } value, err := strconv.ParseInt(typed.Value, 0, 64) if err != nil { - return 0 + return 0, false } - return value + return value, true case *ast.UnaryExpr: - value := parseInt64(typed.X) + value, ok := parseLiteralInt64(typed.X) + if !ok { + return 0, false + } switch typed.Op { case token.ADD: - return value + return value, true case token.SUB: - return -value + return -value, true default: - return 0 + return 0, false } default: - return 0 + return 0, false } } diff --git a/internal/project/config_test.go b/internal/project/config_test.go index 81aec167..49cf845c 100644 --- a/internal/project/config_test.go +++ b/internal/project/config_test.go @@ -1041,6 +1041,61 @@ var Config = gowdk.Config{ } } +func TestLoadConfigFileFallsBackForDynamicSitemapIntegerOptions(t *testing.T) { + root := t.TempDir() + repoRoot := repositoryRoot(t) + writeTestFile(t, filepath.Join(root, "go.mod"), `module example.com/site + +go 1.22 + +require github.com/cssbruno/gowdk v0.0.0 + +replace github.com/cssbruno/gowdk => `+repoRoot+` +`) + path := filepath.Join(root, DefaultConfigFile) + writeTestFile(t, path, `package app + +import ( + "github.com/cssbruno/gowdk" + seoaddon "github.com/cssbruno/gowdk/addons/seo" +) + +const sitemapLimit = 25 + +func sitemapCacheSeconds() int { + return 60 +} + +var Config = gowdk.Config{ + Addons: []gowdk.Addon{ + seoaddon.Addon(seoaddon.Options{ + BaseURL: "https://example.com/docs", + DynamicSitemap: seoaddon.DynamicSitemap{ + ImportPath: "example.com/site/sitemap", + Function: "DynamicURLs", + MaxURLs: sitemapLimit, + CacheSeconds: sitemapCacheSeconds(), + }, + }), + }, +} +`) + tidyTestModule(t, root) + + config, err := LoadConfigFile(path) + if err != nil { + t.Fatal(err) + } + provider, ok := config.Addons[0].(gowdk.SEOProvider) + if !ok { + t.Fatalf("expected SEOProvider, got %T", config.Addons[0]) + } + dynamic := provider.SEOOptions().DynamicSitemap + if dynamic.MaxURLs != 25 || dynamic.CacheSeconds != 60 { + t.Fatalf("expected executable fallback to preserve dynamic sitemap integers, got %#v", dynamic) + } +} + func TestLoadConfigFileReadsImportableExternalAddon(t *testing.T) { root := t.TempDir() repoRoot := repositoryRoot(t) diff --git a/runtime/seo/seo.go b/runtime/seo/seo.go index 9a4c8cc2..a2eda1c6 100644 --- a/runtime/seo/seo.go +++ b/runtime/seo/seo.go @@ -192,7 +192,7 @@ func AbsoluteURL(base *url.URL, route string) string { resolved.RawPath = "" basePath := strings.TrimRight(resolved.Path, "/") - routePath := "/" + strings.TrimLeft(route, "/") + routePath := "/" + strings.TrimLeft(rootRelativePath(route), "/") if routePath == "/" { if basePath == "" { resolved.Path = "/" @@ -204,3 +204,14 @@ func AbsoluteURL(base *url.URL, route string) string { resolved.Path = basePath + routePath return resolved.String() } + +func rootRelativePath(route string) string { + parsed, err := url.Parse(route) + if err != nil || parsed.IsAbs() || parsed.Host != "" || !strings.HasPrefix(route, "/") { + return route + } + if parsed.Path == "" { + return "/" + } + return parsed.Path +} diff --git a/runtime/seo/seo_test.go b/runtime/seo/seo_test.go index 97d1ca2b..1c50bcd7 100644 --- a/runtime/seo/seo_test.go +++ b/runtime/seo/seo_test.go @@ -12,6 +12,7 @@ func TestSitemapNormalizesSortsAndDeduplicatesURLs(t *testing.T) { payload, err := Sitemap("https://example.com/docs?ignored=1#top", []URL{ {Loc: "/b", LastMod: " 2026-06-01 "}, {Loc: "https://example.com/a?x=1#fragment", ChangeFreq: " daily "}, + {Loc: "/products?page=2#top"}, {Loc: "/b"}, }) if err != nil { @@ -22,8 +23,12 @@ func TestSitemapNormalizesSortsAndDeduplicatesURLs(t *testing.T) { assertContains(t, text, `<changefreq>daily</changefreq>`) assertContains(t, text, `<loc>https://example.com/docs/b</loc>`) assertContains(t, text, `<lastmod>2026-06-01</lastmod>`) - if strings.Count(text, `<loc>`) != 2 { - t.Fatalf("expected two unique URLs, got:\n%s", text) + assertContains(t, text, `<loc>https://example.com/docs/products</loc>`) + if strings.Contains(text, `%3F`) || strings.Contains(text, `page=2`) { + t.Fatalf("root-relative URL query leaked into sitemap:\n%s", text) + } + if strings.Count(text, `<loc>`) != 3 { + t.Fatalf("expected three unique URLs, got:\n%s", text) } }