問題
takt list が遅い。原因は buildListItems で各ブランチごとに重い git 操作を重複実行していること。
ボトルネックの構造
buildListItems (N ブランチ)
└── per branch:
├── getFilesChanged()
│ └── resolveBranchBaseCommit() ← 重い
│ ├── reflog (1 cmd) → 成功すれば即 return
│ └── resolveBranchBaseCommitFromRefs()
│ ├── listCandidateRefs() → git for-each-ref (全 ref 列挙)
│ └── per ref (M 個): resolveBaseCandidate() → 3 git cmds
│
└── getOriginalInstruction()
└── findFirstTaktCommit()
├── reflog (1 cmd) ← 同じ reflog を再計算
└── resolveBranchBaseCommitFromRefs() ← 同じ全 ref 走査を再計算
reflog が失敗するケース(リモートブランチ、pruned 等)では N × 2 × M × 3 git commands が実行される。
改善策
1. base commit をブランチごとに1回だけ解決
buildListItems 内で resolveBranchBaseCommit を1回呼び、結果を getFilesChanged と getOriginalInstruction の両方に渡す。現状は同じ計算を2回実行している。
対象ファイル: src/infra/task/branchList.ts (BranchManager.buildListItems, getFilesChanged, getOriginalInstruction)
効果: 2x → 1x(ブランチあたりの base commit 解決回数を半減)
2. listCandidateRefs を全ブランチで使い回す
git for-each-ref の結果は同じリポジトリなら共通。現状はブランチごとに毎回呼んでいる。ブランチ名でのフィルタだけ変えればよい。
対象ファイル: src/infra/task/branchGitResolver.ts (listCandidateRefs, resolveBranchBaseCommitFromRefs)
効果: N回の git for-each-ref → 1回
3. resolveBaseCandidate の候補を絞る
全 ref に対して merge-base を計算するのが最も重い。defaultBranch と origin/defaultBranch を優先候補にして、それで解決できたら全 ref 走査をスキップする。
対象ファイル: src/infra/task/branchGitResolver.ts (resolveBranchBaseCommitFromRefs)
効果: M refs × 3 cmds → 優先候補のみ(多くの場合 2 refs × 3 cmds)
関連ファイル
src/infra/task/branchList.ts — BranchManager クラス
src/infra/task/branchGitResolver.ts — base commit 解決ロジック
src/features/tasks/list/index.ts — listTasks エントリポイント
問題
takt listが遅い。原因はbuildListItemsで各ブランチごとに重い git 操作を重複実行していること。ボトルネックの構造
reflog が失敗するケース(リモートブランチ、pruned 等)では N × 2 × M × 3 git commands が実行される。
改善策
1. base commit をブランチごとに1回だけ解決
buildListItems内でresolveBranchBaseCommitを1回呼び、結果をgetFilesChangedとgetOriginalInstructionの両方に渡す。現状は同じ計算を2回実行している。対象ファイル:
src/infra/task/branchList.ts(BranchManager.buildListItems,getFilesChanged,getOriginalInstruction)効果: 2x → 1x(ブランチあたりの base commit 解決回数を半減)
2.
listCandidateRefsを全ブランチで使い回すgit for-each-refの結果は同じリポジトリなら共通。現状はブランチごとに毎回呼んでいる。ブランチ名でのフィルタだけ変えればよい。対象ファイル:
src/infra/task/branchGitResolver.ts(listCandidateRefs,resolveBranchBaseCommitFromRefs)効果: N回の
git for-each-ref→ 1回3.
resolveBaseCandidateの候補を絞る全 ref に対して merge-base を計算するのが最も重い。
defaultBranchとorigin/defaultBranchを優先候補にして、それで解決できたら全 ref 走査をスキップする。対象ファイル:
src/infra/task/branchGitResolver.ts(resolveBranchBaseCommitFromRefs)効果: M refs × 3 cmds → 優先候補のみ(多くの場合 2 refs × 3 cmds)
関連ファイル
src/infra/task/branchList.ts—BranchManagerクラスsrc/infra/task/branchGitResolver.ts— base commit 解決ロジックsrc/features/tasks/list/index.ts—listTasksエントリポイント