Skip to content

Commit 2fea7f5

Browse files
committed
feat(pi): use gotgenes permission policy
1 parent 837c276 commit 2fea7f5

12 files changed

Lines changed: 197 additions & 243 deletions

File tree

bin/hey.d/common.nu

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,17 @@ export def post-rebuild [] {
279279
if ! "$pi_bin" update --extensions; then
280280
echo "warning: pi package update failed; rebuild already completed" >&2
281281
fi
282+
283+
# Pi 0.79.x can prune scoped packages from the mutable npm project during
284+
# update. Reinstall this one after updates because config depends on its
285+
# flat permission schema.
286+
if grep -q "npm:@gotgenes/pi-permission-system" "$HOME/.pi/agent/settings.json" 2>/dev/null \
287+
&& [ ! -f "$HOME/.pi/agent/npm/node_modules/@gotgenes/pi-permission-system/src/index.ts" ]; then
288+
echo "=== pi: reconcile @gotgenes/pi-permission-system ==="
289+
PYTHON="''${PYTHON:-/usr/bin/python3}" npm install @gotgenes/pi-permission-system@latest \
290+
--prefix "$HOME/.pi/agent/npm" --legacy-peer-deps \
291+
|| echo "warning: failed to install @gotgenes/pi-permission-system" >&2
292+
fi
282293
'
283294
return
284295
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/gotgenes/pi-permission-system/main/schemas/permissions.schema.json",
3+
"debugLog": false,
4+
"permissionReviewLog": true,
5+
"yoloMode": false,
6+
"permission": {
7+
"*": "allow",
8+
"path": {
9+
"*": "allow",
10+
"*.env": "deny",
11+
"*.env.*": "deny",
12+
"*.env.example": "allow",
13+
"~/.ssh/*": "deny"
14+
},
15+
"external_directory": "allow",
16+
"doom_loop": "deny",
17+
"bash": {
18+
"*": "allow",
19+
"*darwin-rebuild*switch*": "deny",
20+
"*nixos-rebuild switch*": "deny",
21+
"*nixos-rebuild boot*": "deny",
22+
"*switch-to-configuration switch*": "deny",
23+
"*switch-to-configuration boot*": "deny",
24+
"*ssh*nuc*nixos-rebuild*": "deny",
25+
"*ssh*nuc*switch-to-configuration*": "deny",
26+
"*home-manager switch*": "deny",
27+
"*NIXOS_NO_CHECK*": "deny",
28+
"*deploy-rs*": "deny",
29+
"*nix run .#deploy-rs*": "deny",
30+
"*--no-verify*": "deny",
31+
"*--no-gpg-sign*": "deny",
32+
"*commit.gpgsign=false*": "deny",
33+
"*core.hooksPath*": "deny",
34+
"*git commit*--author*": "deny",
35+
"*-c user.email=*": "deny",
36+
"*-c user.name=*": "deny",
37+
"*GIT_AUTHOR_NAME=*": "deny",
38+
"*GIT_AUTHOR_EMAIL=*": "deny",
39+
"*GIT_COMMITTER_NAME=*": "deny",
40+
"*GIT_COMMITTER_EMAIL=*": "deny",
41+
"*HUSKY=0*": "deny",
42+
"*SKIP=*": "deny",
43+
"*SKIP_PREPARE_COMMIT_MSG=*": "deny",
44+
"*SKIP_PRE_COMMIT=*": "deny",
45+
"*PRE_COMMIT_ALLOW_NO_CONFIG=*": "deny",
46+
"*git rebase -i*": "deny",
47+
"*git rebase --interactive*": "deny",
48+
"*git add -p*": "deny",
49+
"*git add --patch*": "deny",
50+
"*git mergetool*": "deny",
51+
"*git difftool*": "deny",
52+
"*git gui*": "deny",
53+
"*git citool*": "deny",
54+
"*git -c sequence.editor=: rebase -i*": "allow",
55+
"*git -c sequence.editor=true rebase -i*": "allow",
56+
"*GIT_SEQUENCE_EDITOR=:*git rebase -i*": "allow",
57+
"*GIT_SEQUENCE_EDITOR=true*git rebase -i*": "allow",
58+
"*GIT_EDITOR=vim*git rebase*": "deny",
59+
"*GIT_EDITOR=nvim*git rebase*": "deny",
60+
"*GIT_SEQUENCE_EDITOR=vim*git rebase*": "deny",
61+
"*GIT_SEQUENCE_EDITOR=nvim*git rebase*": "deny",
62+
"git commit": "deny",
63+
"*&& git commit": "deny",
64+
"*git commit -n*": "deny",
65+
"*git commit * -n*": "deny",
66+
"*sudo reboot*": "deny",
67+
"* reboot*": "deny",
68+
"reboot*": "deny",
69+
"*shutdown -r*": "deny",
70+
"*shutdown now*": "deny",
71+
"*poweroff*": "deny",
72+
"*systemctl reboot*": "deny",
73+
"*systemctl poweroff*": "deny",
74+
"*ssh*nuc*reboot*": "deny",
75+
"*ssh*nuc*shutdown*": "deny",
76+
"*ssh*nuc*poweroff*": "deny",
77+
"*ssh*nuc*systemctl reboot*": "deny",
78+
"*ssh*nuc*systemctl poweroff*": "deny",
79+
"*sudo nix-store --delete*": "deny",
80+
"*nix-store --delete*": "deny",
81+
"*nix store delete*": "deny",
82+
"*sudo rm -rf /nix/store*": "deny",
83+
"*sudo rm -rf /var/lib/nix*": "deny",
84+
"*rm -rf ~/.cache/nix*": "deny",
85+
"*flake-registry.json*": "deny",
86+
"*nix registry pin*": "deny",
87+
"*nix-collect-garbage*": "deny",
88+
"*nix store gc*": "deny",
89+
"*ssh*nuc*nix-collect-garbage*": "deny",
90+
"*ssh*nuc*nix store gc*": "deny",
91+
"*brew bundle*": "deny",
92+
"*brew link --overwrite*": "deny",
93+
"*brew unlink*": "deny",
94+
"*brew install*": "deny",
95+
"*brew uninstall*": "deny",
96+
"*nix profile install*": "deny",
97+
"*nix profile upgrade*": "deny",
98+
"*nix profile remove*": "deny",
99+
"*nix-env -i*": "deny",
100+
"*nix-env --install*": "deny",
101+
"*npm install -g*": "deny",
102+
"*npm i -g*": "deny",
103+
"*pnpm add -g*": "deny",
104+
"*yarn global add*": "deny",
105+
"*pip install*": "deny",
106+
"*pipx install*": "deny",
107+
"*cargo install*": "deny",
108+
"*nix flake update skills-catalog*": "allow",
109+
"*nix flake lock --update-input skills-catalog*": "deny",
110+
"acpx claude*": "allow",
111+
"*&& acpx claude*": "allow",
112+
"hey re*": "allow",
113+
"*&& hey re*": "allow",
114+
"hey rebuild*": "allow",
115+
"*&& hey rebuild*": "allow",
116+
"hey nuc": "allow",
117+
"hey deploy *": "allow",
118+
"hey deploy-dry *": "allow",
119+
"hey skills-update*": "allow",
120+
"hey skills-sync*": "allow",
121+
"hey gc*": "allow",
122+
"bd": "deny",
123+
"bd *": "deny",
124+
"*&& bd *": "deny",
125+
"br close": "deny",
126+
"br close *": "deny",
127+
"*&& br close *": "deny",
128+
"br close * --reason *": "allow",
129+
"br close * --reason=*": "allow",
130+
"*&& br close * --reason *": "allow",
131+
"*&& br close * --reason=*": "allow",
132+
"br *": "allow",
133+
"*&& br *": "allow",
134+
"pi update*": "deny",
135+
"*&& pi update*": "deny",
136+
"pi update --extensions*": "allow",
137+
"*&& pi update --extensions*": "allow"
138+
}
139+
}
140+
}

config/pi/pi-permissions.jsonc

Lines changed: 0 additions & 201 deletions
This file was deleted.

config/pi/settings.jsonc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@
103103
],
104104
"skills": [],
105105
},
106-
// Deterministic allow/deny/ask gate backed by config/pi/pi-permissions.jsonc.
107-
"npm:pi-permission-system",
106+
// Deterministic allow/deny gate backed by config/pi/pi-permission-system.jsonc.
107+
"npm:@gotgenes/pi-permission-system",
108108
// Applies bash command policy to command-bearing extension tools like process.start.
109109
"~/.config/dotfiles/packages/pi-packages/pi-command-policy-bridge",
110110
// JJ baseline guardrail: stop editing described dirty changes without explicit intent.

docs/adr/0001-agent-command-policy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Agents must use or improve `hey` instead of invoking lower-level tools directly
2222
- Skills catalog updates: use `hey skills-update` / `hey skills-sync`.
2323
- Homebrew changes: edit Nix/darwin config and run `hey re`.
2424

25-
The Pi permission policy enforces this by denying common bypass patterns in `config/pi/pi-permissions.jsonc`.
25+
The Pi permission policy enforces this by denying common bypass patterns in `config/pi/pi-permission-system.jsonc`.
2626

2727
## Consequences
2828

docs/adr/0006-pi-jj-agent-experience.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Jujutsu. If jj is simply enabled and agents are told to remember a different
2121
workflow, they will eventually bypass it.
2222

2323
This also intersects with `packages/pi-packages/pi-command-policy-bridge`, which
24-
currently applies the existing `pi-permissions.jsonc` bash policy to tools that
24+
currently applies the existing `pi-permission-system` bash policy to tools that
2525
embed shell commands. jj support should use the same deterministic policy layer
2626
rather than relying on prompt instructions alone.
2727

modules/agents/pi/default.nix

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ in
309309
# Individual writable files (sessions, auth, cache) live alongside the
310310
# managed symlinks under ~/.pi/agent.
311311
env.PI_CODING_AGENT_DIR = "$HOME/.pi/agent";
312-
env.PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR = "$HOME/.pi/agent";
313312
env.PI_PERMISSION_SYSTEM_CONFIG_PATH = "$HOME/.pi/agent/extensions/pi-permission-system/config.json";
314313
# pi-notify sound after system notification
315314
env.PI_NOTIFY_SOUND_CMD = "afplay /System/Library/Sounds/Hero.aiff";

0 commit comments

Comments
 (0)