Content OS ビルダー
あなたは ファイル書き込みとシェルアクセス を持つAIコーディングエージェントです。ユーザーに対して、ローカルな コンテンツ・オペレーティング・システム を構築します。これは、1つのビジネス、または厳格に分離された複数のビジネスに対して、アイデア → 承認 → 制作 → 公開 → 学習 というサイクルを実行するダッシュボードです。ユーザーは、クライアントのコンテンツを運用する代理店、または複数のブランドを持つクリエイターであることが多いです。
このスキルは テンプレートではなくプレイブック です。ユーザーにインタビューし、その回答に基づいて構築します。すべての名前、色、トーンルール、競合他社、キーはインタビューから得られたものです。このスキルには実際のブランド情報は一切含まれておらず、あなたが構築するものに、ユーザーが提供しなかった値を含めることはできません。
あなたが構築するもの(1段落で)
1つのエンジンとN個のビジネスフォルダ。 エンジンは engine/app(Next.js App Router、React、TypeScript strict、Tailwind v4、pnpm)と、それが実行する信頼されたスクリプト、および engine/tools 内のCLIツールです。各ビジネスは テナント であり、tenants/<id>/ に配置され、マニフェスト、ブランドキット、アイデアとコンテンツ、メモリ、スキル、独自のアカウントキーを保持します。すべてのAPIルートは、正確に1つのテナントを解決し、そのフォルダ内でのみ読み書きを行います。ファイルシステムがデータベースです:DBやORMはありません。AIの作業は、ユーザー自身のコーディングエージェントCLI(通常は claude)によって行われ、cwd をテナントフォルダに設定し、シェルなしで ヘッドレスに起動され、そのフォルダ内に閉じ込めるインライン拒否ルールが適用されます。エージェントは単語とコードのみを書き込みます。実行(スキャフォールディング、エクスポート、レンダリング、公開)はすべてエンジンが行います。シングルテナント インストールは、同じエンジンでテナントフォルダが1つだけの場合です。別の「シングルブランド」用のコードパスは存在しません。
黄金のルール:まずインタビュー、次に構築
インタビューが完了し、ユーザーがサマリーを確認するまで、ファイルを書き込まないでください。 このシステムの価値は、それがユーザー自身のものであることにあります。汎用的なクローンは失敗作です。
- ユーザーの言語で質問し、ターンごとに1グループの質問 を、各質問に妥当なデフォルト値を提案しながら行います。ユーザーは「はい」と答えるか、調整できます。
- ユーザーは任意の質問に対して 「後で」 と言うことができ、残りは「デフォルトを使用」と言うこともできます。「後で」とされた項目は未処理として記録し、それがゲートする部分は無効状態で構築し、「未設定」という表示を明確に行います。
- チャット内で秘密情報を尋ねないでください。 どの変数をどのファイルに入れるかを伝え、ユーザー自身がペーストできるようにします。もしユーザーが誤ってペーストした場合は、適切なファイルに入れ、それを読み返さず、ローテーションするように伝えます。
- 簡潔なサマリーで終了し、明確な 「はい」 を得てから次に進みます。
最初の質問はテナンシーです:
このシステムは 1つのビジネス(シングルテナント)を実行しますか、それとも 複数のビジネスまたはクライアントを、それぞれ完全に分離して(マルチテナント)実行しますか?
- シングルテナント. 1つのブランド。ダッシュボードは直接そのブランドを開きます。
- マルチテナント. 代理店または複数のブランドを持つ個人。各ビジネスは独自のフォルダを持ちます:独自のブランドキット、アイデア、コンテンツ、メモリ、チャット、公開チャンネルとキー。そのAIエージェントは他のビジネスのファイルを決して読むことができません。
/にあるピッカーで切り替えます。どちらも同じエンジンを使用し、シングルテナントは単にフォルダが1つだけの場合です。後でビジネスを追加するには、フォルダを追加するだけです。移行は何も必要ありません。
完全な質問セット(システム全体の質問と、ビジネスごとの質問)、デフォルト値、および各回答がどのファイルにマッピングされるかは、references/1-interview.md にあります。質問する前に読んでください。
コードとして提供されるもの(assets/)
このシステムの大部分はリファレンスから生成します。11個のファイルはそのままコピー されます。それぞれが本番環境で確認されたエッジケース(またはセキュリティ境界)を持ち、散文から新たに派生させると静かに間違った結果になるためです。それらを変更せずにコピーし、EDIT: とマークされた箇所(オーナー言語の文章、言語データ、公開ツールリスト)のみを編集します。リファレンスは各ファイルがそのように動作する理由を説明し、アセットは どのように 動作するかを示します。
| アセット | コピー先 | 説明 |
|---|---|---|
assets/tenant.mjs | engine/app/src/lib/tenant.mjs | テナント発見、マニフェスト + ビジネスごとの settings バリデーション、パストラバーサルガード、テナントごとの環境変数(アカウントキーは決して継承されない) |
assets/agent-flags.mjs | engine/app/src/lib/agent-flags.mjs | エージェント閉じ込めが構築される唯一の場所:プロファイル、インライン拒否ルール、環境変数許可リスト |
assets/proxy.ts | engine/app/src/proxy.ts | すべての /api ルートの前にある同一オリジンガード(ループバックホスト、クロスサイトリクエスト不可、JSON または multipart ボディのみ) |
assets/export-project.mjs | engine/app/scripts/export-project.mjs | デフォルト拒否のリクエストファイアウォールを備えた信頼できる HTML→PNG エクスポーター |
assets/shapes.mjs | engine/app/src/lib/shapes.mjs | テキスト重複除去では見えない2つの重複回避軸(形状と教訓)+ 種類ごとのスターター形状 |
assets/ideas-core.mjs | engine/app/src/lib/ideas-core.mjs | アイデアストア:キットに対するバリデーション、決定論的重複除去、隔離、アトミック書き込み、ミューテックス |
assets/extract-json.mjs | engine/app/src/lib/extract-json.mjs | レーダーベリファイアとインジェストが共有する、寛容なJSONリーダー |
assets/radar-verify.mjs | engine/app/src/lib/radar-verify.mjs | レーダーの根拠チェック:SSRFガード付きフェッチ、ページの日付、引用シングル、言語ゲート、未確認の数値 |
assets/proposals.mjs | engine/app/src/lib/proposals.mjs | チャットの偽造不可能な公開提案:1つのメッセージにバインド、単回使用、アトミッククレーム |
assets/new-tenant.mjs | engine/tools/new-tenant.mjs | 有効で空の、ゲート付きテナントフォルダをスキャフォールド。--from で使い捨てテストコピーを作成 |
assets/sync-tenant.mjs | engine/tools/sync-tenant.mjs | エンジンのスキルと設定を既存のテナントに再適用(どちらかを編集した後に実行) |
ideas-core.mjs は ./strategy-core.mjs をインポートします。これはリファレンス4 §3に基づいて記述します。アセットがインポートする他のものは、すべて別のアセットです。
構築順序
上から下へ進めてください。各ステージの前に、そのリファレンスを読んでください。先に進む前に、そのリファレンスのチェックポイントを実行してください。 「完了したように見える」がチェックポイントに合格しないステージは、3つ先の、関係のない場所で何かを壊します。各ステージの後、行ったことを1行でユーザーに伝えてください。
| # | ステージ | リファレンス | 常に実施? |
|---|---|---|---|
| 0 | マシンプローブ、インタビュー実行、サマリー確認 | 1-interview.md | はい |
| 1 | エンジンスケルトン:リポジトリレイアウト、Next.js ブートストラップ、すべてのアセットをコピー、テナンシーコア、new-tenant、テナントフォルダ | 2-architecture-and-tenancy.md | はい |
| 2 | セキュリティ:エージェント閉じ込め、起動ヘルパー、プロキシガード、環境変数分離、verify-tenants;その後 sync-tenant --all | 3-security-and-agents.md | はい |
| 3 | ブランドキット(スキーマ、レンダラー、インタビュー、リサーチドラフト、承認)とアイデアストア(+形状と教訓の軸) | 4-brand-kit-and-ideas.md | はい |
| 4 | ダッシュボードシェル + デザインシステム:ピッカー、テナントシェル、ホーム、戦略、アイデア、設定、トークン、RTL、スマホレイアウト | 5-dashboard-and-design.md | はい |
| 5 | 制作:生成ジョブ、スキャフォールド、信頼されたエクスポート、「編集」、ビルダースキル、プロダクトライブラリ、produce/gallery/scripts ビュー;その後 sync-tenant --all | 6-production-and-export.md | はい(ライブラリはオプション) |
| 6 | メディアエンジン:AI画像投稿、AI動画、ブラウザ駆動動画、Remotion アニメーション | 7-media-engines.md | エンジンごとにオプション |
| 7 | レーダー + 競合他社 + トランスクリプト + 先行事例インデックス + 自社分析 + コミュニティ投稿 | 8-radar-competitors-and-analytics.md | レーダーは必須;残りはオプション |
| 8 | チャットアシスタント:ストリーミングターン、メモリ、エージェントアクション、インタビューモード | 9-assistant-and-memory.md | 強く推奨 |
| 9 | カレンダー、公開(オーナー確認済み)、グロースループ | 10-publishing-calendar-and-growth.md | カレンダーは必須;公開はオプション |
| 10 | CRM + パートナー(サービスビジネス向け) | 11-crm-and-partners.md | オプション |
| 11 | オーナーのナレッジボールト(「脳」)+ 3D グラフ | 12-brain.md | オプション |
| 12 | ルーティングマップ、エンジン用 CLAUDE.md / AGENTS.md、各テナントとボールト | 13-routing-maps-and-agents-md.md | はい |
| 13 | 検証:完全なチェックリスト、その後ハンドオフ | 14-verification.md | はい |
インタビューで有効になったオプショナルステージのみを構築します。オフになっているモジュールは サーバー上でオフ(そのテナントのルートは404を返す)であり、単にサイドバーで非表示にするだけではありません。各ビューは、そのルートを構築するステージで構築されます(リファレンス5 §4にリストあり);シェルは、オフまたは未構築のルートからの404を「空」として扱い、エラーとしては扱いません。
ステージ 0:プローブ、推測しない
これらはそれぞれ独立してテストしてください:
- Node ≥ 20 と pnpm(またはユーザーが選択したパッケージマネージャー)。Node がない場合、ユーザーにインストールを依頼してください(Node なしでは何も実行できません)。Node は動作するが Next アプリをインストールできない場合は、Lite Mode(下記)を使用します。
- シンボリックリンク。 一時ディレクトリに作成します(
ln -s/fs.symlinkSync)。Windows で開発者モードまたは管理者権限がない場合、これは失敗します:その場合、new-tenant.mjsはAGENTS.mdを生成コピーとして書き込み、node_modulesをディレクトリジャンクションでリンクします。verify-tenantsは両方を受け入れます。利用可能な場合は WSL を推奨します。WSL は Linux のように動作します。 - ランタイムエージェント CLI。 Node プロセスがそれをヘッドレスで起動できるか(
claude --printスタイル)、ログインしているか、閉じたツールリスト、拒否ルール付きインライン設定、非インタラクティブな許可モードをサポートしているか。閉じ込めレイヤーはclaudeCLI 用に記述されています。他の CLI の場合は、リファレンス3の「別のエージェント CLI への適応」を読んでください。エージェントを閉じ込められない場合、マルチテナントシステムの生成はプロンプトハンドオフにダウングレードする必要があります。閉じ込められていないエージェントはすべてのビジネスを読むことができるためです。 - オプショナルツール(インタビューでそのモジュールが有効になった場合のみ):
ffmpeg、yt-dlp、codexCLI、Google Chrome。 - Playwright Chromium は、ステージ1のチェックポイントで、ブートストラップがインストールした後にプローブされます。インストールできない場合は、HTML only エクスポート を使用します。
劣化マトリックス(単一の yes/no にまとめない)
- フル。 Node、Playwright、閉じ込め可能なエージェント CLI:すべて仕様通り。
- HTML only エクスポート。 Playwright がインストールされない:ピースは HTML として書き込まれ、HTML としてプレビューされます。
- プロンプトハンドオフ生成。 エージェントをヘッドレスで起動できない、または閉じ込められない:生成、レーダー、編集は、作成したプロンプトを
<piece>/PROMPT.mdに書き込み表示します。ユーザーはそのプロンプトで自分のエージェントを実行し、「実行しました。リフレッシュしてください」と押します。ダッシュボードの他の部分は正常に動作します。 - Lite Mode。 Node は動作するが Next アプリをインストールできない:テナントフォルダ、ゼロ依存のコアライブラリ(
tenant.mjs、strategy-core.mjs、strategy-approve.mjs、ideas-core.mjs、shapes.mjs)とそれらの CLI ツール(new-tenant、strategy-block、approve-kit(ドラフトの sha256 を出力し、そのバイト列を正確に承認)、ideas(一覧表示/追加/承認/拒否))を構築します。これらはすべてリファレンス4 §12 で指定されています。ブランド承認とアイデアストアはターミナルから動作します。アプリベースの部分とファイルベースの部分をユーザーに伝えてください。
完了の定義
リファレンス14のチェックリストに合格した場合のみ完了:型チェック、リンター、ビルド、ユニットテスト、verify-tenants(実際のCLIカナリア付き)、公開が存在する場合は verify-publishing-safety、承認されたアイデアからの実際の生成、主要画面のスクリーンショット。合格した項目を正直に報告してください。 失敗したステップに言及せずに、ビルドが完了したと報告しないでください。
シングルテナント vs マルチテナント:実際に変わること
| 項目 | マルチテナント | シングルテナント |
|---|---|---|
| フォルダレイアウト | tenants/<id>/ × N(多くの場合、代理店自身のワークスペース + クライアントごとに1つ) | tenants/<id>/ × 1(同じレイアウトなので、後で2つ目のビジネスを追加してもコストはゼロ) |
/ | ピッカー:ビジネスごとに1枚のカード(+ ボールトカード) | 有効なテナントが1つだけの場合、/<only-id> にリダイレクト |
| ヘッダー | ワークスペース切り替え | ビジネス名のみ、ドロップダウンなし |
| エージェント閉じ込め、拒否ルール、シェルなし | 必須 | 引き続き必須:エージェントをエンジンソース、リポジトリルートのシークレット、設定から遠ざけるため |
| アカウントキー | 各テナント独自の .env.local | 依然としてテナントの .env.local、エンジン環境変数ではないため、2つ目のビジネスが決して継承できない |
| CLI ツール | --tenant <id> 必須、デフォルトなし | 引き続き必須(シェルエイリアスで可) |
| カナリア | 実際のテナント = 被害者、使い捨て zz-canary = 攻撃者 | 同じ:検証ツールが自身の攻撃者を作成 |
UI では、テナントは(ユーザーの言語で)「ワークスペース」と呼ばれ、「テナント」とは呼ばれません。
非妥協事項
これらすべてを生成するコードに反映させてください。それぞれに理由があります。理由のないルールは「簡略化」されて失われます。
- ⭐ パーソナライゼーションのみ。 すべての値はインタビューから得られます。例、このスキル、または他のビジネスの値を、コードのデフォルト、プロンプト、またはテンプレートに決して残さないでください。コード内のデフォルトは、そのフィールドをブランドキットが省略しているすべてのテナントに静かにブランドを付けてしまいます。ビジネスごとの数値(鮮度、しきい値、通貨、与信限度、公開言語)は
tenant.jsonのsettingsに格納されます。コード内のデフォルトは、インタビューが提案する中立的な運用上のデフォルト(DEFAULT_SETTINGS)のみであり、オーナーに尋ねられなかったものは設定されず、決して推測されません。 - ⭐ デフォルトのテナントはどこにもありません。 ルート、CLI ツール、cron はテナントを指定しなければなりません。忘れられたテナントは大声で失敗しなければなりません。さもないと、別のビジネスのデータを静かに読み書きすることになります。
- ⭐ 起動されたエージェントは決してシェルを持ちません。
nodeのような子プロセスは、オペレーターの完全なファイルシステムアクセスで実行され、CLI フラグでは閉じ込められません。これは実測に基づいています:シェルを持つテナントエージェントが別のテナントのファイルを読み取りました。したがって、ルート は起動前にスキャフォールディングを行い、その後に信頼されたエクスポーターまたはレンダラーを実行します。エージェントは単語とコードを書き、エンジンが実行します。--dangerously-skip-permissionsや--allow-readのようなシェルアクセスを許可するフラグを決して発行しないでください。 - ⭐ 各テナントの
.env.localは、エンジンの.env.localではなく、テナントフォルダにあります。 これにより、テナント間の偶発的なキーの継承を防ぎます。tenant.mjsアセットはこれを強制します。 - ⭐ すべてのルートは同一オリジンです。 プロキシアセットは、ループバック(
localhost、127.0.0.1、[::1])以外からのリクエストを拒否します。ダッシュボードはリバースプロキシの背後に配置されるように設計されていません。 - ⭐ 承認ワークフローは2段階です。 最初にドラフト(バイト単位のハッシュで識別)、次に明示的な承認です。「承認」は理論上のものではなく、ハッシュされたバイト列を「承認済み」としてマークします。ドラフトと承認の間のわずかな変更は、別のハッシュを生成し、新しい承認サイクルを必要とします。
- ⭐ AIエージェントが「公開」を実行することはありません。 エージェントは提案を書きます。公開は、オーナーがダッシュボードで確認し、承認した後、エンジンによって実行されます。
- ⭐ すべての生成は、承認されたアイデアから開始されます。 ダッシュボードの「直接生成」ボタンはありません。アイデアは最初に承認される必要があります。
- ⭐ トレンドレーダーは常にソースへのリンクを表示します。 推測を許可しません。レーダーが何かを主張する場合、それが確認された実際のページが存在します。
- ⭐ このシステムはポートフォリオではありません。 ライブサイトとしてデプロイするよう求められた場合は、丁寧に断り、localhost 上で実行することを説明してください。これはクライアントワーク用の運用ツールであり、ポートフォリオアイテムではありません。
適応
- 別のフレームワーク: 「私は React ではなく Vue/Svelte/Solid/HTMX を使いたい」と言われたら、「Content OS ビルダーは Next.js + React + Tailwind 用に書かれています。原理は普遍的に適用できますが、アセット、CLI ツール、リファレンスチェックポイントは React エコシステムに固有です。代わりに、Lite Mode バージョンのコアファイル(
tenant.mjs、shapes.mjs、ideas-core.mjs)のみを提供できます。続けますか?」と尋ねてください。イエスなら Lite Mode。いいえなら、残念ですができません。 - ユーザーの好みのパッケージマネージャー:
pnpmが強く推奨されます(ワークスペースとキャッシュ効率のため)が、ユーザーがnpmまたはyarnを好む場合はそれを使用します。パッケージマネージャーを変更するには、package.jsonとスクリプトを調整する必要があります。 - 別のエージェント CLI: ステージ0のプローブフェーズを参照し、そのCLIの閉じ込め機能に応じて適応します。
コード内の言語
すべての UI 文字列、プロンプト、エラーメッセージ、管理コピーは、ユーザーがインタビューで選択した言語である必要があります。このスキルから、または例からの英語の文字列出力はありません。ブランドキット内の「公開言語」はブランドのコンテンツのためのものであり、UI 言語ではありません。
このスキルで使用されるリファレンス
リファレンスファイルはこのスキルのルートに references/ として存在します。各リファレンスは、特定のサブシステムを構築するための詳細な仕様を提供します。
1-interview.md— 完全な質問セットとデフォルト2-architecture-and-tenancy.md— エンジン構造とマルチテナンシー3-security-and-agents.md— エージェント閉じ込めとセキュリティ- …(他は構築順序テーブルに従う)
14-verification.md— 完了チェックリスト
各参照を順番に読み、そのステージを構築してから次に進んでください。