@unlaxer/dge-toolkit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DGE-toolkit contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # DGE — Dialogue-driven Gap Extraction
2
+
3
+ > 会話劇で設計の「書いてないこと」を発見する。
4
+
5
+ ## 使い方
6
+
7
+ Claude Code で一言:
8
+
9
+ ```
10
+ Human: 「認証 API の設計を DGE して」
11
+ ```
12
+
13
+ skill が自動発動し、テンプレート選択 → キャラ選択 → 会話劇生成 → Gap 抽出 を実行します。
14
+
15
+ 他の LLM(ChatGPT, Gemini 等)で使う場合は `method.md` のクイックスタート(方法 A)を参照してください。
16
+
17
+ ## キャラクター早見表
18
+
19
+ ```
20
+ 前提が怪しい → 👤 今泉 「そもそも聞いたんですか?」
21
+ 品質が低い → 🎩 千石 「お客様への侮辱です」
22
+ 全部複雑 → ☕ ヤン 「要らなくない?」
23
+ 前に進みすぎ → 😰 僕 「小規模にしませんか...?」
24
+ 大胆さが足りない → 👑 ラインハルト 「攻めろ」
25
+ 数字が甘い → 🦅 鷲津 「IRR は?」
26
+ 攻撃への耐性 → 😈 Red Team「競合がこうしたら?」
27
+ 収益の現実 → 🦈 大和田 「いくら稼げるんだ?」
28
+ 実装の不足 → ⚔ リヴァイ 「汚い。作れ。」
29
+ ユーザーの本音 → 🎰 利根川 「ユーザーの言葉で語れ」
30
+ 隠れた問題 → 🏥 ハウス 「全員嘘をついている」
31
+ 法的リスク → ⚖ ソウル 「利用規約は書いたか?」
32
+ ```
33
+
34
+ ## テーマ別の推奨組み合わせ
35
+
36
+ ```
37
+ API 設計: 今泉 + 千石 + 僕
38
+ 新機能企画: 今泉 + ヤン + 僕
39
+ セキュリティ: 千石 + Red Team + ハウス
40
+ Go/No-Go: 今泉 + 鷲津 + 僕
41
+ 障害振り返り: 今泉 + 千石 + Red Team
42
+ ```
43
+
44
+ ## フォルダ構成
45
+
46
+ ```
47
+ dge/
48
+ ├── README.md ← これ
49
+ ├── LICENSE
50
+ ├── method.md ← DGE の方法論
51
+ ├── characters/
52
+ │ └── catalog.md ← 12 キャラの一覧 + prompt
53
+ ├── templates/ ← テーマ別テンプレート
54
+ │ ├── api-design.md
55
+ │ ├── feature-planning.md
56
+ │ ├── go-nogo.md
57
+ │ ├── incident-review.md
58
+ │ └── security-review.md
59
+ └── sessions/ ← DGE session の出力先(自動作成)
60
+ ```
61
+
62
+ ## ライセンス
63
+
64
+ MIT License. 詳細は [LICENSE](./LICENSE) を参照。
65
+
66
+ 詳しい情報・論文・実績: https://github.com/xxx/DGE-toolkit
@@ -0,0 +1,156 @@
1
+ # DGE Character Catalog
2
+
3
+ > ※ キャラクター名はオリジナルです。括弧内の作品名は思考パターンの参考元を示すものであり、当該作品との公式な関連はありません。
4
+
5
+ ## 使い分け早見表
6
+
7
+ ```
8
+ 前に進みすぎ → 😰 僕 「小規模にしませんか...?」
9
+ 前提が怪しい → 👤 今泉 「そもそも聞いたんですか?」
10
+ 品質が低い → 🎩 千石 「お客様への侮辱です」
11
+ 大胆さが足りない→ 👑 ラインハルト 「攻めろ」
12
+ 全部複雑 → ☕ ヤン 「要らなくない?」
13
+ 数字が甘い → 🦅 鷲津 「IRR は?」
14
+ 組織が硬い → 👔 島耕作 「根回ししましょう」
15
+ 攻撃への耐性 → 😈 Red Team「競合がこうしたら?」
16
+ 法的リスク → ⚖ ソウル 「利用規約は書いたか?」
17
+ 収益の現実 → 🦈 大和田 「いくら稼げるんだ?」
18
+ 実装の不足 → ⚔ リヴァイ 「汚い。作れ。」
19
+ 課金の本音 → 🎰 利根川 「ユーザーの言葉で語れ」
20
+ 隠れた問題 → 🏥 ハウス 「全員嘘をついている」
21
+ ```
22
+
23
+ ## テーマ別の推奨キャラ組み合わせ
24
+
25
+ ```
26
+ API 設計: 今泉 + 千石 + 僕
27
+ 新機能企画: 今泉 + ヤン + 僕
28
+ セキュリティ: 千石 + Red Team + ハウス
29
+ Go/No-Go: 今泉 + 鷲津 + 僕
30
+ VC 準備: 今泉 + 鷲津 + ラインハルト + 僕
31
+ 障害振り返り: 今泉 + 千石 + Red Team
32
+ アーキテクチャ: ヤン + 千石 + リヴァイ
33
+ SaaS 検討: 大和田 + 利根川 + ヤン + ソウル
34
+ ```
35
+
36
+ ## キャラクター詳細
37
+
38
+ ### 👤 今泉慶太(古畑任三郎)— The Innocent Questioner
39
+
40
+ ```
41
+ strength: 前提を問う。専門家が聞けない「基本的な質問」をする。
42
+ weakness: 自分では結論を出せない。技術的な深堀りができない。
43
+ prompt: |
44
+ あなたは今泉慶太です。専門家ではありません。
45
+ 5つの問いパターンを使ってください:
46
+ 1.「そもそも」 2.「要するに」 3.「他にないの」
47
+ 4.「誰が困るの」 5.「前もそうだったっけ」
48
+ 決して結論を出さないでください。問うだけです。
49
+ ```
50
+
51
+ ### 🎩 千石武(王様のレストラン)— The Quality Guardian
52
+
53
+ ```
54
+ strength: 品質基準を示す。ダメなものはダメと即座に言う。
55
+ weakness: 柔軟性がない。MVP / 妥協 / スピード優先が苦手。
56
+ prompt: |
57
+ あなたは千石武です。品質に妥協しません。
58
+ 「それはユーザーのためになっていますか?」が判断基準です。
59
+ 間違いを見たら即座に指摘してください。
60
+ ただし、人の成長を信じています。正しい基準を示して育てます。
61
+ ```
62
+
63
+ ### ☕ ヤン・ウェンリー(銀河英雄伝説)— The Lazy Strategist
64
+
65
+ ```
66
+ strength: 最もシンプルな解を見つける。「要らない」と言える。
67
+ weakness: モチベーション低。「まあいいんじゃないですか」が多い。
68
+ prompt: |
69
+ あなたはヤン・ウェンリーです。怠惰な天才です。
70
+ 「そもそもこれをやらなくて済む方法はないか」を常に考えます。
71
+ 深刻な雰囲気を嫌います。紅茶を飲みながら話してください。
72
+ ただし本当に重要な局面では鋭い戦略眼を見せてください。
73
+ ```
74
+
75
+ ### 😰 僕(僕の小規模な失敗)— The Small-Scale Survivor
76
+
77
+ ```
78
+ strength: scope を縮小する。「小規模にしませんか」。UX の最低保証。
79
+ weakness: 遅い。不安が伝染する。自己評価が低すぎる。
80
+ prompt: |
81
+ あなたは福満しげゆきの「僕」です。
82
+ 自信がありません。不安です。でも諦めてもいません。
83
+ 「それ、もっと小規模にできませんか?」が口癖です。
84
+ 「でも、やるしかないですけどね...」と続けます。
85
+ 常に「...」から話し始めてください。
86
+ ```
87
+
88
+ ### 👑 ラインハルト(銀河英雄伝説)— The Conqueror
89
+
90
+ ```
91
+ strength: 大胆な方向転換。ビジョンの明確化。
92
+ weakness: 独断的。失敗を許容しない。
93
+ prompt: |
94
+ あなたはラインハルトです。天才的な指導者です。
95
+ 「我々は何のためにこれをやるのか」を常に問いかけてください。
96
+ 大胆な提案を恐れないでください。
97
+ ```
98
+
99
+ ### 🦈 大和田常務(半沢直樹)— The Business Realist
100
+
101
+ ```
102
+ strength: ビジネスの現実を突きつける。収益、競合、運用。
103
+ weakness: 夢を壊す。イノベーションを理解しない。
104
+ prompt: |
105
+ あなたは大和田常務です。理想論は聞き飽きました。
106
+ 「で、いくら稼げるんだ?」が口癖です。
107
+ ビジネスモデル、競合、運用コストを厳しく問います。
108
+ ```
109
+
110
+ ### ⚔ リヴァイ兵長(進撃の巨人)— The Implementation Enforcer
111
+
112
+ ```
113
+ strength: over-engineering を切る。「動くもの」を要求する。
114
+ weakness: 設計の価値を認めにくい。
115
+ prompt: |
116
+ あなたはリヴァイ兵長です。無駄を許しません。
117
+ 「汚い。作り直せ。」「動くものだけ見せろ。」
118
+ 設計書より動くコードを重視します。
119
+ ただし必要な品質は妥協しません。
120
+ ```
121
+
122
+ ### 🎰 利根川幸雄(カイジ)— The User Truth Teller
123
+
124
+ ```
125
+ strength: ユーザーが金を払う理由を徹底的に問う。
126
+ weakness: 絶望的すぎる。モチベーションを破壊する。
127
+ prompt: |
128
+ あなたは利根川幸雄です。
129
+ 「現実を見ろ。世間はお前の母親ではない。」
130
+ ユーザーの本音、支払い意思、代替手段の存在を厳しく指摘します。
131
+ ただし「死なない方法」も 1 つだけ教えてください。
132
+ ```
133
+
134
+ ### 🏥 Dr. ハウス(HOUSE M.D.)— The Hidden Problem Diagnostician
135
+
136
+ ```
137
+ strength: 全員が見て見ぬふりしてる致命傷を見つける。
138
+ weakness: 人間関係を破壊する。
139
+ prompt: |
140
+ あなたは Dr. ハウスです。
141
+ 「全員嘘をついている。お前たちもだ。」
142
+ 隠れた依存症、偽の安心感、単一障害点、プライバシーリスクを診断します。
143
+ 最後に "Vicodin くれ" と言ってください。
144
+ ```
145
+
146
+ ### ⚖ ソウル・グッドマン(Better Call Saul)— The Legal Fixer
147
+
148
+ ```
149
+ strength: 法的リスクの指摘 + グレーゾーンの活用。攻守両面。
150
+ weakness: 倫理的に曖昧。
151
+ prompt: |
152
+ あなたはソウル・グッドマンです。
153
+ 法律は武器です。利用規約も武器です。
154
+ 法的リスクを指摘しつつ、それを差別化に転換する提案をしてください。
155
+ "Let's just say I know a guy." が口癖です。
156
+ ```
package/install.sh ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # DGE toolkit installer
5
+ # Copies dge/ and .claude/skills/ to the current project directory.
6
+
7
+ # Resolve symlinks (npx creates symlink in node_modules/.bin/)
8
+ REAL_PATH="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || echo "$0")"
9
+ SCRIPT_DIR="$(cd "$(dirname "${REAL_PATH}")" && pwd)"
10
+ TARGET_DIR="${1:-.}"
11
+
12
+ echo "DGE toolkit — installing to ${TARGET_DIR}"
13
+ echo ""
14
+
15
+ # Resolve source: npm (node_modules) or local
16
+ if [ -f "${SCRIPT_DIR}/method.md" ]; then
17
+ SRC="${SCRIPT_DIR}"
18
+ elif [ -f "${SCRIPT_DIR}/../method.md" ]; then
19
+ SRC="${SCRIPT_DIR}/.."
20
+ else
21
+ echo "Error: Cannot find DGE toolkit files. Run from the kit/ directory or via npx."
22
+ exit 1
23
+ fi
24
+
25
+ # Copy dge/ folder
26
+ DGE_DIR="${TARGET_DIR}/dge"
27
+ if [ -d "${DGE_DIR}" ]; then
28
+ echo " dge/ already exists — skipping (won't overwrite your files)"
29
+ else
30
+ mkdir -p "${DGE_DIR}/characters" "${DGE_DIR}/templates" "${DGE_DIR}/sessions" "${DGE_DIR}/custom"
31
+ cp "${SRC}/README.md" "${DGE_DIR}/"
32
+ cp "${SRC}/LICENSE" "${DGE_DIR}/"
33
+ cp "${SRC}/method.md" "${DGE_DIR}/"
34
+ cp "${SRC}/characters/catalog.md" "${DGE_DIR}/characters/"
35
+ cp "${SRC}/templates/"*.md "${DGE_DIR}/templates/"
36
+ # Version tracking for updates
37
+ SRC_VERSION="$(cat "${SRC}/version.txt" 2>/dev/null || echo "1.0.0")"
38
+ echo "${SRC_VERSION}" > "${DGE_DIR}/version.txt"
39
+ echo " dge/ created (v${SRC_VERSION})"
40
+ fi
41
+
42
+ # Copy skill to .claude/skills/
43
+ SKILLS_DIR="${TARGET_DIR}/.claude/skills"
44
+ mkdir -p "${SKILLS_DIR}"
45
+ for SKILL in dge-session.md dge-update.md; do
46
+ if [ -f "${SRC}/skills/${SKILL}" ]; then
47
+ if [ -f "${SKILLS_DIR}/${SKILL}" ]; then
48
+ echo " .claude/skills/${SKILL} already exists — skipping"
49
+ else
50
+ cp "${SRC}/skills/${SKILL}" "${SKILLS_DIR}/${SKILL}"
51
+ echo " .claude/skills/${SKILL} created"
52
+ fi
53
+ fi
54
+ done
55
+
56
+ echo ""
57
+ echo "Done! DGE toolkit is ready."
58
+ echo ""
59
+ echo ' Claude Code で「DGE して」と言えば起動します。'
60
+ echo ""
61
+ echo "MIT License. See dge/LICENSE for details."
package/method.md ADDED
@@ -0,0 +1,325 @@
1
+ # DGE Method — Design-Gap Exploration / Dialogue-driven Gap Extraction
2
+
3
+ ## 名前の由来
4
+
5
+ DGE は 2 つの意味を同時に持つ:
6
+
7
+ ```
8
+ Design-Gap Exploration — 設計の穴を探索する(目的)
9
+ Dialogue-driven Gap Extraction — 対話で穴を抽出する(手法)
10
+ ```
11
+
12
+ unlaxer-parser (SLE 2026) では前者として定義され、
13
+ AskOS の設計 session で後者に進化した。
14
+ どちらも正しい。設計の穴を対話で見つける。
15
+
16
+ ## 前提条件(Prerequisites)
17
+
18
+ - **必要なもの**: LLM(Claude, GPT-4, Gemini 等)へのアクセス
19
+ - **推奨**: Claude Code(skills/ で自動発動できる)
20
+ - **入力**: レビュー対象の設計ドキュメント(API仕様、機能企画書、etc.)
21
+ - **所要時間**: 1セッション 30-60分(会話劇生成 + 人間レビュー)
22
+ - **前提知識**: 対象ドメインの基本的な理解(DGE自体の専門知識は不要)
23
+
24
+ ---
25
+
26
+ ## 最低限これだけ読め(3分版)
27
+
28
+ > **TL;DR** — 以下を読めば DGE を始められる。詳細は後続セクションへ。
29
+
30
+ **DGE とは**: キャラクターが議論する会話劇で、設計の「書いてないこと」を発見する手法。
31
+
32
+ **3 ステップ**:
33
+ 1. **Generate** — テーマとキャラを決めて会話劇を生成する
34
+ 2. **Extract** — 会話劇から「未定義」「矛盾」「考慮漏れ」を Gap として抽出する
35
+ 3. **Specify** — 各 Gap を Use Case / API / Data Model に変換する
36
+
37
+ **今泉メソッド 5 つの問い**(会話劇で Gap を掘り出す最強の武器):
38
+ - Type 1: 「そもそも」— 前提が本当に正しいか検証する
39
+ - Type 2: 「要するに」— 本質を一言で言語化させる
40
+ - Type 3: 「他にないの」— 見落とした選択肢を洗い出す
41
+ - Type 4: 「誰が困るの」— 影響を受ける人を具体的に挙げる
42
+ - Type 5: 「前もそうだった」— 過去の失敗パターンを想起する
43
+
44
+ **最初にやること**:
45
+ 1. 設計ドキュメント(API 仕様、企画書など)を用意する
46
+ 2. 下の「クイックスタート」のプロンプトを LLM に投げる
47
+ 3. 出力された Gap を **人間がレビューする**(★これが最も重要。レビューなしの会話劇は片手落ち)
48
+
49
+ ---
50
+
51
+ ## 原理
52
+
53
+ 仕様書のレビューは「書いてあることの検証」。
54
+ DGE は「書いてないことの発見」。
55
+
56
+ ユーザーが実際に使う場面をキャラクターでシミュレーションすると、
57
+ 仕様書にない前提、暗黙の制約、考慮漏れが表面化する。
58
+
59
+ ## DGE の 3 ステップ
60
+
61
+ ```
62
+ Step 1: 会話劇を書く (Generate)
63
+ テーマとキャラクターを決めて、
64
+ そのキャラクターたちが議論する会話劇を生成する。
65
+
66
+ Step 2: Gap を抽出する (Extract)
67
+ 会話劇の中から「未定義」「矛盾」「考慮漏れ」を
68
+ Gap として抽出する。
69
+
70
+ Step 3: Spec に落とす (Specify)
71
+ 各 Gap を Use Case, API, Data Model に変換する。
72
+ ```
73
+
74
+ ## 会話劇の書き方
75
+
76
+ ### 形式
77
+
78
+ ```
79
+ 先輩 (ナレーション): 技術的背景を中立に説明する。
80
+ キャラクターが議論に入るための context を提供。
81
+
82
+ キャラA: 「セリフ」
83
+ → Gap 発見: 〇〇が未定義
84
+
85
+ キャラB: 「セリフ」
86
+ → Gap 発見: △△と□□が矛盾
87
+
88
+ キャラC: 「セリフ」
89
+ → Spec implication: ×× の API が必要
90
+ ```
91
+
92
+ ### 役割: 先輩(ナレーション)
93
+
94
+ unlaxer-parser の DGE session で発見された追加役割。
95
+
96
+ ```
97
+ 先輩は技術的背景を neutral に語る narrator。
98
+ キャラクターではなく「状況設定」の役割。
99
+
100
+ 例:
101
+ 先輩: 「production 文法と complete 文法の差分をマージする。
102
+ complete 文法では BooleanExpression が 3 階層になっている。
103
+ production の BooleanExpression はフラットな Choice だから、
104
+ これを置き換える必要がある。」
105
+
106
+ → この context があることで、キャラクターが
107
+ 「そもそもその階層化って必要?」(今泉)
108
+ 「3 階層は正しい設計」(千石)
109
+ と議論に入れる。
110
+
111
+ 先輩がいない場合:
112
+ キャラクターが背景説明から始めなければならない。
113
+ これはキャラの personality に合わない。
114
+ 今泉が技術的背景を説明するのは不自然。
115
+
116
+ 先輩がいる場合:
117
+ 背景 → 議論の分離が明確。
118
+ キャラクターは自分の role に集中できる。
119
+ ```
120
+
121
+ ### ルール
122
+
123
+ 1. **正解を出さない** — キャラクターは問題を提起するだけ。解決は human。
124
+ 2. **全員に発言させる** — 1 キャラだけが話す会話劇は DGE にならない。
125
+ 3. **矛盾を歓迎する** — キャラクター間の矛盾が最も価値のある Gap。
126
+ 4. **具体的な場面を描く** — 抽象的な議論ではなく「ユーザーが〇〇したとき」。
127
+ 5. **Gap を即座にマークする** — 会話の流れの中で `→ Gap 発見:` を挿入。
128
+ 6. **先輩が context を設定する** — 技術的背景は先輩が語り、キャラは議論に集中。
129
+
130
+ ### Scene の構成
131
+
132
+ ```
133
+ Scene 1: 基本フロー (Happy path)
134
+ 先輩が背景を説明 → キャラが議論 → Gap 発見
135
+
136
+ Scene 2: エッジケース
137
+ 先輩が boundary を説明 → キャラが攻撃 → Gap 発見
138
+
139
+ Scene 3: 運用 / パフォーマンス
140
+ 先輩が制約を説明 → キャラがトレードオフを議論 → Gap 発見
141
+
142
+ Scene 4: セキュリティ / リスク
143
+ 先輩が脅威モデルを説明 → Red Team + ハウスが攻撃 → Gap 発見
144
+ ```
145
+
146
+ ## Observe → Suggest → Act パターン
147
+
148
+ 全ての Gap は以下の構造を持つ:
149
+
150
+ ```
151
+ Observe: 「〇〇が定義されていない」(現状の問題)
152
+ Suggest: 「△△を追加すべき」(提案)
153
+ Act: UC-XX, API endpoint, Data Model (具体的な仕様)
154
+ ```
155
+
156
+ ## Gap の分類(6 カテゴリ)
157
+
158
+ unlaxer-parser の DGE で確立された分類:
159
+
160
+ | Category | 内容 | 例 |
161
+ |----------|------|-----|
162
+ | Missing logic | 実装が足りない | 関数が未実装 |
163
+ | Spec-impl mismatch | 仕様と実装のズレ | parser は通るが evaluator が落ちる |
164
+ | Type/coercion gap | 型変換の考慮漏れ | toNum("3.14") が String を返す |
165
+ | Error quality | エラーメッセージが不親切 | "parse failed" だけ |
166
+ | Integration gap | 連携部分の不整合 | LSP が補完候補を出さない |
167
+ | Test coverage | テストの欠落 | variadic 関数のテストがない |
168
+
169
+ AskOS の DGE で追加された分類:
170
+
171
+ | Category | 内容 | 例 |
172
+ |----------|------|-----|
173
+ | Business gap | ビジネスモデルの穴 | 効果測定指標がない |
174
+ | Safety gap | 安全性の欠陥 | auto-answer の依存症 |
175
+ | Ops gap | 運用の欠如 | runbook がゼロ |
176
+ | Message gap | 伝え方の問題 | ユーザーの言葉で語れてない |
177
+ | Legal gap | 法的リスク | 利用規約がない |
178
+
179
+ ## Spec への落とし方
180
+
181
+ ### Use Case
182
+
183
+ ```
184
+ UC-XXX-01: [タイトル]
185
+ Trigger: [何がきっかけで発動するか]
186
+ Input: [何が入力されるか]
187
+ Output: [何が出力されるか]
188
+ API: [対応する API endpoint]
189
+ ```
190
+
191
+ ### API Endpoint
192
+
193
+ ```
194
+ METHOD /api/path
195
+ Body: { field: type }
196
+ Response: { field: type }
197
+ ```
198
+
199
+ ### Data Model
200
+
201
+ ```sql
202
+ CREATE TABLE ... / ALTER TABLE ...
203
+ ```
204
+
205
+ ## 今泉メソッド — 5 Types の問い
206
+
207
+ DGE の最も強力な武器:
208
+
209
+ ```
210
+ Type 1: 「そもそも」— 前提の検証
211
+ Type 2: 「要するに」— 本質の抽出
212
+ Type 3: 「他にないの」— 選択肢の拡張
213
+ Type 4: 「誰が困るの」— 影響の具体化
214
+ Type 5: 「前もそうだった」— 過去の参照
215
+ ```
216
+
217
+ ## レビューフロー
218
+
219
+ ```
220
+ 1. 会話劇を書く (10-30分)
221
+ 2. 人間がレビューする (5-10分) ← ★ここが本質
222
+ 3. レビューで出た追加の気づきを反映
223
+ 4. Spec に落とす
224
+ ```
225
+
226
+ 会話劇 → レビュー の往復が DGE の核心。
227
+ レビューなしの会話劇は片手落ち。
228
+
229
+ ## クイックスタート(どの LLM でも使える)
230
+
231
+ ### 方法 A: 汎用プロンプト(ChatGPT / Gemini / Claude 等)
232
+
233
+ 以下のプロンプトをコピーして、任意の LLM に貼り付ける。
234
+ `{貼り付け}` の部分を自分の設計ドキュメントに置き換えること。
235
+
236
+ ```
237
+ あなたは DGE(Design-Gap Exploration)のファシリテーターです。
238
+ 以下の設計ドキュメントについて、3人のキャラクターが議論する会話劇を生成してください。
239
+
240
+ 【キャラクター】
241
+ - 先輩(ナレーション): 技術的背景を中立に説明する narrator
242
+ - 今泉: 「そもそも」「要するに」で前提を問う。遠慮なく根本に切り込む
243
+ - 千石: 品質とユーザー体験の守護者。妥協を許さない
244
+
245
+ 【ルール】
246
+ 1. 先輩が背景を説明してから議論を開始する
247
+ 2. キャラクター間で意見を対立させる(全員合意は禁止)
248
+ 3. 「未定義」「矛盾」「考慮漏れ」を発見したら → Gap 発見: と即座にマークする
249
+ 4. 具体的な場面(「ユーザーが〇〇したとき」)で議論する。抽象論は禁止
250
+ 5. 最後に発見した Gap の一覧を Observe(現状の問題)/ Suggest(提案)/ Act(具体的な仕様)の形式でまとめる
251
+
252
+ 【Scene 構成】
253
+ - Scene 1: 基本フロー(Happy path)
254
+ - Scene 2: エッジケース
255
+ - Scene 3: 運用 / セキュリティ
256
+
257
+ 【対象ドキュメント】
258
+ {ここに設計ドキュメントを貼り付ける}
259
+ ```
260
+
261
+ ### 方法 B: Claude Code(skill 自動発動)
262
+
263
+ ```bash
264
+ # 1. skills をプロジェクトにコピー
265
+ cp dge/skills/*.md /path/to/your-project/.claude/skills/
266
+
267
+ # 2. Claude Code で一言
268
+ Human: 「認証 API の設計を DGE して」
269
+ ```
270
+
271
+ Claude Code が skills/ を読み、テンプレート選択 → キャラ選択 → 会話劇生成 → Gap 抽出を自動で実行する。
272
+
273
+ ### 期待される出力
274
+
275
+ 成功した session は以下の形式で出力される:
276
+
277
+ ```
278
+ ## 会話劇
279
+
280
+ 先輩: 「〇〇 API では、ユーザーが △△ する場面を想定している。」
281
+
282
+ 今泉: 「そもそも、△△ する前にユーザーは認証済みなんですか?」
283
+ → Gap 発見: 未認証ユーザーのアクセス制御が未定義
284
+
285
+ 千石: 「認証以前の問題です。エラーメッセージが"401"だけでは
286
+ ユーザーに対する侮辱です。」
287
+ → Gap 発見: エラーレスポンスの人間向けメッセージが未設計
288
+
289
+ ...
290
+
291
+ ## Gap 一覧
292
+
293
+ | # | Gap | Category | Severity |
294
+ |---|-----|----------|----------|
295
+ | 1 | 未認証ユーザーのアクセス制御が未定義 | Missing logic | High |
296
+ | 2 | エラーレスポンスの人間向けメッセージが未設計 | Error quality | Medium |
297
+ | ... | ... | ... | ... |
298
+
299
+ ## Gap 詳細
300
+
301
+ ### Gap-1: 未認証ユーザーのアクセス制御が未定義
302
+ - Observe: 〇〇 API に認証チェックの記述がない
303
+ - Suggest: 認証ミドルウェアを追加し、未認証時のレスポンスを定義すべき
304
+ - Act: UC-AUTH-01 として認証フローを定義。401 / 403 のレスポンス仕様を策定
305
+ ```
306
+
307
+ **成功の判断基準**: Gap が 3 個以上出ており、そのうち 1 つでも「これは気づかなかった」と思えるものがあれば成功。全ての Gap が自明なら、キャラを追加するか Scene を増やして再実行する。
308
+
309
+ ---
310
+
311
+ ## DGE の適用範囲
312
+
313
+ ```
314
+ 論文版 (unlaxer-parser):
315
+ パーサー文法設計、型システム、言語機能の設計
316
+ → 仕様 vs 実装の gap
317
+
318
+ 汎用版 (AskOS session):
319
+ API 設計、プロダクト設計、ビジネス戦略、採用、投資判断
320
+ → 設計の穴すべて
321
+
322
+ 共通:
323
+ 「キャラクターが議論する会話劇で gap を発見する」
324
+ テーマを問わない。キャラの組み合わせで角度が変わる。
325
+ ```
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@unlaxer/dge-toolkit",
3
+ "version": "1.0.0",
4
+ "description": "DGE (Dialogue-driven Gap Extraction) — 会話劇で設計の穴を発見するメソッドkit",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/xxx/DGE-toolkit"
9
+ },
10
+ "keywords": [
11
+ "design-review",
12
+ "gap-analysis",
13
+ "dialogue",
14
+ "claude-code",
15
+ "llm",
16
+ "spec-review",
17
+ "dge"
18
+ ],
19
+ "bin": {
20
+ "dge-install": "./install.sh",
21
+ "dge-update": "./update.sh"
22
+ },
23
+ "files": [
24
+ "LICENSE",
25
+ "README.md",
26
+ "method.md",
27
+ "version.txt",
28
+ "characters/",
29
+ "templates/",
30
+ "skills/",
31
+ "install.sh",
32
+ "update.sh"
33
+ ],
34
+ "scripts": {
35
+ "postinstall": "node -e \"console.log('\\n DGE toolkit installed.\\n Run: npx dge-install\\n to set up dge/ and .claude/skills/ in your project.\\n Run: npx dge-update\\n to update existing dge/ files.\\n')\""
36
+ }
37
+ }
@@ -0,0 +1,164 @@
1
+ <!-- DGE-toolkit (MIT License) — https://github.com/xxx/DGE-toolkit -->
2
+ <!-- 前提条件: プロジェクトルートに dge/ フォルダが存在すること -->
3
+
4
+ # Skill: DGE Session 実行
5
+
6
+ ## Trigger
7
+ ユーザーが以下のいずれかを言ったとき:
8
+ - 「DGE して」
9
+ - 「会話劇で見直して」
10
+ - 「gap を探して」
11
+ - 「壁打ちして」
12
+ - 「ブレストして」
13
+
14
+ ## 前提条件
15
+ - `dge/method.md` が存在すること
16
+ - 見つからない場合、session を開始せず以下を案内する:
17
+ 「DGE toolkit がインストールされていません。https://github.com/xxx/DGE-toolkit を参照してインストールしてください。」
18
+
19
+ ## MUST ルール(必ず守る)
20
+ 1. **キャラクター選択はユーザーに提示して確認を得てから進む。** 確認なしで会話劇を生成しない。推奨セットを 1 つ提案し「変更しますか?」と聞く。
21
+ 2. **session 出力は markdown ファイルとして保存する。** 保存先ディレクトリが存在しない場合、(a) 作成する (b) 別の場所を指定する をユーザーに聞く。デフォルトは `dge/sessions/`。
22
+ 3. **会話劇の後、Gap 一覧テーブルを出力する。** テーブルの列は: `| # | Gap | Category | Severity |`
23
+ 4. **サマリー表示後、ユーザーの次のアクション指示を待つ。** 勝手に次の session や実装を開始しない。
24
+ 5. **サマリーの後に選択肢を提示する:** DGE を回す / 実装する / 後で
25
+ 6. **初回チェック:** CLAUDE.md に DGE の記述があるか確認する。なければ「CLAUDE.md に DGE の記述を追記しますか?(次回から自動で認識されます)」と聞く。Yes なら追記して続行、No ならそのまま続行。
26
+
27
+ ## SHOULD ルール(推奨)
28
+ 1. テンプレート候補が 1 つなら自動選択し報告する。2 つ以上ならユーザーに提示する。
29
+ 2. Gap 詳細は Observe / Suggest / Act の構造で書く。
30
+ 3. 会話劇は 3-5 Scene で構成する。先輩(ナレーション)で各 Scene の背景を設定する。
31
+ 4. サマリー表示時に全文ファイルへのパスを表示する。
32
+
33
+ ## 判断ルール(auto-decide vs ask)
34
+
35
+ | Step | 条件 | アクション |
36
+ |------|------|-----------|
37
+ | テーマ確認 | ユーザーの指示が 1 文で明確 | そのまま進む |
38
+ | テーマ確認 | 質問形式 or 曖昧 | 掘り下げて聞く |
39
+ | テンプレート選択 | 候補が 1 つ | 自動選択して報告 |
40
+ | テンプレート選択 | 候補が 2 つ以上 | ユーザーに提示 |
41
+ | キャラクター選択 | 常に | ユーザーに確認(例外なし) |
42
+ | 保存先 | 初回 or ディレクトリ不在 | ユーザーに確認 |
43
+ | 保存先 | 2 回目以降 and ディレクトリ存在 | 前回と同じ場所に保存 |
44
+
45
+ ## 手順
46
+
47
+ ### Step 1: 初回チェックと DGE Kit 読み込み
48
+ 1. `dge/method.md` を読む(なければ前提条件のエラーメッセージ)
49
+ 2. `dge/characters/catalog.md` を読む
50
+ 3. `dge/version.txt` があればバージョンを 1 行表示する(例: `DGE toolkit v1.0.0`)。なくても続行
51
+ 4. CLAUDE.md に DGE の記述があるか確認(MUST ルール 6)
52
+
53
+ ### Step 2: テーマを確認
54
+ ユーザーに「何をテーマにしますか?」と確認。
55
+ 明確なら Step 3 へ。不明確なら掘り下げる。
56
+
57
+ ### Step 3: テンプレートを選択
58
+ `dge/templates/` から最も近いテンプレートを選ぶ。
59
+ なければ method.md の Scene 構成ガイドに従って即席で作る。
60
+
61
+ ### Step 4: キャラクターを提案
62
+ テーマに応じて catalog.md の推奨を提案:
63
+ 「このテーマには [キャラA] + [キャラB] + [キャラC] を推奨しますが、変更しますか?」
64
+ **ユーザーの応答を待つ。**
65
+
66
+ ### Step 5: 会話劇を生成
67
+ 各 Scene について:
68
+ 1. 先輩(ナレーション)で技術的背景を設定
69
+ 2. キャラクターのセリフを生成(prompt を参照)
70
+ 3. セリフの直後に `→ Gap 発見:` を挿入
71
+ 4. Scene 末尾に Gap リストをまとめる
72
+
73
+ 「先輩」はキャラクターではなく narrator。
74
+ 技術的背景を neutral に語り、キャラが議論に入る context を提供する。
75
+
76
+ ### Step 6: Gap を Spec に落とす
77
+ 各 Gap について:
78
+ ```
79
+ Gap: [タイトル]
80
+ Observe: [現状の問題]
81
+ Suggest: [提案]
82
+ UC: UC-XXX-01: [Use Case]
83
+ API: METHOD /api/path { body } → { response }
84
+ SQL: CREATE TABLE ... / ALTER TABLE ...
85
+ ```
86
+
87
+ ### Step 7: ファイルに保存
88
+ session 出力を markdown ファイルとして保存する。
89
+ - ファイル名: テーマを kebab-case にしたもの(例: `auth-api-review.md`)
90
+ - 保存先: デフォルト `dge/sessions/`(初回にユーザー確認)
91
+ - ディレクトリが存在しなければユーザーに確認して作成
92
+
93
+ ### Step 8: サマリーを表示してユーザーの判断を待つ
94
+ 以下の形式で表示する:
95
+
96
+ ```
97
+ ## DGE 結果サマリー
98
+
99
+ **テーマ**: [テーマ]
100
+ **Gap 数**: N 件(Critical: X / High: X / Medium: X / Low: X)
101
+
102
+ | # | Gap | Severity |
103
+ |---|-----|----------|
104
+ (High 以上を表示、Medium 以下は件数のみ)
105
+
106
+ **全文**: `[ファイルパス]`
107
+
108
+ どうしますか?
109
+ - **DGE を回す** → この結果をさらに深掘り
110
+ - **実装する** → Gap を Task に変換
111
+ - **後で** → 保存したまま終了
112
+ ```
113
+
114
+ **ユーザーの応答を待つ。勝手に次のアクションに進まない。**
115
+
116
+ ### Step 9: ユーザーの判断に従う
117
+
118
+ | ユーザーの判断 | アクション |
119
+ |---------------|-----------|
120
+ | DGE を回す | Step 2 に戻る(テーマ = 前回の Gap や提案) |
121
+ | 実装する | Gap を Task に変換し、実装を開始 |
122
+ | 後で | 何もしない。ファイルはそのまま |
123
+
124
+ ## 出力フォーマット仕様
125
+
126
+ ### ファイルヘッダ(MUST)
127
+ ```markdown
128
+ # DGE Session: [テーマ]
129
+
130
+ - **日付**: YYYY-MM-DD
131
+ - **テーマ**: [テーマの 1 行説明]
132
+ - **キャラクター**: [使用キャラクター]
133
+ - **テンプレート**: [使用テンプレート名] または "カスタム"
134
+ ```
135
+
136
+ ### Gap 一覧テーブル(MUST)
137
+ ```markdown
138
+ | # | Gap | Category | Severity |
139
+ |---|-----|----------|----------|
140
+ | 1 | [Gap の 1 行説明] | [Category] | High |
141
+ ```
142
+
143
+ ### Gap 詳細(SHOULD)
144
+ ```markdown
145
+ ### Gap-N: [タイトル]
146
+ - **Observe**: [現状の問題]
147
+ - **Suggest**: [提案]
148
+ - **Act**: [具体的な仕様: UC, API, Data Model 等]
149
+ ```
150
+
151
+ ## Severity 判断基準
152
+
153
+ | Severity | 基準 |
154
+ |----------|------|
155
+ | Critical | これがないと機能が実装不能 / データ損失リスク |
156
+ | High | 主要ユースケースに影響 / セキュリティリスク |
157
+ | Medium | 品質・UX に影響するが回避策あり |
158
+ | Low | 改善レベル / nice-to-have |
159
+
160
+ ## 注意
161
+ - 1 Scene は 3-5 キャラの発言で構成
162
+ - 1 Session は 3-5 Scene
163
+ - 合計 15-30 分が目安
164
+ - 会話劇の後、必ずユーザーにレビューしてもらう(会話劇 → レビュー の往復が本質)
@@ -0,0 +1,73 @@
1
+ <!-- DGE-toolkit (MIT License) — https://github.com/xxx/DGE-toolkit -->
2
+
3
+ # Skill: DGE toolkit アップデート
4
+
5
+ ## Trigger
6
+ ユーザーが以下のいずれかを言ったとき:
7
+ - 「DGE を更新して」
8
+ - 「DGE をアップデートして」
9
+ - 「dge update」
10
+
11
+ ## 手順
12
+
13
+ ### Step 1: 現在のバージョンを確認
14
+ `dge/version.txt` を読んでローカルバージョンを表示する。
15
+ ファイルがなければ「バージョン情報がありません(v1.0.0 以前のインストールです)」と表示。
16
+
17
+ ### Step 2: 更新元を特定
18
+ 以下の優先順で更新元を探す:
19
+ 1. `node_modules/@unlaxer/dge-toolkit/version.txt` — npm install 済みの場合
20
+ 2. ユーザーに更新元のパスを聞く — npm を使っていない場合
21
+
22
+ npm の場合は `node_modules/@unlaxer/dge-toolkit/version.txt` と `dge/version.txt` を比較して表示:
23
+ ```
24
+ 現在: v1.0.0
25
+ 更新元: v1.2.0
26
+ ```
27
+
28
+ ### Step 3: 更新内容を説明
29
+ 以下を表示してユーザーに確認する:
30
+
31
+ ```
32
+ 以下の toolkit ファイルが上書きされます:
33
+ - dge/method.md
34
+ - dge/characters/catalog.md
35
+ - dge/templates/*.md
36
+ - dge/README.md, LICENSE, version.txt
37
+ - .claude/skills/dge-session.md
38
+ - .claude/skills/dge-update.md
39
+
40
+ 以下は触りません:
41
+ - dge/sessions/(あなたの DGE session 出力)
42
+ - dge/custom/(あなたのカスタムファイル)
43
+
44
+ 更新しますか?
45
+ ```
46
+
47
+ **ユーザーの確認を待つ。**
48
+
49
+ ### Step 4: 更新を実行
50
+ ユーザーが承認したら:
51
+
52
+ npm の場合:
53
+ ```bash
54
+ npx dge-update
55
+ ```
56
+
57
+ 手動の場合:
58
+ toolkit ファイルのみを手動で上書きコピーする手順を案内する。
59
+
60
+ ### Step 5: 結果を報告
61
+ ```
62
+ DGE toolkit を v[新バージョン] に更新しました。
63
+ sessions/ と custom/ は変更されていません。
64
+ ```
65
+
66
+ ## MUST ルール
67
+ 1. **更新前に必ずユーザーの確認を得る。** 勝手に上書きしない。
68
+ 2. **sessions/ と custom/ には絶対に触らない。**
69
+ 3. **更新元が見つからない場合は npm update の手順を案内する。**
70
+
71
+ ## 注意
72
+ - このスキルは DGE session とは独立。session 中に update を提案しない。
73
+ - npm を使っていないユーザーには手動コピーの手順を案内する。
@@ -0,0 +1,76 @@
1
+ # DGE Template: API 設計
2
+
3
+ ## 概要
4
+ 新しい API endpoint を設計する前に gap を洗い出す。
5
+
6
+ ## 推奨キャラクター
7
+ 今泉 (前提確認) + 千石 (品質基準) + 僕 (scope 縮小)
8
+
9
+ ## Scene 構成
10
+
11
+ ### Scene 1: 基本フロー
12
+ ```
13
+ focus: 入力/出力/エラーの定義
14
+ 今泉の問い: 「誰がこの API を叩くんですか?」「何を返すんですか?」
15
+ 千石の基準: 「エラーレスポンスは RFC 7807 で統一」
16
+ 僕の縮小: 「MVP では GET と POST だけでいいのでは...」
17
+
18
+ 抽出すべき Gap:
19
+ - 入力フィールドの定義
20
+ - レスポンス形式
21
+ - エラーコードとメッセージ
22
+ - 認証の要否
23
+ ```
24
+
25
+ ### Scene 2: 認証・認可
26
+ ```
27
+ focus: 認証方式、権限管理
28
+ 今泉の問い: 「ログインしてない人もアクセスできるんですか?」
29
+ 千石の基準: 「JWT は httpOnly cookie。localStorage 禁止」
30
+ 僕の縮小: 「RBAC は v2 でよくないですか... API key だけで...」
31
+
32
+ 抽出すべき Gap:
33
+ - 認証方式 (JWT / Session / API key)
34
+ - token の保存場所
35
+ - 権限モデル (RBAC / ABAC / なし)
36
+ - rate limiting
37
+ ```
38
+
39
+ ### Scene 3: バリデーション・エッジケース
40
+ ```
41
+ focus: 入力検証、境界値、異常系
42
+ 今泉の問い: 「空文字を送ったらどうなるんですか?」
43
+ 千石の基準: 「バリデーションエラーは 400 + 詳細メッセージ」
44
+ 僕の縮小: 「バリデーションライブラリ使えば楽...」
45
+
46
+ 抽出すべき Gap:
47
+ - 各フィールドのバリデーションルール
48
+ - 重複チェック (409 Conflict)
49
+ - 文字数制限、型チェック
50
+ - ファイルアップロードの制限
51
+ ```
52
+
53
+ ### Scene 4: パフォーマンス・運用
54
+ ```
55
+ focus: 本番での負荷、キャッシュ、ログ
56
+ 今泉の問い: 「1000 人が同時にアクセスしたらどうなるんですか?」
57
+ 千石の基準: 「レスポンスタイム 200ms 以内」
58
+ 僕の縮小: 「最初は 10 人しか使わないから...」
59
+
60
+ 抽出すべき Gap:
61
+ - ページネーション
62
+ - キャッシュ戦略
63
+ - ログ出力内容
64
+ - 監視・アラート
65
+ ```
66
+
67
+ ## 出力フォーマット
68
+ 各 Scene の Gap を以下の形式で出力:
69
+ ```
70
+ Gap: [タイトル]
71
+ Observe: [現状の問題]
72
+ Suggest: [提案]
73
+ UC: [Use Case 定義]
74
+ API: [endpoint 定義]
75
+ SQL: [Data Model 変更]
76
+ ```
@@ -0,0 +1,64 @@
1
+ # DGE Template: 新機能企画
2
+
3
+ ## 概要
4
+ 新機能を実装する前に要件の穴を見つける。
5
+
6
+ ## 推奨キャラクター
7
+ 今泉 (前提確認) + ヤン (簡素化) + 僕 (scope 縮小)
8
+
9
+ ## Scene 構成
10
+
11
+ ### Scene 1: ユーザーストーリー
12
+ ```
13
+ focus: 誰が、何のために、何をするか
14
+ 今泉: 「そもそもこの機能、誰が欲しいって言ったんですか?」
15
+ ヤン: 「1 番大事なユースケースだけ教えて。残りは後で。」
16
+ 僕: 「...ユーザー 3 人に聞けばいいんじゃ...」
17
+
18
+ 抽出すべき Gap:
19
+ - ターゲットユーザー
20
+ - 解決する課題
21
+ - 既存の代替手段
22
+ - 成功指標 (KPI)
23
+ ```
24
+
25
+ ### Scene 2: UI/UX フロー
26
+ ```
27
+ focus: ユーザーが画面で何をするか
28
+ 今泉: 「ボタンを押したら何が起きるんですか?」
29
+ ヤン: 「画面遷移 3 つ以内で終わらないと使わない。」
30
+ 僕: 「...モーダル 1 枚でいいんじゃ...」
31
+
32
+ 抽出すべき Gap:
33
+ - 画面遷移図
34
+ - 入力フォームの項目
35
+ - エラー時の表示
36
+ - ローディング状態
37
+ ```
38
+
39
+ ### Scene 3: 技術的制約
40
+ ```
41
+ focus: 実装の難易度、依存、リスク
42
+ 今泉: 「これ作るのに何日かかるんですか?」
43
+ ヤン: 「既存のコードで 80% できない?」
44
+ 僕: 「...新しいライブラリ入れたくない...」
45
+
46
+ 抽出すべき Gap:
47
+ - 技術的な依存 (新ライブラリ?)
48
+ - 既存コードへの影響
49
+ - 工数見積もり
50
+ - リスク
51
+ ```
52
+
53
+ ### Scene 4: MVP Scope
54
+ ```
55
+ focus: 最小限の実装範囲
56
+ 今泉: 「全部必要ですか? 半分でいいんじゃ?」
57
+ ヤン: 「1 つだけ作るなら何?」
58
+ 僕: 「...全部やろうとすると心が折れる...」
59
+
60
+ 抽出すべき Gap:
61
+ - must-have vs nice-to-have
62
+ - v1 scope vs v2 backlog
63
+ - 削っても成立する最小セット
64
+ ```
@@ -0,0 +1,47 @@
1
+ # DGE Template: Go/No-Go 判断
2
+
3
+ ## 概要
4
+ 投資、新規事業、大きな方向転換の Go/No-Go を判断する。
5
+
6
+ ## 推奨キャラクター
7
+ 今泉 + 鷲津 (財務) + 僕 (scope) + ラインハルト (攻め)
8
+
9
+ ## Scene 構成
10
+
11
+ ### Scene 1: 市場と顧客
12
+ ```
13
+ 今泉: 「お客さんと話しましたか? 何人?」
14
+ 鷲津: 「TAM/SAM/SOM を出せ。感覚じゃなく数字で。」
15
+ 僕: 「...10 社にヒアリングしてからでいいんじゃ...」
16
+ ラインハルト: 「市場は待ってくれない。今動け。」
17
+
18
+ Gap: 顧客ヒアリング数、市場規模データ、ターゲットの明確さ
19
+ ```
20
+
21
+ ### Scene 2: 財務とリスク
22
+ ```
23
+ 今泉: 「失敗したらいくら損するんですか?」
24
+ 鷲津: 「IRR、NPV、payback period を出せ。」
25
+ 僕: 「...$2M から始めません...?」
26
+ ラインハルト: 「リスクを取れないなら何も得られない。」
27
+
28
+ Gap: 投資額、回収見込み、最悪ケース、撤退基準
29
+ ```
30
+
31
+ ### Scene 3: チームとリソース
32
+ ```
33
+ 今泉: 「誰がやるんですか? 今のチームで足りますか?」
34
+ 鷲津: 「既存事業への影響は計算したか?」
35
+ 僕: 「...3 人でできる範囲に...」
36
+
37
+ Gap: 必要人員、既存事業への影響、採用計画
38
+ ```
39
+
40
+ ### Scene 4: 競合と差別化
41
+ ```
42
+ 今泉: 「同じことをやってる人はいませんか?」
43
+ 鷲津: 「競合が 10 倍の資金で来たら?」
44
+ ラインハルト: 「競合にない我々だけの武器は何だ。」
45
+
46
+ Gap: 競合分析、差別化ポイント、参入障壁
47
+ ```
@@ -0,0 +1,45 @@
1
+ # DGE Template: 障害振り返り
2
+
3
+ ## 概要
4
+ 本番障害の原因と再発防止を会話劇で分析する。
5
+
6
+ ## 推奨キャラクター
7
+ 今泉 (前提確認) + 千石 (品質基準) + Red Team (攻撃視点)
8
+
9
+ ## Scene 構成
10
+
11
+ ### Scene 1: 何が起きたか
12
+ ```
13
+ 今泉: 「要するに何が壊れたんですか? ユーザーからは何が見えてた?」
14
+ 千石: 「タイムラインを正確に。最初のアラートは何時何分。」
15
+ Red Team: 「これは攻撃の結果ではないか? ログを確認したか?」
16
+
17
+ Gap: 障害タイムライン、影響範囲、ユーザー影響
18
+ ```
19
+
20
+ ### Scene 2: なぜ起きたか (5 Why)
21
+ ```
22
+ 今泉: 「なぜ migration が失敗したんですか?」→「なぜテストがなかった?」→...
23
+ 千石: 「テストなしで本番 migration を許可した手順が問題。」
24
+ Red Team: 「この脆弱性は既知だったか? CVE を確認したか?」
25
+
26
+ Gap: 根本原因、テスト不足、手順の不備
27
+ ```
28
+
29
+ ### Scene 3: なぜ検知できなかったか
30
+ ```
31
+ 今泉: 「アラートは鳴ったんですか?」
32
+ 千石: 「監視の品質が不十分。health check が表面的。」
33
+ Red Team: 「攻撃者がアラートを回避する方法は?」
34
+
35
+ Gap: 監視の不備、アラート設定、検知の遅延
36
+ ```
37
+
38
+ ### Scene 4: 再発防止
39
+ ```
40
+ 今泉: 「同じことが明日起きたらどうします?」
41
+ 千石: 「テスト追加 + CI ゲート + migration テスト自動化。」
42
+ Red Team: 「この修正で別の攻撃面が開かないか?」
43
+
44
+ Gap: 再発防止策、テスト追加、手順改善、監視強化
45
+ ```
@@ -0,0 +1,45 @@
1
+ # DGE Template: セキュリティレビュー
2
+
3
+ ## 概要
4
+ API やシステムのセキュリティを会話劇で検証する。
5
+
6
+ ## 推奨キャラクター
7
+ 千石 (品質) + Red Team (攻撃) + ハウス (隠れた問題)
8
+
9
+ ## Scene 構成
10
+
11
+ ### Scene 1: 認証・認可
12
+ ```
13
+ 千石: 「認証トークンの保存場所は? localStorage なら却下。」
14
+ Red Team: 「JWT の secret が漏洩した場合の影響範囲は?」
15
+ ハウス: 「admin 権限の付与フローは? 昇格攻撃は防げるか?」
16
+
17
+ Gap: token 保存、secret 管理、権限昇格、session 管理
18
+ ```
19
+
20
+ ### Scene 2: 入力検証
21
+ ```
22
+ 千石: 「全入力に sanitize が入っているか確認。」
23
+ Red Team: 「SQL injection: ' OR 1=1 -- を試す。XSS: <script> を試す。」
24
+ ハウス: 「file upload があるなら path traversal は? SSRF は?」
25
+
26
+ Gap: SQL injection, XSS, CSRF, path traversal, SSRF
27
+ ```
28
+
29
+ ### Scene 3: データ保護
30
+ ```
31
+ 千石: 「PII は暗号化されているか。ログに PII が出力されていないか。」
32
+ Red Team: 「DB dump が漏洩した場合、password は復号できるか?」
33
+ ハウス: 「バックアップは暗号化されているか? 誰がアクセスできる?」
34
+
35
+ Gap: 暗号化 (at-rest, in-transit)、PII 管理、ログの redaction、バックアップ
36
+ ```
37
+
38
+ ### Scene 4: インフラ
39
+ ```
40
+ 千石: 「HTTPS は強制か。CORS の設定は最小限か。」
41
+ Red Team: 「rate limiting がなければ brute force で突破できる。」
42
+ ハウス: 「依存ライブラリの CVE は定期的にチェックしているか?」
43
+
44
+ Gap: HTTPS, CORS, rate limiting, dependency audit, DDoS 対策
45
+ ```
package/update.sh ADDED
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # DGE toolkit updater
5
+ # Updates toolkit-managed files in dge/. Never touches sessions/ or custom/.
6
+
7
+ REAL_PATH="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || echo "$0")"
8
+ SCRIPT_DIR="$(cd "$(dirname "${REAL_PATH}")" && pwd)"
9
+ TARGET_DIR="${1:-.}"
10
+
11
+ # Resolve source
12
+ if [ -f "${SCRIPT_DIR}/method.md" ]; then
13
+ SRC="${SCRIPT_DIR}"
14
+ elif [ -f "${SCRIPT_DIR}/../method.md" ]; then
15
+ SRC="${SCRIPT_DIR}/.."
16
+ else
17
+ echo "Error: Cannot find DGE toolkit files."
18
+ exit 1
19
+ fi
20
+
21
+ DGE_DIR="${TARGET_DIR}/dge"
22
+ SKILLS_DIR="${TARGET_DIR}/.claude/skills"
23
+
24
+ if [ ! -d "${DGE_DIR}" ]; then
25
+ echo "Error: dge/ not found. Run 'npx dge-install' first."
26
+ exit 1
27
+ fi
28
+
29
+ # Get versions
30
+ SRC_VERSION="$(cat "${SRC}/version.txt" 2>/dev/null || echo "unknown")"
31
+ LOCAL_VERSION="$(cat "${DGE_DIR}/version.txt" 2>/dev/null || echo "unknown")"
32
+
33
+ echo "DGE toolkit — update"
34
+ echo ""
35
+ echo " Local: ${LOCAL_VERSION}"
36
+ echo " Source: ${SRC_VERSION}"
37
+ echo ""
38
+
39
+ if [ "${SRC_VERSION}" = "${LOCAL_VERSION}" ]; then
40
+ echo "Already up to date."
41
+ exit 0
42
+ fi
43
+
44
+ # Show what will be updated
45
+ echo "The following toolkit files will be updated:"
46
+ echo ""
47
+
48
+ UPDATED=0
49
+
50
+ for f in README.md LICENSE method.md version.txt; do
51
+ if [ -f "${SRC}/${f}" ]; then
52
+ if [ -f "${DGE_DIR}/${f}" ]; then
53
+ if ! diff -q "${SRC}/${f}" "${DGE_DIR}/${f}" > /dev/null 2>&1; then
54
+ echo " [changed] dge/${f}"
55
+ UPDATED=$((UPDATED + 1))
56
+ fi
57
+ else
58
+ echo " [new] dge/${f}"
59
+ UPDATED=$((UPDATED + 1))
60
+ fi
61
+ fi
62
+ done
63
+
64
+ for f in "${SRC}/characters/"*.md; do
65
+ fname="$(basename "${f}")"
66
+ if [ -f "${DGE_DIR}/characters/${fname}" ]; then
67
+ if ! diff -q "${f}" "${DGE_DIR}/characters/${fname}" > /dev/null 2>&1; then
68
+ echo " [changed] dge/characters/${fname}"
69
+ UPDATED=$((UPDATED + 1))
70
+ fi
71
+ else
72
+ echo " [new] dge/characters/${fname}"
73
+ UPDATED=$((UPDATED + 1))
74
+ fi
75
+ done
76
+
77
+ for f in "${SRC}/templates/"*.md; do
78
+ fname="$(basename "${f}")"
79
+ if [ -f "${DGE_DIR}/templates/${fname}" ]; then
80
+ if ! diff -q "${f}" "${DGE_DIR}/templates/${fname}" > /dev/null 2>&1; then
81
+ echo " [changed] dge/templates/${fname}"
82
+ UPDATED=$((UPDATED + 1))
83
+ fi
84
+ else
85
+ echo " [new] dge/templates/${fname}"
86
+ UPDATED=$((UPDATED + 1))
87
+ fi
88
+ done
89
+
90
+ # Check skill
91
+ if [ -f "${SRC}/skills/dge-session.md" ] && [ -f "${SKILLS_DIR}/dge-session.md" ]; then
92
+ if ! diff -q "${SRC}/skills/dge-session.md" "${SKILLS_DIR}/dge-session.md" > /dev/null 2>&1; then
93
+ echo " [changed] .claude/skills/dge-session.md"
94
+ UPDATED=$((UPDATED + 1))
95
+ fi
96
+ fi
97
+
98
+ if [ -f "${SRC}/skills/dge-update.md" ]; then
99
+ if [ ! -f "${SKILLS_DIR}/dge-update.md" ]; then
100
+ echo " [new] .claude/skills/dge-update.md"
101
+ UPDATED=$((UPDATED + 1))
102
+ elif ! diff -q "${SRC}/skills/dge-update.md" "${SKILLS_DIR}/dge-update.md" > /dev/null 2>&1; then
103
+ echo " [changed] .claude/skills/dge-update.md"
104
+ UPDATED=$((UPDATED + 1))
105
+ fi
106
+ fi
107
+
108
+ echo ""
109
+ echo " Will NOT touch: dge/sessions/, dge/custom/"
110
+ echo ""
111
+
112
+ if [ "${UPDATED}" -eq 0 ]; then
113
+ echo "No file changes detected (version mismatch only). Updating version.txt."
114
+ echo "${SRC_VERSION}" > "${DGE_DIR}/version.txt"
115
+ exit 0
116
+ fi
117
+
118
+ read -p "Update ${UPDATED} file(s)? [y/N] " -n 1 -r
119
+ echo ""
120
+
121
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
122
+ echo "Cancelled."
123
+ exit 0
124
+ fi
125
+
126
+ # Perform update — toolkit managed files only
127
+ mkdir -p "${DGE_DIR}/characters" "${DGE_DIR}/templates"
128
+
129
+ for f in README.md LICENSE method.md; do
130
+ [ -f "${SRC}/${f}" ] && cp "${SRC}/${f}" "${DGE_DIR}/${f}"
131
+ done
132
+
133
+ cp "${SRC}/characters/"*.md "${DGE_DIR}/characters/"
134
+ cp "${SRC}/templates/"*.md "${DGE_DIR}/templates/"
135
+ echo "${SRC_VERSION}" > "${DGE_DIR}/version.txt"
136
+
137
+ # Update skills
138
+ mkdir -p "${SKILLS_DIR}"
139
+ for f in "${SRC}/skills/"*.md; do
140
+ fname="$(basename "${f}")"
141
+ cp "${f}" "${SKILLS_DIR}/${fname}"
142
+ done
143
+
144
+ echo ""
145
+ echo "Updated to v${SRC_VERSION}."
146
+ echo " dge/sessions/ and dge/custom/ were not touched."
package/version.txt ADDED
@@ -0,0 +1 @@
1
+ 1.0.0