[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HQFE4QFMMTTS3V2F7H2K37":3,"skill-same:01M6HQFE4QFMMTTS3V2F7H2K37":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6HQFE4QFMMTTS3V2F7H2K37","run-dashboard-e2e-local-changes",null,"Run Playwright E2E (tests\u002Fe2e\u002F) against the docker\u002F all-in-one harness so it reflects LOCAL code changes, not a stale cached image.","BlackBeltTechnology\u002Fpi-agent-dashboard","BlackBeltTechnology","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8101592?v=4","01M6HQDX7QAJA0QP4NYRYBMJ8A","BlackBelt Technology","01M6HQDXCC7719N9YDMQVH9JS6",348,"MIT","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002F.pi\u002Fskills\u002Frun-dashboard-e2e-local-changes\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"dashboard","run","run dashboard e2e local changes","changes","e2e","local","stale","2026","playwright e2e","all-in-one","it","tests","image","harness","code","playwright","docker","2026-11-10 10:12:30",false,"---\nname: \"run-dashboard-e2e-local-changes\"\ndescription: \"Run Playwright E2E (tests\u002Fe2e\u002F) against the docker\u002F all-in-one harness so it reflects LOCAL code changes, not a stale cached image.\"\nversion: 3\ncreated: \"2026-06-24\"\nupdated: \"2026-07-13\"\n---\n## When to Use\nUse when validating local dashboard changes via the Docker browser-E2E harness (npm run test:e2e), or when a new\u002Fedited E2E spec mysteriously fails to see your code. The harness's test-up.sh runs `docker compose up` WITHOUT `--build`, so it reuses a cached `pi-dashboard:local` image and your committed changes are NOT in the running container until you rebuild.\n\n## Procedure\n1. Rebuild the image from current source FIRST: `docker compose -f docker\u002Fcompose.yml build` (Dockerfile COPYs packages\u002F + runs npm install && npm run build → bakes local source). Slow (~4-6 min: apt + npm install + build).\n2. Run the suite (or one spec): `npm run test:e2e` or `npx playwright test \u003Cspec-name>`. Playwright globalSetup runs docker\u002Ftest-up.sh (compose up, reuses the just-built image), waits for \u002Fapi\u002Fhealth 200, runs specs at http:\u002F\u002Flocalhost:18000, globalTeardown runs test-down.sh (removes container+volumes+network).\n3. Fast iteration after a build: `PW_E2E_USE_RUNNING=1 npm run test:e2e` attaches to an already-running harness and skips teardown.\n4. Spec conventions: select existing app `data-testid`s (helpers\u002Findex.ts TESTIDS map for static keys; page.getByTestId(`...-${id}`) for dynamic). Navigate Settings→Packages via page.goto('\u002Fsettings\u002Fpackages') then wait for testid `package-browser`; RecommendedExtensions card renders inside it (non-collapsible Section).\n\n## Pitfalls\n- Under heavy host load (multiple worktree test containers + many pi sessions), the managed `npm run test:e2e` globalSetup can blow its 180s health cap even with a pre-built image. Robust fallback = manual up + attach mode for a SINGLE spec: (1) pre-build the per-worktree tag; (2) bring the container up yourself WITH the seed env `PI_E2E_SEED=1 PI_TEST_PEERS=both .\u002Fdocker\u002Ftest-up.sh -d` (writes `.pi-test-harness.json` with the derived port); (3) poll `curl :$PORT\u002Fapi\u002Fhealth` until 200; (4) run `PW_E2E_USE_RUNNING=1 PW_E2E_PORT=$PORT PW_CHANNEL=chrome npx playwright test \u003Cspec>` (skips globalSetup build + teardown); (5) `.\u002Fdocker\u002Ftest-down.sh` after.\n- CO-RESIDENT HARNESS GUARD (#451): `test-up.sh` compares `(n+1) × MEM_LIMIT` against the daemon's `MemTotal` (n = other running `pi-dash-test-*` projects; default `MEM_LIMIT` = `4g`). It REFUSES to start when `(n+1) × MEM_LIMIT >= MemTotal` — the refusal runs before the image build and before `.pi-test-harness.json` is written, and names the other project + the arithmetic. Free the peer (`.\u002Fdocker\u002Ftest-down.sh` from ITS worktree) or override with `PI_HARNESS_ALLOW_OVERSUBSCRIBE=1`. When the limits fit but a peer is up it proceeds with ONE warning: a red result is then not attributable to your change while the peer lives. An unreadable `MEM_LIMIT`\u002F`docker info` warns and proceeds (never refuses on missing data). See `docker\u002FTESTING.md`.\n- NO COMMITTED WALL-CLOCK BUDGET (#450): `playwright.config.ts` sets no `globalTimeout`, so a full local run is unbounded by design — the old 15-min budget aborted long runs and reported a timeout instead of a verdict. Termination is bounded by the per-test `timeout` (60s), `expect.timeout` (10s) and the harness-down short-circuit (3 probe failures → remaining specs skipped). Want a cap? Pass `--global-timeout=\u003Cms>` on the CLI; never re-add it to the config (the CI shard job owns `timeout-minutes`). CI adds a `blob` reporter (sharded workflow `.github\u002Fworkflows\u002Fci-e2e-browser.yml`); local runs keep `list` + `html`.\n- MANUAL test-up MUST mirror the managed globalSetup env: `PI_E2E_SEED=1 PI_TEST_PEERS=both PI_E2E_OAUTH=1` (and pass `PW_GATEWAY_PORT=\u003CgatewayPort>` from `.pi-test-harness.json` when attaching). Without `PI_E2E_OAUTH=1` the MCP token specs (`mcp-token-settings`, `mcp-tiered-token`) narrow `trustedNetworks` to `[]`, cannot restore it (their JWT cookie is not honoured), and every later spec fails with `OffBoxError: ticket mint denied` -- a whole-suite cascade that looks like a regression but is harness config.\n- MANDATORY seed env on manual `test-up.sh`: without `PI_E2E_SEED=1` the onboarding \"Add folder\" CTA renders DISABLED (`title=\"Set up credentials first\"`, gated on `providersReady`), so `spawnFreshGitSession`\u002F`pinDirectory` time out at 60s. The managed globalSetup sets `PI_E2E_SEED=1` + `PI_TEST_PEERS=both`; a hand-rolled `test-up.sh -d` does NOT — pass them explicitly.\n- Specs needing global roles\u002Fmodels data (e.g. `roles-custom.spec.ts` asserting `builtinRoleNames`-driven UI) MUST spawn a live session first: the client only sends `request_roles`\u002F`request_models` through the first non-ended session (App.tsx), so with zero sessions the roles panel never receives `builtinRoleNames` and renders its flat back-compat layout.\n## Verification\n1. `docker compose -f docker\u002Fcompose.yml build` ends with `Image pi-dashboard:local Built`.\n2. `npm run test:e2e` prints `N passed` and the teardown removes the pi-dash-test-* container\u002Fvolumes\u002Fnetwork.\n3. A spec asserting your new UI (e.g. recommended-requires) passes only after the rebuild, not before.","## When to Use\nUse when validating local dashboard changes via the Docker browser-E2E harness (npm run test:e2e), or when a new\u002Fedited E2E spec mysteriously fails to see your code. The harness's test-up.sh runs `docker compose up` WITHOUT `--build`, so it reuses a cached `pi-dashboard:local` image and your committed changes are NOT in the running container until you rebuild.\n\n## Procedure\n1. Rebuild the image from current source FIRST: `docker compose -f docker\u002Fcompose.yml build` (Dockerfile COPYs packages\u002F + runs npm install && npm run build → bakes local source). Slow (~4-6 min: apt + npm install + build).\n2. Run the suite (or one spec): `npm run test:e2e` or `npx playwright test \u003Cspec-name>`. Playwright globalSetup runs docker\u002Ftest-up.sh (compose up, reuses the just-built image), waits for \u002Fapi\u002Fhealth 200, runs specs at http:\u002F\u002Flocalhost:18000, globalTeardown runs test-down.sh (removes container+volumes+network).\n3. Fast iteration after a build: `PW_E2E_USE_RUNNING=1 npm run test:e2e` attaches to an already-running harness and skips teardown.\n4. Spec conventions: select existing app `data-testid`s (helpers\u002Findex.ts TESTIDS map for static keys; page.getByTestId(`...-${id}`) for dynamic). Navigate Settings→Packages via page.goto('\u002Fsettings\u002Fpackages') then wait for testid `package-browser`; RecommendedExtensions card renders inside it (non-collapsible Section).\n\n## Pitfalls\n- Under heavy host load (multiple worktree test containers + many pi sessions), the managed `npm run test:e2e` globalSetup can blow its 180s health cap even with a pre-built image. Robust fallback = manual up + attach mode for a SINGLE spec: (1) pre-build the per-worktree tag; (2) bring the container up yourself WITH the seed env `PI_E2E_SEED=1 PI_TEST_PEERS=both .\u002Fdocker\u002Ftest-up.sh -d` (writes `.pi-test-harness.json` with the derived port); (3) poll `curl :$PORT\u002Fapi\u002Fhealth` until 200; (4) run `PW_E2E_USE_RUNNING=1 PW_E2E_PORT=$PORT PW_CHANNEL=chrome npx playwright test \u003Cspec>` (skips globalSetup build + teardown); (5) `.\u002Fdocker\u002Ftest-down.sh` after.\n- CO-RESIDENT HARNESS GUARD (#451): `test-up.sh` compares `(n+1) × MEM_LIMIT` against the daemon's `MemTotal` (n = other running `pi-dash-test-*` projects; default `MEM_LIMIT` = `4g`). It REFUSES to start when `(n+1) × MEM_LIMIT >= MemTotal` — the refusal runs before the image build and before `.pi-test-harness.json` is written, and names the other project + the arithmetic. Free the peer (`.\u002Fdocker\u002Ftest-down.sh` from ITS worktree) or override with `PI_HARNESS_ALLOW_OVERSUBSCRIBE=1`. When the limits fit but a peer is up it proceeds with ONE warning: a red result is then not attributable to your change while the peer lives. An unreadable `MEM_LIMIT`\u002F`docker info` warns and proceeds (never refuses on missing data). See `docker\u002FTESTING.md`.\n- NO COMMITTED WALL-CLOCK BUDGET (#450): `playwright.config.ts` sets no `globalTimeout`, so a full local run is unbounded by design — the old 15-min budget aborted long runs and reported a timeout instead of a verdict. Termination is bounded by the per-test `timeout` (60s), `expect.timeout` (10s) and the harness-down short-circuit (3 probe failures → remaining specs skipped). Want a cap? Pass `--global-timeout=\u003Cms>` on the CLI; never re-add it to the config (the CI shard job owns `timeout-minutes`). CI adds a `blob` reporter (sharded workflow `.github\u002Fworkflows\u002Fci-e2e-browser.yml`); local runs keep `list` + `html`.\n- MANUAL test-up MUST mirror the managed globalSetup env: `PI_E2E_SEED=1 PI_TEST_PEERS=both PI_E2E_OAUTH=1` (and pass `PW_GATEWAY_PORT=\u003CgatewayPort>` from `.pi-test-harness.json` when attaching). Without `PI_E2E_OAUTH=1` the MCP token specs (`mcp-token-settings`, `mcp-tiered-token`) narrow `trustedNetworks` to `[]`, cannot restore it (their JWT cookie is not honoured), and every later spec fails with `OffBoxError: ticket mint denied` -- a whole-suite cascade that looks like a regression but is harness config.\n- MANDATORY seed env on manual `test-up.sh`: without `PI_E2E_SEED=1` the onboarding \"Add folder\" CTA renders DISABLED (`title=\"Set up credentials first\"`, gated on `providersReady`), so `spawnFreshGitSession`\u002F`pinDirectory` time out at 60s. The managed globalSetup sets `PI_E2E_SEED=1` + `PI_TEST_PEERS=both`; a hand-rolled `test-up.sh -d` does NOT — pass them explicitly.\n- Specs needing global roles\u002Fmodels data (e.g. `roles-custom.spec.ts` asserting `builtinRoleNames`-driven UI) MUST spawn a live session first: the client only sends `request_roles`\u002F`request_models` through the first non-ended session (App.tsx), so with zero sessions the roles panel never receives `builtinRoleNames` and renders its flat back-compat layout.\n## Verification\n1. `docker compose -f docker\u002Fcompose.yml build` ends with `Image pi-dashboard:local Built`.\n2. `npm run test:e2e` prints `N passed` and the teardown removes the pi-dash-test-* container\u002Fvolumes\u002Fnetwork.\n3. A spec asserting your new UI (e.g. recommended-requires) passes only after the rebuild, not before.",{"name":5,"created":54,"updated":55,"version":56,"description":7},"2026-06-24","2026-07-13",3,"develop","fb9a5af356f540de4839ef851ebbe14bcce64c0f",".pi\u002Fskills\u002Frun-dashboard-e2e-local-changes",55,"https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard","https:\u002F\u002Fpi-dashboard.dev\u002F","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology","https:\u002F\u002Fwww.blackbelt.hu","2026-11-12 23:37:37",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add BlackBeltTechnology\u002Fpi-agent-dashboard --skill run-dashboard-e2e-local-changes",{"tool":72,"command":73},"bunx","bunx skills add BlackBeltTechnology\u002Fpi-agent-dashboard --skill run-dashboard-e2e-local-changes",{"tool":75,"command":76},"pnpm","pnpm dlx skills add BlackBeltTechnology\u002Fpi-agent-dashboard --skill run-dashboard-e2e-local-changes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002F.pi\u002Fskills\u002Frun-dashboard-e2e-local-changes\u002FSKILL.md",true,[],[81,111,142,165,188,212],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":90,"publishedAt":49},"01M6HQYQ5B82AM5T9Y299S9CFY","youtube-srt","Download YouTube subtitles (SRT + timestamped TXT) for a channel, playlist or video via yt-dlp, no media download; optionally mine them into a categorized catalog (e.g. AI models by function, open weights, local runnability, hardware tier). Use on \"download the srt of this video\", \"transcripts of channel X for the last N months\", \"catalog the models AI Search talked about\", \"update docs\u002Fmodels\".","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-transcription\u002F.pi\u002Fskills\u002Fyoutube-srt\u002FSKILL.md",[87],{"categoryNo":88,"categoryName":89,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[91,92,93,94,95,96,97,98,99,100,101,102,103,104,37,105,106,107,108,109,110],"youtube","srt","youtube srt","update","search","subtitles","dlp","Video","Media","open","catalog","use","update docs","yt-dlp","mine","via","ai models","last","for","media download",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":121,"publishedAt":49},"01M6HQYJBKSXR55T5RSYNJQG4D","video-transcription","Transcribe video and audio files to SRT subtitles with speaker diarization using the Soniox (default) or AssemblyAI API. Use when the user wants to transcribe meetings, videos, or audio files. Supports MKV, MP4, MOV, M4A, MP3. Triggers on \"\u002Ftranscribe\", \"transcribe my meetings\", \"transcribe videos in ~\u002FMovies\", or any request to convert audio\u002Fvideo to text.","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-transcription\u002F.pi\u002Fskills\u002Fvideo-transcription\u002FSKILL.md",[117,120],{"categoryNo":118,"categoryName":119,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":88,"categoryName":89,"taxonomyType":21,"taxonomyTypeDesc":22},[98,122,123,124,96,125,126,127,128,129,130,102,131,132,133,134,135,136,137,92,138,139,140,141],"transcription","video transcription","transcribe","api","Audio","convert","mp4","text","meetings","files","default","mp3","triggers","with","videos","assemblyai","my","srt subtitles","request","when",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":49},"01M6HQYECMVDC5TDHHW22VC5RX","speaker-id","Name anonymous diarized SRT speakers from a persistent local voiceprint library and repair speaker drift; local, CPU-only, no API key. Triggers \"who is speaker 2\", \"put names on the transcript\", \"label the meeting SRT\", \"the diarization split one person into three\", \"enroll my voice\". Backed by the pi-voiceid CLI.","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-transcription\u002F.pi\u002Fskills\u002Fspeaker-id\u002FSKILL.md",[],[149,150,151,152,125,153,154,155,156,157,158,37,134,159,160,161,162,92,163,164],"id","speaker id","cli","transcript","voice","pi","only","three","drift","repair","name","CPU","meeting","anonymous","split","person",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":174,"publishedAt":49},"01M6HQYAZWDXE9QJEG592E5PXK","veo-showreel-production-kit","Turn a video timeline + voiceover into a reproducible, sliceable Veo 3.1 prompt package with a consistency anchor and AI storyboard sketches.","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-production\u002F.pi\u002Fskills\u002Fveo-showreel-production-kit\u002FSKILL.md",[171],{"categoryNo":172,"categoryName":173,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[175,176,177,178,179,180,181,98,182,183,184,185,135,186,187,39],"Production","veo","kit","veo showreel production kit","package","Reproducible","timeline","prompt","voiceover","storyboard","anchor","consistency","veo 3",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":196,"publishedAt":49},"01M6HQY6TJ0X1ADDKYPMVJY6NV","veo-generator","Render a scripted video project into mp4 clips with the Google Veo 3.1 API. Reads a project's shot package (shots\u002F*.md), one clip per camera cut, reusing each shot's prompt and sketch — world anchor only with `--with-reference`, seed unless `--no-seed`. Use on \"render the Veo video for \u003Cproject>\", \"generate the videos from the shot scripts\", \"make the clips with Veo\".","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-production\u002F.pi\u002Fskills\u002Fveo-generator\u002FSKILL.md",[194,195],{"categoryNo":88,"categoryName":89,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":172,"categoryName":173,"taxonomyType":21,"taxonomyTypeDesc":22},[176,197,198,199,200,179,125,98,128,182,102,201,155,202,203,204,205,206,185,207,208,209,210,135,211,109,187],"generator","veo generator","google","generate","clip","sketch","camera","world","seed","project","cut","scripts","make","render","google veo",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":218,"publishedAt":49},"01M6HQY1K2NZJ3B2YHSJJPPVAF","hyperframes-showreel","Turn real screen and site footage into a rhythmic showreel rendered with HyperFrames: sampling, edit script, redacted clips, a generated composition, Veo only as additive FX, music edit + camera punches, delivery render and export QA. Use on \"make a showreel from these recordings\", \"build the HyperFrames video\", \"assemble the footage edit\", \"render and QA the showreel\".","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-production\u002F.pi\u002Fskills\u002Fhyperframes-showreel\u002FSKILL.md",[],[219,220,221,98,222,223,224,102,225,226,227,155,228,229,230,231,232,210,135,233],"hyperframes","hyperframes showreel","qa","Composition","edit","generated","assemble","export","sampling","build","delivery","as","fx","screen","script"]