本文へ移動
cccskills
無料GitHub で公開日本語紹介

codebase-design

呼び出し側が覚える使い方を小さく保ち、複雑な処理を内部にまとめる設計を支援します。共通の用語と判断基準で、モジュールの使いやすさやテストのしやすさを検討するスキルです。

原文原文の説明を見る

Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.

インストール方法を見る

こんなときに便利

  • モジュールの使い方を簡単にしたいとき
  • 散らばった複雑な処理をまとめたいとき
  • 実装を差し替える場所の検討
  • テストしやすい設計にしたいとき

日本語での紹介

できること

呼び出し側が覚える使い方を小さく保ち、多くの処理を内部にまとめるモジュール設計を支援します。ここでいうインターフェースは型やメソッドだけでなく、呼び出し順、エラー、必要な設定なども含みます。共通の用語を使い、メソッド数や引数を減らせるか、複雑さを内部に隠せるかを検討します。

こんなときに便利

既存コードの使い方が複雑になったときや、変更が多くの呼び出し箇所に広がるときに向いています。実装を差し替えられる場所であるSeamの配置や、テストで確認する入口も検討できます。依存する処理を外から受け取る、結果を返すといった設計方針で、テストのしやすさを考えます。

使い方の例

  • 「このモジュールのメソッドと引数を減らす案を考えて」
  • 「呼び出し側に散らばった複雑な処理をまとめたい」
  • 「実装を差し替える場所と、テストで使う入口を検討して」

注意点

用語を統一するための設計資料としても使われます。詳細な検討先としてDEEPENING.mdとDESIGN-IT-TWICE.mdが案内され、後者は複数のサブエージェントで異なる設計案を比較する内容です。差し替える実装が実際に変わらない場所には、むやみにSeamを設けない方針です。

この紹介文は、公開されている SKILL.md をもとに AI(Claude Haiku)が作成しました。正確な仕様は下の原文を確認してください。

含まれるファイル(4)

  • SKILL.md6.3 KB
  • agents/openai.yaml102 B
  • DEEPENING.md2.5 KB
  • DESIGN-IT-TWICE.md2.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Codebase Design

Design deep modules: a lot of behaviour behind a small interface, placed at a clean seam, testable through that interface. Use this language and these principles wherever code is being designed or restructured. The aim is leverage for callers, locality for maintainers, and testability for everyone.

Glossary

Use these terms exactly: don't substitute "component," "service," "API," or "boundary." Consistent language is the whole point.

Module: anything with an interface and an implementation. Deliberately scale-agnostic: a function, class, package, or tier-spanning slice. Avoid: unit, component, service.

Interface: everything a caller must know to use the module correctly: the type signature, but also invariants, ordering constraints, error modes, required configuration, and performance characteristics. Avoid: API, signature (too narrow, they refer only to the type-level surface).

Implementation: what's inside a module, its body of code. Distinct from Adapter: a thing can be a small adapter with a large implementation (a Postgres repo) or a large adapter with a small implementation (an in-memory fake). Reach for "adapter" when the seam is the topic; "implementation" otherwise.

Depth: leverage at the interface. The amount of behaviour a caller (or test) can exercise per unit of interface they have to learn. A module is deep when a large amount of behaviour sits behind a small interface, shallow when the interface is nearly as complex as the implementation.

Seam (Michael Feathers): a place where you can alter behaviour without editing in that place; the location at which a module's interface lives. Where to put the seam is its own design decision, distinct from what goes behind it. Avoid: boundary (overloaded with DDD's bounded context).

Adapter: a concrete thing that satisfies an interface at a seam. Describes role (what slot it fills), not substance (what's inside).

Leverage: what callers get from depth. More capability per unit of interface they learn. One implementation pays back across N call sites and M tests.

Locality: what maintainers get from depth. Change, bugs, knowledge, and verification concentrate in one place rather than spreading across callers. Fix once, fixed everywhere.

Deep vs shallow

Deep module = small interface + lots of implementation:

┌─────────────────────┐
│   Small Interface   │  ← Few methods, simple params
├─────────────────────┤
│                     │
│  Deep Implementation│  ← Complex logic hidden
│                     │
└─────────────────────┘

Shallow module = large interface + little implementation (avoid):

┌─────────────────────────────────┐
│       Large Interface           │  ← Many methods, complex params
├─────────────────────────────────┤
│  Thin Implementation            │  ← Just passes through
└─────────────────────────────────┘

When designing an interface, ask:

  • Can I reduce the number of methods?
  • Can I simplify the parameters?
  • Can I hide more complexity inside?

Principles

  • Depth is a property of the interface, not the implementation. A deep module can be internally composed of small, mockable, swappable parts; they just aren't part of the interface. A module can have internal seams (private to its implementation, used by its own tests) as well as the external seam at its interface.
  • The deletion test. Imagine deleting the module. If complexity vanishes, it was a pass-through. If complexity reappears across N callers, it was earning its keep.
  • The interface is the test surface. Callers and tests cross the same seam. If you want to test past the interface, the module is probably the wrong shape.
  • One adapter means a hypothetical seam. Two adapters means a real one. Don't introduce a seam unless something actually varies across it.

Designing for testability

Good interfaces make testing natural:

  1. Accept dependencies, don't create them.

    // Testable
    function processOrder(order, paymentGateway) {}
    
    // Hard to test
    function processOrder(order) {
      const gateway = new StripeGateway();
    }
    
  2. Return results, don't produce side effects.

    // Testable
    function calculateDiscount(cart): Discount {}
    
    // Hard to test
    function applyDiscount(cart): void {
      cart.total -= discount;
    }
    
  3. Small surface area. Fewer methods = fewer tests needed. Fewer params = simpler test setup.

Relationships

  • A Module has exactly one Interface (the surface it presents to callers and tests).
  • Depth is a property of a Module, measured against its Interface.
  • A Seam is where a Module's Interface lives.
  • An Adapter sits at a Seam and satisfies the Interface.
  • Depth produces Leverage for callers and Locality for maintainers.

Rejected framings

  • Depth as ratio of implementation-lines to interface-lines (Ousterhout): rewards padding the implementation. We use depth-as-leverage instead.
  • "Interface" as the TypeScript interface keyword or a class's public methods: too narrow: interface here includes every fact a caller must know.
  • "Boundary": overloaded with DDD's bounded context. Say seam or interface.

Going deeper

  • Deepening a cluster given its dependencies, see DEEPENING.md: dependency categories, seam discipline, and replace-don't-layer testing.
  • Exploring alternative interfaces, see DESIGN-IT-TWICE.md: spin up parallel sub-agents to design the interface several radically different ways, then compare on depth, locality, and seam placement.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

ask-matt

無料日本語概要

アイデアの整理、実装、不具合調査など、状況に合う関連スキルと使う順序を案内します。作業の規模や段階に応じて、次に進む手順を選ぶための相談役です。

  • アイデアから実装までの手順選び
  • 不具合調査の始め方を知りたいとき
  • 複数回に分ける開発の進め方を相談
mattpocock/skills28.8万2026年10月12日 更新

chief-of-staff

無料日本語概要

長期的な目標に向けて複数のサブエージェントの作業を調整し、利用者との対話を続けながら、次の仕事にも役立つ作業環境や規約の改善を進めるスキル。

  • 長期目標に向けて担当を調整したいとき
  • 裏で作業を進めながら対話を続けたいとき
  • 共通の規約や作業環境を改善したいとき
mattpocock/skills28.8万2026年10月12日 更新

claude-handoff

無料日本語概要

進行中の会話を引き継ぎ用に要約し、新しいバックグラウンドエージェントへ渡します。次の作業方針や参照資料を整理して、現在の作業場所で続きを始めます。

  • 新しいエージェントに続きを任せたいとき
  • 次の作業範囲を絞って引き継ぎたいとき
  • 次のセッション用に参照資料を整理
mattpocock/skills28.8万2026年10月12日 更新

code-review

無料日本語概要

指定したコミットやブランチなどを基準にコードの変更を確認し、開発規約への適合と仕様の実現を別々にレビューします。二つの観点の指摘を分けて報告するスキルです。

  • ブランチやPRの変更レビュー
  • 指定コミットやタグ以降の確認
  • 文書化された開発規約との照合
mattpocock/skills28.8万2026年10月12日 更新

diagnosing-bugs

無料日本語概要

再現しにくい不具合や処理速度の悪化を、症状を判定するテストやスクリプトで調べます。原因候補の検証から修正、再発防止の確認まで進めるスキル。

  • 再現しにくいエラーを調べたいとき
  • 処理が遅くなった原因の調査
  • 断続的な不具合を繰り返し検証
mattpocock/skills28.8万2026年10月12日 更新

domain-modeling

無料日本語概要

プロジェクトで使う業務用語や概念の境界を、具体例とコードの照合で明確にします。決まった定義を用語集に記録し、重要な設計判断の理由も必要に応じて残すスキルです。

  • 曖昧な業務用語を整理したいとき
  • GLOSSARY.mdの作成・更新
  • 業務上の定義とコードの整合確認
mattpocock/skills28.8万2026年10月12日 更新

mattpocock のスキルをすべて見る

このスキルの問題を報告する