tix-tracker 0.3.0

A terminal issue tracker: markdown + YAML frontmatter issues with a kanban TUI and CLI
Documentation
# Tasks

## 1. Detection refactor in `src/commands/agents.rs`

- [x] 1.1 Introduce a `Detected { spec_kitty: bool, openspec: bool }` value type with per-framework helpers `has_spec_kitty(root)` and `has_openspec(root)` (each a single `std::fs::metadata(...).map(|m| m.is_dir()).unwrap_or(false)`) and a `detect(root)` aggregator; verify `cargo test` compiles and the existing spec-kitty detection unit stays green
- [x] 1.2 Replace the inline `.kittify/` check in `agents::run` with `detect(root)` and thread the value through; verify a temp-dir `tix init-agents` run still creates the AGENTS.md block and a second run reports "already up to date"

## 2. Generalize `build_section` to the framework matrix

- [x] 2.1 Change `build_section(detect_spec_kitty: bool)` to `build_section(detected: Detected)` and confirm the no-framework output is byte-identical to the frozen golden block (existing `build_section_false_matches_golden_pre_mission_block` test updated to the new signature stays green)
- [x] 2.2 Add a frozen `OPENSPEC_SECTION` constant (heading `### Tracking OpenSpec work with tix`, `openspec/` detection mention, `--labels openspec` filing bullet with proposal/spec/plan in the issue body, `tix list --status "todo"`, `tix move <number> done [--commit <hash>]`, `tix edit <number>`) structurally parallel to `DOGFOODING_SECTION`
- [x] 2.3 Implement the composed splice (D3): collect enabled framework sections in fixed order (Spec Kitty then OpenSpec) and insert them as one fragment at the existing `### Storage layout` boundary via the current `replace(...)` technique; verify `build_section(Detected::NONE)` still equals the golden block and spec-kitty-only output is unchanged from today

## 3. Tests for the detection matrix

- [x] 3.1 Rework unit tests in `src/commands/agents.rs` to iterate the 4 detection states: subcommand-surface guard for all states, marker pair present once, dogfooding-section placement (between `### Updating` and `### Storage layout`) for each enabled framework; verify the matrix passes
- [x] 3.2 Add integration tests in `tests/agents.rs`: `openspec/` present → block contains the OpenSpec section; absent → block equals `golden_block()`; both present → both sections exactly once with Spec Kitty before OpenSpec; OpenSpec present-then-removed flip → section gone with no residue and no duplicate; re-run idempotency; verify the full `cargo test` suite passes

## 4. Documentation and self-hosted AGENTS.md

- [x] 4.1 Write `docs/openspec-integration.md` describing the OpenSpec detection marker, the generated dogfooding section, the `openspec` label convention, and the marker-boundary relationship to hand-maintained AGENTS.md content; cross-link from `docs/spec-kitty-integration.md`; verify the links resolve
- [x] 4.2 Regenerate this repo's AGENTS.md via `tix init-agents` and extend the repo-local (marker-external) tracking guidance with the OpenSpec workflow and `openspec` label; verify the `<!-- tix:start -->` block is intact, markers appear once, and a second `tix init-agents` run is a byte-identical no-op

## 5. Full verification

- [x] 5.1 Run the repository's `ready` gate (`cargo fmt --check`, `cargo clippy --all-targets --all-features -- -D warnings`, `cargo test`, `taplo format --check`) and confirm everything passes