ref:main

feat(standards): Standards epic CLI — applicability subcommand + --strict-standards gate #20

merged colechristensen cole.christensen@gmail.com wants to merge phase-3-standards-applicability-cli into main

CLI side of the Standards epic (#250) — single consolidated PR covering Phase 3 applicability and Phase 7 strict-standards gate.

Pairs with fangorn/anvil#153 (server counterpart, also consolidated).

Phase 3 — Applicability subcommand

anvil requirement applicability list STD-… --organization <slug>
anvil requirement applicability add STD-… --organization <slug> --repo <slug>
anvil requirement applicability remove STD-… --organization <slug> --repo <slug>

Routes to the new org-scoped endpoints:

  • GET /api/v1/:org/standards/:id/applicabilities
  • PUT /api/v1/:org/standards/:id/applicabilities/:repo_slug
  • DELETE /api/v1/:org/standards/:id/applicabilities/:repo_slug

Validation

  • Requires STD-* IDs; REQ-* rejected with “applicability is standards-only”.
  • Unknown prefix uses the existing unknown_prefix_error helper for consistency with create/update/view/delete.

Phase 7 — --strict-standards flag

anvil requirement status --strict-standards [--organization <slug>]

Hits the server’s strict_status/1 gate. Exits 0 if every (mandatory standard × applicable repo) is :covered, non-zero with a human-readable summary otherwise.

Test plan

  • Unit tests for prefix routing + standards-only rejection (applicability)
  • Unit tests for strict_standards_returns_ok_on_2xx_status_ok + strict_standards_errors_on_422_uncovered
  • Full Rust suite passes: 75 tests, 0 failures
  • cargo clippy --all-targets -- -D warnings clean
  • cargo fmt --all -- --check clean

Consolidation note

Originally split across PRs #20 (Phase 3 CLI) and #21 (Phase 7 CLI). Consolidated into this single PR per the workspace “one PR per repo per logical change” rule.

Pair PR

Server: fangorn/anvil#153.

Created May 24, 2026 at 02:20 UTC | Merged May 25, 2026 at 20:43 UTC by colechristensen cole.christensen@gmail.com