Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Monorepo for CodeForge — an AI-powered development environment for Claude Code

| Package | Description | Version |
|---------|-------------|---------|
| [`container/`](container/) | CodeForge DevContainer (`codeforge-dev` on npm) | 2.0.0 |
| [`container/`](container/) | CodeForge DevContainer (`codeforge-dev` on npm) | 2.1.0 |
| [`cli/`](cli/) | CodeForge CLI (`codeforge-cli`) | 0.1.0 |
| [`dashboard/`](dashboard/) | Session analytics dashboard (Svelte 5 SPA + Bun backend) | — |
| [`docs/`](docs/) | Documentation site ([codeforge.core-directive.com](https://codeforge.core-directive.com)) | — |
Expand Down
2 changes: 1 addition & 1 deletion cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

CLI for CodeForge development workflows. Manages sessions, plugins, configuration, codebase indexing, and devcontainers.

> **Experimental** — v0.1.0. Ships with CodeForge v2.1.1.
> **Experimental** — v0.1.0. Ships with CodeForge v2.1.0.

## Install

Expand Down
2 changes: 1 addition & 1 deletion container/.codeforge/config/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
"code-review@anthropics/claude-code": true,
"feature-dev@anthropics/claude-code": true,
"pr-review-toolkit@anthropics/claude-code": true,
"codeforge-lsp@devs-marketplace": true,
"codeforge-lsp@devs-marketplace": false,
"ticket-workflow@devs-marketplace": true,
"notify-hook@devs-marketplace": true,
"dangerous-command-blocker@devs-marketplace": true,
Expand Down
11 changes: 3 additions & 8 deletions container/.devcontainer/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@

### Scope Guard

- Fix `/dev/null` false positive — redirects to system paths (`/dev/`, `/proc/`, `/sys/`, etc.) are now allowed regardless of the primary command, not just for system commands like `git` or `pip`
- Fix CWD drift — scope root is now persisted on first invocation per session, preventing `cd` commands in Bash from silently changing the enforced scope boundary
- CWD context injector now uses the same persisted scope root, keeping advisory context aligned with enforcement
- Fix false positives blocking writes to system paths (`/dev/null`, `/usr/`, `/etc/`, `$HOME/`) — scope guard now only enforces isolation between workspace projects
- Remove complex system-command exemption logic (no longer needed)

Expand Down Expand Up @@ -76,14 +79,6 @@
- Dedicated port forwarding reference page covering VS Code auto-detect, devcontainer-bridge, and SSH tunneling
- Document `${CLAUDE_PLUGIN_DATA}` variable in CLAUDE.md for future plugin persistent storage

## v2.1.1 — 2026-03-13

### Workspace Scope Guard

- Fix `/dev/null` false positive — redirects to system paths (`/dev/`, `/proc/`, `/sys/`, etc.) are now allowed regardless of the primary command, not just for system commands like `git` or `pip`
- Fix CWD drift — scope root is now persisted on first invocation per session, preventing `cd` commands in Bash from silently changing the enforced scope boundary
- CWD context injector now uses the same persisted scope root, keeping advisory context aligned with enforcement

## v2.1.0 — 2026-03-13

### Spec Workflow v2 — "Spec Packages"
Expand Down
2 changes: 1 addition & 1 deletion container/.devcontainer/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Config files deploy via `.codeforge/file-manifest.json` on every container start

Declared in `settings.json` under `enabledPlugins`, auto-activated on start:

- **agent-system** — 21 custom agents (4 workhorse + 17 specialist) + built-in agent redirection
- **agent-system** — 19 custom agents + built-in agent redirection
- **skill-engine** — 23 general coding skills + auto-suggestion
- **spec-workflow** — 3 spec lifecycle skills (`/spec`, `/build`, `/specs`) + spec-reminder hook
- **session-context** — Git state injection, TODO harvesting, commit reminders
Expand Down
2 changes: 1 addition & 1 deletion container/.devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@
// },
"./features/ast-grep": {},
"./features/tree-sitter": {},
"./features/lsp-servers": {},
"./features/lsp-servers": { "version": "none" },
"./features/agent-browser": {},
"./features/kitty-terminfo": {},
"./features/chromaterm": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agent-system",
"description": "17 custom agents with built-in agent redirection, CWD injection, and read-only bash enforcement",
"description": "19 custom agents with built-in agent redirection, CWD injection, and read-only bash enforcement",
"author": {
"name": "AnExiledDev"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,6 @@ agent-system/
│ └── hooks.json # Hook registrations
└── scripts/
├── redirect-builtin-agents.py # The redirection hook
├── inject-cwd.py # CWD injection for subagents
└── guard-readonly-bash.py # Read-only bash enforcement
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,6 @@ Claude calls the Task tool (spawning a subagent)
| +-> Built-in agent name? -> Rewrite to custom agent
| +-> Already custom? -> Pass through
|
+-> SubagentStart fires (all subagents)
| |
| +-> inject-cwd.py
| |
| +-> Injects working directory as additionalContext
|
+-> Subagent works...
|
+-> TaskCompleted fires
Expand Down Expand Up @@ -119,7 +113,6 @@ Read-only agents (explorer, researcher, architect, etc.) have their Bash access
| Script | Exit 0 | Exit 2 |
|--------|--------|--------|
| redirect-builtin-agents.py | Allow (or rewrite) | Block with error |
| inject-cwd.py | Inject context | N/A |
| guard-readonly-bash.py | Allow command | Block write operation |
| task-completed-check.py | Tests pass | Tests fail (block completion) |
| teammate-idle-check.py | No incomplete tasks | Has incomplete tasks |
Expand Down
18 changes: 9 additions & 9 deletions container/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,9 @@ tree-sitter (JS/TS/Python), ast-grep, Pyright, TypeScript LSP

tmux, agent-browser, claude-monitor, ccusage, ccburn, ccstatusline, ast-grep, tree-sitter, lsp-servers, biome, ruff, shfmt, shellcheck, hadolint, dprint, ccms, notify-hook, mcp-qdrant, chromaterm, kitty-terminfo, claude-session-dashboard

### Agents (17) & Skills (35)
### Agents (19) & Skills (34)

The `agent-system` plugin includes 17 specialized agents (architect, explorer, test-writer, security-auditor, etc.). The `skill-engine` plugin provides 23 general coding skills, `spec-workflow` adds 8 spec lifecycle skills, and `ticket-workflow` provides 4 ticket management skills.
The `agent-system` plugin includes 19 specialized agents (architect, explorer, test-writer, security-auditor, etc.). The `skill-engine` plugin provides 23 general coding skills, `spec-workflow` adds 3 spec lifecycle skills, and `ticket-workflow` provides 4 ticket management skills. 4 plugins are official Anthropic contributions.

## Architecture

Expand All @@ -106,7 +106,7 @@ CodeForge operates in three layers, each building on the one below:

**DevContainer** — The foundation. A Python 3.14 container with Node.js, Rust, and Bun runtimes, plus 23 custom features that install development tools (ast-grep, tree-sitter, biome, ruff, and others).

**CodeForge Layer** — The intelligence. 17 plugins register hooks that validate commands, inject context, and enforce safety. 21 agents provide specialized personas. 38 skills offer on-demand reference material. System prompts and rules shape behavior.
**CodeForge Layer** — The intelligence. 17 plugins register hooks that validate commands, inject context, and enforce safety. 19 agents provide specialized personas. 34 skills offer on-demand reference material. System prompts and rules shape behavior.

**Claude Code** — The AI assistant, executing tools and coordinating work. CodeForge enhances it through configuration — replacing built-in subagents, adding safety guardrails, and wiring up quality checks that run automatically.

Expand All @@ -118,11 +118,11 @@ All configuration lives in `.devcontainer/` and deploys automatically on contain

| File | What It Configures | User-Modifiable? |
|------|--------------------|------------------|
| `config/defaults/settings.json` | Model, plugins, permissions, environment variables | Yes |
| `config/defaults/main-system-prompt.md` | Claude's behavioral guidelines and directives | Yes |
| `config/defaults/keybindings.json` | Keyboard shortcuts | Yes |
| `config/defaults/ccstatusline-settings.json` | Terminal status bar widgets and layout | Yes |
| `config/file-manifest.json` | Which config files deploy and how they update | Yes |
| `.codeforge/config/settings.json` | Model, plugins, permissions, environment variables | Yes |
| `.codeforge/config/main-system-prompt.md` | Claude's behavioral guidelines and directives | Yes |
| `.codeforge/config/keybindings.json` | Keyboard shortcuts | Yes |
| `.codeforge/config/ccstatusline-settings.json` | Terminal status bar widgets and layout | Yes |
| `.codeforge/file-manifest.json` | Which config files deploy and how they update | Yes |
| `devcontainer.json` | Container image, features, runtimes, ports | Yes |
| `.env` | Setup phase toggles (auth, plugins, aliases, etc.) | Yes |

Expand Down Expand Up @@ -177,7 +177,7 @@ npm publish

## Changelog

See [CHANGELOG.md](.devcontainer/CHANGELOG.md) for release history. Current version: **2.0.0**.
See [CHANGELOG.md](.devcontainer/CHANGELOG.md) for release history. Current version: **2.1.0**.

## Further Reading

Expand Down
2 changes: 1 addition & 1 deletion container/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codeforge-dev",
"version": "2.1.1",
"version": "2.1.0",
"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
4 changes: 2 additions & 2 deletions dashboard/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

Session analytics dashboard for Claude Code. Parses JSONL session files into a SQLite database and serves a Svelte 5 SPA for browsing sessions, conversations, plans, tasks, agents, and memory.

> **v0.1.0** — Ships with CodeForge v2.1.1.
> **v0.1.0** — Ships with CodeForge v2.1.0.

## Quick Start

```bash
# Development — starts the Bun backend (port 5173)
# Development — starts the Bun backend (port 7847) and Vite frontend (port 5173)
bun run dev

# Development — starts only the Vite frontend dev server
Expand Down
32 changes: 25 additions & 7 deletions docs/src/content/docs/customization/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The primary configuration file lives at `.codeforge/config/settings.json`. It is

```json
{
"model": "opus",
"model": "opus[1m]",
"effortLevel": "high",
"cleanupPeriodDays": 60,
"autoCompact": true,
Expand All @@ -27,7 +27,7 @@ The primary configuration file lives at `.codeforge/config/settings.json`. It is

| Setting | Purpose | Default |
|---------|---------|---------|
| `model` | Default Claude model (`opus`, `sonnet`, `haiku`) | `opus` |
| `model` | Default Claude model (`opus[1m]`, `sonnet`, `haiku`) | `opus[1m]` |
| `effortLevel` | Response effort (`low`, `medium`, `high`) | `high` |
| `cleanupPeriodDays` | Days before old session data is cleaned up | `60` |
| `autoCompact` | Automatically compact context when it gets long | `true` |
Expand All @@ -41,19 +41,20 @@ The `env` block sets environment variables that configure Claude Code internals:
```json
{
"env": {
"ANTHROPIC_MODEL": "claude-opus-4-6",
"BASH_DEFAULT_TIMEOUT_MS": "240000",
"ANTHROPIC_MODEL": "claude-opus-4-6[1m]",
"BASH_DEFAULT_TIMEOUT_MS": "120000",
"CLAUDE_CODE_MAX_OUTPUT_TOKENS": "64000",
"MAX_THINKING_TOKENS": "63999",
"CLAUDE_CODE_SHELL": "zsh",
"CLAUDE_CODE_EFFORT_LEVEL": "high",
"CLAUDE_CODE_ENABLE_TASKS": "true",
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
}
}
```

See [Environment Variables](../reference/environment/) for the complete list of available variables and their effects.
:::note[Not Exhaustive]
The `env` block shown above is a subset. Many more environment variables are available — see [Environment Variables](../reference/environment/) for the complete list.
:::

### Permissions

Expand Down Expand Up @@ -190,7 +191,7 @@ DevContainer features install runtimes and tools. CodeForge pins external featur
"features": {
"ghcr.io/devcontainers/features/node:1.7.1": { "version": "lts" },
// "ghcr.io/devcontainers/features/rust:1.5.0": { "version": "latest" }, // Opt-in
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0.5": {},
"./features/claude-code-native": {},
"./features/ruff": { "version": "latest" },
// "./features/ccms": {} // Currently disabled — replaced by `codeforge session search`
}
Expand Down Expand Up @@ -251,6 +252,23 @@ When `CLAUDE_AUTH_TOKEN` is set, `setup-auth.sh` creates `~/.claude/.credentials
The `.secrets` file is listed in `.gitignore`. Never commit it to version control. For Codespaces, use [GitHub Secrets](https://docs.github.com/en/codespaces/managing-codespaces-for-your-organization/managing-secrets-for-your-repository-and-organization-for-github-codespaces) instead — environment variables with the same names take precedence over `.secrets` file values.
:::

## disabled-hooks.json

The file `.codeforge/config/disabled-hooks.json` controls per-hook disabling. Add script names to the `"disabled"` array to prevent specific hooks from firing, without disabling the entire plugin:

```json
{
"disabled": [
"git-state-injector",
"ticket-linker",
"spec-reminder",
"commit-reminder"
]
}
```

Changes take effect immediately — no container rebuild required. To re-enable a hook, remove its name from the array. See [Hooks — Per-Hook Disable](./hooks/#per-hook-disable) for details.

## Configuration Precedence

When the same setting is defined at multiple levels, the most specific value wins:
Expand Down
25 changes: 23 additions & 2 deletions docs/src/content/docs/customization/hooks.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,6 @@ Here is a quick reference of all hooks registered by CodeForge's default plugins
| Plugin | Hook Point | Script | Purpose |
|--------|-----------|--------|---------|
| agent-system | PreToolUse (Task) | `redirect-builtin-agents.py` | Swap built-in agents for enhanced custom agents |
| agent-system | SubagentStart | `inject-cwd.py` | Inject working directory into subagent context |
| agent-system | TeammateIdle | `teammate-idle-check.py` | Check incomplete tasks before teammate shutdown |
| agent-system | TaskCompleted | `task-completed-check.py` | Run test suite after task completion |
| auto-code-quality | PostToolUse (Edit\|Write) | `collect-edited-files.py` | Track edited files for batch processing |
Expand All @@ -269,6 +268,7 @@ Here is a quick reference of all hooks registered by CodeForge's default plugins
| auto-code-quality | Stop | `advisory-test-runner.py` | Run affected tests |
| session-context | SessionStart | `git-state-injector.py` | Inject git branch, status, recent commits |
| session-context | SessionStart | `todo-harvester.py` | Surface TODO/FIXME comments |
| session-context | PostToolUse (Edit\|Write) | `collect-session-edits.py` | Track session file edits for context |
| session-context | Stop | `commit-reminder.py` | Remind about uncommitted changes |
| dangerous-command-blocker | PreToolUse (Bash) | `block-dangerous.py` | Block destructive bash commands |
| protected-files-guard | PreToolUse (Edit\|Write) | `guard-protected.py` | Block edits to sensitive files |
Expand All @@ -281,7 +281,28 @@ Here is a quick reference of all hooks registered by CodeForge's default plugins
| spec-workflow | Stop | `spec-reminder.py` | Remind about spec updates after code changes |
| skill-engine | UserPromptSubmit | `skill-suggester.py` | Suggest relevant skills based on prompt content |
| ticket-workflow | UserPromptSubmit | `ticket-linker.py` | Auto-fetch GitHub issues/PRs from `#123` references |
| notify-hook | Stop | (bell/OSC) | Desktop notification when Claude finishes |
| notify-hook | Stop | `claude-notify` | Desktop notification when Claude finishes |

## Per-Hook Disable

Individual hooks can be disabled without turning off their entire plugin. The file `.codeforge/config/disabled-hooks.json` contains a `"disabled"` array of script names:

```json
{
"disabled": [
"git-state-injector",
"ticket-linker",
"spec-reminder",
"commit-reminder"
]
}
```

To disable a hook, add its script name (without path or extension) to the array. To re-enable, remove it.

Changes take effect immediately — no container rebuild or session restart required. This is useful for temporarily silencing noisy hooks or disabling hooks that conflict with your workflow without losing the rest of the plugin's functionality.

See also [Optional Features — Per-Hook Disable](./optional-features/#per-hook-disable) for more examples.

## Related

Expand Down
6 changes: 3 additions & 3 deletions docs/src/content/docs/customization/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Customization works through four layers, each targeting a different aspect of th

| Layer | What It Controls | Key Files | Documentation |
|-------|-----------------|-----------|---------------|
| [Configuration](./configuration/) | Feature flags, plugin toggles, runtime settings, container setup | `settings.json`, `devcontainer.json`, `file-manifest.json` | Settings and deployment |
| [Configuration](./configuration/) | Feature flags, plugin toggles, runtime settings, container setup | `settings.json`, `devcontainer.json`, `file-manifest.json`, `disabled-hooks.json` | Settings and deployment |
| [System Prompts](./system-prompts/) | Claude Code behavior, coding standards, response style | `main-system-prompt.md`, `writing-system-prompt.md` | Behavioral guidance |
| [Rules](./rules/) | Hard constraints applied to all sessions | `.claude/rules/*.md` | Mandatory requirements |
| [Hooks](./hooks/) | Scripts that run at lifecycle points | `hooks.json` + Python scripts | Automation and validation |
Expand All @@ -38,9 +38,9 @@ Edit `settings.json` and change the `model` field:

```json
{
"model": "sonnet",
"model": "opus[1m]",
"env": {
"ANTHROPIC_MODEL": "claude-sonnet-4-5-20250929"
"ANTHROPIC_MODEL": "claude-opus-4-6[1m]"
}
}
```
Expand Down
4 changes: 4 additions & 0 deletions docs/src/content/docs/customization/keybindings.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ Edit `.codeforge/config/keybindings.json` to remap Claude Code actions to non-co

The keybindings file is deployed to `~/.claude/keybindings.json` on container start via `file-manifest.json`.

:::note[Shipped Default]
CodeForge ships with an empty bindings array (`"bindings": []`) in `.codeforge/config/keybindings.json`. No custom keybindings are active by default — add your own entries to the array using the format above.
:::

## Claude Code Shortcut Reference

Full list of default Claude Code shortcuts (these work when Claude Code has terminal focus):
Expand Down
Loading
Loading