[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7199WBE1KNB4D78WHVZFSWX":3,"skill-same:01M7199WBE1KNB4D78WHVZFSWX":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":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},"01M7199WBE1KNB4D78WHVZFSWX","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\u002Fderuiter.dev","fderuiter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F127706008?v=4","01M6C40AWP9EPQBS3EG0RF5DRD","Frederick de Ruiter","01M7198E09Z6HET9MCJ9X3G8T4",1,"MIT","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\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","c47b6da3146618c87c6126686b1865c80db104de",".agents\u002Fskills\u002Fsetup-ts-deep-modules",0,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev","https:\u002F\u002Fderuiter.dev","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-13 02:50:13",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add fderuiter\u002Fderuiter.dev --skill setup-ts-deep-modules",{"tool":60,"command":61},"bunx","bunx skills add fderuiter\u002Fderuiter.dev --skill setup-ts-deep-modules",{"tool":63,"command":64},"pnpm","pnpm dlx skills add fderuiter\u002Fderuiter.dev --skill setup-ts-deep-modules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002FSKILL.md",true,[68,74],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"agents\u002Fopenai.yaml","REFERENCE","参考文档",149,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002Fagents\u002Fopenai.yaml",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fdependency-cruiser.config.cjs","SCRIPT","脚本",3712,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsetup-ts-deep-modules\u002Freferences\u002Fdependency-cruiser.config.cjs",[81,104,127,159,173,186],{"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":85,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":37},"01M719B069WAWZK66D6XC5VEP6","steward","Drive a deruiter.dev pull request to green. Use when opening a PR, answering CI failures or review comments on one, or resolving a merge conflict with main.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsteward\u002FSKILL.md",[],[83,89,90,91,92,93,94,33,95,96,97,45,98,99,100,101,102,103],"drive","use","opening a pr","request","merge","pull request","review","comments","when","dev","ci","green","pr","conflict","pull",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":85,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":37},"01M719AY21D3SEW98GS1Y4413G","run-portfolio","Build, run, and drive the fderuiter\u002Fderuiter.dev Next.js web app. Use when asked to start the portfolio site, run the dev server, take a screenshot of a page (home, \u002Fpatrol, \u002Fcrf, \u002Fproof, arcade games, etc.), or interact with its UI.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frun-portfolio\u002FSKILL.md",[],[111,112,113,114,115,116,117,118,119,33,120,121,97,90,122,98,123,124,125,126],"portfolio","run portfolio","run","take","games","build","next","web","server","home","Next.js","take a screenshot","patrol","start","app","page",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":131,"sourceHtmlUrl":132,"categories":133,"keywords":144,"publishedAt":37},"01M719AT8224QX2CRMQV6NV62M","humanizer","Edit deruiter.dev prose so it reads like Fred wrote it, without changing what it says. Use when writing or editing a blog post, case study, page or game copy, the README, docs, a PR body, an issue or a commit message in this repository.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhumanizer\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhumanizer\u002FSKILL.md",[134,139],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[129,145,97,146,147,101,148,90,98,149,150,151,126,152,153,154,155,156,157,158],"commit","writing","game","commit message","study","editing","README","blog post","body","issue","edit","repository","pr body","message",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":167,"publishedAt":37},"01M719ARDTHZN4F9Q9DRFQ3DWB","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-shape\u002FSKILL.md",[165,166],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},[146,168,169,23,170,171,172],"shape","writing shape","material","exploit","article",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":181,"publishedAt":37},"01M719AP8B84FCM0S2H6DMJ8J8","writing-fragments","Writing, explore: mine raw fragments, no structure yet.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-fragments\u002FSKILL.md",[179,180],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},[182,146,183,23,184,185],"writing fragments","explore","mine","structure",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":194,"publishedAt":37},"01M719AKXS4SFJY5THR0EZXPNM","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\u002Fderuiter.dev\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[192,193],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},[195,196,146,97,197,23,90,150],"for","writing for agents","documents"]