[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C6D9DH84V20JS7FV9V79VA":3,"skill-same:01M6C6D9DH84V20JS7FV9V79VA":89},{"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":28,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6C6D9DH84V20JS7FV9V79VA","design-deep-modules",null,"Judge interface depth — deep modules hide complexity behind small interfaces. Use when designing a module\u002FAPI, reviewing a class boundary, or reducing complexity.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",60,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsoftware-design-plugin\u002Fskills\u002Fdesign-deep-modules\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"design","deep","design deep modules","modules","when","depth","for","interface","assess","module","git log","log","complexity","diff","use","read","grep","Bash","api","boundary","file","git","change","2026-11-10 10:12:30",false,"---\nname: design-deep-modules\ndescription: Judge interface depth — deep modules hide complexity behind small interfaces. Use when designing a module\u002FAPI, reviewing a class boundary, or reducing complexity.\nargs: \"[target]\"\nargument-hint: \"file|module|dir|diff to assess for interface depth; omit for current change\"\nallowed-tools: Read, Grep, Glob, Bash(git diff *), Bash(git log *), TodoWrite\ncreated: 2026-06-23\nmodified: 2026-06-23\nreviewed: 2026-06-23\n---\n\n# Design: Deep Modules\n\nFrom *A Philosophy of Software Design* (Ousterhout): the best modules are\n**deep** — a small, simple interface hiding a large, complex implementation. A\n**shallow** module is the opposite: an interface nearly as complicated as the\nimplementation it wraps, so it adds cognitive cost without removing much. This\nskill assesses a module or interface for depth and points at the cheapest way to\ndeepen it.\n\nThe unit of design is *complexity at the boundary*: every method, parameter, and\nexception a caller must understand is interface cost; everything the module\nhandles for them is the benefit. Depth is the ratio.\n\n## When to Use This Skill\n\n| Use this skill when... | Use something else instead when... |\n|---|---|\n| Designing a new module\u002Fclass\u002FAPI surface and choosing what to expose | Hunting correctness bugs → `code-quality-plugin:code-review` |\n| A class boundary \"feels\" thin — pass-through methods, leaky config | Cyclomatic\u002Fcognitive metrics on a function → `code-quality-plugin:code-complexity` |\n| Deciding whether to split or merge two modules | Removing duplication specifically → `code-quality-plugin:dry-consolidation` |\n| Reviewing whether an abstraction earns its keep | Restructuring toward pure functions → `code-quality-plugin:code-refactor` |\n\n## Core Principle\n\n| Signal of a **deep** module | Signal of a **shallow** module |\n|---|---|\n| Few public methods, many private | Public surface ≈ implementation size |\n| Caller passes intent, not mechanism | Caller must orchestrate internal steps |\n| Defaults handle the common case | Every caller re-specifies the same config |\n| Errors handled or masked internally | Exceptions leak the implementation's internals |\n| Name describes *what*, not *how* | Name encodes the mechanism (`HashMapUserCache`) |\n\nTwo recurring deepening moves: **pull complexity downward** (the module, not its\ncallers, absorbs the hard case — a class with N callers pays once, they pay N\ntimes) and **design it twice** (sketch two genuinely different interfaces before\ncommitting; the second exposes the first's accidental complexity).\n\n## Parameters\n\nParse `$ARGUMENTS`:\n\n- **Target** (optional, first positional) — a file, module, directory, or diff\n  to assess. If absent, default to the current change (`git diff HEAD` + staged)\n  and say so.\n\n## Execution\n\nExecute this depth assessment:\n\n### Step 1: Map the interface vs the implementation\n\nFor the target, list the **public surface** (methods, params, required config,\nthrown exceptions, ordering constraints a caller must obey) and estimate the\n**implementation weight** behind it. State the depth verdict in one line: *deep*,\n*shallow*, or *mixed*.\n\n### Step 2: Locate the shallowness\n\nFor each shallow point, name the specific cost the caller pays and why it leaks:\n\n- **Pass-through methods** that only forward to another layer (collapse the layer)\n- **Config a caller must always set** the same way (push a default downward)\n- **Internal exceptions** surfacing as the public contract (mask or translate)\n- **Ordering \u002F temporal coupling** (\"call `init()` before `run()`\") (encapsulate)\n- **Information leakage** — the same design decision known in two modules\n\n### Step 3: Recommend the cheapest deepening\n\nPer finding, give the move (pull complexity down \u002F merge the shallow layer \u002F\nadd a default \u002F design-it-twice the interface) and the resulting smaller\ninterface. Prefer one deeper module over two shallow ones **only** when they\nshare a secret; do not merge modules that are genuinely independent (that is\nthe opposite failure — a god module).\n\n### Step 4: Report\n\nEmit: target, depth verdict, the shallow points (ordered by caller cost), and\nthe recommended interface change for each. Keep recommendations behaviour-\npreserving — this is an interface-shape review, not a rewrite.\n\n## Anti-patterns\n\n| Mistake | Correct approach |\n|---|---|\n| Treating \"more, smaller classes\" as always better | Classitis makes shallow modules; depth, not count, is the goal |\n| Merging two modules that share no secret | That builds a god module — merge only on shared information |\n| Adding a config knob \"for flexibility\" | Each knob is interface cost paid by every caller; default it |\n| Exposing an exception because it was easy | Define away or mask errors the caller cannot act on |\n\n## Quick Reference\n\n| Symptom | Deepening move |\n|---|---|\n| Pass-through \u002F wrapper method | Collapse the layer |\n| Repeated caller config | Push a default downward |\n| Leaky exceptions | Mask or translate at the boundary |\n| \"Call A before B\" | Encapsulate the sequence |\n| Two interfaces both plausible | Design it twice, pick the smaller surface |\n\n## Related\n\n- `code-quality-plugin:code-complexity` — function-level cyclomatic\u002Fcognitive\n  metrics (this skill works at the *interface* level above that)\n- `code-quality-plugin:code-refactor` — the mechanical moves that execute a\n  deepening once it's chosen\n- `code-quality-plugin:dry-consolidation` — information leakage is often\n  duplication; dedupe is one deepening move\n- `software-design-plugin:design-by-contract` — what the deepened interface\n  should promise its callers\n","# Design: Deep Modules\n\nFrom *A Philosophy of Software Design* (Ousterhout): the best modules are\n**deep** — a small, simple interface hiding a large, complex implementation. A\n**shallow** module is the opposite: an interface nearly as complicated as the\nimplementation it wraps, so it adds cognitive cost without removing much. This\nskill assesses a module or interface for depth and points at the cheapest way to\ndeepen it.\n\nThe unit of design is *complexity at the boundary*: every method, parameter, and\nexception a caller must understand is interface cost; everything the module\nhandles for them is the benefit. Depth is the ratio.\n\n## When to Use This Skill\n\n| Use this skill when... | Use something else instead when... |\n|---|---|\n| Designing a new module\u002Fclass\u002FAPI surface and choosing what to expose | Hunting correctness bugs → `code-quality-plugin:code-review` |\n| A class boundary \"feels\" thin — pass-through methods, leaky config | Cyclomatic\u002Fcognitive metrics on a function → `code-quality-plugin:code-complexity` |\n| Deciding whether to split or merge two modules | Removing duplication specifically → `code-quality-plugin:dry-consolidation` |\n| Reviewing whether an abstraction earns its keep | Restructuring toward pure functions → `code-quality-plugin:code-refactor` |\n\n## Core Principle\n\n| Signal of a **deep** module | Signal of a **shallow** module |\n|---|---|\n| Few public methods, many private | Public surface ≈ implementation size |\n| Caller passes intent, not mechanism | Caller must orchestrate internal steps |\n| Defaults handle the common case | Every caller re-specifies the same config |\n| Errors handled or masked internally | Exceptions leak the implementation's internals |\n| Name describes *what*, not *how* | Name encodes the mechanism (`HashMapUserCache`) |\n\nTwo recurring deepening moves: **pull complexity downward** (the module, not its\ncallers, absorbs the hard case — a class with N callers pays once, they pay N\ntimes) and **design it twice** (sketch two genuinely different interfaces before\ncommitting; the second exposes the first's accidental complexity).\n\n## Parameters\n\nParse `$ARGUMENTS`:\n\n- **Target** (optional, first positional) — a file, module, directory, or diff\n  to assess. If absent, default to the current change (`git diff HEAD` + staged)\n  and say so.\n\n## Execution\n\nExecute this depth assessment:\n\n### Step 1: Map the interface vs the implementation\n\nFor the target, list the **public surface** (methods, params, required config,\nthrown exceptions, ordering constraints a caller must obey) and estimate the\n**implementation weight** behind it. State the depth verdict in one line: *deep*,\n*shallow*, or *mixed*.\n\n### Step 2: Locate the shallowness\n\nFor each shallow point, name the specific cost the caller pays and why it leaks:\n\n- **Pass-through methods** that only forward to another layer (collapse the layer)\n- **Config a caller must always set** the same way (push a default downward)\n- **Internal exceptions** surfacing as the public contract (mask or translate)\n- **Ordering \u002F temporal coupling** (\"call `init()` before `run()`\") (encapsulate)\n- **Information leakage** — the same design decision known in two modules\n\n### Step 3: Recommend the cheapest deepening\n\nPer finding, give the move (pull complexity down \u002F merge the shallow layer \u002F\nadd a default \u002F design-it-twice the interface) and the resulting smaller\ninterface. Prefer one deeper module over two shallow ones **only** when they\nshare a secret; do not merge modules that are genuinely independent (that is\nthe opposite failure — a god module).\n\n### Step 4: Report\n\nEmit: target, depth verdict, the shallow points (ordered by caller cost), and\nthe recommended interface change for each. Keep recommendations behaviour-\npreserving — this is an interface-shape review, not a rewrite.\n\n## Anti-patterns\n\n| Mistake | Correct approach |\n|---|---|\n| Treating \"more, smaller classes\" as always better | Classitis makes shallow modules; depth, not count, is the goal |\n| Merging two modules that share no secret | That builds a god module — merge only on shared information |\n| Adding a config knob \"for flexibility\" | Each knob is interface cost paid by every caller; default it |\n| Exposing an exception because it was easy | Define away or mask errors the caller cannot act on |\n\n## Quick Reference\n\n| Symptom | Deepening move |\n|---|---|\n| Pass-through \u002F wrapper method | Collapse the layer |\n| Repeated caller config | Push a default downward |\n| Leaky exceptions | Mask or translate at the boundary |\n| \"Call A before B\" | Encapsulate the sequence |\n| Two interfaces both plausible | Design it twice, pick the smaller surface |\n\n## Related\n\n- `code-quality-plugin:code-complexity` — function-level cyclomatic\u002Fcognitive\n  metrics (this skill works at the *interface* level above that)\n- `code-quality-plugin:code-refactor` — the mechanical moves that execute a\n  deepening once it's chosen\n- `code-quality-plugin:dry-consolidation` — information leakage is often\n  duplication; dedupe is one deepening move\n- `software-design-plugin:design-by-contract` — what the deepened interface\n  should promise its callers\n",{"args":57,"name":5,"created":58,"modified":58,"reviewed":58,"description":7,"allowed-tools":59,"argument-hint":60},"[target]",1782172800000,"Read, Grep, Glob, Bash(git diff *), Bash(git log *), TodoWrite","file|module|dir|diff to assess for interface depth; omit for current change","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","software-design-plugin\u002Fskills\u002Fdesign-deep-modules",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-13 20:24:11",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add laurigates\u002Fclaude-plugins --skill design-deep-modules",{"tool":75,"command":76},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill design-deep-modules",{"tool":78,"command":79},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill design-deep-modules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsoftware-design-plugin\u002Fskills\u002Fdesign-deep-modules\u002FSKILL.md",true,[83],{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"agents\u002Fopenai.yaml","REFERENCE","参考文档",144,"https:\u002F\u002Fgithub.com\u002Fian-pascoe\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fwayfinder\u002Fagents\u002Fopenai.yaml",[90,115,136,152,175,202],{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":99,"publishedAt":52},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[96],{"categoryNo":97,"categoryName":98,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[100,101,102,103,104,105,106,107,108,109,43,33,46,49,110,111,112,113,114,44],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","text","with","xdg","via","2026",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":52},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[103,122,123,124,125,126,33,46,127,128,129,114,44,130,131,132,133,134,135,43],"kitty session persistence","session","persistence","false","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":52},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[143,144,103,145,146,105,147,148,106,149,150,43,33,151,46,110,111,129,114,44],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":52},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[159,160,161,162,163,164,165,166,167,168,43,33,46,169,49,170,171,172,173,174],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":188,"publishedAt":52},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[181,184,185],{"categoryNo":182,"categoryName":183,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":97,"categoryName":98,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":186,"categoryName":187,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师",[189,190,191,192,165,193,44,194,131,195,196,197,43,46,49,47,198,33,199,200,201,113,114],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","v3","tags","id","title",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":206,"categories":207,"keywords":211,"publishedAt":52},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[208],{"categoryNo":209,"categoryName":210,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[212,213,214,215,191,192,216,217,218,219,220,44,221,222,223,224,43,225,33,111,226,114],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]