# Contributing to TokenTracker

Thanks for considering a contribution! TokenTracker is a small project, so the process is intentionally lightweight.

## Setup

```bash
git clone https://github.com/mm7894215/TokenTracker.git
cd TokenTracker
npm install

# Build the dashboard once so the CLI can serve it
cd dashboard && npm install && npm run build && cd ..
```

## Run the CLI locally

```bash
node bin/tracker.js              # Start the local dashboard server (default: http://localhost:7680)
node bin/tracker.js sync         # Manual sync
node bin/tracker.js status       # Check hook status
node bin/tracker.js doctor       # Health check
```

## Tests

```bash
npm test                                     # Full suite (96 test files, node --test)
node --test test/rollout-parser.test.js      # A single test file
npm run ci:local                             # Tests + validations + builds (everything CI runs)
```

If you're touching the dashboard:

```bash
npm run dashboard:dev                        # Vite dev server with mocked API
npm run dashboard:build                      # Production build (output: dashboard/dist/)
npm run validate:copy                        # Validate copy registry completeness
```

## Pull Request Checklist

- [ ] Tests pass (`npm test`)
- [ ] If you added user-facing strings, add them to `dashboard/src/content/copy.csv`
- [ ] If you changed Swift, run `xcodegen generate` after editing `TokenTrackerBar/project.yml`
- [ ] Conventional commit style: `feat:`, `fix:`, `refactor:`, `docs:`, `chore:`, `ci:`, `test:`
- [ ] PR description explains *why*, not just *what*

## Adding a New AI Tool Integration

This is the most common kind of contribution. The pattern:

1. **Add a parser to `src/lib/rollout.js`** — most tools write JSONL or SQLite logs. The parser should normalize tokens into the canonical shape: `{input_tokens, output_tokens, cached_input_tokens, cache_creation_input_tokens, total_tokens, model, source, hour_start}`.
2. **Add a hook installer in `src/commands/init.js`** — most tools support a config file or hook script you can patch. Make it idempotent (safe to re-run).
3. **Add a status check in `src/commands/status.js`** — show whether the hook is installed and whether data has been collected.
4. **Add a parser test in `test/rollout-parser.test.js`** — use a real (anonymized) sample log fixture.
5. **Update `README.md` Supported AI Tools table** with the new row.

Look at how Claude Code, Codex, or Gemini are wired in for reference — they're the simplest examples.

## Code Style

- **CLI (`src/`)**: CommonJS, Node 20+, no transpilation. Match the existing style.
- **Dashboard (`dashboard/`)**: TypeScript strict, React 18, ESM, Tailwind. Match the existing style.
- **macOS (`TokenTrackerBar/`)**: Swift 5.9, SwiftUI + AppKit. Match the existing style.
- No linter wars. Be reasonable.

## Privacy Rule (non-negotiable)

TokenTracker tracks **only token counts and timestamps**. Never log, store, transmit, or print any prompt content, response content, file paths from user code, or anything that could leak what the user is working on. If your change touches a parser, double-check this.

## Releasing (maintainers only)

See the "Release Workflow" section in [CLAUDE.md](CLAUDE.md).
