brainiac-github 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/brainiac/plugins/github/handler.rb +54 -4
- data/lib/brainiac/plugins/github/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 43962acb8ab8344a4e420e841550114d53082045252252ad340944dad73d267f
|
|
4
|
+
data.tar.gz: eb8769a6f13771b1d057133fe8c72c3f3482602528ad0494475eb14022ea0d33
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bf3b0e3b90397dfd8232b2bd1fefab1f228dbb2b206d4f9b2766cbd064b6b2c9f4007bd651a7f3ab4ae91bd8934d674e814c931ef4549cf38eaa70b58d74b182
|
|
7
|
+
data.tar.gz: b22dae8eacf0a45f9032eaadf63a33e945a17d4647ced3195254eb48d17962c2cf459a52214948d29407066c5217a09f21c093876cdd4dbde5e177e1296cabd2
|
|
@@ -14,6 +14,21 @@ module Brainiac
|
|
|
14
14
|
repo_full_name = payload.dig("repository", "full_name")
|
|
15
15
|
|
|
16
16
|
default_branch = payload.dig("repository", "default_branch") || "main"
|
|
17
|
+
|
|
18
|
+
# Extract card number from branch name (e.g., "fizzy-1182-add-goodbye-method" → 1182)
|
|
19
|
+
card_number_from_branch = branch&.match(/^fizzy-(\d+)-/)&.[](1)&.to_i
|
|
20
|
+
|
|
21
|
+
# Emit a hook for ALL merges (including epic branches) so consumers can decide
|
|
22
|
+
if card_number_from_branch
|
|
23
|
+
Brainiac.emit(:pr_merged_to_branch,
|
|
24
|
+
card_number: card_number_from_branch,
|
|
25
|
+
branch: branch,
|
|
26
|
+
base_branch: base,
|
|
27
|
+
pr_url: pr_url,
|
|
28
|
+
pr_title: pr_title,
|
|
29
|
+
repo_full_name: repo_full_name)
|
|
30
|
+
end
|
|
31
|
+
|
|
17
32
|
unless base == default_branch
|
|
18
33
|
LOG.info "PR merged into #{base}, not #{default_branch} — ignoring"
|
|
19
34
|
return [200, { status: "ignored", reason: "not merged into #{default_branch}" }.to_json]
|
|
@@ -52,6 +67,27 @@ module Brainiac
|
|
|
52
67
|
|
|
53
68
|
def handle_pr_opened(payload)
|
|
54
69
|
track_pr_in_work_items(payload)
|
|
70
|
+
|
|
71
|
+
# Emit :pr_opened hook so plugins (e.g., brainiac-basecamp) can trigger review gates.
|
|
72
|
+
pr = payload["pull_request"]
|
|
73
|
+
branch = pr.dig("head", "ref")
|
|
74
|
+
|
|
75
|
+
result = find_work_item_by_branch(branch)
|
|
76
|
+
if result
|
|
77
|
+
_internal_id, card_info = result
|
|
78
|
+
card_number = extract_card_number(card_info)
|
|
79
|
+
pr_number = pr["number"]
|
|
80
|
+
repo_name = payload.dig("repository", "full_name")
|
|
81
|
+
repo_path = card_info["worktree"] || find_repo_path_for(payload)
|
|
82
|
+
base_branch = pr.dig("base", "ref")
|
|
83
|
+
|
|
84
|
+
Brainiac.emit(:pr_opened,
|
|
85
|
+
card_number: card_number, card_info: card_info,
|
|
86
|
+
pr_number: pr_number, repo_name: repo_name,
|
|
87
|
+
repo_path: repo_path, branch: branch,
|
|
88
|
+
base_branch: base_branch, pull_request: pr)
|
|
89
|
+
end
|
|
90
|
+
|
|
55
91
|
[200, { status: "processed", action: "pr_tracked" }.to_json]
|
|
56
92
|
end
|
|
57
93
|
|
|
@@ -90,10 +126,6 @@ module Brainiac
|
|
|
90
126
|
review_state = review["state"]
|
|
91
127
|
reviewer = review.dig("user", "login")
|
|
92
128
|
|
|
93
|
-
unless %w[changes_requested commented].include?(review_state)
|
|
94
|
-
return [200, { status: "ignored", reason: "review state: #{review_state}" }.to_json]
|
|
95
|
-
end
|
|
96
|
-
|
|
97
129
|
project_result = identify_project_by_repo(repo_name)
|
|
98
130
|
return [200, { status: "ignored", reason: "no matching project" }.to_json] unless project_result
|
|
99
131
|
|
|
@@ -113,6 +145,24 @@ module Brainiac
|
|
|
113
145
|
card_info = {}
|
|
114
146
|
card_number = nil
|
|
115
147
|
end
|
|
148
|
+
|
|
149
|
+
# Always emit the hook so gate tracking works for approvals too
|
|
150
|
+
Brainiac.emit(:pr_review_received,
|
|
151
|
+
card_number: card_number,
|
|
152
|
+
reviewer: reviewer,
|
|
153
|
+
review_state: review_state,
|
|
154
|
+
pr_number: pr_number,
|
|
155
|
+
repo_name: repo_name,
|
|
156
|
+
project_config: project_config,
|
|
157
|
+
repo_path: repo_path)
|
|
158
|
+
|
|
159
|
+
# Only dispatch the implementation agent for changes_requested or commented reviews
|
|
160
|
+
# Approvals don't need the agent to do anything (the gate hook handles the flow)
|
|
161
|
+
unless %w[changes_requested commented].include?(review_state)
|
|
162
|
+
LOG.info "PR review (#{review_state}) by #{reviewer} on PR ##{pr_number} — hook emitted, no agent dispatch"
|
|
163
|
+
return [200, { status: "processed", card: card_number, pr: pr_number, reviewer: reviewer, action: "hook_only" }.to_json]
|
|
164
|
+
end
|
|
165
|
+
|
|
116
166
|
card_key = "pr-review-#{repo_name.tr("/", "-")}-#{pr_number}"
|
|
117
167
|
|
|
118
168
|
return [200, { status: "ignored", reason: "session already active" }.to_json] if session_active?(card_key)
|