[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C42QWPRJ0G7BXDXE3DK50N":3,"skill-same:01M6C42QWPRJ0G7BXDXE3DK50N":91},{"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":26,"publishedAt":57,"linkOnly":58,"markdownContent":59,"markdownBody":60,"frontMatter":61,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":65,"repositoryHtmlUrl":66,"repositoryHomepageUrl":67,"ownerHtmlUrl":68,"ownerBlogUrl":6,"ownerDescription":69,"updatedAt":70,"install":71,"resources":84},"01M6C42QWPRJ0G7BXDXE3DK50N","run-qrcraftly",null,"Build, run, and drive the QRCraftly web app (Vike + React on Vite). Use when asked to start the dev server or production preview, take a screenshot of a page, click through the generator or QR code checker, download a generated code, confirm a UI change works in the real app, call a src\u002Fpackages function directly, or run unit and Playwright e2e tests in this container.","fderuiter\u002FQRCraftly-web","fderuiter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F127706008?v=4","01M6C40AWP9EPQBS3EG0RF5DRD","Frederick de Ruiter","01M6C40B116HSW5KCWXDPRX69M",5,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frun-qrcraftly\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56],"run","run qrcraftly","generated","when","take a screenshot","checker","generator","unit","click","app","tests","preview","call","container","vite","use","playwright","qr code","page","src","e2e","start","server","dev","code","packages","e2e tests","change","react","web","2026-11-10 10:12:30",false,"---\nname: run-qrcraftly\ndescription: Build, run, and drive the QRCraftly web app (Vike + React on Vite). Use when asked to start the dev server or production preview, take a screenshot of a page, click through the generator or QR code checker, download a generated code, confirm a UI change works in the real app, call a src\u002Fpackages function directly, or run unit and Playwright e2e tests in this container.\n---\n\nQRCraftly is a static, client-side React site. An agent runs it by starting\nthe Vite dev server (or `pnpm preview` of a build) on port 3000 and driving it\nwith `.claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs`, a small headless-Chromium REPL\nthat reads one command per line from stdin and writes screenshots to\n`\u002Ftmp\u002Fqrcraftly-shots\u002F`. Paths below are relative to the repo root.\n\n## Setup\n\nNode 22 and pnpm 11 are preinstalled in the cloud container; Chromium is at\n`\u002Fopt\u002Fpw-browsers\u002Fchromium`. No apt packages are needed.\n\n```bash\npnpm install --frozen-lockfile\n```\n\nIn a cloud session the SessionStart hook (`.claude\u002Fhooks\u002Fsession-start.sh`)\nhas already done this: it installs the Node version `.nvmrc` pins with nvm,\nruns the install, builds the Playwright browser shim from Gotchas and sets\n`PLAYWRIGHT_BROWSERS_PATH` to it, installs the pinned Rust toolchain, Semgrep\nand ShellCheck. Without the hook, Node 22.22.0 warns `Unsupported engine`\n(`.nvmrc` wants 22.22.2), but everything still works.\n\n## Run (agent path)\n\nStart the dev server in the background and poll until it answers:\n\n```bash\n(pnpm dev > \u002Ftmp\u002Fqrcraftly-dev.log 2>&1 &)\ntimeout 60 bash -c 'until curl -sf http:\u002F\u002F127.0.0.1:3000\u002F >\u002Fdev\u002Fnull; do sleep 1; done'\n```\n\nThen pipe commands to the driver. This flow generates a code, checks the\nin-app scannability verdict, downloads the PNG, and reads it back with the\napp's own QR code checker:\n\n```bash\nnode .claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs \u003C\u003C'EOF'\nnav \u002F\nfill label=Website URL | https:\u002F\u002Fexample.com\u002Fskill-check\nwait-text testid=scannability-verdict | Scans reliably\nshot-el testid=qr-stage | qr-example\ndownload role=button:Download PNG\nnav \u002Fqr-code-checker\nupload label=Choose a picture of a QR code | @last\nwait-text testid=scan-result-host | example.com\ntext testid=scan-result\nscreenshot checker-result\nviewport 390 844\nnav \u002F\nscreenshot home-mobile\nconsole --errors\nEOF\n```\n\nEach command echoes as `> cmd`, and failures print `ERROR:` without stopping\nthe script. The driver exits 1 if any command failed. Open the PNGs it prints\nwith the Read tool to look at them.\n\n| command                                                          | what it does                                                                     |\n| ---------------------------------------------------------------- | -------------------------------------------------------------------------------- |\n| `nav \u003Cpath\\|url>`                                                | goes to `http:\u002F\u002F127.0.0.1:3000\u003Cpath>` and waits for `main[data-hydrated=\"true\"]` |\n| `viewport \u003Cw> \u003Ch>`                                               | resizes the viewport (default 1440x900)                                          |\n| `wait-for \u003Csel>` \u002F `wait-text \u003Csel> \\| \u003Ctext>`                   | waits for visibility or for text                                                 |\n| `click \u003Csel>`, `fill \u003Csel> \\| \u003Ctext>`, `press \u003Ckey>`             | interacts with the page (`fill` is React-safe)                                   |\n| `upload \u003Csel> \\| \u003Cfile>`                                         | sets a file input; `@last` means the last download                               |\n| `download \u003Csel>`                                                 | clicks and saves the file into `\u002Ftmp\u002Fqrcraftly-shots\u002F`                           |\n| `screenshot [name]`, `shot-el \u003Csel> \\| [name]`                   | captures the page or one element                                                 |\n| `text \u003Csel>`, `attr \u003Csel> \\| \u003Cname>`, `count \u003Csel>`, `eval \u003Cjs>` | reads the page                                                                   |\n| `console [--errors]`                                             | prints console lines and page errors captured so far                             |\n| `help`, `quit`                                                   | lists commands, closes                                                           |\n\nSelectors are `role=\u003Crole>:\u003Caccessible name>`, `label=\u003Clabel text>`,\n`testid=\u003Cdata-testid>`, `text=\u003Ctext>`, `placeholder=\u003Ctext>`, or plain CSS.\nPut a pipe with a space on each side between a selector and a value. Useful handles: `label=Website URL`\n(`#url-input`), `testid=qr-stage`, `testid=scannability-verdict`,\n`role=radio:SVG` \u002F `role=radio:PDF` (export format), `role=button:Download PNG`,\n`testid=scan-result`, `testid=scan-result-host`. Mine `e2e\u002F*.spec.ts` for more.\n\nEnv overrides: `QRC_BASE_URL` (default `http:\u002F\u002F127.0.0.1:3000`), `QRC_OUT`\n(default `\u002Ftmp\u002Fqrcraftly-shots`), `QRC_CHROMIUM` (Chromium binary).\n\nStop the server:\n\n```bash\nlsof -ti:3000 -sTCP:LISTEN | xargs -r kill\n```\n\n### Production build and preview\n\nUse this for anything that only exists after `postbuild` (CSP hashes, the\nservice worker, the sitemap, the bundle audits). Build takes about 20 s.\n\n```bash\npnpm build > \u002Ftmp\u002Fqrcraftly-build.log 2>&1\n(pnpm preview > \u002Ftmp\u002Fqrcraftly-preview.log 2>&1 &)\ntimeout 60 bash -c 'until curl -sf http:\u002F\u002F127.0.0.1:3000\u002F >\u002Fdev\u002Fnull; do sleep 1; done'\nnode .claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs \u003C\u003C'EOF'\nnav \u002F\nfill label=Website URL | https:\u002F\u002Fexample.com\u002Fpreview\nwait-text testid=scannability-verdict | Scans reliably\nclick role=radio:SVG\ndownload role=button:Download SVG\neval navigator.serviceWorker.controller ? 'sw' : 'no-sw'\nconsole --errors\nEOF\nlsof -ti:3000 -sTCP:LISTEN | xargs -r kill\n```\n\n## Direct invocation (no browser)\n\nMost PRs touch `src\u002Fpackages\u002F*` or components. Call a package function with\nNode's type stripping and the repo's resolve hook:\n\n```bash\nnode --import .\u002Fscripts\u002Futils\u002Fregister-ts.js --input-type=module -e \"\nimport { constructWifiString } from '.\u002Fsrc\u002Fpackages\u002Fqr-payload\u002Findex.ts';\nconsole.log(constructWifiString({ ssid: 'Cafe;Guest', encryption: 'nopass', hidden: false }));\n\"\n# -> WIFI:T:nopass;S:Cafe\\;Guest;;\n```\n\n## Test\n\nRun the tests for the files you touched:\n\n```bash\npnpm exec vitest run src\u002Fpackages\u002Fqr-payload\u002Ftests\u002Fwifi.test.ts src\u002Fcomponents\u002Finputs\u002FWifiInput.test.tsx\n```\n\nPlaywright e2e needs the browser shim from Gotchas (the hook sets\n`PLAYWRIGHT_BROWSERS_PATH` to one; drop that variable below if so). With a build already in\n`dist\u002F`, it starts `pnpm preview` itself and stops it afterwards:\n\n```bash\nPLAYWRIGHT_BROWSERS_PATH=\u002Ftmp\u002Fpw-shim PLAYWRIGHT_USE_EXISTING_BUILD=true \\\n  pnpm exec playwright test e2e\u002Fsmoke.spec.ts e2e\u002Flanding-pages.spec.ts --project=chromium\n```\n\nThe full gates are `pnpm run lint`, `pnpm test` and `pnpm build` (AGENTS.md).\n\n## Gotchas\n\n- **The pre-commit secret scanner rejects `password: '...'` literals**, even\n  in docs and test snippets. Keep sample passwords out of committed files.\n\n- **Download hangs in Chromium.** The app uses `showSaveFilePicker` when it\n  exists, which opens a native dialog that never resolves headless. The driver\n  deletes it in an init script, so the app falls back to `\u003Ca download>`. The\n  e2e specs do the same thing.\n- **The downloaded filename follows the content** (`url-example.com.png`), so\n  pass `@last` to `upload` rather than guessing the name.\n- **The scannability verdict starts as `Checking…`** and settles a second or\n  two after an edit, once the worker has run. Wait for the text with\n  `wait-text`, as in the flow above. Plain `wait-for` returns too early.\n- **Playwright 1.62 wants Chromium build 1234; the container has 1194.**\n  `chromium.launch()` and `playwright test` fail with \"Executable doesn't\n  exist at \u002Fopt\u002Fpw-browsers\u002Fchromium_headless_shell-1234\u002F...\". The driver\n  passes `executablePath: \u002Fopt\u002Fpw-browsers\u002Fchromium`. For `playwright test`,\n  build a shim directory once (don't run `playwright install`):\n\n  ```bash\n  S=\u002Ftmp\u002Fpw-shim\n  mkdir -p $S\u002Fchromium_headless_shell-1234\u002Fchrome-headless-shell-linux64 $S\u002Fchromium-1234\u002Fchrome-linux64\n  ln -sf \u002Fopt\u002Fpw-browsers\u002Fchromium_headless_shell-1194\u002Fchrome-linux\u002Fheadless_shell $S\u002Fchromium_headless_shell-1234\u002Fchrome-headless-shell-linux64\u002Fchrome-headless-shell\n  ln -sf \u002Fopt\u002Fpw-browsers\u002Fchromium-1194\u002Fchrome-linux\u002Fchrome $S\u002Fchromium-1234\u002Fchrome-linux64\u002Fchrome\n  touch $S\u002Fchromium_headless_shell-1234\u002FINSTALLATION_COMPLETE $S\u002Fchromium-1234\u002FINSTALLATION_COMPLETE\n  ```\n\n  If a later Playwright bump changes the expected build number, the error\n  message names the new path; rename the two `-1234` directories to match.\n\n- **`pnpm test` is `vitest`, which watches in a terminal.** Use\n  `pnpm exec vitest run \u003Cfiles>` for a one-shot run.\n- **Dev and preview both use port 3000.** Kill the listener before switching,\n  or the second server fails to bind. `$!` after `pnpm dev &` is only the pnpm\n  wrapper, so kill by port.\n- **The preview registers a service worker.** Each driver run starts a fresh\n  browser context, so a stale cache does not carry between runs.\n","QRCraftly is a static, client-side React site. An agent runs it by starting\nthe Vite dev server (or `pnpm preview` of a build) on port 3000 and driving it\nwith `.claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs`, a small headless-Chromium REPL\nthat reads one command per line from stdin and writes screenshots to\n`\u002Ftmp\u002Fqrcraftly-shots\u002F`. Paths below are relative to the repo root.\n\n## Setup\n\nNode 22 and pnpm 11 are preinstalled in the cloud container; Chromium is at\n`\u002Fopt\u002Fpw-browsers\u002Fchromium`. No apt packages are needed.\n\n```bash\npnpm install --frozen-lockfile\n```\n\nIn a cloud session the SessionStart hook (`.claude\u002Fhooks\u002Fsession-start.sh`)\nhas already done this: it installs the Node version `.nvmrc` pins with nvm,\nruns the install, builds the Playwright browser shim from Gotchas and sets\n`PLAYWRIGHT_BROWSERS_PATH` to it, installs the pinned Rust toolchain, Semgrep\nand ShellCheck. Without the hook, Node 22.22.0 warns `Unsupported engine`\n(`.nvmrc` wants 22.22.2), but everything still works.\n\n## Run (agent path)\n\nStart the dev server in the background and poll until it answers:\n\n```bash\n(pnpm dev > \u002Ftmp\u002Fqrcraftly-dev.log 2>&1 &)\ntimeout 60 bash -c 'until curl -sf http:\u002F\u002F127.0.0.1:3000\u002F >\u002Fdev\u002Fnull; do sleep 1; done'\n```\n\nThen pipe commands to the driver. This flow generates a code, checks the\nin-app scannability verdict, downloads the PNG, and reads it back with the\napp's own QR code checker:\n\n```bash\nnode .claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs \u003C\u003C'EOF'\nnav \u002F\nfill label=Website URL | https:\u002F\u002Fexample.com\u002Fskill-check\nwait-text testid=scannability-verdict | Scans reliably\nshot-el testid=qr-stage | qr-example\ndownload role=button:Download PNG\nnav \u002Fqr-code-checker\nupload label=Choose a picture of a QR code | @last\nwait-text testid=scan-result-host | example.com\ntext testid=scan-result\nscreenshot checker-result\nviewport 390 844\nnav \u002F\nscreenshot home-mobile\nconsole --errors\nEOF\n```\n\nEach command echoes as `> cmd`, and failures print `ERROR:` without stopping\nthe script. The driver exits 1 if any command failed. Open the PNGs it prints\nwith the Read tool to look at them.\n\n| command                                                          | what it does                                                                     |\n| ---------------------------------------------------------------- | -------------------------------------------------------------------------------- |\n| `nav \u003Cpath\\|url>`                                                | goes to `http:\u002F\u002F127.0.0.1:3000\u003Cpath>` and waits for `main[data-hydrated=\"true\"]` |\n| `viewport \u003Cw> \u003Ch>`                                               | resizes the viewport (default 1440x900)                                          |\n| `wait-for \u003Csel>` \u002F `wait-text \u003Csel> \\| \u003Ctext>`                   | waits for visibility or for text                                                 |\n| `click \u003Csel>`, `fill \u003Csel> \\| \u003Ctext>`, `press \u003Ckey>`             | interacts with the page (`fill` is React-safe)                                   |\n| `upload \u003Csel> \\| \u003Cfile>`                                         | sets a file input; `@last` means the last download                               |\n| `download \u003Csel>`                                                 | clicks and saves the file into `\u002Ftmp\u002Fqrcraftly-shots\u002F`                           |\n| `screenshot [name]`, `shot-el \u003Csel> \\| [name]`                   | captures the page or one element                                                 |\n| `text \u003Csel>`, `attr \u003Csel> \\| \u003Cname>`, `count \u003Csel>`, `eval \u003Cjs>` | reads the page                                                                   |\n| `console [--errors]`                                             | prints console lines and page errors captured so far                             |\n| `help`, `quit`                                                   | lists commands, closes                                                           |\n\nSelectors are `role=\u003Crole>:\u003Caccessible name>`, `label=\u003Clabel text>`,\n`testid=\u003Cdata-testid>`, `text=\u003Ctext>`, `placeholder=\u003Ctext>`, or plain CSS.\nPut a pipe with a space on each side between a selector and a value. Useful handles: `label=Website URL`\n(`#url-input`), `testid=qr-stage`, `testid=scannability-verdict`,\n`role=radio:SVG` \u002F `role=radio:PDF` (export format), `role=button:Download PNG`,\n`testid=scan-result`, `testid=scan-result-host`. Mine `e2e\u002F*.spec.ts` for more.\n\nEnv overrides: `QRC_BASE_URL` (default `http:\u002F\u002F127.0.0.1:3000`), `QRC_OUT`\n(default `\u002Ftmp\u002Fqrcraftly-shots`), `QRC_CHROMIUM` (Chromium binary).\n\nStop the server:\n\n```bash\nlsof -ti:3000 -sTCP:LISTEN | xargs -r kill\n```\n\n### Production build and preview\n\nUse this for anything that only exists after `postbuild` (CSP hashes, the\nservice worker, the sitemap, the bundle audits). Build takes about 20 s.\n\n```bash\npnpm build > \u002Ftmp\u002Fqrcraftly-build.log 2>&1\n(pnpm preview > \u002Ftmp\u002Fqrcraftly-preview.log 2>&1 &)\ntimeout 60 bash -c 'until curl -sf http:\u002F\u002F127.0.0.1:3000\u002F >\u002Fdev\u002Fnull; do sleep 1; done'\nnode .claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs \u003C\u003C'EOF'\nnav \u002F\nfill label=Website URL | https:\u002F\u002Fexample.com\u002Fpreview\nwait-text testid=scannability-verdict | Scans reliably\nclick role=radio:SVG\ndownload role=button:Download SVG\neval navigator.serviceWorker.controller ? 'sw' : 'no-sw'\nconsole --errors\nEOF\nlsof -ti:3000 -sTCP:LISTEN | xargs -r kill\n```\n\n## Direct invocation (no browser)\n\nMost PRs touch `src\u002Fpackages\u002F*` or components. Call a package function with\nNode's type stripping and the repo's resolve hook:\n\n```bash\nnode --import .\u002Fscripts\u002Futils\u002Fregister-ts.js --input-type=module -e \"\nimport { constructWifiString } from '.\u002Fsrc\u002Fpackages\u002Fqr-payload\u002Findex.ts';\nconsole.log(constructWifiString({ ssid: 'Cafe;Guest', encryption: 'nopass', hidden: false }));\n\"\n# -> WIFI:T:nopass;S:Cafe\\;Guest;;\n```\n\n## Test\n\nRun the tests for the files you touched:\n\n```bash\npnpm exec vitest run src\u002Fpackages\u002Fqr-payload\u002Ftests\u002Fwifi.test.ts src\u002Fcomponents\u002Finputs\u002FWifiInput.test.tsx\n```\n\nPlaywright e2e needs the browser shim from Gotchas (the hook sets\n`PLAYWRIGHT_BROWSERS_PATH` to one; drop that variable below if so). With a build already in\n`dist\u002F`, it starts `pnpm preview` itself and stops it afterwards:\n\n```bash\nPLAYWRIGHT_BROWSERS_PATH=\u002Ftmp\u002Fpw-shim PLAYWRIGHT_USE_EXISTING_BUILD=true \\\n  pnpm exec playwright test e2e\u002Fsmoke.spec.ts e2e\u002Flanding-pages.spec.ts --project=chromium\n```\n\nThe full gates are `pnpm run lint`, `pnpm test` and `pnpm build` (AGENTS.md).\n\n## Gotchas\n\n- **The pre-commit secret scanner rejects `password: '...'` literals**, even\n  in docs and test snippets. Keep sample passwords out of committed files.\n\n- **Download hangs in Chromium.** The app uses `showSaveFilePicker` when it\n  exists, which opens a native dialog that never resolves headless. The driver\n  deletes it in an init script, so the app falls back to `\u003Ca download>`. The\n  e2e specs do the same thing.\n- **The downloaded filename follows the content** (`url-example.com.png`), so\n  pass `@last` to `upload` rather than guessing the name.\n- **The scannability verdict starts as `Checking…`** and settles a second or\n  two after an edit, once the worker has run. Wait for the text with\n  `wait-text`, as in the flow above. Plain `wait-for` returns too early.\n- **Playwright 1.62 wants Chromium build 1234; the container has 1194.**\n  `chromium.launch()` and `playwright test` fail with \"Executable doesn't\n  exist at \u002Fopt\u002Fpw-browsers\u002Fchromium_headless_shell-1234\u002F...\". The driver\n  passes `executablePath: \u002Fopt\u002Fpw-browsers\u002Fchromium`. For `playwright test`,\n  build a shim directory once (don't run `playwright install`):\n\n  ```bash\n  S=\u002Ftmp\u002Fpw-shim\n  mkdir -p $S\u002Fchromium_headless_shell-1234\u002Fchrome-headless-shell-linux64 $S\u002Fchromium-1234\u002Fchrome-linux64\n  ln -sf \u002Fopt\u002Fpw-browsers\u002Fchromium_headless_shell-1194\u002Fchrome-linux\u002Fheadless_shell $S\u002Fchromium_headless_shell-1234\u002Fchrome-headless-shell-linux64\u002Fchrome-headless-shell\n  ln -sf \u002Fopt\u002Fpw-browsers\u002Fchromium-1194\u002Fchrome-linux\u002Fchrome $S\u002Fchromium-1234\u002Fchrome-linux64\u002Fchrome\n  touch $S\u002Fchromium_headless_shell-1234\u002FINSTALLATION_COMPLETE $S\u002Fchromium-1234\u002FINSTALLATION_COMPLETE\n  ```\n\n  If a later Playwright bump changes the expected build number, the error\n  message names the new path; rename the two `-1234` directories to match.\n\n- **`pnpm test` is `vitest`, which watches in a terminal.** Use\n  `pnpm exec vitest run \u003Cfiles>` for a one-shot run.\n- **Dev and preview both use port 3000.** Kill the listener before switching,\n  or the second server fails to bind. `$!` after `pnpm dev &` is only the pnpm\n  wrapper, so kill by port.\n- **The preview registers a service worker.** Each driver run starts a fresh\n  browser context, so a stale cache does not carry between runs.\n",{"name":5,"description":7},"main","5e9ab49e1cb8cac3dbf2019f3f975572fc7282f7",".claude\u002Fskills\u002Frun-qrcraftly",0,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web","https:\u002F\u002Fqrcraftly.com","https:\u002F\u002Fgithub.com\u002Ffderuiter","Clinical Data Specialist at @Bright-Research \r\n\r\nInterests in Photogrammetry, Data Analytics + Pipelines, Mathematics, and AI\u002FML.\r\n\r\nPython, Rust, TS.","2026-11-14 03:09:20",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":83},[73,76,79],{"tool":74,"command":75},"npx","npx skills add fderuiter\u002FQRCraftly-web --skill run-qrcraftly",{"tool":77,"command":78},"bunx","bunx skills add fderuiter\u002FQRCraftly-web --skill run-qrcraftly",{"tool":80,"command":81},"pnpm","pnpm dlx skills add fderuiter\u002FQRCraftly-web --skill run-qrcraftly","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frun-qrcraftly\u002FSKILL.md",true,[85],{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"driver.mjs","SCRIPT","脚本",7729,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frun-qrcraftly\u002Fdriver.mjs",[92,109,130,151,164,177],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":57},"01M6C40FJCT5X27N59TX7RQZRY","claude-handoff","Hand the current conversation off to a fresh background agent that picks up the work immediately.","MIT","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclaude-handoff\u002FSKILL.md",[],[100,101,102,103,104,105,106,107,108],"claude handoff","handoff","matt pocock","work","up","conversation","fresh","hand","background",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":57},"01M6C42TV73ZZ5TY86HHA682KG","steward","How to drive a QRCraftly pull request to merged. Use when opening a PR, handling CI or review events on it, updating its branch, or deciding whether to merge.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsteward\u002FSKILL.md",[],[111,116,30,117,118,119,120,121,122,123,124,125,126,127,128,129,42],"merge","request","it","events","how to","review","pr","drive","opening a pr","pull request","pull","ci","how","branch",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":144,"publishedAt":57},"01M6C42NHXSZNS2E96WP7VQR4K","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-shape\u002FSKILL.md",[136,139],{"categoryNo":137,"categoryName":138,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[145,146,147,102,148,149,150],"writing","writing shape","shape","exploit","article","material",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":159,"publishedAt":57},"01M6C42M1W5P95XKMR7B1HD7F3","writing-fragments","Writing, explore: mine raw fragments, no structure yet.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-fragments\u002FSKILL.md",[157,158],{"categoryNo":137,"categoryName":138,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},[160,145,161,162,102,163],"writing fragments","mine","explore","structure",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":172,"publishedAt":57},"01M6C42J3DYGGDFFKNV8QFFSS9","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[170,171],{"categoryNo":137,"categoryName":138,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},[173,174,145,175,102,176,42,30],"for","writing for agents","documents","editing",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":185,"publishedAt":57},"01M6C42GJXR8YEKS8V085G4FH6","writing-beats","Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-beats\u002FSKILL.md",[183,184],{"categoryNo":137,"categoryName":138,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},[145,186,150,102,187,148,188,118,189],"writing beats","assemble","journey","grounding"]