Skip to content

[codex] complete #631 #637 #643 #644#682

Merged
cssbruno merged 2 commits into
mainfrom
codex/refactor-open-issues
Jun 22, 2026
Merged

[codex] complete #631 #637 #643 #644#682
cssbruno merged 2 commits into
mainfrom
codex/refactor-open-issues

Conversation

@cssbruno

Copy link
Copy Markdown
Owner

Summary

Closes #631.
Closes #637.
Closes #643.
Closes #644.

  • Adds supported jsonld page metadata, validation diagnostics, deterministic JSON-LD rendering, manifest/build-report metadata, and an SEO runtime sitemap handler with an optional generated app provider hook.
  • Updates the SEO example, public config/addon docs, language docs, support matrix, and feature spec/implementation plan for the new SEO slice.
  • Makes docs-site/dist/site build-only output, moves production docs-site build/smoke steps into scripts, and updates Render/CI to build the real site instead of a placeholder.
  • Fixes docs-site duplicate lead rendering, wraps generated code fences with language labels/static token spans/copy controls, and adds a lightweight docs style gate.

Verification

  • go test ./runtime/seo
  • go test ./internal/parser ./internal/compiler
  • go test ./internal/buildgen
  • go test ./internal/appgen ./internal/project
  • (cd docs-site && go test ./cmd/syncdocs)
  • scripts/check-docs-style.sh
  • scripts/check-docs-links.sh
  • scripts/check-removed-syntax.sh
  • scripts/check-doc-versions.sh
  • go run ./cmd/gowdk build --config examples/seo/gowdk.config.go --out /tmp/gowdk-seo-build --app /tmp/gowdk-seo-app --bin /tmp/gowdk-seo-site examples/seo/*.gwdk
  • Runtime smoke for /tmp/gowdk-seo-site sitemap dynamic URL merge
  • (cd docs-site && scripts/build-production.sh && scripts/smoke-production.sh)
  • (cd docs-site && go test ./... && go vet ./...)
  • go build ./cmd/gowdk
  • go test ./...
  • scripts/test-go-modules.sh
  • git diff --check

Note: the docs-site production build currently prints existing non-blocking audit_bundle_secret warnings for documentation examples in non-production mode; the build and smoke passed.

@github-actions github-actions Bot added compiler Compiler internals, pipeline, and generated metadata parser .gwdk parser and syntax handling IR Internal compiler IR and phase handoffs diagnostics Diagnostic codes, spans, and messages runtime GOWDK Runtime packages and server behavior security Security hardening and security-sensitive behavior ops Operations, release, deployment, and CI hardening docs Documentation work examples Examples and sample applications labels Jun 22, 2026
@cssbruno cssbruno marked this pull request as ready for review June 22, 2026 17:15

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 38a8d884a4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread internal/project/config.go Outdated
Comment on lines +1386 to +1388
dynamic.MaxURLs = parseInt(field.Value)
case "CacheSeconds":
dynamic.CacheSeconds = parseInt(field.Value)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject non-literal sitemap integer fields for fallback

When DynamicSitemap.MaxURLs or CacheSeconds are computed from a constant/function instead of a literal, parseInt returns 0 but parseSEOAddon still reports success, so LoadConfigFile never falls back to the executable config loader. In that scenario the generated sitemap handler silently uses the default max URL cap and disables successful-response caching instead of the values the Go config would produce. Please detect non-literal integer expressions here and return false, matching the fallback behavior used for BaseURL, Disallow, and ExtraURLs.

Useful? React with 👍 / 👎.

Comment thread runtime/seo/seo.go
Comment on lines +181 to +184
if !strings.HasPrefix(loc, "/") {
return "", fmt.Errorf("sitemap URL %q must be absolute or root-relative", loc)
}
return AbsoluteURL(base, loc), nil

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Normalize root-relative sitemap URLs before joining

When a dynamic provider returns a root-relative URL that includes a query or fragment, such as /products?page=2, this branch passes the original string to AbsoluteURL as a path, so the generated <loc> becomes https://example.com/products%3Fpage=2 rather than a normalized URL. Absolute URLs already strip query/fragment via the parsed URL above, so please use the parsed root-relative URL components here (and in the mirrored build-time extra-URL path) instead of joining the raw loc.

Useful? React with 👍 / 👎.

Comment thread internal/appgen/source.go
Comment on lines +110 to +113
if generatedDynamicSitemapEnabled(options) {
imports["gowdkseo"] = "github.com/cssbruno/gowdk/runtime/seo"
imports["gowdkseositemap"] = strings.TrimSpace(options.Sitemap.Dynamic.ImportPath)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include dynamic sitemap provider in generated module deps

When DynamicSitemap.ImportPath points at a package inside the user's app module and there are no other app-owned backend imports, this generated import is not included in appBackendImportPaths, so moduleSource does not add the app module require/replace needed by the generated app. The documented dynamic sitemap example in a normal external app module will then fail at generated-app go mod tidy/build because the provider import cannot be resolved. Please add the sitemap provider import path to the module-dependency scan as well as to the generated source imports.

Useful? React with 👍 / 👎.

Comment thread cmd/gowdk/test.go Outdated
Comment on lines +337 to +340
Paths: append([]string(nil), options.Paths...),
}
if err := runInWorkingDir(cli.ProjectRoot, func() error {
return runTestBuildOnce(cli, request, options.JSON)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Resolve explicit test input paths before changing directories

When gowdk test is invoked with --config pointing at a subdirectory plus explicit .gwdk file paths relative to the original working directory, these paths are copied into the build request and then the build runs after chdir to cli.ProjectRoot. buildOnce passes explicit paths straight to lang.ParseBuildFiles, so a path like app/pages/home.gwdk is looked up as app/app/pages/home.gwdk and the test build fails even though the same arguments work for gowdk build. Normalize explicit paths to absolute paths (or rebase them to the project root) before calling runInWorkingDir.

Useful? React with 👍 / 👎.

@cssbruno cssbruno force-pushed the codex/refactor-open-issues branch from 38a8d88 to c1ceeef Compare June 22, 2026 18:05
@cssbruno cssbruno merged commit 269b6f3 into main Jun 22, 2026
18 checks passed
@cssbruno cssbruno deleted the codex/refactor-open-issues branch June 22, 2026 18:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

compiler Compiler internals, pipeline, and generated metadata diagnostics Diagnostic codes, spans, and messages docs Documentation work examples Examples and sample applications IR Internal compiler IR and phase handoffs ops Operations, release, deployment, and CI hardening parser .gwdk parser and syntax handling runtime GOWDK Runtime packages and server behavior security Security hardening and security-sensitive behavior

Projects

None yet

1 participant