defmodule Firebreak.MixProject do use Mix.Project @version "0.1.0" @source_url "https://github.com/b-erdem/firebreak" def project do [ app: :firebreak, version: @version, elixir: "~> 1.15", start_permanent: Mix.env() == :prod, deps: deps(), description: description(), package: package(), name: "Firebreak", source_url: @source_url, docs: docs(), test_coverage: [ # Pure `defstruct` data modules have no executable lines for `cover` to # instrument, so they always report 0%. Their load-bearing defaults are # asserted in test/units_test.exs; excluding them keeps the coverage # percentage about code that actually has behaviour. ignore_modules: [Firebreak.Child, Firebreak.Edge, Firebreak.Snapshot], # A floor, not the target. Overall coverage sits ~86%; modules with real # logic are 88-100%. The slack is structural: the `--observe` distribution # layer needs a live second node, and the AST parser / runtime extractor # keep defensive `rescue`/catch-all clauses that don't fire on valid input. summary: [threshold: 80] ] ] end def application do [ extra_applications: [:logger] ] end defp deps do [ {:ex_doc, "~> 0.31", only: :dev, runtime: false} ] end defp description do "Static analysis for OTP supervision trees and the coupling that crosses " <> "them. Flags structural anti-patterns and the cross-subtree dependencies " <> "the supervision tree alone can't show - no app boot, no LLM, CI-friendly." end defp package do [ licenses: ["MIT"], links: %{"GitHub" => @source_url}, files: ~w(lib mix.exs README.md CHANGELOG.md LICENSE .formatter.exs notes) ] end defp docs do [ main: "readme", extras: [ "README.md", "CHANGELOG.md", "notes/model-ir-contract.md" ], source_ref: "v#{@version}" ] end end