feat: Phase 6 バックログ(設定拡張・コスト表示・通知・セッション復元) - #4
Merged
Conversation
MVP後バックログのうち4項目を実装(ストリーミング表示は対象外)。 純粋ロジックは core、副作用は utils/合成ルートという分離を踏襲。 設定ファイル拡張: - CodivaConfig に model/effort/permissionMode/maxBudgetUsd/notifications を追加 - 検証は toConfig() に集約(不正値は静かに既定へフォールバック) - SessionOptions に束ね SessionManager→Session→SDK Options へ注入 - permissionMode 未指定時は従来どおり acceptEdits コスト表示: - core/cost.ts(純粋)に totalCostUsd()/formatUsd() を追加 - 一覧バナーに合計、詳細に各セッションのコスト行 - reducer は既に state.totalCostUsd を保持していたため導出のみ デスクトップ通知: - core/notify.ts の notificationFor() は状態遷移時のみ発火(純粋) - utils/notify.ts は osascript(darwin)/notify-send(linux)、argv 渡しで注入防止・best-effort - SessionManager.onTransition に配線、config.notifications:false で無効化 セッション復元: - core/persistence.ts(純粋)で永続スナップショットの変換・検証 - utils/state-store.ts で <repo>/.codiva/state.json の I/O、起動時に消えた worktree を prune - Session は resume/restored を受け、復元セッションは遅延 resume(最初の追加指示で query 起動) - 終了時は stop()(quiet)で実行中でも resumable のまま保存 - SessionManager.restore()/persistableState() を追加 テスト: 234件全緑、coverage 95.5%/85%/89.6%/96.5%(core/utils とも 80% 超)
- TASKS.md: Phase 6 の4項目をチェック+実績メモ(ストリーミング表示は未着手) - ARCHITECTURE.md: 新モジュール(config/cost/notify/persistence, utils/notify, state-store)、 Session/SessionManager の責務更新、「Phase 6 機能」節と決定表を追記 - TECH_NOTES.md: Options の model/effort/permissionMode/maxBudgetUsd/resume を実装済みに更新
…st-notify-restore # Conflicts: # docs/TASKS.md # src/core/index.ts # src/ui/session-detail.tsx # src/ui/session-list.tsx
code-reviewer の指摘(HIGH 2 / MEDIUM 3)に対応。 - [HIGH] resume 不能セッションの取りこぼし防止: sdkSessionId を持つセッションのみ 永続する(toPersistedSession / fromPersistedJson が必須化)。init 前に落ちた セッションを復元して元プロンプトを取りこぼす経路を除去。 - [HIGH] 許可待ちで終了した場合の resume 破損防止: Session.stop() が保留中の canUseTool を deny で解決してから停止し、トランスクリプトが未応答の tool_use で 終わらないようにする(best-effort)。 - [MEDIUM] 復元セッションの経過時間が伸び続ける問題: restoredSessionState で finishedAt を startedAt にフォールバック(アイドル表示の時計を凍結)。 - [MEDIUM] stop() の単体テスト追加(状態不変・pending deny・遅延 resume を実 Session で検証)。 - [MEDIUM] ハード終了時の取りこぼし対策: saveStateSync を追加し、SIGTERM/SIGHUP で 同期フラッシュ。 テスト 254件全緑 / coverage 95.6%/85%/89.8%/96.6% / lint・typecheck・build 緑。 ARCHITECTURE.md に上記の判断を反映。
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.
概要
Phase 6(MVP後バックログ)のうち 4項目 を実装しました(
includePartialMessagesによるストリーミング表示は今回対象外)。純粋ロジックはcore/、副作用はutils//合成ルートという既存の分離を踏襲しています。着手項目はユーザーと相談のうえ決定(TASKS.md の「着手前にユーザーと相談」に従う)。
実装内容
1. 設定ファイル拡張 (#2)
CodivaConfigにmodel/effort/permissionMode/maxBudgetUsd/notificationsを追加toConfig()に集約(不正値は静かに既定へフォールバック、TUI をクラッシュさせない)SessionOptionsに束ね、SessionManager → Session → SDK Optionsへ注入permissionMode未指定時は従来どおりacceptEdits2. コスト表示 (#3)
core/cost.ts(totalCostUsd()/formatUsd())を追加result.total_cost_usdをstate.totalCostUsdに保持していたため、導出のみ追加3. デスクトップ通知 (#5)
core/notify.tsのnotificationFor(prev, next, messages)— 状態遷移時のみ発火(連続更新で鳴り続けない)utils/notify.ts(darwin=osascript/ linux=notify-send、文字列は argv 渡しで注入防止、missing binary 等は握り潰す best-effort)SessionManager.onTransitionに配線、config.notifications: falseで無効化4. セッション復元 (#1)
core/persistence.ts(toPersistedSession/restoredSessionState/fromPersistedJson)utils/state-store.ts(<repo>/.codiva/state.json、破損時は空へフォールバック、起動時に存在しない worktree を prune)Sessionはresume(SDK session id)/restored(復元済み state)を受け、復元セッションは起動時にサブプロセスを立てず、最初の追加指示で遅延 resume(起動時のサブプロセス乱立を回避)stop()(quiet 停止)で実行中セッションも resumable のまま保存(abort()= failed 化 と区別)SessionManager.restore()/persistableState()を追加。id/slug を予約して新規セッションとの衝突を回避テスト計画
npm test— 234件全緑(旧131 → +103)npm run typecheck— 緑npm run lint— 緑(既存の banner.tsxpaint未使用引数 warning のみ、本PR無関係)npm run build— 緑config(拡張) /cost/notify(core+utils) /persistence/state-storetests/restore.test.tsx: run → persist → 新 manager restore → 追加指示でresumeが query options に載る、までを実Sessionで通し検証ドキュメント
TASKS.md(チェック更新+実績メモ)、ARCHITECTURE.md(新モジュール・責務・「Phase 6 機能」節・決定表)、TECH_NOTES.md(Options の resume/model/effort/maxBudgetUsd を実装済みに更新)を同期済み。🤖 Generated with Claude Code