Quickstart — CLI Boundary Robustness
Dev + verification guide for implementers/reviewers of this mission.
Environment
uv sync --frozen --all-extras # never a bare `uv run` (destroys a hand-built .venv)
Reproduce the bugs (pre-fix, red)
# #4600 (P0) — in a throwaway init'd project:
printf '\xd0\xd0\xd0bad\xff' > .kittify/config.yaml
spec-kitty --version # RED: UnicodeDecodeError traceback, no version
# #4601 — prose on stdout under --json:
spec-kitty context info --workspace nope --json # RED: prose, not JSON
spec-kitty mission-type show nope --json # RED: prose
# #4643 — prose at exit 0 under --json:
spec-kitty agent tasks status --mission <empty-mission> --json # RED: "No work packages..." prose, exit 0
# #4597 — OptionInfo leak:
spec-kitty context # RED: <OptionInfo object ...> in output
# #4598 — inactive types shown:
spec-kitty mission-type list # RED: lists inactive types
Targeted test surface (per charter: run affected packages, not the full suite)
# WP01
PWHEADLESS=1 .venv/bin/python -m pytest tests/specify_cli/bootstrap/ -q
# WP02–WP05 adoption
PWHEADLESS=1 .venv/bin/python -m pytest tests/specify_cli/cli/ tests/status/ -q
# WP06 gates
PWHEADLESS=1 .venv/bin/python -m pytest tests/architectural/test_cli_console_single_seam.py -q
# shared baseline
make test-fast
Gates before hand-off
ruff check .
uv run --frozen ruff format --check . # whole-repo format gate
uv run --frozen mypy -p specify_cli # package-level (single-file mypy false-yells)
pytest tests/architectural/test_no_legacy_terminology.py # terminology guard (prose/offering touched)
ATDD discipline
the pre-existing entry point; reviewer confirms red-on-base / green-on-final.
- Each WP: commit the failing-first acceptance test BEFORE implementation.
- #4600 and #4643 carry issue-pinned
@pytest.mark.regressiontests driven through