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
60 changes: 60 additions & 0 deletions .context/retros/2026-03-22-1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"date": "2026-03-22",
"window": "7d",
"metrics": {
"commits": 23,
"contributors": 1,
"prs_merged": 0,
"insertions": 17007,
"deletions": 504,
"net_loc": 16503,
"test_loc": 415,
"test_ratio": 0.024,
"active_days": 3,
"sessions": 9,
"deep_sessions": 1,
"avg_session_minutes": 16,
"loc_per_session_hour": 5500,
"feat_pct": 0.39,
"fix_pct": 0.43,
"docs_pct": 0.13,
"peak_hour": 20,
"ai_assisted_commits": 19
},
"authors": {
"shenxianpeng": {
"commits": 23,
"insertions": 17007,
"deletions": 504,
"test_ratio": 0.024,
"top_area": "website/"
}
},
"version_range": ["initial", "initial"],
"streak_days": 3,
"tweetable": "Week of Mar 15: 23 commits, 17k LOC, 3 active days, 9 sessions | Streak: 3d | 83% AI-assisted",
"backlog": {
"total_open": 9,
"p0_p1": 0,
"p2": 1,
"p3": 1,
"completed_this_period": 0,
"added_this_period": 2
},
"test_health": {
"total_test_files": 10,
"tests_added_this_period": 0,
"regression_test_commits": 0,
"test_files_changed": 0
},
"skill_usage": {
"office-hours": 6,
"plan-eng-review": 3,
"plan-ceo-review": 2,
"qa": 2,
"ship": 1,
"document-release": 1,
"design-review": 1,
"retro": 1
}
}
33 changes: 14 additions & 19 deletions .github/workflows/deploy-website.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# CAST — Deploy official website to GitHub Pages
#
# Triggers on push to main (website/ or docs/ changes).
# Builds HTML from Markdown sources, then serves website/ at
# https://castops.github.io/cast/
# Builds HTML from Markdown sources, then pushes website/ to the
# gh-pages branch. PR preview subdirectories (pr-*/) are preserved.
#
# Pages source must be set to: Deploy from branch → gh-pages → / (root)
# Repo Settings → Pages → Source → Deploy from a branch

name: Deploy Website

Expand All @@ -15,21 +18,16 @@ on:
workflow_dispatch:

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

concurrency:
group: pages
group: pages-main
cancel-in-progress: false

jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4

Expand All @@ -44,14 +42,11 @@ jobs:
- name: Build docs HTML from Markdown
run: python scripts/build_docs.py

- name: Setup Pages
uses: actions/configure-pages@v5

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
- name: Deploy to gh-pages branch
uses: JamesIves/github-pages-deploy-action@v4
with:
path: website/

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
folder: website
branch: gh-pages
clean: true
clean-exclude: |
pr-*
5 changes: 4 additions & 1 deletion .github/workflows/devsecops.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,10 @@ jobs:
- name: pip-audit
run: |
pip install pip-audit
pip-audit
pip install -e ".[dev]"
# CVE-2026-4539: ReDoS in pygments AdlLexer — no fix released yet
# (https://github.com/advisories/GHSA-5239-wwwm-4pmq); re-enable once patched
pip-audit --ignore-vuln CVE-2026-4539

# ── 4. Container Security ──────────────────────────────────────────────────
container:
Expand Down
38 changes: 38 additions & 0 deletions .github/workflows/pr-preview-cleanup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# CAST — PR Preview Cleanup
#
# Removes the pr-{number}/ subdirectory from the gh-pages branch
# when a pull request is closed (merged or dismissed).

name: PR Preview Cleanup

on:
pull_request:
types: [closed]

permissions:
contents: write

jobs:
cleanup:
name: Remove PR preview
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: gh-pages
fetch-depth: 1

- name: Remove preview directory for PR #${{ github.event.number }}
env:
PR_NUM: ${{ github.event.number }}
run: |
if [ -d "pr-${PR_NUM}" ]; then
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git rm -rf "pr-${PR_NUM}"
git commit -m "chore: remove preview for PR #${PR_NUM}"
git push
echo "Removed pr-${PR_NUM}/"
else
echo "No preview directory found for PR #${PR_NUM} — nothing to clean up."
fi
83 changes: 83 additions & 0 deletions .github/workflows/pr-preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# CAST — PR Preview Deployment
#
# Deploys a preview of the website to the gh-pages branch under
# pr-{number}/ on every push to a pull request.
# Posts a comment with the preview URL (updates existing comment on re-push).
# Cleaned up automatically when the PR is closed.

name: PR Preview

on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- 'website/**'
- 'docs/**'

permissions:
contents: write
pull-requests: write

concurrency:
group: pr-preview-${{ github.event.number }}
cancel-in-progress: true

jobs:
preview:
name: Deploy PR preview
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install Markdown library
run: pip install markdown

- name: Build docs HTML from Markdown
run: python scripts/build_docs.py

- name: Deploy to gh-pages/pr-${{ github.event.number }}/
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: website
branch: gh-pages
target-folder: pr-${{ github.event.number }}
clean: true

- name: Post preview URL comment
uses: actions/github-script@v7
with:
script: |
const pr = context.issue.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
const base = `https://${owner}.github.io/${repo}/pr-${pr}`;
const sha = context.payload.pull_request.head.sha.slice(0, 7);

const body = [
`## 🔍 Preview ready`,
``,
`| Page | URL |`,
`|------|-----|`,
`| EN homepage | [${base}/](${base}/) |`,
`| ZH homepage | [${base}/zh/](${base}/zh/) |`,
`| Docs (EN) | [${base}/docs/getting-started.html](${base}/docs/getting-started.html) |`,
`| Docs (ZH) | [${base}/zh/docs/getting-started.html](${base}/zh/docs/getting-started.html) |`,
``,
`> Built from \`${sha}\`. Updates on every push. Removed when PR is closed.`,
].join('\n');

const comments = await github.rest.issues.listComments({ owner, repo, issue_number: pr });
const existing = comments.data.find(
c => c.user.login === 'github-actions[bot]' && c.body.includes('Preview ready')
);

if (existing) {
await github.rest.issues.updateComment({ owner, repo, comment_id: existing.id, body });
} else {
await github.rest.issues.createComment({ owner, repo, issue_number: pr, body });
}
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,37 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

## [Unreleased]

## [0.1.1] — 2026-03-24

### Changed

- **Complete website redesign (EN + ZH)** — redesigned `website/index.html` and
`website/zh/index.html` to the Industrial Editorial design system defined in `DESIGN.md`:
- Display font: Fraunces 900 (headlines/hero) with Instrument Sans body and IBM Plex Sans
Condensed labels
- Color palette: warm near-black `#0D0C0B` background, electric chartreuse `#CBFF2E`
accent, warm off-white `#EDE9E3` text
- 55/45 left-anchored hero grid with diagonal structural line
- Operator-console section labels (uppercase, IBM Plex Sans Condensed, chartreuse hairline)
- Replaced GitHub-ish blue/gray palette with Industrial Editorial tokens
- **Website navigation and link fixes:**
- Fixed root-relative hrefs (`/`, `/index.html`) → relative paths (`./`) for correct
GitHub Pages project-site routing
- Fixed broken `../docs/` links → rendered HTML docs at `docs/getting-started.html`
and `docs/plugin-guide.html` (built by `scripts/build_docs.py` at deploy time)
- Unified GitHub repo references to `castops/cast-cli` in both language variants
- Added `target="_blank" rel="noopener noreferrer"` to all external links in both files
- **Website SEO and meta improvements:**
- Added `og:title`, `og:description`, `og:type` Open Graph tags to EN page
- Fixed stale `og:title` mismatch with `<title>` in EN page
- Added `<meta name="theme-color" content="#0D0C0B">` to both pages
- Added `<link rel="canonical">` to both pages
- Added `hreflang` alternate link tags (`en` / `zh-CN`) to both pages
- Fixed `preconnect` hint to add missing `crossorigin` attribute on `fonts.googleapis.com`
- Fixed EN nav `color-mix()` background → `rgba()` with `-webkit-backdrop-filter` for
Safari/WebView/enterprise browser compatibility
- Added mobile responsive nav collapse at 900px breakpoint to ZH page

### Added

- **Node.js and Go GitHub Actions templates** — production-ready pipelines for both stacks:
Expand Down
15 changes: 15 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# CLAUDE.md — CastOps Project Instructions

## Design System
Always read `DESIGN.md` before making any visual or UI decisions.
All font choices, colors, spacing, border-radius, and aesthetic direction are defined there.
Do not deviate without explicit user approval.

Key rules:
- **Display font:** Fraunces (serif) — never substitute with Inter, Roboto, or other grotesks without approval
- **Accent color:** `#CBFF2E` (electric chartreuse) — use sparingly; this is a high-value signal color, not a background fill
- **Background:** `#0D0C0B` (warm near-black) — not cool gray, not pure black
- **Aesthetic:** Industrial Editorial — asymmetric, left-anchored, operator-console energy
- **Never:** purple gradients, 3-column icon grids, centered hero with floating CTA, glassmorphism, decorative blobs

In QA mode, flag any code that doesn't match `DESIGN.md` — including font substitutions, off-palette colors, or layout patterns that conflict with the defined aesthetic.
Loading
Loading