Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
bd688a5
Add Claude Code Router + Codex CLI features, extract dashboard, restr…
claude Apr 12, 2026
52d814e
Remove dashboard feature from devcontainer
claude Apr 16, 2026
c1d04cd
Remove deprecated container/.codeforge directory
claude Apr 16, 2026
1d38441
Add behavioral rules for Claude Code sessions
claude Apr 16, 2026
b294fcc
Update hook gate path to ~/.claude/disabled-hooks.json
claude Apr 16, 2026
435a347
Update defaults configuration
claude Apr 16, 2026
e47953d
Update agent definitions: remove worktree isolation, upgrade models
claude Apr 16, 2026
c98ff68
Update documentation and refactor CLAUDE.md structure
claude Apr 16, 2026
9af663a
Pin agent models to opus-4-5
claude Apr 16, 2026
3b4d3fe
Bump version to 2.2.0 with comprehensive changelog
claude Apr 16, 2026
cd523b1
Add effort frontmatter to all agents and skills
claude Apr 16, 2026
f2b6a14
Add session tokens command for thinking token analysis
claude Apr 16, 2026
e5b63a1
Add oh-my-claude devcontainer feature (disabled)
claude Apr 16, 2026
055611b
Ignore .research/ directory
claude Apr 16, 2026
abab19f
Fix documentation and security issues from PR #71 review
claude Apr 16, 2026
787db9b
Fix container tests for new config location
claude Apr 16, 2026
05d772d
Merge remote-tracking branch 'origin/main' into staging
claude Apr 16, 2026
03b71e3
Fix disallowed tools alias splitting
AnExiledDev Apr 16, 2026
c01fde2
Pass --thinking-display summarized in claude aliases
AnExiledDev Apr 16, 2026
03b2467
Fix session tokens --project filter for absolute paths
AnExiledDev Apr 16, 2026
19bfc53
Bump container to 2.2.1
AnExiledDev Apr 16, 2026
774f40b
Implement session tokens --since / --until filters
AnExiledDev Apr 16, 2026
7001393
Set default effort level to high
AnExiledDev Apr 16, 2026
3fa1c40
Remove stale test-dashboard CI job
AnExiledDev Apr 16, 2026
2b5cc46
Fix pathToProjectSlug on Windows
AnExiledDev Apr 16, 2026
3cfc850
Pin zod to v3 to unbreak docs build
AnExiledDev Apr 16, 2026
62f55d4
Default to opus-4-5, add cc7/ccw7/cc-orc7 for opus-4-7 (#77)
AnExiledDev Apr 16, 2026
4bacbaf
Scope pathToProjectSlug leading-dash assertion to POSIX
AnExiledDev Apr 17, 2026
12c86e1
Fix release.yml changelog extraction header pattern
AnExiledDev Apr 17, 2026
91e06e4
Merge branch 'main' into staging
AnExiledDev Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 2 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ name: CI
on:
push:
branches: [main, staging]
paths: ['container/**', 'cli/**', 'dashboard/**']
paths: ['container/**', 'cli/**']
pull_request:
branches: [main, staging]
paths: ['container/**', 'cli/**', 'dashboard/**']
paths: ['container/**', 'cli/**']

jobs:
test:
Expand Down Expand Up @@ -52,13 +52,3 @@ jobs:
working-directory: cli
- run: bun test
working-directory: cli

test-dashboard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: oven-sh/setup-bun@v2
- run: bun install
working-directory: dashboard
- run: bun test
working-directory: dashboard
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
id: changelog
run: |
VERSION="${{ needs.validate.outputs.version }}"
NOTES=$(sed -n "/^## \[v${VERSION}\]/,/^## \[v/{ /^## \[v${VERSION}\]/d; /^## \[v/d; p; }" container/.devcontainer/CHANGELOG.md)
NOTES=$(sed -n "/^## v${VERSION} /,/^## v/{ /^## v${VERSION} /d; /^## v/d; p; }" container/.devcontainer/CHANGELOG.md)
if [ -z "$NOTES" ]; then
NOTES="Release v${VERSION}"
fi
Expand Down
7 changes: 7 additions & 0 deletions cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# CodeForge CLI Changelog

## v0.2.1 — 2026-04-16

### Fixes

- **`session tokens --project` now works with absolute paths** — the filter was comparing an on-disk slug (e.g. `-workspaces-projects-CodeForge`) to the raw `--project` path (e.g. `/workspaces/projects/CodeForge`), which never matched. Absolute paths and paths starting with `./` / `../` are now encoded to Claude's slug form (replacing `/` and `.` with `-`) before matching. Plain substrings without separators still pass through unchanged, so `--project CodeForge` keeps working.
- **`session tokens --since` / `--until` now actually filter results** — both options were parsed but never applied. Filtering is session-level and uses file mtime (last-activity time) so sessions outside the window are skipped without being parsed.

## v0.2.0 — 2026-04-16

### New Command
Expand Down
2 changes: 1 addition & 1 deletion cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"publishConfig": {
"access": "public"
},
"version": "0.2.0",
"version": "0.2.1",
"description": "CLI for CodeForge development workflows",
"keywords": [
"codeforge",
Expand Down
76 changes: 72 additions & 4 deletions cli/src/commands/session/tokens.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import chalk from "chalk";
import type { Command } from "commander";
import { basename } from "path";
import { stat } from "fs/promises";
import { basename, isAbsolute, resolve } from "path";
import { readLines } from "../../search/engine.js";
import { discoverSessionFiles } from "../../utils/glob.js";
import { parseRelativeTime, parseTime } from "../../utils/time.js";
Expand Down Expand Up @@ -80,6 +81,54 @@ function extractProjectFromPath(filePath: string): string | undefined {
return undefined;
}

/**
* Normalize a user-provided --project value for matching against Claude's
* on-disk project slugs.
*
* Claude encodes project cwds by replacing `/` and `.` with `-`, e.g.
* /workspaces/projects/CodeForge -> -workspaces-projects-CodeForge
* /workspaces/.devcontainer -> -workspaces--devcontainer
*
* Behavior:
* - Absolute paths are converted to slug form.
* - Relative paths beginning with `./` or `../` are resolved against cwd first.
* - Plain substrings without separators pass through unchanged so users can
* filter with `--project CodeForge` against the slug (backwards-compatible).
*/
export function pathToProjectSlug(input: string): string {
const looksLikePath =
isAbsolute(input) || input.startsWith("./") || input.startsWith("../");
if (looksLikePath) {
const abs = isAbsolute(input) ? input : resolve(input);
// Normalize Windows separators so the slug logic (which encodes `/` and
// `.` as `-`) produces identical output on all platforms. Without this,
// `resolve("./foo")` on Windows returns `D:\...\foo` and the backslashes
// leak through unchanged.
const normalized = abs.replace(/\\/g, "/");
return normalized.replace(/\/+$/, "").replace(/[./]/g, "-");
}
return input;
}

/**
* Pure check for whether a file's last-modified time falls within an optional
* [since, until] window. Exported for direct unit testing without fixtures.
*
* Semantics:
* - `since`: mtime must be >= since (inclusive)
* - `until`: mtime must be <= until (inclusive)
* - If both bounds are omitted, always returns true.
*/
export function isFileWithinTimeRange(
mtime: Date,
since?: Date,
until?: Date,
): boolean {
if (since && mtime < since) return false;
if (until && mtime > until) return false;
return true;
}

function isSubagentPath(filePath: string): boolean {
return filePath.includes("/subagents/");
}
Expand Down Expand Up @@ -304,11 +353,30 @@ async function analyzeTokens(options: {
const mainSessions: SessionTokenStats[] = [];
const subagentSessions: SessionTokenStats[] = [];

const projectNeedle = options.project
? pathToProjectSlug(options.project)
: undefined;

const hasTimeFilter = !!(options.since || options.until);

for (const filePath of files) {
// Filter by project
if (options.project) {
// Filter by project (slug-to-slug match; absolute paths are encoded).
if (projectNeedle) {
const project = extractProjectFromPath(filePath);
if (!project?.includes(options.project)) continue;
if (!project?.includes(projectNeedle)) continue;
}

// Filter by file mtime (session activity time) before the expensive
// per-file parse. Sessions outside the window are skipped without reads.
if (hasTimeFilter) {
try {
const st = await stat(filePath);
if (!isFileWithinTimeRange(st.mtime, options.since, options.until)) {
continue;
}
} catch {
continue;
}
}

const stats = await analyzeSessionTokens(filePath);
Expand Down
79 changes: 79 additions & 0 deletions cli/tests/tokens.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { describe, expect, test } from "bun:test";
import {
isFileWithinTimeRange,
pathToProjectSlug,
} from "../src/commands/session/tokens.js";

describe("pathToProjectSlug", () => {
test("encodes absolute paths to claude's slug form", () => {
expect(pathToProjectSlug("/workspaces/projects/CodeForge")).toBe(
"-workspaces-projects-CodeForge",
);
});

test("encodes dotfiles with double dashes like claude does", () => {
// /workspaces/.devcontainer -> /workspaces/-devcontainer (slash -> dash,
// then the leading dot on the next segment becomes another dash)
expect(pathToProjectSlug("/workspaces/.devcontainer")).toBe(
"-workspaces--devcontainer",
);
});

test("strips trailing slashes before encoding", () => {
expect(pathToProjectSlug("/workspaces/projects/CodeForge/")).toBe(
"-workspaces-projects-CodeForge",
);
expect(pathToProjectSlug("/workspaces/projects/CodeForge///")).toBe(
"-workspaces-projects-CodeForge",
);
});

test("passes plain substrings through unchanged for backwards compat", () => {
// No separator -> user wants substring match against a slug
expect(pathToProjectSlug("CodeForge")).toBe("CodeForge");
expect(pathToProjectSlug("projects-CodeForge")).toBe("projects-CodeForge");
});

test("resolves relative ./ and ../ paths before encoding", () => {
const abs = pathToProjectSlug("./foo");
// Resolved path always ends with /foo; after encoding trailing segment is -foo
expect(abs.endsWith("-foo")).toBe(true);
// On POSIX, resolved absolute paths start with `/` which encodes to `-`.
// On Windows they start with a drive letter (e.g. `D:`) so the leading
// `-` assertion is POSIX-only.
if (process.platform !== "win32") {
expect(abs.startsWith("-")).toBe(true);
}

const abs2 = pathToProjectSlug("../bar");
expect(abs2.endsWith("-bar")).toBe(true);
});
});

describe("isFileWithinTimeRange", () => {
const jan1 = new Date("2026-01-01T00:00:00Z");
const feb1 = new Date("2026-02-01T00:00:00Z");
const mar1 = new Date("2026-03-01T00:00:00Z");

test("returns true when no bounds are given", () => {
expect(isFileWithinTimeRange(feb1)).toBe(true);
});

test("since: includes mtimes at or after the bound", () => {
expect(isFileWithinTimeRange(feb1, jan1)).toBe(true);
expect(isFileWithinTimeRange(feb1, feb1)).toBe(true); // inclusive
expect(isFileWithinTimeRange(feb1, mar1)).toBe(false);
});

test("until: includes mtimes at or before the bound", () => {
expect(isFileWithinTimeRange(feb1, undefined, mar1)).toBe(true);
expect(isFileWithinTimeRange(feb1, undefined, feb1)).toBe(true); // inclusive
expect(isFileWithinTimeRange(feb1, undefined, jan1)).toBe(false);
});

test("since + until: inclusive range", () => {
expect(isFileWithinTimeRange(feb1, jan1, mar1)).toBe(true);
expect(isFileWithinTimeRange(jan1, feb1, mar1)).toBe(false);
expect(isFileWithinTimeRange(mar1, jan1, feb1)).toBe(false);
});
});
7 changes: 4 additions & 3 deletions container/.devcontainer/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ Config files deploy via `defaults/codeforge/file-manifest.json` on every contain

| Command | Purpose |
|---------|---------|
| `cc` / `claude` | Run Claude Code with auto-configuration |
| `cc` / `claude` | Run Claude Code with auto-configuration (opus-4-5, 200k context) |
| `codeforge config apply` | Deploy config files to `~/.claude/` (same as container start) |
| `ccraw` | Vanilla Claude Code (bypasses config) |
| `ccw` | Claude Code with writing system prompt |
| `cc-orc` | Claude Code in orchestrator mode (delegation-first) |
| `ccw` | Claude Code with writing system prompt (opus-4-5, 200k context) |
| `cc-orc` | Claude Code in orchestrator mode, delegation-first (opus-4-5, 200k context) |
| `cc7` / `ccw7` / `cc-orc7` | Claude Code on opus-4-7 with 400k context (main / writing / orchestrator modes) |
| `codex` | OpenAI Codex CLI terminal coding agent |
| `ccms` | Session history search _(disabled — requires Rust toolchain; uncomment in devcontainer.json to enable)_ |
| `codeforge proxy` | Launch Claude Code through mitmproxy — inspect API traffic in browser (port 8081) |
Expand Down
14 changes: 14 additions & 0 deletions container/.devcontainer/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# CodeForge Devcontainer Changelog

## v2.2.1 — 2026-04-16

### Configuration

- **Default model changed to `claude-opus-4-5`** — `ANTHROPIC_MODEL` and `ANTHROPIC_DEFAULT_OPUS_MODEL` in default settings flipped from `claude-opus-4-7` to `claude-opus-4-5`. Subagents also run on 4.5 by default.
- **Per-alias context windows** — `CLAUDE_CODE_MAX_CONTEXT_TOKENS` and `CLAUDE_CODE_AUTO_COMPACT_WINDOW` removed from global `settings.json env` (they pinned 250k globally, which would exceed 4.5's 200k ceiling). Context is now set inline per alias: `cc` / `claude` / `ccw` / `cc-orc` = 200k; `cc7` / `ccw7` / `cc-orc7` = 400k.
- **New 4.7 alias variants** — `cc7`, `ccw7`, `cc-orc7` run Claude Code on `claude-opus-4-7` with a 400k context window (main / writing / orchestrator system prompts respectively). Use these for sessions that need 4.7's larger window; use `cc` / `ccw` / `cc-orc` (now on 4.5) for standard work.
- **Thinking display set to summarized** — `cc`, `claude`, `ccw`, and `cc-orc` aliases now pass `--thinking-display summarized`, keeping the terminal tidy while still surfacing thinking. `ccraw` is unaffected (stays vanilla).
- **View mode set to focus** — `viewMode` changed from `verbose` to `focus` in default settings for a cleaner terminal UI.

### Fixes

- **Disallowed tools alias splitting** — oh-my-claude disallowed tools are now stored as a bash array and expanded per-argument in the Claude aliases, so `--disallowedTools` and each tool name are passed as separate argv entries in both bash and zsh.

## v2.2.0 — 2026-04-16

### Claude Code Router
Expand Down
10 changes: 4 additions & 6 deletions container/.devcontainer/defaults/codeforge/config/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"autoCompact": true,
"alwaysThinkingEnabled": true,
"env": {
"ANTHROPIC_MODEL": "claude-opus-4-7",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-7",
"ANTHROPIC_MODEL": "claude-opus-4-5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-5",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-6",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5-20251001",
"BASH_DEFAULT_TIMEOUT_MS": "120000",
Expand All @@ -13,13 +13,11 @@
"MAX_MCP_OUTPUT_TOKENS": "10000",
"MAX_THINKING_TOKENS": "31999",
"CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "1",
"CLAUDE_CODE_EFFORT_LEVEL": "max",
"CLAUDE_CODE_EFFORT_LEVEL": "high",
"MCP_TIMEOUT": "120000",
"MCP_TOOL_TIMEOUT": "30000",
"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "80",
"FORCE_AUTOUPDATE_PLUGINS": "1",
"CLAUDE_CODE_AUTO_COMPACT_WINDOW": "250000",
"CLAUDE_CODE_MAX_CONTEXT_TOKENS": "250000",
"CLAUDE_CODE_SCROLL_SPEED": "3",

"ENABLE_TOOL_SEARCH": "auto:5",
Expand Down Expand Up @@ -51,7 +49,7 @@
},
"autoMemoryDirectory": "./.claude/memory",
"plansDirectory": "./.claude/plans",
"viewMode": "verbose",
"viewMode": "focus",
"spinnerVerbs": {
"mode": "replace",
"verbs": [
Expand Down
49 changes: 38 additions & 11 deletions container/.devcontainer/scripts/setup-aliases.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ for rc in ~/.bashrc ~/.zshrc; do
sed -i "/^alias claude='/d" "$rc"
sed -i "/^alias ccraw='/d" "$rc"
sed -i "/^alias ccw='/d" "$rc"
sed -i "/^alias cc7='/d" "$rc"
sed -i "/^alias ccw7='/d" "$rc"
sed -i "/^alias cc-orc7='/d" "$rc"
sed -i '/^alias check-setup=/d' "$rc"
# cc-tools function from old format
if grep -q "^cc-tools()" "$rc" 2>/dev/null; then
Expand Down Expand Up @@ -93,14 +96,35 @@ else
fi

# oh-my-claude tools to disable (memory, preferences, coworker - keep only proxy tools)
# Note: no quotes around tool names - they don't contain spaces and quotes would be passed literally
_OMC_DISALLOWED_TOOLS='--disallowedTools mcp__oh-my-claude__remember mcp__oh-my-claude__recall mcp__oh-my-claude__get_memory mcp__oh-my-claude__forget mcp__oh-my-claude__list_memories mcp__oh-my-claude__memory_status mcp__oh-my-claude__compact_memories mcp__oh-my-claude__clear_memories mcp__oh-my-claude__summarize_memories mcp__oh-my-claude__add_preference mcp__oh-my-claude__list_preferences mcp__oh-my-claude__get_preference mcp__oh-my-claude__update_preference mcp__oh-my-claude__delete_preference mcp__oh-my-claude__match_preferences mcp__oh-my-claude__preference_stats mcp__oh-my-claude__coworker_task'

alias cc='CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/main-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions \$_OMC_DISALLOWED_TOOLS'
alias claude='CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/main-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions \$_OMC_DISALLOWED_TOOLS'
_OMC_DISALLOWED_TOOLS=(
--disallowedTools
mcp__oh-my-claude__remember
mcp__oh-my-claude__recall
mcp__oh-my-claude__get_memory
mcp__oh-my-claude__forget
mcp__oh-my-claude__list_memories
mcp__oh-my-claude__memory_status
mcp__oh-my-claude__compact_memories
mcp__oh-my-claude__clear_memories
mcp__oh-my-claude__summarize_memories
mcp__oh-my-claude__add_preference
mcp__oh-my-claude__list_preferences
mcp__oh-my-claude__get_preference
mcp__oh-my-claude__update_preference
mcp__oh-my-claude__delete_preference
mcp__oh-my-claude__match_preferences
mcp__oh-my-claude__preference_stats
mcp__oh-my-claude__coworker_task
)

alias cc='CLAUDE_CODE_MAX_CONTEXT_TOKENS=200000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/main-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias claude='CLAUDE_CODE_MAX_CONTEXT_TOKENS=200000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/main-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias ccraw='command "\$_CLAUDE_BIN"'
alias ccw='CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/writing-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions \$_OMC_DISALLOWED_TOOLS'
alias cc-orc='CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/orchestrator-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions \$_OMC_DISALLOWED_TOOLS'
alias ccw='CLAUDE_CODE_MAX_CONTEXT_TOKENS=200000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/writing-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias cc-orc='CLAUDE_CODE_MAX_CONTEXT_TOKENS=200000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --system-prompt-file "\$CLAUDE_CONFIG_DIR/orchestrator-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias cc7='CLAUDE_CODE_MAX_CONTEXT_TOKENS=400000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=400000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --model claude-opus-4-7 --system-prompt-file "\$CLAUDE_CONFIG_DIR/main-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias ccw7='CLAUDE_CODE_MAX_CONTEXT_TOKENS=400000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=400000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --model claude-opus-4-7 --system-prompt-file "\$CLAUDE_CONFIG_DIR/writing-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias cc-orc7='CLAUDE_CODE_MAX_CONTEXT_TOKENS=400000 CLAUDE_CODE_AUTO_COMPACT_WINDOW=400000 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 "\$_CLAUDE_WRAP" "\$_CLAUDE_BIN" --model claude-opus-4-7 --system-prompt-file "\$CLAUDE_CONFIG_DIR/orchestrator-system-prompt.md" --permission-mode plan --allow-dangerously-skip-permissions --thinking-display summarized "\${_OMC_DISALLOWED_TOOLS[@]}"'
alias ccr-apply='codeforge config apply && (ccr restart 2>/dev/null || ccr start) && echo "CCR config applied and restarted"'
alias omc-apply='codeforge config apply && (omc proxy restart 2>/dev/null || omc proxy start) && echo "OMC config applied and proxy restarted"'

Expand Down Expand Up @@ -131,11 +155,14 @@ BLOCK_EOF
done

echo "[setup-aliases] Aliases configured:"
echo " cc -> claude with \$CLAUDE_CONFIG_DIR/main-system-prompt.md"
echo " claude -> claude with \$CLAUDE_CONFIG_DIR/main-system-prompt.md"
echo " cc -> claude (opus-4-5, 200k ctx) with \$CLAUDE_CONFIG_DIR/main-system-prompt.md"
echo " claude -> claude (opus-4-5, 200k ctx) with \$CLAUDE_CONFIG_DIR/main-system-prompt.md"
echo " ccraw -> vanilla claude without any config"
echo " ccw -> claude with \$CLAUDE_CONFIG_DIR/writing-system-prompt.md"
echo " cc-orc -> claude with \$CLAUDE_CONFIG_DIR/orchestrator-system-prompt.md (delegation mode)"
echo " ccw -> claude (opus-4-5, 200k ctx) with \$CLAUDE_CONFIG_DIR/writing-system-prompt.md"
echo " cc-orc -> claude (opus-4-5, 200k ctx) with \$CLAUDE_CONFIG_DIR/orchestrator-system-prompt.md (delegation mode)"
echo " cc7 -> claude (opus-4-7, 400k ctx) with \$CLAUDE_CONFIG_DIR/main-system-prompt.md"
echo " ccw7 -> claude (opus-4-7, 400k ctx) with \$CLAUDE_CONFIG_DIR/writing-system-prompt.md"
echo " cc-orc7 -> claude (opus-4-7, 400k ctx) with \$CLAUDE_CONFIG_DIR/orchestrator-system-prompt.md (delegation mode)"
echo " ccr-apply -> redeploy claude-code-router config + restart daemon"
echo " cc-tools -> list all available CodeForge tools"
echo " check-setup -> verify CodeForge setup health"
2 changes: 1 addition & 1 deletion container/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"publishConfig": {
"access": "public"
},
"version": "2.2.0",
"version": "2.2.1",
"description": "Complete development container that sets up Claude Code with modular devcontainer features, modern dev tools, and persistent configurations. Drop it into any project and get a production-ready AI development environment in minutes.",
"main": "setup.js",
"bin": {
Expand Down
Loading
Loading