@rama_nigg/open-cursor 2.3.2 → 2.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -247
- package/dist/cli/discover.js +0 -15
- package/dist/cli/opencode-cursor.js +0 -15
- package/dist/index.js +0 -15
- package/dist/plugin-entry.js +11 -16
- package/package.json +7 -2
- package/src/plugin-toggle.ts +9 -1
package/README.md
CHANGED
|
@@ -5,13 +5,24 @@
|
|
|
5
5
|
<img src="https://img.shields.io/badge/macOS-000000?style=for-the-badge&logo=apple&logoColor=white" alt="macOS" />
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
|
-
No prompt limits. No broken streams. Full thinking + tool support in
|
|
8
|
+
No prompt limits. No broken streams. Full thinking + tool support in OpenCode. Your Cursor subscription, properly integrated.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
Required: [OpenCode](https://opencode.ai/) + [cursor-agent](https://cursor.com/) (`curl -fsSL https://cursor.com/install | bash && cursor-agent login`)
|
|
13
|
+
Optional: [Bun](https://bun.sh/) (Options B-F), [Go 1.21+](https://go.dev/) (Option D)
|
|
9
14
|
|
|
10
15
|
## Installation
|
|
11
16
|
|
|
12
|
-
|
|
17
|
+
### Option A — One-line installer
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
curl -fsSL https://raw.githubusercontent.com/Nomadcxx/opencode-cursor/main/install.sh | bash
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Option B — Add to opencode.json
|
|
13
24
|
|
|
14
|
-
|
|
25
|
+
Add to `~/.config/opencode/opencode.json`:
|
|
15
26
|
|
|
16
27
|
```json
|
|
17
28
|
{
|
|
@@ -21,51 +32,57 @@ The simplest approach—just add the npm package to your OpenCode config:
|
|
|
21
32
|
"name": "Cursor ACP",
|
|
22
33
|
"npm": "@ai-sdk/openai-compatible",
|
|
23
34
|
"models": {
|
|
24
|
-
"cursor-acp/
|
|
25
|
-
"cursor-acp/
|
|
26
|
-
"cursor-acp/
|
|
27
|
-
"cursor-acp/
|
|
35
|
+
"cursor-acp/auto": { "name": "Auto" },
|
|
36
|
+
"cursor-acp/composer-1.5": { "name": "Composer 1.5" },
|
|
37
|
+
"cursor-acp/composer-1": { "name": "Composer 1" },
|
|
38
|
+
"cursor-acp/gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
|
|
39
|
+
"cursor-acp/gpt-5.3-codex-low": { "name": "GPT-5.3 Codex Low" },
|
|
40
|
+
"cursor-acp/gpt-5.3-codex-high": { "name": "GPT-5.3 Codex High" },
|
|
41
|
+
"cursor-acp/gpt-5.3-codex-xhigh": { "name": "GPT-5.3 Codex Extra High" },
|
|
42
|
+
"cursor-acp/gpt-5.3-codex-fast": { "name": "GPT-5.3 Codex Fast" },
|
|
43
|
+
"cursor-acp/gpt-5.3-codex-low-fast": { "name": "GPT-5.3 Codex Low Fast" },
|
|
44
|
+
"cursor-acp/gpt-5.3-codex-high-fast": { "name": "GPT-5.3 Codex High Fast" },
|
|
45
|
+
"cursor-acp/gpt-5.3-codex-xhigh-fast": { "name": "GPT-5.3 Codex Extra High Fast" },
|
|
46
|
+
"cursor-acp/gpt-5.2": { "name": "GPT-5.2" },
|
|
47
|
+
"cursor-acp/gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
|
|
48
|
+
"cursor-acp/gpt-5.2-codex-high": { "name": "GPT-5.2 Codex High" },
|
|
49
|
+
"cursor-acp/gpt-5.2-codex-low": { "name": "GPT-5.2 Codex Low" },
|
|
50
|
+
"cursor-acp/gpt-5.2-codex-xhigh": { "name": "GPT-5.2 Codex Extra High" },
|
|
51
|
+
"cursor-acp/gpt-5.2-codex-fast": { "name": "GPT-5.2 Codex Fast" },
|
|
52
|
+
"cursor-acp/gpt-5.2-codex-high-fast": { "name": "GPT-5.2 Codex High Fast" },
|
|
53
|
+
"cursor-acp/gpt-5.2-codex-low-fast": { "name": "GPT-5.2 Codex Low Fast" },
|
|
54
|
+
"cursor-acp/gpt-5.2-codex-xhigh-fast": { "name": "GPT-5.2 Codex Extra High Fast" },
|
|
55
|
+
"cursor-acp/gpt-5.1-codex-max": { "name": "GPT-5.1 Codex Max" },
|
|
56
|
+
"cursor-acp/gpt-5.1-codex-max-high": { "name": "GPT-5.1 Codex Max High" },
|
|
57
|
+
"cursor-acp/opus-4.6-thinking": { "name": "Claude 4.6 Opus (Thinking)" },
|
|
58
|
+
"cursor-acp/sonnet-4.5-thinking": { "name": "Claude 4.5 Sonnet (Thinking)" },
|
|
59
|
+
"cursor-acp/gpt-5.2-high": { "name": "GPT-5.2 High" },
|
|
60
|
+
"cursor-acp/opus-4.6": { "name": "Claude 4.6 Opus" },
|
|
61
|
+
"cursor-acp/opus-4.5": { "name": "Claude 4.5 Opus" },
|
|
62
|
+
"cursor-acp/opus-4.5-thinking": { "name": "Claude 4.5 Opus (Thinking)" },
|
|
63
|
+
"cursor-acp/sonnet-4.5": { "name": "Claude 4.5 Sonnet" },
|
|
64
|
+
"cursor-acp/gpt-5.1-high": { "name": "GPT-5.1 High" },
|
|
65
|
+
"cursor-acp/gemini-3-pro": { "name": "Gemini 3 Pro" },
|
|
66
|
+
"cursor-acp/gemini-3-flash": { "name": "Gemini 3 Flash" },
|
|
67
|
+
"cursor-acp/grok": { "name": "Grok" }
|
|
28
68
|
}
|
|
29
69
|
}
|
|
30
70
|
}
|
|
31
71
|
}
|
|
32
72
|
```
|
|
33
73
|
|
|
34
|
-
>
|
|
35
|
-
|
|
36
|
-
After authenticating with `cursor-agent login`, run `cursor-agent models` to see the full model list, or use one of the automated installers below to auto-discover models.
|
|
74
|
+
> Update models anytime: `cursor-agent models`
|
|
37
75
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
**Option B — One-line installer (curl)**
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
curl -fsSL https://raw.githubusercontent.com/Nomadcxx/opencode-cursor/main/install.sh | bash
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
This automated installer detects your environment and chooses the best installation method.
|
|
47
|
-
|
|
48
|
-
**Option C — npm global install + CLI symlink**
|
|
49
|
-
|
|
50
|
-
Installs globally via npm and creates a symlink in the OpenCode plugin directory:
|
|
76
|
+
### Option C — npm global + CLI
|
|
51
77
|
|
|
52
78
|
```bash
|
|
53
79
|
npm install -g @rama_nigg/open-cursor
|
|
54
80
|
open-cursor install
|
|
55
81
|
```
|
|
56
82
|
|
|
57
|
-
|
|
83
|
+
Upgrade: `npm update -g @rama_nigg/open-cursor`
|
|
58
84
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
npm update -g @rama_nigg/open-cursor
|
|
63
|
-
# Symlink automatically uses updated files
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Option D — Go TUI installer**
|
|
67
|
-
|
|
68
|
-
Interactive visual installer with dual-mode support (quick install or build from source):
|
|
85
|
+
### Option D — Go TUI installer
|
|
69
86
|
|
|
70
87
|
```bash
|
|
71
88
|
git clone https://github.com/Nomadcxx/opencode-cursor.git
|
|
@@ -73,148 +90,30 @@ cd opencode-cursor
|
|
|
73
90
|
go build -o ./installer ./cmd/installer && ./installer
|
|
74
91
|
```
|
|
75
92
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
Paste this into any LLM agent (Claude Code, OpenCode, Cursor, etc.):
|
|
93
|
+
### Option E — LLM paste
|
|
79
94
|
|
|
80
95
|
```
|
|
81
|
-
Install
|
|
82
|
-
|
|
83
|
-
1. Edit your opencode.json config file (usually at ~/.config/opencode/opencode.json)
|
|
84
|
-
2. Add "@rama_nigg/open-cursor@latest" to the plugin array
|
|
85
|
-
3. Add the cursor-acp provider configuration with models
|
|
86
|
-
4. Restart OpenCode
|
|
87
|
-
|
|
88
|
-
Example configuration:
|
|
89
|
-
{
|
|
90
|
-
"plugin": ["@rama_nigg/open-cursor@latest"],
|
|
91
|
-
"provider": {
|
|
92
|
-
"cursor-acp": {
|
|
93
|
-
"name": "Cursor ACP",
|
|
94
|
-
"npm": "@ai-sdk/openai-compatible",
|
|
95
|
-
"models": {
|
|
96
|
-
"cursor-acp/claude-sonnet": { "name": "Claude Sonnet" }
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
5. Authenticate: cursor-agent login
|
|
103
|
-
6. Verify: opencode models | grep cursor-acp
|
|
96
|
+
Install open-cursor for OpenCode: edit ~/.config/opencode/opencode.json, add "@rama_nigg/open-cursor@latest" to "plugin", add a "cursor-acp" provider with npm "@ai-sdk/openai-compatible" and models from `cursor-agent models` prefixed with "cursor-acp/". Auth: `cursor-agent login`. Verify: `opencode models | grep cursor-acp`.
|
|
104
97
|
```
|
|
105
98
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
For developers and contributors who want full control:
|
|
99
|
+
### Option F — Manual (from source)
|
|
109
100
|
|
|
110
101
|
```bash
|
|
111
|
-
git clone https://github.com/Nomadcxx/opencode-cursor.git
|
|
112
|
-
cd opencode-cursor
|
|
102
|
+
git clone https://github.com/Nomadcxx/opencode-cursor.git && cd opencode-cursor
|
|
113
103
|
bun install && bun run build
|
|
114
|
-
mkdir -p ~/.config/opencode/plugin
|
|
115
104
|
ln -sf $(pwd)/dist/plugin-entry.js ~/.config/opencode/plugin/cursor-acp.js
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
The automated installers handle configuration automatically. For manual installs, run the sync script to populate models:
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
105
|
./scripts/sync-models.sh
|
|
122
106
|
```
|
|
123
107
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
```json
|
|
127
|
-
{
|
|
128
|
-
"plugin": ["cursor-acp"],
|
|
129
|
-
"provider": {
|
|
130
|
-
"cursor-acp": {
|
|
131
|
-
"name": "Cursor",
|
|
132
|
-
"npm": "@ai-sdk/openai-compatible",
|
|
133
|
-
"options": { "baseURL": "http://127.0.0.1:32124/v1" },
|
|
134
|
-
"models": {
|
|
135
|
-
"auto": { "name": "Auto" },
|
|
136
|
-
"composer-1.5": { "name": "Composer 1.5" },
|
|
137
|
-
"composer-1": { "name": "Composer 1" },
|
|
138
|
-
"gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
|
|
139
|
-
"gpt-5.3-codex-low": { "name": "GPT-5.3 Codex Low" },
|
|
140
|
-
"gpt-5.3-codex-high": { "name": "GPT-5.3 Codex High" },
|
|
141
|
-
"gpt-5.3-codex-xhigh": { "name": "GPT-5.3 Codex Extra High" },
|
|
142
|
-
"gpt-5.3-codex-fast": { "name": "GPT-5.3 Codex Fast" },
|
|
143
|
-
"gpt-5.3-codex-low-fast": { "name": "GPT-5.3 Codex Low Fast" },
|
|
144
|
-
"gpt-5.3-codex-high-fast": { "name": "GPT-5.3 Codex High Fast" },
|
|
145
|
-
"gpt-5.3-codex-xhigh-fast": { "name": "GPT-5.3 Codex Extra High Fast" },
|
|
146
|
-
"gpt-5.2": { "name": "GPT-5.2" },
|
|
147
|
-
"gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
|
|
148
|
-
"gpt-5.2-codex-high": { "name": "GPT-5.2 Codex High" },
|
|
149
|
-
"gpt-5.2-codex-low": { "name": "GPT-5.2 Codex Low" },
|
|
150
|
-
"gpt-5.2-codex-xhigh": { "name": "GPT-5.2 Codex Extra High" },
|
|
151
|
-
"gpt-5.2-codex-fast": { "name": "GPT-5.2 Codex Fast" },
|
|
152
|
-
"gpt-5.2-codex-high-fast": { "name": "GPT-5.2 Codex High Fast" },
|
|
153
|
-
"gpt-5.2-codex-low-fast": { "name": "GPT-5.2 Codex Low Fast" },
|
|
154
|
-
"gpt-5.2-codex-xhigh-fast": { "name": "GPT-5.2 Codex Extra High Fast" },
|
|
155
|
-
"gpt-5.1-codex-max": { "name": "GPT-5.1 Codex Max" },
|
|
156
|
-
"gpt-5.1-codex-max-high": { "name": "GPT-5.1 Codex Max High" },
|
|
157
|
-
"opus-4.6-thinking": { "name": "Claude 4.6 Opus (Thinking)" },
|
|
158
|
-
"sonnet-4.5-thinking": { "name": "Claude 4.5 Sonnet (Thinking)" },
|
|
159
|
-
"gpt-5.2-high": { "name": "GPT-5.2 High" },
|
|
160
|
-
"opus-4.6": { "name": "Claude 4.6 Opus" },
|
|
161
|
-
"opus-4.5": { "name": "Claude 4.5 Opus" },
|
|
162
|
-
"opus-4.5-thinking": { "name": "Claude 4.5 Opus (Thinking)" },
|
|
163
|
-
"sonnet-4.5": { "name": "Claude 4.5 Sonnet" },
|
|
164
|
-
"gpt-5.1-high": { "name": "GPT-5.1 High" },
|
|
165
|
-
"gemini-3-pro": { "name": "Gemini 3 Pro" },
|
|
166
|
-
"gemini-3-flash": { "name": "Gemini 3 Flash" },
|
|
167
|
-
"grok": { "name": "Grok" }
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### Plugin Configuration Reference
|
|
175
|
-
|
|
176
|
-
Depending on your installation method, use the appropriate plugin identifier:
|
|
177
|
-
|
|
178
|
-
**npm package (recommended for production):**
|
|
179
|
-
```json
|
|
180
|
-
"plugin": ["@rama_nigg/open-cursor@latest"]
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
**Local build (for development):**
|
|
184
|
-
```json
|
|
185
|
-
"plugin": ["cursor-acp"]
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
Both approaches work—the npm package is resolved automatically by OpenCode's Bun runtime, while the local build requires the symlink setup shown in Option F above.
|
|
108
|
+
Add `"cursor-acp"` to the `plugin` array and reuse the provider block from Option B.
|
|
189
109
|
|
|
190
110
|
## Authentication
|
|
191
111
|
|
|
192
|
-
### Option 1: Via OpenCode (Recommended)
|
|
193
|
-
|
|
194
112
|
```bash
|
|
195
|
-
opencode auth login
|
|
113
|
+
opencode auth login # provider id: cursor-acp
|
|
114
|
+
cursor-agent login # direct
|
|
196
115
|
```
|
|
197
116
|
|
|
198
|
-
Then follow the prompts:
|
|
199
|
-
|
|
200
|
-
1. Select **"Other"** from the provider list
|
|
201
|
-
2. Enter provider id: **cursor-acp**
|
|
202
|
-
3. Browser will open automatically - click "Continue with Cursor"
|
|
203
|
-
4. Return to terminal when you see "Login successful"
|
|
204
|
-
|
|
205
|
-
### Option 2: Direct (CLI only)
|
|
206
|
-
|
|
207
|
-
```bash
|
|
208
|
-
cursor-agent login
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
Then open the URL shown in your browser and complete authentication.
|
|
212
|
-
|
|
213
|
-
Credential file locations:
|
|
214
|
-
|
|
215
|
-
- macOS: `~/.cursor/cli-config.json` (current) or `~/.cursor/auth.json` (legacy)
|
|
216
|
-
- Linux: `~/.config/cursor/cli-config.json` or `~/.config/cursor/auth.json` (or `$XDG_CONFIG_HOME/cursor/`)
|
|
217
|
-
|
|
218
117
|
## Usage
|
|
219
118
|
|
|
220
119
|
```bash
|
|
@@ -227,7 +126,7 @@ opencode run "your prompt" --model cursor-acp/sonnet-4.5
|
|
|
227
126
|
```mermaid
|
|
228
127
|
flowchart TB
|
|
229
128
|
OC["OpenCode"] --> SDK["@ai-sdk/openai-compatible"]
|
|
230
|
-
SDK -->|"POST /v1/chat/completions"| PROXY["cursor
|
|
129
|
+
SDK -->|"POST /v1/chat/completions"| PROXY["open-cursor proxy :32124"]
|
|
231
130
|
PROXY -->|"spawn per request"| AGENT["cursor-agent --output-format stream-json"]
|
|
232
131
|
AGENT -->|"HTTPS"| CURSOR["Cursor API"]
|
|
233
132
|
CURSOR --> AGENT
|
|
@@ -244,101 +143,32 @@ flowchart TB
|
|
|
244
143
|
SDK -->|"TOOL_RESULT prompt block"| AGENT
|
|
245
144
|
```
|
|
246
145
|
|
|
247
|
-
Default mode
|
|
248
|
-
Legacy execution mode (`proxy-exec`) is still available for local/SDK/MCP execution through the internal router.
|
|
249
|
-
|
|
250
|
-
Detailed architecture: [docs/architecture/runtime-tool-loop.md](docs/architecture/runtime-tool-loop.md).
|
|
146
|
+
Default mode: `CURSOR_ACP_TOOL_LOOP_MODE=opencode`. Legacy `proxy-exec` still available. Details: [docs/architecture/runtime-tool-loop.md](docs/architecture/runtime-tool-loop.md).
|
|
251
147
|
|
|
252
148
|
## Alternatives
|
|
253
149
|
|
|
254
|
-
| |
|
|
255
|
-
| ----------------- |
|
|
150
|
+
| | open-cursor | [yet-another-opencode-cursor-auth](https://github.com/Yukaii/yet-another-opencode-cursor-auth) | [opencode-cursor-auth](https://github.com/POSO-PocketSolutions/opencode-cursor-auth) | [cursor-opencode-auth](https://github.com/R44VC0RP/cursor-opencode-auth) |
|
|
151
|
+
| ----------------- | :------------------------: | :--------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------: | :----------------------------------------------------------------------: |
|
|
256
152
|
| **Architecture** | HTTP proxy via cursor-agent | Direct Connect-RPC | HTTP proxy via cursor-agent | Direct Connect-RPC/protobuf |
|
|
257
|
-
| **Platform** |
|
|
258
|
-
| **Max Prompt** |
|
|
259
|
-
| **Streaming** |
|
|
260
|
-
| **Error Parsing** |
|
|
261
|
-
| **Installer** |
|
|
262
|
-
| **OAuth Flow** |
|
|
263
|
-
| **Tool Calling** | ✓ OpenCode-owned loop
|
|
264
|
-
| **Stability** | Stable (uses official CLI)
|
|
265
|
-
| **Dependencies** |
|
|
266
|
-
| **Port** |
|
|
267
|
-
|
|
268
|
-
## Prerequisites
|
|
269
|
-
|
|
270
|
-
**For Option A (npm-direct):** [OpenCode](https://opencode.ai/) and [cursor-agent](https://cursor.com/) required. The npm package is resolved by OpenCode's Bun runtime, but cursor-agent handles the actual API communication.
|
|
271
|
-
|
|
272
|
-
**For Options B-F:**
|
|
273
|
-
- [Bun](https://bun.sh/)
|
|
274
|
-
- [cursor-agent](https://cursor.com/) - `curl -fsSL https://cursor.com/install | bash`
|
|
275
|
-
|
|
276
|
-
**Option B (one-line install):** If Go is installed, the script runs the TUI installer; otherwise it performs a shell-only install (OpenCode + cursor-agent required). For syncing models without the TUI, install [jq](https://jq.org/) or run `./scripts/sync-models.sh` after install.
|
|
277
|
-
|
|
278
|
-
**Option D (TUI installer):** Go 1.21+ required to build the installer.
|
|
279
|
-
|
|
280
|
-
## Features
|
|
281
|
-
|
|
282
|
-
- HTTP proxy (avoids E2BIG errors)
|
|
283
|
-
- Streaming responses with thinking and tool call support
|
|
284
|
-
- OAuth authentication
|
|
285
|
-
- Error parsing (quota/auth/network)
|
|
286
|
-
|
|
287
|
-
## Development
|
|
288
|
-
|
|
289
|
-
Build and run tests locally:
|
|
290
|
-
|
|
291
|
-
```bash
|
|
292
|
-
bun install
|
|
293
|
-
bun run build
|
|
294
|
-
bun run test:ci:unit
|
|
295
|
-
bun run test:ci:integration
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
CI runs split suites in `.github/workflows/ci.yml`:
|
|
299
|
-
|
|
300
|
-
- `unit` job: `bun run test:ci:unit`
|
|
301
|
-
- `integration` job: `bun run test:ci:integration`
|
|
302
|
-
|
|
303
|
-
Integration CI pins OpenCode-owned loop mode to deterministic settings:
|
|
304
|
-
|
|
305
|
-
- `CURSOR_ACP_TOOL_LOOP_MODE=opencode`
|
|
306
|
-
- `CURSOR_ACP_PROVIDER_BOUNDARY=v1`
|
|
307
|
-
- `CURSOR_ACP_PROVIDER_BOUNDARY_AUTOFALLBACK=false`
|
|
308
|
-
- `CURSOR_ACP_TOOL_LOOP_MAX_REPEAT=3`
|
|
309
|
-
- `CURSOR_ACP_ENABLE_OPENCODE_TOOLS=true`
|
|
310
|
-
- `CURSOR_ACP_FORWARD_TOOL_CALLS=false`
|
|
311
|
-
- `CURSOR_ACP_EMIT_TOOL_UPDATES=false`
|
|
153
|
+
| **Platform** | Linux, macOS | Linux, macOS | Linux, macOS | macOS only (Keychain) |
|
|
154
|
+
| **Max Prompt** | Unlimited (HTTP body) | Unknown | ~128KB (ARG_MAX) | Unknown |
|
|
155
|
+
| **Streaming** | ✓ SSE | ✓ SSE | Undocumented | ✓ |
|
|
156
|
+
| **Error Parsing** | ✓ (quota/auth/model) | ✗ | ✗ | Debug logging |
|
|
157
|
+
| **Installer** | ✓ TUI + one-liner | ✗ | ✗ | ✗ |
|
|
158
|
+
| **OAuth Flow** | ✓ OpenCode integration | ✓ Native | Browser login | Keychain |
|
|
159
|
+
| **Tool Calling** | ✓ OpenCode-owned loop + proxy-exec | ✓ Native | ✓ Experimental | ✗ |
|
|
160
|
+
| **Stability** | Stable (uses official CLI) | Experimental | Stable | Experimental |
|
|
161
|
+
| **Dependencies** | bun, cursor-agent | npm | bun, cursor-agent | Node.js 18+ |
|
|
162
|
+
| **Port** | 32124 | 18741 | 32123 | 4141 |
|
|
312
163
|
|
|
313
164
|
## Troubleshooting
|
|
314
165
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
**Quota exceeded** - Check [cursor.com/settings](https://cursor.com/settings)
|
|
320
|
-
|
|
321
|
-
**Authentication failed or incomplete** - Enable debug logging to diagnose:
|
|
322
|
-
```bash
|
|
323
|
-
CURSOR_ACP_LOG_LEVEL=debug opencode auth login cursor-acp
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Common causes:
|
|
327
|
-
- Browser didn't open automatically - manually open the URL shown in the terminal
|
|
328
|
-
- Auth file not created - ensure `cursor-agent login` works directly first
|
|
329
|
-
- Timeout - authentication must complete within 5 minutes
|
|
166
|
+
- `fetch() URL is invalid` → `opencode auth login`
|
|
167
|
+
- Model not responding → `cursor-agent login`
|
|
168
|
+
- Quota exceeded → [cursor.com/settings](https://cursor.com/settings)
|
|
169
|
+
- Auth failed → `CURSOR_ACP_LOG_LEVEL=debug opencode auth login cursor-acp`
|
|
330
170
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
Enable verbose logs:
|
|
334
|
-
```bash
|
|
335
|
-
CURSOR_ACP_LOG_LEVEL=debug opencode run "your prompt" --model cursor-acp/auto
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
Disable log output entirely:
|
|
339
|
-
```bash
|
|
340
|
-
CURSOR_ACP_LOG_SILENT=true opencode run "your prompt"
|
|
341
|
-
```
|
|
171
|
+
Debug logging: `CURSOR_ACP_LOG_LEVEL=debug opencode run "your prompt" --model cursor-acp/auto`
|
|
342
172
|
|
|
343
173
|
## License
|
|
344
174
|
|
package/dist/cli/discover.js
CHANGED
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
5
3
|
var __defProp = Object.defineProperty;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
9
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
10
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
11
|
-
for (let key of __getOwnPropNames(mod))
|
|
12
|
-
if (!__hasOwnProp.call(to, key))
|
|
13
|
-
__defProp(to, key, {
|
|
14
|
-
get: () => mod[key],
|
|
15
|
-
enumerable: true
|
|
16
|
-
});
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
4
|
var __export = (target, all) => {
|
|
20
5
|
for (var name in all)
|
|
21
6
|
__defProp(target, name, {
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
5
3
|
var __defProp = Object.defineProperty;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
9
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
10
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
11
|
-
for (let key of __getOwnPropNames(mod))
|
|
12
|
-
if (!__hasOwnProp.call(to, key))
|
|
13
|
-
__defProp(to, key, {
|
|
14
|
-
get: () => mod[key],
|
|
15
|
-
enumerable: true
|
|
16
|
-
});
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
4
|
var __export = (target, all) => {
|
|
20
5
|
for (var name in all)
|
|
21
6
|
__defProp(target, name, {
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,5 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
4
2
|
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
-
for (let key of __getOwnPropNames(mod))
|
|
11
|
-
if (!__hasOwnProp.call(to, key))
|
|
12
|
-
__defProp(to, key, {
|
|
13
|
-
get: () => mod[key],
|
|
14
|
-
enumerable: true
|
|
15
|
-
});
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
3
|
var __export = (target, all) => {
|
|
19
4
|
for (var name in all)
|
|
20
5
|
__defProp(target, name, {
|
package/dist/plugin-entry.js
CHANGED
|
@@ -1,20 +1,5 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
4
2
|
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
-
for (let key of __getOwnPropNames(mod))
|
|
11
|
-
if (!__hasOwnProp.call(to, key))
|
|
12
|
-
__defProp(to, key, {
|
|
13
|
-
get: () => mod[key],
|
|
14
|
-
enumerable: true
|
|
15
|
-
});
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
3
|
var __export = (target, all) => {
|
|
19
4
|
for (var name in all)
|
|
20
5
|
__defProp(target, name, {
|
|
@@ -19370,6 +19355,16 @@ import { existsSync, readFileSync } from "fs";
|
|
|
19370
19355
|
import { homedir } from "os";
|
|
19371
19356
|
import { join, resolve } from "path";
|
|
19372
19357
|
var CURSOR_PROVIDER_ID = "cursor-acp";
|
|
19358
|
+
var NPM_PACKAGE_NAME = "@rama_nigg/open-cursor";
|
|
19359
|
+
function matchesPlugin(entry) {
|
|
19360
|
+
if (entry === CURSOR_PROVIDER_ID)
|
|
19361
|
+
return true;
|
|
19362
|
+
if (entry === NPM_PACKAGE_NAME)
|
|
19363
|
+
return true;
|
|
19364
|
+
if (entry.startsWith(`${NPM_PACKAGE_NAME}@`))
|
|
19365
|
+
return true;
|
|
19366
|
+
return false;
|
|
19367
|
+
}
|
|
19373
19368
|
function resolveOpenCodeConfigPath(env = process.env) {
|
|
19374
19369
|
if (env.OPENCODE_CONFIG && env.OPENCODE_CONFIG.length > 0) {
|
|
19375
19370
|
return resolve(env.OPENCODE_CONFIG);
|
|
@@ -19383,7 +19378,7 @@ function isCursorPluginEnabledInConfig(config) {
|
|
|
19383
19378
|
}
|
|
19384
19379
|
const configObject = config;
|
|
19385
19380
|
if (Array.isArray(configObject.plugin)) {
|
|
19386
|
-
return configObject.plugin.some((entry) => entry
|
|
19381
|
+
return configObject.plugin.some((entry) => matchesPlugin(entry));
|
|
19387
19382
|
}
|
|
19388
19383
|
return true;
|
|
19389
19384
|
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rama_nigg/open-cursor",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.3",
|
|
4
4
|
"description": "No prompt limits. No broken streams. Full thinking + tool support. Your Cursor subscription, properly integrated.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/
|
|
6
|
+
"main": "dist/plugin-entry.js",
|
|
7
7
|
"module": "src/plugin-entry.ts",
|
|
8
8
|
"scripts": {
|
|
9
9
|
"build": "bun build ./src/index.ts ./src/plugin-entry.ts ./src/cli/discover.ts ./src/cli/opencode-cursor.ts --outdir ./dist --target node",
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
25
|
"bun": "./src/plugin-entry.ts",
|
|
26
|
+
"import": "./dist/plugin-entry.js",
|
|
27
|
+
"default": "./dist/plugin-entry.js"
|
|
28
|
+
},
|
|
29
|
+
"./lib": {
|
|
30
|
+
"bun": "./src/index.ts",
|
|
26
31
|
"import": "./dist/index.js",
|
|
27
32
|
"default": "./dist/index.js"
|
|
28
33
|
}
|
package/src/plugin-toggle.ts
CHANGED
|
@@ -3,6 +3,14 @@ import { homedir } from "os";
|
|
|
3
3
|
import { join, resolve } from "path";
|
|
4
4
|
|
|
5
5
|
const CURSOR_PROVIDER_ID = "cursor-acp";
|
|
6
|
+
const NPM_PACKAGE_NAME = "@rama_nigg/open-cursor";
|
|
7
|
+
|
|
8
|
+
function matchesPlugin(entry: string): boolean {
|
|
9
|
+
if (entry === CURSOR_PROVIDER_ID) return true;
|
|
10
|
+
if (entry === NPM_PACKAGE_NAME) return true;
|
|
11
|
+
if (entry.startsWith(`${NPM_PACKAGE_NAME}@`)) return true;
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
6
14
|
|
|
7
15
|
type EnvLike = Record<string, string | undefined>;
|
|
8
16
|
|
|
@@ -26,7 +34,7 @@ export function isCursorPluginEnabledInConfig(config: unknown): boolean {
|
|
|
26
34
|
const configObject = config as { plugin?: unknown; provider?: unknown };
|
|
27
35
|
|
|
28
36
|
if (Array.isArray(configObject.plugin)) {
|
|
29
|
-
return configObject.plugin.some((entry) => entry
|
|
37
|
+
return configObject.plugin.some((entry) => matchesPlugin(entry));
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
return true;
|