A lightweight local diff viewer for inspecting changes with agent-aware ephemeral notes.
Sift provides 4 well-named tools with clear, detailed descriptions (avg 180 chars) and complete input schemas. Tool names follow verb_noun convention (list_notes, add_note, update_note, delete_note). Descriptions explain WHAT, WHEN, and consequences. All parameters have types and descriptions. However, output schemas are not documented in the source code provided, and error handling lacks recovery guidance. No pagination support visible for list_notes despite potential for large result sets.
Add a review comment to a whole file or a specific diff line range. kind: 'file' accepts a tracked file even when it is outside the current diff, or a diff-visible file. kind: 'line' must fit within one current diff hunk. If the same line range exists in both the working and staged panes, the call fails and asks for "bucket" to be specified.
Delete a note, for example to withdraw a review comment that no longer applies. Get noteId from list_notes: ids only live as long as the Sift server process, and a note that is already gone reports NOTE_NOT_FOUND. Only delete notes you wrote yourself; a note may have been written by the person reviewing the diff, and deletion cannot be undone.
List review comments (Notes) for the repository. By default only notes whose creation-time anchors still apply to the current repository state are returned. Live file notes may target tracked files outside the current diff. Notes whose targets have since changed are marked stale and left out, with "staleCount" reporting how many. Call this right after editing a file to see which notes went stale, which usually means they are addressed. Pass includeStale: true to see them with the reason they no longer apply. The returned ids are what update_note and delete_note take.
Rewrite the body of an existing note, for example to correct or narrow a review comment. The body is replaced in full, so send the complete new text. Get noteId from list_notes: ids only live as long as the Sift server process, and a note that is gone reports NOTE_NOT_FOUND. Only revise notes you wrote yourself; a note may have been written by the person reviewing the diff.
Output schemas not documented. LLMs cannot infer what list_notes, add_note, update_note, delete_note return, forcing them to guess field names and types for downstream operations.
list_notes lacks pagination parameters (limit, offset, cursor). If a repository has many notes, the response could exceed context limits. No indication of result capping or pagination strategy.
Error responses reference error codes (NOTE_NOT_FOUND) but lack recovery guidance. LLMs need explicit next steps: 'Note not found. Call list_notes() to see current note IDs.'
add_note and update_note accept free-form 'body' strings with no length limits or format constraints documented. LLMs may pass excessively long or malformed text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2025-06-18+ | v2 |
add_note's 'bucket' parameter is conditional (required only when ambiguous) but the description does not explain the ambiguity condition or when it is optional vs required.