defmodule Devcon4 do @moduledoc """ Devcontainer setup for Elixir projects — operate at DevCon 4. Provides a Mix archive installer that generates a complete `.devcontainer/` configuration with: * **Dockerfile** — Elixir + Node.js image with zsh and dev tools * **devcontainer.json** — container settings, volumes, and firewall initialization * **init-firewall.sh** — restrictive outbound firewall (GitHub, Hex.pm only by default) Optional packages can be added with `--add`: mix devcon4.install --add claude Available packages are defined in `priv/packages.yml`. ## Installation mix archive.install hex devcon4 ## Usage mix devcon4.install See `Mix.Tasks.Devcon4.Install` for available options. """ @external_resource "priv/packages.yml" @packages YamlElixir.read_from_file!("priv/packages.yml") @doc """ Returns the map of all available packages compiled from `priv/packages.yml`. """ def available_packages, do: @packages @doc """ Loads and validates the requested package names. Returns a list of `{name, config}` tuples. Raises if any name is unknown. """ def load_packages(names) do Enum.map(names, fn name -> case Map.get(@packages, name) do nil -> available = @packages |> Map.keys() |> Enum.sort() |> Enum.join(", ") Mix.raise("Unknown package: #{name}. Available packages: #{available}") pkg -> {name, pkg} end end) end @doc false def template_path(name) do Application.app_dir( :devcon4, Path.join(["priv", "templates", "devcontainer", name]) ) end end