defmodule Mead.MixProject do use Mix.Project @version "0.1.0" @source_url "https://github.com/jakeprem/mead" def project do [ app: :mead_pdf, version: @version, elixir: "~> 1.20", elixirc_paths: elixirc_paths(Mix.env()), start_permanent: Mix.env() == :prod, description: "Native PDF generation for Elixir: react-pdf-style ~PDF templates, flexbox layout, and a pure-Rust render backend. No browser, no external binaries.", package: package(), source_url: @source_url, docs: docs(), deps: deps(), aliases: aliases(), usage_rules: usage_rules() ] end defp docs do [ name: "Mead", main: "readme", source_ref: "v#{@version}", extras: ["README.md", "CHANGELOG.md", "LICENSE"], groups_for_modules: [ Core: [Mead, Mead.Node, Mead.Style], Templates: [Mead.Component, Mead.Markup], Fonts: [Mead.FontSet, Mead.Session] ] ] end defp package do [ name: "mead_pdf", licenses: ["MIT"], links: %{"GitHub" => @source_url}, # native source + workspace manifests ship for the MEAD_BUILD=1 # source-build fallback; priv/fonts is the bundled default face. files: ~w( lib native/mead_nif/src native/mead_nif/Cargo.toml native/mead_nif/Cargo.lock priv/fonts mix.exs README.md LICENSE CHANGELOG.md checksum-*.exs ) ] end # Run "mix help compile.app" to learn about applications. def application do [ extra_applications: [:logger] ] end defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixirc_paths(_), do: ["lib"] # Run "mix help deps" to learn about dependencies. defp deps do [ # Optional at runtime: only needed when MEAD_BUILD=1 forces a source # build (or during development of mead itself); users normally get a # precompiled NIF via rustler_precompiled. {:rustler, "~> 0.38", optional: true}, {:rustler_precompiled, "~> 0.8"}, # Templating layer only (see SPEC.md layering rule): TagEngine powers # the ~PDF sigil, Phoenix.Component provides attr/slot validation. {:phoenix_live_view, "~> 1.0"}, # Parses the markup emitted by ~PDF templates back into Node trees. # (Lenient HTML parsing: boolean attrs render bare, which XML rejects.) {:floki, "~> 0.36"}, # Dev/test tooling. {:stream_data, "~> 1.1", only: [:dev, :test]}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:styler, "~> 1.0", only: [:dev, :test], runtime: false}, {:usage_rules, "~> 1.2", only: [:dev]}, {:ex_doc, "~> 0.34", only: :dev, runtime: false}, # Tidewave runtime MCP server. No Phoenix endpoint here, so it's served # standalone via Bandit through the `mix tidewave` alias below. {:tidewave, "~> 0.6", only: :dev}, {:bandit, "~> 1.0", only: :dev} ] end defp aliases do [ # Serves the Tidewave MCP endpoint at http://localhost:4000/tidewave/mcp # (plain-Elixir setup: Bandit hosts the Tidewave plug, no Phoenix needed). tidewave: "run --no-halt -e 'Agent.start(fn -> Bandit.start_link(plug: Tidewave, port: 4000) end)'" ] end defp usage_rules do [ skills: [ location: ".claude/skills", build: [ "elixir-core": [ description: "Core Elixir and OTP usage rules, plus dependency doc search via mix usage_rules.search_docs. Consult when writing nontrivial Elixir.", usage_rules: [:usage_rules] ] ] ] ] end end