Skip to content
Merged
Show file tree
Hide file tree
Changes from 19 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
2 changes: 2 additions & 0 deletions container/.devcontainer/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@

### Configuration

- **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.
- **Default model updated** — `ANTHROPIC_MODEL` changed from `claude-opus-4-6[1m]` to `claude-opus-4-7`
- **Thinking tokens reduced** — `MAX_THINKING_TOKENS` reduced from 63999 to 31999; adaptive thinking disabled (`CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: 1`)
- **Effort level increased** — `CLAUDE_CODE_EFFORT_LEVEL` changed from `medium` to `max`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
},
"autoMemoryDirectory": "./.claude/memory",
"plansDirectory": "./.claude/plans",
"viewMode": "verbose",
"viewMode": "focus",
"spinnerVerbs": {
"mode": "replace",
"verbs": [
Expand Down
32 changes: 25 additions & 7 deletions container/.devcontainer/scripts/setup-aliases.sh
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,32 @@ 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_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_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_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_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 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
87 changes: 39 additions & 48 deletions container/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ function runTests() {
"README.md",
".devcontainer/devcontainer.json",
".devcontainer/scripts/setup.sh",
".codeforge/config/settings.json",
".codeforge/file-manifest.json",
".devcontainer/defaults/codeforge/config/settings.json",
".devcontainer/defaults/codeforge/file-manifest.json",
];

let allFilesExist = true;
Expand Down Expand Up @@ -99,9 +99,14 @@ function runTests() {

// Test 7: generateChecksums produces expected structure
let checksumStructureValid = true;
const codeforgeDir = path.join(__dirname, ".codeforge");
if (fs.existsSync(codeforgeDir)) {
const checksums = generateChecksums(codeforgeDir);
const defaultsDir = path.join(
__dirname,
".devcontainer",
"defaults",
"codeforge",
);
if (fs.existsSync(defaultsDir)) {
const checksums = generateChecksums(defaultsDir);
if (typeof checksums === "object" && checksums !== null) {
const keys = Object.keys(checksums);
if (keys.length > 0) {
Expand All @@ -125,55 +130,41 @@ function runTests() {
checksumStructureValid = false;
}
} else {
console.log("❌ Test 7: .codeforge directory not found, skipping");
console.log(
"❌ Test 7: .devcontainer/defaults/codeforge/ not found, skipping",
);
checksumStructureValid = false;
}

// Test 8: Bundled defaults in .devcontainer/defaults/codeforge/ match .codeforge/
let bundledDefaultsInSync = true;
const bundledDir = path.join(
__dirname,
".devcontainer",
"defaults",
"codeforge",
);
if (fs.existsSync(bundledDir) && fs.existsSync(codeforgeDir)) {
const sourceChecksums = generateChecksums(codeforgeDir);
const bundledChecksums = generateChecksums(bundledDir);
const sourceKeys = Object.keys(sourceChecksums).sort();
const bundledKeys = Object.keys(bundledChecksums).sort();
// Test 8: Defaults directory has expected config structure
let defaultsStructureValid = true;
const expectedSubdirs = ["config"];
const expectedFiles = ["file-manifest.json", "config/settings.json"];

if (JSON.stringify(sourceKeys) !== JSON.stringify(bundledKeys)) {
console.log(
"❌ Test 8: Bundled defaults file list differs from .codeforge/",
);
const missing = sourceKeys.filter((k) => !bundledKeys.includes(k));
const extra = bundledKeys.filter((k) => !sourceKeys.includes(k));
if (missing.length)
console.log(` Missing from bundled: ${missing.join(", ")}`);
if (extra.length)
console.log(` Extra in bundled: ${extra.join(", ")}`);
bundledDefaultsInSync = false;
} else {
const drifted = sourceKeys.filter(
(k) => sourceChecksums[k] !== bundledChecksums[k],
);
if (drifted.length > 0) {
console.log(
"❌ Test 8: Bundled defaults content differs from .codeforge/",
);
console.log(` Drifted files: ${drifted.join(", ")}`);
bundledDefaultsInSync = false;
} else {
console.log("✓ Test 8: Bundled defaults match .codeforge/");
if (fs.existsSync(defaultsDir)) {
for (const subdir of expectedSubdirs) {
const subdirPath = path.join(defaultsDir, subdir);
if (
!fs.existsSync(subdirPath) ||
!fs.statSync(subdirPath).isDirectory()
) {
console.log(`❌ Test 8: Missing expected subdirectory: ${subdir}`);
defaultsStructureValid = false;
}
}
} else if (!fs.existsSync(bundledDir)) {
console.log("❌ Test 8: .devcontainer/defaults/codeforge/ not found");
bundledDefaultsInSync = false;
for (const file of expectedFiles) {
const filePath = path.join(defaultsDir, file);
if (!fs.existsSync(filePath)) {
console.log(`❌ Test 8: Missing expected file: ${file}`);
defaultsStructureValid = false;
}
}
if (defaultsStructureValid) {
console.log("✓ Test 8: Defaults directory has expected structure");
}
} else {
console.log("❌ Test 8: .codeforge/ not found, cannot compare");
bundledDefaultsInSync = false;
console.log("❌ Test 8: .devcontainer/defaults/codeforge/ not found");
defaultsStructureValid = false;
}

// Summary
Expand All @@ -184,7 +175,7 @@ function runTests() {
setupExecutable &&
checksumFunctionsExist &&
checksumStructureValid &&
bundledDefaultsInSync
defaultsStructureValid
) {
console.log("🎉 All tests passed! Package is ready for distribution.");
process.exit(0);
Expand Down
Loading