ref:main

Epic #329 — requirements/standards/issues completion (CLI / Rust) #33

merged colechristensen cole.christensen@gmail.com wants to merge feat/cli-json-requirement-read-status into main

The complete epic fangorn/anvil#329 CLI-side implementation (one PR per repo; the Elixir half is fangorn/anvil PR #193). Closes fangorn/anvil#330.

Machine-readable everything (Workstream B)

  • --json on the full requirement/standard surface: reads echo the server payload; requirement status / --strict / --strict-standards emit a computed summary ({passed, counts, failing/uncovered}) while preserving the non-zero exit for set -e gating; every mutation returns a uniform {"ok":true, <noun>:…} envelope (output::json_ok).
  • --json on: label family, milestone family, board family, issue list/view/comments/links + mutations, agent read family (list/view/sessions/session).
  • requirement matrix --run-id / --policy / --run-window (point-in-time coverage, fangorn/anvil#240).
  • requirement import <file|-> [--format] [--dry-run] + requirement export (import-schema YAML; round-trips incl. parent linkage) — completes fangorn/anvil#239 with the earlier link/unlink.

Real fixes

  • seed --clear actually clears (was a warn-only stub claiming “no delete endpoint”): hard-deletes children-first; ordering is deterministic now that the list endpoint carries parent_id (fangorn/anvil#331).
  • epic add-child was broken (404 on every call — sent a raw target the controller never read): now sends structured target_number/target_org/target_repo via the shared parse_target_ref, with a regression guard.

New commands (Workstreams C + F)

  • issue link-req <N> <REQ-…|STD-…> / unlink-req — manual requirement↔issue links (manual links survive rescans).
  • label edit/delete, milestone edit/close/reopen/delete, board init/create-column/edit-column/delete-column, issue move <N> --column <uuid>.

Verification

143 unit + 22 subprocess integration tests (the integration tests run the real binary against a wiremock server and parse stdout as JSON — including that the status gates exit non-zero with clean JSON on stdout). cargo fmt + clippy --all-targets -D warnings clean.

🤖 Generated with Claude Code

Created Jul 03, 2026 at 05:43 UTC | Merged Jul 07, 2026 at 13:04 UTC by colechristensen cole.christensen@gmail.com