Skip to main content

lib/pixir/tools/skills_list.ex

defmodule Pixir.Tools.SkillsList do
  @moduledoc "List registered Skills with bounded metadata (ADR 0010)."

  use Pixir.Tool

  alias Pixir.{Skills, Tool}

  @impl Pixir.Tool
  def __tool__ do
    %{
      name: "skills_list",
      description:
        "List available agent Skills by name, description, scope, and short path. Does not load full Skill instructions or supporting resources.",
      parameters: %{
        "type" => "object",
        "properties" => %{},
        "required" => []
      }
    }
  end

  @impl Pixir.Tool
  def execute(_args, context) do
    {:ok, result} = Skills.discover(context.workspace, Map.get(context, :skills_opts, []))
    payload = %{skills: result.skills, warnings: result.warnings}

    {:ok,
     %{
       "output" => Tool.truncate(Jason.encode!(stringify(payload), pretty: true)),
       "skills" => Enum.map(result.skills, &skill_metadata/1),
       "warnings" => result.warnings
     }}
  end

  @impl Pixir.Tool
  def dry_run(_args, context) do
    {:ok, %{skills: skills}} =
      Skills.discover(context.workspace, Map.get(context, :skills_opts, []))

    {:ok, %{"dry_run" => true, "would" => "list_skills", "skills" => length(skills)}}
  end

  defp skill_metadata(skill) do
    %{
      "name" => skill.name,
      "description" => skill.description,
      "scope" => skill.scope,
      "source" => skill.source,
      "path" => skill.path,
      "short_path" => skill.short_path
    }
  end

  defp stringify(%{skills: skills, warnings: warnings}) do
    %{"skills" => Enum.map(skills, &skill_metadata/1), "warnings" => warnings}
  end
end