Class: Aidp::Watch::HierarchicalPrStrategy

Inherits:
Object
  • Object
show all
Includes:
MessageDisplay
Defined in:
lib/aidp/watch/hierarchical_pr_strategy.rb

Overview

Handles hierarchical PR creation strategy for parent and sub-issues. Parent issues get draft PRs targeting main. Sub-issues get PRs targeting the parent’s branch.

Constant Summary collapse

PARENT_PR_LABEL =

Labels for hierarchical PR identification

"aidp-parent-pr"
SUB_PR_LABEL =
"aidp-sub-pr"

Constants included from MessageDisplay

MessageDisplay::COLOR_MAP, MessageDisplay::CRITICAL_TYPES

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MessageDisplay

#display_message, included, #message_display_prompt, #quiet_mode?

Constructor Details

#initialize(repository_client:, state_store:) ⇒ HierarchicalPrStrategy

Returns a new instance of HierarchicalPrStrategy.



19
20
21
22
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 19

def initialize(repository_client:, state_store:)
  @repository_client = repository_client
  @state_store = state_store
end

Instance Attribute Details

#repository_clientObject (readonly)

Returns the value of attribute repository_client.



17
18
19
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 17

def repository_client
  @repository_client
end

#state_storeObject (readonly)

Returns the value of attribute state_store.



17
18
19
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 17

def state_store
  @state_store
end

Instance Method Details

#branch_name_for(issue) ⇒ String

Generate branch name for hierarchical issues

Parameters:

  • issue (Hash)

    The issue data

Returns:

  • (String)

    The branch name



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 62

def branch_name_for(issue)
  issue_number = issue[:number]
  slug = issue_slug(issue)

  if parent_issue?(issue_number)
    # Parent branch: aidp/parent-{number}-{slug}
    "aidp/parent-#{issue_number}-#{slug}"
  elsif sub_issue?(issue_number)
    parent_number = @state_store.parent_issue(issue_number)
    # Sub-issue branch: aidp/sub-{parent}-{number}-{slug}
    "aidp/sub-#{parent_number}-#{issue_number}-#{slug}"
  else
    # Regular branch: aidp/issue-{number}-{slug}
    "aidp/issue-#{issue_number}-#{slug}"
  end
end

#parent_branch_for_sub_issue(issue_number) ⇒ String?

Get the base branch for a sub-issue PR (the parent’s branch)

Parameters:

  • issue_number (Integer)

    The sub-issue number

Returns:

  • (String, nil)

    The parent’s branch name, or nil if not found



98
99
100
101
102
103
104
105
106
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 98

def parent_branch_for_sub_issue(issue_number)
  parent_number = @state_store.parent_issue(issue_number)
  return nil unless parent_number

  parent_build = @state_store.workstream_for_issue(parent_number)
  return nil unless parent_build

  parent_build[:branch]
end

#parent_issue?(issue_number) ⇒ Boolean

Determine if an issue is a parent issue (has sub-issues)

Parameters:

  • issue_number (Integer)

    The issue number

Returns:

  • (Boolean)

    True if this is a parent issue



27
28
29
30
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 27

def parent_issue?(issue_number)
  sub_issues = @state_store.sub_issues(issue_number)
  sub_issues.any?
end

#pr_description_for(issue, plan_summary:) ⇒ String

Build PR description with hierarchy context

Parameters:

  • issue (Hash)

    The issue data

  • plan_summary (String)

    The plan summary

Returns:

  • (String)

    The PR description



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 83

def pr_description_for(issue, plan_summary:)
  issue_number = issue[:number]

  if parent_issue?(issue_number)
    build_parent_pr_description(issue, plan_summary)
  elsif sub_issue?(issue_number)
    build_sub_issue_pr_description(issue, plan_summary)
  else
    build_regular_pr_description(issue, plan_summary)
  end
end

#pr_options_for_issue(issue, default_base_branch:) ⇒ Hash

Get PR creation options for an issue based on its hierarchy position

Parameters:

  • issue (Hash)

    The issue data

  • default_base_branch (String)

    The default base branch (e.g., “main”)

Returns:

  • (Hash)

    PR options including :base_branch, :draft, :labels



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 44

def pr_options_for_issue(issue, default_base_branch:)
  issue_number = issue[:number]
  Aidp.log_debug("hierarchical_pr_strategy", "determining_pr_options",
    issue_number: issue_number, default_base: default_base_branch)

  if parent_issue?(issue_number)
    parent_pr_options(issue, default_base_branch)
  elsif sub_issue?(issue_number)
    sub_issue_pr_options(issue, default_base_branch)
  else
    # Regular issue - use default behavior
    regular_pr_options(issue, default_base_branch)
  end
end

#sub_issue?(issue_number) ⇒ Boolean

Determine if an issue is a sub-issue (has a parent)

Parameters:

  • issue_number (Integer)

    The issue number

Returns:

  • (Boolean)

    True if this is a sub-issue



35
36
37
38
# File 'lib/aidp/watch/hierarchical_pr_strategy.rb', line 35

def sub_issue?(issue_number)
  parent = @state_store.parent_issue(issue_number)
  !parent.nil?
end