Conversation
## What changed - Moved site copy, links, benchmark data, and icon definitions into pure JS files under `site/src/content/`. - Added Markdown rendering for localized long-form copy via `react-markdown`. - Updated homepage/blog components to read copy from content files while keeping chart metrics and benchmark values data-driven. - Tightened blog heading and body spacing after the Markdown rendering change. ## Why This makes bilingual copy easier to edit and align by page, and keeps data/config separate from React component layout. ## Validation - `npm run build` - Opened homepage and blog page locally with Playwright and confirmed Markdown renders without raw syntax.
## What changed - Rebased the construction-copy updates onto the latest `ljzhou/dev_2026_06_18_react_site_docs` branch. - Updated the blog construction section copy in both languages. - Refined the rule-hybridization heading and supporting paragraphs. - Added Markdown links for GDPval, SOP-Bench, JobBench, and Loop Engineering where applicable. ## Validation - `npm run build`
There was a problem hiding this comment.
Code Review
This pull request migrates the static GDPevo site to a React/Vite application, restructures the repository by removing legacy Slidev assets, and updates documentation to reflect the shift from 'skills' to 'self-evolution' terminology. The review highlights three key issues: a path resolution bug in the post-build script that fails to locate the root assets folder, a ReferenceError in the Vite configuration caused by using __dirname in an ES module, and a missing clipboard fallback in the blog page's citation copy feature.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| const dist = join(root, "dist"); | ||
|
|
||
| await copyFile(join(root, ".nojekyll"), join(dist, ".nojekyll")); | ||
| await cp(join(root, "assets"), join(dist, "assets"), { recursive: true }); |
There was a problem hiding this comment.
The assets folder is located at the repository root (/assets), but root is defined as the site/ directory (/site). Therefore, join(root, "assets") resolves to /site/assets, which does not exist and will cause the build script to fail with an ENOENT error.
To fix this, resolve the path relative to the repository root by going up one directory level using "..".
await cp(join(root, "..", "assets"), join(dist, "assets"), { recursive: true });| import { defineConfig } from "vite"; | ||
| import react from "@vitejs/plugin-react"; | ||
| import { resolve } from "node:path"; | ||
|
|
||
| export default defineConfig({ | ||
| base: "/GDPevo/", | ||
| plugins: [react()], | ||
| build: { | ||
| outDir: "dist", | ||
| emptyOutDir: true, | ||
| rollupOptions: { | ||
| input: { | ||
| index: resolve(__dirname, "index.html"), | ||
| blog: resolve(__dirname, "blog.html") | ||
| } | ||
| } | ||
| } | ||
| }); |
There was a problem hiding this comment.
Since site/package.json specifies "type": "module", vite.config.js is treated as an ES module. In ES modules, __dirname is not defined and will throw a ReferenceError: __dirname is not defined in strict Node.js environments.
To fix this, define __dirname using fileURLToPath and dirname from node:url and node:path respectively.
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
export default defineConfig({
base: "/GDPevo/",
plugins: [react()],
build: {
outDir: "dist",
emptyOutDir: true,
rollupOptions: {
input: {
index: resolve(__dirname, "index.html"),
blog: resolve(__dirname, "blog.html")
}
}
}
});| const copyCitation = async () => { | ||
| if (!navigator.clipboard) return; | ||
| await navigator.clipboard.writeText(citation); | ||
| setCopied(true); | ||
| window.setTimeout(() => setCopied(false), 1500); | ||
| }; |
There was a problem hiding this comment.
Unlike copyBlogLink which implements a robust fallback using a temporary textarea for environments where navigator.clipboard is not available (such as non-secure HTTP contexts or older browsers), copyCitation lacks any fallback. Clicking the button in such environments will silently fail.
To ensure consistency and robustness, add the same fallback mechanism to copyCitation.
const copyCitation = async () => {
try {
if (navigator.clipboard) {
await navigator.clipboard.writeText(citation);
} else {
const input = document.createElement("textarea");
input.value = citation;
input.setAttribute("readonly", "");
input.style.position = "fixed";
input.style.opacity = "0";
document.body.appendChild(input);
input.select();
document.execCommand("copy");
document.body.removeChild(input);
}
setCopied(true);
window.setTimeout(() => setCopied(false), 1500);
} catch (e) {
setCopied(false);
}
};There was a problem hiding this comment.
Pull request overview
This pull request substantially restructures the public website and related docs: it removes the prior Slidev “teaser” decks and migrates the site/ GitHub Pages content to a React/Vite build with a new home/blog implementation and updated styling/copy.
Changes:
- Removed legacy Slidev teaser decks (
teaser/,teaser2/,teaser3/). - Introduced a React/Vite site build (new
site/src/*,vite.config.js,postbuild.mjs) and updated GitHub Pages workflow to build and deploysite/dist. - Updated site styling and refreshed project documentation/boards to align with “self-evolution” framing and held-out test terminology.
Reviewed changes
Copilot reviewed 42 out of 48 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| teaser3/slides.md | Removed Slidev v3 deck. |
| teaser3/package.json | Removed Slidev v3 package manifest. |
| teaser3/components/Pipeline.vue | Removed Slidev v3 pipeline component. |
| teaser2/slides.md | Removed Slidev v2 deck. |
| teaser2/package.json | Removed Slidev v2 package manifest. |
| teaser2/components/Pipeline.vue | Removed Slidev v2 pipeline component. |
| teaser/slides.md | Removed Slidev v1 deck. |
| teaser/package.json | Removed Slidev v1 package manifest. |
| teaser/components/Pipeline.vue | Removed Slidev v1 pipeline component. |
| site/vite.config.js | Added Vite build config for multi-page output (index.html, blog.html). |
| site/styles.css | Updated layout/typography and added blog-specific UI (TOC, benchmark figure, share button, etc.). |
| site/src/pages/HomePage.jsx | Added React home page (hero, results, tasks table). |
| site/src/pages/BlogPage.jsx | Added React blog page (sections, TOC, share/copy interactions). |
| site/src/main.jsx | Added React entrypoint. |
| site/src/lib/theme.js | Added theme selection + system theme resolution helpers. |
| site/src/lib/i18n.jsx | Added i18n helpers and localized Markdown rendering. |
| site/src/content/links.js | Centralized outbound links. |
| site/src/content/icons.js | Added icon definitions used by the React UI. |
| site/src/content/home.js | Added localized home-page copy/config. |
| site/src/content/blog.js | Added localized blog copy/config and citation. |
| site/src/content/benchmark.js | Added benchmark data feeding charts/tables. |
| site/src/components/Layout.jsx | Added shared header/footer with theme + language controls. |
| site/src/components/icons.jsx | Added SVG icon renderer/components. |
| site/src/components/BenchmarkFigure.jsx | Added interactive benchmark figure (metric toggle). |
| site/src/App.jsx | Added app shell handling routing-by-pathname, lang/theme persistence, and blog/home selection. |
| site/scripts/postbuild.mjs | Added postbuild script to copy .nojekyll + assets/ into dist/. |
| site/README.md | Updated site README (but currently contains inaccuracies called out in review comments). |
| site/package.json | Added site package manifest for React/Vite build. |
| site/blog.html | Converted blog page to React/Vite entry HTML with early theme/lang bootstrap. |
| README.zh.md | Refreshed Chinese top-level README copy and structure. |
| README.md | Refreshed English top-level README copy and structure. |
| experiments/README.zh.md | Updated terminology around evolution artifacts. |
| experiments/README.md | Updated terminology around evolution artifacts. |
| experiments/EXPERIMENT_BOARD.zh.md | Updated board copy to “self-evolution” framing and artifact terminology. |
| experiments/EXPERIMENT_BOARD.md | Updated board copy to “self-evolution” framing and artifact terminology. |
| data/README.zh.md | Updated data README to emphasize held-out test tasks and artifact terminology. |
| data/README.md | Updated data README to emphasize held-out test tasks and artifact terminology. |
| data/DATA_BOARD.zh.md | Updated board copy to held-out test framing and self-evolution wording. |
| data/DATA_BOARD.md | Updated board copy to held-out test framing and self-evolution wording. |
| assets/.gitkeep | Removed placeholder file. |
| .gitignore | Ignored site/dist. |
| .github/workflows/pages.yml | Updated Pages workflow to install/build the site and deploy site/dist. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| name: Deploy GitHub Pages | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - main | ||
| paths: | ||
| - site/** | ||
| - .github/workflows/pages.yml | ||
| workflow_dispatch: |
| The landing page is rendered by React and built into `dist/` before deployment. | ||
| `blog.html` remains a static article file and is copied into the build output. |
| | `src/` | React components and page data for the landing page. | | ||
| | `styles.css` | Shared site styling. | | ||
| | `blog.html` | Static blog article copied into `dist/` during build. | | ||
| | `scripts/postbuild.mjs` | Copies the static blog, assets, and `.nojekyll` into `dist/`. | |
| const copyCitation = async () => { | ||
| if (!navigator.clipboard) return; | ||
| await navigator.clipboard.writeText(citation); | ||
| setCopied(true); | ||
| window.setTimeout(() => setCopied(false), 1500); | ||
| }; |
What changed
Validation