Skip to content
Closed
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
2 changes: 1 addition & 1 deletion .github/workflows/web-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v6
with:
version: 11.3.0
version: 11.7.0

- name: Use Node.js 24.x
uses: actions/setup-node@v6
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/web-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v6
with:
version: 11.3.0
version: 11.7.0

- name: Use Node.js 24.x
uses: actions/setup-node@v6
Expand Down
8 changes: 8 additions & 0 deletions packages/web/.mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
}
}
}
7 changes: 7 additions & 0 deletions packages/web/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# packages/web Agent Notes

This package is a Next.js 16 app. Before making Next.js-specific code or config changes, read the installed version-matched docs under `node_modules/next/dist/docs/`, starting with `node_modules/next/dist/docs/index.md`.

The project also enables Next DevTools MCP through `.mcp.json` using `next-devtools-mcp@latest`. When the dev server is running, Next.js 16 exposes its MCP endpoint at `/_next/mcp`; use the MCP server for live route, metadata, logs, and error diagnostics when available.

Keep the LazyCodex visual surface unchanged unless the user explicitly asks for design changes. Treat `DESIGN.md` as the source of truth for colors, typography, spacing, image behavior, and landing/docs information architecture.
2 changes: 1 addition & 1 deletion packages/web/e2e/docs.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ test.describe("docs page — structure", () => {

const body = page.locator("body")
await expect(body).toContainText("Built-in workflows")
await expect(body).toContainText("/init-deep")
await expect(body).toContainText("$init-deep")
await expect(body).toContainText("Feature coverage")
await expect(body).toContainText("review-work")
await expect(body).toContainText("remove-ai-slops")
Expand Down
17 changes: 12 additions & 5 deletions packages/web/e2e/lighthouse.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { test, expect } from "@playwright/test"
import lighthouse from "lighthouse"
import type { SharedFlagsSettings } from "lighthouse/types/lhr/settings.js"
import { writeFileSync, mkdirSync } from "node:fs"
import { join } from "node:path"
import { createServer, type AddressInfo } from "node:net"
Expand Down Expand Up @@ -66,8 +67,11 @@ async function prewarmServer(url: string): Promise<void> {
try {
const response = await fetch(url, { method: "GET" })
await response.text()
} catch {
// Ignore; the real Lighthouse run will surface failures.
} catch (error) {
if (process.env.DEBUG_LIGHTHOUSE_PREWARM === "1") {
const message = error instanceof Error ? error.message : String(error)
console.warn(`[Lighthouse prewarm] ${message}`)
}
}
}
}
Expand All @@ -76,8 +80,7 @@ type ChromiumModule = import("@playwright/test").BrowserType

async function lighthouseOnce(
url: string,
// biome-ignore lint/suspicious/noExplicitAny: lighthouse settings shape is internal
settings: any,
settings: SharedFlagsSettings,
chromium: ChromiumModule,
): Promise<LighthouseResult | undefined> {
const cdpPort = await findFreePort()
Expand Down Expand Up @@ -108,9 +111,9 @@ async function lighthouseOnce(
})
}
try {
// Open a real page first so Lighthouse has a target tab to navigate.
const context = await browser.newContext()
const page = await context.newPage()
await page.goto(url, { waitUntil: "networkidle" })
await page.goto("about:blank")

const result = (await lighthouse(
Expand Down Expand Up @@ -144,6 +147,8 @@ async function runLighthouse(
formFactor === "mobile"
? {
formFactor: "mobile" as const,
disableStorageReset: true,
throttlingMethod: "provided" as const,
screenEmulation: {
mobile: true,
width: 412,
Expand All @@ -154,6 +159,8 @@ async function runLighthouse(
}
: {
formFactor: "desktop" as const,
disableStorageReset: true,
throttlingMethod: "provided" as const,
screenEmulation: {
mobile: false,
width: 1350,
Expand Down
38 changes: 19 additions & 19 deletions packages/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "0.1.0",
"private": true,
"type": "module",
"packageManager": "pnpm@11.3.0",
"packageManager": "pnpm@11.7.0",
"engines": {
"node": ">=22"
},
Expand All @@ -23,30 +23,30 @@
"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts"
},
"dependencies": {
"geist": "^1.7.0",
"next": "15.5.18",
"react": "^19.2.0",
"react-dom": "^19.2.0"
"geist": "^1.7.2",
"next": "16.2.9",
"react": "^19.2.7",
"react-dom": "^19.2.7"
},
"devDependencies": {
"@biomejs/biome": "^2.4.15",
"@biomejs/biome": "^2.5.0",
"@opennextjs/cloudflare": "^1.19.11",
"@playwright/test": "1.60.0",
"@tailwindcss/postcss": "4.3.0",
"@types/node": "^25.9.1",
"@types/react": "^19.2.15",
"@playwright/test": "1.61.0",
"@tailwindcss/postcss": "4.3.1",
"@types/node": "^25.9.3",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"lighthouse": "^13.3.0",
"marked": "^18.0.0",
"lighthouse": "^13.4.0",
"marked": "^18.0.5",
"postcss": "^8.5.15",
"tailwindcss": "4.3.0",
"typescript": "^5.7.3",
"wrangler": "^4.93.0"
"tailwindcss": "4.3.1",
"typescript": "^6.0.3",
"wrangler": "^4.101.0"
},
"browserslist": [
"chrome >= 100",
"firefox >= 100",
"safari >= 15",
"edge >= 100"
"chrome >= 111",
"firefox >= 111",
"safari >= 16.4",
"edge >= 111"
]
}
Loading
Loading