Skip to content

fix: changelog generation - #292

Merged
pedronauck merged 2 commits into
mainfrom
changelogs
Aug 3, 2026
Merged

pedronauck merged 2 commits into
mainfrom
changelogs

Conversation

@pedronauck

@pedronauck pedronauck commented Aug 3, 2026 •

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features

    • Added GitHub-backed changelog pages with release details, categories, Markdown content, evidence, predecessor links, and downloadable assets.
    • Added an RSS feed for published changelog releases.
    • Added clear unavailable and release-not-found states.
    • Changelog releases now appear in search, sitemap, and LLM-friendly documentation feeds.
  • Bug Fixes

    • Improved WebSocket errors for missing workspaces and automatically refreshed stale workspace sessions.
    • Improved search index loading reliability.

@pedronauck pedronauck self-assigned this Aug 3, 2026
@vercel

vercel Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
compozy-site Ready Ready Preview Aug 3, 2026 6:56pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c06c24ae-ac95-45fa-b2b1-c2b5e710e08a

📥 Commits

Reviewing files that changed from the base of the PR and between 2952c49 and f458aa2.

⛔ Files ignored due to path filters (2)
  • docs/qa/reports/2026-08-03-site-changelog-compare-order.md is excluded by !**/*.md
  • docs/qa/scenarios/SITE-changelog-release-receipts.md is excluded by !**/*.md
📒 Files selected for processing (2)
  • packages/site/app/changelog/[version]/page.tsx
  • packages/site/components/blog/__tests__/changelog-components.test.tsx

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


Walkthrough

The PR replaces local site release content with GitHub-backed changelog data. It adds release pages, RSS output, metadata, search indexing, and release evidence. It also improves WebSocket workspace recovery and updates repository maintenance contracts.

Changes

GitHub changelog integration

Layer / File(s) Summary
Changelog data contracts and GitHub loading
packages/site/lib/changelog/*
Adds typed changelog models, GitHub schemas, Markdown parsing, release normalization, pagination, pull-request loading, and contributor aggregation.
Changelog routes and public indexes
packages/site/app/changelog/*, packages/site/app/llms*.txt/route.ts, packages/site/app/sitemap.ts, packages/site/lib/public-search-index.ts
Adds release detail and RSS routes. Updates public pages, metadata, sitemap, LLM output, and search indexes to load GitHub releases asynchronously.
Release presentation components
packages/site/components/blog/*
Updates release navigation and entries for version routes. Adds Markdown rendering, release evidence, detail navigation, and asset-size formatting.
Changelog contract validation
packages/site/**/__tests__/*, packages/site/lib/__tests__/*
Updates fixtures and assertions for GitHub release data, asynchronous routes, version URLs, RSS metadata, search indexing, and heading behavior.

WebSocket workspace errors

Layer / File(s) Summary
Terminal WebSocket error handling
internal/api/core/window_manager_ws.go, internal/api/core/window_manager_ws_test.go
Applies terminal preflight error handling to subscription failures and tests missing-workspace error framing, closure, and shutdown.
Workspace query refresh and reconnection
web/src/systems/os/hooks/use-window-manager-stream.ts, web/src/systems/os/hooks/__tests__/use-window-manager-stream.test.tsx
Invalidates the workspace query after a workspace-not-found error and verifies reconnection with the current workspace.

Repository and workflow maintenance

Layer / File(s) Summary
Workflow and repository cleanup
internal/config/release_config_test.go, packages/site/.gitignore, packages/site/lib/site-config.ts, web/vite.config.ts
Updates release workflow assertions, ignore rules, file-extension matching, and the Vite proxy import.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant ChangelogPage
  participant GitHubClient
  participant GitHubAPI
  Browser->>ChangelogPage: Request changelog page
  ChangelogPage->>GitHubClient: loadChangelogReleases()
  GitHubClient->>GitHubAPI: Fetch releases and pull requests
  GitHubAPI-->>GitHubClient: Release and pull-request data
  GitHubClient-->>ChangelogPage: Ready or unavailable result
  ChangelogPage-->>Browser: Render release list or unavailable state
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title identifies the changelog work, which is the primary focus of the pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch changelogs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

React Doctor found no new issues. 🎉

Reviewed by React Doctor for commit f458aa2.

@greptile-apps

greptile-apps Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

Greptile Summary

The PR replaces publication-date-based changelog comparisons with semantic-version predecessor selection and expands the GitHub-backed changelog experience.

  • Selects the greatest published release tag lower than the current version for GitHub compare links.
  • Adds release detail pages, RSS output, search and sitemap integration, and release evidence rendering.
  • Removes generated changelog-receipt commits from the release workflow.
  • Improves stale workspace WebSocket recovery and search-index loading.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
packages/site/app/changelog/[version]/page.tsx Selects the closest lower semantic version across all loaded releases, resolving the previously reported publication-order comparison defect.
packages/site/lib/changelog/release-markdown.ts Implements numeric semantic-version and prerelease identifier comparison used by predecessor selection.
packages/site/lib/changelog/github-client.ts Loads, validates, filters, and normalizes published GitHub releases for changelog consumers.
packages/site/app/changelog/feed.xml/route.ts Produces an escaped RSS feed from validated changelog releases.
.github/workflows/release.yml Removes the release workflow step that generated and pushed site changelog receipt commits.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Published GitHub releases] --> B[Validate and filter releases]
  B --> C[Requested release]
  B --> D[Compare semantic versions]
  D --> E[Greatest lower release tag]
  C --> F[Release detail page]
  E --> G[GitHub compare URL]
  G --> F
Loading

Reviews (2): Last reviewed commit: "fix: review round" | Re-trigger Greptile

Comment thread packages/site/app/changelog/[version]/page.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (3)
packages/site/lib/changelog/github-client.ts (1)

67-104: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add an explicit timeout to the GitHub fetch calls.

githubJson calls fetch without a deadline. If GitHub stalls, the request keeps the render or route handler pending until the platform kills it. Pass an abort signal so the failure converts into the existing network load error and the page falls back deterministically.

♻️ Proposed change
+const GITHUB_TIMEOUT_MS = 8000;
+
 async function githubJson(
   url: string,
   init: RequestInit & { next?: { revalidate: number } },
   requireToken: boolean
 ): Promise<unknown> {
   let response: Response;
   try {
     response = await fetch(url, {
       ...init,
+      signal: init.signal ?? AbortSignal.timeout(GITHUB_TIMEOUT_MS),
       headers: {
         ...githubHeaders({ requireToken }),
         ...init.headers,
       },
     });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/lib/changelog/github-client.ts` around lines 67 - 104, Update
githubJson to create an AbortController-based timeout and pass its signal to the
fetch call, ensuring stalled GitHub requests abort and follow the existing
network-error handling. Clear the timeout after fetch completes, including
failure paths, while preserving the current GitHub response and invalid-JSON
handling.
packages/site/lib/__tests__/github-changelog.test.ts (1)

48-96: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover the production token requirement and the pagination break.

The suite covers the happy path and the schema violation. Two behaviors of loadChangelogReleases stay untested and both change production output:

  • The configuration error when COMPOZY_SITE_GITHUB_TOKEN is absent and VERCEL_ENV is production.
  • The multi-page path that stops after the page containing a tag before CHANGELOG_CUTOFF_TAG.

Add both cases to this suite. The first case protects the deploy-time contract; the second protects the cutoff filter against silent truncation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/lib/__tests__/github-changelog.test.ts` around lines 48 - 96,
Extend the github-changelog test suite with cases for loadChangelogReleases when
COMPOZY_SITE_GITHUB_TOKEN is absent in production (VERCEL_ENV=production),
asserting the explicit configuration error, and when pagination reaches a page
containing a tag before CHANGELOG_CUTOFF_TAG, asserting subsequent pages are not
fetched and eligible releases are retained.
packages/site/components/blog/release-markdown.tsx (1)

21-28: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Destructure node out before spreading props onto native elements.

react-markdown passes a node prop to every custom component. The handlers here (h3 shown at Line 21, and similarly h4, h5, h6, p, ul, ol, a, code, pre, blockquote, th, td) spread the remaining props — including node — directly onto native DOM elements. React does not recognize node as a DOM attribute and will warn about it on every render. The official react-markdown examples destructure node out first to avoid this.

🧹 Example fix for the h3 handler (apply the same pattern to the other handlers)
-          h3: ({ children, ...props }) => (
+          h3: ({ children, node, ...props }) => (
             <h2
               {...props}
               className="mt-14 scroll-mt-24 font-sans text-2xl font-semibold tracking-tight text-fg first:mt-0"
             >
               {children}
             </h2>
           ),

Please verify with the web whether react-markdown 10.x still passes node to custom components and warns when it is spread onto a native DOM element.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/components/blog/release-markdown.tsx` around lines 21 - 28,
Update the custom markdown renderers in the release-markdown component,
including h3 and the corresponding h4, h5, h6, p, ul, ol, a, code, pre,
blockquote, th, and td handlers, to destructure and discard node before
spreading the remaining props onto native elements. Preserve all existing
rendering and styling behavior while ensuring node is never forwarded to the
DOM.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/site/app/changelog/`[version]/page.tsx:
- Around line 32-34: Update the changelog page flow around the result.status ===
"unavailable" check to render an explicit temporary-unavailability state instead
of throwing, matching the graceful handling used by the blog page;
alternatively, document and intentionally preserve the app-wide error-boundary
behavior if that is the expected contract.

In `@packages/site/app/changelog/feed.xml/route.ts`:
- Line 5: Replace the hardcoded ISR revalidation value with
CHANGELOG_REVALIDATE_SECONDS across all affected routes: update
packages/site/app/changelog/feed.xml/route.ts:5, import the constant and use it
in packages/site/app/changelog/page.tsx:10, and import it and use it in
packages/site/app/llms.txt/route.ts:7, reusing the existing
`@/lib/changelog/types` export.
- Line 33: Update loadChangelogReleases() in the changelog library to render
each raw release.body Markdown into HTML before the RSS route consumes it,
preserving the existing release data flow. Then update the feed route’s
description generation to use that rendered HTML and XML-escape or wrap it
appropriately, so readers receive formatted release-note content rather than
Markdown syntax.

In `@packages/site/components/blog/release-evidence.tsx`:
- Around line 74-76: Update the user-facing paragraph in the release evidence
component to remove “workflow” and describe the published files using compliant
release-focused wording, while preserving the asset count interpolation.

In `@packages/site/components/blog/release-markdown.tsx`:
- Around line 21-43: Add h1 and h2 handlers to the release Markdown component’s
heading renderers, applying the same release-heading styling so level-1 and
level-2 GitHub headings are normalized and styled consistently with the existing
h3–h6 mappings. Add coverage for these heading levels in
changelog-components.test.tsx.
- Around line 66-77: Update the react-markdown renderers in the release markdown
component so fenced code block styling is applied by the pre renderer using the
project’s syntax-highlight theme, while the code renderer retains only
inline-code styling. Remove the fenced-block visual classes from code and do not
introduce a separate plain-background code renderer.

---

Nitpick comments:
In `@packages/site/components/blog/release-markdown.tsx`:
- Around line 21-28: Update the custom markdown renderers in the
release-markdown component, including h3 and the corresponding h4, h5, h6, p,
ul, ol, a, code, pre, blockquote, th, and td handlers, to destructure and
discard node before spreading the remaining props onto native elements. Preserve
all existing rendering and styling behavior while ensuring node is never
forwarded to the DOM.

In `@packages/site/lib/__tests__/github-changelog.test.ts`:
- Around line 48-96: Extend the github-changelog test suite with cases for
loadChangelogReleases when COMPOZY_SITE_GITHUB_TOKEN is absent in production
(VERCEL_ENV=production), asserting the explicit configuration error, and when
pagination reaches a page containing a tag before CHANGELOG_CUTOFF_TAG,
asserting subsequent pages are not fetched and eligible releases are retained.

In `@packages/site/lib/changelog/github-client.ts`:
- Around line 67-104: Update githubJson to create an AbortController-based
timeout and pass its signal to the fetch call, ensuring stalled GitHub requests
abort and follow the existing network-error handling. Clear the timeout after
fetch completes, including failure paths, while preserving the current GitHub
response and invalid-JSON handling.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 0120102a-231b-4a84-a33e-53aa508ced17

📥 Commits

Reviewing files that changed from the base of the PR and between 530a78d and 2952c49.

⛔ Files ignored due to path filters (33)
  • .github/workflows/release.yml is excluded by !**/*.yml
  • bun.lock is excluded by !**/*.lock, !**/*.lock
  • docs/qa/charters/CH-site-changelog-release-evidence.md is excluded by !**/*.md
  • docs/qa/reports/2026-08-03-dev-websocket-recovery.md is excluded by !**/*.md
  • docs/qa/reports/2026-08-03-site-github-changelog.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-missing-workspace-pruned.md is excluded by !**/*.md
  • docs/qa/scenarios/SITE-changelog-release-receipts.md is excluded by !**/*.md
  • package.json is excluded by !**/*.json
  • packages/site/CLAUDE.md is excluded by !**/*.md
  • packages/site/content/blog/changelog/v0.3.0-beta.1.mdx is excluded by !**/*.mdx
  • packages/site/content/blog/changelog/v0.3.0-beta.2.mdx is excluded by !**/*.mdx
  • packages/site/package.json is excluded by !**/*.json
  • packages/slides/.agents/skills/apply-comments/SKILL.md is excluded by !**/*.md
  • packages/slides/.agents/skills/create-slide/SKILL.md is excluded by !**/*.md
  • packages/slides/.agents/skills/create-theme/SKILL.md is excluded by !**/*.md
  • packages/slides/.agents/skills/slide-authoring/SKILL.md is excluded by !**/*.md
  • packages/slides/AGENTS.md is excluded by !**/*.md
  • packages/slides/CLAUDE.md is excluded by !**/*.md
  • packages/slides/README.md is excluded by !**/*.md
  • packages/slides/bun.lock is excluded by !**/*.lock, !**/*.lock
  • packages/slides/netlify.toml is excluded by !**/*.toml
  • packages/slides/package.json is excluded by !**/*.json
  • packages/slides/slides/.folders.json is excluded by !**/*.json
  • packages/slides/slides/getting-started/assets/claude.svg is excluded by !**/*.svg
  • packages/slides/slides/getting-started/assets/cloudflare.svg is excluded by !**/*.svg
  • packages/slides/slides/getting-started/assets/gemini.svg is excluded by !**/*.svg
  • packages/slides/slides/getting-started/assets/openai.svg is excluded by !**/*.svg
  • packages/slides/slides/getting-started/assets/opencode.svg is excluded by !**/*.svg
  • packages/slides/slides/getting-started/assets/vercel.svg is excluded by !**/*.svg
  • packages/slides/slides/getting-started/assets/zeabur.svg is excluded by !**/*.svg
  • packages/slides/themes/compozy.md is excluded by !**/*.md
  • packages/slides/tsconfig.json is excluded by !**/*.json
  • packages/slides/vercel.json is excluded by !**/*.json
📒 Files selected for processing (54)
  • internal/api/core/window_manager_ws.go
  • internal/api/core/window_manager_ws_test.go
  • internal/config/release_config_test.go
  • packages/site/.gitignore
  • packages/site/app/api/search/route.ts
  • packages/site/app/blog/page.tsx
  • packages/site/app/changelog/[version]/not-found.tsx
  • packages/site/app/changelog/[version]/page.tsx
  • packages/site/app/changelog/feed.xml/route.ts
  • packages/site/app/changelog/metadata.ts
  • packages/site/app/changelog/page.tsx
  • packages/site/app/llms-full.txt/route.ts
  • packages/site/app/llms.txt/route.ts
  • packages/site/app/sitemap.ts
  • packages/site/components/blog/__tests__/changelog-components.test.tsx
  • packages/site/components/blog/__tests__/changelog-toc-rail.test.tsx
  • packages/site/components/blog/changelog-rail.tsx
  • packages/site/components/blog/changelog-toc-rail.tsx
  • packages/site/components/blog/format.ts
  • packages/site/components/blog/release-detail-rail.tsx
  • packages/site/components/blog/release-entry.tsx
  • packages/site/components/blog/release-evidence.tsx
  • packages/site/components/blog/release-markdown.tsx
  • packages/site/lib/__tests__/github-changelog.test.ts
  • packages/site/lib/__tests__/public-heading-hierarchy.test.tsx
  • packages/site/lib/__tests__/public-install-contract.test.ts
  • packages/site/lib/__tests__/public-route-metadata.test.ts
  • packages/site/lib/__tests__/public-search-index.test.ts
  • packages/site/lib/__tests__/static-route-metadata.test.ts
  • packages/site/lib/blog.ts
  • packages/site/lib/changelog/github-client.ts
  • packages/site/lib/changelog/github-schemas.ts
  • packages/site/lib/changelog/release-markdown.ts
  • packages/site/lib/changelog/types.ts
  • packages/site/lib/public-search-index.ts
  • packages/site/lib/site-config.ts
  • packages/site/scripts/__tests__/generate-changelog-release.test.ts
  • packages/site/scripts/__tests__/render-changelog-release.test.ts
  • packages/site/scripts/generate-changelog-release.ts
  • packages/site/scripts/release-note-input.ts
  • packages/site/scripts/render-changelog-release.ts
  • packages/site/velite.config.ts
  • packages/slides/.claude/skills/apply-comments
  • packages/slides/.claude/skills/create-slide
  • packages/slides/.claude/skills/create-theme
  • packages/slides/.claude/skills/slide-authoring
  • packages/slides/.gitignore
  • packages/slides/open-slide.config.ts
  • packages/slides/slides/compozy-network/index.tsx
  • packages/slides/slides/getting-started/index.tsx
  • packages/slides/themes/.gitkeep
  • web/src/systems/os/hooks/__tests__/use-window-manager-stream.test.tsx
  • web/src/systems/os/hooks/use-window-manager-stream.ts
  • web/vite.config.ts
💤 Files with no reviewable changes (13)
  • packages/slides/.gitignore
  • packages/slides/.claude/skills/slide-authoring
  • packages/slides/.claude/skills/apply-comments
  • packages/slides/.claude/skills/create-slide
  • packages/site/scripts/tests/generate-changelog-release.test.ts
  • packages/slides/open-slide.config.ts
  • packages/site/scripts/render-changelog-release.ts
  • packages/site/scripts/generate-changelog-release.ts
  • packages/slides/.claude/skills/create-theme
  • packages/site/velite.config.ts
  • packages/site/scripts/tests/render-changelog-release.test.ts
  • packages/site/scripts/release-note-input.ts
  • packages/slides/slides/compozy-network/index.tsx

Comment thread packages/site/app/changelog/[version]/page.tsx
import { CHANGELOG_REVALIDATE_SECONDS } from "@/lib/changelog/types";
import { absoluteUrl, siteConfig } from "@/lib/site-config";

export const revalidate = 300;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use CHANGELOG_REVALIDATE_SECONDS for revalidate instead of the literal 300. CHANGELOG_REVALIDATE_SECONDS is imported and used for the RSS cache-control header in feed.xml/route.ts, but the ISR revalidate export in that same file, and in changelog/page.tsx and llms.txt/route.ts, hardcodes 300 instead of reusing the constant. If the constant's value changes, the actual regeneration window and the advertised cache duration will silently diverge across three routes.

  • packages/site/app/changelog/feed.xml/route.ts#L5-L5: set export const revalidate = CHANGELOG_REVALIDATE_SECONDS; instead of the literal 300.
  • packages/site/app/changelog/page.tsx#L10-L10: import CHANGELOG_REVALIDATE_SECONDS from @/lib/changelog/types and use it for export const revalidate.
  • packages/site/app/llms.txt/route.ts#L7-L7: import CHANGELOG_REVALIDATE_SECONDS from @/lib/changelog/types and use it for export const revalidate.
📍 Affects 3 files
  • packages/site/app/changelog/feed.xml/route.ts#L5-L5 (this comment)
  • packages/site/app/changelog/page.tsx#L10-L10
  • packages/site/app/llms.txt/route.ts#L7-L7
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/app/changelog/feed.xml/route.ts` at line 5, Replace the
hardcoded ISR revalidation value with CHANGELOG_REVALIDATE_SECONDS across all
affected routes: update packages/site/app/changelog/feed.xml/route.ts:5, import
the constant and use it in packages/site/app/changelog/page.tsx:10, and import
it and use it in packages/site/app/llms.txt/route.ts:7, reusing the existing
`@/lib/changelog/types` export.

`<link>${link}</link>`,
`<guid isPermaLink="true">${link}</guid>`,
`<pubDate>${new Date(release.publishedAt).toUTCString()}</pubDate>`,
`<description>${escapeXml(release.body)}</description>`,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== file list =="
git ls-files | rg 'packages/site/(app/changelog/feed.xml/route.ts|lib/changelog/(github-client|release-markdown))'

echo "== route outline =="
ast-grep outline packages/site/app/changelog/feed.xml/route.ts --view compact || true

echo "== route relevant lines =="
cat -n packages/site/app/changelog/feed.xml/route.ts | sed -n '1,90p'

echo "== release-markdown =="
cat -n packages/site/lib/changelog/release-markdown.ts | sed -n '1,220p'

echo "== github-client release shape =="
ast-grep outline packages/site/lib/changelog/github-client.ts --view compact || true
rg -n "loadChangelogReleases|release\.body|description|body" packages/site/lib/changelog/github-client.ts packages/site/app/changelog/feed.xml/route.ts

Repository: compozy/compozy

Length of output: 13325


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== github-client relevant lines =="
cat -n packages/site/lib/changelog/github-client.ts | sed -n '80,145p'
cat -n packages/site/lib/changelog/github-client.ts | sed -n '160,200p'

echo "== release-markdown exports and rest =="
cat -n packages/site/lib/changelog/release-markdown.ts | sed -n '1,280p'

echo "== search for render/release-markdown exports in repository =="
rg -n "renderReleaseMarkdownToHtml|release-markdown|markdownToHtml|markdown-to-html|remark|github\\-actions\\-release\\-markdown|@.*markdown|escapeXml\\(" packages/site

Repository: compozy/compozy

Length of output: 18419


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== changelog page imports and ReleaseMarkdown usage =="
cat -n "packages/site/app/changelog/[version]/page.tsx" | sed -n '1,140p'

echo "== components/blog/release-markdown.tsx =="
cat -n "packages/site/components/blog/release-markdown.tsx" | sed -n '1,180p'

echo "== package json dependencies =="
cat -n packages/site/package.json | sed -n '1,90p'

echo "== package-lock/npm lock files =="
git ls-files | rg '(^|/)package-lock\.json$|(^|/)pnpm-lock\.yaml$|(^|/)yarn\.lock$|(^|/)bun\.lockb?$'

echo "== lockfile remark versions if present =="
for f in package-lock.json packages/site/package-lock.json pnpm-lock.yaml bun.lock bun.lockb yarn.lock; do
  if [ -f "$f" ]; then
    echo "-- $f --"
    rg -n '"remark"|remark@|remark-gfm|remark-mdx' "$f" | head -80 || true
  fi
done

Repository: compozy/compozy

Length of output: 17622


Render the GitHub release body before writing it to RSS.

loadChangelogReleases() stores the raw release markdown in release.body, and escapeXml() only XML-escapes that text. Feed readers will display ###, -, links, and other markdown syntax instead of release-note HTML. Move the markdown render logic into the changelog library and output an escaped or wrapped HTML description from it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/app/changelog/feed.xml/route.ts` at line 33, Update
loadChangelogReleases() in the changelog library to render each raw release.body
Markdown into HTML before the RSS route consumes it, preserving the existing
release data flow. Then update the feed route’s description generation to use
that rendered HTML and XML-escape or wrap it appropriately, so readers receive
formatted release-note content rather than Markdown syntax.

Comment on lines +74 to +76
<p className="mt-3 text-sm leading-6 text-muted">
{release.assets.length} files published by the GitHub release workflow.
</p>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove workflow from product-facing copy.

The coding guidelines forbid workflow in public product-facing copy. Describe the source without that noun, for example: {release.assets.length} files published with this release.

✏️ Proposed change
         <p className="mt-3 text-sm leading-6 text-muted">
-          {release.assets.length} files published by the GitHub release workflow.
+          {release.assets.length} files published with this GitHub release.
         </p>

As per coding guidelines: "Public product-facing copy must follow COPY.md; use capability as the canonical artifact name and never use recipe, workflow, procedure, or playbook."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<p className="mt-3 text-sm leading-6 text-muted">
{release.assets.length} files published by the GitHub release workflow.
</p>
<p className="mt-3 text-sm leading-6 text-muted">
{release.assets.length} files published with this GitHub release.
</p>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/components/blog/release-evidence.tsx` around lines 74 - 76,
Update the user-facing paragraph in the release evidence component to remove
“workflow” and describe the published files using compliant release-focused
wording, while preserving the asset count interpolation.

Source: Coding guidelines

Comment on lines +21 to +43
h3: ({ children, ...props }) => (
<h2
{...props}
className="mt-14 scroll-mt-24 font-sans text-2xl font-semibold tracking-tight text-fg first:mt-0"
>
{children}
</h2>
),
h4: ({ children, ...props }) => (
<h3 {...props} className="mt-10 scroll-mt-24 font-sans text-lg font-semibold text-fg">
{children}
</h3>
),
h5: ({ children, ...props }) => (
<h4 {...props} className="mt-8 scroll-mt-24 font-sans text-base font-semibold text-fg">
{children}
</h4>
),
h6: ({ children, ...props }) => (
<h5 {...props} className="mt-7 scroll-mt-24 font-sans text-sm font-semibold text-fg">
{children}
</h5>
),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Locate files:"
fd -a 'release-markdown|changelog-components|release.*\.(ts|tsx)$' . | sed 's#^\./##' | head -100

echo
echo "Inspect targeted file outline and relevant source:"
if [ -f packages/site/components/blog/release-markdown.tsx ]; then
  wc -l packages/site/components/blog/release-markdown.tsx
  ast-grep outline packages/site/components/blog/release-markdown.tsx || true
  sed -n '1,180p' packages/site/components/blog/release-markdown.tsx
fi

echo
echo "Search remarkReleaseStructure:"
rg -n "remarkReleaseStructure|ReleaseStructure|release.*structure|heading" packages/site lib packages 2>/dev/null | head -200

Repository: compozy/compozy

Length of output: 27604


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Inspect changelog release-markdown implementation:"
sed -n '1,240p' packages/site/lib/changelog/release-markdown.ts

echo
echo "Inspect changelog components tests around release markdown:"
sed -n '1,140p' packages/site/components/blog/__tests__/changelog-components.test.tsx

echo
echo "Find release detail/list page usage and body normalization:"
rg -n "ReleaseMarkdown|body:|stripLeadingReleaseHeading|remarkReleaseStructure" packages/site -g '*.tsx' -g '*.ts'

Repository: compozy/compozy

Length of output: 17015


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Inspect remainder of remarkReleaseStructure implementation:"
sed -n '240,340p' packages/site/lib/changelog/release-markdown.ts

echo
echo "Inspect changelog version page body source:"
sed -n '1,180p' packages/site/app/changelog/[version]/page.tsx

echo
echo "Run a read-only semantic probe of the markdown parser behavior from source:"
python3 - <<'PY'
from pathlib import Path
p = Path('packages/site/lib/changelog/release-markdown.ts')
s = p.read_text()
checks = {
    "remaps heading depth to HTML element": 'depth 2 -> "h2"' in s or '"h2"' in s[s.find("remarkReleaseStructure"):],
    "remaps heading depth to HTML element": 'depth 3 -> "h3"' in s or 'node.tagName = "h3"' in s[s.find("remarkReleaseStructure"):],
    "normalizes heading levels before react-markdown": '"depth" in node' in s[s.find("remarkReleaseStructure"):s.find("remarkReleaseStructure", s.find("remarkReleaseStructure") + 1)],
}
# Since the source output truncated before the transformer body, print search diagnostics only for requested identifiers.
for token in ["remarkReleaseStructure", "node.depth", "node.tagName", '"depth"', "depth --"]:
    print(f"{token}: {s.count(token)} occurrences")
PY

Repository: compozy/compozy

Length of output: 7005


Add h1 and h2 handlers before rendering GitHub release notes.

remarkReleaseStructure only adds heading IDs; it does not normalize ## headings. GitHub release content can still include level-2 sections that render as native unstyled <h2> elements, so add explicit h1/h2 handlers with the same release-heading styling. Also cover this case in changelog-components.test.tsx.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/components/blog/release-markdown.tsx` around lines 21 - 43, Add
h1 and h2 handlers to the release Markdown component’s heading renderers,
applying the same release-heading styling so level-1 and level-2 GitHub headings
are normalized and styled consistently with the existing h3–h6 mappings. Add
coverage for these heading levels in changelog-components.test.tsx.

Comment on lines +66 to +77
code: props => (
<code
{...props}
className="rounded bg-elevated px-1.5 py-0.5 font-mono text-sm text-fg"
/>
),
pre: props => (
<pre
{...props}
className="mt-5 overflow-x-auto rounded-xl border border-line bg-canvas-soft p-4 text-sm"
/>
),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate release markdown and package deps =="
fd -a 'release-markdown\.tsx$|package\.json$' . | sed 's#^\./##' | head -100

echo
echo "== relevant package files =="
for f in $(fd 'package\.json$' . | head -20); do
  if rg -q 'react-markdown|remark' "$f" 2>/dev/null; then
    echo "--- $f ---"
    rg -n '"react-markdown"|remark|rehype' "$f"
  fi
done

echo
echo "== target file context =="
target=$(fd 'release-markdown\.tsx$' packages/site | head -1 || true)
if [ -n "$target" ]; then
  wc -l "$target"
  sed -n '1,130p' "$target" | cat -n
fi

echo
echo "== usages of components/code/pre in package/site =="
rg -n "react-markdown|components=\{|code: props =>|pre: props =>|syntax-highlight|mdx|code-block|next-mdx|fumadocs|react-syntax|highlight" packages/site packages -g '*.{ts,tsx,jsx,js,json,md,mdx}' | head -200

Repository: compozy/compozy

Length of output: 29026


🌐 Web query:

react-markdown 10 inline prop removed code component pre code props

💡 Result:

In react-markdown version 10, the inline prop is no longer passed to the code component when using the components override [1][2][3]. This change is part of a broader removal of extra, internal props to simplify the component API [2][4]. To adapt to this change and differentiate between inline code and block code (which is wrapped in a pre element), you should update your approach to checking the context [1][2]: 1. Detect inline vs. block code: Since the inline prop is gone, you can detect block code by creating a specific component override for the pre tag instead of relying on the code component's inline prop [1][4]. 2. Alternative approach: You can also inspect the component's context. Because react-markdown wraps block code in a pre tag, the code component will now only receive props relevant to a standard code element [1][5][4]. If you need to distinguish code blocks, move your logic for syntax highlighting or custom block rendering to the pre component override [1][6]. As noted in the official changelog, the recommended migration path is to use the pre component for block-level logic or create a plugin if more advanced tree traversal is required [1][4][3]. Top results: [1], [2], [4]

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== mdx block / shiki files =="
cat -n packages/ui/src/components/custom/code-block.tsx | sed -n '1,220p'
echo
cat -n packages/ui/src/lib/shiki-highlighter.ts | sed -n '1,160p'

echo
echo "== mdx component wiring =="
cat -n packages/site/mdx-components.tsx | sed -n '1,160p'
echo
cat -n packages/site/source.config.ts | sed -n '1,120p'

echo
echo "== rehype-pretty-code usage =="
rg -n "rehype-pretty-code|CodeToRaw|codeToTokens|highlightCompozyCode|pre.*className|code-block|mdx-blocks" packages/ui packages/site -g '*.{ts,tsx}' | sed -n '1,200p'

Repository: compozy/compozy

Length of output: 25403


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== changelog plugin tests =="
target=$(fd 'release-markdown\.test\.tsx$|release-markdown\.test\.ts$|changelog-components\.test\.tsx$|changelog-components\.test\.ts$' packages/site | head -20 || true)
echo "$target"
for f in $target; do
  echo "--- $f ---"
  wc -l "$f"
  rg -n "h2|h3|h4|h5|h6|release|markdown|heading|##|code|pre|fenced|block" "$f" | sed -n '1,240p'
done

Repository: compozy/compozy

Length of output: 2164


Use the project’s syntax-highlight theme for release code blocks.

react-markdown 10 no longer passes inline to the code component, so fenced code blocks also get the inline code classes and render inside the pre override’s own rounded/border/padded container. Put fenced block styling in the pre renderer and render inline code without the fenced-block variant; do not add a new plain-background code renderer here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/site/components/blog/release-markdown.tsx` around lines 66 - 77,
Update the react-markdown renderers in the release markdown component so fenced
code block styling is applied by the pre renderer using the project’s
syntax-highlight theme, while the code renderer retains only inline-code
styling. Remove the fenced-block visual classes from code and do not introduce a
separate plain-background code renderer.

Source: Path instructions

This branch was successfully deployed

1 active deployment
Preview — f458aa21 Deployed Aug 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant