brainiac-fizzy 0.0.17 → 0.0.18

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: 666eda5c356c3b8cc120591eb71c40090b3162adace36563b5c3e1e406aa4154
4
- data.tar.gz: 51bf4ff7967fd7bcceeedc9ee292a5a5a4a98c4b12d411926780c1722ae125c1
3
+ metadata.gz: 34a03eed47ca8ae2a7de8ec8351962c5a3aa59652d7466c14221d4919866519f
4
+ data.tar.gz: e18090ad45a15ce328c6c1fdabc267e32c29868bd28e36f6540af7ed1ace6436
5
5
  SHA512:
6
- metadata.gz: 8180e6607b5411e10bad40abb263f22fd18c901df1ba0890a7131e8c8fa801836f88cbacda745b2edcafc50144ab5b96d7b613e06d3758df599cac5a28b1a3cd
7
- data.tar.gz: 5ffdf9eec9082d78ee43c130fef1ef0c1b1e94a2533991acb2f43f9ab84d700fe397444862fa83d92bb5d7398a9402ebb06e2eb55e2d227546d287b73af5f3b8
6
+ metadata.gz: 4db395ff509a514e144c4237affb376ac43de3d2a04ed0a5e89a12f5260c7b02ad144344b3bab5e471f9a617df1af3bbcc99ed29c2151c2e3b61d99df6f5f9c4
7
+ data.tar.gz: d9c0cfdcec762022846ed40cc2e8713504f55c6206df41024c484ec9eade1378d60d82e3dd593ebdf76261d7cbcb8bde25f10dfb863830af2e76aca431b960c2
@@ -92,7 +92,7 @@ module Brainiac
92
92
  user && user["human"]
93
93
  end
94
94
 
95
- def identify_project_by_tags(tags)
95
+ def identify_project_by_tags(tags, board_key: nil)
96
96
  tag_names = tags.map { |t| t.is_a?(Hash) ? t["name"] : t.to_s }.map(&:downcase)
97
97
 
98
98
  PROJECTS.each do |key, config|
@@ -100,7 +100,21 @@ module Brainiac
100
100
  return [key, config] if tag_names.intersect?(project_tags)
101
101
  end
102
102
 
103
- # Fall back to default project
103
+ # Fall back to board's default_project if configured
104
+ if board_key
105
+ board_config = @boards[board_key]
106
+ if board_config && board_config["default_project"]
107
+ project_key = board_config["default_project"]
108
+ return [project_key, PROJECTS[project_key]] if PROJECTS.key?(project_key)
109
+ end
110
+
111
+ # Fall back to any project whose fizzy_board matches this board_key
112
+ PROJECTS.each do |key, config|
113
+ return [key, config] if config["fizzy_board"] == board_key
114
+ end
115
+ end
116
+
117
+ # Fall back to global default project
104
118
  default_key = default_project_key
105
119
  default_key ? [default_key, PROJECTS[default_key]] : nil
106
120
  end
@@ -72,8 +72,8 @@ def verify_signature!(request, payload_body, board_key: nil)
72
72
  end
73
73
 
74
74
  # Config delegators
75
- def identify_project_by_tags(tags)
76
- Brainiac::Plugins::Fizzy::Config.identify_project_by_tags(tags)
75
+ def identify_project_by_tags(tags, board_key: nil)
76
+ Brainiac::Plugins::Fizzy::Config.identify_project_by_tags(tags, board_key: board_key)
77
77
  end
78
78
 
79
79
  def board_config(board_key)
@@ -114,14 +114,14 @@ end
114
114
 
115
115
  # Webhook dispatch — routes incoming actions to the appropriate handler.
116
116
  # Called from within the Sinatra route block, so it must be a top-level method.
117
- def dispatch_webhook_action(action, payload)
117
+ def dispatch_webhook_action(action, payload, board_key: nil)
118
118
  case action
119
119
  when "card_assigned"
120
- handle_card_assigned(payload)
120
+ handle_card_assigned(payload, board_key: board_key)
121
121
  when "comment_created"
122
- handle_comment(payload)
122
+ handle_comment(payload, board_key: board_key)
123
123
  when "card_published", "card_triaged"
124
- Brainiac::Plugins::Fizzy.handle_publish_or_triage(action, payload)
124
+ Brainiac::Plugins::Fizzy.handle_publish_or_triage(action, payload, board_key: board_key)
125
125
  else
126
126
  LOG.info "[Fizzy] Ignoring unknown action: #{action}"
127
127
  [200, { status: "ignored", action: action }.to_json]
@@ -5,7 +5,7 @@
5
5
  # When a card is assigned to a local agent, creates a worktree, builds the prompt,
6
6
  # and dispatches the agent to begin work.
7
7
 
8
- def handle_card_assigned(payload)
8
+ def handle_card_assigned(payload, board_key: nil)
9
9
  eventable = payload["eventable"] || {}
10
10
  assignees = eventable["assignees"] || []
11
11
 
@@ -23,10 +23,10 @@ def handle_card_assigned(payload)
23
23
  title = eventable["title"] || "untitled"
24
24
  tags = eventable["tags"] || []
25
25
 
26
- project_result = identify_project_by_tags(tags)
26
+ project_result = identify_project_by_tags(tags, board_key: board_key)
27
27
  unless project_result
28
28
  tag_names = tags.map { |t| t.is_a?(Hash) ? t["name"] : t }.join(", ")
29
- LOG.warn "No project found for card ##{card_number} with tags: #{tag_names}"
29
+ LOG.warn "No project found for card ##{card_number} with tags: #{tag_names} (board: #{board_key})"
30
30
  return [200, { status: "ignored", reason: "no matching project" }.to_json]
31
31
  end
32
32
 
@@ -21,7 +21,7 @@ CommentContext = Struct.new(
21
21
  keyword_init: true
22
22
  )
23
23
 
24
- def handle_comment(payload)
24
+ def handle_comment(payload, board_key: nil)
25
25
  eventable = payload["eventable"] || {}
26
26
  plain_text = eventable.dig("body", "plain_text") || ""
27
27
  card_internal_id = eventable.dig("card", "id")
@@ -44,7 +44,7 @@ def handle_comment(payload)
44
44
  card_info = lookup_fizzy_card_info(card_internal_id)
45
45
  comment_id = eventable["id"]
46
46
 
47
- project_config, project_key = resolve_fizzy_project(card_info, card_internal_id, eventable)
47
+ project_config, project_key = resolve_fizzy_project(card_info, card_internal_id, eventable, board_key: board_key)
48
48
  return [200, { status: "ignored", reason: "no matching project" }.to_json] unless project_config
49
49
 
50
50
  tags = parse_inline_tags(plain_text)
@@ -285,14 +285,14 @@ def handle_cancel_command(eventable, card_internal_id)
285
285
  [200, { status: "cancelled", card: card_number_for_cancel || card_internal_id, sessions_killed: killed }.to_json]
286
286
  end
287
287
 
288
- def resolve_fizzy_project(card_info, card_internal_id, eventable)
288
+ def resolve_fizzy_project(card_info, card_internal_id, eventable, board_key: nil)
289
289
  if card_info
290
290
  if card_info["project"]
291
291
  project_key = card_info["project"]
292
292
  project_config = PROJECTS[project_key] || DEFAULT_PROJECT
293
293
  else
294
294
  card_tags = eventable.dig("card", "tags") || []
295
- project_result = identify_project_by_tags(card_tags)
295
+ project_result = identify_project_by_tags(card_tags, board_key: board_key)
296
296
  if project_result
297
297
  project_key, project_config = project_result
298
298
  card_info["project"] = project_key
@@ -305,7 +305,7 @@ def resolve_fizzy_project(card_info, card_internal_id, eventable)
305
305
  end
306
306
  else
307
307
  card_tags = eventable.dig("card", "tags") || []
308
- project_result = identify_project_by_tags(card_tags)
308
+ project_result = identify_project_by_tags(card_tags, board_key: board_key)
309
309
  if project_result
310
310
  project_key, project_config = project_result
311
311
  else
@@ -5,7 +5,7 @@
5
5
  # When a new card is created, checks for similar existing cards using
6
6
  # trigram and semantic similarity. Posts a warning comment if duplicates found.
7
7
 
8
- def handle_card_published(payload)
8
+ def handle_card_published(payload, board_key: nil)
9
9
  eventable = payload["eventable"] || {}
10
10
  card_number = eventable["number"]
11
11
  title = eventable["title"] || ""
@@ -3,7 +3,7 @@
3
3
  module Brainiac
4
4
  module Plugins
5
5
  module Fizzy
6
- VERSION = "0.0.17"
6
+ VERSION = "0.0.18"
7
7
  end
8
8
  end
9
9
  end
@@ -78,7 +78,7 @@ module Brainiac
78
78
  reload_projects!
79
79
  reload_agent_registry!
80
80
 
81
- status_code, body = dispatch_webhook_action(action, payload)
81
+ status_code, body = dispatch_webhook_action(action, payload, board_key: board_key)
82
82
  LOG.info "[Fizzy] #{action} response: #{status_code} - #{body}"
83
83
  halt status_code, body
84
84
  rescue JSON::ParserError => e
@@ -175,7 +175,7 @@ module Brainiac
175
175
 
176
176
  public
177
177
 
178
- def handle_publish_or_triage(action, payload)
178
+ def handle_publish_or_triage(action, payload, board_key: nil)
179
179
  eventable = payload["eventable"] || {}
180
180
  card_number = eventable["number"]&.to_s
181
181
 
@@ -189,10 +189,10 @@ module Brainiac
189
189
 
190
190
  if action == "card_published"
191
191
  assignees = eventable["assignees"] || []
192
- return handle_card_assigned(payload) if assignees.any? { |a| local_agent_names.include?(a["name"]) }
192
+ return handle_card_assigned(payload, board_key: board_key) if assignees.any? { |a| local_agent_names.include?(a["name"]) }
193
193
  end
194
194
 
195
- handle_card_published(payload)
195
+ handle_card_published(payload, board_key: board_key)
196
196
  end
197
197
  end
198
198
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brainiac-fizzy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Davis