[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71Q7PFFN6C7B2GFYS2FT8BK":3,"skill-same:01M71Q7PFFN6C7B2GFYS2FT8BK":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":44,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":59},"01M71Q7PFFN6C7B2GFYS2FT8BK","setup-ts-deep-modules",null,"在 TypeScript repo 中接入 dependency-cruiser，让每个 package 成为 deep module：implementation 隐藏在 subfolders 中，只能通过 entry-point files 访问。User-invoked。","vinvcn\u002Fmattpocock-skills-zh-CN","vinvcn","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F120928190?v=4","01M71Q60C4V98DEXHGN2VXFSZB","01M71Q60D6PRAJHKQRY33ZNE59",5679,"MIT","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fin-progress\u002Fsetup-ts-deep-modules\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"setup","setup ts deep modules","modules","deep","typescript","package","repo","user","dependency","implementation","files","module","true","entry","point","2026-11-10 13:02:02",false,"---\nname: setup-ts-deep-modules\ndescription: 在 TypeScript repo 中接入 dependency-cruiser，让每个 package 成为 deep module：implementation 隐藏在 subfolders 中，只能通过 entry-point files 访问。User-invoked。\ndisable-model-invocation: true\n---\n\n# Setup TS Deep Modules\n\n让 repo 中每个 package 成为 **deep module**：用小 interface 隐藏大量 behaviour。Package 的 public surface 是其 **entry points**（package root 中的 files），所有 subfolders 都隐藏。这个 skill 会安装 [dependency-cruiser](https:\u002F\u002Fgithub.com\u002Fsverweij\u002Fdependency-cruiser)，加入强制只能通过 entry points 访问的 rules，并证明这些 rules 确实会拦截违规。\n\nVocabulary（deep module、interface、seam、depth）来自调用 Skill 工具并指定 `codebase-design`；整个过程都使用它的语言。\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\nPublic surface 是 package 的 **root files**，并非指定的单个 `index.ts`。按 convention，implementation 放在 `lib\u002F`，tests 放在 `tests\u002F`，使所有 packages 采用相同的 two-folder shape。Rule 本身是通用的：*任何* subfolder 中的*任何*内容都是 private，因此永远无需为了新增 folder 扩展 config。\n\n四条 rules，全部为 `error`：\n\n1. **Entry-point boundary** — package 外的 code（app code 或其他 package）只能 import 该 package 的 entry points（root files），不能 import subfolder 中的任何内容。\n2. **Intra-package freedom** — package 自己的 files 可以自由互相 import。\n3. **Tests through the entry points** — `\u003Cpkg>\u002Ftests\u002F` 下的 files 可以 import 任意 package 的 entry points 和自己的 `tests\u002F` fixtures，但不能 import 任何 package 的 subfolder internals（包括自己的）。允许跨 package integration tests，不允许 deep imports。\n4. **No cycles** — 不允许 dependency cycles。\n\n**Entry points, not a barrel.** Public surface 是每个 root file，因此 package 可以提供多个小 entry points（`index.ts`、`client.ts`、`server.ts`），不必把一切汇入巨大的 `index.ts`。不鼓励 re-export 整个 subtree 的 barrel files；entry points 要小，implementation 隐藏在 subfolders。\n\nLayering（哪些 packages 可以依赖哪些）是另一个 concern，在 config 中保留 commented stub，由当前 repo 填写。\n\n## Steps\n\n### 1. Detect the environment\n\n- **Package manager** — `pnpm-lock.yaml` → pnpm，`yarn.lock` → yarn，`bun.lockb` → bun，否则 npm。后续每条 command 都使用它（`pnpm`\u002F`yarn`\u002F`npm run`\u002F`bunx`）。\n- **Packages root** — 存在 `src\u002F` 就用 `src\u002Fpackages`，否则用 `packages`。如果 repo 已有明显不同的 convention，与用户确认。\n- **Existing config** — 检查 `.dependency-cruiser.*` file。若存在，不要覆盖；merge 四条 rules 和 options，并说明添加了什么。\n\n**Done when:** package manager、packages root 和 existing-config status 全部明确。\n\n### 2. Install dependency-cruiser\n\n使用检测到的 package manager，把 `dependency-cruiser` 安装为 devDependency。\n\n**Done when:** `dependency-cruiser` 出现在 `devDependencies`。\n\n### 3. Write the config\n\n把 [`dependency-cruiser.config.cjs`](.\u002Fdependency-cruiser.config.cjs) 复制到 repo root，命名为 `.dependency-cruiser.cjs`。把 `PACKAGES_ROOT` 设置成 step 1 检测到的 root。Rules 基于 path depth 且与 extension 无关，不需要其他调整。\n\n**Done when:** `.dependency-cruiser.cjs` 存在、`PACKAGES_ROOT` 正确，并包含四条 forbidden rules。\n\n### 4. Wire it into the checks\n\n- 添加 `lint:boundaries` script：`depcruise \u003Cpackages-root>`（或 `depcruise src`）。\n- 把它纳入 repo 已经执行 typecheck 的 umbrella check command（如 `check` \u002F `ci` \u002F `validate`）。不要修改 `tsconfig` 或添加 path aliases。\n- 如果没有 umbrella script，就添加 `lint:boundaries`，并告诉用户把它加入 CI。\n\n**Done when:** `lint:boundaries` 存在，且和 typecheck 由同一 command 运行。\n\n### 5. Scaffold the example package\n\n创建并 commit 一个 `\u003Cpackages-root>\u002Fexample\u002F` 作为 copy-me template：\n\n- `index.ts` — entry point，export 一个 delegate 给 internal file 的 function，让 package 明显是 *deep*，不是 pass-through。\n- `lib\u002Fimpl.ts` — **subfolder** 中的 internal file，由 `index.ts` import，外部无法访问。\n- `tests\u002Fexample.test.ts` — **只** import `..\u002Findex`（entry point），并针对 public function assert。\n\n告诉用户这是可以 copy 或 delete 的 starter template。\n\n**Done when:** example package 存在，通过 root entry point 暴露 behaviour，并把 `impl` 隐藏在 subfolder。\n\n### 6. Prove the rules bite\n\n这是整个 skill 的 completion criterion；不能在 violation 时失败的 config 毫无价值。\n\n1. 运行 `lint:boundaries`，clean example 必须 **pass**。\n2. 临时给 `tests\u002Fexample.test.ts` 加一个 deep import，例如 `import { thing } from \"..\u002Flib\u002Fimpl\"`。再次运行 `lint:boundaries`，必须以 `tests-through-entrypoints` **fail**。\n3. Revert deep import，再运行一次，必须 **pass**。\n\n**Done when:** 已观察到 pass、deep import 时 fail、恢复后再 pass。Step 2 不失败，就先修正 wiring，不能完成任务。\n\n### 7. Document the convention\n\n在 packages folder（`\u003Cpackages-root>\u002FREADME.md`）中写 `README.md`，内容覆盖：`src\u002Fpackages\u002F\u003Cname>\u002F` layout（root 中是 entry points、`lib\u002F` 放 implementation、`tests\u002F` 放 tests）、“只通过 package 的 entry points（root files）import”，以及如何运行 `lint:boundaries`。明确 **discourage barrel files**，用多个小 entry points，而不是从一个 index re-export 整个 subtree。内容只保留 copy-me snippet，以及四条 rules 各一段。\n\n再从 repo 的 agent-instructions file 指向它：优先 `CLAUDE.md`，否则 `AGENTS.md`；两者都不存在则创建 `AGENTS.md`。一行即可，例如：`Packages are deep modules — see [src\u002Fpackages\u002FREADME.md](.\u002Fsrc\u002Fpackages\u002FREADME.md) before adding or importing one.` 这让 agent 能发现 boundary rule，而不是撞上它。\n\n**Done when:** `\u003Cpackages-root>\u002FREADME.md` 存在且 discourages barrels，repo 的 `CLAUDE.md`\u002F`AGENTS.md` 链接到它。\n\n## Notes\n\n- Config 中的 `$1` back-references（dependency-cruiser group matching）让 package 能访问自己的 internals，同时阻止 outsiders；不要把它们展开成每 package 一条 rule。\n- Public\u002Fprivate 由 **depth** 决定：package root files 是 entry points，subfolder 中的一切都是 private。Convention 是 `lib\u002F` 和 `tests\u002F`，但 rule 不 hardcode；新增 folder 无需改 config，新增 entry point 只需新增 root file，不需要 barrel。\n- Packages 是 **flat**：root 下只有一层 immediate children。Package internals 可以任意深，但 package 不能包含另一个 package。\n- 使用 `.cjs`（不是 `.js`），确保即使 repo 使用 `\"type\": \"module\"`，config 的 `module.exports` 也能工作。\n","# Setup TS Deep Modules\n\n让 repo 中每个 package 成为 **deep module**：用小 interface 隐藏大量 behaviour。Package 的 public surface 是其 **entry points**（package root 中的 files），所有 subfolders 都隐藏。这个 skill 会安装 [dependency-cruiser](https:\u002F\u002Fgithub.com\u002Fsverweij\u002Fdependency-cruiser)，加入强制只能通过 entry points 访问的 rules，并证明这些 rules 确实会拦截违规。\n\nVocabulary（deep module、interface、seam、depth）来自调用 Skill 工具并指定 `codebase-design`；整个过程都使用它的语言。\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\nPublic surface 是 package 的 **root files**，并非指定的单个 `index.ts`。按 convention，implementation 放在 `lib\u002F`，tests 放在 `tests\u002F`，使所有 packages 采用相同的 two-folder shape。Rule 本身是通用的：*任何* subfolder 中的*任何*内容都是 private，因此永远无需为了新增 folder 扩展 config。\n\n四条 rules，全部为 `error`：\n\n1. **Entry-point boundary** — package 外的 code（app code 或其他 package）只能 import 该 package 的 entry points（root files），不能 import subfolder 中的任何内容。\n2. **Intra-package freedom** — package 自己的 files 可以自由互相 import。\n3. **Tests through the entry points** — `\u003Cpkg>\u002Ftests\u002F` 下的 files 可以 import 任意 package 的 entry points 和自己的 `tests\u002F` fixtures，但不能 import 任何 package 的 subfolder internals（包括自己的）。允许跨 package integration tests，不允许 deep imports。\n4. **No cycles** — 不允许 dependency cycles。\n\n**Entry points, not a barrel.** Public surface 是每个 root file，因此 package 可以提供多个小 entry points（`index.ts`、`client.ts`、`server.ts`），不必把一切汇入巨大的 `index.ts`。不鼓励 re-export 整个 subtree 的 barrel files；entry points 要小，implementation 隐藏在 subfolders。\n\nLayering（哪些 packages 可以依赖哪些）是另一个 concern，在 config 中保留 commented stub，由当前 repo 填写。\n\n## Steps\n\n### 1. Detect the environment\n\n- **Package manager** — `pnpm-lock.yaml` → pnpm，`yarn.lock` → yarn，`bun.lockb` → bun，否则 npm。后续每条 command 都使用它（`pnpm`\u002F`yarn`\u002F`npm run`\u002F`bunx`）。\n- **Packages root** — 存在 `src\u002F` 就用 `src\u002Fpackages`，否则用 `packages`。如果 repo 已有明显不同的 convention，与用户确认。\n- **Existing config** — 检查 `.dependency-cruiser.*` file。若存在，不要覆盖；merge 四条 rules 和 options，并说明添加了什么。\n\n**Done when:** package manager、packages root 和 existing-config status 全部明确。\n\n### 2. Install dependency-cruiser\n\n使用检测到的 package manager，把 `dependency-cruiser` 安装为 devDependency。\n\n**Done when:** `dependency-cruiser` 出现在 `devDependencies`。\n\n### 3. Write the config\n\n把 [`dependency-cruiser.config.cjs`](.\u002Fdependency-cruiser.config.cjs) 复制到 repo root，命名为 `.dependency-cruiser.cjs`。把 `PACKAGES_ROOT` 设置成 step 1 检测到的 root。Rules 基于 path depth 且与 extension 无关，不需要其他调整。\n\n**Done when:** `.dependency-cruiser.cjs` 存在、`PACKAGES_ROOT` 正确，并包含四条 forbidden rules。\n\n### 4. Wire it into the checks\n\n- 添加 `lint:boundaries` script：`depcruise \u003Cpackages-root>`（或 `depcruise src`）。\n- 把它纳入 repo 已经执行 typecheck 的 umbrella check command（如 `check` \u002F `ci` \u002F `validate`）。不要修改 `tsconfig` 或添加 path aliases。\n- 如果没有 umbrella script，就添加 `lint:boundaries`，并告诉用户把它加入 CI。\n\n**Done when:** `lint:boundaries` 存在，且和 typecheck 由同一 command 运行。\n\n### 5. Scaffold the example package\n\n创建并 commit 一个 `\u003Cpackages-root>\u002Fexample\u002F` 作为 copy-me template：\n\n- `index.ts` — entry point，export 一个 delegate 给 internal file 的 function，让 package 明显是 *deep*，不是 pass-through。\n- `lib\u002Fimpl.ts` — **subfolder** 中的 internal file，由 `index.ts` import，外部无法访问。\n- `tests\u002Fexample.test.ts` — **只** import `..\u002Findex`（entry point），并针对 public function assert。\n\n告诉用户这是可以 copy 或 delete 的 starter template。\n\n**Done when:** example package 存在，通过 root entry point 暴露 behaviour，并把 `impl` 隐藏在 subfolder。\n\n### 6. Prove the rules bite\n\n这是整个 skill 的 completion criterion；不能在 violation 时失败的 config 毫无价值。\n\n1. 运行 `lint:boundaries`，clean example 必须 **pass**。\n2. 临时给 `tests\u002Fexample.test.ts` 加一个 deep import，例如 `import { thing } from \"..\u002Flib\u002Fimpl\"`。再次运行 `lint:boundaries`，必须以 `tests-through-entrypoints` **fail**。\n3. Revert deep import，再运行一次，必须 **pass**。\n\n**Done when:** 已观察到 pass、deep import 时 fail、恢复后再 pass。Step 2 不失败，就先修正 wiring，不能完成任务。\n\n### 7. Document the convention\n\n在 packages folder（`\u003Cpackages-root>\u002FREADME.md`）中写 `README.md`，内容覆盖：`src\u002Fpackages\u002F\u003Cname>\u002F` layout（root 中是 entry points、`lib\u002F` 放 implementation、`tests\u002F` 放 tests）、“只通过 package 的 entry points（root files）import”，以及如何运行 `lint:boundaries`。明确 **discourage barrel files**，用多个小 entry points，而不是从一个 index re-export 整个 subtree。内容只保留 copy-me snippet，以及四条 rules 各一段。\n\n再从 repo 的 agent-instructions file 指向它：优先 `CLAUDE.md`，否则 `AGENTS.md`；两者都不存在则创建 `AGENTS.md`。一行即可，例如：`Packages are deep modules — see [src\u002Fpackages\u002FREADME.md](.\u002Fsrc\u002Fpackages\u002FREADME.md) before adding or importing one.` 这让 agent 能发现 boundary rule，而不是撞上它。\n\n**Done when:** `\u003Cpackages-root>\u002FREADME.md` 存在且 discourages barrels，repo 的 `CLAUDE.md`\u002F`AGENTS.md` 链接到它。\n\n## Notes\n\n- Config 中的 `$1` back-references（dependency-cruiser group matching）让 package 能访问自己的 internals，同时阻止 outsiders；不要把它们展开成每 package 一条 rule。\n- Public\u002Fprivate 由 **depth** 决定：package root files 是 entry points，subfolder 中的一切都是 private。Convention 是 `lib\u002F` 和 `tests\u002F`，但 rule 不 hardcode；新增 folder 无需改 config，新增 entry point 只需新增 root file，不需要 barrel。\n- Packages 是 **flat**：root 下只有一层 immediate children。Package internals 可以任意深，但 package 不能包含另一个 package。\n- 使用 `.cjs`（不是 `.js`），确保即使 repo 使用 `\"type\": \"module\"`，config 的 `module.exports` 也能工作。\n",{"name":5,"description":7,"disable-model-invocation":38},true,"main","c5c5e87cc1df26aeb7dba345ad9f846434d2b3d4","skills\u002Fin-progress\u002Fsetup-ts-deep-modules",441,"https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN","https:\u002F\u002Fskills.sh\u002Fvinvcn\u002Fmattpocock-skills-zh-CN","https:\u002F\u002Fgithub.com\u002Fvinvcn","2026-11-10 17:40:42",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":38},[49,52,55],{"tool":50,"command":51},"npx","npx skills add vinvcn\u002Fmattpocock-skills-zh-CN --skill setup-ts-deep-modules",{"tool":53,"command":54},"bunx","bunx skills add vinvcn\u002Fmattpocock-skills-zh-CN --skill setup-ts-deep-modules",{"tool":56,"command":57},"pnpm","pnpm dlx skills add vinvcn\u002Fmattpocock-skills-zh-CN --skill setup-ts-deep-modules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fin-progress\u002Fsetup-ts-deep-modules\u002FSKILL.md",[60,66],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"agents\u002Fopenai.yaml","REFERENCE","参考文档",154,"https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fin-progress\u002Fsetup-ts-deep-modules\u002Fagents\u002Fopenai.yaml",{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"dependency-cruiser.config.cjs","SCRIPT","脚本",3732,"https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fin-progress\u002Fsetup-ts-deep-modules\u002Fdependency-cruiser.config.cjs",[73,97,106,116,126,135],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":92,"publishedAt":33},"01M71Q8F3M8YFP6WYVYQP61KBT","writing-for-agents","为 agent 编写文档。适用于创建或编辑 skills，或修改 AGENTS.md 或 CLAUDE.md 时。","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fwriting-for-agents\u002FSKILL.md",[79,84,87],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":85,"categoryName":86,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[93,94,95,96],"for","writing for agents","writing","文档",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":33},"01M71Q8DHRPYE6R648CQ7NAHYN","wait-what","停一下：刚才那条消息没有说清楚，重新表述一遍。","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fwait-what\u002FSKILL.md",[],[104,105,30],"wait","wait what",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":33},"01M71Q8C8CBSRJRP8Y0JRZ7RJ7","to-questionnaire","把你无法完整回答的 decision 转成一份交给他人填写的 questionnaire。","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fto-questionnaire\u002FSKILL.md",[],[113,114,115,30],"questionnaire","to questionnaire","decision",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":125,"publishedAt":33},"01M71Q8ASS9A6P84PSC02YFKHB","teach","在这个工作区中教用户一个新技能或概念。","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fteach\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000039","教师与教育",[118,30],{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":33},"01M71Q89C2C2QRR3J3H64ZKH0P","handoff","把当前对话压缩成交接文档，让另一个代理接手。","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fhandoff\u002FSKILL.md",[],[128,30,133,134,96],"对话","压缩",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":33},"01M71Q883CXWF0BGDQC3Y8TJZ2","grilling","围绕计划、decision 或 idea 持续追问用户。适用于用户想对自己的思路做压力测试，或使用任何 “grill” 触发措辞时。","https:\u002F\u002Fgithub.com\u002Fvinvcn\u002Fmattpocock-skills-zh-CN\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fgrilling\u002FSKILL.md",[],[137,142,143,115,144],"idea","grill","testing"]