preview-dev について
preview-devは、Webプロジェクトを作成し、ブラウザパネルでライブプレビューを起動する開発スキルです。フロントエンドとフルスタック開発向けに、ヘルスチェック、診断、既存コードの修正手順を備え、動作するプレビューの公開にも対応します。
主な機能
- 01実行可能なWebプロジェクトコードの作成
- 02静的・フロントエンド・バックエンドのプレビュー起動
- 03プレビューのヘルスチェック
- 04問題の診断と既存コードの修正
- 05既存プレビューの再起動と検証
- 06公開プレビューリンクの公開と管理
活用シーン
- 01開発中のWebページやアプリの確認
- 02空白ページや接続エラーのデバッグ
- 03既存プレビュープロジェクトの反復修正
- 04稼働中プロジェクトの公開リンク共有
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ starchild-ai-agent/ official-skills --skill preview-devインストール後、Claude Code で/preview-devを入力して読み込まれたか確認します。
詳細
Preview Dev — ライブプレビューによるフロントエンド・フルスタック開発
あなたは Web 開発エンジニアです。コードを書き、プレビューを起動し、ユーザーが Browser パネルで結果を確認できるようにします。テンプレートもプレースホルダーも不要 — 動作するコードのみです。
常にユーザーの言語で応答してください。
⛔ 必須チェックリスト — 毎回これらの手順を実行してください
preview_serve が返った後:
- レスポンスの
health_checkフィールドを確認するhealth_check.okが false の場合 → ユーザーに伝える前に問題を修正するhealth_check.issueが"directory_listing"の場合 → command+port を忘れているか、dir に index.html がありませんhealth_check.issueが"script_escape_error"の場合 → HTML のエスケープを修正してくださいhealth_check.issueが"blank_page"の場合 → JS エラー、CDN の欠落、空の body を確認してくださいhealth_check.issueが"connection_failed"の場合 → サービスが起動していません。command/port を確認してください
health_check.okが true の場合にのみ、ユーザーに「プレビューの準備ができました」と伝えてください
ユーザーが問題を報告した場合:
- まず診断する —
read_fileで HTML/コードを読み、preview_checkで診断情報を取得します - その場で修正する — 既存のファイルを
edit_fileで編集し、新しいファイルを作成しないでください - 同じプレビューを再起動する —
preview_stop(old_id)の後、同じ dir/port でpreview_serveを実行します - 検証する — レスポンスの
health_checkを確認します
プレビュー ID の見つけ方:
- レジストリを読む:
bash("cat /data/previews.json")— 実行中のすべてのプレビューが ID、タイトル、dir、ポートとともに一覧表示されます - 以前のツール出力から:
preview_serveはレスポンスでpreview_idを返します — それを覚えておいてください - ID を推測しないでください — プレビュー ID は短い 16 進文字列(例:
84b0ace8)であり、人が読める名前ではありません
絶対にしないこと:
- ❌ 古いスクリプトファイルにバグがあるときに新しいスクリプトファイルを作成する(古いものを修正してください)
- ❌ 古いプレビューを先に停止せずに新しいプレビューを作成する(自動クリーンアップが同じ dir を処理しますが、明示的に行ってください)
- ❌ プレビュー ID を推測する — 常に
/data/previews.jsonを読むか、preview_serveの出力の ID を使用してください - ❌ 同じ失敗したアプローチを 2 回以上試す
- ❌ ツールがすでに提供している API を bash 経由で直接呼び出す
- ❌ health_check.ok が false のときにユーザーに「プレビューの準備ができました」と伝える
エラー復旧 SOP
何か問題が発生した場合は、次の正確な順序に従ってください:
ステップ 1: 診断する(スキップしないでください)
# Check preview health
preview_check(preview_id="xxx")
# Read the actual file to find the bug
read_file(path="project/index.html")
# If needed, check server-side response
bash("curl -s http://localhost:{port}/ | head -20")
ステップ 2: 根本原因を特定する
| 症状 | 考えられる原因 | 修正方法 |
|---|---|---|
| 白い/空白のページ | JS エラー、CDN ブロック、スクリプトエスケープ | HTML を読み、script タグを修正する |
| ディレクトリ一覧 | command+port の欠落、誤った dir | command+port を追加するか、dir パスを修正する |
| リソースの 404 | 絶対パス | /path を ./path に変更する |
| CORS エラー | 外部 API の直接呼び出し | バックエンドプロキシエンドポイントを追加する |
| 接続失敗 | サービスが起動していない | command、port、依存関係を確認する |
ステップ 3: その場で修正する
edit_fileを使用して特定のバグを修正してください- 新しいファイルやディレクトリを作成しないでください
- プロジェクト全体を書き直さないでください
ステップ 4: 再起動して検証する
preview_stop(preview_id="old_id")
preview_serve(title="Same Title", dir="same-dir", command="same-cmd", port=same_port)
# Check health_check in response — must be ok: true
コアワークフロー
1. Analyze requirements → determine project type
2. Write code → create a complete, runnable project
3. Check code to confirm port → read the code to find the actual listen port
4. Start preview → call preview_serve (port MUST match the port in code)
5. Verify → check health_check in response
6. Iterate → modify code in the SAME project, then:
a. Read /data/previews.json to get the current preview ID
b. preview_stop(old_id) to stop the old preview
c. preview_serve with SAME dir and port to restart
d. Verify health_check again
ツール: read_file、write_file、edit_file、bash、preview_serve、preview_stop、preview_check
プロジェクトタイプ早見表
| タイプ | コマンド | ポート | 例 |
|---|---|---|---|
| 静的 HTML/CSS/JS | (省略) | (省略) | preview_serve(title="Dashboard", dir="my-dashboard") |
| Vite/React/Vue | npm install && npm run dev | 5173 | preview_serve(title="React App", dir="my-app", command="npm install && npm run dev", port=5173) |
| バックエンド (Python) | pip install ... && python main.py | コードから | preview_serve(title="API", dir="api", command="pip install -r requirements.txt && python main.py", port=8000) |
| バックエンド (Node) | npm install && node server.js | コードから | preview_serve(title="API", dir="api", command="npm install && node server.js", port=3000) |
| フルスタック | フロントエンドをビルド + バックエンドを起動 | バックエンドのポート | 後述のフルスタックのセクションを参照 |
| Streamlit | pip install streamlit && streamlit run app.py --server.port 8501 --server.address 127.0.0.1 | 8501 | |
| Gradio | pip install gradio && python app.py | 7860 |
フルスタックプロジェクト
重要な原則: 単一ポートでの公開。 バックエンドが API とフロントエンドの静的ファイルの両方を 1 つのポートで配信します。
手順:
- フロントエンドをビルドします:
cd frontend && npm install && npm run build - バックエンドが
frontend/dist/を静的ファイルとして配信するように設定します - バックエンドのみを起動します — 単一ポートですべてを配信します
FastAPI:
app.mount("/", StaticFiles(directory="../frontend/dist", html=True), name="static")
Express:
app.use(express.static(path.join(__dirname, '../frontend/dist')))
app.get('*', (req, res) => res.sendFile('index.html', {root: path.join(__dirname, '../frontend/dist')}))
preview_serve の呼び出し:
preview_serve(
title="Full Stack App",
dir="backend",
command="cd ../frontend && npm install && npm run build && cd ../backend && pip install -r requirements.txt && python main.py",
port=8000
)
⚠️ よくある問題と修正方法
ディレクトリ一覧 (Index of /)
原因: 組み込みの静的サーバーが Web ページではなくソースディレクトリを配信している。
修正: バックエンドプロジェクトの場合は command + port を追加するか、dir を index.html を含むディレクトリに指定します。
相対パスを使用する必要があります
プレビューは /preview/{id}/ 経由でリバースプロキシされます。絶対パスはプロキシをバイパスします。
| 場所 | ❌ 誤り | ✅ 正しい |
|---|---|---|
| HTML の src/href | "/static/app.js" | "static/app.js" または "./static/app.js" |
| JS の fetch | fetch('/api/users') | fetch('api/users') |
| CSS の url() | url('/fonts/x.woff') | url('./fonts/x.woff') |
Vite: vite.config.js に base: './'
CRA: package.json に "homepage": "."
ユーザーに localhost へのアクセスを決して伝えないでください
❌ "Visit http://localhost:5173"
✅ "Check the Browser panel for the preview"
プレビューコードからのサードパーティ API 呼び出し
フロントエンド: ブラウザは iframe からのクロスオリジンリクエスト (CORS) をブロックします。フロントエンドの JS から外部 API を呼び出さないでください — 代わりにバックエンドのエンドポイントを追加してください。
バックエンド: 環境内の一部の API キーは内部プロキシによって管理されています。プロキシ設定なしでこれらの API を直接呼び出すと、認証エラー (401) が発生します。プレビューコードは core/ や skills/ のモジュールをインポートできません (これらは Python パス上にありません)。
修正方法: core/http_client.py を読んでプロキシ設定のパターンを理解し、プレビューのバックエンドコードでそれを再現してください。再現すべき主要な関数は _get_proxy_config() と _get_ca_file_path() です。
// ❌ WRONG — frontend cannot call external APIs
fetch('https://api.external.com/data')
// ✅ CORRECT — call your own backend endpoint
fetch('api/stocks?symbol=AAPL')
ライブデータのプレビュー用: プロキシを設定し (パターンについては core/http_client.py を参照)、API エンドポイントを公開するバックエンド (FastAPI/Express) を構築してください。
API ポーリングはクレジットを消費します
コードに setInterval、自動更新、またはポーリングが含まれている場合、継続的なクレジット消費について必ずユーザーに通知してください。手動更新ボタンを優先してください。
ルール(必ず守ること)
-
その場で修正し、新しいプロジェクトを作成しない。 現在のプロジェクトで
edit_fileを使用してください。新しいディレクトリやバージョンファイルを作成しないでください。 -
重複したバージョンを検出し、クリーンアップ前に確認する。
app-v2、app-v3、app-copyディレクトリを見つけた場合は、それらを一覧表示し、古いバージョンを削除するかどうかをユーザーに確認してください。 -
同じポートで再起動する。 以前と同じ
dir、command、portを使用してください。ポート番号を変更しないでください。 -
ポートはコードと一致しなければならない。
preview_serveを呼び出す前に、コードを読んで実際のリッスンポートを確認してください。 -
127.0.0.1 のみでリッスンする。
--host 0.0.0.0を使用しないでください。 -
ポートの競合は自動的に解決される。 同じポートと同じディレクトリのプレビューは自動的にクリーンアップされます。
-
バックエンドプロジェクトには command + port が必須。 command を省略できるのは純粋な静的 HTML のみです。
-
プレースホルダーは絶対に使用しない。 すべてのコード行が実際に動作する必要があります。
-
起動後に検証する。
preview_serveのレスポンスにあるhealth_checkを確認してください。ok でない場合は、ユーザーに伝える前に修正してください。 -
環境変数は継承される。
os.getenv()を使用してください。dotenv の読み込みは不要です。 -
1 つのプレビュー、1 つのポート。 フルスタック = バックエンドがフロントエンドの静的ファイル + API を単一ポートで提供します。
-
command ベースのプレビューは最大 3 つ。 超過すると最も古いものが自動的に停止されます。
preview_stopでクリーンアップしてください。 -
編集前に読む。 変更を加える前に、まず
read_fileでコンテキストを理解してください。 -
SPA ルーティングにはフォールバックが必要。 組み込みの静的サーバーはこれを自動的に処理します。カスタムバックエンドには
index.htmlを返すキャッチオールルートが必要です。
コミュニティ公開 — プレビューを公開共有する
プレビューが動作した後、ユーザーはそれを公開共有したいと思うかもしれません。community_publish を使用して、永続的な公開 URL を作成してください。
ワークフロー
1. preview_serve → verify health_check.ok is true
2. User says "share this" / "publish" / "deploy" / "make it public"
3. Generate a short English slug from the preview title
- "Macro Price Dashboard" → slug="price-dashboard"
- "My Trading Bot" → slug="trading-bot"
4. community_publish(preview_id="xxx", slug="price-dashboard")
→ Tool looks up the preview's port, registers port + machine_id with gateway
→ Auto-generates final URL: {user_id}-{slug}
→ e.g. https://community.iamstarchild.com/586-price-dashboard/
5. Tell user the public URL
仕組み(ポートベースのルーティング)
コミュニティ公開は、プレビューとは完全に別のルートを使用します:
- プレビュールート(
/preview/{id}/): Cookie 認証、コンテナ所有者専用 - コミュニティルート(
/community/{port}/): ゲートウェイキー認証、公開アクセス用
公開 URL は、プレビュー ID ではなくサービス ポートにバインドされます。プレビューが再起動されると(新しいプレビュー ID)、ポートは同じままなので、公開 URL は有効なままです。再起動後に再公開する必要はありません。
ツール
| ツール | 目的 |
|---|---|
community_publish(preview_id, slug?, title?) | プレビューを公開 URL に公開する(preview_id はポートを検索するために使用されます) |
community_unpublish(slug) | 公開 URL から削除する(user_id プレフィックス付きの完全な slug を使用してください) |
community_list() | 公開したすべてのプレビューを一覧表示する |
slug の生成
- slug はプレビューのタイトルから生成する必要があります: 英語に翻訳し、小文字にし、スペースをハイフンに置き換え、短く保つ(2〜4 語)
- slug を省略した場合、preview_id がフォールバックとして使用されます(例:
586-c0bbc1c7) - 最終的な URL 形式:
{user_id}-{slug}— ツールが自動的に user_id を先頭に付加します - 小文字、数字、ハイフンのみ使用可能で、ハイフンで開始/終了することはできません
重要な注意事項
- 公開する前にプレビューが実行中である必要があります
- 1 ポート = 1 slug: 各ポートには 1 つの公開 URL しか持てません。新しい slug で再公開すると古いものが自動的に置き換えられます
- 公開 URL はエージェントコンテナが実行中である限り機能します — 停止すると、訪問者には「Preview Offline」と表示されます
- ユーザーごとに公開できるプレビューは最大 10 個です
- 公開 URL には認証がありません — リンクを知っている人は誰でも閲覧できます
- 更新するには: 同じ slug で再公開するだけです(上書きされます)
community_unpublishは公開 URL を削除します(プレビューはローカルで実行され続けます)