From 0155d208d8f5df143b0b4ff5e26a5e82081ce083 Mon Sep 17 00:00:00 2001 From: Sho DOUHASHI Date: Tue, 4 Nov 2025 02:41:17 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20review=20=E3=83=95=E3=82=A7=E3=83=BC?= =?UTF-8?q?=E3=82=BA=E3=81=A7=E3=82=82=20worktree=20=E3=82=92=E4=BD=9C?= =?UTF-8?q?=E6=88=90=E3=83=BB=E7=A7=BB=E5=8B=95=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - review フェーズの RequiresWorktree を true に設定 - plan/review フェーズでも worktree が作成・移動されるように修正 - テストを TDD アプローチで実装(Red→Green→Refactor) 全フェーズで一貫した実行環境を提供することで、 issue 固有のディレクトリで作業できるようになりました。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- internal/domain/phase.go | 2 +- internal/domain/phase_definition_test.go | 2 +- internal/service/workflow_executor_test.go | 22 ++++++++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/internal/domain/phase.go b/internal/domain/phase.go index 5f30f48..02a7dd8 100644 --- a/internal/domain/phase.go +++ b/internal/domain/phase.go @@ -112,7 +112,7 @@ var PhaseDefinitions = map[string]*PhaseDefinition{ ExecutionLabel: LabelReviewing, ExecutionType: ExecutionTypeCommand, RequiresPane: true, - RequiresWorktree: false, + RequiresWorktree: true, CompletionLabels: map[string]NextAction{ LabelDone: { // レビュー承認 RemoveLabel: LabelReviewing, diff --git a/internal/domain/phase_definition_test.go b/internal/domain/phase_definition_test.go index 66c3e95..fc13abc 100644 --- a/internal/domain/phase_definition_test.go +++ b/internal/domain/phase_definition_test.go @@ -63,7 +63,7 @@ func TestPhaseDefinitions(t *testing.T) { expectedExecution: domain.LabelReviewing, expectedType: domain.ExecutionTypeCommand, expectedPane: true, - expectedWorktree: false, + expectedWorktree: true, expectedCompletions: map[string]bool{ domain.LabelDone: true, domain.LabelRequiresChanges: true, diff --git a/internal/service/workflow_executor_test.go b/internal/service/workflow_executor_test.go index 97f678c..f096623 100644 --- a/internal/service/workflow_executor_test.go +++ b/internal/service/workflow_executor_test.go @@ -181,14 +181,32 @@ func TestWorkflowExecutor_ExecutePhase(t *testing.T) { wantErr: false, }, { - name: "Error when updating labels", + name: "Execute review phase with worktree", issueNumber: 999, phase: domain.PhaseReview, currentLabel: domain.LabelReviewRequested, nextLabel: domain.LabelReviewing, setupMocks: func(tmux *MockTmuxClient, workspace *MockWorkspaceManager, processor *MockIssueProcessorUpdater) { processor.On("Configure", mock.Anything).Return(nil) - processor.On("UpdateLabels", mock.Anything, 999, domain.LabelReviewRequested, domain.LabelReviewing). + processor.On("UpdateLabels", mock.Anything, 999, domain.LabelReviewRequested, domain.LabelReviewing).Return(nil) + workspace.On("PrepareWorkspace", 999).Return(nil) // Reviewフェーズでもworktree準備 + tmux.On("SessionExists", "soba-test-repo").Return(true) + tmux.On("WindowExists", "soba-test-repo", "issue-999").Return(false, nil) + tmux.On("CreateWindow", "soba-test-repo", "issue-999").Return(nil) + tmux.On("GetLastPaneIndex", "soba-test-repo", "issue-999").Return(0, nil) + tmux.On("SendCommand", "soba-test-repo", "issue-999", 0, `cd /tmp/soba/worktrees/issue-999 && echo "Review"`).Return(nil) + }, + wantErr: false, + }, + { + name: "Error when updating labels", + issueNumber: 888, + phase: domain.PhaseReview, + currentLabel: domain.LabelReviewRequested, + nextLabel: domain.LabelReviewing, + setupMocks: func(tmux *MockTmuxClient, workspace *MockWorkspaceManager, processor *MockIssueProcessorUpdater) { + processor.On("Configure", mock.Anything).Return(nil) + processor.On("UpdateLabels", mock.Anything, 888, domain.LabelReviewRequested, domain.LabelReviewing). Return(errors.New("failed to update labels")) }, wantErr: true,