Skip to content

Commit e884ce8

Browse files
committed
docs: add Claude Code agent instructions
1 parent 9ec54ae commit e884ce8

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

CLAUDE.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# CLAUDE.md
2+
3+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4+
5+
## Project Overview
6+
7+
This is a reverse-engineered proxy that transforms the GitHub Copilot API into OpenAI and Anthropic-compatible endpoints. It enables using GitHub Copilot with any tool that supports OpenAI Chat Completions or Anthropic Messages APIs.
8+
9+
**Runtime:** Bun (>= 1.2.x)
10+
**Primary framework:** Hono (web server)
11+
**CLI framework:** citty (command definitions)
12+
13+
## Development Commands
14+
15+
```bash
16+
# Development (watch mode)
17+
bun run dev
18+
19+
# Production build
20+
bun run build
21+
22+
# Production start
23+
bun run start
24+
25+
# Linting
26+
bun run lint # Lint staged files
27+
bun run lint:all # Lint entire codebase
28+
29+
# Type checking
30+
bun run typecheck
31+
32+
# Testing
33+
bun test # Run all tests
34+
bun test tests/example.test.ts # Run single test
35+
36+
# Release
37+
bun run release # Bumps version and publishes
38+
```
39+
40+
## Architecture
41+
42+
### Command Structure
43+
44+
The CLI uses a subcommand architecture defined in `src/main.ts`:
45+
46+
- **`start`** (`src/start.ts`): Main server command. Handles GitHub auth, Copilot token management, and starts the Hono server
47+
- **`auth`** (`src/auth.ts`): Standalone GitHub authentication flow
48+
- **`check-usage`** (`src/check-usage.ts`): Display Copilot usage/quota in terminal
49+
- **`debug`** (`src/debug.ts`): Display diagnostic information
50+
51+
### Server Layer (`src/server.ts`)
52+
53+
Hono app with the following routes:
54+
55+
```
56+
/v1/chat/completions → OpenAI-compatible chat completions
57+
/v1/models → List available Copilot models
58+
/v1/embeddings → OpenAI-compatible embeddings
59+
/v1/messages → Anthropic-compatible messages endpoint
60+
/v1/messages/count_tokens → Token counting
61+
/usage → Usage/quota monitoring
62+
/token → Current Copilot token
63+
```
64+
65+
Routes without `/v1` prefix are also exposed for compatibility.
66+
67+
### Core Flow
68+
69+
1. **Token Management** (`src/lib/token.ts`):
70+
- GitHub OAuth device flow → GitHub token → stored in `~/.local/share/copilot-api/github-token`
71+
- GitHub token → Copilot token (via `services/github/get-copilot-token.ts`)
72+
- Copilot token auto-refreshes on interval
73+
74+
2. **Request Translation** (`src/routes/`):
75+
- **Anthropic → OpenAI**: `routes/messages/handler.ts` translates Anthropic Messages API to OpenAI format before calling Copilot
76+
- **Direct OpenAI**: `routes/chat-completions/handler.ts` passes through with minimal modification
77+
78+
3. **Copilot API Calls** (`src/services/copilot/`):
79+
- All Copilot API calls go through `create-chat-completions.ts`
80+
- Headers include auth token, VSCode version, account type, and X-Initiator (user vs agent)
81+
82+
### State Management (`src/lib/state.ts`)
83+
84+
Global singleton state object holds:
85+
- `githubToken`, `copilotToken`: Authentication tokens
86+
- `accountType`: "individual" | "business" | "enterprise"
87+
- `models`, `vsCodeVersion`: Cached from Copilot API
88+
- `manualApprove`, `rateLimitSeconds`, `rateLimitWait`: User-configured behavior
89+
90+
### Key Modules
91+
92+
- **`lib/approval.ts`**: Manual request approval flow (when `--manual` flag used)
93+
- **`lib/rate-limit.ts`**: Rate limiting enforcement
94+
- **`lib/tokenizer.ts`**: Token counting using `gpt-tokenizer`
95+
- **`lib/api-config.ts`**: Constructs headers and base URLs for Copilot API (varies by account type)
96+
- **`lib/proxy.ts`**: Proxy configuration from environment variables
97+
98+
### Translation Layers
99+
100+
**Anthropic → OpenAI** (`routes/messages/`):
101+
- `non-stream-translation.ts`: Bidirectional translation for non-streaming requests/responses
102+
- `stream-translation.ts`: Translates OpenAI SSE chunks to Anthropic event stream format
103+
- `anthropic-types.ts`: Type definitions for Anthropic Messages API
104+
105+
### GitHub Services (`services/github/`)
106+
107+
- `get-device-code.ts`: Initiates OAuth device flow
108+
- `poll-access-token.ts`: Polls for user authorization
109+
- `get-copilot-token.ts`: Exchanges GitHub token for Copilot token
110+
- `get-copilot-usage.ts`: Fetches usage/quota data
111+
112+
## TypeScript Configuration
113+
114+
- **Module system**: ESNext with `"type": "module"` in package.json
115+
- **Path aliases**: `~/*` maps to `src/*`
116+
- **Strict mode**: Enabled with `noUnusedLocals`, `noUnusedParameters`, `noFallthroughCasesInSwitch`
117+
- **No emit**: Type checking only; build handled by tsdown
118+
119+
## Testing
120+
121+
Uses Bun's built-in test runner. Place tests in `tests/` directory with `*.test.ts` naming.
122+
123+
## Account Type Behavior
124+
125+
The `--account-type` flag changes the Copilot API endpoint:
126+
- **individual**: `api.githubcopilot.com`
127+
- **business/enterprise**: `api.individual.githubcopilot.com`
128+
129+
See `lib/api-config.ts` for implementation details.
130+
131+
## Important Context
132+
133+
- **Security warning**: This is a reverse-engineered proxy. Excessive automated use may trigger GitHub abuse detection
134+
- **Token persistence**: GitHub token stored in `~/.local/share/copilot-api/` (use `lib/paths.ts` for path logic)
135+
- **VSCode version**: The proxy mimics VSCode to authenticate with Copilot (`services/get-vscode-version.ts`)
136+
- **Streaming**: Both streaming and non-streaming are supported. Response type determined by `stream` parameter in request

0 commit comments

Comments
 (0)