本文へ移動
cccskills
無料GitHub で公開

breed

ポケモン育成シミュレーション。性格・特性・持ち物・技・努力値を対話的に設定し、Lv50実数値を算出する。育成したい・実数値計算・努力値配分等の質問時に使用。

インストール方法を見る

含まれるファイル(1)

  • SKILL.md31.3 KB

SKILL.md(原文)

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

Pokemon Training Simulator

ポケモン1体の育成データを対話的に構築するスキル。性格・特性・持ち物・技・努力値を順に決定し、Lv50での実数値を常にフィードバックする。完成した育成データはダメージ計算(calc skill)に連携可能。

v1スコープ: 通常フォーム限定。リージョンフォーム・メガシンカフォーム等は対象外。

パス定義

SKILL_DIR=(このSKILL.mdが置かれたディレクトリ)
REPO_ROOT=$SKILL_DIR/../../../..  (.claude/skills/breed/ → repo root)
PKDX=$REPO_ROOT/bin/pkdx
CACHE_DIR=$REPO_ROOT/pokedex       # pokedex.dbと同じディレクトリ

キャッシュファイル

各Phase完了時に、育成中のデータをJSONファイルとして $REPO_ROOT/box/cache/breed_cache_<pokemon_name>.json に書き出す。ポケモンごとに別ファイルとする。

目的

  • コンテキスト圧縮やセッション断絶時のデータ復元用中間データ
  • Phase 8で最終保存 or スキル終了時に削除

ファイルパス

$REPO_ROOT/box/cache/breed_cache_<pokemon_name>_<timestamp>.json

<timestamp> はスキル開始時(Phase 0)に date +%s で取得した UNIX タイムスタンプ。同じポケモンを複数回育成しても衝突しない。以降のフェーズでは $CACHE_FILE 変数でパスを参照する。

CACHE_FILE="$REPO_ROOT/box/cache/breed_cache_<pokemon_name>_$(date +%s).json"

キャッシュの初期化

スキーマ定義は src/writer/schema.mbt の pokemon_schema() がSSoT。初期JSONは以下のコマンドで生成する:

bin/pkdx init-cache pokemon > "$CACHE_FILE"

生成されるJSONの特徴:

  • nullableフィールド(nature, ability, item, moves[].name, role)は null
  • 数値フィールド(stats, stat_points)は 0
  • 配列(damage_calcs, pokemon.types, pokemon.abilities)は []
  • 技スロットは4枠分のプレースホルダが生成される

Phase 1でDB結果を pokemon オブジェクトにマージし(types[] と abilities[] は canonical order: type1→type2 / ability1→ability2→dream_ability、null は除外)、以降のPhaseで build フィールドを段階的に埋めていく。ステータス関連のキーは全て短縮形式 {h, a, b, c, d, s}。

更新タイミング

各Phaseの「Training State 出力」の直後にキャッシュファイルを書き出す。具体的には:

Phase書き込む内容
1pokemon情報 (types[] / abilities[]) + base_stats (短縮キー)
2+ nature + actual_stats再計算 (nature_up/down は writer が nature から導出するため保存不要)
3+ ability
4+ item
5+ moves(name/type/category/power/accuracy を含む詳細オブジェクト)
6+ stat_points + actual_stats最終値
7+ damage_calcs(ダメ計実行ごとに追記)

Phase 8での扱い

  • 保存完了後、またはユーザーが「いいえ」で保存をスキップした場合、キャッシュファイルを削除する
  • 削除に失敗しても警告のみでスキル終了をブロックしない

実数値計算式

Champions SP(デフォルト)

pkdx のデフォルトバージョンは Champions。EV/IV は廃止され SP (Stat Points) に統一されている。

HP = BaseStat + SP + 75
他 = floor((BaseStat + SP + 20) * nature_mod)

nature_mod: 上昇=1.1(11/10), 無補正=1.0, 下降=0.9(9/10)
  • 各ステータス最大: 32
  • 合計上限: 66
  • SP=0時: HP → base+75, 他 → base+20
  • SP=32時: HP → base+107, 他 → base+52

Phase 6 では「SP配分」として 0-32 の範囲で配分を行い、合計 66 以下を制約とする。従来の 508 EV 配分を SP で再現すると 1 ポイント余る(SP の +1 優位)。詳細は team-builder/references/champions_sp.md を参照。

Deprecated: EV/IV 式(scarlet_violet 等)

--version scarlet_violet 等の旧バージョン指定時のみ使用。IV=31 固定。

HP = floor((base*2 + 31 + floor(EV/4)) * 50 / 100) + 60
他 = floor((floor((base*2 + 31 + floor(EV/4)) * 50 / 100) + 5) * nature_mod)

Phase 6 では「努力値配分」として各 0-252、合計 510 以下を制約とする。

性格テーブル

性格上昇(×1.1)下降(×0.9)
いじっぱりこうげきとくこう
さみしがりこうげきぼうぎょ
やんちゃこうげきとくぼう
ゆうかんこうげきすばやさ
ずぶといぼうぎょこうげき
わんぱくぼうぎょとくこう
のうてんきぼうぎょとくぼう
のんきぼうぎょすばやさ
ひかえめとくこうこうげき
おっとりとくこうぼうぎょ
うっかりやとくこうとくぼう
れいせいとくこうすばやさ
おだやかとくぼうこうげき
おとなしいとくぼうぼうぎょ
しんちょうとくぼうとくこう
なまいきとくぼうすばやさ
おくびょうすばやさこうげき
せっかちすばやさぼうぎょ
ようきすばやさとくこう
むじゃきすばやさとくぼう
てれや----
がんばりや----
すなお----
きまぐれ----
まじめ----

Stat Card / Training State の表示ルール

Phase 1-7 の各 Stat Card / Training State テンプレは version で表示列を切り替える。skill 本文のテンプレは旧版(scarlet_violet 等)の体裁で書かれているため、Champions では下記マッピングで読み替える。

列マッピング

skill 本文の列Champions(version=champions)旧版(scarlet_violet 等)
個体値列非表示(SP に統合済み、IV は存在しない)31(IV 固定)
努力値列SP 列に読み替え(各 0-32)EV 列(各 0-252)
合計表示<total>/66 (残り: <remaining>/66)<total>/510 (残り: <remaining>/510)

Phase 6-1 推奨配分提案の version 別テンプレ

skill 本文は EV 制(H4 A252 S252 等)で書かれているため、Champions では下記に置き換える。

Champions(合計 ≤ 66、各 ≤ 32):

  • 物理アタッカー型: ASぶっぱ: H4 A32 S30 / HAベース: H32 A32 S2 / 耐久調整: H32 A2 B32
  • 特殊アタッカー型: CSぶっぱ: H4 C32 S30 / HCベース: H32 C32 D2 / 耐久調整: H32 C2 D32
  • 耐久型: HBベース: H32 B32 D2 / HDベース: H32 B2 D32

旧版(合計 ≤ 510、各 ≤ 252): skill 本文の Phase 6-1 表記そのまま(H4 A252 S252 等)


Phase 0: 初期化

0-1: DB存在確認

$PKDX query "ピカチュウ" --format json >/dev/null 2>&1 && echo "OK" || echo "NOT_FOUND"

NOT_FOUNDの場合、以下を案内してスキルを終了:

pkdx CLI または pokedex.db / champions.db が見つかりません。リポジトリルートで以下を実行してください:
  ./setup.sh

0-2: バージョン選択

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1ゲームバージョンは?バージョンchampions(default / 推奨, SP 制), scarlet_violet(deprecated, 旧 EV/IV 制), legendsza(deprecated), Other(バージョン名を入力)false

推奨の理由: Champions 以降は SP (Stat Points) 制に一本化されており、実数値算出・ダメ計・hbd 最適化ともに SP 前提で最適化されている。旧 EV/IV 制 (scarlet_violet / legendsza 等) は後方互換のために残しているが、新規育成は champions を選択すること。

champions 選択時は続けてレギュレーションを質問:

#質問headerオプションmultiSelect
1レギュレーションは?レギュレーションM-Cfalse

キャッシュに regulation フィールドも記録(champions以外では null)。


Phase 1: ポケモン選択

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1育成するポケモンは?ポケモン"Otherで回答してください" (desc: ポケモン名を入力), "Otherで入力" (desc: 日英どちらも対応)false

テンプレートのポケモン名をオプションに含めてはならない。

取得したポケモン名で以下を実行:

$PKDX query "<ポケモン名>" --version "<version>" --format json

フォーム違いポケモンの扱い

手順:

  1. ユーザー入力名をそのまま pkdx query "<名前>" --version "<version>" --format json に渡す。以下は直接引ける:
    • 原種名に form 名を接頭/接尾した一意名: ウォッシュロトム / ヒートロトム / メガガブリアス / メガリザードンX 等
    • 合成された一意名: キュウコン(アローラ) / ランドロス(れいじゅう) / ガーディ(ヒスイ) / バクフーン(ヒスイ) 等
    • 英語名: Wash Rotom / Ninetales (Alolan) 等
  2. 見つからない場合 (Error: Pokemon not found) は原種名で再 query し、返り値の forms[] を確認:
    • forms[] はその version に実在するフォームの一意名配列。原種引き時のみ列挙され、フォーム直引き時や形態無しの場合は JSON キーごと省略 される
    • 例: pkdx query ロトム --version champions → "forms":["ヒートロトム","ウォッシュロトム","フロストロトム","スピンロトム","カットロトム"]
    • 例: pkdx query キュウコン --version scarlet_violet → "forms":["キュウコン(アローラ)"]
  3. ユーザー意図に合う一意名を選び、その名前で再度 query して該当フォームの type1 / type2 / ability1 / ability2 / dream_ability / 種族値を取得

注意点:

  • 戦闘面で base と完全に同じフォーム (トリミアン毛型・ビビヨン模様・フラベベ花色・Unown 文字・マホイップ flavor 等) は forms[] に現れない。これらは原種として扱って問題ない
  • 該当 version にそのフォームが実在しない場合は forms[] からも除外される (例: Champions にはランドロス(れいじゅう)未収録)
  • メガシンカも form の一種として forms[] に含まれる (メガガブリアス 等)。メガ名で query するとメガ進化後の type/ability/stats が得られる
  • 性別でステータス・タイプ・特性が異なる種 (イダイトウ / イエッサン / パフュートン / ニャオニクス) は性別を明示する: jpn イダイトウ(オス) / イダイトウ(メス)、eng Basculegion (Male) / Basculegion (Female)。性別未指定の イダイトウ は M base を返すため、F 個体を育成する際は必ず (メス) 付きで照合する。ユーザー入力が イダイトウ♂ / イダイトウ♀ (ゲーム内表記) で来た場合は ♂ → (オス) / ♀ → (メス) に正規化してから query する

結果が空の場合:

  • 名前の確認を再度AskUserQuestionで依頼
  • メガシンカポケモンの場合(名前に「メガ」を含む): 以下のAskUserQuestionで案内:

AskUserQuestion(1問):

#質問headerオプション
1メガシンカポケモンのデータが見つかりませんでした。最新のメガシンカデータをDBに取り込みますか?(⚠ 実験的機能: マスターデータの更新時に再実行が必要になる場合があります)メガデータはい(desc: メガシンカ64体のデータを取り込む), いいえ(desc: 通常フォームで育成を続ける)

「はい」の場合:

"$REPO_ROOT/bin/pkdx" migrate --repo-root "$REPO_ROOT"

実行後、元のクエリを再実行してデータを取得する。取得できた場合はそのまま続行。 取得できなかった場合は「パッチ対象に含まれていないポケモンです」と案内し、通常フォームでの育成を提案する。

JSONから hp, atk, def_, spa, spd, spe, type1, type2, ability1, ability2, dream_ability を抽出。

初期 Stat Card 表示

EV=0, 無補正で実数値を計算し表示する:

=== Stat Card (初期状態: EV=0, 無補正) ===
<name> (<type1>/<type2>)

         種族値  個体値  努力値  実数値
HP        <hp>    31      0     <calc>
こうげき   <atk>   31      0     <calc>
ぼうぎょ   <def>   31      0     <calc>
とくこう   <spa>   31      0     <calc>
とくぼう   <spd>   31      0     <calc>
すばやさ   <spe>   31      0     <calc>

特性: {ability1} / {ability2} / {dream_ability}

Training State 出力

=== Training State (Phase 1完了) ===
ポケモン: <name> (<type1>/<type2>)
種族値: H<hp> A<atk> B<def> C<spa> D<spd> S<spe>
性格: 未選択
特性: 未選択
持ち物: 未選択
技: 未選択 / 未選択 / 未選択 / 未選択
EV: H0 A0 B0 C0 D0 S0 (残り: 510/510)
実数値: H<hp> A<atk> B<def> C<spa> D<spd> S<spe>

Phase 2: 性格選択

AskUserQuestion(1問):

上昇ステータス別にグループ化して提示する。

#質問headerオプションmultiSelect
1性格を選んでください性格こうげき↑: いじっぱり/さみしがり/やんちゃ/ゆうかん, ぼうぎょ↑: ずぶとい/わんぱく/のうてんき/のんき, とくこう↑: ひかえめ/おっとり/うっかりや/れいせい, とくぼう↑: おだやか/おとなしい/しんちょう/なまいき, すばやさ↑: おくびょう/せっかち/ようき/むじゃき, 無補正: てれや/がんばりや/すなお/きまぐれ/まじめfalse

各オプションには desc として「<上昇ステータス>↑ <下降ステータス>↓」を付与する(無補正は「補正なし」)。

性格補正を反映した Stat Card を再表示

性格テーブルを参照し、上昇ステータスに×1.1、下降ステータスに×0.9を適用して全実数値を再計算。

=== Stat Card (性格: <nature> — <stat>↑ <stat>↓) ===
<name> (<type1>/<type2>)

         種族値  個体値  努力値  実数値  補正
HP        <hp>    31      0     <calc>  --
こうげき   <atk>   31      0     <calc>  ↑/↓/--
ぼうぎょ   <def>   31      0     <calc>  ↑/↓/--
とくこう   <spa>   31      0     <calc>  ↑/↓/--
とくぼう   <spd>   31      0     <calc>  ↑/↓/--
すばやさ   <spe>   31      0     <calc>  ↑/↓/--

Training State 出力


Phase 3: 特性選択

Phase 1で取得した ability1, ability2, dream_ability から空でないものを選択肢とする。

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1特性を選んでください特性{ability1}, {ability2}(空でなければ), {dream_ability}(空でなければ, desc: 夢特性)false

Stat Card を更新(実数値は変わらないが特性を表示に追加)。

Training State 出力


Phase 4: 持ち物選択

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1持ち物を選んでください持ち物なし, こだわりハチマキ(desc: A×1.5/技固定), こだわりメガネ(desc: C×1.5/技固定), こだわりスカーフ(desc: S×1.5/技固定), いのちのたま(desc: 威力×1.3/HP1/10消費), きあいのタスキ(desc: HP満タンで一撃耐え), たべのこし(desc: 毎ターンHP1/16回復), とつげきチョッキ(desc: D×1.5/変化技使用不可), しんかのきせき(desc: BD×1.5/進化前限定), ゴツゴツメット(desc: 接触技にHP1/6反動), オボンのみ(desc: HP1/2以下でHP1/4回復), ラムのみ(desc: 状態異常回復), Other(desc: アイテム名を入力)false

Stat Card を更新(持ち物を表示に追加)。

Training State 出力


Phase 5: 技選択

$PKDX moves "<ポケモン名>" --version "<version>" --format json

取得した技一覧を以下のカテゴリに分類して提示:

  1. タイプ一致技: ポケモンのtype1/type2と一致するタイプの攻撃技(威力順)
  2. 補完技: タイプ不一致の攻撃技(威力上位10件)
  3. 変化技: 分類が「変化」の技(主要なもの)

AskUserQuestion(4問を一括):

#質問headerオプションmultiSelect
1技1を選んでください技1{上位技のリスト}, Other(desc: 技名を入力)false
2技2を選んでください技2{上位技のリスト}, Other(desc: 技名を入力)false
3技3を選んでください技3{上位技のリスト}, Other(desc: 技名を入力)false
4技4を選んでください技4{上位技のリスト}, Other(desc: 技名を入力)false

各オプションには desc として「<タイプ>/<分類>/威力<power>」を付与する。 変化技には desc に「ダメ計対象外」を明記する。

learnset 外の技を Other 入力された場合

pkdx moves は learnset 内の技のみを返すため、Other で learnset 外の技(例: SV では非習得・廃止された技)を指定された場合の取扱:

  1. cache の moves[].name に名前のみ格納する
  2. type / category / power / accuracy は null で保留する
  3. Phase 7 のダメ計(pkdx damage --format json)が出力 JSON に技情報を含むため、ダメ計実行時に値を補填する
  4. 攻撃技の場合は最低 1 回 Phase 7 のダメ計を通すよう案内する(補填しないと Phase 8 の pkdx write pokemon が null を弾く)
  5. 変化技の場合はユーザーに「ダメ計対象外なので type/category 情報なしで保存します」と案内し、cache の null のまま Phase 8 へ進める(writer 側で許容)

learnset 外の技は将来 patch 必須になる可能性があるため、可能な限り learnset 内の技を選ぶよう推奨する。

Stat Card を更新(技構成を表示に追加)。

Training State 出力


Phase 6: 努力値配分

6-0: 耐久指数最適化オプション

耐久寄りのポケモンで総合耐久(被物理+被特殊ダメージ合計)を最大化したい場合は、pkdx hbd を使って H/B/D の最適EV配分を自動算出できる。これは HBD/(B+D) を最大化する勾配法ベースの最適化で、H=B+D 則や 11n調整を暗黙に考慮する。

# S振り固定、H/B/D を最適化
$PKDX hbd "<pokemon>" --nature "<nature>" --fixed-ev "_,0,_,0,_,252" --hp-snap <leftovers|residual|sitrus|lifeorb|none>

# 物理多想定で非対称配分
$PKDX hbd "<pokemon>" --nature "<nature>" --phys-weight 2 --spec-weight 1

# 上位N候補を比較
$PKDX hbd "<pokemon>" --nature "<nature>" --top 5

このオプションを提示するかは Phase 1-2 で選んだ性格と種族値から自動判定(耐久上昇性格 or 耐久型種族値のポケモンに対して推奨)。理論的背景は .claude/skills/team-builder/references/bulk_theory.md を参照。

6-1: 推奨配分提案

種族値と性格を分析し、典型的な配分パターンを3つ提案する。

物理アタッカー型(Atk種族値 > SpA種族値の場合):

  • ASぶっぱ: H4 A252 S252
  • HAベース: H252 A252 B4
  • 耐久調整: H252 A4 B252

特殊アタッカー型(SpA種族値 > Atk種族値の場合):

  • CSぶっぱ: H4 C252 S252
  • HCベース: H252 C252 D4
  • 耐久調整: H252 C4 D252

耐久型(Def+SpD種族値が高い場合):

  • HBベース: H252 B252 D4
  • HDベース: H252 B4 D252

各提案に対して実数値を計算して併記する。

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1努力値配分を選んでくださいEV配分{提案1}(desc: 実数値サマリ), {提案2}(desc: 実数値サマリ), {提案3}(desc: 実数値サマリ), カスタム(desc: 自由に配分)false

6-2: カスタム配分(カスタム選択時のみ)

AskUserQuestionで6ステータスの努力値を質問する。

AskUserQuestion(6問を一括):

#質問headerオプションmultiSelect
1HP努力値は?HP EV0(default), 4, 252, Other(desc: 0-252の値)false
2こうげき努力値は?A EV0(default), 4, 252, Other(desc: 0-252の値)false
3ぼうぎょ努力値は?B EV0(default), 4, 252, Other(desc: 0-252の値)false
4とくこう努力値は?C EV0(default), 4, 252, Other(desc: 0-252の値)false
5とくぼう努力値は?D EV0(default), 4, 252, Other(desc: 0-252の値)false
6すばやさ努力値は?S EV0(default), 4, 252, Other(desc: 0-252の値)false

バリデーション

以下を検証する:

  • 各ステータスの努力値が0〜252の範囲内
  • 努力値の合計が510以下
  • 警告(エラーではない): 4の倍数でない努力値がある場合「Lv50では努力値4ごとに実数値1上昇するため、端数は無駄になります」と案内

バリデーションエラーがある場合はAskUserQuestionで再入力を依頼する。

6-3: 最終確認

全実数値を計算し、最終 Stat Card を表示:

=== 最終 Stat Card ===
<name> (<type1>/<type2>)
性格: <nature> (<stat>↑ <stat>↓)  特性: <ability>  持ち物: <item>

         種族値  個体値  努力値  実数値  補正
HP        <hp>    31    <ev>    <calc>  --
こうげき   <atk>   31    <ev>    <calc>  ↑/↓/--
ぼうぎょ   <def>   31    <ev>    <calc>  ↑/↓/--
とくこう   <spa>   31    <ev>    <calc>  ↑/↓/--
とくぼう   <spd>   31    <ev>    <calc>  ↑/↓/--
すばやさ   <spe>   31    <ev>    <calc>  ↑/↓/--

技: <move1> / <move2> / <move3> / <move4>
EV合計: <total>/510 (残り: <remaining>)

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1この配分でよろしいですか?確認はい(default), 努力値を調整する, 性格を変更するfalse
  • 「努力値を調整する」→ Phase 6-1 に戻る
  • 「性格を変更する」→ Phase 2 に戻る

Training State 出力


Phase 7: 完成サマリー & ダメ計連携

育成データ一覧表示

=== 育成完了: <name> ===
タイプ: <type1>/<type2>
性格: <nature> (<stat>↑ <stat>↓)
特性: <ability>
持ち物: <item>

Lv50 実数値:
HP: <hp>  A: <atk>  B: <def>  C: <spa>  D: <spd>  S: <spe>
EV: H<ev> A<ev> B<ev> C<ev> D<ev> S<ev>

技構成:
1. <move1> (<type>/<category>/威力<power>)
2. <move2> (<type>/<category>/威力<power>)
3. <move3> (<type>/<category>/威力<power>)
4. <move4> (<type>/<category>/威力<power>)

ダメ計連携

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1ダメージ計算を行いますか?ダメ計はい(desc: 育成した実数値でダメージ計算), いいえ(desc: 保存に進む)false

「はい」の場合:

AskUserQuestion(2問):

#質問headerオプションmultiSelect
1相手のポケモンは?相手"Otherで回答してください" (desc: ポケモン名を入力)false
2使用する技は?技{move1}(攻撃技のみ), {move2}, {move3}, {move4}false

変化技を選択された場合: 「この技はダメージを与えません。攻撃技を選んでください」と案内し、再度質問する。

ダメージ計算を実行:

$PKDX damage "<name>" "<相手名>" "<技名>" \
  --atk-stat <計算済み実数値> \
  --atk-ability "<ability>" \
  --atk-item "<item>" \
  --version "<version>" \
  --format json
  • 物理技 → --atk-stat にこうげき実数値を使用
  • 特殊技 → --atk-stat にとくこう実数値を使用
  • --atk-stat は「rank 前の実数値」として解釈される。育成済み実数値をそのまま渡せば性格補正込みの値になっているので --atk-nature は不要。rank 補正 (--atk-rank) を併用する場合も override の上から rank が適用される

免疫ケース

pkdx が --format json で免疫時にプレーンテキスト(Immune (0 damage))を返す場合がある。JSONパース失敗時は「タイプ相性または特性により無効(ダメージ0)です」と案内する。

結果出力

calcスキルと同じ形式でダメージテーブルを表示:

### ダメージ計算結果

**<name>** → **<相手名>** / <技名>

| 項目 | 値 |
|------|-----|
| 攻撃実数値 | <stat_name> <actual> |
| 技 | <move> (<type>/<category>, 威力<power>) |

| | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 |
|---|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|-----|
| ダメージ | ... |
| 割合 | ... |

**確定数**: {ko_text}

重要: 各ダメ計結果(攻撃側/防御側、相手名、技名、乱数テーブル、確定数)をPhase 8の保存用に蓄積しておく。

ダメ計後、追加計算するか質問:

AskUserQuestion(1問):

#質問headerオプションmultiSelect
1続けますか?追加計算別の技で計算, 別の相手で計算, 保存に進むfalse

Phase 8: 保存

AskUserQuestion(4問):

#質問headerオプションmultiSelect
1育成データを保存しますか?保存はい(desc: box/pokemons/<name>/配下に保存), いいえ(desc: 保存せず終了)false
2ファイル名を入力してください(拡張子不要)ファイル名Other(desc: 例: スカーフ型, HBゴツメ等。空欄の場合はYYYYMMDD)false
3ポケソル形式のテキストも出力しますか?ポケソル出力はい(desc: ダメージ計算SV等で読み込めるテキストを出力), いいえ(desc: md保存のみ)false
4この育成データをバージョン管理の対象にしますか?バージョン管理はい(desc: gitで変更履歴を残す。GitHubアカウントがあればクラウドにもバックアップ可能), いいえ(desc: 手元にのみ保存。gitには記録しない)false

「いいえ」(質問1)の場合はスキルを終了。

「はい」の場合:

ファイル名の決定:

  • ユーザーが入力した場合 → ベース名 = <入力値>
  • 入力が空または未指定の場合 → ベース名 = YYYYMMDD(当日の日付)

質問4の回答に基づき --file の値を決定:

  • バージョン管理あり → --file "<ベース名>"
  • バージョン管理なし → --file "__no_save.<ベース名>"

出力先:

  • バージョン管理あり: box/pokemons/<pokemon-name>/<ベース名>.md
  • バージョン管理なし: box/pokemons/<pokemon-name>/__no_save.<ベース名>.md (gitignore対象)
  1. 同名ファイルが存在する場合はAskUserQuestionで上書き確認
  2. キャッシュ JSON をそのまま pkdx write に渡す

出力(キャッシュ JSON → pkdx write)

キャッシュ JSON はPhase 0-7で段階的に構築済み。CLIがJSON→マークダウンCST→serializeを行うため、マークダウンを直接書く必要はない。

cat $CACHE_FILE | $PKDX write pokemon --name "<pokemon-name>" --file "<filename or __no_save.filename>"

CLIはキャッシュ JSON のスキーマ(pokemon + build セクション)をバリデーションする。 build.moves の各要素は name/type/category/power/accuracy を含む詳細オブジェクトである必要がある(Phase 5 で書き込み済み)。 空の move name がある場合はバリデーションエラーとなる。

エラー時の再試行: exit code が 0 以外の場合、stderrのエラーメッセージに基づいてキャッシュ JSON を修正し再試行する。最大3回まで。

保存完了後:

  1. 完了メッセージを表示:
✓ box/pokemons/<name>/<filename>.md に保存しました。
  1. 質問3で「はい」(ポケソル出力)の場合、Writeツールで以下の形式のテキストファイルも書き出す:

出力先: mdと同じ prefix ルールを適用(--file で指定した名前に _pokesol.txt を付与)

  • バージョン管理あり: box/pokemons/<pokemon-name>/<filename>_pokesol.txt
  • バージョン管理なし: box/pokemons/<pokemon-name>/__no_save.<filename>_pokesol.txt
<ポケモン名> / <特性> / <持ち物>
<技1> / <技2> / <技3> / <技4>
実数値: <HP>-<攻撃>-<防御>-<特攻>-<特防>-<素早さ>
努力値: <HP>-<攻撃>-<防御>-<特攻>-<特防>-<素早さ>
性格: <性格名>

出力後:

✓ box/pokemons/<name>/<filename>_pokesol.txt に保存しました。
  1. キャッシュファイル $CACHE_FILE を削除

「いいえ」(質問1)の場合もキャッシュファイル $CACHE_FILE を削除してからスキルを終了。


エラーハンドリング

状況対応
pkdx / DB が見つからないセットアップ手順を案内しスキル終了
ポケモンが見つからない名前の再入力を依頼。リージョンフォームの可能性を案内。メガシンカの場合はパッチ実行を提案
技一覧が空バージョンの確認を案内(技はバージョンで異なる)
EV合計 > 510再入力を依頼
EV > 252(単体)再入力を依頼
EVが4の倍数でない警告を表示(エラーではない)
ダメ計で免疫「タイプ相性または特性により無効です」と案内
変化技でダメ計「この技はダメージを与えません」と案内し攻撃技を再選択
同名ファイル存在上書き確認をAskUserQuestionで行う
pkdx write pokemon が legacy schema detected エラー既存 box/pokemons 配下の .meta.json が旧 schema のまま。bin/pkdx convert meta --in <path> --in-place で変換。./setup.sh を流すと box/pokemons/**/*.meta.json を一括変換できる
ファイル名に使用不可文字「ファイル名に使用できない文字が含まれています」と案内し再入力

レビュー

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

同じリポジトリのスキル

概要と使いどころ

battle

無料日本語概要

対戦中の高速応答モード。calc skillを事前ロードし、ダメ計とメモのラベル付き入力のみを最短で処理する。対戦中・バトル中・実戦中・対戦が始まる等の発話時に使用。

pkdxtools/pkdx542026年9月28日 更新

blog

無料日本語概要

サイト記事・設定のメンテナンス。新規ブログ記事の作成、公開/非公開切替、frontmatter (タイトル・説明文・タグ) 編集、記事削除、記事一覧表示、メンバー画像追加・差し替え、構築記事の本文編集 (構築コンセプト / ダメージ計算 / ポケモンメモ / 選出やりなおし)、サイト設定 (サイト名 / author / enabled) 変更を対話的に行う。最後にユーザー確認のうえ git push でサイトに反映。記事管理・ブログ管理・本文編集・構築コンセプト編集・ダメ計追加削除・ポケモンメモ・選出変更・メンバー画像差し替え・サイト名変更・公開切替・記事削除・記事一覧などの際に使用。

pkdxtools/pkdx542026年9月28日 更新

calc

無料日本語概要

ダメージ計算。攻撃側・防御側・技名を指定し、特性・持ち物・天候込みのダメージ乱数表を出力する。ダメージ計算・ダメ計・何発で落ちる等の質問時に使用。

pkdxtools/pkdx542026年9月28日 更新

nash

無料日本語概要

ナッシュ均衡ソルバー。零和対戦 (ポケモン選出、構築マッチアップ、じゃんけん型メタ) の最適混合戦略、選出最適化 (pkdx select)、メタ乖離分析 (pkdx meta-divergence) を提供。「最適選出」「選出分布」「構築メタ」「対面ジャンケン」「使用率 vs 最適」等の質問時に使用。

pkdxtools/pkdx542026年9月28日 更新

self-update

無料日本語概要

pkdxを最新版に更新する。構築・育成データを保護しながらスキルやCLIツールを安全にアップデートする。更新したい・アップデート・最新にしたい時に使用。

pkdxtools/pkdx542026年9月28日 更新

team-builder

無料日本語概要

対戦用ポケモン構築支援(シングル/ダブル対応)。軸ポケモンからタイプ補完・メタ分析・選出パターンまでガイドする。構築したい・パーティを組みたい・チーム作成時に使用。

pkdxtools/pkdx542026年9月28日 更新

pkdxtools のスキルをすべて見る

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