원클릭으로
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 が生成される