ReadAware

建置外掛

從公開的 TypeScript 範本開始,宣告最小的能力集合,並在 ReadAware 桌面應用程式中執行建置後的套件。宿主負責生命週期、權限、呈現和回復;外掛負責自己的行為和私有資料。

前置條件

  • ReadAware 桌面應用程式,並可存取「設定 → 外掛」。
  • Bun,用於執行儲存庫指令碼。
  • readaware-plugins 儲存庫的複本或 fork。

建立套件

  1. template/ 複製到 plugins/<your-plugin-id>/
  2. 保持資料夾名稱、manifest 的 id 和執行階段命名空間完全一致。
  3. 編輯 manifest.jsonsrc/main.ts
  4. 刪除不使用的範本貢獻,並移除對應權限。
  5. 建置 ReadAware 將載入的自包含 main.js
bash
bun run build
bun run typecheck
bun test
bun run validate

先設計 manifest,再實作

依照以下順序檢查 manifest:

  1. 身分:穩定 ID、名稱、套件版本、作者和最低應用程式版本。
  2. 資料:正整數 schemaVersion 和遷移路徑。
  3. 相容性:為每個使用的 API 和 schema 在 requires 中寫入 semver 範圍。
  4. 授權:語意 permissions 和精確的 settingsAccess 授權。
  5. 宣告:設定、排程任務、主題、字型和進入模組。

安裝前使用能力瀏覽器和權限預覽。要求是相容性宣告,不是使用者授權;即使能力不需要權限,只要外掛依賴其契約,也必須寫入 requires

選擇正確的能力

  1. ReadAware 擁有某種狀態或行為時,使用領域
  2. 提供選擇、動作或供應商時,使用貢獻
  3. 需要受限的宿主操作時,使用服務
  4. 外掛儲存只用於外掛擁有的資料。
  5. 現有形態都不合適時,請求新的型別化宿主能力。

不要把書籍、進度、標註、設定或記憶複製到外掛儲存。影子狀態會繞過產品不變條件、已提交事件、投影重建、同步語意和助理上下文。

讓啟用保持宣告式

activate(ctx) 期間檢查環境,並註冊動作、命令、供應商、訂閱和排程任務。不要執行業務寫入或外部工作。宿主會一直暫存每項註冊,直到啟用 RPC 完成且 Worker 回覆健康檢查。

晉升後,從已註冊的處理常式啟動執行階段工作。如果處理常式回傳 promise,讓宿主顯示載入和失敗狀態。只有在可選的 deactivate() 必須關閉外部資源時,才保留這些資源的參照;宿主註冊和訂閱會自動釋放。

明確為私有資料建立版本

schemaVersion 為外掛 KV 和文件集合建立版本;它獨立於套件版本。只有私有資料形態改變時才修改它。在 schema 提交後,為每個支援的升級和降級匯出 migrate(storageCtx, change)

  • 遷移只能接收儲存:不能使用領域、設定、金鑰、網路、UI、LLM 或貢獻。
  • 讓每次轉換都具備確定性和冪等性。
  • 測試部分寫入後發生失敗的情況;宿主必須精確恢復 KV、文件、檔案和 schema 中繼資料。
  • 不要用套件版本檢查取代資料 schema。

安裝工作資料夾

  1. 執行建置和檢查。
  2. 開啟 ReadAware → 設定 → 外掛 → 安裝外掛。
  3. 選擇建置出的外掛資料夾並檢查同意摘要。
  4. 在桌面應用程式中執行實際功能。
  5. 重新建置並安裝,以測試更新。

一般瀏覽器無法驗證外掛安裝、Worker IPC、SQLite 持久性、原始書籍存取、閱讀器整合或回復。請測試用於發佈的 Tauri 應用程式。

測試生命週期,而不只是成功路徑

  • 全新安裝、啟用、停用,以及不重新啟動應用程式再次啟用。
  • 使用真實資料完成成功更新和降級。
  • 啟用逾時、處理常式拒絕、遷移失敗和精確回復。
  • 解除安裝清理:不殘留動作、監聽器、排程、供應商或 Worker。
  • 更新期間移除權限和擴充權限。
  • 長標籤、空狀態、鍵盤導覽和所有宿主主題。

了解目前限制

ReadAware 開啟期間,排程任務至少按宣告的頻率執行,逾期時會在啟動時補執行。它們不是持久任務:應用程式關閉時不會執行,沒有持久佇列、重試/退避契約或當機恢復保證。

UI 只在現有的型別化貢獻點可用。缺少掛載位置時,需要宿主持有的貢獻點和消費者;不會為了走捷徑加入任意 HTML 或通用原生 invoke API。

下一步

API 參考放在編輯器旁邊,然後在準備註冊表 pull request 前閱讀發佈外掛