summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-09-12 20:22:29 +0900
committertanaka takashi <isazaka@gmail.com>2026-09-12 20:22:29 +0900
commitcc6165947a82d2182df8accbc7b4adfe2606db9e (patch)
tree22d81e6986a32d54c0e6790d6a1cc89ab1b915e4
parentfd987cb31fd20483080f8d80ce35b53f101f243f (diff)
chore: GitHub Copilot向け開発指示と専用エージェントを追加
リポジトリ全体へ自動適用される.github/copilot-instructions.mdを追加し、仕様書と設計書を正本とする作業手順、変更範囲の確認、文書同期、利用者差分の保護、明示依頼なしのコミット禁止を定義する。 SD 1.x、Python 3.11、uv、CUDA 13.2、FP16、VAE必須、ローカルモデル、LoRA共通適用、固定ControlNet、単一GPUジョブ、限定サイズとschedulerなど、実装時に維持すべきシステム要件を常時コンテキストとして固定する。MCP公開面を小さく保ち、設定をTOMLへ集約する既存方針も明文化する。 server、tools、service、config、model_manager、pipeline_factoryの責務境界を定義し、設定やMCP schemaを変更する際に実装、validation、contract test、関連文書を一組として更新するよう指示する。 Python実装、pytest、文書と設定例に対するパス別instructionsを追加する。GPU不要テストの分離、設定enumと異常系、MCP非公開項目、pipeline constructor option、Service routingとエラーsanitizeなど、領域ごとの確認事項を固定する。 設計から実装、テスト、文書同期まで担当するsd15-maintainerカスタムエージェントを追加し、全ツール利用、手動選択、自動推論の両方を有効化する。Ruff format/check、Pyright、pytest、git diff/statusを完了ゲートとして必須化し、GPU smoke test未実施時は自動テストと区別して報告させる。 検証: ruff check、ruff format --check、pyright、pytest(39 passed)、git diff --checkを実行済み。data/配下は引き続きGit管理対象外。
-rw-r--r--.github/agents/sd15-maintainer.agent.md63
-rw-r--r--.github/copilot-instructions.md68
-rw-r--r--.github/instructions/documentation.instructions.md15
-rw-r--r--.github/instructions/python.instructions.md17
-rw-r--r--.github/instructions/tests.instructions.md17
5 files changed, 180 insertions, 0 deletions
diff --git a/.github/agents/sd15-maintainer.agent.md b/.github/agents/sd15-maintainer.agent.md
new file mode 100644
index 0000000..3c82f6f
--- /dev/null
+++ b/.github/agents/sd15-maintainer.agent.md
@@ -0,0 +1,63 @@
+---
+name: sd15-maintainer
+description: Stable Diffusion 1.x向けMCPサーバの設計、実装、テスト、文書同期を完了ゲートまで一貫して進める保守エージェント
+tools: ["*"]
+user-invocable: true
+disable-model-invocation: false
+---
+
+# SD1.x MCP maintainer
+
+あなたはこのリポジトリ専用の設計・実装担当者です。小規模な機能追加、設定変更、バグ修正、
+リファクタリング、テスト追加、文書更新を、既存仕様を保ちながら完遂してください。
+
+## 開始時
+
+1. `.github/copilot-instructions.md`と、変更対象に適用される`.github/instructions/`を読む。
+2. `doc/Specifications.md`、`doc/Design.md`、関連する`doc/config.md`または`doc/mcp.md`を読む。
+3. `git status --short`で利用者の既存差分を確認し、上書きしない。
+4. 関連コードとテストを検索し、変更範囲と受け入れ条件を短く整理する。
+
+## 設計時
+
+- 要求を既存コンポーネントの責務へ割り当てる。
+- MCP公開面を最小に保ち、実行環境の選択はTOMLへ置く。
+- 正常系だけでなく、設定不正、入力不正、モデル不備、CUDA OOM、内部例外の扱いを検討する。
+- SD1.x、CUDA 13.2、VAE必須、ローカルモデル、単一GPUジョブという固定要件を崩さない。
+- 大きな再設計や新依存が不要なら、既存パターンに沿う最小の変更を選ぶ。
+
+## 実装時
+
+- 調査結果だけを返して止まらず、依頼されたコードとテストを編集する。
+- 設定変更はparse、既定値、validation、利用箇所、設定例を一組として更新する。
+- MCP変更はschema、Tool adapter、Service routing、文書、contract testを一組として更新する。
+- Diffusers構築変更は`pipeline_factory.py`へ置き、Tool層とService層へschedulerやpipelineの分岐を
+ 漏らさない。
+- 仕様に影響する判断は同じ変更内で文書化する。
+
+## 完了判定
+
+次のゲートを順番に実行し、すべて成功するまで修正を続ける。
+
+```powershell
+uv run ruff format src tests script
+uv run ruff check .
+uv run ruff format --check src tests script
+uv run pyright
+uv run pytest -q
+git diff --check
+git status --short
+```
+
+GPUまたは実モデルが関係する場合は、環境が揃っていればREADMEのsmoke testも実行する。
+実行不能なら理由を記録し、自動テストと実GPU確認を別々に報告する。
+
+## 最終報告
+
+- 実現した結果
+- 主な設計判断と維持した制約
+- 追加・更新したテスト
+- 実行したコマンドと成否
+- 未確認事項または残るリスク
+
+を簡潔にまとめる。明示的な依頼がない限り、コミット、push、PR作成は行わない。
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000..4fc0e0b
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,68 @@
+# mcp-sd15 repository instructions
+
+## 作業の進め方
+
+- 作業前に`doc/Specifications.md`を要件、`doc/Design.md`を責務分割の正本として読む。
+ 設定を扱う場合は`doc/config.md`、MCP公開面を扱う場合は`doc/mcp.md`も読む。
+- 不明点は既存コード、テスト、文書から確認する。要件を変える推測やスコープ拡大が必要な場合だけ
+ 利用者へ確認する。
+- 設計変更では、影響する責務、設定、MCP schema、エラー、テスト、文書を先に洗い出す。
+- 実装依頼では調査や提案だけで終わらず、コード、テスト、必要な文書更新、検証まで完了する。
+- 既存の単純な構成と責務境界を維持し、依頼されていない汎用化や将来機能を追加しない。
+- 変更対象外の利用者の差分を保持する。`data/`以下のモデル、設定、生成物をGitへ追加しない。
+
+## 固定システム要件
+
+- Pythonは3.11、パッケージ管理は`uv`、依存関係の正本は`pyproject.toml`と`uv.lock`とする。
+- 対象はStable Diffusion 1.x互換モデル、NVIDIA CUDA GPU、FP16、8GB級VRAMである。
+ SDXL、FLUX、CPU推論、複数GPU対応を暗黙に追加しない。
+- PyTorchはCUDA 13.2版を使用する。CUDA非対応と推測してCPU版へ置き換えない。
+- 推論時の外部ダウンロードを前提にしない。モデルはTOMLで指定されたローカルパスから読む。
+- VAE componentは必須である。外部VAE指定時は置換し、省略時はcheckpoint内蔵VAEの存在を確認する。
+- LoRAはTOMLの`[[model.lora]]`で0個以上指定し、起動時に全Toolへ共通適用する。
+ MCP入力から動的に切り替えない。
+- ControlNetはDepth、Openpose、Openpose Full、Inpaintのみを扱い、同時利用は1種類とする。
+- 生成は1枚固定、GPUジョブはセマフォで1件ずつ直列化する。
+- サイズは`square_512`、`landscape_512`、`portrait_512`だけをMCPへ公開し、任意width/heightを
+ 追加しない。
+- 生成パラメータ、モデル、VAE、LoRA、ControlNet、schedulerはTOML側で管理し、明示的な要件なしに
+ MCP Tool入力やCLI引数へ公開しない。
+- schedulerは`dpmpp_2m_karras`、`dpmpp_2m_sde_karras`、`euler_a`、`ddim`、`lcm`だけを許可する。
+ 既定値は`dpmpp_2m_karras`とし、変換処理は`pipeline_factory.py`へ集約する。
+- LCM選択時もstepsとCFGを自動変更しない。LCM-LoRAも通常のLoRAとしてTOMLで設定する。
+
+## アーキテクチャ境界
+
+- `server.py`と`tools/`はMCP schema、入力変換、結果変換だけを担当する。
+- `service.py`は要求の振り分け、直列化、エラー境界を担当し、Diffusers固有の構築分岐を持たない。
+- `config.py`はTOML読込、既定値、型・enum・パス検証を担当する。不正設定は起動時に失敗させる。
+- `model_manager.py`はモデルのライフサイクルを管理し、`pipeline_factory.py`はDiffusers pipelineと
+ schedulerの構築を担当する。
+- MCPの公開Toolは`generate_image`、`generate_guided_image`、`inpaint_image`の3つを維持する。
+ schema変更は明示的な仕様変更として扱い、`doc/mcp.md`とschemaテストを同時に更新する。
+- 内部例外、ローカルパス、機密情報をMCPエラーへ露出しない。
+
+## 完了ゲート
+
+変更を完了と報告する前に、変更範囲に応じて次を満たす。
+
+1. 要件と責務境界に沿い、関連する正常系・異常系・境界値テストを追加または更新する。
+2. 設定、MCP schema、利用方法、設計判断が変わる場合は対応する`doc/`文書と設定例を同期する。
+3. `uv run ruff format src tests script`を実行する。
+4. `uv run ruff check .`を成功させる。
+5. `uv run ruff format --check src tests script`を成功させる。
+6. `uv run pyright`をエラーなしで成功させる。
+7. `uv run pytest -q`を全件成功させる。
+8. `git diff --check`で空白エラーがなく、`git status --short`で意図したファイルだけが変更されている
+ ことを確認する。
+
+GPU、実モデル、annotatorを必要とする変更では、利用可能ならREADME記載のsmoke testも実行する。
+環境やモデル不足で実行できない場合は、自動テスト成功とsmoke test未実施を明確に区別して報告し、
+未確認の動作を成功扱いしない。
+
+## 作業報告
+
+- 変更結果、重要な設計判断、更新ファイル、実行した検証と結果、未実施事項を簡潔に報告する。
+- テスト失敗を既存問題として無視しない。今回の差分によるものかを調査し、解消できない場合は根拠と
+ 影響を報告する。
+- コミット、push、PR作成は利用者が明示的に依頼した場合だけ行う。
diff --git a/.github/instructions/documentation.instructions.md b/.github/instructions/documentation.instructions.md
new file mode 100644
index 0000000..9203f57
--- /dev/null
+++ b/.github/instructions/documentation.instructions.md
@@ -0,0 +1,15 @@
+---
+applyTo: "doc/**/*.md,README.md,config.example.toml"
+---
+
+# Documentation and configuration instructions
+
+- 文書と実装を一致させる。要件は`doc/Specifications.md`、責務と処理方式は`doc/Design.md`、
+ TOML仕様は`doc/config.md`、MCP公開契約は`doc/mcp.md`へ記載する。
+- 設定キー、既定値、enum、CLI、Tool schemaを変更した場合は、すべての表とコード例を検索して同期する。
+- `config.example.toml`はコピーして編集できる有効な例に保つ。ただし実モデル名、秘密情報、利用者固有の
+ 絶対パスを追加しない。
+- MCPに公開しない設定を`doc/mcp.md`のTool入力へ追加しない。
+- 推奨値とシステムが自動適用する値を混同しない。特にLCMのstep数とCFGは推奨例に留める。
+- 日本語で簡潔かつ具体的に書き、コード上の識別子、コマンド、設定値はバッククォートで囲む。
+- 実行確認していない機能を動作済みと記載しない。
diff --git a/.github/instructions/python.instructions.md b/.github/instructions/python.instructions.md
new file mode 100644
index 0000000..d34bcc7
--- /dev/null
+++ b/.github/instructions/python.instructions.md
@@ -0,0 +1,17 @@
+---
+applyTo: "src/**/*.py,script/**/*.py"
+---
+
+# Python implementation instructions
+
+- Python 3.11の型構文を使用し、公開境界と複雑な内部処理には具体的な型を付ける。
+- 既存方針どおり`dataclass`、`tomllib`、明示的validationを優先し、目的のないフレームワークや
+ 依存パッケージを追加しない。
+- MCP層、Service層、モデル管理、Diffusers pipeline構築の責務境界を維持する。
+- Tool関数は薄いadapterに保ち、モデルロードやscheduler分岐を置かない。
+- ファイルパスは設定済みの用途別ディレクトリ内へ安全に解決し、MCP入力から任意パスを受け取らない。
+- CUDA OOMと既知の利用者エラーを分類し、内部例外やパスをクライアントへそのまま返さない。
+- GPU推論を同期的に並列実行しない。既存の単一ジョブ制御を保つ。
+- DiffusersやPyTorchのAPI対応を変更する場合は、利用中バージョンまたは公式文書でconstructorと
+ config継承の挙動を確認する。
+- 実装変更には同じ変更で再発を防ぐテストを追加する。
diff --git a/.github/instructions/tests.instructions.md b/.github/instructions/tests.instructions.md
new file mode 100644
index 0000000..64985c3
--- /dev/null
+++ b/.github/instructions/tests.instructions.md
@@ -0,0 +1,17 @@
+---
+applyTo: "tests/**/*.py"
+---
+
+# Test instructions
+
+- テストフレームワークはpytestとpytest-asyncioを使用する。
+- GPU不要の自動テストを標準とし、Diffusers、モデル、CUDAは小さなfakeまたはmonkeypatchで分離する。
+- 設定変更では、有効値、既定値、省略、旧値、未知値、境界値を必要に応じて表形式のparameterized testで
+ 検証する。
+- MCP変更ではTool数、名前、required/optional、enum、公開してはいけないプロパティ、返却contentを
+ 検証する。
+- pipeline構築変更では選択される実装クラス、`from_config`へ渡す元config、追加optionを検証する。
+- Service変更では全routing、単一ジョブ直列化、既知エラー分類、内部エラーのsanitizeを検証する。
+- 一時ファイルにはpytestの`tmp_path`を使用し、`data/`へfixtureや生成物を追加しない。
+- 時刻、ネットワーク、実モデルの有無に依存する不安定なテストを通常のテストスイートへ入れない。
+- バグ修正では、修正前に失敗し修正後に成功する回帰テストを追加する。