# cursor-adapter

以 **OpenAI／相容 Chat Completions API** 對外提供服務，後端透過 **Cursor CLI**（預設 `agent`）或選用的 **ACP** 傳輸與 Cursor 互動的本地代理程式。另提供 **Anthropic Messages** 相容端點。

## 需求

- Go **1.26.1**（見 `go.mod`）
- 已安裝並可在 `PATH` 中執行的 **Cursor CLI**（名稱或路徑見設定檔 `cursor_cli_path`）

## 建置與執行

```bash
go build -o cursor-adapter .
./cursor-adapter
```

未指定 `-c`／`--config` 時，會讀取 `~/.cursor-adapter/config.yaml`；若檔案不存在則使用內建預設值。

首次可複製範例後再編輯：

```bash
mkdir -p ~/.cursor-adapter
cp config.example.yaml ~/.cursor-adapter/config.yaml
```

## 命令列參數

| 參數 | 說明 |
|------|------|
| `-c`, `--config` | 設定檔路徑 |
| `-p`, `--port` | 監聽埠（覆寫設定檔） |
| `--debug` | 除錯層級日誌 |
| `--use-acp` | 改用 Cursor ACP 傳輸（預設為 CLI stream-json） |
| `--chat-only-workspace` | 預設 `true`：在暫存工作區並覆寫 `HOME`／`CURSOR_CONFIG_DIR` 等，避免子行程讀取啟動目錄或 `~/.cursor` 規則；設為 `false` 時代理的工作目錄會對 Cursor agent 可見 |

啟動前會檢查 Cursor CLI 是否可用；失敗時程式會退出並顯示錯誤。

## 設定檔（YAML）

欄位與 `config.example.yaml` 對齊，例如：

- `port`：HTTP 服務埠（預設 `8976`）
- `cursor_cli_path`：CLI 可執行檔名或路徑
- `default_model`、`available_models`、`timeout`（秒）、`max_concurrent`
- `use_acp`、`chat_only_workspace`、`log_level`

## HTTP 端點

服務綁定 **127.0.0.1**（僅本機）。路由啟用 CORS（`Access-Control-Allow-Origin: *`），並允許標頭如 `Authorization`、`X-Cursor-Session-ID`、`X-Cursor-Workspace`。

| 方法 | 路徑 | 說明 |
|------|------|------|
| GET | `/health` | 健康檢查 |
| GET | `/v1/models` | 模型列表 |
| POST | `/v1/chat/completions` | OpenAI 相容聊天完成（含串流 SSE） |
| POST | `/v1/messages` | Anthropic Messages 相容 |

## 開發與測試

```bash
go test ./...
```

輔助腳本：`scripts/test_cursor_cli.sh`（驗證本機 Cursor CLI 是否可呼叫）。

## 專案結構（概要）

- `main.go`：CLI 入口、設定與橋接組裝、服務啟動
- `internal/config`：設定載入與驗證
- `internal/server`：HTTP 路由、CORS、OpenAI／Anthropic 處理、SSE、工作階段
- `internal/bridge`：與 Cursor CLI／ACP 的橋接與併發控制
- `internal/converter`：請求／回應與模型對應
- `internal/types`：共用型別與 API 結構
- `internal/workspace`：暫存工作區與隔離行為
- `internal/sanitize`：輸入清理
- `docs/`：計畫、架構、PRD 與 Cursor CLI 格式等文件

## 安全與隱私

建議維持 `chat_only_workspace: true`，除非你有意讓 Cursor agent 存取代理行程的工作目錄與本機 Cursor 設定。詳見 `config.example.yaml` 註解與 `internal/config` 實作。
