|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to **claudebox** (formerly `docker-claude-code`). |
| 4 | + |
| 5 | +Format roughly follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions before `v1.0.0` are pre-release; the rename to `claudebox` at `v1.0.0` is the only breaking change in the project's history. |
| 6 | + |
| 7 | +## [v1.11.0] — 2026-04-30 |
| 8 | + |
| 9 | +### Added |
| 10 | +- **Telegram per-chat overrides** stored in `~/.claude/telegram_overrides.json`, persisting across bot restarts and trumping the YAML config: |
| 11 | + - `/model` — inline keyboard or `/model <name>`; choices: `haiku`, `sonnet`, `opus`, `opusplan`, `reset`. |
| 12 | + - `/effort` — same UX; choices: `low`, `medium`, `high`, `xhigh`, `max`, `reset` (verified against the official Claude CLI docs). |
| 13 | + - `/system_prompt [text|reset]` — show/set/clear system-prompt override per chat. |
| 14 | + - `/append_system_prompt [text|reset]` — same for the appended system prompt. |
| 15 | +- `opusplan` model alias surfaced everywhere: telegram bot, OpenAI `/openai/v1/models`, MCP tool docstring, docs. |
| 16 | +- `tests/test_cron_telegram.sh` — unit + integration tests for the cron/telegram bridge: round-trip message tracking, prune to 200 entries, no-`--continue` on cron replies, `CRON_SYSTEM_HINT` content, combined-entrypoint smoke test. |
| 17 | +- `run-e2e-cron-telegram.sh` — end-to-end script (sources `tests/.env` for credentials) for the cron+telegram reply-context flow. |
| 18 | + |
| 19 | +### Changed |
| 20 | +- `get_chat_config()` merges in-memory + on-disk overrides on top of YAML defaults. |
| 21 | +- `_apply_choice` / `_send_choice_keyboard` / `_BUTTON_HANDLERS` shared plumbing for keyboard-driven overrides. |
| 22 | + |
| 23 | +### Security |
| 24 | +- `run-e2e-cron-telegram.sh` now sources `tests/.env` instead of carrying hardcoded OAuth/bot tokens. (A previously-committed token in `v1.10.0`'s `run-test.sh` was auto-revoked by Anthropic's secret scanning; new token issued and stored only in gitignored `tests/.env`.) |
| 25 | + |
| 26 | +## [v1.10.0] — 2026-04-29 |
| 27 | + |
| 28 | +### Added |
| 29 | +- **Combined cron + telegram mode**: when both `CLAUDEBOX_MODE_CRON=1` and `CLAUDEBOX_MODE_TELEGRAM=1` are set, the entrypoint runs the cron scheduler in the background and the telegram bot in the foreground (trap kills cron when the bot exits). |
| 30 | +- Cron yaml supports `telegram_chat_id` (root-level default + per-job override) — finished jobs post their result to Telegram. |
| 31 | +- **Cron-reply context injection**: when a user replies to a cron notification in Telegram, the bot looks up the original job (name, fired_at, instruction, result) in `~/.claude/cron/telegram_messages.json` and prepends it to the prompt. Cron replies always run in a fresh session (no `--continue`); regular messages keep `--continue`. |
| 32 | +- Chat-wide cron awareness: the most recent 10 cron runs are injected into every prompt's `--append-system-prompt` so Claude can answer questions about them without an explicit reply. |
| 33 | +- `telegram_utils.py` shared module (`BOT_TOKEN`, `make_bot()`, `send_long()`); `send_long()` now returns the list of sent `Message` objects so the caller can capture `message_id`. |
| 34 | +- `wrapper.sh` gained a named `_cron` container with start/stop/restart parity to `_prog`, plus an auth file. |
| 35 | + |
| 36 | +## [v1.9.0] — 2026-04-29 |
| 37 | + |
| 38 | +### Added |
| 39 | +- Cron jobs support `system_prompt` / `append_system_prompt` (root-level + per-job override). |
| 40 | +- Template variables expanded at fire time: `{system_datetime}`, `{job_name}`. |
| 41 | + |
| 42 | +## [v1.8.0] — 2026-04-29 |
| 43 | + |
| 44 | +### Added |
| 45 | +- `claudebox mcp ...` wrapper passthrough (`list`, `add`, `remove`, …) so MCP server management works the same as bare `claude mcp`. |
| 46 | +- Documentation covering MCP server scopes (project `.mcp.json`, user, local) with CLI examples. |
| 47 | + |
| 48 | +## [v1.7.0] — 2026-04-29 |
| 49 | + |
| 50 | +### Added |
| 51 | +- **Cron mode** (`CLAUDEBOX_MODE_CRON=1`): yaml-scheduled Claude jobs with sub-minute resolution, per-job history under `~/.claude/cron/history/<workspace-slug>/<ts>-<job>/`, overlap protection, and foreground logging. |
| 52 | + |
| 53 | +### Changed |
| 54 | +- Environment variable namespace renamed `CLAUDE_*` → `CLAUDEBOX_*`. Legacy `CLAUDE_*` names are still accepted as fallbacks for backwards compatibility. |
| 55 | + |
| 56 | +## [v1.6.0] — 2026-04-29 |
| 57 | + |
| 58 | +### Added |
| 59 | +- Proper standalone installer (`install.sh`) that drops in a working setup with one command. |
| 60 | + |
| 61 | +## [v1.5.0] — 2026-04-29 |
| 62 | + |
| 63 | +### Fixed |
| 64 | +- Misc release-blocking bugs. |
| 65 | + |
| 66 | +## [v1.4.1] — 2026-04-29 |
| 67 | + |
| 68 | +### Fixed |
| 69 | +- Installer script regressions; bumped pinned Claude CLI version. |
| 70 | + |
| 71 | +## [v1.4.0] — 2026-04-16 |
| 72 | + |
| 73 | +### Changed |
| 74 | +- Base image upgraded to **Ubuntu 24.04** (CVE reduction). |
| 75 | +- Adopted DEB822 apt sources; dropped `apt-transport-https` (no longer needed). |
| 76 | +- `pip3 --break-system-packages --ignore-installed` to work around PEP 668 + PyJWT conflict. |
| 77 | +- `userdel ubuntu` before `useradd claude` to free UID 1000. |
| 78 | +- `exa` → `eza` (exa is unmaintained); `mysql-client` → `default-mysql-client`. |
| 79 | +- Dropped `python3-venv`. |
| 80 | + |
| 81 | +## [v1.3.0] — 2026-04-16 |
| 82 | + |
| 83 | +### Added |
| 84 | +- **Async run mode** in API: `POST /run` with `async: true`, `GET /run/result` for polling. Run IDs included on every response. Read-once result cache with 6-hour TTL. Cancel by `runId`. `/status` now lists active runs. |
| 85 | + |
| 86 | +### Changed |
| 87 | +- All API responses include `workspace`. |
| 88 | +- Switched build apt mirror to Cloudflare for faster Docker builds. |
| 89 | +- README updated with full response schemas. |
| 90 | + |
| 91 | +### Fixed |
| 92 | +- `asyncio.Lock` around run state to eliminate races. |
| 93 | + |
| 94 | +## [v1.2.0] — 2026-04-11 |
| 95 | + |
| 96 | +### Security |
| 97 | +- Telegram **path traversal** fix on file operations. |
| 98 | +- Auth file mode hardened to `chmod 600`. |
| 99 | +- Entrypoint **command-injection** fix via `printf %q` quoting. |
| 100 | +- `jq` failure protection. |
| 101 | +- Port number validation. |
| 102 | +- Install script fail-safe. |
| 103 | + |
| 104 | +### Changed |
| 105 | +- `/status` response normalized to camelCase. |
| 106 | +- Test isolation via `mktemp`. |
| 107 | + |
| 108 | +## [v1.1.0] — 2026-04-11 |
| 109 | + |
| 110 | +### Added |
| 111 | +- `make test` target. |
| 112 | +- `.dockerignore` (faster, smaller build context). |
| 113 | +- Test for entrypoint always-skills wiring. |
| 114 | + |
| 115 | +### Changed |
| 116 | +- Tests refactored to a table-driven layout with workspace-relative test dirs. |
| 117 | +- README revamp. |
| 118 | + |
| 119 | +## [v1.0.0] — 2026-04-11 |
| 120 | + |
| 121 | +### BREAKING |
| 122 | +Project renamed from `docker-claude-code` → **`claudebox`**: |
| 123 | +- Docker image: `psyb0t/docker-claude-code` → `psyb0t/claudebox`. |
| 124 | +- Binary: `claude-code` → `claudebox`. |
| 125 | +- SSH dir: `~/.ssh/claude-code` → `~/.ssh/claudebox`. |
| 126 | +- GitHub repo: `psyb0t/docker-claudebox`. |
| 127 | + |
| 128 | +## [v0.39.0] — 2026-04-11 |
| 129 | + |
| 130 | +### Added |
| 131 | +- **Always-skills**: scan `~/.claude/.always-skills` for `SKILL.md` files and inject them (with file-path prefix) into every Claude invocation across interactive, programmatic, API, and OpenAI modes. |
| 132 | + |
| 133 | +## [v0.38.0] — 2026-04-10 |
| 134 | + |
| 135 | +### Added |
| 136 | +- Structured JSON logging (`ts`, `level`, `logger`, `func`, `line`, `file`, `msg`) across auth, `/run`, OpenAI, MCP, and image handling. `DEBUG=1` enables debug level. |
| 137 | + |
| 138 | +## [v0.37.0] — 2026-04-10 |
| 139 | + |
| 140 | +### Added |
| 141 | +- **OpenAI multimodal**: base64 + URL images saved to the workspace and forwarded to Claude. |
| 142 | +- Real usage-token reporting on OpenAI responses. |
| 143 | +- Multi-turn via conversation JSON file. |
| 144 | +- `X-Claude-Append-System-Prompt` request header. |
| 145 | + |
| 146 | +### Changed |
| 147 | +- Extra/unknown OpenAI fields silently ignored. |
| 148 | + |
| 149 | +## [v0.36.0] — 2026-04-10 |
| 150 | + |
| 151 | +### Changed |
| 152 | +- All 24 tests in `ALL_TESTS`; every assertion now checks the response body, not just status codes. |
| 153 | + |
| 154 | +## [v0.35.0] — 2026-04-10 |
| 155 | + |
| 156 | +### Fixed |
| 157 | +- `streamable_http_app` for MCP. |
| 158 | +- MCP lifespan registered via FastAPI. |
| 159 | +- `stream-json` assistant-event parsing. |
| 160 | +- `--continue` flag logic. |
| 161 | +- MCP tests with proper session init. |
| 162 | + |
| 163 | +## [v0.34.0] — 2026-04-10 |
| 164 | + |
| 165 | +### Changed |
| 166 | +- OpenAI `/v1/models` returns bare aliases (`haiku`, `sonnet`, `opus`). |
| 167 | +- Provider prefix (`openai/`, `claudebox/`) stripped from inbound model names. |
| 168 | +- Tests use `$TEST_MODEL` instead of hardcoded values. |
| 169 | + |
| 170 | +## [v0.33.0] — 2026-04-10 |
| 171 | + |
| 172 | +### Added |
| 173 | +- **OpenAI-compatible adapter** at `/openai/v1` (streaming, custom headers, `reasoning_effort`). |
| 174 | +- **MCP server** at `/mcp` exposing `claude_run`, file operations, and auth tools. |
| 175 | +- Shared `_run_claude_text` helper. |
| 176 | + |
| 177 | +## [v0.32.0] — 2026-04-07 |
| 178 | + |
| 179 | +### Changed |
| 180 | +- camelCase response normalization across the board: `jsonpipe.py` normalizes `json` / `stream-json` / `json-verbose`, wrapper pipes all formats. Tests assert recursively against snake_case. |
| 181 | + |
| 182 | +## [v0.31.0] — 2026-04-07 |
| 183 | + |
| 184 | +### Fixed |
| 185 | +- `asyncio.StreamReader` 64KB-line crash in API. |
| 186 | +- Truncate `json-verbose` tool results > 2K with sha256 hash. |
| 187 | + |
| 188 | +## [v0.30.0 – v0.29.0] — 2026-04-07 |
| 189 | + |
| 190 | +### Added |
| 191 | +- `outputFormat: json-verbose` — assembles `stream-json` into a single JSON document with a `turns` array showing all tool calls. |
| 192 | + |
| 193 | +## [v0.28.0] — 2026-04-03 |
| 194 | + |
| 195 | +### Added |
| 196 | +- `clear-session` wrapper command. |
| 197 | + |
| 198 | +### Fixed |
| 199 | +- `--no-continue` without prompt. |
| 200 | + |
| 201 | +### Changed |
| 202 | +- README env-var section restructured. |
| 203 | + |
| 204 | +## [v0.27.0] — 2026-04-03 |
| 205 | + |
| 206 | +### Changed |
| 207 | +- camelCase normalization rolled out further. |
| 208 | + |
| 209 | +## [v0.26.0] — 2026-04-03 |
| 210 | + |
| 211 | +### Removed |
| 212 | +- Claude Code Router (CCR) integration. |
| 213 | + |
| 214 | +### Changed |
| 215 | +- Bumped Claude CLI to 2.1.90. |
| 216 | + |
| 217 | +## [v0.25.0] — 2026-04-03 |
| 218 | + |
| 219 | +### Changed |
| 220 | +- API moved to camelCase. |
| 221 | +- Auto-updates now opt-in. |
| 222 | +- Bumped CLI to 2.1.89. |
| 223 | + |
| 224 | +## [v0.24.0] — 2026-04-01 |
| 225 | + |
| 226 | +### Added |
| 227 | +- `claudebox stop` wrapper command. |
| 228 | + |
| 229 | +## [v0.23.1 – v0.23.0] — 2026-03-31 |
| 230 | + |
| 231 | +### Added |
| 232 | +- Wrapper passthrough for utility commands: `--version`, `doctor`, `auth`. |
| 233 | + |
| 234 | +### Changed |
| 235 | +- Go bumped 1.25.5 → 1.26.1. |
| 236 | + |
| 237 | +## [v0.22.0] — 2026-03-31 |
| 238 | + |
| 239 | +### Added |
| 240 | +- System hint appended to all modes — informs Claude about container info, image variant, sudo access, bin path, and host-path mapping. |
| 241 | + |
| 242 | +## [v0.21.x] — 2026-03-30/31 |
| 243 | + |
| 244 | +### Added |
| 245 | +- `CLAUDE.md` template seeded into all workspaces (telegram, API, interactive). |
| 246 | +- Makefile build targets. |
| 247 | + |
| 248 | +### Fixed |
| 249 | +- Telegram cancel-retry bug; better logging. |
| 250 | +- API kills the Claude process on client disconnect (opt out via `fire_and_forget`). |
| 251 | + |
| 252 | +## [v0.20.x] — 2026-03-30 |
| 253 | + |
| 254 | +### Added |
| 255 | +- **Telegram bot mode** (`CLAUDE_MODE_TELEGRAM=1`): per-chat workspaces, file/photo/video/voice handling, command menu, HTML formatting with plain-text fallback. |
| 256 | + |
| 257 | +### Fixed |
| 258 | +- Empty-file crash; httpx polling-spam silenced; proper logging. |
| 259 | +- Filters, media handlers, command menu wiring. |
| 260 | + |
| 261 | +## [v0.19.0] — 2026-03-30 |
| 262 | + |
| 263 | +### Added |
| 264 | +- `--no-continue` and `--resume` wrapper flags. |
| 265 | + |
| 266 | +### Changed |
| 267 | +- Bumped Claude CLI to 2.1.87. |
| 268 | + |
| 269 | +## [v0.18.x] — 2026-03-28 |
| 270 | + |
| 271 | +### Changed |
| 272 | +- Hardcoded `/workspaces` as the API root; removed `CLAUDE_MODE_API_ROOT_WORKSPACE` env var. |
| 273 | + |
| 274 | +### Fixed |
| 275 | +- Workspace permissions. |
| 276 | + |
| 277 | +## [v0.17.0] — 2026-03-28 |
| 278 | + |
| 279 | +### Added |
| 280 | +- `--effort` (reasoning effort) flag in wrapper and API. |
| 281 | + |
| 282 | +### Removed |
| 283 | +- `claude-code-router` support. |
| 284 | + |
| 285 | +## [v0.16.x] — 2026-03-28 |
| 286 | + |
| 287 | +### Added |
| 288 | +- API expansion: `/files` with path params (`GET`/`PUT`/`DELETE`), `/health`, `/status`, `/run/cancel`. |
| 289 | +- `--system-prompt`, `--append-system-prompt`, `--json-schema` flags in wrapper + API. |
| 290 | +- Graceful API shutdown. |
| 291 | +- `--continue` automatic fallback when no prior session. |
| 292 | + |
| 293 | +### Changed |
| 294 | +- API output is now JSON-only. |
| 295 | + |
| 296 | +## [v0.15.0] — 2026-03-28 |
| 297 | + |
| 298 | +### Added |
| 299 | +- **API mode** (`CLAUDE_MODE_API=1`) — FastAPI server. |
| 300 | +- Multi-stage Dockerfile: `minimal` and `full` variants; `CLAUDE_MINIMAL` runtime flag. |
| 301 | +- `CLAUDE_MOUNT_*` extra volume mounts. |
| 302 | +- Per-workspace `409` locking. |
| 303 | + |
| 304 | +### Changed |
| 305 | +- `wrapper.sh` extracted from `install.sh` for clarity. |
| 306 | + |
| 307 | +## [v0.14.x] — 2026-03-09/19 |
| 308 | + |
| 309 | +### Added |
| 310 | +- `CLAUDE_MOUNT_*` extra volume mounts (same-path default, or explicit `src:dest`). |
| 311 | +- Container env notes + overwrite warning baked into `CLAUDE.md`. |
| 312 | + |
| 313 | +### Fixed |
| 314 | +- Permissions / `chown` cleanup. |
| 315 | + |
| 316 | +## [v0.13.x] — 2026-03-01/03 |
| 317 | + |
| 318 | +### Added |
| 319 | +- `~/.claude/bin` in `PATH` for custom user scripts. |
| 320 | +- `~/.claude/init.d/` hooks fired on first container creation. |
| 321 | +- `CLAUDE_ENV_*` passthrough. |
| 322 | +- `CLAUDE_INSTALL_DIR`, `CLAUDE_SSH_DIR`, `DEBUG` env-var docs. |
| 323 | + |
| 324 | +### Removed |
| 325 | +- Ephemeral mode (programmatic uses its own container — ephemeral was redundant). |
| 326 | + |
| 327 | +## [v0.12.0] — 2026-02-27 |
| 328 | + |
| 329 | +### Added |
| 330 | +- `--model` flag for programmatic / ephemeral runs. |
| 331 | +- All available models documented. |
| 332 | + |
| 333 | +## [v0.11.x – v0.10.x] — 2026-02-27 |
| 334 | + |
| 335 | +### Added |
| 336 | +- **Programmatic** and **ephemeral** modes. |
| 337 | +- `--no-update` flag (file-signal based). |
| 338 | +- Argument whitelist + container lock. |
| 339 | +- `--continue` automatic fallback. |
| 340 | + |
| 341 | +### Changed |
| 342 | +- Background auto-updates disabled by default. |
| 343 | +- Restart instead of attach to existing containers. |
| 344 | +- Trust pre-accept on first run. |
| 345 | +- Bumped Claude CLI to 2.1.62. |
| 346 | + |
| 347 | +### Fixed |
| 348 | +- Silenced output for programmatic / ephemeral runs. |
| 349 | + |
| 350 | +## [v0.9.x] — 2026-01-08 → 2026-02-03 |
| 351 | + |
| 352 | +### Added |
| 353 | +- Native Claude installer (no more npm). |
| 354 | + |
| 355 | +### Fixed |
| 356 | +- Runtime permission fixes. |
| 357 | +- Misc bug fixes; README updates. |
| 358 | + |
| 359 | +## [v0.8.0] — 2025-12-10 |
| 360 | + |
| 361 | +### Added |
| 362 | +- pyenv with Python 3.12. |
| 363 | +- Auto-generated `CLAUDE.md` so Claude knows what tools are available in the container. |
| 364 | + |
| 365 | +## [v0.7.x – v0.6.0] — 2025-11-23 → 2025-12-08 |
| 366 | + |
| 367 | +### Added |
| 368 | +- Pinned Claude CLI version for reproducible builds. |
| 369 | + |
| 370 | +## [v0.5.x] — 2025-10-10/13 |
| 371 | + |
| 372 | +### Fixed |
| 373 | +- DNS resolution issue. |
| 374 | + |
| 375 | +### Changed |
| 376 | +- Image rebuild. |
| 377 | + |
| 378 | +## [v0.4.0 – v0.1.0] — 2025-06-14 → 2025-08-25 |
| 379 | + |
| 380 | +Initial development: base image, more bundled tooling, project bootstrap. |
| 381 | + |
| 382 | +[v1.11.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.11.0 |
| 383 | +[v1.10.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.10.0 |
| 384 | +[v1.9.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.9.0 |
| 385 | +[v1.8.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.8.0 |
| 386 | +[v1.7.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.7.0 |
| 387 | +[v1.6.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.6.0 |
| 388 | +[v1.5.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.5.0 |
| 389 | +[v1.4.1]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.4.1 |
| 390 | +[v1.4.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.4.0 |
| 391 | +[v1.3.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.3.0 |
| 392 | +[v1.2.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.2.0 |
| 393 | +[v1.1.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.1.0 |
| 394 | +[v1.0.0]: https://github.com/psyb0t/docker-claudebox/releases/tag/v1.0.0 |
0 commit comments