hermes-cursor-acp 0.1.2 → 0.1.4

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.
Files changed (3) hide show
  1. package/README.md +9 -2
  2. package/bin/cli.js +5 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -6,8 +6,8 @@ Cursor doesn't expose a chat-completions API, but the Cursor CLI ships an ACP se
6
6
 
7
7
  ## How it works
8
8
 
9
- - Hermes tool schemas go to the model as text. The model replies with `<tool_call>` blocks, and Hermes runs those calls itself.
10
- - The plugin parses tool calls with its own extractor. Hermes' built-in bridge silently drops two common shapes: the flat `{"name", "arguments"}` form, and a real block that follows a mention of `<tool_call>` in prose.
9
+ - Hermes tool schemas go to the model as text. The model replies with `<tool_call>` blocks, and Hermes runs those calls itself. The plugin parses them with its own extractor, because Hermes' built-in bridge silently drops three shapes models emit: the flat `{"name", "arguments"}` form, a real block that follows a mention of `<tool_call>` in prose, and call JSON with no tags at all.
10
+ - Models still reach for Cursor's own Shell, Read, Grep, or MCP tools, most often the GLM, Kimi, and DeepSeek families. The fence refuses the call, and the model then tells you to fix permissions. The plugin reads the refused call from the ACP stream and runs the same action through the matching Hermes tool, so Hermes' approvals still apply. If no Hermes tool matches, it re-prompts the model once.
11
11
  - The plugin rewrites `.cursor/cli.json` in an empty private workspace (`$HERMES_HOME/cache/cursor-acp-workspace`) every time a client starts, with a deny-all list (`Read`, `Write`, `Shell`, `WebFetch`, `Mcp`). This deny list is the security fence. Cursor's native tools run inside the CLI rather than over ACP, and without the list its Read tool can open any absolute path on disk.
12
12
  - Models can be chosen by bare name (`claude-opus-5-5`) or by full advertised id (`claude-opus-5-5[context=300k,effort=high,fast=false]`). An unknown name raises an error instead of silently using Cursor's default.
13
13
  - Responses report `usage=None`. Cursor sends no token counts, and a zero reading would stall Hermes' proactive context compression.
@@ -56,8 +56,14 @@ Or run `/model` inside Hermes and pick **Cursor Subscription (ACP)**.
56
56
  H=~/.hermes/hermes-agent
57
57
  PYTHONPATH=$H uv run --no-project --python $H/venv/bin/python --with pytest python -m pytest tests -q -o addopts=
58
58
  CURSOR_LIVE=1 ... # adds live tests against the real CLI (needs `agent login`)
59
+ CURSOR_LIVE=1 CURSOR_LIVE_MODELS="glm-5p3,kimi-k3" CURSOR_LIVE_TRIALS=3 ... -k two_step # two-step task per model
59
60
  ```
60
61
 
62
+ Live results on 2026-11-10 (Hermes v0.23.1, Cursor CLI 2026.10.22), driven through the plugin client:
63
+
64
+ - Two-step task (read a random value, compute from it, run a second command), 3 runs per model: deepseek-v41-flash-1017 3/3, glm-5p3 3/3, glm-5p3-flash 3/3, glm-5.2 3/3, kimi-k3 3/3, kimi-k2.7-code 2/3. Most GLM and DeepSeek runs passed only because a refused native call was rerouted.
65
+ - The same task, 2 runs per model: claude-sonnet-5-5, gpt-5.6-sol, grok-4.7, composer-2.5, gemini-4-carbon, and auto-smart all 2/2.
66
+
61
67
  Live results on 2026-10-06 (Hermes v0.21.5, Cursor CLI 2026.10.01):
62
68
 
63
69
  - Hermes tool-call bridging over 6 trials per model: claude-sonnet-5-5 6/6, claude-opus-5-5 6/6, composer-2.5 6/6, grok-4.7 6/6, gpt-5.6-sol 5/6. The one gpt miss answered from context without calling the tool.
@@ -69,6 +75,7 @@ Live results on 2026-10-06 (Hermes v0.21.5, Cursor CLI 2026.10.01):
69
75
  - Every turn starts a new ACP session. That adds 7–16s of latency and about 17k tokens of Cursor's harness prompt.
70
76
  - Hermes records no token or cost data for these calls, so `/usage` and `/insights` undercount.
71
77
  - When several sessions start at once, Cursor occasionally answers `set_model` with `Internal error`. The plugin retries up to 3 times.
78
+ - kimi-k2.7-code sometimes refuses the bridge in plain text without trying any tool. There is no call to reroute, so that turn ends with no action.
72
79
 
73
80
  ## License
74
81
 
package/bin/cli.js CHANGED
@@ -9,8 +9,11 @@ const fs = require("node:fs");
9
9
  const os = require("node:os");
10
10
  const path = require("node:path");
11
11
 
12
- const REPO = "https://github.com/neerazz/hermes-cursor-acp";
13
- const PLUGIN = "cursor-acp";
12
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf8"));
13
+ let REPO = pkg.repository?.url || "https://github.com/neerazz/hermes-cursor-acp";
14
+ if (REPO.startsWith("git+")) REPO = REPO.slice(4);
15
+ if (REPO.endsWith(".git")) REPO = REPO.slice(0, -4);
16
+ const PLUGIN = pkg.name.replace(/^hermes-/, "");
14
17
  const CURSOR_INSTALLER = "https://cursor.com/install";
15
18
  const HERMES_DOCS = "https://hermes-agent.nousresearch.com/docs";
16
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hermes-cursor-acp",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "One-command Cursor subscription models for Hermes Agent: installs the cursor-acp provider plugin and verifies the Cursor CLI ACP server.",
5
5
  "bin": {
6
6
  "hermes-cursor-acp": "bin/cli.js"