Packages

Devcontainer setup for Elixir projects — operate at DevCon 4

Current section

Files

Jump to
devcon4 lib devcon4.ex
Raw

lib/devcon4.ex

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