Compare commits

..
Author SHA1 Message Date
jknappandClaude Opus 5.5 0d117e97fe Add Auto permission mode (#63)
Build App / compute-version (push) Successful in 3s
Build Container / build-container (push) Successful in 1m58s
Secret Scan / scan (push) Successful in 4s
Build App / build-macos (push) Successful in 3m4s
Build App / build-windows (push) Successful in 5m48s
Build App / build-linux (push) Successful in 5m10s
Build App / create-tag (push) Successful in 4s
Build App / sync-to-github (push) Successful in 2m27s
Adds Claude Code's auto permission mode as a fifth option between Accept Edits and Bypass, across terminals, resumed sessions, the tab badge, the scheduler task runner and docs. Warns that Auto falls back to prompting when unavailable for the model/backend.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 17:02:06 +00:00
4 changed files with 18 additions and 10 deletions
+7 -3
View File
@@ -484,7 +484,9 @@ the way they did: one that had Full Permissions on becomes **Bypass**, one that
**Auto** sits between Accept Edits and Bypass: Claude Code's own classifier reviews each action,
lets routine work through and blocks things that look risky (such as destructive or
exfiltrating commands) — no prompts either way. Whether it is available depends on your Claude
Code account and model; see Claude Code's documentation on permission modes.
Code account, model and backend (local and OpenAI-compatible backends usually won't
qualify). When it isn't available, Claude Code quietly starts in its normal prompting mode
instead.
### When a change takes effect
@@ -502,7 +504,8 @@ Code account and model; see Claude Code's documentation on permission modes.
> Scheduled tasks run headless (`claude -p`) and cannot answer a permission prompt. In any mode
> other than **Auto** or **Bypass**, a task may simply stop early when Claude Code asks for
> approval. In **Auto**, actions the classifier blocks are denied and the run carries on without
> them. Its run log records which mode it used.
> them — but if Auto isn't available for the project's model or backend, Claude Code falls back
> to prompting and the task can stall the same way. Its run log records which mode it used.
---
@@ -1357,7 +1360,8 @@ with `--dangerously-skip-permissions`. Because the mode travels into the contain
environment variable, **stop and start the project** after changing it for the scheduler to see the
change. Remember that a headless run cannot answer a permission prompt, so in any mode other than
**Auto** or **Bypass** a task may stop early when Claude Code asks for approval (in Auto, blocked
actions are denied instead); the run log records the mode
actions are denied instead, unless Auto is unavailable and Claude Code falls back to
prompting); the run log records the mode
that was used.
### Creating Tasks
@@ -165,10 +165,11 @@ describe("TaskEditorModal", () => {
expect(screen.queryByText(/cannot answer a permission prompt/i)).toBeNull();
});
it("tells Auto mode that blocked actions are denied, not prompted", async () => {
it("tells Auto mode that blocked actions are denied, and warns of the fallback", async () => {
await renderEditor(null, { ...baseProject, permission_mode: "auto" });
expect(screen.queryByText(/cannot answer a permission prompt/i)).toBeNull();
expect(screen.getByText(/blocks are denied/i)).toBeInTheDocument();
expect(screen.getByText(/falls back to prompting/i)).toBeInTheDocument();
});
it("spells out the stall risk in any non-Bypass mode", async () => {
@@ -302,9 +302,10 @@ export default function TaskEditorModal({ project, task, onClose, onSaved }: Pro
<strong className="text-[var(--text-primary)]">{modeLabel}</strong>).
</p>
{mode === "auto" && (
<p className="text-xs text-[var(--text-secondary)]">
In Auto mode nothing prompts: actions the safety classifier blocks are denied and the
run carries on without them, so check the log if a task seems to have skipped a step.
<p className="text-xs text-[var(--warning)]">
In Auto mode, actions the safety classifier blocks are denied and the run carries on
without them. If Auto isn&rsquo;t available for this project&rsquo;s model or backend,
Claude Code falls back to prompting and the task may stall.
</p>
)}
{mode !== "bypass" && mode !== "auto" && (
+5 -3
View File
@@ -61,9 +61,11 @@ TASK_TYPE=$(jq -r '.type' "$TASK_FILE")
# project's permission setting. Keep this mapping in sync with
# PermissionMode::cli_args() in app/src-tauri/src/models/project.rs.
# NOTE: headless `claude -p` runs cannot answer a permission prompt, so any
# mode other than "bypass" or "auto" means the task may stop early when Claude
# Code asks for permission. In "auto", actions the classifier blocks are
# denied rather than prompted, so the run continues without them. Unset or unrecognized values pass no flag (Claude's default).
# mode other than "bypass" means the task may stop early when Claude Code asks
# for permission. In "auto", classifier-blocked actions are denied instead of
# prompted, but if auto mode is unavailable for the session's model/backend,
# Claude Code falls back to prompting and the same stall applies.
# Unset or unrecognized values pass no flag (Claude's default).
PERMISSION_ARGS=()
case "${TRIPLE_C_PERMISSION_MODE:-}" in
plan) PERMISSION_ARGS=(--permission-mode plan) ;;