claude/skills/requirements-ddd-modeling/SKILL.md
ドメインエキスパートとの対話を通じてユビキタス言語(用語集)とドメインモデルを作成する。新規プロジェクト開始時のドメイン理解、既存システムのリファクタリング前のモデル整理、チーム内での用語統一が必要な場合に使用。「DDDでモデリングしたい」「ドメインモデルを作成」「用語集を整理」「ユビキタス言語を定義」などのリクエストで起動。
npx skillsauth add skanehira/dotfiles requirements-ddd-modelingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
質問主導の対話でドメインを探索し、以下を生成する:
ワークフロー内の質問例で使用している「〇〇」「△△」は、対話中に収集した具体的な用語に置き換える。例えば、ユーザーが「注文」という用語を挙げた場合、「〇〇は一意に識別される必要がありますか?」は「注文は一意に識別される必要がありますか?」となる。
前のステップの出力ファイルを読み込む。
docs/USECASES.mddocs/FEASIBILITY.mddocs/USER_STORIES.mdRead({ file_path: "docs/USECASES.md" })
Read({ file_path: "docs/FEASIBILITY.md" })
Read({ file_path: "docs/USER_STORIES.md" })
読み込んだ内容から以下を抽出:
遷移条件: フェーズ1へ(ドメイン概要把握を効率化)
フェーズ1でAskUserQuestionを使ってドメインを確認。
遷移条件: フェーズ1へ
対象ドメインの全体像を理解する。
注: フェーズ0で前提ドキュメントを読み込み済みの場合、それらの情報を元にドメイン概要を確認・補完する。
AskUserQuestion({
questions: [
{
question: "どのようなビジネス/システムのドメインをモデリングしますか?",
header: "ドメイン",
options: [
{ label: "ドメインを入力", description: "対象ドメインの概要を記述" }
],
multiSelect: false
},
{
question: "このドメインで最も重要なビジネス上の関心事は何ですか?",
header: "関心事",
options: [
{ label: "関心事を入力", description: "解決したい課題や重要な機能" }
],
multiSelect: false
}
]
})
遷移条件: ドメインの概要と主要な関心事が把握できたらフェーズ2へ
ドメインで使われる用語を洗い出す。
質問パターン:
AskUserQuestion({
questions: [
{
question: "このドメインで頻繁に使われる重要な用語を挙げてください(カンマ区切り)",
header: "用語リスト",
options: [
{ label: "用語を入力", description: "例: 注文, 顧客, 商品, 在庫" }
],
multiSelect: false
}
]
})
収集した用語それぞれについて深堀り:
遷移条件: 主要な用語(5〜15個程度)が収集され、各用語の定義が明確になったらフェーズ3へ
同じ用語でも文脈によって意味が異なるケースを特定する。
確認ポイント:
AskUserQuestion({
questions: [
{
question: "「〇〇」という用語は、異なる場面で異なる意味を持ちますか?",
header: "文脈確認",
options: [
{ label: "はい", description: "文脈によって意味が異なる" },
{ label: "いいえ", description: "一貫した意味で使われる" }
],
multiSelect: false
}
]
})
遷移条件: コンテキスト境界が明確になり、各用語がどのコンテキストに属するか整理できたらフェーズ4へ
収集した情報からモデル要素を特定する。
判定基準:
AskUserQuestion({
questions: [
{
question: "〇〇は一意に識別される必要がありますか?(例: 注文番号で識別)",
header: "識別子",
options: [
{ label: "はい", description: "一意のIDで管理される" },
{ label: "いいえ", description: "値で比較すれば十分" }
],
multiSelect: false
}
]
})
判定基準:
判定基準:
AskUserQuestion({
questions: [
{
question: "〇〇を変更するとき、必ず一緒に更新が必要なものはありますか?",
header: "整合性",
options: [
{ label: "あり", description: "関連するものを入力" },
{ label: "なし", description: "単独で更新可能" }
],
multiSelect: false
}
]
})
質問パターン:
遷移条件: 以下がすべて特定できたらフェーズ5へ
構築したモデルをユーザーと確認する。
## 確認事項
1. 用語の定義は正確か
2. エンティティと値オブジェクトの分類は適切か
3. 集約の境界は妥当か
4. 見落としている概念はないか
遷移条件: ユーザーがモデルを承認したらフェーズ6へ。修正が必要な場合は該当フェーズに戻る
確認が完了したら以下を生成する。
# ユビキタス言語 - 用語集
## コンテキスト: [コンテキスト名]
| 用語 | 定義 | 関連用語 | 備考 |
|------|------|----------|------|
| 注文 | 顧客が商品を購入する意思表示 | 顧客, 商品 | OrderStatus参照 |
Mermaid記法でクラス図を生成:
classDiagram
class Order {
<<Aggregate Root>>
+OrderID id
+CustomerID customerId
+List~OrderLine~ lines
+OrderStatus status
+place()
+cancel()
}
class OrderLine {
<<Entity>>
+ProductID productId
+Quantity quantity
+Money price
}
class Money {
<<Value Object>>
+int amount
+string currency
}
Order "1" *-- "*" OrderLine
OrderLine --> Money
// 用語集
Write({
file_path: "docs/GLOSSARY.md",
content: glossaryContent
})
// ドメインモデル
Write({
file_path: "docs/DOMAIN_MODEL.md",
content: domainModelContent
})
生成したドキュメントのレビューをサブエージェントに委譲する。
Task({
description: "DDDモデルレビュー",
subagent_type: "general-purpose",
prompt: `
以下のDDDモデリング成果物をレビューし、問題があれば修正してください。
## レビュー対象ファイル
- docs/GLOSSARY.md(用語集)
- docs/DOMAIN_MODEL.md(ドメインモデル図)
## レビュー観点
1. **用語の一貫性**: 用語集とモデル図で同じ用語が使われているか
2. **モデルの完全性**: 重要な概念が漏れていないか
3. **境界の妥当性**: 集約の境界が適切か、責務が明確か
4. **ビジネスルール**: 重要なビジネスルールがモデルに反映されているか
## チェックリスト
**用語集(GLOSSARY.md)**
- すべての用語に明確な定義がある
- 関連用語が正しくリンクされている
- コンテキストごとに整理されている
**ドメインモデル図(DOMAIN_MODEL.md)**
- エンティティと値オブジェクトが正しく分類されている
- 集約ルートが明示されている
- 関連と多重度が正確
- ステレオタイプ(<<Entity>>, <<Value Object>>等)が付与されている
## 出力形式
1. 発見した問題のリスト(問題がない場合は「問題なし」)
2. 各問題の修正内容
3. 修正後のファイル更新(Editツールで修正)
問題がなくなるまでレビューと修正を繰り返すこと。
`
})
tools
ローカルのコミット履歴と差分からDraft PRを作成する。ブランチ未作成・コミット未作成の状態でも、必要に応じてブランチ作成とコミットを行ってからPRを作成する。`.github/` にPRテンプレートがあれば内容を埋めて、なければ作業内容から本文を生成し、`AskUserQuestion`で作成可否を確認してから `gh pr create --draft` を実行する。「PRを出したい」「draft PRを作成」「プルリクを作って」「PR本文を生成」などのリクエストで起動。
tools
複数サブエージェントに異なる立場を与えて議論を反復し、相違が収束するまで議題を検証して結論を提示する。設計妥当性検証・実装方針比較・原因分析のセカンドオピニオン・アイデアの壁打ちに使用。「議論したい」「壁打ちしたい」「セカンドオピニオン」「複数視点で検証したい」などで起動。
tools
変更内容を分析し、Conventional Commit形式でコミットする (pushはユーザが手動)
development
React 19 + Vite+ (`vp`) + TypeScript + Tailwind CSS v4 + React Router v7 (HashRouter) でモバイル向け静的SPAデモサイトをTDDで構築し、Cloudflare Workers (Static Assets) へ自動デプロイするまでの標準ワークフローを提供する。テンプレートリポジトリ `skanehira/demo-site-template` を `gh repo create --template` で clone することで scaffold を省略する。`localStorage` でフロントエンドのみ完結する"フロントのみ完結デモ"に特化。デザインコンセプトの確立には `frontend-design` スキルを呼び出して連携する。起動トリガー:「デモサイトを作りたい」「モバイル向け静的デモ」「SPAを作ってCloudflareにデプロイ」「静的プロトタイプを公開」「localStorage でフロントだけ完結」。ユースケース:(1)クライアント提案用のUI/UXたたき台、(2)新機能のプロトタイプ、(3)モバイル向けランディング。ツールチェーンは Vite+ (`vp`) で統合(内部 PM は pnpm)。