reach atlas db / names / systems-done / check / verify / commit-and-sync / update-field / flatness. Eight scripts retired, five of them bash. verify reproduces the original exactly: 2 errors across 301 proposals, exit 1. The binary has more verbs than its wrapper documented. The bash usage text listed four; atlas-commit-and-sync calls four more it never mentioned. All eight are declared so reach atlas --help is a complete index, and unknown verbs are still forwarded — a hand-maintained list falls behind the binary it describes, so rejecting on it would break the day someone adds a subcommand. commit-and-sync now stages by default and commits only with --commit. Nothing else in reach writes to git history, and committing as a side effect of "sync" is a different risk class from writing a file; the default prints the message it would use, leaving the decision where it was. Two real bugs found in that script while porting it. It ran atlas-verify and never checked the exit code, so a proposal that FAILED verification was still wiped, committed and synced — bad data in systems.db is far harder to undo than a failed command, and it now refuses. And it hardcoded a pinned "Co-Authored-By: Claude Opus 4.6" into every atlas commit, which the git-commit skill names as the root cause of attribution drift. update-field gains two guards the original lacked. Its field→table map lived inside a bash heredoc string where nothing could check it, and an unknown field produced an UPDATE against a table of None; it now names the nine accepted fields. And it checks rowcount, so a system_id that does not exist is a failure rather than a silent no-op reported as success. The three Python scripts moved with the usual treatment — prints to console events, argparse replaced by typed functions, __file__ roots to config.repo_root(). No root bug this time: checked before moving rather than after, three domains running. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
115 lines
2.9 KiB
JSON
115 lines
2.9 KiB
JSON
{
|
|
"env": {
|
|
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
|
|
},
|
|
"teammateMode": "auto",
|
|
"permissions": {
|
|
"allow": [
|
|
"Bash(git add *)",
|
|
"Bash(git commit *)",
|
|
"Bash(git push *)",
|
|
"Bash(git fetch *)",
|
|
"Bash(git merge *)",
|
|
"Bash(git pull *)",
|
|
"Bash(git status *)",
|
|
"Bash(git log *)",
|
|
"Bash(git diff *)",
|
|
"Bash(git show *)",
|
|
"Bash(git checkout *)",
|
|
"Bash(git stash *)",
|
|
"Bash(git branch *)",
|
|
"Bash(git worktree *)",
|
|
"Bash(git config *)",
|
|
"Bash(git mv *)",
|
|
"Bash(git rm *)",
|
|
"Bash(git ls-tree *)",
|
|
"Bash(git rev-parse --show-toplevel)",
|
|
"Bash(tooling/db/audio-generate *)",
|
|
"Bash(tooling/db/audio-health)",
|
|
"Bash(tooling/db/audio-post *)",
|
|
"Bash(tooling/db/audio-batch *)",
|
|
"Bash(make *)",
|
|
"Bash(make)",
|
|
"Bash(pql)",
|
|
"Bash(pql *)",
|
|
"Bash(reach)",
|
|
"Bash(reach *)",
|
|
"Bash(tea *)",
|
|
"Bash(tooling/tea-comment *)",
|
|
"Bash(tooling/worktree-setup:*)",
|
|
"Bash(cargo test *)",
|
|
"Bash(cargo test)",
|
|
"Bash(cargo build *)",
|
|
"Bash(cargo build)",
|
|
"Bash(cargo check *)",
|
|
"Bash(cargo check)",
|
|
"Bash(cargo clippy *)",
|
|
"Bash(cargo clippy)",
|
|
"Bash(ruff check *)",
|
|
"Bash(ruff check)",
|
|
"Bash(tests/run-*)",
|
|
"Bash(godot4:*)",
|
|
"Bash(gdformat:*)",
|
|
"Bash(tooling/pr-watchlist-diff:*)",
|
|
"Bash(chmod *)",
|
|
"Bash(ls *)",
|
|
"Bash(find *)",
|
|
"Bash(list *)",
|
|
"Bash(tree *)",
|
|
"Bash(sed -n *)",
|
|
"Read(//var/mnt/data/projects/settled-reach/**)",
|
|
"Edit(//var/mnt/data/projects/settled-reach/**)",
|
|
"Read(//tmp/**)",
|
|
"Grep",
|
|
"Glob",
|
|
"Skill(git-commit)",
|
|
"Skill(whats-next)",
|
|
"Skill(pr-process)",
|
|
"Skill(pr-review)",
|
|
"Skill(ticket)",
|
|
"Skill(workshop-start)"
|
|
],
|
|
"deny": [
|
|
"Bash(git push --force *)",
|
|
"Bash(git push --force:*)",
|
|
"Bash(git push --force)",
|
|
"Bash(git reset --hard *)",
|
|
"Bash(git reset --hard:*)",
|
|
"Bash(git reset --hard)",
|
|
"Bash(git clean -f *)",
|
|
"Bash(git clean -f:*)",
|
|
"Bash(git clean -f)",
|
|
"Bash(rm -rf *)",
|
|
"Bash(rm -rf:*)"
|
|
],
|
|
"ask": [
|
|
"Edit(.claude/settings.json)",
|
|
"Edit(.claude/settings.local.json)",
|
|
"Edit(.claude/hooks/**)",
|
|
"Edit(.config/hooks/**)",
|
|
"Edit(.worktrees/**/.claude/settings.json)",
|
|
"Edit(.worktrees/**/.claude/hooks/**)",
|
|
"Edit(.worktrees/**/.config/hooks/**)"
|
|
]
|
|
},
|
|
"hooks": {
|
|
"PreToolUse": [
|
|
{
|
|
"matcher": "Bash",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": ".claude/hooks/git-lock-guard.sh",
|
|
"timeout": 5
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": ".claude/hooks/git-centralize-guard.sh",
|
|
"timeout": 5
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|