ビルドとリリース
ローカルビルド
bun install
bun run buildビルドチェーン:
bun run build:injected(build-scripts/build-injected.mjs):esbuild がsrc/injected/page-detector.tsとpage-source-search.tsをそれぞれ独立した IIFE ファイルにコンパイルし、public/injected/に出力vite build(@crxjs/vite-plugin):background / popup / settings / help の 4 つのエントリーポイントをバンドルし、dist/に出力precompileRulesPlugin(vite plugin の closeBundle フック):dist/rules/*.jsonをスキャンし、各 leaf rule に__hints/__legacyHints/__keywordCombinedを注入minifyJsonAssets(vite plugin の closeBundle フック):すべての JSON をJSON.stringify(parsed)で書き直してインデントと改行を削除
最終的な dist/ は chrome://extensions/ のデベロッパーモードで直接読み込めます。
開発ホットリロード
bun run devVite dev サーバー + crxjs HMR:src/ui/** の popup / settings / help を変更すると自動でホットリプレースされます。src/background/** のバックグラウンドコードや src/content/** のコンテンツスクリプトを変更した後は、chrome://extensions/ で拡張機能カードの更新ボタンをクリックして再読み込みが必要です。
型チェックと lint
bun run typecheck # vue-tsc --noEmit、プロジェクト全体の厳密な型チェック
bun run lint # eslint srcコミット前に全体のフォーマットを統一:
npx prettier --write .バージョン番号の管理
package.json の version フィールドが真のソースです。@crxjs/vite-plugin がそれを自動的に dist/manifest.json に同期します。
通常の機能・ルール・修正の変更はパッチを増分します。パッチが 99 に達したら次の minor に進み、1.1.100 のようなバージョン番号は使用しません:
# 1.1.98 -> 1.1.99
# 1.1.99 -> 1.2.0インストールパッケージを公開する必要があるバージョンのみ GitHub Release を作成します:x.y.0・x.y.10・x.y.20・...・x.y.90。例えば 1.2.0・1.2.10 は公開し、1.2.5・1.2.15 は公開しません。
# package.json のバージョンを変更した後
git add package.json
git commit -m "chore: bump 1.2.10"
git push origin mainGitHub Release ワークフロー
.github/workflows/release-extension.yml は 2 つのケースでトリガーされます:
- GitHub UI で release を公開する(
release: publishedイベント) - Actions ページでワークフローを手動実行する(オプションで release_tag の input を渡せる)
ワークフローが行うこと:
- checkout + bun + Node 20 のインストール
bun install --frozen-lockfilebun run builddist/manifest.jsonから version を読み取り、release タグと一致することを確認dist/全体をstackprism-v{ver}.zip+ sha256 に圧縮- secret
EXTENSION_PRIVATE_KEYが設定されている場合、npx crx3でstackprism-v{ver}.crx+ sha256 を署名して生成。設定されていない場合は crx をスキップして zip のみ gh release upload --clobberですべての成果物を release タグにアップロードactions/upload-artifactでアーティファクトとして同時にバックアップ
リリースノート
リリースノートは前の release タグから現在のコミットまでの git log --oneline vPREV..HEAD を整理して作成します。コミットリストをそのまま貼り付けません。ユーザーが理解できる方向で分類して記述します。例:
- ルールの強化
- ポップアップと設定ページ
- ドキュメントサイト
- ビルドとリリースフロー
リリースノートにはユーザーまたはメンテナーが関心を持つ変更のみを記述し、ローカルで実行したフォーマット・型チェック・lint・ビルドコマンドは記述しません。
CRX 署名キー
初回リリース前に RSA 秘密鍵を生成し、GitHub リポジトリの secrets に設定する必要があります。
秘密鍵の生成
openssl genrsa -out extension.pem 2048WARNING
extension.pem は絶対に紛失してはいけません — 紛失して再生成すると拡張機能の ID が変わります(Chrome が別の拡張機能として扱います)。ローカルにバックアップを保存してください。
GitHub への設定
- リポジトリの Settings → Secrets and variables → Actions → New repository secret
- Name:
EXTENSION_PRIVATE_KEY - Secret:
extension.pemファイルの内容全体(-----BEGIN PRIVATE KEY-----と-----END PRIVATE KEY-----を含む)を貼り付ける - 保存
以降のワークフローはこのキーを使って crx に自動署名します。
設定しない場合
ワークフローは引き続き実行できますが、成果物に .crx ファイルが含まれません。ユーザーは zip を解凍して読み込む方法のみ使用できます。
リリースチェックリスト
- [ ]
npx prettier --write .を実行済み - [ ]
bun run typecheckが通過 - [ ]
bun run lintが通過 - [ ]
bun run buildが通過 - [ ] Chrome で
dist/を読み込んで主要なパスを手動テスト(ポップアップを開く・サイトを検出・更新・完全な技術スタックレポートのコピー・設定ページでルールを追加) - [ ]
package.jsonの version を bump - [ ] git commit + push
- [ ] バージョンが release ノードに該当する場合、GitHub UI で release を公開(タグは
v{version}、package.json と一致させる) - [ ] リリースワークフローが完了するのを待ち、release の assets に zip / crx と sha256 があることを確認
Chrome Web Store への公開
ワークフローは Chrome Web Store への自動公開は行いません。CWS の publish API は OAuth2 フローが必要なため、現在は手動操作です:
dist/フォルダーを zip に圧縮する(ワークフローの zip 成果物と同じ)- Chrome Web Store デベロッパーダッシュボード → 新しいバージョンをアップロード
- 変更内容を記入し、審査を待つ(通常 1〜3 営業日)