defmodule Mix.Tasks.Closeout.Verify do
use Mix.Task
alias Crosswake.Planning.CloseoutVerifier
@shortdoc "Verify milestone closeout planning truth"
@moduledoc """
Runs deterministic closeout checks over planning artifacts and release truth.
"""
@switches [cwd: :string, security_closeout: :string, security_only: :boolean, closeout_path: :string]
@impl Mix.Task
def run(args) do
{opts, _argv, invalid} = OptionParser.parse(args, strict: @switches)
if invalid != [] do
Mix.raise("closeout.verify invalid options: #{inspect(invalid)}")
end
if opts[:security_only] == true and is_nil(opts[:security_closeout]) do
Mix.raise("closeout.verify --security-only requires --security-closeout PATH")
end
report =
CloseoutVerifier.run(
cwd: opts[:cwd] || File.cwd!(),
closeout_path: opts[:closeout_path],
security_closeout_path: opts[:security_closeout],
security_only?: opts[:security_only] == true
)
Mix.shell().info(CloseoutVerifier.render(report))
if report.status == :failed do
Mix.raise("closeout verification found blocking issues")
end
end
end