Class: Ocak::MergeManager

Inherits:
Object
  • Object
show all
Includes:
CommandRunner
Defined in:
lib/ocak/merge_manager.rb

Instance Method Summary collapse

Constructor Details

#initialize(config:, claude:, logger:, issues:, watch: nil) ⇒ MergeManager

Returns a new instance of MergeManager.



12
13
14
15
16
17
18
# File 'lib/ocak/merge_manager.rb', line 12

def initialize(config:, claude:, logger:, issues:, watch: nil)
  @config = config
  @claude = claude
  @logger = logger
  @issues = issues
  @watch = watch
end

Instance Method Details

#create_pr_only(issue_number, worktree) ⇒ Object

Create a PR without merging (manual review mode). Returns the PR number on success, nil on failure.



58
59
60
61
62
63
64
65
66
67
# File 'lib/ocak/merge_manager.rb', line 58

def create_pr_only(issue_number, worktree)
  @logger.info("Creating PR (manual review) for issue ##{issue_number}")

  commit_uncommitted_changes(issue_number, worktree)
  return log_and_nil("Rebase failed for issue ##{issue_number}") unless rebase_onto_main(worktree)
  return log_and_nil("Tests failed after rebase for issue ##{issue_number}") unless verify_tests(worktree)
  return log_and_nil("Push failed for issue ##{issue_number}") unless push_branch(worktree)

  open_pull_request(issue_number, worktree)
end

#merge(issue_number, worktree) ⇒ Object

Rebase, test, push, then let the merger agent create PR + merge + close issue.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/ocak/merge_manager.rb', line 21

def merge(issue_number, worktree)
  @logger.info("Starting merge for issue ##{issue_number}")

  commit_uncommitted_changes(issue_number, worktree)

  unless rebase_onto_main(worktree)
    @logger.error("Rebase failed for issue ##{issue_number}")
    return false
  end

  unless verify_tests(worktree)
    @logger.error("Tests failed after rebase for issue ##{issue_number}")
    return false
  end

  unless push_branch(worktree)
    @logger.error("Push failed for issue ##{issue_number}")
    return false
  end

  result = @claude.run_agent(
    'merger',
    "Create a PR, merge it, and close issue ##{issue_number}. Branch: #{worktree.branch}",
    chdir: worktree.path
  )

  if result.success?
    @logger.info("Issue ##{issue_number} merged successfully")
    true
  else
    @logger.error("Merger agent failed for issue ##{issue_number}")
    false
  end
end