Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
bb3a59b
ci: retarget publish-now to v0.1.0 (was stale at v0.1.1) [skip ci]
hoainho May 19, 2026
9f8788a
ci(cleanup): remove one-shot workflows now that v0.1.0 shipped [skip ci]
hoainho May 20, 2026
415ad60
fix: 8 BLOCKER+BUG fixes from Wave 1 of v0.2.0 audit
hoainho May 20, 2026
5acebfe
ci: temporary whoami debug workflow [skip ci]
hoainho May 20, 2026
298bbc8
ci: remove debug workflow [skip ci]
hoainho May 20, 2026
34598cb
ci(publish-stable): workflow_dispatch bypasses bot-commit guard
hoainho May 20, 2026
e5fdd9e
feat(core,driver): syntheticInteraction option + nested iframe covera…
hoainho May 20, 2026
915b511
feat(core): wire measure() programmatic API to runEngine (Wave 2 #7) …
hoainho May 20, 2026
f23f34d
fix(core): extract measure() Node-only path to measure-node.ts (exten…
hoainho May 20, 2026
efe53fd
feat(viewer): implement CWV per-run sparkline (Wave 2 #10) [skip ci]
hoainho May 20, 2026
3d5163b
feat(core): SourceLocation type + sourcemap detection MVP (Wave 2 #17…
hoainho May 20, 2026
e4be8fd
feat(driver-playwright): real per-frame CDPSession for OOPIFs (Wave 2…
hoainho May 20, 2026
98f74a9
feat(eslint-plugin): @ohmyperf/eslint-plugin with 7 CWV-linked rules …
hoainho May 20, 2026
b75c476
feat(fixers,mcp): propose_patch MCP tool + @ohmyperf/fixers package (…
hoainho May 20, 2026
b650b10
feat(mcp): verify_fix MCP tool — close the agent fix loop (Wave 2 #19…
hoainho May 20, 2026
7484de5
feat(reporter-markdown): top-of-PR CWV verdict block + status emojis …
hoainho May 20, 2026
2cb785e
feat(viewer,reporter-deck): print-color-adjust: exact preserves CWV t…
hoainho May 20, 2026
121ae34
feat(viewer): SVG status dots replace ASCII icons + fix W2-#10 stale …
hoainho May 20, 2026
78bf4f4
feat(cli): top-of-output PASS/FAIL verdict banner (Wave 3 #21) [skip ci]
hoainho May 20, 2026
90bb891
feat(distribution): credential-ready deploy configs + listing prep (W…
hoainho May 20, 2026
060e287
test: clear stale test debt accumulated across the workspace [skip ci]
hoainho May 20, 2026
a41301f
fix(ci,mcp): retire macos-13 runner + expose savedPath in measure() s…
hoainho May 20, 2026
771f63b
docs: NPM_TOKEN failure is E404 (read-only token), not E401 — correct…
hoainho May 20, 2026
8f11e84
ci(publish-stable): preflight NPM_TOKEN against registry before pipel…
hoainho May 20, 2026
3826c8c
docs(harness): add Distribution Runbook section linking the 4 deploy …
hoainho May 20, 2026
a019bf0
ci(publish-stable): enable npm Trusted Publishing (OIDC) path — elimi…
hoainho May 20, 2026
3efe4d6
ci(publish-stable): preflight skips itself in OIDC-only mode (don't b…
hoainho May 20, 2026
d476180
docs(readme): surface v0.2.0 features — agent fix loop, eslint-plugin…
hoainho May 20, 2026
8160292
ci+docs: actionlint as recurring CI job + README honesty about v0.2.0…
hoainho May 20, 2026
08e6797
ci(publish-beta): symmetric OIDC + preflight parity with publish-stab…
hoainho May 20, 2026
e75e320
docs(changelog,ci): purge phantom v0.1.1 entry + drop chore [skip ci]…
hoainho May 20, 2026
984a691
fix(fixers): meaningful skipped entries + mimeType classification (re…
hoainho May 20, 2026
11b3620
docs(eslint-plugin,readme): document @typescript-eslint/parser requir…
hoainho May 20, 2026
195a8e9
fix(core,mcp): honest small-sample stats in diff + verify_fix runs de…
hoainho May 20, 2026
dc710f2
feat(core,mcp): LLM-first report signals — trustScore, fixPlan, serva…
hoainho May 20, 2026
601c756
feat(core,llm-signals): fixes W1-W5 from real-world Phase 2 demo [ski…
hoainho May 20, 2026
3025cb2
fix(mcp,core,test): Phase 6 — address all 14 QA findings from 3-agent…
hoainho May 20, 2026
60f60b4
docs(harness): 7 amendments from v0.2.0 session retrospective [skip ci]
hoainho May 20, 2026
3214649
fix: address Gemini PR #8 review feedback (4 findings) [skip ci]
hoainho May 20, 2026
a8d6b68
feat(launch): repo-public polish — README hero, share UX, launch draf…
hoainho May 20, 2026
747566d
feat(deploy): zero-credential GitHub Pages mirror of website
hoainho May 21, 2026
87eaa3a
docs(readme): retarget remaining ohmyperf.dev links to live Pages site
hoainho May 21, 2026
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
14 changes: 11 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@ jobs:
matrix:
os:
- macos-15
- macos-13
- macos-14
- ubuntu-24.04
- ubuntu-22.04
- windows-2022
node: ["22.x", "24.x"]
exclude:
- os: macos-13
node: "24.x"
- os: ubuntu-22.04
node: "24.x"
steps:
Expand Down Expand Up @@ -94,6 +92,16 @@ jobs:
- run: pnpm --filter @ohmyperf/core build
- run: pnpm --filter @ohmyperf/core api:check

actionlint:
name: actionlint (GitHub Actions workflow files)
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Download actionlint
run: bash <(curl -sSf https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) 1.7.12
- name: Lint all workflow files
run: ./actionlint -no-color -oneline

parity:
name: Lighthouse parity (main push only)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
Expand Down
73 changes: 73 additions & 0 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: deploy-pages

# Zero-credential GitHub Pages deploy of apps/website to
# https://hoainho.github.io/ohmyperf/ . Parallel to deploy-website.yml
# (Cloudflare Pages, needs secrets). Keep build steps in lockstep.

on:
workflow_dispatch: {}
push:
branches: [main]
paths:
- 'apps/website/**'
- 'packages/viewer/**'
- 'packages/design-tokens/**'
- 'pnpm-lock.yaml'
- '.github/workflows/deploy-pages.yml'

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

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

jobs:
build:
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: 22.x
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build website (static export with basePath=/ohmyperf)
env:
OHMYPERF_BASE_PATH: /ohmyperf
run: pnpm --filter '@ohmyperf/website...' build

- name: Verify out/ exists
run: |
test -d apps/website/out || (echo "Missing apps/website/out — Next.js static export failed" && exit 1)
test -f apps/website/out/index.html || (echo "Missing apps/website/out/index.html" && exit 1)
echo "Static export OK ($(find apps/website/out -type f | wc -l) files)"

- name: Disable Jekyll on Pages
run: touch apps/website/out/.nojekyll

- uses: actions/configure-pages@v5

- uses: actions/upload-pages-artifact@v3
with:
path: apps/website/out

deploy:
needs: build
runs-on: ubuntu-24.04
timeout-minutes: 10
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@v4
64 changes: 64 additions & 0 deletions .github/workflows/deploy-website.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: deploy-website

on:
workflow_dispatch:
inputs:
branch:
description: 'Cloudflare Pages branch (production = main, anything else = preview)'
required: false
default: 'main'
push:
branches: [main]
paths:
- 'apps/website/**'
- 'packages/viewer/**'
- 'packages/design-tokens/**'
- 'pnpm-lock.yaml'
- '.github/workflows/deploy-website.yml'

concurrency:
group: deploy-website-${{ github.ref }}
cancel-in-progress: false

jobs:
deploy:
runs-on: ubuntu-24.04
timeout-minutes: 15
permissions:
contents: read
deployments: write
steps:
- uses: actions/checkout@v4

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: 22.x
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build website (static export)
run: pnpm --filter '@ohmyperf/website...' build

- name: Verify out/ exists
run: |
test -d apps/website/out || (echo "Missing apps/website/out — Next.js static export failed" && exit 1)
test -f apps/website/out/index.html || (echo "Missing apps/website/out/index.html" && exit 1)
echo "Static export OK ($(find apps/website/out -type f | wc -l) files)"

- name: Deploy to Cloudflare Pages
id: deploy
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
command: pages deploy apps/website/out --project-name=ohmyperf --branch=${{ github.event.inputs.branch || github.ref_name }}

- name: Print deployment URL
run: |
echo "Deployed to: ${{ steps.deploy.outputs.deployment-url }}"
echo "Alias URL: ${{ steps.deploy.outputs.pages-deployment-alias-url }}"
36 changes: 35 additions & 1 deletion .github/workflows/publish-beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
timeout-minutes: 20
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -26,10 +27,43 @@ jobs:

- uses: actions/setup-node@v4
with:
node-version: "22"
node-version: "24"
registry-url: "https://registry.npmjs.org"
cache: pnpm

- name: Preflight — verify NPM_TOKEN authenticates (skipped in OIDC-only mode)
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
set +e
if [ -z "${NODE_AUTH_TOKEN}" ]; then
echo "::notice::NPM_TOKEN secret is empty — preflight skipped. Workflow will publish via OIDC trusted publishing only (see docs/PUBLISH-NPM-OIDC.md). If OIDC is not yet configured for these packages on npmjs.com, the publish step will fail with E404 — that is the signal to either (a) configure trusted publishers per the OIDC doc, or (b) set the NPM_TOKEN secret for token-based publishing."
exit 0
fi
echo "NPM_TOKEN is set — running token-mode preflight."
WHOAMI_OUT=$(npm whoami 2>&1)
WHOAMI_RC=$?
if [ $WHOAMI_RC -ne 0 ]; then
{
echo "::error::NPM_TOKEN is set but does not authenticate. npm whoami output: $WHOAMI_OUT"
echo "::error::This is an E401-class failure (invalid or expired token)."
echo "::error::Fix: regenerate the token per docs/PUBLISH-NPM-TOKEN.md, OR remove the secret to use OIDC per docs/PUBLISH-NPM-OIDC.md."
}
exit 1
fi
echo "npm whoami: $WHOAMI_OUT"
ACCESS_OUT=$(npm access list packages @ohmyperf 2>&1)
ACCESS_RC=$?
echo "$ACCESS_OUT" | head -20
if [ $ACCESS_RC -ne 0 ]; then
{
echo "::warning::npm access list failed for @ohmyperf (exit=$ACCESS_RC)."
echo "::warning::Token may be a Granular Access Token without 'Read and write' on @ohmyperf scope."
echo "::warning::If the actual publish step below fails with E404 PUT, that is the symptom — see docs/PUBLISH-NPM-TOKEN.md."
}
fi
echo "Preflight passed: token authenticates."

- name: Install
run: pnpm install --frozen-lockfile

Expand Down
101 changes: 0 additions & 101 deletions .github/workflows/publish-now.yml

This file was deleted.

Loading