Skip to content

Commit 067b8e6

Browse files
committed
v1.2.6
1 parent 4078f25 commit 067b8e6

11 files changed

Lines changed: 288 additions & 9 deletions

.github/SECURITY.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ These are required for Chromium to function and are standard across Playwright,
2020

2121
| Mode | Default? | What it means |
2222
|------|----------|--------------|
23-
| `allowEdits` | **Yes** | Claude can edit files freely, asks before running shell commands |
24-
| `bypassPermissions` | No | Claude runs any command without confirmation |
23+
| `acceptEdits` | **Yes** | Claude Code can edit files freely, with shell commands still following Claude Code's current prompt behavior |
24+
| `bypassPermissions` | No | The agent runs commands without confirmation |
2525

26-
The default `allowEdits` mode is safe for most users. `bypassPermissions` is documented for power users who understand the implications.
26+
The default `acceptEdits` mode is right for most users. `bypassPermissions` is documented for power users who understand the implications.
27+
28+
Codex support uses configurable near-parity modes, not identical security. `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE` controls CloudCLI Codex chat at runtime, while `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE` only seeds a new raw `codex` CLI `~/.codex/config.toml` on first boot. Valid values are `default`, `acceptEdits`, and `bypassPermissions`; `acceptEdits` is recommended.
29+
30+
Do not expose CloudCLI directly to the public internet, especially with any bypass mode enabled. Docker limits access to the container and mounted volumes, but CloudCLI still exposes an interactive coding environment with credentials and mounted workspace files.
2731

2832
## Credential Storage
2933

Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ COPY vendor/artifacts/siteboon-claude-code-ui-1.26.3.tgz /tmp/vendor/siteboon-cl
172172
# ---------- CloudCLI (web UI for Claude Code) ----------
173173
RUN npm i -g /tmp/vendor/siteboon-claude-code-ui-1.26.3.tgz && rm -f /tmp/vendor/siteboon-claude-code-ui-1.26.3.tgz
174174
COPY scripts/patch-cloudcli-apprise-notifications.mjs /tmp/patch-cloudcli-apprise-notifications.mjs
175+
COPY scripts/patch-cloudcli-codex-permissions.mjs /tmp/patch-cloudcli-codex-permissions.mjs
175176
RUN touch /usr/local/lib/node_modules/@siteboon/claude-code-ui/.env
176177

177178
# ---------- Patch: preserve WebSocket frame type in plugin proxy (Issue #11) ----------
@@ -229,6 +230,9 @@ RUN CLOUDCLI_BUNDLE="/usr/local/lib/node_modules/@siteboon/claude-code-ui/dist/a
229230
# patch: bridge Codex CloudCLI lifecycle events to Apprise (issue #17)
230231
RUN node /tmp/patch-cloudcli-apprise-notifications.mjs && rm -f /tmp/patch-cloudcli-apprise-notifications.mjs
231232

233+
# patch: configure Codex CloudCLI chat permission mode (issue #18)
234+
RUN node /tmp/patch-cloudcli-codex-permissions.mjs && rm -f /tmp/patch-cloudcli-codex-permissions.mjs
235+
232236
# ---------- CloudCLI plugins (baked into image) ----------
233237
USER claude
234238
RUN mkdir -p /home/claude/.claude-code-ui/plugins && \

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,15 @@ services:
408408
# - GEMINI_API_KEY=your_key
409409
# - OPENAI_API_KEY=your_key
410410
# - CURSOR_API_KEY=your_key
411+
#
412+
# CODEX PERMISSION MODES (optional)
413+
# CloudCLI Codex chat reads HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE at runtime.
414+
# Raw codex CLI reads HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE only when first creating ~/.codex/config.toml.
415+
# Valid values: default, acceptEdits, bypassPermissions. Recommended: acceptEdits.
416+
# bypassPermissions gives full access with no approval. Use it only for trusted local workspaces.
417+
#
418+
# - HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE=acceptEdits
419+
# - HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE=acceptEdits
411420
```
412421

413422
Then:
@@ -474,6 +483,8 @@ The complete reference. Every variable, what it defaults to, what it does.
474483
| `GEMINI_API_KEY` | *(unset)* | Google Gemini API key |
475484
| `OPENAI_API_KEY` | *(unset)* | OpenAI API key (for Codex CLI, or use `codex login --device-auth` for ChatGPT subscription) |
476485
| `CURSOR_API_KEY` | *(unset)* | Cursor API key |
486+
| `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE` | `acceptEdits` | CloudCLI Codex chat runtime mode. Valid: `default`, `acceptEdits`, `bypassPermissions` |
487+
| `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE` | `default` | Raw `codex` CLI first-boot mode for new `~/.codex/config.toml` only. Valid: `default`, `acceptEdits`, `bypassPermissions` |
477488

478489
<p align="right">
479490
<a href="#top">↑ back to top</a>
@@ -821,6 +832,19 @@ This is how I personally run it. Edit `./data/claude/settings.json` on your host
821832

822833
> **Bypass mode means Claude executes commands without confirmation.** It is powerful, but it can also run destructive commands quickly. Keep the shipped `acceptEdits` default unless you trust the workspace and every prompt you run.
823834

835+
### Codex Permission Modes
836+
837+
HolyClaude also ships configurable near-parity permission modes for Codex, with separate controls for CloudCLI Codex chat and the raw `codex` CLI.
838+
839+
| Setting | Applies to | Default | When it is read |
840+
|---------|------------|---------|-----------------|
841+
| `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE` | CloudCLI Codex chat in the browser | `acceptEdits` | Runtime container config, read by the CloudCLI Codex provider |
842+
| `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE` | Raw `codex` CLI config at `~/.codex/config.toml` | `default` | First boot only, when the file does not already exist |
843+
844+
Valid values for both are `default`, `acceptEdits`, and `bypassPermissions`. `acceptEdits` is recommended. For CloudCLI Codex chat, the value is runtime container configuration, so changing it and recreating the container changes future chat runs. For the raw `codex` CLI, the value only seeds a new `~/.codex/config.toml`; existing configs are not overwritten, and the generated value persists until you edit that file yourself.
845+
846+
`bypassPermissions` maps Codex to full access with no approval. Inside Docker, that still runs within the container and mounted volumes, but it can read and change anything reachable through those mounts, especially `/workspace` and persisted config under `/home/claude`. Use it only for trusted local workspaces, and don't expose CloudCLI directly to the public internet.
847+
824848
<p align="right">
825849
<a href="#top">↑ back to top</a>
826850
</p>

THIRD-PARTY-NOTICES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ build.
3030
`server/routes/commands.js` into the bundled browser code, update the
3131
selected Claude model on model events, and keep a custom model option visible
3232
in the selector.
33+
- Codex permission-mode compatibility backport: adds HolyClaude's
34+
`HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE` runtime mapping for CloudCLI Codex
35+
chat, including `default`, `acceptEdits`, and `bypassPermissions` modes.
3336

3437
The unmodified upstream source is available from the links above, and the
3538
HolyClaude modifications are visible in the public Dockerfile.

config/claude-memory-full.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ The `--break-system-packages` flag is required (no venv in container context).
7373
|-----|---------|-------|
7474
| **Claude Code** | `claude` | Primary — you are running inside this |
7575
| **Gemini CLI** | `gemini` | Requires `GEMINI_API_KEY` env var. Config persists across rebuilds. Notifications via Apprise. |
76-
| **OpenAI Codex** | `codex` | `OPENAI_API_KEY` or ChatGPT subscription (`codex login --device-auth`). Pre-configured with on-request approval. Auth persists across rebuilds. Notifications via Apprise. |
76+
| **OpenAI Codex** | `codex` | `OPENAI_API_KEY` or ChatGPT subscription (`codex login --device-auth`). Raw CLI config is seeded on first boot. Auth persists across rebuilds. Notifications via Apprise. |
7777
| **Cursor** | `cursor` | Requires `CURSOR_API_KEY` env var. Config persists across rebuilds. |
7878
| **TaskMaster AI** | `task-master` | Task planning and management |
7979
| **Junie** | `junie` | JetBrains AI coding agent (requires JetBrains account) |
@@ -149,6 +149,11 @@ Claude Code runs in `acceptEdits` mode by default:
149149
- Shell commands: follow Claude Code's current permission prompt behavior
150150
- To enable full bypass: change `acceptEdits` to `bypassPermissions` in `~/.claude/settings.json`
151151

152+
Codex has separate configurable near-parity controls:
153+
- CloudCLI Codex chat: `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE`, read at runtime by CloudCLI. Valid values: `default`, `acceptEdits`, `bypassPermissions`. Recommended: `acceptEdits`.
154+
- Raw `codex` CLI: `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE`, used only when creating a new `~/.codex/config.toml` on first boot. Existing configs are not overwritten, and the generated value persists until you edit it.
155+
- `bypassPermissions` gives full access with no approval inside the Docker container and mounted volumes. Use it only for trusted local workspaces.
156+
152157
## Container Lifecycle
153158

154159
- **First boot:** Bootstrap runs once — copies settings, memory, configures git

config/claude-memory-slim.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ These take longer to install (~1-2 minutes) because they require system dependen
112112
|-----|---------|-------|
113113
| **Claude Code** | `claude` | Primary — you are running inside this |
114114
| **Gemini CLI** | `gemini` | Requires `GEMINI_API_KEY` env var |
115-
| **OpenAI Codex** | `codex` | Requires `OPENAI_API_KEY` env var |
115+
| **OpenAI Codex** | `codex` | `OPENAI_API_KEY` or ChatGPT subscription (`codex login --device-auth`). Raw CLI config is seeded on first boot. |
116116
| **Cursor** | `cursor` | Requires `CURSOR_API_KEY` env var |
117117
| **TaskMaster AI** | `task-master` | Task planning and management |
118118

@@ -181,6 +181,11 @@ Claude Code runs in `acceptEdits` mode by default:
181181
- Shell commands: follow Claude Code's current permission prompt behavior
182182
- To enable full bypass: change `acceptEdits` to `bypassPermissions` in `~/.claude/settings.json`
183183

184+
Codex has separate configurable near-parity controls:
185+
- CloudCLI Codex chat: `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE`, read at runtime by CloudCLI. Valid values: `default`, `acceptEdits`, `bypassPermissions`. Recommended: `acceptEdits`.
186+
- Raw `codex` CLI: `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE`, used only when creating a new `~/.codex/config.toml` on first boot. Existing configs are not overwritten, and the generated value persists until you edit it.
187+
- `bypassPermissions` gives full access with no approval inside the Docker container and mounted volumes. Use it only for trusted local workspaces.
188+
184189
## Container Lifecycle
185190

186191
- **First boot:** Bootstrap runs once — copies settings, memory, configures git

docker-compose.full.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,12 @@ services:
6666
# - GEMINI_API_KEY=
6767
# - OPENAI_API_KEY=
6868
# - CURSOR_API_KEY=
69+
70+
# --- Codex permission modes (optional) ---
71+
# CloudCLI Codex chat runtime mode. Valid: default, acceptEdits, bypassPermissions.
72+
# Recommended: acceptEdits. bypassPermissions gives full access with no approval;
73+
# use it only for trusted local workspaces inside your Docker volume boundary.
74+
# - HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE=acceptEdits
75+
# Raw codex CLI first-boot mode. Only used when creating a new ~/.codex/config.toml.
76+
# Existing Codex configs are not overwritten.
77+
# - HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE=acceptEdits

docs/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ All notable changes to HolyClaude will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
66

7+
## [1.2.6] - 05/28/2026
8+
9+
### Added
10+
- Added configurable near-parity Codex permission modes for CloudCLI Codex chat with `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE`.
11+
- Added first-boot raw `codex` CLI permission-mode seeding through `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE`.
12+
13+
### Changed
14+
- Documented Codex permission behavior, safety caveats, compose examples, and CloudCLI modification notices.
15+
716
## [1.2.5] - 05/27/2026
817

918
### Fixed

docs/configuration.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,17 @@ Claude Code can authenticate via web UI (OAuth) or `ANTHROPIC_API_KEY`. Other AI
9494
| `OPENAI_API_KEY` | (unset) | OpenAI API key |
9595
| `CURSOR_API_KEY` | (unset) | Cursor API key |
9696

97+
### Codex Permission Modes
98+
99+
HolyClaude provides configurable near-parity permission modes for Codex. These settings are intentionally split because CloudCLI Codex chat and the raw `codex` CLI read configuration through different paths.
100+
101+
| Variable | Default | Valid values | Applies to | Behavior |
102+
|----------|---------|--------------|------------|----------|
103+
| `HOLYCLAUDE_CODEX_CHAT_PERMISSION_MODE` | `acceptEdits` | `default`, `acceptEdits`, `bypassPermissions` | CloudCLI Codex chat | Runtime container config read by the CloudCLI Codex provider. Recreate the container after changing it. |
104+
| `HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE` | `default` | `default`, `acceptEdits`, `bypassPermissions` | Raw `codex` CLI | First-boot-only seed for new `~/.codex/config.toml`. Existing configs are not overwritten, and the generated value persists until you edit the file. |
105+
106+
`acceptEdits` is the recommended value for both settings. `bypassPermissions` gives Codex full access with no approval. Docker still limits access to the container and mounted volumes, but anything reachable through `/workspace`, `/home/claude`, and other mounts can be read or changed. Use bypass only for trusted local workspaces.
107+
97108
---
98109

99110
## Volumes
@@ -110,6 +121,7 @@ Claude Code can authenticate via web UI (OAuth) or `ANTHROPIC_API_KEY`. Other AI
110121
| `settings.json` | Claude Code settings (permissions, hooks, model) |
111122
| `CLAUDE.md` | Claude's global memory — customize with your preferences |
112123
| `.credentials.json` | Anthropic API authentication (auto-created) |
124+
| `.codex/config.toml` | Raw Codex CLI config, created on first boot if missing |
113125
| `.holyclaude-bootstrapped` | Sentinel file — delete to re-run first-boot setup |
114126

115127
---

scripts/bootstrap.sh

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,35 @@ echo "[bootstrap] Configured git as '$GIT_USER_NAME <$GIT_USER_EMAIL>'"
4242

4343
# ---------- Codex CLI default configuration ----------
4444
if [ ! -f "$CLAUDE_HOME/.codex/config.toml" ]; then
45-
cat > "$CLAUDE_HOME/.codex/config.toml" <<'TOML'
46-
approval_policy = "on-request"
47-
sandbox_mode = "workspace-write"
45+
CODEX_CLI_APPROVAL_POLICY="on-request"
46+
CODEX_CLI_SANDBOX_MODE="workspace-write"
47+
CODEX_CLI_CONFIG_LABEL="on-request approval, workspace-write sandbox"
48+
49+
case "${HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE:-default}" in
50+
""|default)
51+
;;
52+
acceptEdits)
53+
CODEX_CLI_APPROVAL_POLICY="never"
54+
CODEX_CLI_CONFIG_LABEL="never approval, workspace-write sandbox"
55+
;;
56+
bypassPermissions)
57+
CODEX_CLI_APPROVAL_POLICY="never"
58+
CODEX_CLI_SANDBOX_MODE="danger-full-access"
59+
CODEX_CLI_CONFIG_LABEL="never approval, danger-full-access sandbox"
60+
;;
61+
*)
62+
echo "[bootstrap] Warning: invalid HOLYCLAUDE_CODEX_CLI_PERMISSION_MODE; using default Codex CLI config"
63+
;;
64+
esac
65+
66+
cat > "$CLAUDE_HOME/.codex/config.toml" <<TOML
67+
approval_policy = "$CODEX_CLI_APPROVAL_POLICY"
68+
sandbox_mode = "$CODEX_CLI_SANDBOX_MODE"
4869
4970
[features]
5071
codex_hooks = true
5172
TOML
52-
echo "[bootstrap] Created Codex CLI config (on-request approval, workspace-write sandbox, hooks enabled)"
73+
echo "[bootstrap] Created Codex CLI config ($CODEX_CLI_CONFIG_LABEL, hooks enabled)"
5374
elif ! grep -q '^\[features\]' "$CLAUDE_HOME/.codex/config.toml"; then
5475
printf '\n[features]\ncodex_hooks = true\n' >> "$CLAUDE_HOME/.codex/config.toml"
5576
echo "[bootstrap] Added [features] section to existing Codex config"

0 commit comments

Comments
 (0)