Create test fixtures and integration test helpers

## Background
All integration tests need test fixtures (OpenAPI spec files) and helper functions to set up hermetic test environments. This bead creates the fixtures and test infrastructure that all other test beads depend on.

## Approach
1. Create tests/fixtures/petstore.json — download the standard Petstore v3 spec (JSON format, ~50KB, 19 endpoints)
2. Create tests/fixtures/petstore.yaml — same spec in YAML format (for format normalization tests)
3. Create tests/fixtures/minimal.json — minimal valid OpenAPI 3.0 spec (3 endpoints, for fast tests)
4. Create tests/helpers/mod.rs — shared test utilities:
   - setup_test_env() → creates tempdir, sets SWAGGER_CLI_HOME, returns TestEnv struct with paths
   - fetch_fixture(env, fixture_name, alias) → runs swagger-cli fetch with local fixture file
   - run_cmd(args) → creates assert_cmd Command with SWAGGER_CLI_HOME set
   - parse_robot_json(output) → parses stdout as serde_json::Value

## Acceptance Criteria
- [ ] petstore.json is a valid OpenAPI 3.0 spec with 19+ endpoints
- [ ] petstore.yaml is equivalent YAML version
- [ ] minimal.json is valid OpenAPI 3.0 with 3 endpoints
- [ ] setup_test_env() creates isolated tempdir with SWAGGER_CLI_HOME
- [ ] fetch_fixture() successfully caches a fixture spec
- [ ] All test helpers compile and can be used from integration tests

## Files
- CREATE: tests/fixtures/petstore.json (Petstore v3 spec)
- CREATE: tests/fixtures/petstore.yaml (same in YAML)
- CREATE: tests/fixtures/minimal.json (minimal 3-endpoint spec)
- CREATE: tests/helpers/mod.rs (TestEnv, setup_test_env, fetch_fixture, run_cmd, parse_robot_json)

## TDD Anchor
RED: Write `test_fixture_is_valid_json` — parse petstore.json, assert it has "openapi" and "paths" keys.
GREEN: Create the fixture file.
VERIFY: `cargo test test_fixture_is_valid`

## Edge Cases
- Fixtures must use absolute paths (canonicalize) for file:// URLs
- petstore.json should be a real Petstore spec, not a minimal stub
- SWAGGER_CLI_HOME must be set BEFORE any command runs (use env() on assert_cmd)
- Test helpers should clean up tempdirs (use TempDir which auto-cleans on drop)


Epic: Testing


Write integration tests for fetch and query commands

## Background
Integration tests validate the full command pipeline end-to-end: fetch → list → show → search → schemas → tags. These tests use assert_cmd to run the binary, mockito for HTTP mocking, and the test fixtures/helpers from the previous bead.

## Approach
Create tests/integration/ test files:

**fetch_test.rs:** test_fetch_success (local file), test_fetch_invalid_json, test_fetch_network_error, test_fetch_alias_exists, test_fetch_force_overwrites, test_fetch_yaml_file, test_fetch_stdin

**list_test.rs:** test_list_all_endpoints, test_list_filter_by_method, test_list_filter_by_tag, test_list_path_regex, test_list_invalid_regex_error, test_list_combined_filters, test_list_default_limit, test_list_all_flag

**show_test.rs:** test_show_endpoint_details, test_show_multiple_methods_error, test_show_expand_refs

**search_test.rs:** test_search_basic, test_search_exact, test_search_case_sensitive, test_search_in_paths_only, test_search_invalid_field_error

**schemas_test.rs:** test_schemas_list, test_schemas_show, test_schemas_name_filter

**aliases_test.rs:** test_aliases_list, test_aliases_rename, test_aliases_delete, test_aliases_set_default

## Acceptance Criteria
- [ ] All fetch tests pass (success, errors, force, YAML, stdin)
- [ ] All list tests pass (filters, sorting, limits)
- [ ] All show tests pass (details, ref expansion, method disambiguation)
- [ ] All search tests pass (basic, exact, case-sensitive, field scoping)
- [ ] Schema and alias tests pass
- [ ] All tests are hermetic (SWAGGER_CLI_HOME in tempdir)
- [ ] No real network calls (local fixtures or mockito)

## Edge Cases
- **Test isolation:** Each test MUST use its own tempdir for SWAGGER_CLI_HOME. Tests running in parallel must not share cache state.
- **CI binary not built:** Tests use assert_cmd which builds the binary. Ensure Cargo.toml has the right [[bin]] target.
- **Mockito port conflicts:** Each test needing a mock server should use mockito::Server::new() which picks a random port, not a hardcoded port.
- **Fixture file paths:** Use canonicalized absolute paths for local file fetch tests. Relative paths may break depending on test runner CWD.

## Files
- CREATE: tests/integration/fetch_test.rs
- CREATE: tests/integration/list_test.rs
- CREATE: tests/integration/show_test.rs
- CREATE: tests/integration/search_test.rs
- CREATE: tests/integration/schemas_test.rs
- CREATE: tests/integration/aliases_test.rs

## TDD Anchor
Write all tests listed above. Many will already exist as unit tests in individual command beads — this bead consolidates them as proper integration tests using assert_cmd binary invocation.
VERIFY: `cargo test --test '*'`

## Dependency Context
Uses test fixtures and helpers from bd-lx6 (Create test fixtures and integration test helpers). Tests the commands implemented in all query/management beads.


Implement schemas command with list and show modes

## Background
The schemas command lets users browse and inspect OpenAPI component schemas. Listing is index-backed (fast). Showing a specific schema loads raw.json via schema_ptr (same pattern as show command). Supports --name regex filter and --expand-refs with cycle detection.

## Approach
Implement src/cli/schemas.rs with SchemasArgs and execute():

**SchemasArgs:** alias (Option<String>), name (Option<String> — regex filter, invalid → USAGE_ERROR), list (bool, default action), show (Option<String> — schema name), expand_refs (bool), max_depth (u32, default 3).

**List mode (default):** Load index, filter schemas by --name regex, output names. Robot: data.schemas[] with name. Human: bulleted list with title.

**Show mode (--show Name):** Find schema in index by exact name match. Load raw via schema_ptr. If --expand-refs, use the same ref expansion from show command (src/core/refs.rs). Output full schema JSON.

## Acceptance Criteria
- [ ] `schemas petstore` lists all schema names (sorted by name)
- [ ] `schemas petstore --name ".*Pet.*"` filters by regex
- [ ] Invalid --name regex returns USAGE_ERROR
- [ ] `schemas petstore --show Pet --robot` returns full Pet schema JSON
- [ ] --expand-refs works on schema details
- [ ] Schema not found returns clear error
- [ ] List mode never loads raw.json
- [ ] Show mode validates raw_hash

## Edge Cases
- **Empty schemas (spec with no components/schemas):** Return ok:true with data.schemas as empty array.
- **Schema name with special characters:** Some schema names contain dots or hyphens (e.g., "Pet.Response"). Regex --name filter must handle these.
- **--show with non-existent schema name:** Return clear error with suggestion listing available schema names.
- **schema_ptr doesn't resolve in raw.json:** Return CacheIntegrity error (corrupted index). Should not happen if index was built correctly, but defend against it.

## Files
- MODIFY: src/cli/schemas.rs (SchemasArgs, execute)
- MODIFY: src/output/robot.rs (add output_schemas_list, output_schemas_show)
- MODIFY: src/output/human.rs (add output_schemas_list, output_schemas_show)

## TDD Anchor
RED: Write `test_schemas_list` — fetch petstore, run schemas --robot, assert data.schemas is array with correct count.
GREEN: Implement list mode.
VERIFY: `cargo test test_schemas_list`

## Dependency Context
Uses ref expansion from bd-1dj (show command, src/core/refs.rs). Uses CacheManager from bd-3ea.