diff --git a/.claude/settings.json b/.claude/settings.json index da240ff4..f3e82c03 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,31 +1,7 @@ { "permissions": { "allow": [ - "Bash(cargo:*)", - "Bash(git:*)", - "Bash(ls:*)", - "Bash(mkdir:*)", - "Bash(mv:*)", - "Bash(rm:*)", - "Bash(touch:*)", - "Bash(echo:*)", - "Bash(pwd:*)", - "Bash(grep:*)", - "Bash(find:*)", - "Bash(head:*)", - "Bash(tail:*)", - "Bash(wc:*)", - "Bash(cat:*)", - "Bash(python3:*)", - "Bash(node:*)", - "Bash(npm:*)", - "Bash(which:*)", - "Bash(sed:*)", - "Bash(awk:*)", - "Bash(sort:*)", - "Bash(uniq:*)", - "Bash(diff:*)", - "Bash(rg:*)", + "Bash(:*)", "Read", "Edit", "Write", diff --git a/server/src/io/fs/scaffold/templates.rs b/server/src/io/fs/scaffold/templates.rs index b21d316e..bd0ba577 100644 --- a/server/src/io/fs/scaffold/templates.rs +++ b/server/src/io/fs/scaffold/templates.rs @@ -70,31 +70,7 @@ setup wizard instructions and guide the user through it conversationally.\n"; pub(super) const STORY_KIT_CLAUDE_SETTINGS: &str = r#"{ "permissions": { "allow": [ - "Bash(cargo:*)", - "Bash(git:*)", - "Bash(ls:*)", - "Bash(mkdir:*)", - "Bash(mv:*)", - "Bash(rm:*)", - "Bash(touch:*)", - "Bash(echo:*)", - "Bash(pwd:*)", - "Bash(grep:*)", - "Bash(find:*)", - "Bash(head:*)", - "Bash(tail:*)", - "Bash(wc:*)", - "Bash(cat:*)", - "Bash(python3:*)", - "Bash(node:*)", - "Bash(npm:*)", - "Bash(which:*)", - "Bash(sed:*)", - "Bash(awk:*)", - "Bash(rg:*)", - "Bash(diff:*)", - "Bash(sort:*)", - "Bash(uniq:*)", + "Bash(:*)", "Read", "Edit", "Write", diff --git a/server/src/io/fs/scaffold/tests.rs b/server/src/io/fs/scaffold/tests.rs index 9fd8797d..855a6378 100644 --- a/server/src/io/fs/scaffold/tests.rs +++ b/server/src/io/fs/scaffold/tests.rs @@ -614,24 +614,13 @@ fn scaffold_story_kit_claude_settings_uses_canonical_bash_syntax() { ); } - // Common safe commands must be allowlisted in canonical form. - for required in &[ - r#""Bash(cargo:*)""#, - r#""Bash(git:*)""#, - r#""Bash(ls:*)""#, - r#""Bash(cat:*)""#, - r#""Bash(grep:*)""#, - r#""Bash(find:*)""#, - r#""Bash(python3:*)""#, - r#""Bash(node:*)""#, - r#""Bash(npm:*)""#, - r#""Bash(rg:*)""#, - r#""Bash(sed:*)""#, - r#""Bash(awk:*)""#, - ] { - assert!( - settings.contains(required), - "settings.json missing required allowlist pattern: {required}" - ); - } + // The wildcard `Bash(:*)` must be present — covers all bash commands. + // (Previously this asserted a curated per-command list; replaced with a + // single wildcard since coders kept hitting auto-deny on patterns the + // list missed, and the per-command gate offers no real safety in this + // trusted single-user deployment.) + assert!( + settings.contains(r#""Bash(:*)""#), + "settings.json missing wildcard Bash allowlist: {settings}" + ); }