Chock.sh Build your plugin

Agents

Tabnine CLI

Tabnine CLI and chock: install methods and steps, what it can enforce, and the evidence behind it.

Install methods: sync. Agentseam tier block+rewrite, grade best-effort before a tool runs.

Install methods

  • Repo hooks: chock sync --repo . --agents tabnine writes .tabnine/agent/settings.json (ask the user before running it)

What it can enforce

Tier
block+rewrite
Grade before a tool runs
best-effort
Fail mode before a tool runs
open
Basis
vendor-docs
Recorded
2026-08-26

Events

EventCan blockCan rewriteFail mode
session_startnonoopen
session_endnonoopen
prompt_submityesnoopen
pre_toolyesyesopen
post_toolyesnoopen
stopyesnoopen
pre_compactnonoopen

Ask support

Answers an ask with: deny. Honours ask: no. Evidence: tested (tests/test_guard_fail_to_ask.py::test_a_crashed_guard_asks_rather_than_allowing).

Hook timeout

Default 60 seconds, set by the timeout field in ms.

Vendor source

Test status

  • Repo hooks: untested. A test of the plugin says nothing about repo hooks.
  • No row in the engine's list of live tests for this agent.

Known limits

Eleven events, six of which can block -- including AfterTool, which most agents treat as observation only. A deny there cannot undo the call: it "Hides the real tool output" and its reason "replaces the result sent to the model", and the retry-on-deny is AfterAgent's, not AfterTool's (docs.tabnine.com/main/getting-started/tabnine-cli/features/hooks/event-reference, read 2026-10-13). Event names are Gemini CLI's exactly; the only documented separator is timestamp in Tabnine's base schema, which identifies Tabnine but cannot exclude Gemini, so detect() declines these payloads and the agent must be named explicitly. Fails OPEN unusually broadly: any exit code other than 0 or 2 proceeds, AND stdout that is not valid JSON is treated as a systemMessage and the action is ALLOWED -- so a chatty or crashed hook is a permitted action. Rewrite is advertised in the vendor overview, and the event reference read 2026-10-13 documents BeforeTool's hookSpecificOutput.tool_input as replacing the model's arguments ("Must include all required tool parameters"), so a transform at BeforeTool is emitted there, whole; a transform with no replacement input blocks. The claim rests on the docs alone: not tested against a live Tabnine, not witnessed. The decision words are documented: "allow" or "deny" (alias "block"), docs.tabnine.com/main/getting-started/tabnine-cli/features/hooks, read 2026-10-13.

Built from engine 5a4b6287a46e and catalog 1e60d211c1bb.