Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Deploy website

on:
push:
branches: [main]
paths:
- ".github/workflows/pages.yml"
- "data/**"
- "scripts/build_readme.py"
- "website/**"
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: github-pages
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "22"
cache: npm
cache-dependency-path: website/package-lock.json
- name: Install dependencies
working-directory: website
run: npm ci
- name: Lint static site
working-directory: website
run: npm run lint
- name: Build and test static site
working-directory: website
run: npm test
- name: Configure GitHub Pages
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
- name: Upload website
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
with:
path: website/dist

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Source of truth

- Edit `data/papers.yaml`; do not hand-edit generated catalog tables, `data/papers.json`, `website/data/catalog.json`, `papers/*.md`, or `views/*.md`.
- Edit `data/papers.yaml`; do not hand-edit generated README stats, `data/papers.json`, `website/data/catalog.json`, `papers/*.md`, or `views/*.md`.
- Update `data/schema.json` and `docs/taxonomy.md` together when adding fields, products, statuses, or method tags.
- A product mention means the complete agent or harness, not merely a model from the same vendor.

Expand Down
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ All notable catalog and schema changes are recorded here.

- Interactive bilingual research catalog with full-text search and product, evidence, fairness, venue, and method filters
- Expandable paper evidence dossiers and recurring-method summaries
- Host-aware social sharing metadata and a dedicated Open Graph card
- Website build, server-rendering, catalog-parity, lint, and dependency-audit checks in CI
- GitHub Pages deployment with static social-sharing metadata and a dedicated Open Graph card
- Website build, component-rendering, catalog-parity, lint, and dependency-audit checks in CI

### Planned

Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ same_budget: unknown
3. Record authors, identifiers, system name, artifact status, and publication date from primary sources.
4. Choose the narrowest correct evidence class and comparison scope.
5. Record where the supporting result appears in the paper.
6. Run `make build` to regenerate READMEs, both JSON exports, views, and paper dossiers.
6. Run `make build` to regenerate README stats, both JSON exports, views, and paper dossiers.
7. Run `make check` and `make site-check` before opening a pull request.

Do not manually edit content between `CATALOG:*:START` and `CATALOG:*:END` markers in either README. Files under `papers/` and `views/`, plus `data/papers.json` and `website/data/catalog.json`, are also generated.
Do not manually edit content between the `CATALOG:STATS:START` and `CATALOG:STATS:END` markers in either README. Files under `papers/` and `views/`, plus `data/papers.json` and `website/data/catalog.json`, are also generated.

## Required source checks

Expand Down
189 changes: 20 additions & 169 deletions README.md

Large diffs are not rendered by default.

172 changes: 23 additions & 149 deletions README.zh-CN.md

Large diffs are not rendered by default.

28 changes: 5 additions & 23 deletions scripts/build_readme.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Build README tables, paper dossiers, research views, and JSON export."""
"""Build README stats, paper dossiers, research views, and JSON exports."""

from __future__ import annotations

Expand All @@ -19,19 +19,6 @@

GENERATED_NOTICE = "<!-- Generated from data/papers.yaml; do not edit by hand. -->"

SECTIONS = {
"direct": ("<!-- CATALOG:DIRECT:START -->", "<!-- CATALOG:DIRECT:END -->"),
"related": ("<!-- CATALOG:RELATED:START -->", "<!-- CATALOG:RELATED:END -->"),
"evaluation": (
"<!-- CATALOG:EVALUATION:START -->",
"<!-- CATALOG:EVALUATION:END -->",
),
"historical": (
"<!-- CATALOG:HISTORICAL:START -->",
"<!-- CATALOG:HISTORICAL:END -->",
),
}

STATS_MARKERS = ("<!-- CATALOG:STATS:START -->", "<!-- CATALOG:STATS:END -->")

PRODUCT_LABELS = {
Expand Down Expand Up @@ -195,14 +182,9 @@ def replace_section(text: str, start: str, end: str, content: str) -> str:
return updated


def render_marked_readme(path: Path, catalog: dict, language: str) -> str:
def render_marked_readme(path: Path, catalog: dict) -> str:
text = path.read_text(encoding="utf-8")
text = replace_section(text, *STATS_MARKERS, generate_stats(catalog))
papers = catalog["papers"]
for classification, (start, end) in SECTIONS.items():
selected = [paper for paper in papers if paper["classification"] == classification]
text = replace_section(text, start, end, generate_table(selected, language))
return text
return replace_section(text, *STATS_MARKERS, generate_stats(catalog))


def short_authors(paper: dict) -> str:
Expand Down Expand Up @@ -521,8 +503,8 @@ def render_all() -> dict[Path, str]:
catalog = load_catalog()
catalog_json = json.dumps(catalog, indent=2, ensure_ascii=False) + "\n"
outputs = {
README_PATH: render_marked_readme(README_PATH, catalog, "en"),
README_ZH_PATH: render_marked_readme(README_ZH_PATH, catalog, "zh"),
README_PATH: render_marked_readme(README_PATH, catalog),
README_ZH_PATH: render_marked_readme(README_ZH_PATH, catalog),
ROOT / "data" / "papers.json": catalog_json,
ROOT / "website" / "data" / "catalog.json": catalog_json,
ROOT / "papers" / "README.md": render_paper_index(catalog),
Expand Down
9 changes: 9 additions & 0 deletions tests/test_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ def test_generated_readme_is_current() -> None:
assert result.returncode == 0, result.stderr


def test_readmes_are_concise_website_entry_points() -> None:
website_url = "https://micromilo.github.io/awesome-claude-code-codex-papers/"
for filename in ("README.md", "README.zh-CN.md"):
text = (ROOT / filename).read_text(encoding="utf-8")
assert website_url in text
assert "CATALOG:DIRECT" not in text
assert len(text.splitlines()) < 100


def test_link_scan_excludes_dependencies_and_build_outputs(tmp_path: Path, monkeypatch) -> None:
(tmp_path / "README.md").write_text("# Project\n", encoding="utf-8")
for directory in ("node_modules", "dist", ".next", ".wrangler"):
Expand Down
9 changes: 0 additions & 9 deletions website/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@
# testing
/coverage

# next.js
/.next/
/.vinext/
/out/

# misc
.DS_Store
*.pem
Expand All @@ -31,10 +26,6 @@ yarn-error.log*
# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

/dist/
/.wrangler/
/outputs/
/work/
5 changes: 0 additions & 5 deletions website/.openai/hosting.json

This file was deleted.

9 changes: 8 additions & 1 deletion website/README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
# Research catalog website

Interactive HTML front end for the evidence catalog in `../data/papers.yaml`.
Static Vite front end for the evidence catalog in `../data/papers.yaml`,
published with GitHub Pages.

The site provides full-text search, product and evidence filters, method views,
comparison-control summaries, expandable paper dossiers, English/Chinese UI,
and a small GitHub Star call to action.

`../scripts/build_readme.py` generates `data/catalog.json`; do not edit that
file by hand.

```bash
npm install
npm run dev
npm test
```
2 changes: 0 additions & 2 deletions website/app/CatalogExplorer.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
"use client";

import { useEffect, useMemo, useRef, useState } from "react";

type ProductId = "claude-code" | "codex-cli" | "openai-codex-model";
Expand Down
4 changes: 2 additions & 2 deletions website/app/globals.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
@import "tailwindcss";

:root {
--ink: #0d1718;
--ink-soft: #334445;
Expand All @@ -9,6 +7,8 @@
--coral: #f16f51;
--cyan: #4bcbd5;
--mint: #7be0a9;
--font-geist-sans: "Helvetica Neue", Helvetica, Arial, sans-serif;
--font-geist-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
}

* {
Expand Down
76 changes: 0 additions & 76 deletions website/app/layout.tsx

This file was deleted.

11 changes: 0 additions & 11 deletions website/app/page.tsx

This file was deleted.

4 changes: 0 additions & 4 deletions website/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { defineConfig, globalIgnores } from "eslint/config";
import eslint from "@eslint/js";
import next from "@next/eslint-plugin-next";
import jsxA11y from "eslint-plugin-jsx-a11y";
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";
Expand All @@ -9,19 +8,16 @@ import tseslint from "typescript-eslint";

const eslintConfig = defineConfig([
globalIgnores([
".next/**",
"dist/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
eslint.configs.recommended,
...tseslint.configs.recommended,
react.configs.flat.recommended,
react.configs.flat["jsx-runtime"],
reactHooks.configs.flat["recommended-latest"],
jsxA11y.flatConfigs.recommended,
next.configs["core-web-vitals"],
{
languageOptions: {
globals: {
Expand Down
Loading