Skip to content

Commit 9363065

Browse files
authored
RFC previews, no merging proposed RFCs (#46)
Merging proposed-but-not-accepted RFCs means they end up going stale and no one pushes them across the line. I think some of the rationale for that change was to be able to read rendered RFCs prior to merging. This change builds the "proposed" section as links to the open PRs. New PRs trigger a rebuild of the develop CI to include the latest PR listing. PRs also include their own preview link for rendered viewing, but since this link changes on every commit to the PR, the main page links to the PR and not directly to the rendered content. Follow Ups: * Remove proposed RFCs from develop, re-open PRs containing them --------- Signed-off-by: Nicholas Gates <nick@nickgates.com>
1 parent ee2c78a commit 9363065

17 files changed

Lines changed: 315 additions & 191 deletions

.github/workflows/ci.yml

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,44 @@ jobs:
3636
- name: Install dependencies
3737
run: bun install
3838

39-
- name: Check proposal matches PR number
39+
- name: Check RFC number matches PR number
4040
run: |
4141
BASE_SHA="${{ github.event.pull_request.base.sha }}"
4242
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
4343
PR_NUMBER="${{ github.event.pull_request.number }}"
4444
45-
CHANGED_PROPOSALS=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA" -- 'proposals/' \
46-
| grep -v '^proposals/0000-template\.md$' || true)
45+
# Grandfathered RFCs that predate the PR number convention
46+
GRANDFATHERED="5 15 23 24 27 29 33"
4747
48-
COUNT=$(echo "$CHANGED_PROPOSALS" | grep -c . || true)
48+
# Only check newly added RFC files, not moved/renamed ones
49+
CHANGED_RFCS=$(git diff --name-only --diff-filter=A "$BASE_SHA" "$HEAD_SHA" -- 'rfcs/' \
50+
| grep -v '^rfcs/0000-template\.md$' || true)
51+
52+
COUNT=$(echo "$CHANGED_RFCS" | grep -c . || true)
4953
5054
if [ "$COUNT" -gt 1 ]; then
51-
echo "::error::PR touches $COUNT proposals. Only one proposal per PR is allowed."
52-
echo "$CHANGED_PROPOSALS"
55+
echo "::error::PR touches $COUNT RFCs. Only one RFC per PR is allowed."
56+
echo "$CHANGED_RFCS"
5357
exit 1
5458
fi
5559
5660
if [ "$COUNT" -eq 1 ]; then
57-
FILE=$(echo "$CHANGED_PROPOSALS" | head -1)
61+
FILE=$(echo "$CHANGED_RFCS" | head -1)
5862
FILENAME=$(basename "$FILE")
5963
FILE_NUMBER=$(echo "$FILENAME" | grep -oE '^[0-9]+' || true)
6064
# Strip leading zeros for comparison
6165
FILE_NUM=$((10#$FILE_NUMBER))
6266
67+
# Skip check for grandfathered RFCs
68+
for GF in $GRANDFATHERED; do
69+
if [ "$FILE_NUM" -eq "$GF" ]; then
70+
echo "RFC $FILE_NUM is grandfathered, skipping PR number check."
71+
exit 0
72+
fi
73+
done
74+
6375
if [ "$FILE_NUM" -ne "$PR_NUMBER" ]; then
64-
echo "::error::Proposal number ($FILE_NUM from $FILENAME) does not match PR number ($PR_NUMBER)."
76+
echo "::error::RFC number ($FILE_NUM from $FILENAME) does not match PR number ($PR_NUMBER)."
6577
exit 1
6678
fi
6779
fi

.github/workflows/deploy.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ on:
44
push:
55
branches:
66
- develop
7+
pull_request:
8+
types: [opened, closed, reopened]
9+
branches:
10+
- develop
711

812
permissions:
913
contents: read
@@ -23,6 +27,7 @@ jobs:
2327
- name: Checkout
2428
uses: actions/checkout@v4
2529
with:
30+
ref: develop
2631
fetch-depth: 0
2732

2833
- name: Setup Bun

.github/workflows/preview.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: RFC Preview
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- develop
7+
8+
permissions:
9+
contents: read
10+
deployments: write
11+
12+
jobs:
13+
preview:
14+
env:
15+
GH_TOKEN: ${{ github.token }}
16+
runs-on: ubuntu-latest
17+
environment:
18+
name: rfc-preview
19+
url: ${{ steps.upload.outputs.artifact-url }}
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
with:
24+
fetch-depth: 0
25+
26+
- name: Setup Bun
27+
uses: oven-sh/setup-bun@v2
28+
29+
- name: Install dependencies
30+
run: bun install
31+
32+
- name: Build preview
33+
run: bun run index.ts --preview
34+
35+
- name: Upload RFC preview
36+
id: upload
37+
uses: actions/upload-artifact@v7
38+
with:
39+
name: rfc-preview-pr-${{ github.event.pull_request.number }}
40+
path: ./dist/preview.html
41+
archive: false

CLAUDE.md

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ Static site generator for Vortex RFC proposals built with Bun.
77
```
88
index.ts - Main build script and dev server
99
styles.css - Site styling (light/dark themes)
10-
proposed/ - RFC markdown files in proposed state
11-
accepted/ - RFC markdown files in accepted state
12-
completed/ - RFC markdown files in completed state
10+
rfcs/ - RFC markdown files (merged to develop = accepted)
1311
dist/ - Build output (gitignored)
1412
```
1513

16-
RFC filenames follow the format `NNNN-slug.md` (e.g., `0001-galp-patches.md`).
17-
Numbering is global across all states - no duplicates allowed.
14+
RFC filenames follow the format `NNNN-slug.md` (e.g., `0027-patches-format.md`).
15+
The RFC number must match the PR number used to propose it. No duplicate numbers allowed.
1816

1917
## Commands
2018

@@ -26,29 +24,24 @@ bun run clean # Remove dist/
2624

2725
## How the Build Works
2826

29-
1. Scans `proposed/`, `accepted/`, `completed/` for RFC files
27+
1. Scans `rfcs/` for RFC markdown files
3028
2. Parses RFC number from filename (e.g., `0002-foo.md` → RFC 0002)
31-
3. Determines state from containing folder
32-
4. Extracts title from first `# ` heading
33-
5. Converts markdown to HTML using `Bun.markdown.html()`
34-
6. Generates `dist/index.html` (table of contents with filter UI)
35-
7. Generates `dist/rfc/{number}.html` for each RFC
29+
3. Extracts title from first `# ` heading
30+
4. Converts markdown to HTML using `Bun.markdown.html()`
31+
5. Generates `dist/index.html` (table of contents)
32+
6. Generates `dist/rfc/{number}.html` for each RFC
3633

3734
## Dev Server
3835

3936
- Uses `Bun.serve()` to serve static files from `dist/`
40-
- Watches `proposed/`, `accepted/`, `completed/`, and `styles.css` for changes
37+
- Watches `rfcs/` and `styles.css` for changes
4138
- SSE endpoint at `/__reload` for live reload
4239

43-
## RFC States
40+
## RFC Workflow
4441

45-
RFCs progress through three states by moving files between folders:
46-
47-
- **proposed**: New RFCs under discussion
48-
- **accepted**: Approved RFCs ready for implementation
49-
- **completed**: Fully implemented RFCs
50-
51-
The index page shows a state pill for each RFC and supports filtering by state.
42+
1. Open a PR with a new file `rfcs/NNNN-slug.md` where NNNN matches the PR number
43+
2. PR builds a preview artifact for reviewers
44+
3. Merging the PR to `develop` accepts the RFC
5245

5346
## Styling
5447

accepted/.keep

Whitespace-only changes.

completed/.keep

Whitespace-only changes.

0 commit comments

Comments
 (0)