Two minutes: get your key, run one line, restart your AI agent.
gol_. You have 14 days free from now.Need Node.js? Check runs on Node.js 18 or newer. If you don't have it, install the LTS version from nodejs.org first (free; the default options are fine).
Then open a terminal (on Windows: Start menu, type PowerShell, press Enter) and paste this. Do it yourself, not through your AI, because your key must never pass through it.
npx @golproductions/check@latest --install
When it asks for your key, paste it and press Enter (you'll see only *). It lists the AI agents it found: press Enter to add Check to all of them. That's it. Windows or Linux; macOS is not supported yet.
Next: restart your AI agent (section 03), then try the one-line test in section 05.
Servers, CI and cloud agents: there's no one to paste the key, so give it through the GOL_API_KEY environment variable from your secret store, then run the same line; Check installs into every agent it finds. Keep your key safe: never put it in an AI chat, a project file or a commit. If it's ever exposed, rotate it at the console.
Instead of the line above, you can add Check through your agent's own plugins. Each plugin carries the Check client itself and downloads nothing.
| Agent | Add it with | Your key |
|---|---|---|
| Claude Code | /plugin marketplace add golproductions/gol-check, then /plugin install gol-check@gol-check | Claude Code asks for it and keeps it in secure storage |
| Gemini CLI | gemini extensions install https://github.com/golproductions/check-gemini | Gemini CLI asks for it and keeps it in your system keychain |
| GitHub Copilot CLI | copilot plugin marketplace add golproductions/check-plugins, then copilot plugin install check@golproductions | First run npx @golproductions/check@latest --key yourself, in your own terminal |
| Codex CLI | codex plugin marketplace add golproductions/check-plugins, then codex plugin add check@golproductions |
Use one way per agent, the plugin or the line above, not both. What's checked in each agent is the same either way (section 03).
If your agent was open while you installed, restart it. Then:
| Agent | Anything else to do | What's checked |
|---|---|---|
| Claude Code | Nothing | Commands, file writes and edits; receipt at the end of each reply |
| Codex CLI | Run /hooks in Codex once and approve Check | Commands; patches that add a file |
| Cursor | Nothing | Commands (Cursor has no hook before a file edit) |
| Gemini CLI | Nothing | File writes; commands on Linux only |
| Windsurf / Devin Desktop | Nothing | Commands and file writes |
| GitHub Copilot CLI | Nothing | Commands |
On Windows, Codex, Cursor and Windsurf / Devin run commands in PowerShell, so they're checked by PowerShell. Any other agent that can run a program before an action and block it can use Check too: see section 07.
Check blocks an action only when your own machine proves it won't work, and hands your agent the machine's own words, so the next try is a fix. Real examples:
pkill -f "wrangler dev"
check: bash on this machine said: type: pkill: not found
dig +short DS golproductions.com @1.1.1.1
check: bash on this machine said: type: dig: not found
Also blocked: packages that don't exist on their registry, git branches and tags that aren't there, a program or script a command would run that isn't there, a folder cd would go to that isn't there, commands that don't parse, and file writes that would leave a file that doesn't parse. Everything else goes through. When Check can't be sure, it lets the action run. If Check itself fails (offline, out of quota), your agent is never blocked. A missing file that cat, head, tail, ls or Get-Content would read is blocked too, in the tool's own words; a file a program opens by itself (like python app.py reading data.csv) is not, and that command runs and fails on its own. The full list is on What Check does.
frobnicate --all
Expected, in a bash agent:
check: bash on this machine said: type: frobnicate: not found
In a PowerShell agent:
check: PowerShell on this machine said: The term 'frobnicate' is not recognized as a name of a cmdlet, function, script file, or executable program. ...
(Gemini CLI on Windows checks file writes only, so this test won't block there.)
npx @golproductions/check --status
Each agent should say active, and the hook should say up to date with the server.
Check: 7 actions checked, 1 blocked (pkill: not found)
/hooks.--status says "installed, Check not wired". Run the install line again; it keeps your key.To remove Check from every agent (your own hooks stay):
npx @golproductions/check --uninstall
Still stuck? Tell us.
The connector is how Check is integrated. It is the same for every tool: if your environment has a hook that can run a program before the AI acts, and stop the action, it can use Check. Three steps.
npx @golproductions/check@latest --install --manual
This asks for your key if the computer doesn't have one yet (or uses GOL_API_KEY), and downloads the gate to ~/.check/check-hook.mjs (SHA-256 verified). It changes no agent, and prints the gate's full path.
Your hook runs node ~/.check/check-hook.mjs and sends it one JSON object on stdin. Every object has "check": 1, an event, and a session naming the conversation.
| event | When | Fields |
|---|---|---|
message | The person sends the AI a message | prompt, and optionally your own message_id |
run | The AI is about to run a command | command, shell (bash or powershell), cwd |
write | The AI is about to write a whole file | file_path, content, cwd |
edit | The AI is about to change part of a file | file_path, old_string, new_string, cwd |
{ "check": 1, "event": "run", "session": "chat-42", "shell": "bash", "command": "npm i [email protected]", "cwd": "/path/to/project" }
The gate answers with one JSON object on stdout, and always exits 0:
{ "decision": "allow" }
{ "decision": "deny", "reason": "check: ..." }
{ "decision": "allow", "notice": "check: ..." }
On deny, stop the action and give the reason to the AI. On allow, go ahead; a notice is for the person (for example, the trial has ended and nothing is being checked). Anything other than deny, including no answer, means go ahead: Check never blocks what it can't judge.
Billing: each message is one message. Every run, write and edit after it in the same session belongs to that message and costs nothing more. The text of the message never leaves the machine.
Send the gate a command that doesn't exist, by hand:
echo '{"check":1,"event":"run","shell":"bash","command":"frobnicate --all","cwd":"."}' | node ~/.check/check-hook.mjs
Expected:
{"decision":"deny","reason":"check: bash on this machine said: type: frobnicate: not found"}
Then have your AI run frobnicate --all through your environment. If your hook is wired, the AI is stopped with the same reason.
An environment with no hook that runs before an action and can stop it, such as Cline (its hooks are code plugins) or a plain terminal with no agent, can't be protected by Check. macOS is not supported yet.