--- name: skill-config description: ほかのスキルを使う準備をする。設定ファイル(スキルごとの config.yaml)を作り、値を利用者に1つずつ質問しながら書き込み、スクリプトの依存パッケージを入れる。スキルを初めて使うとき、スキルの設定を埋めるとき、設定の値を変えるとき、スキルから設定ファイルがないと言われたときに使う。 --- # skill-config ほかのスキルを使う準備をする。設定ファイルを作り、各項目のすぐ上のコメントを手がかりに、利用者に質問しながら埋める。スクリプトの依存パッケージも入れる。 設定ファイルは `<作業フォルダ>/.<スキルの名前>/config.yaml`。このスキル自身の設定ファイルはない。 準備するのは、このスキルの隣にあるスキルのうち、`assets/config-template.yaml` を持つもの。 ## コマンド スクリプトは `uv run` で動かす。 作業フォルダで動かすか、`--workdir "<作業フォルダ>"` を付ける。パスは `"…"` で囲む。 | すること | コマンド | | --- | --- | | 全部のスキルを準備する。設定ファイルがなければ、ひな形から作る。依存パッケージを入れる | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" setup` | | 1つのスキルだけを準備する | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" setup <スキルの名前>` | | 項目と今の値を読む。何も作らない | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" show <スキルの名前>` | | 1つの項目に値を書く | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" set <スキルの名前> <項目> --stdin` | | 1つの項目を空にする | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" set <スキルの名前> <項目> --empty` | `--stdin` を付けたら、値を標準入力で渡す。リストの値は、1行に1つずつ書く。 bash: ```bash uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" set <スキルの名前> <項目> --stdin <<'END' <値> END ``` PowerShell(1行目は、日本語などを化けずに渡すため): ```powershell $OutputEncoding = [Text.UTF8Encoding]::new($false) @' <値> '@ | uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/config_tool.py" set <スキルの名前> <項目> --stdin ``` ## 結果 標準出力に JSON を1つ返す。uv の出力は、標準エラー出力に出る。終了コードは、0 が成功、1 が書き込めなかったとき、依存パッケージを入れられなかったとき、思わぬエラー、2 が設定ファイルや引数の問題。 | 項目 | 中身 | | --- | --- | | `ok` | 成功したら `true` | | `message` | 起きたことと、確かめること。利用者にはこれを伝える | | `problems` | 問題の一覧(終了コード 2 のときと、依存パッケージを入れられなかったとき) | | `config` | show と set の結果。設定ファイルの場所 | | `skills` | setup の結果。スキルごとの `name`(名前)、`config`(設定ファイルの場所)、`created`(設定ファイルを作ったか)、`packages`(依存パッケージを入れられたか) | | `items` | show の結果。項目ごとの情報(下の表) | | `missing` | show の結果。必須なのに空の項目 | | `key`、`value`、`changed` | set の結果。書いた項目、書いた値、ファイルを書き換えたか(今と同じ値なら `false`) | | `items` の項目 | 中身 | | --- | --- | | `key` | 項目の名前 | | `value` | 今の値。値が2つ以上ならリスト。(秘密)の値は、空なら `""`、空でなければ `***` | | `required` | コメントに「(必須)」があるか | | `secret` | コメントに「(秘密)」があるか、名前がパスワードらしい項目か | | `examples`、`choices` | コメントの「例:」の値と、「選べる値:」の値 | | `comment` | 項目の説明(「例:」「選べる値:」の行を除いたコメント) | | `env_key` | (秘密)の値を入れる環境変数の名前を書く項目(`<項目>_env`)。なければ `null` | コメントの読み方と、set の細かい決まりは [reference/file-rules.md](reference/file-rules.md) にある。 ## 進め方 1. `uv --version` を動かす。動かなければ、uv を入れるよう利用者に伝えて終える。 2. 依頼が、特定の項目を変えることだけなら、その項目だけを set で書いて 6 に進む。 3. setup を動かす。依頼にスキルの名前があれば、そのスキルだけにする。`ok` が `false` なら、`message` を伝えて終える。 4. `skills` のスキルを1つずつ、5 のとおりに設定する。 5. 1つのスキルの設定: 1. show を動かす。 2. `missing` の項目を、ファイルに書かれた順に1つずつ聞いて、set で書く。 3. ほかの項目と今の値を表にして見せ、直したい項目があるかを1回だけ聞く。あれば、同じように1つずつ聞く。 6. 設定したスキルごとに show をもう一度動かし、設定ファイルの場所、書いた項目、まだ空の必須の項目を伝える。環境変数で渡す(秘密)の値があれば、値の設定のしかたと、値を入れた端末から CLI を起動し直すことも伝える。 聞き方: - 1回に1つだけ聞く。`comment` を短くまとめて添える。 - 選択肢は、`choices` があればその値、なければ `examples` の値と今の値(空の値と重なりは除く)。2つ以上あれば、利用者に質問するツールで聞く。4つより多ければ、初めの4つにする(利用者はほかの値も書ける)。 - 選択肢が2つに満たないときと、リストの項目は、チャットで聞き、「例:」の値を添える。 - リストの項目(今の値がリストか、次の行から1つずつ書くとコメントにある項目)は、「、」などで区切って答えてもらう。分けた結果を見せて確かめてから、1行に1つずつ set に渡す。 - 利用者が依頼の中で値を示した項目は、聞かずにその値を書く。 - 答えは、行に分けるほかは手を加えずに set に渡す。 (秘密)の項目(`secret` が `true`)は、値の代わりに渡し方を聞く。 - 環境変数で渡す(`env_key` があるときだけ):環境変数の名前だけを聞き、`env_key` の項目に書く。もとの項目に値が残っていれば(`***`)、空にするかを聞く。値の設定のしかたは、進め方の 6 で次のコマンドを伝える。どちらも、動かすと入力を待つので、パスワードを入れて Enter を押す(画面にも履歴にも残らない)。 - bash:`read -rs <名前> && export <名前>` - PowerShell:`$env:<名前> = [Net.NetworkCredential]::new('', (Read-Host -AsSecureString)).Password` - 自分でファイルに書く:設定ファイルの場所と項目の名前を伝える。 利用者が(秘密)の値をチャットに書いたときは、上の2つの渡し方を伝える。 利用者に質問できないとき(質問するツールがないときや、ほかのエージェントから依頼されたとき)は、依頼の中で示された値だけを書く。設定ファイルの場所と、残りの `missing` を伝えて終える。 ## してはいけないこと - ほかのスキルの SKILL.md やスクリプトを読まない。項目の意味は、コメントから伝える。 - (秘密)の項目の値を聞かない。チャットにもコマンドにも書かない。 - コメントと今の値にない値を、選択肢にしない。 - 依頼にも答えにもない値を、推し量って書かない。 - このスクリプト以外の方法で、設定ファイルを作ったり書き換えたりしない。 - 設定したスキルを動かさない。