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
10 changes: 6 additions & 4 deletions .claude/skills/verify/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ dispatch = "echo usage limit reached # {prompt_file}" # cap phrase -> capped
```

The dispatch template must contain `{prompt_file}` or config validation
rejects it. Capped detection matches "usage limit", "rate limit", or
"quota exceeded" in the log tail (`crates/voro/src/reconcile.rs`).
rejects it. Capped detection matches the signatures in
`crates/voro-core/src/cap.rs` (`CAP_SIGNATURES` — "usage limit",
"session limit", "weekly limit", …) against the log tail.

## Driving the TUI

Expand All @@ -59,8 +60,9 @@ broken for non-interactive use — call `/bin/tmux` directly:
/bin/tmux -L <socket> kill-server
```

`r` refreshes in place after CLI mutations from outside; `PAGER` is honoured
by the `l` log key, so setting it to `less` keeps the pager capturable.
`ctrl-r` refreshes in place after CLI mutations from outside (`r` is the
refine key); `PAGER` is honoured by the `l` log key, so setting it to `less`
keeps the pager capturable.

A scratch store opens empty — the fixture seeds only the dev store — so the
first capture of an unseeded run shows a board with no projects and no tasks.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[![docs.rs](https://img.shields.io/docsrs/voro-core)](https://docs.rs/voro-core)
[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](LICENSE-MIT)

An attention based session manager for AI-assisted development across many
An attention-based session manager for AI-assisted development across many
projects. Voro tracks tasks per project, weights each project by how much it
matters *today*, and answers one question: **where should your attention go right
now?**
Expand Down
30 changes: 13 additions & 17 deletions crates/voro-core/src/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,10 @@ pub const VIEWER_BASE_PLACEHOLDER: &str = "{base}";
/// deliberate: a verb is an opaque per-agent contract, which is exactly what
/// lets an agent define a subset of them and degrade per-verb. `codex` defines
/// no `message` and the TUI's quick-message key says so on the status line.
/// It resumes the session in place rather than forking it
/// ([`NEW_SESSION_PLACEHOLDER`], which the verb no longer carries): a
/// `claude --bg` session keeps its supervisor process after finishing its turn,
/// and that supervisor refuses a headless `--resume` for as long as it lives —
/// so Voro releases it at rest instead, through `stop`, and the send then lands
/// on the session's own reference (DESIGN.md §8). A fork would land too, but it
/// moves the conversation out from under the name Voro composed for it, and that
/// name is how the operator addresses the session everywhere outside Voro.
/// A `claude --bg` session keeps its supervisor process after finishing its
/// turn, and that supervisor refuses a headless `--resume` for as long as it
/// lives — Voro releases it at rest through `stop`, so the send lands on the
/// session's own reference (DESIGN.md §8).
///
/// It carries `--permission-mode` for the same reason `dispatch` does: the mode
/// belongs to a launch rather than to a verb (DESIGN.md §8). The flag is per
Expand Down Expand Up @@ -1938,7 +1934,7 @@ mod tests {
}
}

// --- plan verb (task #112) ---
// --- plan verb ---

#[test]
fn plan_parses_resolves_and_is_optional() {
Expand Down Expand Up @@ -2386,9 +2382,9 @@ mod tests {
assert_eq!(rendered.command, "say '{prompt_file}' '/run/m.md'");
}

/// A stale `continue` line — from a pre-pivot config or the old codex
/// built-in — is now an unknown field, so the config is refused rather than
/// silently honouring a verb Voro no longer runs (DESIGN.md §6/§8).
/// A `continue` line is an unknown field, so a config carrying one is
/// refused rather than loading with a verb Voro never runs (DESIGN.md
/// §6/§8).
#[test]
fn a_continue_verb_is_now_an_unknown_field() {
let text = r#"
Expand Down Expand Up @@ -2511,8 +2507,8 @@ mod tests {
/// Nothing installed, nothing configured: the failure asks for the one
/// thing the operator can act on — register the viewer they already use —
/// and only then says what was probed. It never tells them to install an
/// editor, and never calls the config file invalid: it may not even exist
/// (#405).
/// editor, and never calls the config file invalid: it may not even
/// exist.
#[test]
fn viewer_resolution_errors_with_guidance_when_nothing_resolves() {
let message = config()
Expand Down Expand Up @@ -2812,7 +2808,7 @@ mod tests {
assert!(agents["codex"].resume().is_some());
}

// --- launch identity and rendered commands (task #326) ---
// --- launch identity and rendered commands ---

/// A dispatch of task 7 with a fixed prompt file, so a rendered command is
/// a stable string to assert on.
Expand Down Expand Up @@ -3228,8 +3224,8 @@ mod tests {
);
}

/// What a headless launch records on its session row (DESIGN.md §8, task
/// #387): an agent with a `sessions` verb may hand the work to a supervisor,
/// What a headless launch records on its session row (DESIGN.md §8): an
/// agent with a `sessions` verb may hand the work to a supervisor,
/// so its listing is the authority; one without has only the pid Voro
/// spawned.
#[test]
Expand Down
4 changes: 2 additions & 2 deletions crates/voro-core/src/config_edit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ cmd = \"git -C {path} difftool -d {base}...{branch}\" # inline note

/// A built-in viewer lives in the binary, so the write helpers cannot touch
/// it — but they can be told to override it, and it is a legitimate default
/// with no table of its own (#405).
/// with no table of its own.
#[test]
fn built_in_viewers_are_unwritable_but_overridable_and_defaultable() {
let dir = scratch("builtin");
Expand Down Expand Up @@ -446,7 +446,7 @@ cmd = \"git -C {path} difftool -d {base}...{branch}\" # inline note

/// Naming the editor is enough: the command a new operator has no way to
/// guess is assumed, and naming a built-in starts from what it replaces
/// rather than from a worse guess at the same thing (#405).
/// rather than from a worse guess at the same thing.
#[test]
fn a_viewer_added_with_no_command_gets_the_obvious_one() {
let dir = scratch("assumed");
Expand Down
8 changes: 4 additions & 4 deletions crates/voro-core/src/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1600,7 +1600,7 @@ impl Store {
self.session(id)
}

/// Record the agent's own reference for a session (task #75), captured
/// Record the agent's own reference for a session, captured
/// after launch — the row necessarily exists before the reference does,
/// so this is an update rather than a `create_session` parameter.
pub fn set_session_ref(&mut self, id: i64, session_ref: &str) -> Result<Session> {
Expand Down Expand Up @@ -1716,7 +1716,7 @@ impl Store {
/// `refining`, or `waiting` task, joined with its open session if it has
/// one. The strip filters on task *state*, so `review`/`needs-input` tasks
/// (session still open) do not appear, while a refine in flight and a
/// handed-off task both do — an open session no longer implies executing
/// handed-off task both do — an open session does not imply executing
/// the task (§8), and what the strip shows is work in flight that someone
/// else owns. A hand-started task with no session shows with `session_id`/
/// `agent` `NULL`. The one-open-session invariant (§8) bounds the join to one
Expand Down Expand Up @@ -2787,7 +2787,7 @@ mod tests {
);
}

// --- the deep flag (task #241) ---
// --- the deep flag ---

fn deep_new(project_id: i64, human: bool, deep: bool) -> NewTask {
NewTask {
Expand Down Expand Up @@ -4329,7 +4329,7 @@ mod tests {
}

/// Each launch records which source reconciliation must read it by
/// (DESIGN.md §8, task #387), and it survives the round trip: a headless
/// (DESIGN.md §8), and it survives the round trip: a headless
/// launch under a supervisor is listing-authoritative, an interactive round
/// is not, and neither is inferred from anything else on the row.
#[test]
Expand Down
Loading