Module: Brainiac::Plugins::Fizzy

Defined in:
lib/brainiac/plugins/fizzy.rb,
lib/brainiac/plugins/fizzy/cli.rb,
lib/brainiac/plugins/fizzy/hooks.rb,
lib/brainiac/plugins/fizzy/config.rb,
lib/brainiac/plugins/fizzy/helpers.rb,
lib/brainiac/plugins/fizzy/prompts.rb,
lib/brainiac/plugins/fizzy/version.rb,
lib/brainiac/plugins/fizzy/metadata.rb,
lib/brainiac/plugins/fizzy/planning.rb

Defined Under Namespace

Modules: Cli, Config, Helpers, Hooks, Planning, Prompts

Constant Summary collapse

VERSION =
"0.0.7"

Class Method Summary collapse

Class Method Details

.cli(args) ⇒ Object

Plugin CLI entry point — called by brainiac core's plugin delegation.



132
133
134
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 132

def self.cli(args)
  Cli.run(args)
end

.completionsObject

Subcommand names for bash completion.



137
138
139
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 137

def self.completions
  %w[config status setup]
end

.configured?Boolean

Returns true if Fizzy has at least one board configured.

Returns:

  • (Boolean)


12
13
14
15
16
17
18
19
20
# File 'lib/brainiac/plugins/fizzy/metadata.rb', line 12

def self.configured?
  config_file = File.join(ENV.fetch("BRAINIAC_DIR", File.join(Dir.home, ".brainiac")), "fizzy.json")
  return false unless File.exist?(config_file)

  config = JSON.parse(File.read(config_file))
  !(config["boards"] || {}).empty?
rescue StandardError
  false
end

.handle_publish_or_triage(action, payload) ⇒ Object



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/brainiac/plugins/fizzy.rb', line 177

def handle_publish_or_triage(action, payload)
  eventable = payload["eventable"] || {}
  card_number = eventable["number"]&.to_s

  if action == "card_triaged" && card_number
    return [200, { status: "ignored", reason: "self_move" }.to_json] if self_move_recent?(card_number)
    return [200, { status: "ignored", reason: "card_merged" }.to_json] if work_item_merged?(card_number)

    card_key = "card-#{card_number}"
    return [200, { status: "ignored", reason: "recently_completed" }.to_json] if recently_completed?(card_key)
  end

  if action == "card_published"
    assignees = eventable["assignees"] || []
    return handle_card_assigned(payload) if assignees.any? { |a| local_agent_names.include?(a["name"]) }
  end

  handle_card_published(payload)
end

.help_textObject

Help text shown in brainiac help when the plugin is installed.



23
24
25
# File 'lib/brainiac/plugins/fizzy/metadata.rb', line 23

def self.help_text
  "    brainiac fizzy <command>      Manage Fizzy boards"
end

.on_agent_created(agent_key, entry) ⇒ Object

Called by brainiac CLI after agent create — prompts for Fizzy user ID.



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 142

def self.on_agent_created(agent_key, entry)
  return unless $stdin.tty?

  config_file = File.join(ENV.fetch("BRAINIAC_DIR", File.join(Dir.home, ".brainiac")), "fizzy.json")
  return unless File.exist?(config_file)

  display_name = entry["display_name"] || agent_key.capitalize
  puts ""
  puts "  [Fizzy] Configure Fizzy for #{display_name}?"
  print "  Fizzy user ID (or blank to skip): "
  user_id = $stdin.gets&.chomp
  return if user_id.nil? || user_id.empty?

  config = JSON.parse(File.read(config_file))
  config["authorized_users"] ||= []

  # Don't add if already present
  existing = config["authorized_users"].find { |u| u["id"] == user_id || u["name"]&.downcase == display_name.downcase }
  if existing
    puts "#{display_name} already in authorized_users (id: #{existing["id"]})"
    return
  end

  config["authorized_users"] << { "id" => user_id, "name" => display_name, "human" => false }
  File.write(config_file, JSON.pretty_generate(config))
  puts "  ✓ Added #{display_name} (#{user_id}) to fizzy.json authorized_users"
rescue JSON::ParserError => e
  puts "  ⚠ Could not update fizzy.json: #{e.message}"
end

.on_agent_removed(agent_key, display_name) ⇒ Object

Called by brainiac CLI after agent remove — removes from Fizzy authorized_users.



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 173

def self.on_agent_removed(agent_key, display_name)
  config_file = File.join(ENV.fetch("BRAINIAC_DIR", File.join(Dir.home, ".brainiac")), "fizzy.json")
  return unless File.exist?(config_file)

  config = JSON.parse(File.read(config_file))
  users = config["authorized_users"]
  return unless users

  original_size = users.size
  users.reject! { |u| u["name"]&.downcase == display_name.downcase || u["name"]&.downcase == agent_key }
  return if users.size == original_size

  File.write(config_file, JSON.pretty_generate(config))
  puts "  [Fizzy] Removed #{display_name} from fizzy.json authorized_users"
rescue JSON::ParserError
  nil
end

.register(app) ⇒ Object

Called by Brainiac plugin system during server startup.

Parameters:

  • app (Sinatra::Application)

    The running Brainiac server



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/brainiac/plugins/fizzy.rb', line 27

def register(app)
  # Load Fizzy config
  Brainiac::Plugins::Fizzy::Config.load!

  # Register channel prompt
  Brainiac.register_channel_prompt(:fizzy,
                                   Brainiac::Plugins::Fizzy::Prompts::CHANNEL,
                                   pre_post_check: Brainiac::Plugins::Fizzy::Prompts::PRE_POST_CHECK)

  # Register lifecycle hooks
  Brainiac::Plugins::Fizzy::Hooks.register_all!

  # Set up webhook route
  setup_routes(app)

  LOG.info "[Fizzy] Plugin registered (webhook: /fizzy)"
end