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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15281b0cda1699aa7d7b959380a43bd992b9d7a1a8930eba464047b2ff959d05
4
- data.tar.gz: a19b302521ae9d8711629e5b1785e3730a21fba35b01933fe7d1cbf78f77dd2c
3
+ metadata.gz: 43962acb8ab8344a4e420e841550114d53082045252252ad340944dad73d267f
4
+ data.tar.gz: eb8769a6f13771b1d057133fe8c72c3f3482602528ad0494475eb14022ea0d33
5
5
  SHA512:
6
- metadata.gz: 0dce21620964ed25764860b9f697578579b9340f6e8dadbb8dc1751b8e41c70a99d3c0d3f1e4c7f9876ce2d4e415d06f369a38553cdeff368ac722f83acc8e5b
7
- data.tar.gz: 4e38c8f2504dcd4f5bf0022a64debc513614d4073b846cfc6dab4ea3df249d9049a58a5c9518c1e40938877dd07ee54c7f0526097a97edd1482f6023114d9e30
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)
@@ -3,7 +3,7 @@
3
3
  module Brainiac
4
4
  module Plugins
5
5
  module Github
6
- VERSION = "0.2.1"
6
+ VERSION = "0.2.3"
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brainiac-github
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Davis