feat(skills): add run-upline skill, verified against staging - #96
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
chiptus
force-pushed
the
claude/skills-command-45yepf
branch
from
July 6, 2026 05:06
fa6391d to
7c28dd0
Compare
chiptus
commented
Jul 6, 2026
Fix driver.mjs to reach *.supabase.co through the agent proxy (proxy wiring, localhost bypass, and TLS 1.2 cap to dodge a ClientHello reset) and rewrite SKILL.md's Setup/Run around staging env vars instead of the placeholder .env.local approach. Verified real festival/artist data renders end-to-end.
chiptus
commented
Jul 7, 2026
Per PR review: the VITE_SUPABASE_PUBLISHABLE_KEY env var rename is already live, so the alias workaround is unnecessary; and allowed-tools scopes pnpm to only install/run dev instead of a full wildcard.
The Setup section no longer copies .env.local.example (which pointed at a dead local Supabase URL), so the actual failure mode when staging prerequisites are missing is now an immediate boot-time throw, not a perpetual loading spinner + connection-refused. Verified by unsetting the env vars and re-driving the app.
Root-cause mechanism detail for the proxy/TLS issue already lives as a comment in driver.mjs; SKILL.md doesn't need to duplicate it.
chiptus
commented
Jul 8, 2026
Scope allowed-tools' node entry to driver.mjs specifically instead of any node invocation. Drop the Setup prerequisite check (env + curl to Supabase) since the driver's own error output already surfaces a missing/stale env var clearly (see Gotchas) — lets env drop from allowed-tools too; curl stays for the dev-server readiness poll.
Only remaining curl use is the fixed readiness-poll invocation against 127.0.0.1:8080 in the run loop; match it exactly instead of allowing any curl invocation, consistent with the other repo skills that only use trailing-wildcard prefixes (mid-string wildcards aren't a pattern this permission system supports).
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces new agent skills to run the UpLine Vite SPA locally and verify UI behavior via headless Chromium screenshots against staging Supabase, and updates the Vite dev server host binding to support that workflow.
Changes:
- Add a
run-uplineskill with a Node driver that launches Chromium and captures screenshots for specific routes. - Vendor the
playwright-cliskill documentation and reference guides for interactive browser automation. - Update Vite dev server config (
server.host) to change how the dev server binds to network interfaces.
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
vite.config.ts |
Changes Vite dev server host binding behavior. |
.claude/skills/run-upline/SKILL.md |
Documents the new run/screenshot workflow and environment constraints. |
.claude/skills/run-upline/driver.mjs |
Implements headless navigation + screenshot capture via Playwright/Chromium. |
.claude/skills/playwright-cli/SKILL.md |
Adds the Playwright CLI skill documentation and command reference. |
.claude/skills/playwright-cli/references/video-recording.md |
Adds reference docs for recording flows. |
.claude/skills/playwright-cli/references/tracing.md |
Adds reference docs for tracing. |
.claude/skills/playwright-cli/references/test-generation.md |
Adds reference docs for generating tests. |
.claude/skills/playwright-cli/references/storage-state.md |
Adds reference docs for storage state management. |
.claude/skills/playwright-cli/references/spec-driven-testing.md |
Adds reference docs for spec-driven workflows. |
.claude/skills/playwright-cli/references/session-management.md |
Adds reference docs for session isolation/management. |
.claude/skills/playwright-cli/references/running-code.md |
Adds reference docs for running custom Playwright code. |
.claude/skills/playwright-cli/references/request-mocking.md |
Adds reference docs for request interception/mocking. |
.claude/skills/playwright-cli/references/playwright-tests.md |
Adds reference docs for running/debugging tests. |
.claude/skills/playwright-cli/references/element-attributes.md |
Adds reference docs for inspecting element attributes. |
- vite.config.ts: bind dev server to 127.0.0.1 instead of all interfaces (host: true) — the driver only ever needs 127.0.0.1, and the LAN exposure was an unintended side effect of fixing IPv6-only binding. - driver.mjs: throw a clear error if the Chromium glob matches nothing, instead of silently launching with executablePath: undefined. - driver.mjs: replace "networkidle" with load + bounded networkidle (8s) + a text-based "Loading <noun>..." fallback check, so a future long-lived connection can't cause a 30s hang, while keeping the correctness networkidle already had for this app's multi-stage fetches (verified against /, /privacy, /festivals/anta). - driver.mjs: wrap navigation/screenshot in try/finally so a thrown error still closes the browser instead of leaking a headless Chromium process across repeated agent runs (verified no orphaned process after a forced connection-refused failure).
- vite.config.ts: remove server.host entirely instead of pinning 127.0.0.1 — Vite's own default already binds both 127.0.0.1 and localhost with no LAN exposure, which was the actual goal. Pinning to 127.0.0.1 alone risked breaking Playwright's webServer/baseURL, which poll http://localhost:8080 for e2e (localhost can resolve to ::1 first on some systems). - driver.mjs: build the target URL with `new URL(path, base)` instead of naive string concatenation, so a BASE_URL with a path prefix or a path missing its leading slash still resolves correctly. Re-verified the TLS-downgrade launch flags (--ignore-certificate-errors, --ssl-version-max=tls1.2) are still required: removing them and giving the request a long enough timeout (20s) still surfaces the same net::ERR_CONNECTION_RESET on the Supabase request as originally diagnosed — they were just slower to fail than the driver's normal wait budget, not actually unnecessary.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds the run-upline skill (SKILL.md + a Chromium driver) to boot and screenshot the app headlessly against staging Supabase, and installs the official playwright-cli skill. Lets a future agent verify UI changes against the real running app with real data, not just tests.
Verification
pnpm install --ignore-scriptsthenpnpm run dev(with stagingVITE_SUPABASE_URL/VITE_SUPABASE_PUBLISHABLE_KEYin env) — dev server comes up on 8080.node .claude/skills/run-upline/driver.mjs / /tmp/home.png— real festival cards render (Anta, Boom Festival, Desert Bass, …), matching a direct REST call to the same staging endpoint.node .claude/skills/run-upline/driver.mjs /festivals/anta /tmp/anta.png— real artist list and set times render for that festival.node .claude/skills/run-upline/driver.mjs /festivals/does-not-exist— Supabase 406 surfaces cleanly through the app's error boundary./privacyand/termsrender fully without a backend.