// SPDX-License-Identifier: AGPL-3.0-only // SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts® module Crafter.Review:Driver_impl; import :Driver; import :Core; import :Platform; import :Process; import std; namespace Crafter::Review { namespace { constexpr std::string_view Usage = R"(usage: crafter-review [--config FILE] {run,freeze,slots,config} ... crafter-review {seats,inventory,sql,totp,init,doc,browser,stop} ... crafter-review --version The pre-push review pipeline: adversarial lenses, one claude process per inventory unit, against a frozen commit range.)"; std::int32_t PrintVersion() { std::println("{}", DriverLine()); try { std::println("home {}", Home().string()); for (const auto& [name, sha] : CharterHashes()) std::println("charter {} {}", name, sha); } catch (const std::exception& e) { std::println("home not found: {}", e.what()); } return 0; } } std::int32_t Main(std::span args) { const std::span rest = args.empty() ? args : args.subspan(1); // The supervisor first and alone: it is single-threaded and has to // stay so, and it runs between the driver and claude, not as a // command anyone types. if (!rest.empty() && rest.front() == Process::SuperviseVerb) return Process::SuperviseMain(rest.subspan(1)); Platform::Init(); if (!rest.empty() && rest.front() == "--version") return PrintVersion(); if (!rest.empty() && (rest.front() == "-h" || rest.front() == "--help")) { std::println("{}", Usage); return 0; } std::println(std::cerr, "{}", Usage); return 3; } }