Only confirmed correctness bugs block approval; everything else is a note.
At most one fix round, then hand off. Don't widen scope to satisfy a
review. Merge main only on conflict or request. The token goes in a
private header file, and PR responses are checked for a number.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Titles and bodies go through --rawfile files, never inline shell quotes
- pipefail + curl -f + jq -e so a failed call can't look successful
- Fix rounds merge latest main and skip re-opening the PR
- Check the branch isn't main before pushing; never bypass the hooks
- Review at a pinned level; only correctness findings checked against the
code block approval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- CLI holds a lock file from load to save, so concurrent commands can't
lose an update; stale locks from crashed runs are taken over
- load() renumbers duplicate ids from the old add() bug instead of
refusing the file
- save() keeps owner, group and setgid on the temp file, and falls back to
an in-place write for hard-linked files, files whose owner/group can't
be kept, and directories that aren't writable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Linking core.hooksPath to the tracked, sandbox-writable .githooks/ let a
sandboxed command rewrite a hook that git commit/push then run unsandboxed.
Copies in .git/hooks can't be changed from the sandbox. This also keeps
existing .git/hooks scripts working and lets npm install succeed outside a
git checkout. pre-merge-commit now names itself in errors; hook tests clean
up, ignore GIT_* env and cover the installer; docs state what each layer
does and doesn't stop.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- add() refuses to create an id that load() would reject; the CLI reports it
- save() creates the temp file with the real file's mode (and O_EXCL), so a
private list is never briefly world-readable; one stat call; symlink
resolution inlined; comment states the rename trade-offs
- CLI rejects ids with leading zeros and id 0
- Tests for trimming, the bare 'todo' default, and the id limit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pre-push rejects any push that would update refs/heads/main, however the
command is spelled; pre-commit and pre-merge-commit refuse commits while
main is checked out. npm install enables them via core.hooksPath. The
README documents the three layers of protection for main.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- load() rejects duplicate ids (left by the old add bug) and ids that aren't safe positive integers
- save() refuses files the user can't write, and follows dangling symlinks to their target
- CLI rejects ids beyond Number.MAX_SAFE_INTEGER
- Skip permission-based tests when running as root
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- save() follows symlinks, keeps permissions, uses a unique temp file and cleans it up on failure
- load() rejects entries that aren't {id, text, done}
- add() finds the max id with reduce (no spread limit)
- CLI accepts only plain digits as ids and reports save errors readably
- Ignore *.tmp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- add() uses max id + 1 so ids are never reused after rm
- done/rm reject missing, non-numeric and unknown ids; add rejects empty text
- load() gives a readable error on bad JSON or non-list data
- save() writes a temp file and renames it
- CLI checks the command before loading and no longer relies on process.exit for ls
- Add regression tests for all of the above
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Project settings can't re-open a path denied by another settings source,
so this lives in user settings instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run git ls-remote unsandboxed so SSH works, and ask before each use like
the other network git commands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Enable the Bash sandbox with writes limited to the project, block reads
of credential and personal folders, and protect the settings files from
edits. git commit/push/fetch/pull run unsandboxed so GPG and SSH work;
network git commands always ask first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>