Communitygithub.com

tinycorn-studio/agent-skills

UI デザインの変更をコードに適用する前に、プレビュー画像/モックアップをレンダリングします(プレビュー、モックアップ、UI の事前確認、デザイン、スケッチ、デモ画像、デザインレビュー)。ユーザーが実装前に UI デザインを確認・承認したい場合や、UI 変更を提案する場合に使用します。オフスクリーンで PNG にレンダリングし、承認を得てから適用します。ビュー・レイアウト・色に関する変更がある場合は常にこのスキルを使用します。

agent-skills とは?

このスキルは、UI 変更をコードに適用する前に、ユーザーがデザインを視覚的に確認・承認できるようにします。主に macOS SwiftUI プロジェクト向けで、オフスクリーンレンダリングを使用して UI のプレビュー画像を PNG として生成するスクリプトを作成・実行します。ワークフローは、まず `tools/preview_<name>.swift` にレンダリングスクリプトを作成し、それを実行してプレビュー画像をデスクトップに保存・表示し、ユーザーに承認を求めます。ユーザーが OK を出すまではコードを変更しません。承認後にのみ変更を適用し、プレビュースクリプトも一緒にコミットします。このスキルは SwiftUI だけでなく、Web プロジェクト(HTML モックアップをブラウザまたは Playwright でキャプチャ)や CLI/TUI プロジェクト(ANSI レンダリング)にも応用可能な汎用原則を提供します。また、SwiftUI のレンダリングに関する具体的な落とし穴(変数名の衝突、レイアウト更新の必要性、スクリーンショット API の権限問題など)もカバーしており、安定したプレビュー生成を実現します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/tinycorn-studio/agent-skills/tree/HEAD/skills/ui-preview-first

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

UI プレビューファースト (TinyCorn Studio 標準)

ルール: すべての UI 変更は、コードに適用する前にユーザーがプレビュー画像を承認する必要があります。

ワークフロー

  1. tools/preview_<名前>.swift にオフスクリーンレンダリングスクリプトを作成します。アプリを実行する必要はなく、直接 PNG 2x をレンダリングします。

  2. スクリプトを実行し、ユーザーに画像を表示します。

    swift tools/preview_<名前>.swift ~/Desktop/<アプリ名>-<機能名>-Preview.png
    open ~/Desktop/<アプリ名>-<機能名>-Preview.png
    
  3. 承認を求めます — デザインの選択肢が複数ある場合は、2〜4 つの案を並べてレンダリングし、ユーザーに選択してもらいます(A/B/C/D)。

  4. ユーザーが OK した後にのみ適用します。 プレビュースクリプトも機能と一緒にコミットします。

  5. ユーザーから修正依頼があった場合:スクリプトを修正し、再レンダリングし、承認されるまで繰り返します。

コードスケルトン (SwiftUI, macOS)

import AppKit
import SwiftUI

struct PreviewRoot: View {
    var body: some View {
        // アプリの実際のコンポーネント/色を使用して UI を模擬構築します
        VStack { /* ... */ }
            .frame(width: 900, height: 600)
            .background(Color(nsColor: .windowBackgroundColor))
    }
}

let host = NSHostingView(rootView: PreviewRoot())
host.frame = NSRect(x: 0, y: 0, width: 900, height: 600)
host.layoutSubtreeIfNeeded()

let rep = host.bitmapImageRepForCachingDisplay(in: host.bounds)!
host.cacheDisplay(in: host.bounds, to: rep)

let png = rep.representation(using: .png, properties: [:])!
let out = CommandLine.arguments.count > 1
    ? CommandLine.arguments[1]
    : "preview.png"
try! png.write(to: URL(fileURLWithPath: out))
print("Wrote \(out)")

落とし穴 (実際に発生したもの)

  • グローバル変数名を SwiftUI の modifier/view 名と重複させない (例: border) → オーバーロードエラー。borderColor を使用してください。
  • 複数のメソッド間で共通して使用するヘッダーは、同じファイル内の他の場所で宣言を重複させないでください。
  • 2x レンダリング: rep.size を設定するか、上記のように bitmapImageRepForCachingDisplay + cacheDisplay を使用します。キャッシュする前に layoutSubtreeIfNeeded() を呼び出すのを忘れないでください。
  • screencapture/AppleScript を使用してアプリをキャプチャしないでください — マシンにスクリーンレコーディングの権限がないことがよくあります (-1743)。オフスクリーンレンダリングが唯一確実な方法です。
  • ダークテーマのアプリ: アプリと同じ Color(nsColor:) とアセットを使用して、プレビューを実際の見た目に合わせてください。
  • 画像はユーザーが見つけやすいように ~/Desktop/ に保存し、ファイル名は <アプリ名>-<機能名>-Preview.png の形式にしてください。

SwiftUI 以外の場合

  • Web: HTML モックアップをブラウザで開いてキャプチャするか、Playwright でスクリーンショットを取得します。
  • CLI/TUI: ターミナルで ANSI レンダリングするか、色付きのテキストで説明します。

共通原則は変わりません: 画像が先、コードは後、ユーザーが承認してから適用。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

関連スキル