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 docs/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ headline differentiators, see the top-level [README](../README.md).
- **Prompts system**: switch between system prompt modes at runtime (`code`, `plan`, `review`, `debug`, etc.). See [prompts.md](prompts.md).
- **Per-prompt tool restrictions**: each prompt (`prompts/<name>.md`) can declare a `deny_tools` frontmatter list. The permission checker refuses those tools while the prompt is active — a real security boundary, not a prose gate. `plan`, `review`, and `review-security` ship with `edit`, `write`, `apply_patch`, `bash`, and `webfetch` denied. See [prompts.md](prompts.md).
- **Subagent support**: `task` tool spawns a subagent for research or general analysis subtasks.
- **Background shells**: the `bash` tool accepts `background: true` to run a command detached — it returns immediately with a shell id and the output is delivered automatically when the command finishes (the same completion-notification channel background subagents use; `task_status` can poll a shell id too). Useful for long-running builds, servers, and watchers that shouldn't block the turn. Tracked in the shared background registry and capped per kind. The status bar shows live counts when any are running: `agents:N` (background subagents) and `shells:N` (background shells).
- **Background shells** (Claude-Code-style): the `bash` tool accepts `background: true` to run a command **detached and unbounded** (for dev servers, watch builds, long-running jobs) — it returns immediately with a shell id. The model reads accumulated output incrementally with the **`bash_output`** tool and stops the shell with **`kill_shell`** (both take the id); an optional `timeout` auto-kills after N seconds. Shells are tracked in a dedicated registry, capped at 8 concurrent, listed by `/tasks`, and killed when the session ends. The status bar shows live counts when any are running: `agents:N` (background subagents) and `shells:N` (background shells).
- **Memory & self-improvement**: persistent per-project memory at `.dirge/memory/` (`MEMORY.md` facts + `PITFALLS.md`), injected into the system prompt as a frozen snapshot. The agent edits it via the `memory` tool. After an idle session, a unified post-session orchestrator runs (in order, fire-and-forget): a background review that extracts learnings into memory + skills, a skills curator and a memory curator (stale-detection + lifecycle + LLM consolidation, with audit reports under each store's `.curator_reports/`), and a cross-session pass that promotes sub-threshold patterns recurring across past sessions.
- **MCP support**: connect MCP servers for extended tooling (optional compile-time feature).
- **Git worktrees**: `/worktree` to create branch-per-task worktrees, `/wt-merge`, `/wt-exit`.
Expand Down
5 changes: 1 addition & 4 deletions src/agent/agent_loop/integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1058,10 +1058,7 @@ mod tests {
use crate::agent::tools::background::{BackgroundStore, TaskState};

let store = BackgroundStore::new();
store.insert(
"sub-1".into(),
crate::agent::tools::background::TaskKind::Subagent,
);
store.insert("sub-1".into());

let saw_reminder = Arc::new(Mutex::new(false));
let saw_clone = saw_reminder.clone();
Expand Down
8 changes: 6 additions & 2 deletions src/agent/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,10 @@ pub async fn build_agent_inner<M: CompletionModel + 'static>(
sandbox.clone(),
cache.clone(),
)
.with_bg_store(bg_store.clone()),
.with_shell_store(Some(tools::bg_shell::global())),
),
Box::new(tools::BashOutputTool::new(tools::bg_shell::global())),
Box::new(tools::KillShellTool::new(tools::bg_shell::global())),
Box::new(tools::GrepTool::with_cache(
permission.clone(),
ask_tx.clone(),
Expand Down Expand Up @@ -759,11 +761,13 @@ pub async fn build_loop_tools(
sandbox.clone(),
cache.clone(),
)
.with_bg_store(bg_store.clone()),
.with_shell_store(Some(tools::bg_shell::global())),
Some(ToolExecutionMode::Sequential),
)
.await,
);
tools.push(wrap(tools::BashOutputTool::new(tools::bg_shell::global()), None).await);
tools.push(wrap(tools::KillShellTool::new(tools::bg_shell::global()), None).await);

// Read-only batch.
tools.push(
Expand Down
Loading
Loading