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,
lib/brainiac/plugins/fizzy/handlers/summarize.rb

Defined Under Namespace

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

Constant Summary collapse

VERSION =
"0.0.18"

Class Method Summary collapse

Class Method Details

.cli(args) ⇒ Object

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



597
598
599
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 597

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

.completionsObject

Subcommand names for bash completion.



602
603
604
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 602

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, board_key: nil) ⇒ Object



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

def handle_publish_or_triage(action, payload, board_key: nil)
  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, board_key: board_key) if assignees.any? { |a| local_agent_names.include?(a["name"]) }
  end

  handle_card_published(payload, board_key: board_key)
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.



607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 607

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"] ||= []

  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.



637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
# File 'lib/brainiac/plugins/fizzy/cli.rb', line 637

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



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

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