Skip to content

feat: git-aware context tools#2832

Open
TheArchitectit wants to merge 8 commits intoultraworkers:mainfrom
TheArchitectit:feat/git-aware-tools
Open

feat: git-aware context tools#2832
TheArchitectit wants to merge 8 commits intoultraworkers:mainfrom
TheArchitectit:feat/git-aware-tools

Conversation

@TheArchitectit
Copy link
Copy Markdown

Summary

  • Add five native read-only git tools: GitStatus, GitDiff, GitLog, GitShow, GitBlame
  • These replace ad-hoc git commands via bash with structured, discoverable tool definitions
  • All tools use PermissionMode::ReadOnly and the existing git_stdout() helper
  • Detailed doc comments on input structs, fields, and run functions
  • Full README with parameter tables and examples

Why native git tools?

Before this PR, the model had to use the bash tool for git operations, which:

  • Returns raw text the model must parse
  • Requires DangerFullAccess even for read-only git commands
  • Isn't discoverable via ToolSearch
  • Uses inconsistent flags across invocations

With native git tools:

  • All are ReadOnly — safe in restricted permission modes
  • Structured JSON output — consistent, parseable results
  • Discoverable via ToolSearch with keywords like "git", "diff", "blame"
  • Model-friendly descriptions explain when to use each tool vs bash

Test plan

  • GitStatus returns branch and file status
  • GitDiff with staged: true shows cached changes
  • GitLog with count and oneline returns condensed history
  • GitShow with a commit hash shows the diff
  • GitBlame with a file path and line range works
  • All tools report clear errors outside a git repo

TheArchitectit and others added 8 commits April 28, 2026 11:41
…w, GitBlame)

Add five native git tools that provide structured read-only access to
repository state, replacing ad-hoc bash git commands with purpose-built
tool definitions the model can discover and invoke directly.

- GitStatus: working tree status with --short --branch
- GitDiff: diff with optional staged/commit/path filters
- GitLog: commit log with count, oneline, author, since/until, path
- GitShow: show commit/tree content with optional stat and path
- GitBlame: line-level blame with optional start/end line range

All tools use the existing git_stdout() helper and are PermissionMode::ReadOnly.
Some OpenAI-compatible providers (e.g., GLM-5) omit the `id` field in
streaming and non-streaming responses. Adding #[serde(default)] allows
the parser to accept these responses instead of failing with
"missing field `id`".

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Adds scripts/install.sh that builds the release binary and links it
to ~/.local/bin/claw. Run after code changes to update the CLI.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
When a provider returns HTML (e.g., error page, wrong endpoint) instead
of JSON in an SSE stream, provide a clear error message instead of
hanging or failing with a cryptic parse error.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
When a provider returns a JSON error (e.g., {"error":{"message":"..."}})
without SSE framing (no "data:" prefix), the SSE parser was silently
ignoring it and hanging. Now detects and surfaces these errors.

Also handles HTML responses that lack SSE framing.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Some providers (GLM, DeepSeek) emit reasoning tokens in `reasoning_content`
or nested `thinking.content` fields instead of `content`. Added support
for these fields so reasoning models work correctly.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
The final streaming chunk from some providers contains only finish_reason
and usage, with no delta field. Made it optional to prevent parse errors.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
When preserve_recent_messages == 0, raw_keep_from equals messages.len(),
causing index out of bounds when accessing session.messages[k].

Added k >= session.messages.len() check to prevent panic.

Reason: Compaction with preserve_recent_messages=0 triggered OOB access
when checking for tool-use/tool-result pair preservation at boundary.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant