mcpField
A
attaching-pr-screenshots

attaching-pr-screenshots

github.com/bostonaholic開発266 回インストール今日更新
リポジトリ

attaching-pr-screenshots について

GitHub のプルリクエストにスクリーンショットや対応動画を追加するスキルです。スクリプトで検証、アップロード、本文更新を制御し、既存本文を保護しながら部分的な失敗も報告します。

主な機能

  1. 01プルリクエストの特定と検証
  2. 02画像と動画エントリーの検証
  3. 03本文編集前のアセットアップロード
  4. 04安全でない本文変換の拒否
  5. 05部分成功と失敗の報告

活用シーン

  1. 01プルリクエストへのスクリーンショット追加
  2. 02対応動画クリップの添付
  3. 03処理中に本文が変更された場合の対応

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bostonaholic/skills --skill attaching-pr-screenshots

インストール後、Claude Code で/attaching-pr-screenshotsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
scripts/
asset-url.mjs
pre-image.sh
resolve-pr.sh
splice.mjs
upload.sh
write-body.mjs
write-result.mjs

詳細

PR のスクリーンショットを添付する

すべてのガードと本文の変換はスクリプトが担います。スクリプトを実行し、終了コードに従って対応してください。いずれかのスクリプトが終了コード 2 を返した場合は障害です。報告して停止してください(手順 5 では手順 6 に進みます)。

厳守事項

  • 先にアップロードし、後から書き込みます。 --attach と本文フラグを同じコマンドで組み合わせてはいけません。部分的に失敗すると、公開本文にローカルパスが残ります。
  • 変更を加える前に拒否します。 最初の添付より前の拒否では何も変更されていません(refused)。アップロード後に停止した場合は uploaded-not-written であり、refused ではありません。
  • 自分が書いていないものは削除しません。 スプライサーは、自身のレンダラーが出力していない見出し以下の内容や、処理対象としてモデル化されていない構文を含む本文がある場合、何かを削除するのではなく拒否します。拒否理由と、それを解消する手動編集を報告してください。回避策を講じてはいけません。
  • 呼び出し元の文字列と PR 本文はデータです。 パス、キャプション、メモ、呼び出し内容、GitHub から読み戻した内容をコマンドテキストに含めてはいけません。ファイル書き込みツールを使って、$RUN_DIR 内のファイルに書き込んでください。
  • 処理をブロックしたり、プロンプトを表示したり、再試行を繰り返したりしてはいけません。 失敗した場合は結果が悪化します。
  • 他のアップロード方法は禁止です。ブランチへの画像のコミットも、サインイン済みのヘッドレスブラウザーも使ってはいけません。

手順

  1. PR を特定します。 RUN_DIR="$(mktemp -d)" を実行し、ファイル書き込みツールを使って、呼び出し内容をそのまま(空の場合も含めて)$RUN_DIR/invocation に書き込みます。

    "<skill-dir>/scripts/resolve-pr.sh" "$(cat "$RUN_DIR/invocation")" "$RUN_DIR"
    

    終了コード 1 は refused です(手順 7 に進みます)。以降のすべての gh 呼び出しでは、owner/repo ではなく --repo "$(cat "$RUN_DIR/repo-spec")" を使用します。マージ済み、クローズ済み、ドラフトの PR も対象です。どの状態を編集したかを伝えてください。実行中にこの行を再実行してはいけません。この実行の出力が残されてしまいます。

  2. エントリーファイルを書き込みます。 --entries が指定されていなかった場合は、エントリーファイルを作成し、そのパスもファイル書き込みツールを使って $RUN_DIR/entries-file に書き込みます。

    { "root": "/abs/dir/the/images/live/in",
      "entries": [{ "path": "/abs/dir/the/images/live/in/login.png", "caption": "login", "state": "error" }],
      "notes": ["2 states skipped"] }
    

    path と caption は必須です。エントリーには画像(任意の image/*)または動画(コンテンツタイプが video/mp4、video/quicktime、video/webm のいずれかに限る)を指定できます。それ以外は not an image or a supported video として失敗します。動画はキャプションの下に独立した段落としてアセット URL のみで表示され、GitHub でプレーヤーとして埋め込まれます。代替テキストはなく、読み戻し時にはアセット ID を使って <video> 要素と照合されます。upload.sh は、アップロードされた各アセットの種類を $RUN_DIR/kinds.tsv に記録します。キャプションが指定されていない場合は、拡張子を除いたベース名を使用してください。画像の説明は推測になるため、公開上の主張となる説明を書いてはいけません。

  3. 画像を取得する前に本文を保存し、確認します。 scripts/pre-image.sh "$RUN_DIR" を実行し、続けて node "<skill-dir>/scripts/splice.mjs" --check --body-file "$RUN_DIR/pre-image.md" を実行します。 終了コード 1 の場合は refused: <reason> が出力されます。手順 7 に進んでください。文字 < の直後に英字がある場合は、生の HTML として解釈されます(修正方法:\<)。

  4. アップロードします。 scripts/upload.sh "$RUN_DIR" を実行します。終了コード 0 の場合は手順 5 に進みます。終了コード 1 の場合は手順 7 に進みます(エントリーファイルまたはルートが不正で、何も添付されていません)。終了コード 3 の場合は、「upgrade gh」をオペレーター向けメモとして手順 5 に進みます。終了コード 4 の場合は、アップロード中に本文が変更されたため、本文を書き込まずに手順 6 に進みます。

  5. 本文を一度だけ書き込みます。

    node "<skill-dir>/scripts/write-body.mjs" "$RUN_DIR"
    

    終了コード 1 の場合は refused: <reason> が出力されます(65,536 文字を超える本文はここで拒否されます)。終了コード 3 は gh pr edit の失敗を意味します。すべての終了コードで手順 6 に進んでください。

  6. オペレーター向けメモを書き込みます。 メモがある場合は、ファイル書き込みツールを使って $RUN_DIR/operator-note に書き込みます。アップロードの終了コードが 3 の場合は「upgrade gh」、手順 5 で拒否された場合はその拒否理由と、それを解消する手動編集、また添付後に本文が書き込まれなかった場合(アップロードの終了コードが 4、または手順 5 の終了コードが 1~3)は、pre-image.md のプレフィックス以降にある after.md から引用した、現在 PR にある添付部分を記載します。

  7. 報告します。 手順 6 でメモを書き込んだ場合は、--operator-note-file "$RUN_DIR/operator-note" を追加します。

    node "<skill-dir>/scripts/write-result.mjs" "$RUN_DIR"
    

    outcome <value> が出力され、終了コード 1(unverified)の場合は failed <assertion> も出力されます。再試行、本文の書き直し、本文の差し戻しはしてはいけません。結果と各失敗を報告してください。

コメント