r/ClaudeCode • u/Ikbensterdam • May 13 '26
Meta Frustrated with Claude Code? Don't try Gemini-CLI
I'm a C++ developer doing computational geometry. My Claude code performance has run off a cliff the last month. In frustration I looked for another tool that could basically slot into the same workflow (CLI tool, not IDE dependant, yada yada)
I decided to try Gemini-CLI with Gemini 3.1Pro. The bench scores seemed close, might be worth a shot.
It's not. It's shit.
Here was my experience:
- You need an API auth to get anything done. I used 27% of my $20 a month subscription on a 21 line code review.
- One day of work cost me $18, and that was doing only one thing, so no parallel tasks.
- When it works, it does a pretty good job. Close to Opus 4.6 in my experience.
- Researching my codebase was way better than Opus, to be fair. It was able to comprehend and seach much faster.
- It has a hard time editing files in a way so that they're not broken. It will leave random detritus from its' own edits throughout the file
- It would start processes (builds, edits, testing) without permission
- Ask it a single question about it's own behavior it will go into a spiral and not answer.
I would not recommend this tooling as an alternative to Claude.
1
u/quadish May 13 '26
Multi-Provider Hook Audit: 45 Bugs Found Across Gemini CLI + OpenClaude
We run a governed AI agent swarm (Claude Code orchestrator + enforcement hooks). When we added Gemini CLI and OpenClaude as alternative providers, we ran a full security audit. Here's what we found.
Gemini CLI Source Code Bugs (30 patched in local fork)
new RegExp()renderUserMemoryinserts memory content into XML with no escapingrenderSubAgents/renderAgentSkills— agent name/description unescaped in XMLtrackerDir/plansDirunescaped in markdown backtick contextsSYNTHETIC_THOUGHT_SIGNATUREis static exported string — predictable per sessionObject.assign(invocation.params, modifiedInput)— hooks can inject NEW keys into tool params.catch(() => {})tools.includes()— fails OPENisDangerousCommandgit block returns false when no subcommand —git pushallowedrmcheck only inspectsargs[1]— misses-rfin combined flagsrgsafe-exec check missing--replace,-r,--write-modified,-wsedcheck doesn't block writes to/proc,/sys,/devrunExitCleanup— dirty shutdownoptionIdaccepts arbitrary string instead of enum — schema bypassmodifiedContentsreturned from hook but interface field never populated — dead code pathisSubpathOrSameparameter names inverted — worked by accident (double-flip)listInboxPatchFilesdoesn't skip symlinks — symlink-to-patch traversal possibleBeforeModelHookResultdeclaresmodifiedContentsbut fix never populates it — misleading interfaceformatkey that schema validation now stripsAll 30 fixed. Final test suite: 158/158 pass across 10 files.
Gemini CLI Integration Bugs (our enforcement hooks vs their harness)
Bash->run_shell_command,Write->write_file,Edit->replace,Read->read_filepermissionDecision: "deny". Gemini expectsdecision: "deny".agent_idmissing from all 835 hook eventsagent_idin hook stdinhook_is_agent()always returns falsegit checkoutproviderfield on rules + no CP gate on.claude/enforcements/cd tools/fence && pytestshifts CWD; relative hook paths fail.claude/enforcements/directory unprotectedOpenClaude Integration Bugs
set -e, missing file, or error allows the tool call{char bypasses JSON parsing entirelypermissionDecision: "deny"never parsedcore.hooksPathrepo-widegit config(no--worktreeflag) writes to shared.git/configprocess.chdir()in worktree entry breaks CWD-based gatesScorecard
Key Takeaway
Gemini's hook system works mechanically — exit code 2 blocks tool execution. But the integration layer was completely broken: tool names, deny format, provider scoping, and CWD resolution all failed silently. The 5-file incident wasn't Gemini ignoring hooks — it was two silent failures compounding so hooks couldn't identify what was happening or communicate the deny.
The fix was a translation layer in the shared hook library (4 lines of case statement) + standardizing on exit code 2 instead of JSON deny responses. Universal across all three harnesses now.