[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C41VECC312PJEXXHAPGK6B":3,"skill-same:01M6C41VECC312PJEXXHAPGK6B":94},{"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":18,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6C41VECC312PJEXXHAPGK6B","setup-ts-deep-modules",null,"Wire dependency-cruiser into a TypeScript repo so each package is a deep module, with implementation hidden in subfolders and reachable only through its entry-point files. User-invoked.","fderuiter\u002FQRCraftly-web","fderuiter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F127706008?v=4","01M6C40AWP9EPQBS3EG0RF5DRD","Frederick de Ruiter","01M6C40B116HSW5KCWXDPRX69M",5,"MIT","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"setup","deep","modules","setup ts deep modules","matt pocock","repo","user","only","dependency","package","implementation","files","typescript","module","with","entry","point","hidden","2026-11-10 10:12:30",false,"---\nname: setup-ts-deep-modules\ndescription: \"Wire dependency-cruiser into a TypeScript repo so each package is a deep module, with implementation hidden in subfolders and reachable only through its entry-point files. User-invoked.\"\nlicense: MIT\nmetadata:\n  author: Matt Pocock\n  version: \"1.0\"\n---\n\n# Setup TS Deep Modules\n\nMake every package in this repo a **deep module**: a lot of behaviour behind a small interface. A package's public surface is its **entry points** (the files at the package root), and everything in its subfolders is hidden. This skill installs [dependency-cruiser](https:\u002F\u002Fgithub.com\u002Fsverweij\u002Fdependency-cruiser) and the rules that make the entry points the only way in, then proves the rules bite.\n\nFor the vocabulary (deep module, interface, seam, depth), call the Skill tool with \"codebase-design\" and use its language throughout.\n\n## The shape this enforces\n\n```\nsrc\u002Fpackages\u002F\n  \u003Cname>\u002F\n    index.ts        ← an entry point (public). Import this from outside.\n    client.ts       ← another entry point. Packages may expose SEVERAL.\n    lib\u002F            ← implementation: hidden from outside, free to import each other.\n    tests\u002F          ← co-located tests + fixtures (a subfolder, so private).\n```\n\nThe public surface is the package's **root files**, not one designated `index.ts`. By convention implementation lives in `lib\u002F` and tests in `tests\u002F`, giving every package the same two-folder shape. The rule itself is general, though: *anything* in *any* subfolder is private, so you never extend the config to add a folder.\n\nFour rules, all `error`:\n\n1. **Entry-point boundary**: code outside a package (app code or another package) may import only that package's entry points (its root files), never anything in its subfolders.\n2. **Intra-package freedom**: a package's own files import each other freely.\n3. **Tests through the entry points**: files under `\u003Cpkg>\u002Ftests\u002F` may import any package's entry points and their own `tests\u002F` fixtures, but never any package's subfolder internals (not even their own). Integration tests across packages are fine; deep imports are not.\n4. **No cycles**: no dependency cycles.\n\n**Entry points, not a barrel.** Because the public surface is *every* root file, a package can expose several small entry points (`index.ts`, `client.ts`, `server.ts`) instead of funnelling everything through one giant `index.ts`. Barrel files that re-export a whole subtree are discouraged; keep entry points small and hide implementation in subfolders.\n\nLayering (which packages may depend on which) is a *different* concern and is left as a commented stub in the config for this repo to fill in.\n\n## Steps\n\n### 1. Detect the environment\n\n- **Package manager**: `pnpm-lock.yaml` → pnpm, `yarn.lock` → yarn, `bun.lockb` → bun, else npm. Use it for every command below (`pnpm`\u002F`yarn`\u002F`npm run`\u002F`bunx`).\n- **Packages root**: if `src\u002F` exists use `src\u002Fpackages`, else `packages`. Confirm the choice with the user if the repo already has a different obvious convention.\n- **Existing config**: check for a `.dependency-cruiser.*` file. If one exists, do **not** overwrite it: merge the four rules and the options in, and tell the user what you added.\n\n**Done when:** package manager, packages root, and existing-config status are all known.\n\n### 2. Install dependency-cruiser\n\nInstall `dependency-cruiser` as a devDependency with the detected package manager.\n\n**Done when:** `dependency-cruiser` is in `devDependencies`.\n\n### 3. Write the config\n\nCopy [`dependency-cruiser.config.cjs`](.\u002Freferences\u002Fdependency-cruiser.config.cjs) to the repo root as `.dependency-cruiser.cjs`. Set `PACKAGES_ROOT` to the root detected in step 1. The rules are path-depth based and extension-agnostic, so nothing else needs adapting.\n\n**Done when:** `.dependency-cruiser.cjs` exists with the correct `PACKAGES_ROOT`, and the four forbidden rules are present.\n\n### 4. Wire it into the checks\n\n- Add a `lint:boundaries` script: `depcruise \u003Cpackages-root>` (or `depcruise src`).\n- Fold it into the repo's umbrella check command, the one that already runs typecheck (e.g. a `check` \u002F `ci` \u002F `validate` script). Do **not** touch `tsconfig` or add path aliases.\n- If there is no umbrella script, add `lint:boundaries` and tell the user to include it in CI.\n\n**Done when:** `lint:boundaries` exists and runs as part of the same command as typecheck.\n\n### 5. Scaffold the example package\n\nCreate a committed `\u003Cpackages-root>\u002Fexample\u002F` as a copy-me template:\n\n- `index.ts` is an entry point. Export one function that delegates to an internal file (so the package is visibly *deep*, not a pass-through).\n- `lib\u002Fimpl.ts`: an internal file in a **subfolder**, imported by `index.ts`, not reachable from outside.\n- `tests\u002Fexample.test.ts` imports **only** `..\u002Findex` (an entry point) and asserts against the public function.\n\nTell the user this is a starter template to copy or delete.\n\n**Done when:** the example package exists, exposes its behaviour through a root entry point, and hides `impl` in a subfolder.\n\n### 6. Prove the rules bite\n\nThis is the completion criterion for the whole skill: a config that doesn't fail on a violation is worthless.\n\n1. Run `lint:boundaries`. It must **pass** on the clean example.\n2. Temporarily add a deep import to `tests\u002Fexample.test.ts` (e.g. `import { thing } from \"..\u002Flib\u002Fimpl\"`). Run `lint:boundaries` again; it must **fail** with `tests-through-entrypoints`.\n3. Revert the deep import. Run once more, and it must **pass**.\n\n**Done when:** you have observed a pass, then a fail on the deep import, then a pass again. If step 2 does not fail, the rules are not wired correctly, so fix before finishing.\n\n### 7. Document the convention\n\nWrite a `README.md` **in the packages folder** (`\u003Cpackages-root>\u002FREADME.md`, next to the packages it governs) covering: the `src\u002Fpackages\u002F\u003Cname>\u002F` layout (entry points at the root, `lib\u002F` for implementation, `tests\u002F` for tests), \"import only through a package's entry points (its root files)\", and how to run `lint:boundaries`. **Discourage barrel files** explicitly: expose several small entry points instead of re-exporting a whole subtree through one index. Keep it to the copy-me snippet plus the four rules in one paragraph each.\n\nThen add a **context pointer** to it from the repo's agent-instructions file (`CLAUDE.md` if present, else `AGENTS.md`, creating `AGENTS.md` if neither exists). One line is enough, e.g. `Packages are deep modules: see [src\u002Fpackages\u002FREADME.md](.\u002Fsrc\u002Fpackages\u002FREADME.md) before adding or importing one.` This is what makes an agent discover the boundary rule instead of tripping over it.\n\n**Done when:** `\u003Cpackages-root>\u002FREADME.md` exists and discourages barrels, and the repo's `CLAUDE.md`\u002F`AGENTS.md` links to it.\n\n## Notes\n\n- The config's `$1` back-references (dependency-cruiser's group matching) are what let a package reach its own internals while outsiders can't. Don't flatten them into separate per-package rules.\n- Public vs private is decided by **depth**: a package's root files are entry points; anything in a subfolder is private. The conventional subfolders are `lib\u002F` (implementation) and `tests\u002F`, but the rule doesn't hardcode them: any subfolder is private, so a new folder never needs a config change. Adding an entry point is just adding a root file (no barrel).\n- Packages are **flat**: one tier of immediate children under the root. A package's internals may nest as deep as you like; a package may not contain another package.\n- Use `.cjs` (not `.js`) so the config's `module.exports` works even in `\"type\": \"module\"` repos.\n","# Setup TS Deep Modules\n\nMake every package in this repo a **deep module**: a lot of behaviour behind a small interface. A package's public surface is its **entry points** (the files at the package root), and everything in its subfolders is hidden. This skill installs [dependency-cruiser](https:\u002F\u002Fgithub.com\u002Fsverweij\u002Fdependency-cruiser) and the rules that make the entry points the only way in, then proves the rules bite.\n\nFor the vocabulary (deep module, interface, seam, depth), call the Skill tool with \"codebase-design\" and use its language throughout.\n\n## The shape this enforces\n\n```\nsrc\u002Fpackages\u002F\n  \u003Cname>\u002F\n    index.ts        ← an entry point (public). Import this from outside.\n    client.ts       ← another entry point. Packages may expose SEVERAL.\n    lib\u002F            ← implementation: hidden from outside, free to import each other.\n    tests\u002F          ← co-located tests + fixtures (a subfolder, so private).\n```\n\nThe public surface is the package's **root files**, not one designated `index.ts`. By convention implementation lives in `lib\u002F` and tests in `tests\u002F`, giving every package the same two-folder shape. The rule itself is general, though: *anything* in *any* subfolder is private, so you never extend the config to add a folder.\n\nFour rules, all `error`:\n\n1. **Entry-point boundary**: code outside a package (app code or another package) may import only that package's entry points (its root files), never anything in its subfolders.\n2. **Intra-package freedom**: a package's own files import each other freely.\n3. **Tests through the entry points**: files under `\u003Cpkg>\u002Ftests\u002F` may import any package's entry points and their own `tests\u002F` fixtures, but never any package's subfolder internals (not even their own). Integration tests across packages are fine; deep imports are not.\n4. **No cycles**: no dependency cycles.\n\n**Entry points, not a barrel.** Because the public surface is *every* root file, a package can expose several small entry points (`index.ts`, `client.ts`, `server.ts`) instead of funnelling everything through one giant `index.ts`. Barrel files that re-export a whole subtree are discouraged; keep entry points small and hide implementation in subfolders.\n\nLayering (which packages may depend on which) is a *different* concern and is left as a commented stub in the config for this repo to fill in.\n\n## Steps\n\n### 1. Detect the environment\n\n- **Package manager**: `pnpm-lock.yaml` → pnpm, `yarn.lock` → yarn, `bun.lockb` → bun, else npm. Use it for every command below (`pnpm`\u002F`yarn`\u002F`npm run`\u002F`bunx`).\n- **Packages root**: if `src\u002F` exists use `src\u002Fpackages`, else `packages`. Confirm the choice with the user if the repo already has a different obvious convention.\n- **Existing config**: check for a `.dependency-cruiser.*` file. If one exists, do **not** overwrite it: merge the four rules and the options in, and tell the user what you added.\n\n**Done when:** package manager, packages root, and existing-config status are all known.\n\n### 2. Install dependency-cruiser\n\nInstall `dependency-cruiser` as a devDependency with the detected package manager.\n\n**Done when:** `dependency-cruiser` is in `devDependencies`.\n\n### 3. Write the config\n\nCopy [`dependency-cruiser.config.cjs`](.\u002Freferences\u002Fdependency-cruiser.config.cjs) to the repo root as `.dependency-cruiser.cjs`. Set `PACKAGES_ROOT` to the root detected in step 1. The rules are path-depth based and extension-agnostic, so nothing else needs adapting.\n\n**Done when:** `.dependency-cruiser.cjs` exists with the correct `PACKAGES_ROOT`, and the four forbidden rules are present.\n\n### 4. Wire it into the checks\n\n- Add a `lint:boundaries` script: `depcruise \u003Cpackages-root>` (or `depcruise src`).\n- Fold it into the repo's umbrella check command, the one that already runs typecheck (e.g. a `check` \u002F `ci` \u002F `validate` script). Do **not** touch `tsconfig` or add path aliases.\n- If there is no umbrella script, add `lint:boundaries` and tell the user to include it in CI.\n\n**Done when:** `lint:boundaries` exists and runs as part of the same command as typecheck.\n\n### 5. Scaffold the example package\n\nCreate a committed `\u003Cpackages-root>\u002Fexample\u002F` as a copy-me template:\n\n- `index.ts` is an entry point. Export one function that delegates to an internal file (so the package is visibly *deep*, not a pass-through).\n- `lib\u002Fimpl.ts`: an internal file in a **subfolder**, imported by `index.ts`, not reachable from outside.\n- `tests\u002Fexample.test.ts` imports **only** `..\u002Findex` (an entry point) and asserts against the public function.\n\nTell the user this is a starter template to copy or delete.\n\n**Done when:** the example package exists, exposes its behaviour through a root entry point, and hides `impl` in a subfolder.\n\n### 6. Prove the rules bite\n\nThis is the completion criterion for the whole skill: a config that doesn't fail on a violation is worthless.\n\n1. Run `lint:boundaries`. It must **pass** on the clean example.\n2. Temporarily add a deep import to `tests\u002Fexample.test.ts` (e.g. `import { thing } from \"..\u002Flib\u002Fimpl\"`). Run `lint:boundaries` again; it must **fail** with `tests-through-entrypoints`.\n3. Revert the deep import. Run once more, and it must **pass**.\n\n**Done when:** you have observed a pass, then a fail on the deep import, then a pass again. If step 2 does not fail, the rules are not wired correctly, so fix before finishing.\n\n### 7. Document the convention\n\nWrite a `README.md` **in the packages folder** (`\u003Cpackages-root>\u002FREADME.md`, next to the packages it governs) covering: the `src\u002Fpackages\u002F\u003Cname>\u002F` layout (entry points at the root, `lib\u002F` for implementation, `tests\u002F` for tests), \"import only through a package's entry points (its root files)\", and how to run `lint:boundaries`. **Discourage barrel files** explicitly: expose several small entry points instead of re-exporting a whole subtree through one index. Keep it to the copy-me snippet plus the four rules in one paragraph each.\n\nThen add a **context pointer** to it from the repo's agent-instructions file (`CLAUDE.md` if present, else `AGENTS.md`, creating `AGENTS.md` if neither exists). One line is enough, e.g. `Packages are deep modules: see [src\u002Fpackages\u002FREADME.md](.\u002Fsrc\u002Fpackages\u002FREADME.md) before adding or importing one.` This is what makes an agent discover the boundary rule instead of tripping over it.\n\n**Done when:** `\u003Cpackages-root>\u002FREADME.md` exists and discourages barrels, and the repo's `CLAUDE.md`\u002F`AGENTS.md` links to it.\n\n## Notes\n\n- The config's `$1` back-references (dependency-cruiser's group matching) are what let a package reach its own internals while outsiders can't. Don't flatten them into separate per-package rules.\n- Public vs private is decided by **depth**: a package's root files are entry points; anything in a subfolder is private. The conventional subfolders are `lib\u002F` (implementation) and `tests\u002F`, but the rule doesn't hardcode them: any subfolder is private, so a new folder never needs a config change. Adding an entry point is just adding a root file (no barrel).\n- Packages are **flat**: one tier of immediate children under the root. A package's internals may nest as deep as you like; a package may not contain another package.\n- Use `.cjs` (not `.js`) so the config's `module.exports` works even in `\"type\": \"module\"` repos.\n",{"name":5,"license":15,"metadata":42,"description":7},{"author":43,"version":44},"Matt Pocock","1.0","main","5e9ab49e1cb8cac3dbf2019f3f975572fc7282f7",".agents\u002Fskills\u002Fsetup-ts-deep-modules",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-11 07:27:14",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add fderuiter\u002FQRCraftly-web --skill setup-ts-deep-modules",{"tool":60,"command":61},"bunx","bunx skills add fderuiter\u002FQRCraftly-web --skill setup-ts-deep-modules",{"tool":63,"command":64},"pnpm","pnpm dlx skills add fderuiter\u002FQRCraftly-web --skill setup-ts-deep-modules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002FSKILL.md",true,[68,74,80,86,90],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"agents\u002Fopenai.yaml","REFERENCE","参考文档",149,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002Fagents\u002Fopenai.yaml",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"assets\u002FREADME.md","ASSET","资产文件",340,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Fbrowser-compatibility-tester\u002Fskills\u002Ftesting-browser-compatibility\u002Fassets\u002FREADME.md",{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Fdependency-cruiser.config.cjs","SCRIPT","脚本",3712,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002Freferences\u002Fdependency-cruiser.config.cjs",{"path":87,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002FREADME.md",408,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Fbrowser-compatibility-tester\u002Fskills\u002Ftesting-browser-compatibility\u002Freferences\u002FREADME.md",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002FREADME.md",325,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Fbrowser-compatibility-tester\u002Fskills\u002Ftesting-browser-compatibility\u002Fscripts\u002FREADME.md",[95,110,134,177,198,211],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":37},"01M6C40FJCT5X27N59TX7RQZRY","claude-handoff","Hand the current conversation off to a fresh background agent that picks up the work immediately.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclaude-handoff\u002FSKILL.md",[],[102,103,104,105,106,107,108,109,23],"claude handoff","handoff","background","hand","fresh","conversation","up","work",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":114,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":37},"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.","AGPL-3.0","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsteward\u002FSKILL.md",[],[112,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133],"when","review","merge","pr","pull request","pull","ci","how","branch","use","opening a pr","drive","how to","events","it","request",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":114,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":148,"publishedAt":37},"01M6C42QWPRJ0G7BXDXE3DK50N","run-qrcraftly","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.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frun-qrcraftly\u002FSKILL.md",[140,145],{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":146,"categoryName":147,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000009","前端开发",[149,150,151,152,153,154,155,156,157,158,127,159,160,161,162,163,118,164,165,166,167,168,169,170,171,172,173,174,175,176],"run","run qrcraftly","app","qr code","take a screenshot","checker","generator","unit","click","generated","tests","vite","preview","container","call","page","playwright","web","react","change","e2e tests","packages","code","dev","server","start","e2e","src",{"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":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":191,"publishedAt":37},"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",[183,186],{"categoryNo":184,"categoryName":185,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":187,"categoryName":188,"taxonomyType":189,"taxonomyTypeDesc":190},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[192,193,194,23,195,196,197],"shape","writing shape","writing","exploit","article","material",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":206,"publishedAt":37},"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",[204,205],{"categoryNo":184,"categoryName":185,"taxonomyType":143,"taxonomyTypeDesc":144},{"categoryNo":187,"categoryName":188,"taxonomyType":189,"taxonomyTypeDesc":190},[207,194,208,209,23,210],"writing fragments","mine","structure","explore",{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":219,"publishedAt":37},"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",[217,218],{"categoryNo":184,"categoryName":185,"taxonomyType":143,"taxonomyTypeDesc":144},{"categoryNo":187,"categoryName":188,"taxonomyType":189,"taxonomyTypeDesc":190},[220,221,194,222,118,127,223,23],"for","writing for agents","documents","editing"]