Every argument in every mcptools script is now a named flag (--mount,
--id, --agent-id, --session-id, --cwd, --child, --repo, --ticket, etc.).
No positional arguments remain. SKILL.md files updated to match.
Also updates cmd/Assist/main.go to pass --cwd flag to mount_beads.sh.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace positional optional args with named flags to eliminate
argument conflation bugs. Update SKILL.md to document new flags
and new atomic operation scripts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The update ctl command now rejects fields managed by atomic operations
(status, assignee, closed_at, close_reason, defer_until) with a hint
pointing to the correct command. update_bead.sh is restored with valid
fields documented in the header.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New beads created via the 9p interface now start as deferred instead
of open. Planning/human review is required to promote a bead to open
before the scheduler can assign it to a worker.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Look up and display a denote document by identifier. Accepts both
bare identifiers and denote:{identifier} format. Searches ~/doc
recursively.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Simplify: the optional friendly name parameter is removed. UUID first
segment is always the mount name; mtab provides the path mapping.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All bead mutation scripts now echo a descriptive confirmation after
a successful 9p write. set -euo pipefail ensures the echo only runs
if the write succeeded.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use readFile() to fetch the script over the existing 9p connection,
then pipe it to bash -s. Removes dependency on the 9p CLI binary.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add ~/.local/share/anvillm to sandbox write allowlist so agents can
archive mail. Remove scripts/mail_history.sh (superseded by
mcptools/mail_history.sh).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace direct beads/ctl write with mount_beads.sh subprocess call.
UUID-based mount names are now generated by the script; the returned
name is captured and used as windowMount. Optional friendly name is
passed through for display only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Avoids ambiguity with directory-based names (e.g. "main" is not unique
across projects). First segment of uuidgen (8 hex chars, 32-bit entropy)
is sufficient for personal dev environments. Optional friendly name
printed alongside UUID for human reference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
mail_history.sh: renamed from search_mail.sh; displays message history
for an agent by date. Name reflects actual behavior — search is the
caller's job.
mail_search.sh: thin wrapper around mail_history.sh + grep -E for
regex search over formatted history output.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The 9P client splits writes larger than msize into multiple Twrite
messages with increasing offsets. The server was dispatching each
Twrite immediately, so only the first chunk was ever processed —
causing JSON parse failures for payloads exceeding msize.
Fix: accumulate all Twrite data into a per-fid writeBuf, then dispatch
the fully-assembled payload in Tclunk. Tclunk can return Rerror if
dispatch fails, preserving error reporting to the caller.
This unblocks large bead descriptions/comments and message bodies
without any msize negotiation changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove dead streaming code: reader(), waitForReady(), StartupHandler, pipe-pane
- Switch recovery metadata from session-scoped set-environment to window-scoped set-option -w @key
- Sessions now start in idle state immediately (no startup wait)
- inbox_refresh.py: watches agent/events for UserRecv, refreshes /AnviLLM/inbox acme window
- msgtrace.py: display agent alias (when set) instead of ID, show role parenthetically
- list_beads.sh/list_ready_beads.sh: filter to id,priority,title,status
- Add read_bead_comments.sh tool and Comments view in Assist
- Simplify Assist filters to All/Ready (was 6 status filters)
- Server-side filtering: list excludes closed at DB, ready uses GetReadyWork
- Default limit 100, DB-level filtering
- Atomic blockers= support in new command
Extend proactive discovery with two new passes before the existing
intent-based pass:
1. CWD-based: extract project keywords from basename(PWD) and run
discover_skill on each segment (e.g., pcloudcc-lneely → pcloudcc)
2. Activity-based: infer task type (testing, debugging, docs, etc.)
and map to discovery keywords
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use execute_elevated_bash (superpowerd) to start/stop the pcloudcc
daemon outside the sandbox instead of asking the user. Add explicit
rule to always use -d when starting the daemon.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Parse args as JSON string fallback when LLM passes args incorrectly
- Update SKILLS_PROMPT and agent docs to use unquoted args syntax
- Install team-templates under $INSTALL_PATH/Teams instead of hardcoded $HOME/bin/Teams
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- roles/conductor.md: discover roster before planning; adapt workflow
to available roles (dev-only, dev+review, dev+review+test, etc.);
drive iterative cycles; parallelize across multiple same-role bots;
report skipped phases instead of blocking on missing roles
- team-templates/debug: new workflow with conductor+developer+tester;
blocks until all roles are idle before returning
- list format: replace model field with role (field 5) in agent/list;
update Assist, anvillm, anvilwebgw, list_sessions.sh accordingly
- Assist /AnviLLM/: replace Model column with Role in session list
If context is written after the first mail nudge has already fired,
initialPromptSent was already true and the context would never be
injected. Resetting it on SetContext ensures the context is always
prepended to the next prompt regardless of timing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The wakeup channel caused duplicate message delivery: inbox delivery
and idle state transitions both signaled an immediate wakeup with
bypassIdleCheck=true, prompting bots before they were ready.
Replace with a simple 5-second ticker. The idle threshold is always
applied, eliminating the race condition. Worst-case delivery latency
is 10 seconds (one tick to drain outboxes, next tick to prompt).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove bot-templates/ entirely
- Add scripts/anvilspawn: spawn a bot by role+workdir, hash-prefixed alias
ties bots to the same workdir for organic collaboration
- Add roles: solo-developer, developer, reviewer, tester, devops, author,
technical-editor, researcher, taskmgr
- Standardize all roles to: Responsibilities / Prohibited Activities /
Workflow / Response Format
- Remove explicit delegation protocols from all roles; delegation is emergent
- Remove inbox-check startup steps; messages are delivered automatically
- Update mkfile to install anvilspawn
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Instead of silently setting context on the session, writing to
agent/{id}/role now: validates the role exists in RolesFS (returning
"role not found" on failure), sets the role name on the session, and
delivers the role definition as a PROMPT_REQUEST from "user" to the
bot's inbox. The wakeup mechanism fires immediately via the onRecv
callback.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add wakeupCh (buffered 1) to session.Manager. The mail processing loop
now selects on both the 5s ticker and the wakeup channel. Two events
signal the wakeup: a message delivered to any bot inbox (via onRecv
callback), and a session transitioning to idle with pending messages
(via OnStateChange). When woken, processMailboxes bypasses the
idleDuration threshold check. This covers all delivery paths including
direct DeliverToInbox calls from the supervisor.
Also flatten p9/roles to match p9/skills: remove focus-area directory
layer, expose roles as a flat <name>.md listing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a third execution mode: pipe accepts an ordered array of stages
{tool?, args?, code?} and chains them as a Unix pipeline. Tool stages
are read from 9P (trusted); inline code stages are validated individually
before the pipeline is assembled, so the combined string always runs as
trusted regardless of mix. readTool moved from main.go to execute.go.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On crash restart:
- Reset initialPromptSent flag so context gets re-injected
- Send 'Continue working.' inbox message from user to session
- Add OnCrashRestart callback to Session struct