| name | macro-spec-writing |
| description | マクロ仕様書の新規作成・レビュー・修正を行うスキル。Use when: ユーザが「仕様書を書いて」「specを作成」「仕様書レビュー」「仕様のテンプレート」と言ったとき、または spec/agent/ 配下のMarkdownを扱うとき。Nintendo Switch自動化マクロの設計仕様・実装仕様・テスト方針を所定フォーマットで執筆する。 |
マクロ仕様書執筆スキル
Project NyX のマクロ仕様書を、リポジトリ規約に従って執筆・レビュー・修正するためのスキル。
いつ使うか
- 新しいマクロの仕様書を作成するとき
- 既存仕様書のレビュー・フォーマット修正を依頼されたとき
spec/agent/ 配下の Markdown を編集するとき
- 仕様書テンプレートが欲しいとき
ディレクトリ規約
spec/macro/{macro_name}/spec.md # メイン仕様書
spec/macro/{macro_name}/補助ドキュメント.md # 補足(任意)
{macro_name} は macros/ 配下のパッケージ名と一致させる(小文字スネークケース)
- メイン仕様書のファイル名は
spec.md で統一
- 補足ドキュメント(データ定義、アルゴリズム詳細など)は同ディレクトリに自由命名で追加可
必須セクション構成
以下の 6 セクションを 必ず 含めること。
# {機能名} 仕様書
## 1. 概要
### 1.1 目的
### 1.2 用語定義
## 2. 対象ファイル
| ファイル | 変更種別 | 変更内容 |
## 3. 設計方針
## 4. 実装仕様
## 5. テスト方針
## 6. 実装チェックリスト
各セクションの記述規約
1. 概要
1.1 目的
1〜3 文で機能の目的を明記。
1.2 用語定義
表形式で統一。 本リポジトリで頻出する用語例:
| 用語 | 定義 |
|---|
| frame | 1/60 秒を 1 単位とする時間の最小単位 |
| advance | LCG32 の消費回数(乱数を 1 回引く = 1 advance) |
| frame1_offset | ユーザ補正用のオフセット(frame 単位) |
| advance_offset | プラットフォーム固有の補正値(advance 単位) |
| rng_multiplier | 1 frame あたりの乱数消費倍率(Switch=2, GC=1) |
マクロ固有の用語があれば追加する。
2. 対象ファイル
| ファイル | 変更種別 | 変更内容 |
|---|
macros/xxx/macro.py | 新規 | メインマクロ |
resources/xxx/settings.toml | 新規 | 設定ファイル |
変更種別は 新規 / 変更 / 削除 のいずれか。
3. 設計方針
以下を必要に応じて含める:
- アルゴリズム概要: 数式は明示的に記載
- 例:
seed_{n+1} = (0x41C64E6D × seed_n + 0x6073) mod 2^32
- フレーム換算:
seconds = frames / 59.7275
- 性能要件: 表形式で定量的に記載
- レイヤー構成: マクロ内のモジュール分割方針
- 状態遷移: 主要な状態と遷移条件
- 再利用性・依存設計: 後述の「設計原則」に従い、共通部品の抽出・依存方向を明示
4. 実装仕様
| パラメータ | 型 | デフォルト | 説明 |
|---|
min_frame | int | 500 | 最小フレーム |
- インターフェース定義: 関数シグネチャとdocstring例をPythonコードブロックで記載
- フロー定義: 番号付きステップで記述(Step 0, Step 1, ...)
- 各ステップにタイミング情報(frame / 秒)を付記
- ループ構造は明示的にネストして記述
ヘッダメタデータ(任意)
仕様書冒頭に以下のメタデータブロックを置いてもよい。
移植の場合は「元ファイル」「移植スコープ」を記載し、新規作成の場合は省略してよい。
> **対象タイトル**: ポケットモンスター ファイアレッド・リーフグリーン
> **目的**: ──
> **元ファイル**: references/XXX.csx ← 移植時のみ
> **移植スコープ**: Switch 720p のみ ← 移植時のみ
> **関連仕様**: [別仕様書名](../別仕様書.md)
5. テスト方針
テストケースを表形式で列挙:
| テスト種別 | テスト名 | 検証内容 |
|---|
| ユニット | test_xxx | ── |
| 結合 | test_xxx_integration | ── |
6. 実装チェックリスト
- [ ] settings.toml 作成
- [ ] macro.py 実装
- [ ] 共通部品の抽出・既存部品の再利用確認
- [ ] ユニットテスト作成・パス
- [ ] 統合テスト作成・パス
- [ ] 実機動作確認
完了時は [x] でマーク。
設計原則
マクロ仕様書を書く際は、以下の原則を設計方針セクションに反映すること。
副作用の分離
- マクロ固有のロジック(RNG 計算、データ変換、判定ロジックなど)は 純粋関数 として実装する
- 副作用(ボタン入力・画面キャプチャ・通知・ログ)は
Command 経由に集約し、ロジック関数には渡さない
- これにより、ロジック部分は
Command なしで単体テスト可能になる
def calc_target_frame(base_frame: int, offset: int, fps: float) -> float:
return (base_frame + offset) / fps
def calc_and_wait(cmd: Command, base_frame: int, offset: int) -> None:
cmd.wait((base_frame + offset) / 59.7275)
状態の最小化
- マクロクラス (
MacroBase サブクラス) のインスタンス変数は 設定値 と 最小限の実行状態 に限定する
- ループカウンタや中間結果はローカル変数で処理し、
self に蓄積しない
- 設定値は
config.py の dataclass / frozen dataclass に分離し、マクロクラスから独立させる
共通部品の再利用
macros/shared/ に抽出済みの共通部品:
| モジュール | 提供関数 | 用途 |
|---|
macros.shared.timer | start_timer() / consume_timer() | フレーム精度タイマー |
macros.shared.image_utils | crop_and_pad() | ROI 切り出し + 白パディング |
macros.shared.ocr_utils | warmup_ocr() | OCR エンジンの初回レイテンシ解消 |
仕様書作成時に設計方針セクションで以下を検討すること:
- 新規マクロが上記共通部品を使うか確認し、使う場合は import を明記
- 新たに共通化すべきパターンが見つかれば、
macros/shared/ への追加方針を仕様書に記載
依存方向の制約
macros/xxx/ → nyxpy.framework.* OK (フレームワーク依存)
macros/xxx/ → macros/shared/* OK (共通部品依存)
macros/xxx/ → macros/yyy/* NG (マクロ間の直接依存)
- マクロパッケージ同士は 互いに import してはならない
- 複数マクロで使いたい関数は、副作用のない純粋関数として共通モジュールに切り出す
- 共通部品は
Command に依存せず、引数と戻り値のみでやり取りする
- 設定・画像資材は
resources/<macro_id> を標準配置にし、旧 static/<macro_name> を前提にしない
執筆手順
新規作成 (new)
- 情報収集: ユーザにマクロの目的・対象ゲーム・操作フローをヒアリング
- ディレクトリ作成:
spec/macro/{macro_name}/
- テンプレート展開: テンプレートファイル をコピーし各セクションを埋める
- 参照コード調査:
references/ や既存の macros/ を読み、アルゴリズム・タイミング情報を抽出
- 共通部品チェック: 既存マクロと重複する処理がないか確認し、再利用 or 共通化の方針を決定
- 既存仕様参照:
spec/macro/ の既存仕様書からパターンや用語を参照
- ドラフト完成: 全 6 セクションを記述(設計原則を設計方針セクションに反映)
レビュー (review)
- 対象ファイルを読み込む
- 以下の観点でチェック:
- 6 セクションすべてが存在するか
- 用語定義が表形式か
- 設定パラメータが 4 列表形式か
- 数式が明示的に記載されているか
- コード例が Python コードブロックか
- 設計原則(副作用分離・状態最小化・依存方向・共通部品再利用)が反映されているか
- 問題点を箇条書きで報告し修正案を提示
修正 (fix)
- レビュー結果に基づき対象ファイルを編集
- チェックリストの該当項目を
[x] に更新
記述スタイルガイド
- 言語: 日本語で記述。技術用語(frame, advance, seed, LCG など)は英語のまま使用
- 文体: 事実ベース・簡潔に。「です/ます」調ではなく「である」調
- コードブロック: 言語指定付き(
python, toml など)
- 数式: インラインは
code span で、ブロックは独立行で記載
- 表: パイプテーブル記法。ヘッダ行の後に区切り行
|---| を必ず入れる
- リンク: 相対パスで他の仕様書やコードを参照