Skip to content

feat: Phase 6 バックログ(設定拡張・コスト表示・通知・セッション復元) - #4

Merged
takecchi merged 4 commits into
mainfrom
feat/phase6-config-cost-notify-restore
Jul 18, 2026
Merged

feat: Phase 6 バックログ(設定拡張・コスト表示・通知・セッション復元)#4
takecchi merged 4 commits into
mainfrom
feat/phase6-config-cost-notify-restore

Conversation

@takecchi

Copy link
Copy Markdown
Owner

概要

Phase 6(MVP後バックログ)のうち 4項目 を実装しました(includePartialMessages によるストリーミング表示は今回対象外)。純粋ロジックは core/、副作用は utils//合成ルートという既存の分離を踏襲しています。

着手項目はユーザーと相談のうえ決定(TASKS.md の「着手前にユーザーと相談」に従う)。

実装内容

1. 設定ファイル拡張 (#2)

  • CodivaConfigmodel / effort / permissionMode / maxBudgetUsd / notifications を追加
  • 検証は toConfig() に集約(不正値は静かに既定へフォールバック、TUI をクラッシュさせない)
  • SessionOptions に束ね、SessionManager → Session → SDK Options へ注入
  • permissionMode 未指定時は従来どおり acceptEdits

2. コスト表示 (#3)

  • 純粋な core/cost.tstotalCostUsd() / formatUsd())を追加
  • 一覧のバナーに合計コスト、詳細に各セッションのコスト行
  • reducer は既に result.total_cost_usdstate.totalCostUsd に保持していたため、導出のみ追加

3. デスクトップ通知 (#5)

  • 発火判定は純粋な core/notify.tsnotificationFor(prev, next, messages)状態遷移時のみ発火(連続更新で鳴り続けない)
  • 実 I/O は utils/notify.ts(darwin=osascript / linux=notify-send、文字列は argv 渡しで注入防止、missing binary 等は握り潰す best-effort)
  • SessionManager.onTransition に配線、config.notifications: false で無効化

4. セッション復元 (#1)

  • 永続スナップショットの型・変換・検証は純粋な core/persistence.tstoPersistedSession / restoredSessionState / fromPersistedJson
  • ファイル I/O は utils/state-store.ts<repo>/.codiva/state.json、破損時は空へフォールバック、起動時に存在しない worktree を prune)
  • Sessionresume(SDK session id)/ restored(復元済み state)を受け、復元セッションは起動時にサブプロセスを立てず、最初の追加指示で遅延 resume(起動時のサブプロセス乱立を回避)
  • 終了時は stop()(quiet 停止)で実行中セッションも resumable のまま保存(abort() = failed 化 と区別)
  • SessionManager.restore() / persistableState() を追加。id/slug を予約して新規セッションとの衝突を回避

テスト計画

  • npm test234件全緑(旧131 → +103)
  • coverage — Statements 95.5% / Branches 85% / Functions 89.6% / Lines 96.5%(core・utils とも 80% 閾値超)
  • npm run typecheck — 緑
  • npm run lint — 緑(既存の banner.tsx paint 未使用引数 warning のみ、本PR無関係)
  • npm run build — 緑
  • 新規 spec: config(拡張) / cost / notify(core+utils) / persistence / state-store
  • 統合テスト tests/restore.test.tsx: run → persist → 新 manager restore → 追加指示で resume が query options に載る、までを実 Session で通し検証
  • 手動受け入れ(未実施): 実 Claude セッションでの resume 挙動・OS 通知の実表示は TTY + 認証が要るため未確認。仕組みは統合テストで検証済み

ドキュメント

TASKS.md(チェック更新+実績メモ)、ARCHITECTURE.md(新モジュール・責務・「Phase 6 機能」節・決定表)、TECH_NOTES.md(Options の resume/model/effort/maxBudgetUsd を実装済みに更新)を同期済み。

🤖 Generated with Claude Code

takecchi added 4 commits July 19, 2026 01:26
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 に上記の判断を反映。
@takecchi
takecchi merged commit 4b44354 into main Jul 18, 2026
1 check passed
@takecchi
takecchi deleted the feat/phase6-config-cost-notify-restore branch July 18, 2026 16:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant