fix(tooling): strip MCP: prefix in Cursor hook tool_name matching

IDE postToolUse reports tool_name as MCP:pi_subagent_*; without stripping,
guard-pi-dispatch skipped shape checks. Confirmed via live pi_subagent_roles.
This commit is contained in:
weichen
2026-09-24 10:35:51 +00:00
parent 5392db8ecb
commit 476e97c993
8 changed files with 139 additions and 22 deletions
+38
View File
@@ -224,6 +224,34 @@ class GuardPiDispatchTest(unittest.TestCase):
}
self.assertEqual(self._run(payload).get("permission"), "allow")
def test_ask_mcp_prefixed_tool_name_bad_sha(self):
# IDE postToolUse/beforeMCP observed tool_name="MCP:pi_subagent_*"
payload = {
"mcp_server_name": "pi-subagents",
"tool_name": "MCP:pi_subagent_run",
"tool_input": {
"worktree": "/tmp/wt",
"task_id": "t1",
"request": {
"role_id": "research",
"request_id": "research-001",
"goal": "g",
"authorization_ref": "a",
"source_sha": "HEAD",
"input_files": [],
"timeout_seconds": 30,
},
},
}
self.assertEqual(self._run(payload).get("permission"), "ask")
def test_allow_mcp_prefixed_roles(self):
payload = {
"tool_name": "MCP:pi_subagent_roles",
"tool_input": {"worktree": "/tmp/wt", "task_id": "t1"},
}
self.assertEqual(self._run(payload).get("permission"), "allow")
class GuardPiShellTest(unittest.TestCase):
SCRIPT = HOOKS / "guard-pi-shell.sh"
@@ -288,6 +316,16 @@ class PiReceiptContextTest(unittest.TestCase):
self.assertIn("additional_context", parsed)
self.assertIn("run_status", parsed["additional_context"])
def test_injects_for_mcp_prefixed_tool_name(self):
code, parsed, err = _run_hook(
self.SCRIPT,
{"tool_name": "MCP:pi_subagent_roles", "mcp_server_name": "pi-subagents"},
env=self.env,
cwd=self.root,
)
self.assertEqual(code, 0, err)
self.assertIn("additional_context", parsed)
def test_noop_for_unrelated(self):
code, parsed, err = _run_hook(
self.SCRIPT,