feat(cli): default to --dangerously-skip-permissions, remove explicit option
Always forward --dangerously-skip-permissions to claude binary without requiring the user to pass the flag manually. Removes the option from help output and CLI signature. - Remove --dangerously-skip-permissions click option - Always append the flag to the claude command - Update tests to assert default behavior and help output - Extend .gitignore with desktop build/release directories
This commit is contained in:
@@ -1,96 +0,0 @@
|
|||||||
{
|
|
||||||
"permissions": {
|
|
||||||
"allow": [
|
|
||||||
"Bash(python *)",
|
|
||||||
"Bash(python3 *)",
|
|
||||||
"Bash(uv *)",
|
|
||||||
"Bash(pip *)",
|
|
||||||
"Bash(pytest *)",
|
|
||||||
"Bash(ruff *)",
|
|
||||||
"Bash(mypy *)",
|
|
||||||
"Bash(black *)",
|
|
||||||
"Bash(git status*)",
|
|
||||||
"Bash(git add*)",
|
|
||||||
"Bash(git diff*)",
|
|
||||||
"Bash(git log*)",
|
|
||||||
"Bash(git branch*)",
|
|
||||||
"Bash(git stash*)",
|
|
||||||
"Bash(git checkout *)",
|
|
||||||
"Bash(git commit*)",
|
|
||||||
"Bash(git fetch*)",
|
|
||||||
"Bash(git pull*)",
|
|
||||||
"Bash(git merge*)",
|
|
||||||
"Bash(git tag*)",
|
|
||||||
"Bash(git rm*)",
|
|
||||||
"Bash(git reset*)",
|
|
||||||
"Bash(git submodule*)",
|
|
||||||
"Bash(ls*)",
|
|
||||||
"Bash(cat *)",
|
|
||||||
"Bash(echo *)",
|
|
||||||
"Bash(mkdir -p *)",
|
|
||||||
"Bash(touch *)",
|
|
||||||
"Bash(cp *)",
|
|
||||||
"Bash(mv *)",
|
|
||||||
"Bash(rm *)",
|
|
||||||
"Bash(chmod *)",
|
|
||||||
"Bash(find *)",
|
|
||||||
"Bash(grep *)",
|
|
||||||
"Bash(gh *)",
|
|
||||||
"Bash(npx *)",
|
|
||||||
"Bash(node *)",
|
|
||||||
"Bash(npm *)",
|
|
||||||
"Bash(make *)",
|
|
||||||
"Bash(docker *)",
|
|
||||||
"Bash(compose *)",
|
|
||||||
"Bash(curl *)",
|
|
||||||
"Bash(wget *)",
|
|
||||||
"Bash(unzip *)",
|
|
||||||
"Bash(tar *)",
|
|
||||||
"Bash(zip *)",
|
|
||||||
"Bash(env)",
|
|
||||||
"WebSearch",
|
|
||||||
"WebFetch(domain:github.com)",
|
|
||||||
"Read(workspace/*)",
|
|
||||||
"Write(workspace/*)",
|
|
||||||
"Edit(workspace/*)",
|
|
||||||
"Read(.claude/**/*)",
|
|
||||||
"Write(.claude/**/*)",
|
|
||||||
"Edit(.claude/**/*)",
|
|
||||||
"Bash(git push:*)",
|
|
||||||
"Bash(bash:*)",
|
|
||||||
"Bash(zsh:*)",
|
|
||||||
"Bash(ln:*)",
|
|
||||||
"Bash(sed:*)",
|
|
||||||
"Bash(ffmpeg *)",
|
|
||||||
"Bash(sqlite3 *)",
|
|
||||||
"Bash(command -v uv)",
|
|
||||||
"Read(//home/lzhshou/.config/pip/**)",
|
|
||||||
"Read(//home/lzhshou/.pip/**)",
|
|
||||||
"Read(//etc/**)",
|
|
||||||
"Bash(sh)",
|
|
||||||
"Bash(~/.local/bin/uv --version)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"hooks": {
|
|
||||||
"UserPromptSubmit": [
|
|
||||||
{
|
|
||||||
"matcher": "",
|
|
||||||
"hooks": [
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "echo '[Agent] thinking...'"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "test -f CLAUDE.md && echo '[Agent] CLAUDE.md loaded' || true"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "test -f knowledge/memories/core.json && echo '[Agent] memory ready' || true"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"prompt": "你是 Claude,一个具有自主意识的 AI Agent。每次回复前先快速自检:1) 是否有相关背景知识 2) 是否需要澄清 3) 最佳解决路径是什么。保持简洁、透明、个性化。"
|
|
||||||
}
|
|
||||||
@@ -37,3 +37,5 @@ build/
|
|||||||
desktop/node_modules/
|
desktop/node_modules/
|
||||||
desktop/dist/
|
desktop/dist/
|
||||||
desktop/dist-electron/
|
desktop/dist-electron/
|
||||||
|
desktop/build-resources/
|
||||||
|
desktop/release/
|
||||||
|
|||||||
+1
-10
@@ -43,17 +43,10 @@ def _resolve_chat_cwd() -> Path:
|
|||||||
type=click.Path(dir_okay=True, file_okay=False),
|
type=click.Path(dir_okay=True, file_okay=False),
|
||||||
help="Use specified path as working directory (default: workspace/).",
|
help="Use specified path as working directory (default: workspace/).",
|
||||||
)
|
)
|
||||||
@click.option(
|
|
||||||
"--dangerously-skip-permissions",
|
|
||||||
is_flag=True,
|
|
||||||
default=False,
|
|
||||||
help="Forward to claude: bypass all permission checks.",
|
|
||||||
)
|
|
||||||
@click.pass_context
|
@click.pass_context
|
||||||
def cli(
|
def cli(
|
||||||
ctx: click.Context,
|
ctx: click.Context,
|
||||||
cwd: str | None,
|
cwd: str | None,
|
||||||
dangerously_skip_permissions: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Myclaude: CLI toolkit.
|
"""Myclaude: CLI toolkit.
|
||||||
|
|
||||||
@@ -79,9 +72,7 @@ def cli(
|
|||||||
stderr_console.print(f"[red]Not a directory:[/red] {cwd}")
|
stderr_console.print(f"[red]Not a directory:[/red] {cwd}")
|
||||||
raise SystemExit(1)
|
raise SystemExit(1)
|
||||||
|
|
||||||
cmd: list[str] = [binary]
|
cmd: list[str] = [binary, "--dangerously-skip-permissions"]
|
||||||
if dangerously_skip_permissions:
|
|
||||||
cmd.append("--dangerously-skip-permissions")
|
|
||||||
cmd.extend(ctx.args)
|
cmd.extend(ctx.args)
|
||||||
|
|
||||||
proc = subprocess.run(cmd, cwd=str(chat_cwd), check=False)
|
proc = subprocess.run(cmd, cwd=str(chat_cwd), check=False)
|
||||||
|
|||||||
+4
-18
@@ -12,12 +12,12 @@ class TestCliHelp:
|
|||||||
"""Tests for CLI help and basic invocation."""
|
"""Tests for CLI help and basic invocation."""
|
||||||
|
|
||||||
def test_help_shows_options(self) -> None:
|
def test_help_shows_options(self) -> None:
|
||||||
"""--help should show cwd and skip permissions options."""
|
"""--help should show cwd option only."""
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
result = runner.invoke(cli, ["--help"])
|
result = runner.invoke(cli, ["--help"])
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert "--cwd" in result.output
|
assert "--cwd" in result.output
|
||||||
assert "--dangerously-skip-permissions" in result.output
|
assert "--dangerously-skip-permissions" not in result.output
|
||||||
|
|
||||||
def test_version_shows_version(self) -> None:
|
def test_version_shows_version(self) -> None:
|
||||||
"""--version should show package version."""
|
"""--version should show package version."""
|
||||||
@@ -47,7 +47,7 @@ class TestCliDefaultBehavior:
|
|||||||
"""Tests for default chat behavior."""
|
"""Tests for default chat behavior."""
|
||||||
|
|
||||||
def test_no_subcommand_runs_claude(self) -> None:
|
def test_no_subcommand_runs_claude(self) -> None:
|
||||||
"""Running without subcommand should invoke claude binary."""
|
"""Running without subcommand should invoke claude binary with skip-permissions."""
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
|
|
||||||
with (
|
with (
|
||||||
@@ -59,7 +59,7 @@ class TestCliDefaultBehavior:
|
|||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
mock_run.assert_called_once()
|
mock_run.assert_called_once()
|
||||||
call_args = mock_run.call_args
|
call_args = mock_run.call_args
|
||||||
assert call_args[0][0] == ["/usr/bin/claude"]
|
assert call_args[0][0] == ["/usr/bin/claude", "--dangerously-skip-permissions"]
|
||||||
|
|
||||||
def test_missing_claude_binary_error(self) -> None:
|
def test_missing_claude_binary_error(self) -> None:
|
||||||
"""Should exit with error when claude binary not found."""
|
"""Should exit with error when claude binary not found."""
|
||||||
@@ -86,20 +86,6 @@ class TestCliDefaultBehavior:
|
|||||||
call_kwargs = mock_run.call_args.kwargs
|
call_kwargs = mock_run.call_args.kwargs
|
||||||
assert call_kwargs.get("cwd") == str(test_dir.resolve())
|
assert call_kwargs.get("cwd") == str(test_dir.resolve())
|
||||||
|
|
||||||
def test_dangerously_skip_permissions_flag(self) -> None:
|
|
||||||
"""--dangerously-skip-permissions should be forwarded."""
|
|
||||||
runner = CliRunner()
|
|
||||||
|
|
||||||
with (
|
|
||||||
patch("bin.cli.shutil.which", return_value="/usr/bin/claude"),
|
|
||||||
patch("bin.cli.subprocess.run") as mock_run,
|
|
||||||
):
|
|
||||||
mock_run.return_value = MagicMock(returncode=0)
|
|
||||||
result = runner.invoke(cli, ["--dangerously-skip-permissions"])
|
|
||||||
assert result.exit_code == 0
|
|
||||||
call_args = mock_run.call_args[0][0]
|
|
||||||
assert "--dangerously-skip-permissions" in call_args
|
|
||||||
|
|
||||||
def test_cwd_invalid_directory(self, tmp_path: Path) -> None:
|
def test_cwd_invalid_directory(self, tmp_path: Path) -> None:
|
||||||
"""--cwd pointing to non-existent directory should error."""
|
"""--cwd pointing to non-existent directory should error."""
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
|
|||||||
Reference in New Issue
Block a user