Skip to content

feat: セッション間の変更ファイル逆引き+コンフリクト警告(#18)#37

Merged
sasagar merged 1 commit into
devfrom
feature/cross-session-conflicts
Jul 2, 2026
Merged

feat: セッション間の変更ファイル逆引き+コンフリクト警告(#18)#37
sasagar merged 1 commit into
devfrom
feature/cross-session-conflicts

Conversation

@sasagar

@sasagar sasagar commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

背景

#18「逆引き(どのセッションがどのファイルを触ったか)+ セッション間コンフリクト警告」。1 セッション = 1 worktree だが、同じリポジトリ(共有 .git)の別 worktree/ブランチが同じ相対パスのファイルを編集していると、後のマージで衝突しうる。これを検知して警告する。

変更点

エンジン(純粋ロジック)

  • CrossSessionConflicts(純粋関数)を追加。(id, repoKey, 変更パス集合) の一覧から、同一 repoKey で変更パスが重なるものを列挙する。

アプリ

  • SessionStore が変更ファイルの逆引き(session → 変更パス集合)を保持。同一 repo に 2 つ以上セッションがある場合だけ git status を回す(無ければほぼ空処理)。リフレッシュ契機:
    • 5s 間隔の軽量ウォッチ(背景セッションでエージェントが編集していても検知)。
    • セッションの repo 解決時・クローズ時。
  • SessionDetailView 上部に ConflictBanner を追加。衝突ファイル数と一覧を表示し、どの他ブランチ/セッションと衝突しているかを help(ツールチップ)に出す。

検証

  • swift test: 46 passedCrossSessionConflictsTests 6 件 = 同一/別 repo・単独・未解決 repoKey・複数他者・空集合)。
  • app: xcodebuild … build 成功(既存の NSSplitViewDelegate 警告のみ)。

設計メモ

  • 逆引きはライブ git status から都度計算(常に最新)。プランの session_file 永続テーブルは見送り:ライブ状態を SQLite に写すと陳腐化リスクがあり、本警告(現在編集中の重なり)には不要なため。履歴的な逆引きが要るなら別途。
  • パスは porcelain(worktree ルート相対)なので、同一 repo の別 worktree 間で直接比較できる。

#18。同一リポジトリの複数セッション(別 worktree/ブランチ)が同じファイルを編集して
いたら警告する。

- LaboLaboEngine に純粋関数 CrossSessionConflicts(同一 repoKey で変更パスが重なるものを
  列挙)を追加。
- SessionStore が変更ファイルの逆引き(session→変更パス集合)を保持。多重 repo のセッション
  だけ git status を 5s 間隔+セッション/repo 解決時にリフレッシュ。
- SessionDetailView 上部に ConflictBanner を追加。件数・ファイル一覧を表示し、どの他
  ブランチ/セッションと衝突しているかを help に出す。
- テスト: CrossSessionConflicts 6 件(同一/別 repo・単独・未解決 repoKey・複数他者・空集合)。
  swift test 46 passed / app build 成功。

逆引きはライブ git status から都度計算(常に最新)。永続テーブル(session_file)は陳腐化リスク
があり本警告には不要なため見送り。

Closes #18
@sasagar sasagar marked this pull request as ready for review July 2, 2026 10:49
@sasagar sasagar merged commit 72ae6e4 into dev Jul 2, 2026
1 check passed
@sasagar sasagar deleted the feature/cross-session-conflicts branch July 2, 2026 10:49
sasagar added a commit that referenced this pull request Jul 2, 2026
#18。同一リポジトリの複数セッション(別 worktree/ブランチ)が同じファイルを編集して
いたら警告する。

- LaboLaboEngine に純粋関数 CrossSessionConflicts(同一 repoKey で変更パスが重なるものを
  列挙)を追加。
- SessionStore が変更ファイルの逆引き(session→変更パス集合)を保持。多重 repo のセッション
  だけ git status を 5s 間隔+セッション/repo 解決時にリフレッシュ。
- SessionDetailView 上部に ConflictBanner を追加。件数・ファイル一覧を表示し、どの他
  ブランチ/セッションと衝突しているかを help に出す。
- テスト: CrossSessionConflicts 6 件(同一/別 repo・単独・未解決 repoKey・複数他者・空集合)。
  swift test 46 passed / app build 成功。

逆引きはライブ git status から都度計算(常に最新)。永続テーブル(session_file)は陳腐化リスク
があり本警告には不要なため見送り。

Closes #18
sasagar added a commit that referenced this pull request Jul 2, 2026
#18。同一リポジトリの複数セッション(別 worktree/ブランチ)が同じファイルを編集して
いたら警告する。

- LaboLaboEngine に純粋関数 CrossSessionConflicts(同一 repoKey で変更パスが重なるものを
  列挙)を追加。
- SessionStore が変更ファイルの逆引き(session→変更パス集合)を保持。多重 repo のセッション
  だけ git status を 5s 間隔+セッション/repo 解決時にリフレッシュ。
- SessionDetailView 上部に ConflictBanner を追加。件数・ファイル一覧を表示し、どの他
  ブランチ/セッションと衝突しているかを help に出す。
- テスト: CrossSessionConflicts 6 件(同一/別 repo・単独・未解決 repoKey・複数他者・空集合)。
  swift test 46 passed / app build 成功。

逆引きはライブ git status から都度計算(常に最新)。永続テーブル(session_file)は陳腐化リスク
があり本警告には不要なため見送り。

Closes #18
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