### Description

- **Jira Ticket**: [GLU-XXXX]
- **Summary**: Introduce unified client abstractions for AI, GitHub, Jira, and local Git operations; refactor all CLI
commands and generators to use these clients; add end-to-end pexpect tests.
- **Implementation details**:
  - Created `ChatClient` in `glu/ai.py` to select and invoke AI models.
  - Added `GithubClient` (`glu/gh.py`), `JiraClient` (`glu/jira.py`), and `GitClient` (`glu/local.py`) to encapsulate
GitHub API calls, Jira interactions, and Git workflows.
  - Refactored PR and ticket CLI commands (`glu/cli/pr.py`, `glu/cli/ticket.py`) to obtain and use these clients instead
of direct helper functions.
  - Updated all `generate_*` functions to accept client objects and standardized prompt construction.
  - Bumped package version to 2.0.2, added `pytest`, `pexpect`, and `pytest-mock` to dev dependencies.
  - Extended `.github/workflows/cicd.yml` to run pytest; updated `.gitignore` and config path for test fixtures.
  - Added comprehensive integration tests (`tests/test_prs.py`, `tests/test_tickets.py`) using pexpect and fake clients.

### Changes

- glu/ai.py
  - Introduce `ChatClient`; remove direct `BaseChatModel` imports and `_get_chat_model`.
  - Refactor `generate_description`, `generate_ticket`, `generate_commit_message`, and `generate_branch_name` to use
`ChatClient`.
- glu/gh.py
  - Add `GithubClient`, refactor `prompt_for_reviewers` to use it; remove raw `Github` usage.
- glu/jira.py
  - Add `JiraClient`, `get_jira_client`, and adjust user/project lookups; remove legacy helpers.
- glu/local.py
  - Add `GitClient`, wrap git diff, commit, branch, push, and sync operations; remove scattered helpers.
- glu/cli/pr.py & glu/cli/ticket.py
  - Acquire and wire up AI/GitHub/Jira/Git clients; simplify command flows accordingly.
- glu/config.py
  - Adjust `config_path()` to load test config when `GLU_TEST` is set.
- pyproject.toml & uv.lock
  - Bump version to 2.0.2; add `pexpect`, `pytest`, `pytest-mock` to dev extras.
- .github/workflows/cicd.yml
  - Add `pytest` step.
- .gitignore
  - Ignore `tests/data/config.toml`.
- tests/
  - Add fake client implementations and fixtures in `conftest.py`; include AI prompt fixtures and diff sample; implement
full-flow pexpect tests for `glu pr` and `glu ticket`.

### Test Plan

1. CI now runs `pytest`; new integration tests exercise full `glu pr create` and `glu ticket create` flows via pexpect
under `GLU_TEST`.
2. Fake clients simulate Git, GitHub, Jira, and AI responses without real network calls.
3. Ensure no new environment variables required beyond existing CLIENT_API_KEYS and `GLU_TEST=1` in CI.

### Dependencies

- Added (dev):
  - pexpect >=4.9.0
  - pytest >=8.4.0

### Future Enhancements / Open questions / Risks / Technical Debt

- Consider adding support for more AI providers (e.g., Glean when available).
- Potential duplication in client initialization patterns could be consolidated.
- Error handling could be further unified (e.g., retries in API clients).
- Removing remaining legacy helpers in future major version.

### Checklist

- [ ] Code has been linted and adheres to the project's coding style guidelines.
- [ ] Tests have been added or modified for all new features and bug fixes.
- [ ] All FIXMEs have been addressed.
- [ ] Code changes or additions do not introduce significant performance issues.
- [ ] If necessary, documentation has been updated.
- [ ] I have sufficiently commented my code to guide reviewers.
- [ ] I have selected reviewers who are knowledgeable about the code changes.
- [ ] Breaking changes: code remains backward compatible or documented steps provided.