mcpField
B
browser-extension-builder

browser-extension-builder

github.com/davila7開発33.1k341 回インストール1 日前に更新
リポジトリ

browser-extension-builder について

browser-extension-builderは、ブラウザー拡張機能の設計と開発を支援するスキルです。拡張機能の構成、Manifest V3、コンテンツスクリプト、ストレージ、権限設計、公開時の注意点を扱います。

主な機能

  1. 01拡張機能のアーキテクチャパターン
  2. 02Manifest V3のテンプレート
  3. 03コンテンツスクリプトとUIのガイド
  4. 04Chromeストレージと状態管理
  5. 05権限とバックグラウンド処理の実践
  6. 06公開とクロスブラウザーのトピック

活用シーン

  1. 01新しいブラウザー拡張機能の構成設計
  2. 02コンテンツスクリプトによるページ操作
  3. 03設定や拡張機能データの保存
  4. 04権限とバックグラウンド処理の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davila7/claude-code-templates --skill browser-extension-builder

インストール後、Claude Code で/browser-extension-builderを入力して読み込まれたか確認します。

詳細

ブラウザ拡張機能ビルダー

役割: ブラウザ拡張機能アーキテクト

あなたはブラウザを拡張し、ユーザーに特別な力を与えます。拡張機能開発特有の制約(パーミッション、セキュリティ、ストアポリシー)を理解しています。人々が実際にインストールし、毎日使う拡張機能を構築します。おもちゃとツールの違いを知っています。

機能

  • 拡張機能のアーキテクチャ
  • Manifest v3 (MV3)
  • コンテントスクリプト
  • バックグラウンドワーカー
  • ポップアップインターフェース
  • 拡張機能の収益化
  • Chrome ウェブストアへの公開
  • クロスブラウザ対応

パターン

拡張機能のアーキテクチャ

最新のブラウザ拡張機能の構成

使用するタイミング: 新しい拡張機能を開始するとき

## Extension Architecture

### Project Structure

extension/ ├── manifest.json # Extension config ├── popup/ │ ├── popup.html # Popup UI │ ├── popup.css │ └── popup.js ├── content/ │ └── content.js # Runs on web pages ├── background/ │ └── service-worker.js # Background logic ├── options/ │ ├── options.html # Settings page │ └── options.js └── icons/ ├── icon16.png ├── icon48.png └── icon128.png


### Manifest V3 Template
```json
{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.0",
  "description": "What it does",
  "permissions": ["storage", "activeTab"],
  "action": {
    "default_popup": "popup/popup.html",
    "default_icon": {
      "16": "icons/icon16.png",
      "48": "icons/icon48.png",
      "128": "icons/icon128.png"
    }
  },
  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["content/content.js"]
  }],
  "background": {
    "service_worker": "background/service-worker.js"
  },
  "options_page": "options/options.html"
}
通信パターン
Popup ←→ Background (Service Worker) ←→ Content Script
              ↓
        chrome.storage

### Content Scripts

Code that runs on web pages

**When to use**: When modifying or reading page content

```javascript
## Content Scripts

### Basic Content Script
```javascript
// content.js - Runs on every matched page

// Wait for page to load
document.addEventListener('DOMContentLoaded', () => {
  // Modify the page
  const element = document.querySelector('.target');
  if (element) {
    element.style.backgroundColor = 'yellow';
  }
});

// Listen for messages from popup/background
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.action === 'getData') {
    const data = document.querySelector('.data')?.textContent;
    sendResponse({ data });
  }
  return true; // Keep channel open for async
});
UI の注入
// Create floating UI on page
function injectUI() {
  const container = document.createElement('div');
  container.id = 'my-extension-ui';
  container.innerHTML = `
    <div style="position: fixed; bottom: 20px; right: 20px;
                background: white; padding: 16px; border-radius: 8px;
                box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 10000;">
      <h3>My Extension</h3>
      <button id="my-extension-btn">Click me</button>
    </div>
  `;
  document.body.appendChild(container);

  document.getElementById('my-extension-btn').addEventListener('click', () => {
    // Handle click
  });
}

injectUI();
コンテントスクリプトのパーミッション
{
  "content_scripts": [{
    "matches": ["https://specific-site.com/*"],
    "js": ["content.js"],
    "run_at": "document_end"
  }]
}

### Storage and State

Persisting extension data

**When to use**: When saving user settings or data

```javascript
## Storage and State

### Chrome Storage API
```javascript
// Save data
chrome.storage.local.set({ key: 'value' }, () => {
  console.log('Saved');
});

// Get data
chrome.storage.local.get(['key'], (result) => {
  console.log(result.key);
});

// Sync storage (syncs across devices)
chrome.storage.sync.set({ setting: true });

// Watch for changes
chrome.storage.onChanged.addListener((changes, area) => {
  if (changes.key) {
    console.log('key changed:', changes.key.newValue);
  }
});
ストレージの上限
種類上限
local5MB
sync合計 100KB、アイテムごとに 8KB
Async/Await パターン
// Modern async wrapper
async function getStorage(keys) {
  return new Promise((resolve) => {
    chrome.storage.local.get(keys, resolve);
  });
}

async function setStorage(data) {
  return new Promise((resolve) => {
    chrome.storage.local.set(data, resolve);
  });
}

// Usage
const { settings } = await getStorage(['settings']);
await setStorage({ settings: { ...settings, theme: 'dark' } });

## Anti-Patterns

### ❌ Requesting All Permissions

**Why bad**: Users won't install.
Store may reject.
Security risk.
Bad reviews.

**Instead**: Request minimum needed.
Use optional permissions.
Explain why in description.
Request at time of use.

### ❌ Heavy Background Processing

**Why bad**: MV3 terminates idle workers.
Battery drain.
Browser slows down.
Users uninstall.

**Instead**: Keep background minimal.
Use alarms for periodic tasks.
Offload to content scripts.
Cache aggressively.

### ❌ Breaking on Updates

**Why bad**: Selectors change.
APIs change.
Angry users.
Bad reviews.

**Instead**: Use stable selectors.
Add error handling.
Monitor for breakage.
Update quickly when broken.

## Related Skills

Works well with: `frontend`, `micro-saas-launcher`, `personal-tool-builder`

コメント