Skip to content

Commit 8972975

Browse files
committed
Prep v2.1.0 release: changelog, docs, version lock, config updates
- Bump changelog to v2.1.0 with proxy feature, dashboard, hooks, scope guard fixes, and all unreleased changes - Document codeforge proxy command in CLAUDE.md - Add CLAUDE_VERSION_LOCK support to update script - Add DISABLE_AUTOUPDATER to settings.json - Export CLAUDE_VERSION_LOCK in setup.sh - Add version lock docs to .env.example - Fix syntax-validator.py formatting
1 parent fadf5d3 commit 8972975

File tree

7 files changed

+72
-35
lines changed

7 files changed

+72
-35
lines changed

container/.codeforge/config/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
"CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY": "10",
3535
"CLAUDE_CODE_MAX_RETRIES": "1",
3636
"BASH_MAX_OUTPUT_LENGTH": "15000",
37-
"TASK_MAX_OUTPUT_LENGTH": "64000"
37+
"TASK_MAX_OUTPUT_LENGTH": "64000",
38+
"DISABLE_AUTOUPDATER": "1"
3839
},
3940
"teammateMode": "auto",
4041
"effortLevel": "high",

container/.devcontainer/.env.example

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ SETUP_POSTSTART=true
3030

3131
SETUP_PROJECTS=true
3232

33+
# Version lock: set to a specific semver (e.g., 2.1.80) to pin Claude Code to that version.
34+
# When set, the update script installs this exact version instead of updating to latest.
35+
# Unset or empty = update to latest as normal.
36+
# CLAUDE_VERSION_LOCK=2.1.80
37+
3338
# Plugin blacklist: comma-separated plugin names to skip during installation
3439
# Example: PLUGIN_BLACKLIST="ticket-workflow,auto-linter"
3540
PLUGIN_BLACKLIST=""

container/.devcontainer/CHANGELOG.md

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
11
# CodeForge Devcontainer Changelog
22

3-
## Unreleased
3+
## v2.1.0 — 2026-03-25
44

5-
### Hooks
6-
- **Per-hook disable mechanism** — add script names to `.codeforge/config/disabled-hooks.json` to disable individual hooks without disabling the entire plugin. Takes effect immediately, no restart needed.
7-
- Disabled by default: `git-state-injector`, `ticket-linker`, `spec-reminder`
5+
### CLI
6+
7+
- **`codeforge proxy`** — launch Claude Code through mitmproxy for full API traffic inspection. Starts mitmweb in the background, proxies all Claude API requests through it, and opens a browser UI at `http://localhost:8081` for real-time request/response inspection. Auto-installs mitmproxy via pipx on first use, handles CA certificate generation and system trust store installation. Supports `--no-web` for headless mitmdump output, `--setup` for install-only, and `-- <claude-args>` passthrough. Useful for monitoring token usage, cache behavior, and rate limit utilization — the `anthropic-ratelimit-unified-*` response headers on `/v1/messages` requests show 5-hour and 7-day quota utilization even with long-lived auth tokens.
8+
- **Version lock** — set `CLAUDE_VERSION_LOCK=<semver>` in `.env` to pin Claude Code to a specific version. The update script installs the exact version instead of updating to latest. Background auto-updater disabled via `DISABLE_AUTOUPDATER`.
89

910
### Dashboard
11+
1012
- **First-party dashboard** — replaced third-party `claude-session-dashboard` npm package with `codeforge-dashboard` (built from monorepo `dashboard/` package)
1113
- Auto-launch on container start via poststart hook (controllable with `autostart` option)
1214
- Install switched from npm to Bun (`bun install -g`)
1315
- Command renamed: `claude-dashboard``codeforge-dashboard`
1416
- Removed persistence symlink hook (dashboard DB now lives on bind mount at `~/.codeforge/data/`)
1517

16-
### Testing
17-
- **Plugin test suite** — 241 pytest tests covering 6 critical plugin scripts that previously had zero tests:
18-
- `block-dangerous.py` (46 tests) — all 22 dangerous command patterns with positive/negative/edge cases
19-
- `guard-workspace-scope.py` (40 tests) — blacklist, scope, allowlist, bash enforcement layers, primary command extraction
20-
- `guard-protected.py` (55 tests) — all protected file patterns (secrets, locks, keys, credentials, auth dirs)
21-
- `guard-protected-bash.py` (24 tests) — write target extraction and protected path integration
22-
- `guard-readonly-bash.py` (63 tests) — general-readonly and git-readonly modes, bypass prevention
23-
- `redirect-builtin-agents.py` (13 tests) — redirect mapping, passthrough, output structure
24-
- Added `test:plugins` and `test:all` npm scripts for running plugin tests
18+
### Hooks
2519

26-
### Skills
27-
- Added `agent-browser` skill to skill-engine plugin — guides headless browser automation with CLI reference, workflow patterns, and authentication
20+
- **Per-hook disable mechanism** — add script names to `.codeforge/config/disabled-hooks.json` to disable individual hooks without disabling the entire plugin. Takes effect immediately, no restart needed.
21+
- Disabled by default: `git-state-injector`, `ticket-linker`, `spec-reminder`
2822

2923
### Scope Guard
3024

@@ -35,17 +29,43 @@
3529

3630
- Remove system directory write redirect blocks (`> /usr/`, `> /etc/`, `> /bin/`, `> /sbin/`) — caused false positives on text content in command arguments (e.g. PR body text containing paths); write location enforcement is the scope guard's responsibility
3731

38-
### CLI Integration
32+
### Skills
3933

40-
- Add codeforge-cli devcontainer feature — installs the CodeForge CLI (`codeforge` command) globally via npm
41-
- Remove dead `codeforge` alias from setup-aliases.sh (was pointing to obsolete `setup.js`)
34+
- Added `agent-browser` skill to skill-engine plugin — guides headless browser automation with CLI reference, workflow patterns, and authentication
35+
36+
### Configuration
37+
38+
- Add `autoMemoryDirectory` setting — auto-memory now stored in project-local `.claude/memory/` instead of deep inside `~/.claude/projects/`, making it visible and version-controllable
39+
- Enhanced system prompts with auto-memory system, hooks awareness, safety rules, and anti-over-engineering guidance
40+
41+
### Status Bar
42+
43+
- Replace `ccburn-compact` statusline widget with native `session-usage` and `weekly-usage` ccstatusline widgets — eliminates external command dependency and 8s timeout
44+
- Comment out `ccburn` devcontainer feature (disabled by default) — functionality replaced by native widgets
4245

4346
### Windows Compatibility
4447

4548
- Fix `claude-code-native` install failure on Windows/macOS Docker Desktop — installer now falls back to `HOME` override when `su` is unavailable
4649
- Remove `preflight.sh` runtime check — redundant with Docker's own error reporting and caused failures on Windows
4750

51+
### CLI Integration
52+
53+
- Add codeforge-cli devcontainer feature — installs the CodeForge CLI (`codeforge` command) globally via npm
54+
- Remove dead `codeforge` alias from setup-aliases.sh (was pointing to obsolete `setup.js`)
55+
56+
### Testing
57+
58+
- **Plugin test suite** — 241 pytest tests covering 6 critical plugin scripts that previously had zero tests:
59+
- `block-dangerous.py` (46 tests) — all 22 dangerous command patterns with positive/negative/edge cases
60+
- `guard-workspace-scope.py` (40 tests) — blacklist, scope, allowlist, bash enforcement layers, primary command extraction
61+
- `guard-protected.py` (55 tests) — all protected file patterns (secrets, locks, keys, credentials, auth dirs)
62+
- `guard-protected-bash.py` (24 tests) — write target extraction and protected path integration
63+
- `guard-readonly-bash.py` (63 tests) — general-readonly and git-readonly modes, bypass prevention
64+
- `redirect-builtin-agents.py` (13 tests) — redirect mapping, passthrough, output structure
65+
- Added `test:plugins` and `test:all` npm scripts for running plugin tests
66+
4867
### Documentation
68+
4969
- **DevContainer CLI guide** — dedicated Getting Started page for terminal-only workflows without VS Code
5070
- **v2 Migration Guide** — path changes, automatic migration, manual steps, breaking changes, and troubleshooting
5171
- Documented 4 previously undocumented agents in agents.md: implementer, investigator, tester, documenter
@@ -54,19 +74,6 @@
5474
- Added cc-orc orchestrator command to first-session launch commands table
5575
- Tabbed client-specific instructions on the installation page
5676
- Dedicated port forwarding reference page covering VS Code auto-detect, devcontainer-bridge, and SSH tunneling
57-
58-
### Configuration
59-
60-
- Add `autoMemoryDirectory` setting — auto-memory now stored in project-local `.claude/memory/` instead of deep inside `~/.claude/projects/`, making it visible and version-controllable
61-
- Enhanced system prompts with auto-memory system, hooks awareness, safety rules, and anti-over-engineering guidance
62-
63-
### Status Bar
64-
65-
- Replace `ccburn-compact` statusline widget with native `session-usage` and `weekly-usage` ccstatusline widgets — eliminates external command dependency and 8s timeout
66-
- Comment out `ccburn` devcontainer feature (disabled by default) — functionality replaced by native widgets
67-
68-
### Documentation
69-
7077
- Document `${CLAUDE_PLUGIN_DATA}` variable in CLAUDE.md for future plugin persistent storage
7178

7279
## v2.1.1 — 2026-03-13

container/.devcontainer/CLAUDE.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Config files deploy via `.codeforge/file-manifest.json` on every container start
2727
| `ccw` | Claude Code with writing system prompt |
2828
| `cc-orc` | Claude Code in orchestrator mode (delegation-first) |
2929
| `ccms` | Session history search _(disabled — requires Rust toolchain; uncomment in devcontainer.json to enable)_ |
30+
| `codeforge proxy` | Launch Claude Code through mitmproxy — inspect API traffic in browser (port 8081) |
3031
| `ccusage` / `ccburn` | Token usage analysis / burn rate |
3132
| `agent-browser` | Headless Chromium (Playwright-based) |
3233
| `check-setup` | Verify CodeForge setup health |
@@ -79,7 +80,8 @@ The `~/.claude/` directory is backed by a Docker named volume (`codeforge-claude
7980
5. **Disable features**: Set `"version": "none"` in the feature's config
8081
6. **Disable setup steps**: Set flags to `false` in `.env`
8182
7. **Customize status bar**: Edit `.codeforge/config/ccstatusline-settings.json`
82-
8. **Disable individual hooks**: Add script name (without `.py`) to `disabled` array in `.codeforge/config/disabled-hooks.json` — takes effect immediately, no restart needed
83+
8. **Lock Claude Code version**: Set `CLAUDE_VERSION_LOCK=2.1.80` in `.env` — the update script installs that exact version on container start instead of updating to latest. Unset to resume auto-updates.
84+
9. **Disable individual hooks**: Add script name (without `.py`) to `disabled` array in `.codeforge/config/disabled-hooks.json` — takes effect immediately, no restart needed
8385

8486
## Plugin Development Notes
8587

container/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/syntax-validator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
_dh = os.path.join(os.getcwd(), ".codeforge", "config", "disabled-hooks.json")
2020
if os.path.exists(_dh):
2121
with open(_dh) as _f:
22-
if os.path.basename(__file__).replace(".py", "") in json.load(_f).get("disabled", []):
22+
if os.path.basename(__file__).replace(".py", "") in json.load(_f).get(
23+
"disabled", []
24+
):
2325
sys.exit(0)
2426

2527
EXTENSIONS = {".json", ".jsonc", ".yaml", ".yml", ".toml"}

container/.devcontainer/scripts/setup-update-claude.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,26 @@ fi
5656
CURRENT_VERSION=$("$NATIVE_BIN" --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "unknown")
5757
log "Current version: ${CURRENT_VERSION}"
5858

59+
# === VERSION LOCK ===
60+
# If CLAUDE_VERSION_LOCK is set to a semver, pin to that exact version
61+
# instead of updating to latest. Set in .env alongside SETUP_UPDATE_CLAUDE.
62+
if [ -n "${CLAUDE_VERSION_LOCK:-}" ] && echo "$CLAUDE_VERSION_LOCK" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
63+
if [ "$CURRENT_VERSION" = "$CLAUDE_VERSION_LOCK" ]; then
64+
log "Version locked at ${CLAUDE_VERSION_LOCK} (current matches)"
65+
exit 0
66+
fi
67+
68+
log "Version lock: ${CURRENT_VERSION}${CLAUDE_VERSION_LOCK}"
69+
if curl -fsSL https://claude.ai/install.sh | bash -s -- "$CLAUDE_VERSION_LOCK" 2>&1 | tee -a "$LOG_FILE"; then
70+
LOCKED_VERSION=$("$NATIVE_BIN" --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "unknown")
71+
log "Installed locked version: ${LOCKED_VERSION}"
72+
else
73+
log "WARNING: Failed to install locked version ${CLAUDE_VERSION_LOCK}"
74+
fi
75+
exit 0
76+
fi
77+
78+
# === UPDATE TO LATEST ===
5979
# Use the official update command with timeout (handles download, verification, and versioned install)
6080
timeout 60 "$NATIVE_BIN" update 2>&1 | tee -a "$LOG_FILE"
6181
UPDATE_STATUS=${PIPESTATUS[0]}

container/.devcontainer/scripts/setup.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ fi
6767
: "${SETUP_TERMINAL:=true}"
6868
: "${SETUP_POSTSTART:=true}"
6969

70-
export CLAUDE_CONFIG_DIR CONFIG_SOURCE_DIR CODEFORGE_DIR SETUP_CONFIG SETUP_ALIASES SETUP_AUTH SETUP_PLUGINS SETUP_UPDATE_CLAUDE SETUP_PROJECTS SETUP_TERMINAL SETUP_POSTSTART
70+
export CLAUDE_CONFIG_DIR CONFIG_SOURCE_DIR CODEFORGE_DIR SETUP_CONFIG SETUP_ALIASES SETUP_AUTH SETUP_PLUGINS SETUP_UPDATE_CLAUDE CLAUDE_VERSION_LOCK SETUP_PROJECTS SETUP_TERMINAL SETUP_POSTSTART
7171

7272
# Fix named volume ownership — Docker creates named volumes as root:root
7373
# regardless of remoteUser. This is the only setup script requiring sudo.

0 commit comments

Comments
 (0)