defmodule Scoria.MixProject do
use Mix.Project
@version "0.1.2"
def project do
[
app: :scoria,
version: @version,
description: description(),
elixir: "~> 1.19",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
deps: deps(),
aliases: aliases(),
docs: docs(),
package: package(),
source_url: "https://github.com/szTheory/scoria",
homepage_url: "https://hexdocs.pm/scoria",
test_load_filters: [
fn path ->
String.ends_with?(path, "_test.exs") and not excluded_test_path?(path)
end
],
test_ignore_filters: [&excluded_test_path?/1]
]
end
def cli do
[
preferred_envs: [
"scoria.test.adoption": :test,
"test.adoption": :test,
"scoria.test.runtime_to_handoff": :test,
"test.runtime_to_handoff": :test,
"scoria.test.semantic_fast_path": :test,
"test.semantic_fast_path": :test,
"scoria.test.knowledge": :test,
"test.knowledge": :test,
"scoria.warning_inventory": :test,
"scoria.warning_inventory.check_baseline": :test,
"scoria.test.ci_trust": :test,
"test.ci_trust": :test,
"scoria.test.install_contract": :test,
"test.install_contract": :test,
"scoria.test.support_copilot": :test,
"test.support_copilot": :test,
"scoria.test.connector": :test,
"test.connector": :test
]
]
end
# Specifies which paths to compile per environment.
defp elixirc_paths(:test), do: ["lib", "test/support"]
# `dev/` holds the dev-only host harness (DevEndpoint/DevRouter) that serves
# the dashboard via `mix phx.server`. It is excluded from the Hex package
# (see `package/0` files) so adopters never receive it.
defp elixirc_paths(:dev), do: ["lib", "dev"]
defp elixirc_paths(_), do: ["lib"]
# Host-app overlay templates and hex unpack fixtures must not compile in the root suite.
defp excluded_test_path?(path) do
String.starts_with?(path, "test/fixtures/") or
String.contains?(path, "host_app_proof/overlay/test/")
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger],
mod: {Scoria.Application, []}
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:tribunal, "~> 1.3"},
{:cloak, "~> 1.1"},
{:cloak_ecto, "~> 1.3"},
{:ecto_sql, "~> 3.10"},
{:oban, "~> 2.19"},
{:postgrex, ">= 0.0.0"},
{:pgvector, "~> 0.3.0"},
{:hammer, "~> 7.3"},
{:fuse, "~> 2.5"},
{:jason, "~> 1.4"},
{:plug, "~> 1.14"},
{:phoenix, "~> 1.7"},
{:phoenix_live_view, "~> 1.0"},
{:phoenix_html, "~> 4.1"},
{:phoenix_ecto, "~> 4.4"},
{:req, "~> 0.5"},
{:req_llm, "~> 1.13"},
{:tiktoken, "~> 0.4.2"},
{:ex_doc, "~> 0.38", only: :dev, runtime: false},
# Dev-only web server + live reload for the dev harness endpoint (dev/).
# Scoria is a library — adopters bring their own server — so these are
# never shipped to Hex (only: :dev). Bandit backs the DevEndpoint.
{:bandit, "~> 1.5", only: :dev},
{:phoenix_live_reload, "~> 1.5", only: :dev},
{:floki, ">= 0.30.0", only: :test},
{:lazy_html, ">= 0.1.0", only: :test}
]
end
defp aliases do
[
"assets.build": ["scoria.assets.build"],
"assets.deploy": ["scoria.assets.build"],
# Dev harness convenience: create+migrate (core+knowledge order)+seed the
# dev DB in one step. Used by the Docker entrypoint and fresh local setup.
"dev.setup": ["scoria.dev.db", "run priv/repo/dev_seed.exs"],
ci: ["scoria.ci"]
]
end
defp description do
"Phoenix-native AI ops: LLM traces, evals, prompt versions, replay, tool governance, and MCP workflows. Ecto-backed, LiveView-included."
end
defp docs do
[
main: "readme",
source_ref: "v#{@version}",
extras: [
"README.md",
"LICENSE",
"CHANGELOG.md",
"docs/adoption_lanes.md",
"docs/phoenix_runtime_example.md",
"docs/bounded_handoffs.md",
"docs/semantic_fast_path.md",
"docs/operator_verification.md",
"docs/connector_adoption.md",
"docs/support_copilot_gallery.md",
"docs/MAINTAINERS.md"
]
]
end
defp package do
[
name: "scoria",
files: [
"lib",
# Explicit priv/ subdirectory inclusions — the bare priv glob was replaced
# to prevent dev-only harness tooling from shipping to adopters (supply-chain
# control, T-11-06 / D-01 / D-02).
"priv/fixtures",
"priv/host_app_proof",
# priv/repo: migrations ship to adopters; dev_seed.exs is excluded by
# listing only the migration subdirs (not the whole dir).
# Open question #2 resolution: dev_seed.exs is a maintainer dev tool, not
# a runtime artifact — adopters do not need it in the package.
"priv/repo/migrations",
"priv/repo/knowledge_migrations",
"priv/static",
# priv/dev intentionally excluded — shots.mjs (screenshots) and e2e/ (the
# Playwright assertion lane) are dev-only harness tooling, not for adopters
# (D-01: zero Hex footprint for browser automation tooling). Do NOT add a
# priv/dev entry here — it would ship Playwright specs + node tooling.
# priv/shots intentionally excluded — screenshot captures are transient
# dev-only artifacts; only gap_register.md is committed (per .gitignore rules).
"mix.exs",
".formatter.exs",
"CHANGELOG.md",
"README.md",
"LICENSE",
"docs/adoption_lanes.md",
"docs/phoenix_runtime_example.md",
"docs/bounded_handoffs.md",
"docs/semantic_fast_path.md",
"docs/operator_verification.md",
"docs/connector_adoption.md",
"docs/support_copilot_gallery.md",
"docs/MAINTAINERS.md"
],
licenses: ["MIT"],
links: %{
"GitHub" => "https://github.com/szTheory/scoria",
"Documentation" => "https://hexdocs.pm/scoria",
"Changelog" => "https://hex.pm/packages/scoria/changelog"
},
tags: ~w(elixir phoenix ai llm mcp observability liveview workflows approvals)
]
end
end