# 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.

> Ask the user before running any command on this page: each one changes how their agent or repository behaves.

## 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

| Event | Can block | Can rewrite | Fail mode |
| --- | --- | --- | --- |
| session_start | no | no | open |
| session_end | no | no | open |
| prompt_submit | yes | no | open |
| pre_tool | yes | yes | open |
| post_tool | yes | no | open |
| stop | yes | no | open |
| pre_compact | no | no | open |

## 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: https://docs.tabnine.com/main/getting-started/tabnine-cli/features/hooks/configuration

## 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](https://github.com/open-coder-ai/chock/commit/5a4b6287a46e07f9f856d9bbe10622bd1ff2e021) and catalog [1e60d211c1bb](https://github.com/open-coder-ai/chock-catalog/commit/1e60d211c1bb767152c6ab0167932da06ab3a10f).
