ワンクリックで
browser-extension
ブラウザ拡張機能の作成から Web ストア公開までをガイドする。プロジェクト初期化、多言語対応、アセット自動生成、ZIP 作成を含む。「拡張機能を作りたい」「ストアに公開」などのリクエストで使用する。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
ブラウザ拡張機能の作成から Web ストア公開までをガイドする。プロジェクト初期化、多言語対応、アセット自動生成、ZIP 作成を含む。「拡張機能を作りたい」「ストアに公開」などのリクエストで使用する。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
写真に写っている人物の顔を検出してぼかし、匿名化した画像を作成する。YuNet による 2 パス顔検出、ガウスぼかし、拡大クロップでの目視検証、取りこぼしの手動追いぼかしまでのワークフロー。「顔をぼかして」「顔にモザイク」「写真の顔を隠して」「人物を匿名化して」などのリクエストで使用する。
Analyze X creator subscription accounts through X's authenticated internal Web API. Use when asked to collect subscriber counts, subscription-only post counts, monthly prices, estimated gross monthly revenue, rankings, or summary statistics for X Subscriptions, including the user's managed set of subscribed creators.
X(Twitter)上の公開情報を検索し、投稿、アカウント、スレッド、最近の話題、評判、反応を根拠となる x.com URL 付きで調査する。「X で検索して」「X でこの投稿やアカウントを探して」「X で最近何が話題?」「X 上の反応や評判を調べて」などで使用する。投稿、返信、引用、いいね、フォロー、ブロック、ミュート、報告、削除などの書き込み操作や、指定された X URL またはログイン済み X 画面そのものを開いて閲覧・確認する依頼には使用しない。
chrome-devtools MCP でログイン済み Chrome を使い、X (Twitter) の内部 Web API (api.x.com / i/api) を fetch で呼んで一括操作する。ブロック解除、ブロック、ミュート、フォロー解除などをまとめて処理したいときに使う。X のレートリミット (短い窓あたり約 10 件) の回避方法を含む。「X で全員ブロック解除して」「まとめてミュート」「一括でフォロー解除」などのリクエストで使用する。
Check Luma event guests against X profile, follow, mutual-follow, affiliation, and recent-account-activity requirements. Use when Codex needs to review a Luma event guest table, extract pending guests and X profile links, identify missing/invalid/deleted/protected X accounts, use X relationship lookup to verify whether guests follow the logged-in organizer account, check whether candidates have posted from their own X account within the last month excluding repost-only activity using read-only internal APIs, prioritize mutual follows before followed-by-only candidates, check whether a specific X handle registered and what current Luma status it has, manage X rate limits without causing 429s, and report decline or approval-support candidates without ever performing approve, decline, or other guest write actions.
Archive only the current Codex App thread when the user invokes /archive or $archive to finish the current thread. Use the Codex App thread archive tool without passing a thread id so no other thread is archived.
| name | browser-extension |
| description | ブラウザ拡張機能の作成から Web ストア公開までをガイドする。プロジェクト初期化、多言語対応、アセット自動生成、ZIP 作成を含む。「拡張機能を作りたい」「ストアに公開」などのリクエストで使用する。 |
ブラウザ拡張機能の作成から Web ストア公開までをガイドする。
npm create wxt@latest my-extension
cd my-extension
npm install
my-extension/
├── entrypoints/
│ ├── background.ts
│ ├── content.ts
│ └── popup/
│ ├── index.html
│ └── main.ts
├── public/
│ ├── icons/
│ └── _locales/
├── wxt.config.ts
└── package.json
import { defineConfig } from "wxt";
export default defineConfig({
// WXT デフォルトの .output は隠しフォルダで Chrome のファイル選択ダイアログから選べないため
outDir: "dist",
manifest: {
name: "__MSG_extName__",
description: "__MSG_extDescription__",
default_locale: "en",
permissions: [],
icons: {
16: "icons/icon16.png",
48: "icons/icon48.png",
128: "icons/icon128.png",
},
},
});
| ファイル | 用途 |
|---|---|
background.ts | Service Worker |
content.ts | Content Script |
popup/ | ポップアップ UI |
options/ | オプションページ |
各エントリーポイントは export default defineBackground() や export default defineContentScript() で定義する。
npm run dev
開発中は常に npm run dev をバックグラウンドタスクとして実行する。HMR(Hot Module Replacement)でコード変更が自動反映される。
chrome://extensions で「パッケージ化されていない拡張機能を読み込む」から dist/chrome-mv3 を選択。
npm run build
出力先: dist/chrome-mv3/
public/_locales/en/messages.json と public/_locales/ja/messages.json を作成。
assets/messages-en.json と assets/messages-ja.json をテンプレートとして使用。
1 つのプライバシーポリシーで全拡張機能をカバー可能。拡張機能ごとに作成する必要はない。
| ホスティング方法 | 匿名性 | 備考 |
|---|---|---|
| FreePrivacyPolicy.com | ◎ | 無料ホスティング付き |
| GitHub Gist | × | アカウント紐付け |
| GitHub Pages | × | アカウント紐付け |
匿名でホストしたい場合は FreePrivacyPolicy.com を使用。
データ収集がない場合は「データを収集しません」と明記するだけで十分。assets/privacy-policy-template.md を参照。
store-assets/STORE_SUBMISSION.md を作成。assets/store-submission-template.md を参照。
Dashboard で入力するテキストを事前に準備:
| 種類 | サイズ | 必須 |
|---|---|---|
| スクリーンショット | 1280x800 | 最低 1 枚 |
| プロモーション画像(小) | 440x280 | 必須 |
| アイコン | 128x128 | manifest に含む |
画像から Chrome 拡張機能用のアイコン (16x16, 32x32, 48x48, 128x128) を生成する。アイコンをゼロからデザインする場合は references/icon-design.md を参照。
INPUT="input.png"
OUTPUT_DIR="public/icons"
mkdir -p "$OUTPUT_DIR"
magick "$INPUT" \
-fuzz 10% \
-fill none \
-draw "color 0,0 floodfill" \
-draw "color %[fx:w-1],0 floodfill" \
-draw "color 0,%[fx:h-1] floodfill" \
-draw "color %[fx:w-1],%[fx:h-1] floodfill" \
-trim +repage \
temp_trimmed.png
magick temp_trimmed.png -resize 16x16 "$OUTPUT_DIR/icon16.png"
magick temp_trimmed.png -resize 32x32 "$OUTPUT_DIR/icon32.png"
magick temp_trimmed.png -resize 48x48 "$OUTPUT_DIR/icon48.png"
magick temp_trimmed.png -resize 128x128 "$OUTPUT_DIR/icon128.png"
rm temp_trimmed.png
-fuzz 10% は背景色の許容範囲。背景が均一でない場合は値を調整。
Chrome Web Store では透明背景の PNG が黒く表示される。ショップアイコン用に白背景バージョンを作成する:
magick public/icons/icon128.png -background white -flatten -resize 128x128 public/icons/icon128-store.png
icon128-store.png は ZIP には含めず、ダッシュボードの「ショップアイコン」に手動でアップロードする。拡張機能本体のアイコン(ツールバー表示)は透明のままで良い。
Puppeteer を使って 440x280 のプロモーション画像を自動生成できる。
npm install -D puppeteer
assets/generate-promo-image.mjs を scripts/ にコピーし、package.json に追加:
{
"scripts": {
"generate:promo": "node scripts/generate-promo-image.mjs"
}
}
実行:
npm run generate:promo
出力先: store-assets/promo-small.png
Puppeteer で拡張機能をロードし、Chrome Web Store 用スクリーンショット(1280x800)を自動生成できる。
assets/generate-screenshots.mjs を scripts/ にコピーし、package.json に追加:
{
"scripts": {
"generate:screenshots": "node scripts/generate-screenshots.mjs"
}
}
実行:
npm run generate:screenshots
出力先: store-assets/
技術的な特徴:
headless: "new" モードで完全バックグラウンド動作(Chrome ウィンドウが表示されない)カスタマイズ例(複数状態の撮影):
const states = [
{ name: "01-initial", state: "initial" },
{ name: "02-loading", state: "loading" },
{ name: "03-completed", state: "completed" },
];
for (const { name, state } of states) {
const popupPage = await browser.newPage();
await popupPage.goto(popupUrl, { waitUntil: "networkidle2" });
await popupPage.evaluate((s) => {
// DOM を操作して各状態を再現
}, state);
const popupScreenshot = await popupPage.screenshot({ encoding: "base64" });
await popupPage.close();
const wrapperPage = await browser.newPage();
await wrapperPage.setViewport({ width: 1280, height: 800 });
const html = createWrapperHtml(popupScreenshot, "Title", "Description");
await wrapperPage.setContent(html);
await wrapperPage.screenshot({ path: `${name}.png` });
await wrapperPage.close();
}
npm run zip
初回公開後は CLI で自動化可能:
npm install -D chrome-webstore-upload-cli
詳細は references/automation.md を参照。
WXT の auto-import は ContentScriptContext を const(値)として登録する。型アノテーションには InstanceType<typeof ContentScriptContext> を使う:
export default defineContentScript({
async main(ctx: InstanceType<typeof ContentScriptContext>) {
拡張機能の更新時、古い content script が Chrome API を呼ぶと Extension context invalidated エラーが発生する。ctx を使ってリスナーのライフサイクルを管理する:
ctx.addEventListener(target, event, handler): context 無効化時に自動解除ctx.onInvalidated(callback): chrome.storage.onChanged など Chrome API リスナーの手動解除に使用ctx.isInvalid: 非同期処理の各 await 後にガードとして使用ctx.addEventListener(document, "keydown", handler) のハンドラは DocumentEventMap 全体の union 型が推論される。KeyboardEvent に絞り込まれないため、ハンドラ内でキャストが必要:
ctx.addEventListener(document, "keydown", async (_e) => {
const e = _e as KeyboardEvent;
use_dynamic_url: true を付ける。拡張機能のインストール有無を外部サイトから推測されるフィンガープリンティングを防ぐ。
web_accessible_resources: [
{
matches: ["<all_urls>"],
resources: ["inject.js"],
use_dynamic_url: true,
},
],
content script から inject script へ postMessage で MessagePort を渡す場合:
crypto.randomUUID()) を生成し、埋め込みコンフィグ経由で inject script に渡すevent.source === window と nonce の一致を検証するruntime.onMessage をページに転送する場合、メッセージタイプをホワイトリストでフィルタするchrome.storage への書き込みを中継する場合、キーをホワイトリストで制限するnew RegExp() を生成しない(ReDoS リスク).includes() ではなく完全一致を使うnpm run build が通るpublic/_locales/ に en と ja の messages.json があるnpm run generate:screenshots で生成可能)npm run generate:promo で生成可能)npm run zip で ZIP が生成される