跳轉到主要內容
跨瀏覽器擴充功能要提交到多個商店,而每個商店索取的材料幾乎相同:商店文案、權限說明、隱私揭露、審查備註和版本說明。STORE.md 慣例把這些內容全部放進專案根目錄下一個納入版本控制的檔案,重新提交時不必再從頭整理。 這個檔案還有第二個用途。支援該慣例的商店工具會在提交時讀取它:extension.dev 的 MCP 工具 extension_submit sync-listing 依據它填寫 Chrome Web Store、Firefox Add-ons、Edge Add-ons 和 Mac App Store 的商店資訊,它的商店預檢也會檢查這個檔案。只能在商店自己後台填寫的內容(Chrome 的宣傳圖塊與資料使用答卷,Edge 的標誌、圖塊和屬性,Apple 的 App 隱私權與年齡分級)仍需手動完成,檔案會在各商店小節下列出這些項目,讓你一次看到完整清單,而不是每失敗一項檢查才發現一項。
extension.dev 是 Extension.js 的贊助者,可以在同一個專案裡完成發佈、商店提交和分享。它的文件涵蓋 extension build 之後的步驟。

什麼時候建立它

在第一次提交之前、也就是剛出現發佈意圖的那一刻,就寫好 STORE.md。提交工具讀取這個檔案時是靜默的:檔案不存在時,提交會在沒有審查備註、版本說明和認證備註的情況下送出,而且不會有任何警告。這個檔案的價值在於隨著程式碼變化持續維護,而不是最後關頭匆忙補寫。圍繞它的完整提交流程請參閱發佈到瀏覽器商店。

結構

共用材料在前(先 ## Listing,再 ## Privacy and data use),接著每個商店一個 ## 小節,最後是 ## Version history。商店小節依標題文字比對,因此 ## Firefox Add-ons、## firefox-amo 和 ## AMO 都有效。Chrome、Edge 和 Safari(## Safari (Mac App Store))同理。 每一行都遵循三條讀取規則:
  • 仍以 TODO 開頭的值會被略過,不會送出。檔案只呈現缺少什麼,從不編造商店文案。
  • 清單項目只有在續行保持縮排時才會帶上這些續行。從第 0 欄開始的段落會結束該清單項目。
  • HTML 註解寫明每個欄位的格式和上限,讀取工具會把它們去掉。

Listing

每一行都來自一次失敗的檢查或一次商店拒絕,所以每一行都有固定格式。

Privacy and data use

  • - Privacy policy URL: 只寫在這裡。讀取工具會取這一行中第一個 http 或 https 地址,所以不要在 TODO 裡留範例地址。Apple 要求每個 App 都有隱私權政策,Chrome 和 Edge 在處理任何資料時也要求提供。
  • - Data collected: 列出擴充功能收集、儲存或傳送的每一類資料,或寫 none。Chrome(資料使用核取方塊和三項認證)、Edge(九個資料類別和三項認證)以及 Apple(App 隱私權,「未收集資料」)都會在各自後台再問一次同樣的問題,這一行就是答卷。
  • - Firefox data collection: 對應 manifest 中的 browser_specific_settings.gecko.data_collection_permissions。AMO 讀取的是 manifest,所以兩者必須一致。必填鍵請參閱 Firefox 商店審核的資料收集權限。

商店小節

Chrome Web Store

  • ### Single purpose:一句話,最多 1,000 個字元。
  • ### Permissions justification:manifest 要求的每個權限、主機權限和內容腳本比對各寫一個清單項目。冒號前是權限,冒號後是理由,仍以 TODO 開頭的理由不會送出。單獨一行寫明遠端程式碼的回答(Remote code: none)。Edge 的隱私權頁面會逐項問同樣的問題,並接受同樣的文字。
  • ### Test instructions:審查者要執行的步驟,需要登入時附上測試帳號。

Firefox Add-ons

  • ### Reviewer notes:先寫測試步驟,再寫審查者重新建置所用的確切工具鏈:Node 和 npm 版本、安裝與建置指令,以及輸出資料夾。對於打包過的擴充功能,Mozilla 需要可重現的建置。開啟 Firefox 原始碼封存設定後,平台會附上建置所在提交的儲存庫,因此不需要另外上傳原始碼 zip。
  • ### Release notes:這個版本真實的說明。指向其他小節的文字會原樣到達 AMO。

Edge Add-ons

  • ### Certification notes:認證團隊測試擴充功能所需的內容。大多數情況下 Firefox 審查備註同樣適用:直接貼上,而不是寫一句指向它。
  • 擴充功能套件裡不能有任何壓縮檔。Partner Center 會拒絕套件內的任何 .gz、.zip 或其他封存檔,所以這類資源要以未壓縮形式放入。
  • ### Dashboard checklist:發佈 API 無法設定、需要在 Partner Center 填寫一次的內容:300x300 商店標誌、440x280 和 1400x560 宣傳圖塊、屬性頁上關於個人資訊和成人內容的回答、隱私權頁上的類別與認證,以及選用的 YouTube URL。

Safari (Mac App Store)

  • - Bundle identifier: 在第一個建置到達 App Store Connect 後就不能再改。
  • - Review contact name:、- Review contact email: 和 - Review contact phone: 是 App 審查的聯絡人。
  • ### Reviewer notes:如何在 Safari 設定裡啟用擴充功能,以及測試帳號。
  • ### Release notes:即「新功能」,從第二個版本起必填。
  • ### Age rating:每個問題一個清單項目,除非另有說明都寫 none。Apple 的問卷還會問家長監護、年齡驗證、不受限制的網頁存取、使用者產生的內容、社群媒體、訊息、廣告和戰利品箱,推送時會送出完整的一組回答。
  • App 隱私權,以及目前的年齡分級和全部 175 個地區的上架範圍,都要在 App Store Connect 裡手動確認。
  • 在本機執行轉換後的 App:npx extension build --browser safari --bundle-id <id> --development-team <TEAM>。沒有團隊的臨時簽署建置在 Safari 重新啟動後就不再回應。

Version history

每個版本、每次商店提交寫一行,附上結果,最新的在最前面:0.1.0: Chrome draft uploaded 2026-10-21, AMO upload refused 401 bad key pair, Edge draft pending。商店拒絕及其修正也寫在這裡,下次提交就不會重蹈覆轍。

每個商店讀取什麼

sync-listing 把下列欄位送給各商店,並回答哪些有變化、商店資訊還缺什麼。超出上限或格式不符合商店要求(地址、http 或 https URL)的欄位,會連同需要修改的 STORE.md 行一起指出。 推送到 Safari 時還會從 Safari 小節讀取副標題、Bundle 識別碼、審查聯絡人、版本說明和年齡分級清單項目。Chrome Web Store 小節與代理工具期望在 CHROMEWEBSTORE.md 檔案裡找到的小節一致,所以尋找這些小節的代理可以在這裡找到它們。

範本中的初始檔案

每個 Extension.js 範本都附有一個依據自身 manifest 產生的初始 STORE.md:每個權限、主機權限和內容腳本比對各有一個 TODO reason 清單項目,Firefox 資料收集行從 manifest 讀取,其餘事實都標為 TODO。extension create 會把專案名稱寫到 Name 行,把建立日期寫到 Last updated:。從範本建立專案,第一個提交裡就已具備這套慣例:

保持最新

在讓 STORE.md 過時的同一次變更裡更新它:
  • manifest 變了(permissions、host_permissions、content_scripts):為每一項新增或重新檢視說明清單項目。每個權限都需要一個具體、直白的理由。「擴充功能運作所需」在所有商店都過不了審查。
  • 面向使用者的行為變了:更新商店文案和螢幕截圖。
  • 新版本:新增一行版本歷史,並重寫 Firefox 和 App Store 的版本說明。
  • 資料處理方式變了:同時更新隱私小節、它連結的政策,以及 manifest 中 Firefox 的 data_collection_permissions 宣告。三者必須一致。
  • 商店拒絕:在版本歷史裡記下原因和修正,下次提交就不會重蹈覆轍。

衛生習慣

  • 用 git 追蹤這個檔案。它是專案的一部分,不是草稿。
  • 不要把它打包進擴充功能 zip。正式建置只打包 dist/<browser>/,所以根目錄下的 STORE.md 永遠不會送到使用者手上。
  • 永遠不要在裡面放真實使用者的憑證。審查用的測試帳號本來就是拋棄式的。