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