- Core agent logic (ReAct loop, tool execution, subagent spawning)
- New tool implementations
- Provider integrations (API calls, response parsing, retry logic, abort handling)
- Permission system (rule evaluation, inheritance, deny/allow logic)
- Simple utility functions
- Documentation updates
- Configuration changes
- Obvious bug fixes
Location: tests/ directory (mirrors src/ structure)
Naming: foo.ts → foo.test.ts
Integration tests can use API keys or a local Codex OAuth login, depending on provider:
# OpenAI
OPENAI_API_KEY=sk-...
# Google Gemini
GEMINI_API_KEY=...
# Anthropic
ANTHROPIC_API_KEY=...
# Codex OAuth
codex login
CODEX_MODEL=gpt-5.4
# Optional Codex overrides
CODEX_HOME=~/.codex
OAS_CODEX_AUTH_PATH=/custom/path/auth.json
# Optional proxy
OPENAI_BASE_URL=https://api.openai.com/v1
HTTP_PROXY=http://localhost:7890env $(cat .env | xargs) bun testFor the real Codex smoke test, you can also rely on your existing local login state without an .env file:
cd packages/core
bun test tests/e2e/providers/codex.test.tsconst hasOpenAI = !!process.env.OPENAI_API_KEY;
describe.skipIf(!hasOpenAI)('OpenAI Integration', () => { ... });
const skipCodex = skipIfNoProvider('codex');
describe.skipIf(skipCodex)('Codex Integration', () => { ... });- Overall: > 80%
- Core Logic: > 90% (agent loop, tools, providers)
- Utilities: > 70%
- Integration tests skipped in CI (no API keys)
- Only unit tests and mocked tests run
- Coverage reports generated