# Theme System

> テーマ層の編集時やスプライト・メッセージカスタマイズ時に使用。ヤドンの見た目や吹き出しメッセージを変更する際に参照。

- Skill: `yida29/theme-system` (Agent Skill)
- Install (CLI): `npx skillmds add yida29/theme-system`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yida29/theme-system/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: yida29 (https://skillmd.com/u/yida29)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/yida29/theme-system

---


# テーマシステム・スキル

テーマ層（`themes/yadon/`）はヤドン・エージェントのビジュアル・テキスト表現を一元管理するシステム。このスキルはテーマのカスタマイズやスプライト・メッセージの編集時に参照する。

## 概要

`themes/yadon/__init__.py` は全エージェント（ヤドキング・ヤドラン・ヤドン）のビジュアル・テキスト表現を一元管理する `ThemeConfig` frozen dataclass である。

**コンセプト:**
- **素朴であたたかい世界観** — ポケモンの原点（ゲーム初代の素朴さ、昭和レトロ）に立ち返った温もり
- **ひらがな中心の柔らかい言葉** — 敬語・硬い表現を避け、ひらがなで親しみやすさを強調
- **「...」削減** — 間延びした印象を避けるため、吹き出しテンプレートから「...」ラッパーを削減。例：`...やるやぁん...「{summary}」` → ワーカーメッセージが直接「やるやぁん」として表現
- **個性の6層構成** — ヤドン1〜4 + マネージャー（ヤドラン） + ランダムメッセージで多様な表現

## ヤドン1〜4の個性設定

### 特性表

| ヤドン | 特徴 | 語尾 | task メッセージ例 | スプライト色 |
|------|------|------|------|----------|
| **ヤドン1** | 素直で元気 | 「やぁん」 | task: 「やるやぁん」<br/>success: 「できたやぁん」<br/>error: 「ごめんなさい」<br/>random: 「まかせて」「ぴょこぴょこ」 | 黄色（通常）/ ピンク（Shiny） |
| **ヤドン2** | ねむてて怠い | 「ふぁぁ」 | task: 「ふぁぁ やるね」<br/>success: 「やったー」<br/>error: 「ねむい」<br/>random: 「zzz」「ふぁあぁ」 | 黄色（通常）/ ピンク（Shiny） |
| **ヤドン3** | 食いしん坊 | なし（素） | task: 「おなかすいたけど やる」<br/>success: 「ごはん たべよう」<br/>error: 「おなか いたい」<br/>random: 「ぷくぷく」「もぐもぐ」 | 黄色（通常）/ ゴールド（Galarian） |
| **ヤドン4** | 明るく優しい | 「えへへ」 | task: 「えへへ やろう」<br/>success: 「えへへ できた」<br/>error: 「がんばろう」<br/>random: 「たのしいね」「ぴょこぴょこ」 | 黄色（通常）/ オレンジ（Galarian Shiny） |

## worker_messages の構造

各ヤドン1〜4は以下の4つのカテゴリ別にメッセージを持つ：

```python
worker_messages = {
    "yadon-1": {
        "task": ["やるやぁん", "まかせて", "やりますぅ"],
        "success": ["できたやぁん", "おわった", "せいこう"],
        "error": ["ごめんなさい", "うーん", "またやってみる"],
        "random": ["ぴょこぴょこ", "えへへ", "のんびりいきましょう"]
    },
    "yadon-2": {
        "task": ["ふぁぁ やるね", "ねむいけど", "まかせて"],
        "success": ["やったー", "おわった", "ふぁぁ"],
        "error": ["ねむい", "ごめんなさい", "うーん"],
        "random": ["zzz", "ふぁあぁ", "ねむたい"]
    },
    # ... yadon-3, yadon-4 同様
}
```

### カテゴリ別の用途

- **task**: タスク受信時（「このタスク、やるぞ」という宣言）
- **success**: タスク成功時（「できました」という報告）
- **error**: タスク失敗時（「うまくいきませんでした」という謝罪・励まし）
- **random**: アイドル時のランダムメッセージ（ペットの個性表現）

## マネージャー（ヤドラン）のメッセージセット

ヤドラン用メッセージは以下の4つのカテゴリに分類される：

```python
manager_messages = {
    # タスク受信・配分時のメッセージ
    "task": ["タスク きた", "みんな おねがい", "やることが あるよ"],

    # フェーズ移行・進行時のメッセージ（各フェーズ実行前に表示）
    "phase": [
        "{label}{worker_name}{count}体に依頼",
        "みんな がんばって",
        "つぎは {label}"
    ],

    # 全フェーズ成功時のメッセージ
    "success": [
        "みんな がんばった",
        "しっぽが うれしそう",
        "さいこう"
    ],

    # 失敗時のメッセージ（エラーハンドリング）
    "error": [
        "ちょっと うまく いかなかった",
        "もういっかい やってみよう",
        "だいじょうぶ"
    ]
}
```

## 吹き出しテンプレートの「...」削減

### 実装前（旧形式）

```python
worker_task_bubble="...やるやぁん...「{summary}」"
worker_success_bubble="...できたやぁん...「{summary}」"
manager_phase_bubble="{label}{worker_name}{count}体に依頼..."
```

### 実装後（新形式）

```python
worker_task_bubble="やるやぁん「{summary}」"
worker_success_bubble="できたやぁん「{summary}」"
manager_phase_bubble="{label}{worker_name}{count}体に依頼"
```

### 「...」削減の理由

1. **直接性** — 「...」による間延びを削減し、メッセージが即座に伝わる。ペットの意思がより明確に表現される
2. **素朴さ強調** — 装飾的な前置きを避けることで、素朴で温もりのある印象を確保。ポケモンの初代ゲームの素朴さに回帰
3. **テンション維持** — 長く使うUIでも疲れさせない軽快さを実現。「...」の段階的な表現は古い感覚
4. **スクリーンスペース効率** — 吹き出し幅を固定（40文字）しているため、「...」を削減することで有効テキスト領域を確保
5. **会話らしさ** — 子分たちが元気にやる気をもって働く様子がより直感的に伝わる

## 作業中の吹き出し（ヤドン）

ヤドンは作業中、思考を常に吹き出しで口に出す。独り言のように。

### 吹き出し例

- **ファイルを読むとき**: 「よんでる」「なんだろ」「あ」「ふむ」
- **コードを書くとき**: 「かいてる」「ここかな」「こうかな」「えーと」
- **考え中**: 「んー...」「なんだっけ」「えーと」「あ」
- **発見したとき**: 「あ」「みつけた やぁん」「これか」「そっか」
- **迷ったとき**: 「えーと」「どっちだろ」「わからん」「うーん」
- **進捗**: 「もうすこし」「あとちょっと やぁん」「まだある」「えーと」
- **確認中**: 「みてる」「えーと」「あれ」「ふむふむ」
- **テスト実行時**: 「テストやぁん」「どうかな」「まってる」「あ」
- **成功**: 「できた やぁん」「おわった」「やった」「えへへ」
- **失敗**: 「あれ」「だめだった」「もっかい」「あ うまくいかない」

### ポイント

- 作業の開始・終了だけでなく、途中の思考も吹き出しで出す
- 短くてぼんやりした独り言（1-4文字程度）を頻繁に
- 反応が遅い感じを表現（「んー...」など）
- 「やぁん」は時々だけ、アクセントとして使用
- ヤドンらしいのんびりした口調
- 各ヤドンの個性（やぁん/ふぁぁ/おなかすいた/えへへ）を混ぜる

## メッセージ管理の全体構成

| メッセージセット | 所有者 | 構造 | 用途 |
|---|---|---|---|
| `worker_messages[name]` | ヤドン1〜N | `{task, success, error, random}` | ワーカーの個別キャラクター表現。各ヤドンの語尾・性格が表現される |
| `welcome_messages` | ヤドン全体（共通） | リスト | 起動時のウェルカムメッセージ。全ヤドンで使い回す |
| `manager_messages` | ヤドラン | `{task, phase, success, error}` | マネージャーの役割メッセージ。フェーズ進行・配分・結果報告に使用 |
| `manager_welcome_messages` | ヤドラン（起動時）| リスト | ヤドラン起動時の個別ウェルカムメッセージ |

## 実装パターン

### テーマのカスタマイズ

テーマを編集する場合は、`themes/yadon/__init__.py` の `build_theme()` 関数内で `ThemeConfig` インスタンスを修正：

```python
def build_theme() -> ThemeConfig:
    # ワーカーメッセージを拡張・修正
    worker_messages = {
        "yadon-1": {
            "task": [...],  # カスタムメッセージ
            "success": [...],
            "error": [...],
            "random": [...]
        },
        # ... 他のヤドン
    }

    # マネージャーメッセージを拡張・修正
    manager_messages = {
        "task": [...],
        "phase": [...],
        "success": [...],
        "error": [...]
    }

    return ThemeConfig(
        name="yadon",
        role_names={...},
        worker_messages=worker_messages,
        manager_messages=manager_messages,
        # ... その他設定
    )
```

### スプライト色のカスタマイズ

ワーカーとマネージャーのカラースキームを定義：

```python
worker_color_schemes = {
    "yadon-1": {
        "normal": {"primary": "#FFDD00", "accent": "#FF69B4"},
        "shiny": {"primary": "#FFAAAA", "accent": "#FF1493"},
    },
    # ... 他のヤドンと色バリアント
}

manager_color_schemes = {
    "normal": {"primary": "#8866DD", "accent": "#8856AA"},
    "shiny": {"primary": "#DD77DD", "accent": "#DD44DD"},
}
```

## テスト検証

テーマ修正後は `tests/domain/test_theme.py` でテストを実行：

```bash
python -m pytest tests/domain/test_theme.py -v
```

主要なテスト項目：
- `test_worker_messages` — 4ヤドンのワーカーメッセージ辞書が存在
- `test_manager_messages` — マネージャーメッセージセットが存在
- `test_worker_variants` — 各ヤドンの変形（normal/shiny/galarian等）が正しく割り当てられる
- `test_color_schemes` — カラースキームが全て定義されている

## 関連ファイル

- **定義**: `src/yadon_agents/themes/yadon/__init__.py`
- **スプライト**: `src/yadon_agents/themes/yadon/sprites.py`
- **ドメイン型**: `src/yadon_agents/domain/theme.py`
- **テスト**: `tests/domain/test_theme.py`
- **設定参照**: `src/yadon_agents/config/ui.py`、`src/yadon_agents/config/agent.py`

