10 KiB
10 KiB
AGENT_HANDOFF.md
Completed
Phase 0 — Repository Setup
- Repository skeleton (TASK 0.1)
- package.json with dependencies (TASK 0.2)
Phase 1 — Core Utilities
- Configuration loader (
src/config/env.js) — TASK 1.1 - Secret redaction utility (
src/utils/redact.js) — TASK 1.2 - Context budget utility (
src/utils/context-budget.js) — TASK 1.3 - Safe logging helper (
src/utils/logging.js) — TASK 1.4
Phase 2 — OpenAI Integration
- OpenAI client wrapper (
src/openai/client.js) — TASK 2.1 - Response builder (
src/openai/responses.js) — TASK 2.2 - Error handling and edge cases (tests) — TASK 2.3
Phase 3 — Tool Inputs and Prompts
- Zod input validation schemas (
src/tools/schemas.js, tests) — TASK 3.1 - Base prompt template (
src/prompts/base.js, tests) — TASK 3.2 - ask_chatgpt prompt builder (
src/prompts/ask-chatgpt.js, tests) — TASK 3.3 - review_plan prompt builder (
src/prompts/review-plan.js, tests) — TASK 3.4 - review_code prompt builder (
src/prompts/review-code.js, tests) — TASK 3.5 - debug_issue prompt builder (
src/prompts/debug-issue.js, tests) — TASK 3.6 - architecture_review prompt builder (
src/prompts/architecture-review.js, tests) — TASK 3.7
Next Phase
All planned phases are complete. No pending work remains.
Completed (Phase 4)
All five MCP tool handlers are complete:
| Handler | File | Tests |
|---|---|---|
| handleAskChatGpt | src/tools/ask-chatgpt.js |
✅ 27 |
| handleReviewPlan | src/tools/review-plan.js |
✅ 28 |
| handleReviewCode | src/tools/review-code.js |
✅ 28 |
| handleDebugIssue | src/tools/debug-issue.js |
✅ 28 |
| handleArchitectureReview | src/tools/architecture-review.js |
✅ 28 |
Total: 139 orchestration-only tests, all passing.
Completed (Phase 5)
All five MCP tools registered: ask_chatgpt, review_plan, review_code, debug_issue, architecture_review.
Completed (Phase 6) — Provider Abstraction ✅
Decoupled tool handlers from OpenAI implementation via a provider abstraction layer:
src/providers/factory.js
createChatProvider(config)validateschatgptMcpProvideragainst whitelist- Defaults to
"openai"for any falsy/unknown value (null, NaN, numeric) - Throws with descriptive message on unrecognized provider names
src/providers/openai.js
openaiProvider.send(input, config)— thin adapter wrapping OpenAI modules- Internally calls
createOpenAIClient(config)thensendOpenAIResponse(client, params) - Params include: input as system messages array, model, temperature, maxOutputTokens from config
Handler changes (all 5)
- Old interface:
{ loadConfig, createOpenAIClient, sendOpenAIResponse } - New interface:
{ loadConfig, createProvider } - Each handler calls
provider = deps.createProvider(config)thenprovider.send(budget.input, config) - Handler logic unchanged — only dependency injection changed
CHATGPT_MCP_PROVIDER env var
- Defaults to
"openai"when not set - Accepts any string at loadConfig time; validation happens in factory at provider creation
- Currently only
"openai"is whitelisted; others throw at createChatProvider() time
Completed (Phase 7) — Tests ✅
Handler tests updated (5 files, all using { loadConfig, createProvider } mock pattern)
| File | Tests | Status |
|---|---|---|
| test/tools/ask-chatgpt.test.js | 27 | ✅ |
| test/tools/review-plan.test.js | 28 | ✅ |
| test/tools/review-code.test.js | 28 | ✅ |
| test/tools/debug-issue.test.js | 28 | ✅ |
| test/tools/architecture-review.test.js | 28 | ✅ |
New provider/config tests (3 files)
| File | Tests | Status |
|---|---|---|
| test/providers/factory.test.js | ~30 | ✅ covers default, whitelist, edge cases |
| test/providers/openai.test.js | 27 | ✅ covers all send delegation paths |
| test/config/env.test.js | +4 (added section) | ✅ covers chatgptMcpProvider env var |
Final verification (Phase 7)
- All 579 tests pass across 20 test files (end of Phase 7)
Post-multiphase verification
- All 706 tests pass across 22 test files (all phases complete)
npm start→ tools/list shows same 5 tools, unchanged schemas- Zero regression in existing test coverage
Completed (Phase 8) — Manual Export Provider ✅
src/providers/manual-export.js
manualExportProvider.send(request, config)— zero-API-cost provider- Wraps pre-built prompt in copy/paste-ready format for ChatGPT Web (
https://chatgpt.com) - Detects tool name from input fields:
debug_issue,review_code,architecture_review,review_plan,ask_chatgpt - Adds box-delimited display with
│prefixes, corner delimiters (┌ ┐ └ ┘) - Includes instructions section (5 numbered steps), metadata section (tool, provider, length)
- Warns on prompts over 30k characters
- Handles empty/missing prompt gracefully with advisory message
- Preserves unicode, markdown code blocks, JSON, special HTML characters exactly
Factory integration
"manual"added to SUPPORTED_PROVIDERS whitelist insrc/providers/factory.jsCHATGPT_MCP_PROVIDER=manualswitches all tool handlers to manual export mode- Defaults to
"openai"when not set — OpenAI behaviour unchanged - Same provider interface:
{ send(request, config) => Promise<{ content: string }> }
Tests added (Phase 8)
| File | Tests | Coverage |
|---|---|---|
| test/providers/manual-export.test.js | 56 | structure, tool detection, unicode, long prompts, edge cases, repeatability, visual layout |
| test/providers/factory.test.js | +9 manual provider tests | factory integration with "manual" |
Final verification (Phase 8)
- All 706 tests pass across 22 test files, zero regressions
npm start→ tools/list shows same 5 tools, unchanged schemas- No
chat.openai.comreferences in codebase — onlychatgpt.com - MCP initialize handshake succeeds with chatgpt-mcp v0.1.0
Completed (Phase 10) — Ollama Provider ✅
src/providers/ollama.js
ollamaProvider.send(reviewRequest, config)— local AI provider using Ollama/api/chatendpoint- Uses native
fetch()for HTTP calls — zero new dependencies - Implements same provider interface as openai and manual:
{ send(request, config) => Promise<{ content: string }> }
Provider details
- Request format: OpenAI-compatible chat API (
model,messages,stream,options) - Response parsing: Extracts
data.message.contentfrom Ollama response - Error categories:
OllamaTimeoutError,OllamaModelNotFoundError(404),OllamaValidationError(422),OllamaApiNotAvailableError(501),OllamaRequestError(fallback) - Base URL normalization: Strips trailing slashes for safe path concatenation
Environment variables
| Variable | Default | Description |
|---|---|---|
OLLAMA_BASE_URL |
http://localhost:11434 |
Ollama API endpoint |
OLLAMA_MODEL |
qwen3:latest |
Model name for chat requests |
OLLAMA_TEMPERATURE |
0.2 |
Sampling temperature |
OLLAMA_TIMEOUT |
60 |
Request timeout in seconds |
Factory integration
"ollama"added to SUPPORTED_PROVIDERS whitelist insrc/providers/factory.js:Set(["openai", "manual", "ollama"])CHATGPT_MCP_PROVIDER=ollamaswitches all tool handlers to local Ollama mode- Defaults to
"openai"when not set — OpenAI behaviour unchanged - Same provider interface as openai and manual providers
Current provider status
| Provider | Env Value | Type | Requires API key? |
|---|---|---|---|
openai |
CHATGPT_MCP_PROVIDER=openai |
Cloud (OpenAI Responses API) | Yes (OPENAI_API_KEY) |
manual |
CHATGPT_MCP_PROVIDER=manual |
Local (copy-paste) | No |
ollama |
CHATGPT_MCP_PROVIDER=ollama |
Local (Ollama /api/chat) | No |
Task 5.1 through 5.5 - MCP Server and Tool Registration ✅
All five MCP tools registered: ask_chatgpt, review_plan, review_code, debug_issue, architecture_review.
Key details from Phase 5:
- MCP stdio server in
src/server.jswith initialize handshake ✅ - All tools use shared
baseInputSchemawith dependency injection via{ loadConfig, createProvider }(Phase 6) - Error formatting normalized — single "Error:" prefix across all tools ✅
- Claude Code discovery configured via
.claude/settings.local.json✅
Completed (Task 10.3) — Local Setup Helper ✅
scripts/setup.js
- Interactive onboarding helper (~280 lines, zero dependencies, Node.js built-ins only)
- Provider selection:
[1] openai,[2] manual,[3] ollama - Provider-specific prompts (OpenAI API key with masked input; Ollama URL, model, temperature, timeout)
- Clean
.envfile generation with confirmation prompt - Preserves non-conflicting keys in existing
.envfiles - Optional
.claude/settings.local.jsoncreation with MCP server config - Graceful non-TTY handling (visible input mode warning)
- No network calls, no secrets printed, user-confirmation required
Files added/modified
| File | Action | Purpose |
|---|---|---|
scripts/setup.js |
Created | Interactive setup helper |
test/setup/setup.test.js |
Created | 33 tests (provider validation, config generation, file I/O) |
docs/SETUP.md |
Created | Full documentation for the setup helper |
package.json |
Modified | Added "setup": "node scripts/setup.js" script |
README.md |
Modified | Quick-start section + test count update |
TASKS.md |
Modified | Phase 10 entry and Task 10.3 details |
PROJECT_STATE.md |
Modified | Test count updated to 701/22 files |
Test results (Task 10.3)
- Before: 668 tests across 21 test files
- After: 706 tests across 22 test files (+38 new)
- All passing, zero regressions
Smoke tests
npm run setup— starts and runs in non-TTY mode ✅- MCP initialize →
chatgpt-mcpv0.1.0 ✅ - MCP tools/list → 5 tools with correct schemas ✅
V1 Milestone Complete
All planned phases are implemented and tested. The project is at v1.0.0 status with:
- 3 providers (openai, manual, ollama)
- 5 MCP tools registered
- 701 automated tests across 22 test files
- Interactive setup helper
- Complete documentation
Future work opportunities (low priority):
- Anthropic provider adapter
- Streaming responses
- Response caching
- Cost tracking per tool call
- Dockerfile / CI pipeline
- Safe project summary generation
General Rules
- Read ARCHITECTURE.md before making changes.
- Work incrementally.
- Keep changes small.
- Do not implement multiple phases at once.
- Do not add features not described in ARCHITECTURE.md.
- Update documentation when appropriate.
- Claude Code is the implementation agent.
- ChatGPT MCP is advisory only.