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