Files
remorses__playwriter/website/package.json
Tommy D. Rossi 96575c1b69 feat: custom tab group names and colors per session
Sessions can now specify a custom Chrome tab group name and color via
`playwriter session new --name myproject --color red`. Different sessions
with different names get separate Chrome tab groups.

The metadata flows through: CLI options → relay HTTP → CDP URL query params →
relay state (PlaywrightClient) → forwardCDPCommand params → extension TabInfo →
chrome.tabGroups API.

Key changes:

**Extension (0.0.74 → 0.0.77)**
- Add groupName/groupColor fields to TabInfo
- Rewrite syncTabGroup to manage multiple named groups independently
- Add updateTabGroupWithRetry to handle Chrome's race condition where
  tabGroups.update() silently fails right after tabs.group()
- Fix tab group flapping bug: only apply group metadata on
  Target.createTarget, not on every CDP command. Broadcast commands like
  Target.setAutoAttach were overwriting unrelated tabs' group metadata
- Add tabsBeingMoved guard set so programmatic ungroup/regroup during
  syncTabGroup doesn't trigger disconnect via onUpdated handler
- Narrow store subscriber to only trigger syncTabGroup on group-relevant
  field changes (state, groupName, groupColor)

**Playwriter MCP/CLI (0.0.85 → 0.0.87)**
- Add --name and --color options to `session new` CLI command
- Forward groupName/groupColor through getCdpUrl query params
- Store group metadata on PlaywrightClient in relay state
- Only inject group fields into forwardCDPCommand on Target.createTarget
  to prevent the flapping bug
- Pass clientId through handleCDPCommand so relay can look up group metadata

**Website**
- Add markdown.tsx route using safe-mdx for markdown-driven editorial pages

Backward compatible: older extensions ignore the new fields, omitting
options preserves the default 'playwriter' green group.
2026-03-07 22:34:42 +01:00

53 lines
1.5 KiB
JSON

{
"name": "website",
"private": true,
"type": "module",
"scripts": {
"placeholders": "tsx scripts/generate-placeholders.ts",
"build": "tsx scripts/generate-placeholders.ts && react-router build",
"dev": "react-router dev --port 8044",
"typecheck": "react-router typegen && tsc"
},
"exports": {
"./*": "./*"
},
"dependencies": {
"@radix-ui/react-slot": "^1.2.4",
"@react-router/fs-routes": "^7.11.0",
"@react-router/node": "^7.11.0",
"@sentry/node": "^10.32.1",
"@tailwindcss/typography": "^0.5.19",
"@types/prismjs": "^1.26.6",
"@vercel/react-router": "^1.2.4",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"isbot": "^5.1.32",
"lucide-react": "^0.562.0",
"prismjs": "^1.30.0",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"react-router": "^7.11.0",
"safe-mdx": "^1.3.9",
"sentries": "^0.2.2",
"string-dedent": "^3.0.2",
"tailwind-merge": "^3.4.0",
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"@react-router/dev": "^7.11.0",
"@tailwindcss/vite": "^4.2.0",
"@types/node": "^25.0.3",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.2",
"@xmorse/deployment-utils": "^0.7.2",
"sharp": "^0.34.5",
"tailwindcss": "^4.2.0",
"typescript": "^5.9.3",
"vite": "^7.3.0",
"vite-plugin-environment": "^1.1.3",
"vite-tsconfig-paths": "^6.0.3",
"vitest": "^4.0.16"
}
}