# `Minga.Tool.Recipe`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/tool/recipe.ex#L1)

A recipe describing how to install a development tool (LSP server, formatter, etc.).

Recipes are the "what" and "how" of tool installation. They live in
`Tool.Recipe.Registry`, separate from language definitions. The link
between tools and languages is implicit through the command string:
if `ServerConfig.command == "expert"` and a recipe provides `"expert"`,
the tool manager can offer to install it.

## Fields

- `:name` - unique atom identifier (e.g., `:pyright`)
- `:label` - human-readable display name (e.g., "Pyright")
- `:description` - one-line description for the picker/manager UI
- `:provides` - list of command strings this tool makes available
- `:method` - installer method atom (`:npm`, `:pip`, `:cargo`, `:go_install`, `:github_release`)
- `:package` - package identifier (npm package name, GitHub "owner/repo", pip package, etc.)
- `:version` - version constraint or `"latest"`
- `:homepage` - URL for the tool's homepage/docs
- `:category` - UI grouping (`:lsp_server`, `:formatter`, `:linter`, `:debugger`)
- `:languages` - list of language atoms this tool serves (for UI grouping)
- `:asset_pattern` - optional function for GitHub release asset matching

## Example

    %Recipe{
      name: :pyright,
      label: "Pyright",
      description: "Fast Python type checker and language server",
      provides: ["pyright-langserver"],
      method: :npm,
      package: "pyright",
      version: "latest",
      homepage: "https://github.com/microsoft/pyright",
      category: :lsp_server,
      languages: [:python]
    }

# `category`

```elixir
@type category() :: :lsp_server | :formatter | :linter | :debugger
```

# `t`

```elixir
@type t() :: %Minga.Tool.Recipe{
  asset_pattern: (String.t(), String.t() -&gt; boolean()) | nil,
  category: category(),
  description: String.t(),
  homepage: String.t() | nil,
  label: String.t(),
  languages: [atom()],
  method: :npm | :pip | :cargo | :go_install | :github_release,
  name: atom(),
  package: String.t(),
  provides: [String.t()],
  version: String.t()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
