release: 合併 develop 開發成果至 main(看板、介入提醒、Copilot hook、計費統計等) - #26
Merged
Conversation
- 在 PlansSpecsView 中新增對讀取 OpenSpec 檔案的支持,讓使用者可以查看具有載入狀態的變更工件(提案、設計、任務)。 - 更新 ProjectView 以支援新的 OpenSpec 檔案讀取功能和會話活動狀態。 - 在 SessionCard 中引入啟動器選項,以改善工具訪問,包括終端、Copilot、OpenCode 等。 - 改進 SessionStatsPanel 中的會話統計資料顯示,採用網格佈局,提高可讀性。 - 改進 SettingsView 以管理提供者集成,包括安裝、更新和路徑管理作業。 - 為新功能添加了英文和繁體中文本地化支援。 - 擴展了類型定義,以包含會話活動狀態和工具可用性。
1. 新增看板(Kanban)視圖,支援依狀態分類管理 session 2. 新增多 IDE 啟動器,支援 Copilot、OpenCode、Gemini、終端、檔案總管等工具開啟 3. 看板視圖依專案分組顯示 session,預設每組顯示最近 3 筆,支援點擊進入專案頁面 4. 新增工具可用性檢測,無法使用的工具在選單中顯示為停用狀態 5. 新增看板欄位寬度調整功能,並記憶寬度設定 6. 完成欄位預設顯示 10 筆,支援手動載入更多 docs: 1. 同步 delta spec 至主規格目錄,新增 dashboard-kanban、multi-ide-launcher、session-activity-status、terminal-focus、openspec-content-viewer 規格 2. 歸檔 dashboard-kanban-session-monitor 變更至 openspec/changes/archive/ Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Use saturating_duration_since() instead of duration_since() in Instant comparisons to prevent panics when timestamps are in the future - Add overflow checks when subtracting future timestamps from current time in activity status calculations - Fix Instant::elapsed() overflow by using saturating_duration_since with explicit now calculation - Apply fixes to provider refresh dedup logic and OpenCode/Copilot activity status queries Note: Startup crash still occurring due to potential system time or dependency issue - further investigation needed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- 為 SessionCard 和 ProjectCard 新增了新的啟動選單覆蓋層,並採用固定定位,確保其顯示在所有其他元素之上。 - 實現了點擊外部檢測功能,點擊選單外部時自動關閉選單。 - 增強了狀態管理,確保一次只能開啟一個選單,防止多個選單同時顯示。 - 更新了樣式和元件結構以支援新功能,包括使用 React Portal 渲染選單。 - 重構了相關元件(SessionCard、KanbanProjectCard、DashboardView、ProjectView),以適應新的選單行為和狀態管理。
1. 修正 opencode plugin event hook 格式,使用正確的 @opencode-ai/sdk Event 類型 2. 升級 PROVIDER_INTEGRATION_VERSION 至 2 feat: 1. 新增啟動時偵測 provider 整合版本是否過期,未安裝或過舊時顯示一次性 warning toast 2. 在設定頁顯示插件狀態(up_to_date / outdated / missing) docs: 1. 新增 plugin-install-ui、plugin-installer、plugin-version-check 規格文件 2. 修改 provider-integration 規格,加入版本偵測需求 3. 將 session-cache-sqlite-migration 功能文件移至 archive 目錄
1. 新增 Copilot modelMetrics 解析與計費點數統計 2. 從 session.shutdown 事件擷取各 model 的 requests cost(支援小數點)與 token 用量 3. 在 SQLite session_stats 表新增 model_metrics TEXT 欄位存儲 modelMetrics JSON 4. 新增 SessionStatsPanel 計費點數顯示區塊,支援跨 session 累計統計 5. 新增 copilot-model-metrics spec 與前端 ModelMetricsEntry 型別定義 6. 修復 OpenCode session 路徑導向問題,支援 JSON 檔案路徑自動推導與 storage 目錄驗證 7. 歸檔 opencode-session-metrics change 至 2026-04-17-opencode-session-metrics
1. 將 PlansSpecsView 重構為左右雙面板 Explorer 佈局(新增 ExplorerTree、ContentViewer 元件與 buildTree 工具函式)
2. Explorer 左側面板支援可折疊、可拖曳調整寬度
3. SettingsView 新增語言切換下拉選單(從 Sidebar popover 移入設定頁)
4. 新增 TreeNode 型別定義與 i18n 翻譯 key(plansSpecs.explorer.*)
fix:
1. 修正 archived changes 文件路徑錯誤(應使用 changes/archive/{name}/ 前綴,而非 changes/{name}/)
2. 修正 PlansSpecsView Resize 拖曳時 document listener 在元件卸載後未清除的問題
3. 修正 buildTree section label 硬編碼英文字串繞過 i18n
4. 修正 PlansSpecsView Explorer 標題硬編碼未使用 t()
refactor:
1. Sidebar 移除語言切換 popover 及相關狀態
2. Sidebar 品牌圖示更正為 SH
style:
1. App.css 調整 kanban-board、workspace、dashboard 佈局 padding 與 gap
2. 將單行 CSS 規則展開為多行格式
docs:
1. 新增 openspec-explorer-layout 規格文件並歸檔至 changes/archive
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1. 新增 AI 介入通知功能,支援多種觸發場景(等待、回應結束、授權需求) 2. 新增 Session 結束通知場景(可個別開啟/關閉) 3. 前端支援通知點擊導航至對應 session 分頁 fix: 1. 移除 Hook 腳本中的 WinRT Toast(避免時機錯誤和內容不符) 2. 清除 7 個 Rust 編譯警告(unused imports、dead code) refactor: 1. 調整 Provider integration 排版為垂直單欄(設定/plugin 路徑各自獨立一行) 2. Settings 版面改為左右並排(一般設定 + 平台整合管理) 3. 將「Provider integration」翻譯為「平台整合管理」 chore: 1. 新增 version 同步腳本(package.json → Cargo.toml) 2. 移除 tauri.conf.json 中 version 欄位(改由 package.json 統一管理) 3. 新增 openspec 完整設計文件與規格
1. 實作 Copilot hook 全事件監聽(6 個事件:sessionStart、sessionEnd、userPromptSubmitted、preToolUse、postToolUse、errorOccurred) 2. 新增 plugin 版本號追蹤,ProviderIntegrationStatus 加 installed_version 欄位 3. 前端 Settings 頁面新增版本號 badge 與版本欄位展示 fix: 1. 修復 session card 與平台整合管理中 badge 文字垂直置中對齊問題 2. 調整 CSS 容器 align-items 與 badge 元素 line-height 設定 refactor: 1. 重構 Copilot hook 渲染為泛型函式 render_copilot_hook_ps,減少重複程式碼 2. 補全 lib.rs 測試 use 導入,修復 refactoring 後遺漏的 test 函式參考 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
# Conflicts: # .gitignore # .opencode/package-lock.json # openspec/changes/archive/2026-04-21-openspec-explorer-layout/specs/plans-specs-explorer-layout/spec.md # openspec/specs/app-settings/spec.md # openspec/specs/dashboard-kanban/spec.md # openspec/specs/dashboard/spec.md # openspec/specs/multi-ide-launcher/spec.md # openspec/specs/openspec-content-viewer/spec.md # openspec/specs/openspec-reader/spec.md # openspec/specs/plans-specs-explorer-layout/spec.md # openspec/specs/provider-integration/spec.md # openspec/specs/session-stats/spec.md # package.json # src-tauri/Cargo.lock # src-tauri/Cargo.toml # src-tauri/src/activity.rs # src-tauri/src/commands/mod.rs # src-tauri/src/commands/notifications.rs # src-tauri/src/commands/provider.rs # src-tauri/src/commands/sessions.rs # src-tauri/src/commands/settings.rs # src-tauri/src/commands/tools.rs # src-tauri/src/db.rs # src-tauri/src/lib.rs # src-tauri/src/openspec_scan.rs # src-tauri/src/platform/win32_focus.rs # src-tauri/src/provider/bridge.rs # src-tauri/src/provider/copilot.rs # src-tauri/src/provider/mod.rs # src-tauri/src/provider/opencode.rs # src-tauri/src/sessions/copilot.rs # src-tauri/src/sessions/mod.rs # src-tauri/src/sessions/opencode.rs # src-tauri/src/settings.rs # src-tauri/src/stats.rs # src-tauri/src/types.rs # src-tauri/src/watcher.rs # src/App.css # src/App.tsx # src/components/ContentViewer.tsx # src/components/DashboardView.tsx # src/components/ExplorerTree.tsx # src/components/PlansSpecsView.tsx # src/components/ProjectView.tsx # src/components/SessionCard.tsx # src/components/SessionStatsBadge.tsx # src/components/SessionStatsPanel.tsx # src/components/SettingsView.tsx # src/components/Sidebar.tsx # src/locales/en-US.ts # src/locales/zh-TW.ts # src/types/index.ts # src/utils/buildTree.ts
1. 將 `lib.rs` setup 階段邏輯抽出至獨立模組 `app_setup.rs` 2. 將前端設定預設值抽出至 `appSettingsDefaults.ts`,改用 `mergeAppSettings()` 統一處理 chore: 1. 移除未使用的 `react-router-dom`、`@codemirror/lang-markdown`、`@codemirror/view` 套件 docs: 1. 封存已完成變更 `avoid-msys-bash-stackdumps` 2. 新增 `msys-stackdump-suppression` spec 並更新 `terminal-launcher` spec 3. 更新多個 OpenSpec change 的任務完成狀態 4. 移除已廢棄的 `agent-intervention-notification` 變更
1. 新增 RoutedApp 路由層,支援 quota-overlay 與 tray-panel 內嵌視圖 2. 新增 EmbeddedQuotaOverlayApp 獨立配額覆蓋層應用 3. 新增 EmbeddedTrayPanelApp 獨立系統匣面板應用 refactor: 1. 將 App.tsx 即時事件監聽邏輯抽離至 useSessionRealtimeEvents hook 2. 將 App.tsx 設定表單狀態與 mutation 抽離至 useAppSettingsForm hook 3. 將錯誤訊息解析函式抽離至 resolveErrorMessage 工具函式
1. 新增 InterventionRegistry 後端 waiting 清單(single source of truth)與 `get_intervention_list` command 2. 新增 QuotaOverlay 介入提醒區,支援 compact/full 版式與自動延伸方向判斷 3. 處理 Claude `notification`/`permission.requested` 及 OpenCode 等待授權訊號同步至 Registry 4. 新增 `intervention-focus-session` listener,點擊卡片聚焦主視窗並導航 5. 新增對應 CSS 樣式與中英文翻譯 docs: 1. 新增架構分離文件
同步 8 個 Dependabot 版本更新(5 cargo patch + plugin-dialog / marked 18 / vite 8 + plugin-react 6)至開發分支。 - bun.lock 衝突以 package.json 重新解析 - ContentViewer marked 18 寫法由三方合併自動採用 - 前端 tsc+build、後端 cargo check 均通過 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
此 PR 將 develop 一個開發週期的成果合併回 main,涵蓋看板/Overlay 介入提醒、Copilot hook 事件監聽、計費統計、Plans/Specs Explorer 佈局調整,以及後端 Rust 模組拆分與多項依賴更新。
Changes:
- 新增/整合 quota overlay「需授權」介入提醒:後端
InterventionRegistry(single source of truth)+ 前端 overlay 顯示與跨視窗聚焦導航。 - 前端重構:抽出 realtime event hook、設定表單 hook、獨立 embedded webview apps(overlay / tray panel)與 routed entry。
- 後端重構:
types與stats拆模組、run()setup 抽到app_setup.rs,並擴充 provider bridge 事件(含 Claude notification/permission 類型)。
Reviewed changes
Copilot reviewed 58 out of 85 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| src/utils/resolveErrorMessage.ts | 新增統一的 unknown error → message 解析工具 |
| src/utils/formatDate.ts | 新增僅日期格式化 helper(供 ContentViewer 顯示 createdAt) |
| src/utils/appSettingsDefaults.ts | 新增前端 AppSettings 選填欄位預設值與合併 helper |
| src/types/index.ts | 新增 InterventionItem 型別等前端共用型別擴充 |
| src/main.tsx | entry 改為掛載 RoutedApp(支援 embedded webviews) |
| src/locales/zh-TW.ts | 新增 overlay intervention 文案與既有字串更新 |
| src/locales/en-US.ts | 新增 overlay intervention 文案與既有字串更新 |
| src/hooks/useSessionRealtimeEvents.ts | 抽出主視窗 realtime 事件訂閱邏輯成 custom hook |
| src/hooks/useAppSettingsForm.ts | 抽出設定表單 state/mutations 成 custom hook |
| src/components/ProjectStatsBanner.tsx | banner 增加 modelMetrics cost 彙總顯示 |
| src/components/PlansSpecsView.tsx | 將 OpenSpec change createdAt 回傳到 ContentViewer 顯示 |
| src/components/ContentViewer.tsx | explorer header 顯示路徑 + createdAt 日期 |
| src/app/RoutedApp.tsx | 依 ?view= 分流主 app / quota overlay / tray panel |
| src/app/EmbeddedTrayPanelApp.tsx | 新增 tray panel 專用 embedded app(訂閱 quota snapshots) |
| src/app/EmbeddedQuotaOverlayApp.tsx | 新增 overlay 專用 embedded app(settings/quota/intervention queries + listeners) |
| src/App.css | 新增 intervention panel 與 explorer header date 的樣式 |
| src-tauri/src/types/sisyphus_openspec.rs | 拆分後的 Sisyphus/OpenSpec 型別模組 |
| src-tauri/src/types/settings.rs | 拆分後的 settings 型別與預設值 helper |
| src-tauri/src/types/session.rs | 拆分後的 session/activity/bridge payload 型別 |
| src-tauri/src/types/quota.rs | 拆分後的 quota/cache 型別 |
| src-tauri/src/types/provider_integration.rs | 拆分後的 provider integration/bridge record 型別 |
| src-tauri/src/types/opencode.rs | 拆分後的 OpenCode JSON/stats/activity 型別 |
| src-tauri/src/types/mod.rs | types/ 模組 re-export 與共用 helper |
| src-tauri/src/types/misc.rs | WatcherState/ScanCache/ToolAvailability 等雜項型別集中 |
| src-tauri/src/types/intervention.rs | 新增 InterventionRegistry + 單元測試 |
| src-tauri/src/types/claude.rs | 拆分後的 Claude JSONL 解析型別 |
| src-tauri/src/types/analytics.rs | 拆分後的 analytics/session stats 型別 |
| src-tauri/src/stats/tests.rs | stats 模組測試拆出 |
| src-tauri/src/stats/opencode.rs | OpenCode stats 計算拆出 |
| src-tauri/src/provider/bridge.rs | 擴充 derive_activity_status + 同步 InterventionRegistry |
| src-tauri/src/lib.rs | manage registry、註冊新 command、setup 邏輯抽到 app_setup |
| src-tauri/src/commands/notifications.rs | 新增 get_intervention_list command(overlay 初次快照) |
| src-tauri/src/app_setup.rs | 新增 setup 專用模組(quota monitoring/poller/tray) |
| package.json | 移除未使用依賴(react-router-dom、codemirror 等) |
| openspec/specs/terminal-launcher/spec.md | 新增 Windows MSYS stackdump suppression 一致性需求 |
| openspec/specs/msys-stackdump-suppression/spec.md | 新增 MSYS stackdump suppression 規格 |
| openspec/changes/split-large-rust-modules/tasks.md | 移除(改歸檔至 archive) |
| openspec/changes/extract-app-tsx-event-hooks/tasks.md | 移除(改歸檔至 archive) |
| openspec/changes/cleanup-deps-and-settings-defaults/tasks.md | 移除(改歸檔至 archive) |
| openspec/changes/archive/2026-07-21-split-large-rust-modules/tasks.md | 新增歸檔 tasks |
| openspec/changes/archive/2026-07-21-split-large-rust-modules/specs/NO-SPEC-CHANGES.md | 新增歸檔說明 |
| openspec/changes/archive/2026-07-21-split-large-rust-modules/proposal.md | 新增歸檔 proposal |
| openspec/changes/archive/2026-07-21-split-large-rust-modules/design.md | 新增歸檔 design |
| openspec/changes/archive/2026-07-21-split-large-rust-modules/.openspec.yaml | 新增歸檔 metadata |
| openspec/changes/archive/2026-07-21-refactor-tauri-setup-lib/tasks.md | 更新為已完成勾選版 |
| openspec/changes/archive/2026-07-21-refactor-tauri-setup-lib/specs/NO-SPEC-CHANGES.md | 新增歸檔說明 |
| openspec/changes/archive/2026-07-21-refactor-tauri-setup-lib/proposal.md | 新增歸檔 proposal |
| openspec/changes/archive/2026-07-21-refactor-tauri-setup-lib/design.md | 新增歸檔 design |
| openspec/changes/archive/2026-07-21-refactor-tauri-setup-lib/.openspec.yaml | 新增歸檔 metadata |
| openspec/changes/archive/2026-07-21-extract-embedded-apps-and-settings-hook/tasks.md | 更新為已完成勾選版 |
| openspec/changes/archive/2026-07-21-extract-embedded-apps-and-settings-hook/specs/NO-SPEC-CHANGES.md | 新增歸檔說明 |
| openspec/changes/archive/2026-07-21-extract-embedded-apps-and-settings-hook/proposal.md | 新增歸檔 proposal |
| openspec/changes/archive/2026-07-21-extract-embedded-apps-and-settings-hook/design.md | 新增歸檔 design |
| openspec/changes/archive/2026-07-21-extract-embedded-apps-and-settings-hook/.openspec.yaml | 新增歸檔 metadata |
| openspec/changes/archive/2026-07-21-extract-app-tsx-event-hooks/tasks.md | 新增歸檔 tasks |
| openspec/changes/archive/2026-07-21-extract-app-tsx-event-hooks/specs/NO-SPEC-CHANGES.md | 新增歸檔說明 |
| openspec/changes/archive/2026-07-21-extract-app-tsx-event-hooks/proposal.md | 新增歸檔 proposal |
| openspec/changes/archive/2026-07-21-extract-app-tsx-event-hooks/design.md | 新增歸檔 design |
| openspec/changes/archive/2026-07-21-extract-app-tsx-event-hooks/.openspec.yaml | 新增歸檔 metadata |
| openspec/changes/archive/2026-07-21-cleanup-deps-and-settings-defaults/tasks.md | 新增歸檔 tasks |
| openspec/changes/archive/2026-07-21-cleanup-deps-and-settings-defaults/specs/NO-SPEC-CHANGES.md | 新增歸檔說明 |
| openspec/changes/archive/2026-07-21-cleanup-deps-and-settings-defaults/proposal.md | 新增歸檔 proposal |
| openspec/changes/archive/2026-07-21-cleanup-deps-and-settings-defaults/design.md | 新增歸檔 design |
| openspec/changes/archive/2026-07-21-cleanup-deps-and-settings-defaults/.openspec.yaml | 新增歸檔 metadata |
| openspec/changes/archive/2026-07-21-avoid-msys-bash-stackdumps/tasks.md | 新增歸檔 tasks |
| openspec/changes/archive/2026-07-21-avoid-msys-bash-stackdumps/specs/terminal-launcher/spec.md | 新增歸檔 spec delta |
| openspec/changes/archive/2026-07-21-avoid-msys-bash-stackdumps/specs/msys-stackdump-suppression/spec.md | 新增歸檔 spec delta |
| openspec/changes/archive/2026-07-21-avoid-msys-bash-stackdumps/proposal.md | 新增歸檔 proposal |
| openspec/changes/archive/2026-07-21-avoid-msys-bash-stackdumps/design.md | 新增歸檔 design |
| openspec/changes/archive/2026-07-21-avoid-msys-bash-stackdumps/.openspec.yaml | 新增歸檔 metadata |
| openspec/changes/add-intervention-overlay-panel/tasks.md | 更新為已完成/待驗證勾選版 |
| openspec/changes/add-intervention-overlay-panel/specs/intervention-overlay-panel/spec.md | 更新需求:沿用 enable_intervention_notification 當總開關 |
| openspec/changes/add-intervention-overlay-panel/specs/intervention-notification/spec.md | 移除(不再新增 enable_waiting_toast) |
| openspec/changes/add-intervention-overlay-panel/proposal.md | 更新:不新增 enable_waiting_toast,沿用既有總開關 |
| openspec/changes/add-intervention-overlay-panel/design.md | 更新設計決策與已知限制說明 |
Comment on lines
+34
to
+39
| const unlistenSnapshots = await listen("quota-snapshots-updated", () => { | ||
| if (mounted) { | ||
| void queryClient.invalidateQueries({ queryKey: ["embedded_quota_snapshots", "quota_overlay"] }); | ||
| void queryClient.refetchQueries({ queryKey: ["embedded_quota_snapshots", "quota_overlay"] }); | ||
| } | ||
| }); |
Comment on lines
+40
to
+48
| const unlistenSettings = await listen<AppSettings>("quota-overlay-settings-changed", (event) => { | ||
| if (mounted) { | ||
| queryClient.setQueryData(["embedded_settings", "quota_overlay"], event.payload); | ||
| // 重新讀取持久化設定,並重新掛載透明 overlay 以確保樣式立即套用。 | ||
| void queryClient.invalidateQueries({ queryKey: ["embedded_settings", "quota_overlay"] }); | ||
| void queryClient.refetchQueries({ queryKey: ["embedded_settings", "quota_overlay"] }); | ||
| setOverlayRevision((revision) => revision + 1); | ||
| } | ||
| }); |
Comment on lines
+59
to
+65
| return async (event) => { | ||
| const { cwd } = event.payload; | ||
| const updated = await invoke<SessionInfo | null>("get_session_by_cwd", { | ||
| cwd, | ||
| rootDir: copilotRoot, | ||
| }).catch(() => null); | ||
|
|
Comment on lines
+329
to
+330
| /// 由 cwd 最後一段路徑推導 projectName,取不到時 fallback session_id 尾段或 provider 名。 | ||
| /// 與 `App.tsx:1038` 的 `session?.cwd?.split("\\").pop()` 同規則。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
摘要
將
develop一整個開發週期的成果合併回main,並同步 8 個 Dependabot 版本更新。主要功能(feat)
重構(refactor)
types.rs→types/子目錄、stats.rs→stats/子目錄(含 tests)、agents_config.rs拆分lib.rssetup 邏輯抽出至app_setup.rs、前端設定預設值抽出至appSettingsDefaults.ts相依套件更新
同步自
main的 8 個 Dependabot 更新:serde、serde_json、toml_edit、chrono、tauri-plugin-dialog(cargo)、@tauri-apps/plugin-dialog、marked 18(含 ContentViewerParser.parse簽章調整)、vite 8 + @vitejs/plugin-react 6。驗證
tsc + vite build:通過cargo check:通過🤖 Generated with Claude Code