Skip to content

Commit 84714b9

Browse files
AnExiledDevclaude
andauthored
Release v2.2.0 (Container) + v0.2.0 (CLI) (#75)
* Add Claude Code Router + Codex CLI features, extract dashboard, restructure docs Container: - Add claude-code-router feature for LLM provider routing (DeepSeek, Gemini, OpenRouter) - Add codex-cli feature for OpenAI Codex terminal agent - Add defaults/ directory with factory config templates - Update ccusage feature with Codex support - Update auth scripts for new provider API keys Dashboard: - Extract dashboard/ to separate CodeDirective repository - Add dashboard/ to .gitignore (deprecated in monorepo) Documentation: - Restructure docs: getting-started → start-here, features/customization → use/customize - Move plugins/ under extend/ section - Add new reference pages: agents, skills, cli-tools, environment-variables - Consolidate architecture and troubleshooting in reference/ Housekeeping: - Gitignore temp directories and screenshots * Remove dashboard feature from devcontainer Dashboard extracted to separate CodeDirective repository. Remove: - codeforge-dashboard devcontainer feature - Dashboard port forwarding and config from devcontainer.json - Dashboard documentation page and sidebar references - Dashboard mentions from README, CLAUDE.md, and related docs * Remove deprecated container/.codeforge directory Configuration migrated to container/.devcontainer/defaults/codeforge/. The .codeforge directory at package root was a development artifact that should not ship with the npm package. * Add behavioral rules for Claude Code sessions New rules in defaults/codeforge/config/rules/: - auto-memory.md: memory constraints and staleness cleanup - zero-tolerance-bugs.md: bugs always in scope, must be fixed - scope-discipline.md: only user defines scope - explicit-start.md: never start without clear instruction - plan-presentation.md: compressed overview before full plan - surface-decisions.md: surface assumptions before acting * Update hook gate path to ~/.claude/disabled-hooks.json All plugin scripts now check ~/.claude/disabled-hooks.json instead of .codeforge/config/disabled-hooks.json for the hook disable list. * Update defaults configuration - settings.json: update to opus-4-7, reduce thinking tokens (31999), disable adaptive thinking, add effort_level max, adjust compaction thresholds, disable agent teams, add background tasks and no-flicker - main-system-prompt.md: streamline prompt content - file-manifest.json: update file list for new rules - claude-code-router.json: add default router configuration * Update agent definitions: remove worktree isolation, upgrade models - Remove isolation: worktree from write-capable agents (documenter, implementer, migrator, refactorer, test-writer) — run in main worktree - Upgrade investigator and security-auditor from sonnet to opus * Update documentation and refactor CLAUDE.md structure - Move devcontainer guide from CLAUDE.md to AGENTS.md - CLAUDE.md now uses @AGENTS.md include directive - docs: update changelog, cli-tools reference, troubleshooting - docs: remove dashboard references, fix sidebar formatting - deps: update docs package-lock.json * Pin agent models to opus-4-5 Update all 9 opus-based agents to use explicit model version opus-4-5. * Bump version to 2.2.0 with comprehensive changelog Update changelog with all changes since v2.1.1: - Claude Code Router and Codex CLI features - Dashboard feature removed from devcontainer - 6 new behavioral rules - Agent model pinning to opus-4-5 - Worktree isolation removed from write-capable agents - Configuration updates (opus-4-7, reduced thinking tokens, max effort) - Hook gate path changed to ~/.claude/ - Config directory restructure - Documentation overhaul Version updated in package.json and README.md. * Add effort frontmatter to all agents and skills Configure Opus 4.7 adaptive thinking via effort: field in frontmatter: - 19 agents: max (2), xhigh (10), high (4), medium (5) - 23 skills: xhigh (3), high (10), medium (9), low (1) Effort levels calibrated by task complexity: - max: architect, spec-writer (deep reasoning required) - xhigh: implementer, migrator, refactorer, etc. (code writing) - high: debug-logs, dependency-analyst, etc. (analysis tasks) - medium: explorer, bash-exec, etc. (simple operations) - low: worktree (basic git commands) * Add session tokens command for thinking token analysis - New `codeforge session tokens` command analyzes thinking token usage - Shows exact billed output tokens and visible content breakdown - Thinking Density table: % turns with thinking, avg chars, session intensity - Per-session breakdown: turns with thinking, density, avg chars per turn - Filter by --project, --model, --since, --until - Output formats: text (colorized) and JSON Bump CLI version to 0.2.0 * Add oh-my-claude devcontainer feature (disabled) Add oh-my-claude multi-provider proxy feature for Chinese LLM routing (Kimi, DeepSeek, Qwen, Zhipu, MiniMax). Feature is disabled pending refinement — omc install modifies settings.json despite --skip-* flags. Feature structure: - devcontainer-feature.json with version, autostart, providerAgentsOnly options - install.sh with backup/restore approach to protect settings.json - poststart-hook.sh for auto-starting proxy - README.md documenting usage and configuration Supporting changes: - .secrets.example: Add Chinese LLM provider API keys - disabled-hooks.json: Add omc memory/preference hooks - setup-aliases.sh: Add --disallowedTools for omc MCP tools, omc-apply alias - devcontainer.json: Add Chinese provider secrets (feature commented out) Note: claude-code-router also commented out pending router consolidation. * Ignore .research/ directory * Fix documentation and security issues from PR #71 review - Fix CLI version in README (0.1.0 → 0.2.0) - Update 16 path references in AGENTS.md (.codeforge/ → defaults/codeforge/) - Replace unsafe eval pattern with getent passwd in 9 install scripts The eval echo "~$USERNAME" pattern could theoretically allow command injection if username validation were removed in future changes. Using getent passwd is safer and matches the pattern already used in codex-cli/install.sh. * Fix container tests for new config location Update test.js to reference .devcontainer/defaults/codeforge/ instead of the removed .codeforge/ directory. Test 8 now validates the defaults directory structure rather than comparing against a source that no longer exists. --------- Co-authored-by: Claude <claude@anthropic.com>
1 parent 6824462 commit 84714b9

File tree

1 file changed

+39
-48
lines changed

1 file changed

+39
-48
lines changed

container/test.js

Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ function runTests() {
2828
"README.md",
2929
".devcontainer/devcontainer.json",
3030
".devcontainer/scripts/setup.sh",
31-
".codeforge/config/settings.json",
32-
".codeforge/file-manifest.json",
31+
".devcontainer/defaults/codeforge/config/settings.json",
32+
".devcontainer/defaults/codeforge/file-manifest.json",
3333
];
3434

3535
let allFilesExist = true;
@@ -99,9 +99,14 @@ function runTests() {
9999

100100
// Test 7: generateChecksums produces expected structure
101101
let checksumStructureValid = true;
102-
const codeforgeDir = path.join(__dirname, ".codeforge");
103-
if (fs.existsSync(codeforgeDir)) {
104-
const checksums = generateChecksums(codeforgeDir);
102+
const defaultsDir = path.join(
103+
__dirname,
104+
".devcontainer",
105+
"defaults",
106+
"codeforge",
107+
);
108+
if (fs.existsSync(defaultsDir)) {
109+
const checksums = generateChecksums(defaultsDir);
105110
if (typeof checksums === "object" && checksums !== null) {
106111
const keys = Object.keys(checksums);
107112
if (keys.length > 0) {
@@ -125,55 +130,41 @@ function runTests() {
125130
checksumStructureValid = false;
126131
}
127132
} else {
128-
console.log("❌ Test 7: .codeforge directory not found, skipping");
133+
console.log(
134+
"❌ Test 7: .devcontainer/defaults/codeforge/ not found, skipping",
135+
);
129136
checksumStructureValid = false;
130137
}
131138

132-
// Test 8: Bundled defaults in .devcontainer/defaults/codeforge/ match .codeforge/
133-
let bundledDefaultsInSync = true;
134-
const bundledDir = path.join(
135-
__dirname,
136-
".devcontainer",
137-
"defaults",
138-
"codeforge",
139-
);
140-
if (fs.existsSync(bundledDir) && fs.existsSync(codeforgeDir)) {
141-
const sourceChecksums = generateChecksums(codeforgeDir);
142-
const bundledChecksums = generateChecksums(bundledDir);
143-
const sourceKeys = Object.keys(sourceChecksums).sort();
144-
const bundledKeys = Object.keys(bundledChecksums).sort();
139+
// Test 8: Defaults directory has expected config structure
140+
let defaultsStructureValid = true;
141+
const expectedSubdirs = ["config"];
142+
const expectedFiles = ["file-manifest.json", "config/settings.json"];
145143

146-
if (JSON.stringify(sourceKeys) !== JSON.stringify(bundledKeys)) {
147-
console.log(
148-
"❌ Test 8: Bundled defaults file list differs from .codeforge/",
149-
);
150-
const missing = sourceKeys.filter((k) => !bundledKeys.includes(k));
151-
const extra = bundledKeys.filter((k) => !sourceKeys.includes(k));
152-
if (missing.length)
153-
console.log(` Missing from bundled: ${missing.join(", ")}`);
154-
if (extra.length)
155-
console.log(` Extra in bundled: ${extra.join(", ")}`);
156-
bundledDefaultsInSync = false;
157-
} else {
158-
const drifted = sourceKeys.filter(
159-
(k) => sourceChecksums[k] !== bundledChecksums[k],
160-
);
161-
if (drifted.length > 0) {
162-
console.log(
163-
"❌ Test 8: Bundled defaults content differs from .codeforge/",
164-
);
165-
console.log(` Drifted files: ${drifted.join(", ")}`);
166-
bundledDefaultsInSync = false;
167-
} else {
168-
console.log("✓ Test 8: Bundled defaults match .codeforge/");
144+
if (fs.existsSync(defaultsDir)) {
145+
for (const subdir of expectedSubdirs) {
146+
const subdirPath = path.join(defaultsDir, subdir);
147+
if (
148+
!fs.existsSync(subdirPath) ||
149+
!fs.statSync(subdirPath).isDirectory()
150+
) {
151+
console.log(`❌ Test 8: Missing expected subdirectory: ${subdir}`);
152+
defaultsStructureValid = false;
169153
}
170154
}
171-
} else if (!fs.existsSync(bundledDir)) {
172-
console.log("❌ Test 8: .devcontainer/defaults/codeforge/ not found");
173-
bundledDefaultsInSync = false;
155+
for (const file of expectedFiles) {
156+
const filePath = path.join(defaultsDir, file);
157+
if (!fs.existsSync(filePath)) {
158+
console.log(`❌ Test 8: Missing expected file: ${file}`);
159+
defaultsStructureValid = false;
160+
}
161+
}
162+
if (defaultsStructureValid) {
163+
console.log("✓ Test 8: Defaults directory has expected structure");
164+
}
174165
} else {
175-
console.log("❌ Test 8: .codeforge/ not found, cannot compare");
176-
bundledDefaultsInSync = false;
166+
console.log("❌ Test 8: .devcontainer/defaults/codeforge/ not found");
167+
defaultsStructureValid = false;
177168
}
178169

179170
// Summary
@@ -184,7 +175,7 @@ function runTests() {
184175
setupExecutable &&
185176
checksumFunctionsExist &&
186177
checksumStructureValid &&
187-
bundledDefaultsInSync
178+
defaultsStructureValid
188179
) {
189180
console.log("🎉 All tests passed! Package is ready for distribution.");
190181
process.exit(0);

0 commit comments

Comments
 (0)