Aggregates kits from multiple providers and exposes skills, agents, tool definitions, and tool call classification.
Always Fresh
Every query calls providers via list_kits/1 — there is no internal
caching. This ensures the catalog always reflects the current state of
providers (important for Kit.Memory and other dynamic sources).
Summary
Functions
Returns the activate_skill tool definition filtered by :skills_remove_prefix,
or nil if no skills remain after filtering. Used by sub-loops that opt
into activate_skill exposure with optional namespace filtering.
Returns a specification to start this module under a supervisor.
Extracts the short name from a namespaced skill name.
Starts the catalog GenServer.
Returns {tool_module, metadata} for the given tool name, or nil if
no matching tool is registered.
Functions
@spec activate_skill_tool( GenServer.server() | SkillKit.Agent.t(), keyword() ) :: SkillKit.Tool.t() | nil
Returns the activate_skill tool definition filtered by :skills_remove_prefix,
or nil if no skills remain after filtering. Used by sub-loops that opt
into activate_skill exposure with optional namespace filtering.
@spec agent(GenServer.server() | SkillKit.Agent.t()) :: SkillKit.Agent.t() | nil
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec classify(GenServer.server() | SkillKit.Agent.t(), String.t()) :: :tool | :activate_skill | :subagent
@spec get_agent(GenServer.server() | SkillKit.Agent.t(), String.t()) :: {:ok, SkillKit.Agent.t()} | {:error, :not_found}
@spec get_skill(GenServer.server() | SkillKit.Agent.t(), String.t()) :: {:ok, SkillKit.Skill.t()} | {:error, :not_found | :unauthorized}
@spec list_agents(GenServer.server() | SkillKit.Agent.t()) :: [SkillKit.Agent.t()]
@spec list_hooks(GenServer.server() | SkillKit.Agent.t(), SkillKit.Hook.event()) :: [ SkillKit.Hook.t() ]
@spec list_skills(GenServer.server() | SkillKit.Agent.t()) :: [ {String.t(), String.t()} ]
Extracts the short name from a namespaced skill name.
Examples
iex> SkillKit.Catalog.skill_short_name("scheduler:schedule")
"schedule"
iex> SkillKit.Catalog.skill_short_name("standalone")
"standalone"
@spec start_link(keyword()) :: GenServer.on_start()
Starts the catalog GenServer.
Accepts two provider lists:
:tools— kit providers whosedefinition/0becomes a first-class tool the LLM can call directly.:skills— kit providers whose skills appear in theactivate_skillenum. Skills are not callable directly; activation forks a child agent that has the skill's underlying tool module added to its tools list.
Backward-compatible: a single :providers keyword (the pre-split API)
is accepted and treated as :skills.
@spec tool_config(GenServer.server() | SkillKit.Agent.t(), String.t()) :: {module(), map()} | nil
Returns {tool_module, metadata} for the given tool name, or nil if
no matching tool is registered.
@spec tool_definitions( GenServer.server() | SkillKit.Agent.t(), keyword() ) :: [SkillKit.Tool.t()]