Class: Ocak::MergeManager

Inherits:
Object
  • Object
show all
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.



9
10
11
12
13
14
15
# File 'lib/ocak/merge_manager.rb', line 9

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.



55
56
57
58
59
60
61
62
63
64
# File 'lib/ocak/merge_manager.rb', line 55

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.



18
19
20
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
# File 'lib/ocak/merge_manager.rb', line 18

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