opencode-cursor-agent/docs/plan/2026-04-14-cursor-adapter.md

216 lines
7.3 KiB
Markdown
Raw Normal View History

2026-04-18 14:08:01 +00:00
# Plan: Cursor Adapter
## Overview
用 Go 實作一個本機 OpenAI-compatible proxy透過 spawn Cursor CLI 的 headless 模式來使用 Cursor 的模型。
## Inputs
- Architecture: `docs/architecture/2026-04-14-cursor-adapter.md`
- Code Design: `docs/code-design/2026-04-14-cursor-adapter.md`
## Planning Assumptions
- Go 1.22+
- 使用 chi v5 做 HTTP router
- 使用 cobra 做 CLI
- 專案目錄:`~/Documents/projects/cursor-adapter/`
- 先探索 Cursor CLI 輸出格式,再實作轉換邏輯
## Task Breakdown
### Task P1: Go Module 初始化 + 專案結構
- Objective: `go mod init`、建立目錄結構、空檔案
- Inputs Used: Code Design — Project Structure
- Design References: code-design §Project Structure
- Dependencies: None
- Deliverables: go.mod、目錄結構、空的 package files
- Completion Criteria: `go build` 成功(即使什麼都沒做)
### Task P2: 探索 Cursor CLI 輸出格式
- Objective: 實際跑 `agent -p "hello" --output-format stream-json`,記錄每行 JSON 的結構
- Inputs Used: PRD — Open Question 1
- Design References: architecture §Open Questions
- Dependencies: P1
- Deliverables: scripts/test_cursor_cli.sh、記錄 Cursor stream-json schema 的文件
- Completion Criteria: 明確知道每行 JSON 的 type/content 結構
### Task P3: Config 模組
- Objective: internal/config/config.goYAML 載入、Defaults、驗證
- Inputs Used: Code Design — Configuration
- Design References: code-design §Config struct, §Load()
- Dependencies: P1
- Deliverables: internal/config/config.go、internal/config/config_test.go、config.example.yaml
- Completion Criteria: table-driven test 通過
### Task P4: ModelsRequest/Response Structs
- Objective: internal/server/models.go所有 JSON struct + JSON tags
- Inputs Used: Code Design — Domain Models
- Design References: code-design §Domain Models
- Dependencies: P1
- Deliverables: internal/server/models.go
- Completion Criteria: struct 定義完成JSON tag 正確
### Task P5: SSE Helper
- Objective: internal/server/sse.goSSE 格式化、flush helpers
- Inputs Used: Architecture — SSE streaming
- Design References: architecture §API Contract
- Dependencies: P4
- Deliverables: internal/server/sse.go
- Completion Criteria: FormatSSE() / FormatDone() 正確
### Task P6: CLI Bridge
- Objective: internal/bridge/bridge.goBridge interface + CLIBridge 實作)
- Inputs Used: Code Design — Interface Definitions
- Design References: code-design §Bridge interface, §CLIBridge
- Dependencies: P2, P3
- Deliverables: internal/bridge/bridge.go、internal/bridge/bridge_test.go
- Completion Criteria: Execute() 能 spawn agent、逐行 yield、timeout kill
### Task P7: Stream Converter
- Objective: internal/converter/convert.goCursor JSON → OpenAI SSE 轉換)
- Inputs Used: Code Design — Converter interface
- Design References: code-design §ToOpenAIChunk(), §ToOpenAIResponse()
- Dependencies: P2, P4
- Deliverables: internal/converter/convert.go、internal/converter/convert_test.go
- Completion Criteria: table-driven test 通過,轉換格式正確
### Task P8: HTTP Server + Handlers
- Objective: internal/server/server.go + handler.gochi router、3 個 endpoint、error middleware
- Inputs Used: Code Design — Layer Architecture
- Design References: code-design §handler.go, §writeError()
- Dependencies: P3, P4, P5, P6, P7
- Deliverables: internal/server/server.go、internal/server/handler.go、internal/server/handler_test.go
- Completion Criteria: /health、/v1/models、/v1/chat/completions 可回應(用 mock bridge 測試)
### Task P9: CLI 入口main.go
- Objective: main.gocobra command、wiring、啟動 server
- Inputs Used: Code Design — Dependency Injection
- Design References: code-design §main.go wiring
- Dependencies: P3, P8
- Deliverables: main.go
- Completion Criteria: `go build && ./cursor-adapter` 啟動成功
### Task P10: 整合測試
- Objective: 實際用 curl 和 Hermes 測試完整流程
- Inputs Used: PRD — Acceptance Criteria
- Design References: architecture §API Contract
- Dependencies: P9
- Deliverables: 測試結果記錄
- Completion Criteria: AC1-AC5 通過
### Task P11: README
- Objective: 安裝、設定、使用方式
- Inputs Used: PRD, Architecture
- Dependencies: P10
- Deliverables: README.md
- Completion Criteria: 新使用者看著 README 能跑起來
## Dependency Graph
```mermaid
graph TD
P1 --> P2
P1 --> P3
P1 --> P4
P2 --> P6
P2 --> P7
P3 --> P6
P3 --> P9
P4 --> P5
P4 --> P7
P4 --> P8
P5 --> P8
P6 --> P8
P7 --> P8
P8 --> P9
P9 --> P10
P10 --> P11
```
## Execution Order
### Phase 1: Foundation可並行
- P1 Go Module 初始化
- P3 Config 模組
- P4 Models
### Phase 2: Exploration需 P1
- P2 探索 Cursor CLI 輸出格式
- P5 SSE Helper需 P4
### Phase 3: Core Logic需 P2 + Phase 1
- P6 CLI Bridge
- P7 Stream Converter
### Phase 4: Integration需 Phase 3
- P8 HTTP Server + Handlers
- P9 CLI 入口
### Phase 5: Validation需 P9
- P10 整合測試
- P11 README
## Milestones
### Milestone M1: Foundation Ready
- Included Tasks: P1, P3, P4
- Exit Criteria: go.mod 存在、config 可載入、models struct 定義完成
### Milestone M2: Core Logic Complete
- Included Tasks: P2, P5, P6, P7
- Exit Criteria: CLI Bridge 能 spawn Cursor、converter 轉換正確
### Milestone M3: MVP Ready
- Included Tasks: P8, P9, P10, P11
- Exit Criteria: `cursor-adapter` 啟動後curl AC1-AC5 通過
## Deliverables
| Task | Deliverable | Source Design Reference |
|------|-------------|------------------------|
| P1 | go.mod + project structure | code-design §Project Structure |
| P2 | test script + format docs | architecture §Open Questions |
| P3 | internal/config/config.go + test | code-design §Configuration |
| P4 | internal/server/models.go | code-design §Domain Models |
| P5 | internal/server/sse.go | architecture §SSE |
| P6 | internal/bridge/bridge.go + test | code-design §Bridge interface |
| P7 | internal/converter/convert.go + test | code-design §Converter |
| P8 | server.go + handler.go + test | code-design §Layer Architecture |
| P9 | main.go | code-design §Dependency Injection |
| P10 | test results | PRD §Acceptance Criteria |
| P11 | README.md | — |
## Design Traceability
| Upstream Design Element | Planned Task(s) |
|-------------------------|-----------------|
| Architecture: HTTP Server | P8 |
| Architecture: CLI Bridge | P6 |
| Architecture: Stream Converter | P7 |
| Architecture: SSE | P5 |
| Architecture: Config | P3 |
| Architecture: Error Model | P8 |
| Code Design: Project Structure | P1 |
| Code Design: Interface — Bridge | P6 |
| Code Design: Interface — Converter | P7 |
| Code Design: Domain Models | P4 |
| Code Design: Configuration | P3 |
| Code Design: DI — main.go | P9 |
## Risks And Sequencing Notes
- P2探索 Cursor CLI 格式)是 critical path — P6 和 P7 依賴此結果
- P6CLI Bridge是最複雜的任務 — goroutine、subprocess、timeout、semaphore
- 如果 Cursor CLI stream-json 格式複雜P7 可能需要迭代
- P10 可能發現 edge case需要回頭修 P6/P7/P8
## Planning Review
N/A首次規劃
## Open Questions
1. Cursor CLI stream-json 的確切格式P2 回答)
2. Cursor CLI 並發限制P10 確認)