Skip to main content

lib/mix/tasks/bb_jido.install.ex

# SPDX-FileCopyrightText: 2026 James Harton
#
# SPDX-License-Identifier: Apache-2.0

if Code.ensure_loaded?(Igniter) do
  defmodule Mix.Tasks.BbJido.Install do
    @shortdoc "Installs bb_jido into a project"
    @moduledoc """
    #{@shortdoc}

    Always composes `bb_jido.add_jido_instance`, which creates a Jido
    instance module and wires it into the application supervision tree.

    If `--robot` is supplied, also composes `bb_jido.add_agent` to scaffold
    an agent module that drives that robot.

    ## Examples

    ```bash
    mix igniter.install bb_jido
    mix igniter.install bb_jido --robot MyApp.Robot
    mix igniter.install bb_jido --robot MyApp.Robot --jido-instance MyApp.AgentRuntime
    ```

    ## Options

    * `--robot` - If given, scaffolds an agent module for this robot.
    * `--agent` - The agent module name (passed to `bb_jido.add_agent`).
    * `--jido-instance` - The Jido instance module name (passed to
      `bb_jido.add_jido_instance`).
    """

    use Igniter.Mix.Task

    @impl Igniter.Mix.Task
    def info(_argv, _parent) do
      %Igniter.Mix.Task.Info{
        composes: ["bb_jido.add_jido_instance", "bb_jido.add_agent"],
        schema: [robot: :string, agent: :string, jido_instance: :string],
        aliases: [r: :robot, a: :agent, j: :jido_instance]
      }
    end

    @impl Igniter.Mix.Task
    def igniter(igniter) do
      igniter
      |> Igniter.compose_task("bb_jido.add_jido_instance", instance_argv(igniter))
      |> maybe_add_agent()
    end

    defp instance_argv(igniter) do
      case Keyword.get(igniter.args.options, :jido_instance) do
        nil -> []
        value -> ["--jido-instance", value]
      end
    end

    defp maybe_add_agent(igniter) do
      case Keyword.get(igniter.args.options, :robot) do
        nil ->
          igniter

        robot ->
          argv = ["--robot", robot] ++ agent_argv(igniter)
          Igniter.compose_task(igniter, "bb_jido.add_agent", argv)
      end
    end

    defp agent_argv(igniter) do
      case Keyword.get(igniter.args.options, :agent) do
        nil -> []
        value -> ["--agent", value]
      end
    end
  end
else
  defmodule Mix.Tasks.BbJido.Install do
    @shortdoc "Installs bb_jido into a project"
    @moduledoc false
    use Mix.Task

    def run(_argv) do
      Mix.shell().error("""
      The bb_jido.install task requires igniter. Please install igniter and try again.

          mix igniter.install bb_jido
      """)

      exit({:shutdown, 1})
    end
  end
end