Skip to content

Commit 704a313

Browse files
committed
Latest from base copier
1 parent 9f4748a commit 704a313

35 files changed

Lines changed: 1779 additions & 112 deletions
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
// Additional directories that Claude Code can access
3+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
4+
"permissions": {
5+
"additionalDirectories": ["/tmp", "/workspaces"],
6+
},
7+
}

.claude/settings/permissions/bash.jsonc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525
"Bash(~/.claude/hooks/*)",
2626
"Bash(~/.agents/skills/*)",
2727
"Bash(~/.claude/skills/*)",
28+
"Bash(.claude/skills/**/*)",
2829
// File System
2930
"Bash(bat *)",
31+
"Bash(cd /workspaces/*)",
3032
"Bash(chmod *)",
3133
"Bash(cp *)",
3234
"Bash(eza *)",
@@ -40,11 +42,15 @@
4042
"Bash(touch *)",
4143
"Bash(tree *)",
4244
// Git & Version Control
45+
"Bash(git add *)",
46+
"Bash(git branch *)",
47+
"Bash(git commit *)",
4348
"Bash(git diff *)",
44-
"Bash(git status *)",
4549
"Bash(git log *)",
50+
"Bash(git push)",
51+
"Bash(git remote get-url origin)",
4652
"Bash(git rev-parse *)",
47-
"Bash(git branch *)",
53+
"Bash(git status *)",
4854
// Misc
4955
"Bash(amp *)",
5056
"Bash(atuin *)",
@@ -57,8 +63,10 @@
5763
"Bash(test *)",
5864
"Bash(zk *)",
5965
// Node.js
66+
"Bash(pnpm list *)",
6067
"Bash(pnpm test-unit *)",
6168
"Bash(pnpm test-e2e *)",
69+
"Bash(pnpm view *)",
6270
// Python
6371
"Bash(uv run pytest *)",
6472
// Text Processing
@@ -76,8 +84,9 @@
7684
"Bash(rg *)",
7785
// Research
7886
"Bash(gh issue list *)",
87+
"Bash(gh search *)",
7988
"Bash(gh pr view *)",
80-
"Bash(gh pr diff *)"
89+
"Bash(gh pr diff *)",
8190
],
8291
"ask": [
8392
// let's hold off before we let it use the github CLI in any free running allow mode...I don't want it somehow approving PRs with the user's credentials
@@ -89,19 +98,21 @@
8998
"Bash(curl *)",
9099
"Bash(ln *)",
91100
"WebFetch",
101+
// Git & Version Control
102+
"Bash(git reset --hard *)",
92103
],
93104
"deny": [
94105
// Exceptions to generally allowed AI tooling
95106
"Bash(bd init*)", // we need to control the init process, don't let AI do that in the background
96107
// Github
97108
// Claude should not ever interfere with the PR process, that is how we gate AI's work
109+
"Bash(gh pr close *)",
110+
"Bash(gh pr comment *)",
98111
"Bash(gh pr create *)",
99112
"Bash(gh pr edit *)",
113+
"Bash(gh pr merge *)",
100114
"Bash(gh pr ready *)",
101115
"Bash(gh pr review *)",
102-
"Bash(gh pr merge *)",
103-
"Bash(gh pr close *)",
104-
"Bash(gh pr comment *)",
105116
"Bash(gh pr update-branch *)",
106117

107118
// Destructive File Operations
@@ -118,7 +129,6 @@
118129
"Bash(kill -9 *)",
119130
"Bash(killall *)",
120131
// Git & Version Control
121-
"Bash(git reset --hard *)",
122132
"Bash(git push -f *)",
123133
"Bash(git push --force*)",
124134
// Node.js

.claude/settings/permissions/write.jsonc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
// This should only ever be running in a devcontainer, so pretty lenient permissions are allowed
44
"$schema": "https://json.schemastore.org/claude-code-settings.json",
55
"permissions": {
6-
"allow": ["Write(/tmp/**)"]
7-
}
6+
"allow": ["Write(/tmp/**/*)", "Write(/workspaces/**/tmp/**)", "Write(tmp/**)"],
7+
},
88
}

.claude/skills/address-pr-comments/SKILL.md

Lines changed: 290 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env python3
2+
"""Ensure the AI attribution footer is present in a reply file.
3+
4+
Usage: check-footer.py <file>
5+
6+
Checks whether the footer is already in the file. If missing, appends it
7+
with a blank line separator. Prints "present" or "added" to stdout.
8+
"""
9+
10+
import sys
11+
from pathlib import Path
12+
13+
EXPECTED_ARG_COUNT = 2
14+
15+
FOOTER = "*Reply drafted by AI (Claude), reviewed and approved by the author before posting.*"
16+
17+
18+
def main() -> None:
19+
if len(sys.argv) != EXPECTED_ARG_COUNT:
20+
_ = sys.stderr.write(f"Usage: {sys.argv[0]} <file>\n")
21+
sys.exit(1)
22+
23+
path = Path(sys.argv[1])
24+
try:
25+
content = path.read_text(encoding="utf-8")
26+
except OSError as e:
27+
_ = sys.stderr.write(f"File error for {path}: {e}\n")
28+
sys.exit(1)
29+
30+
non_empty_lines = [line.strip() for line in content.splitlines() if line.strip()]
31+
if non_empty_lines and non_empty_lines[-1] == FOOTER:
32+
_ = sys.stdout.write("present\n")
33+
return
34+
35+
# Ensure a blank line before the footer, then append.
36+
suffix = "\n" if content.endswith("\n") else "\n\n"
37+
try:
38+
_ = path.write_text(content + suffix + FOOTER + "\n", encoding="utf-8")
39+
except OSError as e:
40+
_ = sys.stderr.write(f"File error for {path}: {e}\n")
41+
sys.exit(1)
42+
_ = sys.stdout.write("added\n")
43+
44+
45+
if __name__ == "__main__":
46+
main()

0 commit comments

Comments
 (0)