All tools now receive arguments as a JSON object on stdin instead of
positional CLI args. Each tool declares its schema via # args_json:
header comment.
New shared helpers:
- _lib/args.py: Python parse_args() -> Args with require/get/get_bool/etc
- _lib/args.sh: Bash arg_require/arg_get/arg_bool via jq
Removed denote_view (unused).
Updated WRITING_TOOLS.md to document the new contract.
All tools in ./tools/ now output a JSON schema when arguments fail
to parse, instead of raw usage strings. Formats handled:
- echo/print usage replacement
- dollar-brace-var-colon-? usage expansion to if-statements
- die() function replacement
- argparse ArgumentParser subclass with error() override
Deleted env (use shell instead) and grep (use file_grep instead).
Removed root-level /tools from 9P filesystem listing.
Migrate usage documentation from separate tools-*.md prompt files
into the tool scripts themselves via ollie:prompt...ollie:end blocks.
BuildRuntime automatically extracts and appends these to the preamble.
Migrated: file_read, file_write, file_edit, file_glob, file_grep,
lsp_definition, lsp_references, lsp_hover, lsp_rename, lsp_symbols,
lsp_diagnostics, lsp_completion, reasoning_think, memory_remember,
memory_recall.
Replace Makefile/mkfile with justfile (just command runner).
Move tools from kde/tools to root (uses physical paths, not 9P).
Add process_*, env, grep tools that were missing from submodules.
just: 9P path (default), just dbus: D-Bus path.
- prompts/, skills/, tools/ removed from monorepo root
- 9p/: gains prompts/skills/tools with 9P filesystem API (unchanged)
- kde/: gains prompts/skills/tools rewritten for D-Bus API
- mkfile: data target no longer installs prompts/skills/tools
- 9p/mkfile: install target now includes data (prompts/skills/tools)
- kde/Makefile: all target now includes data (prompts/skills/tools)
- SYSTEM_PROMPT_QWEN and SYSTEM_PROMPT_DEVSTRAL updated in both
submodules to include the operational world model
system prompt: require task list for multi-step work
agents: remove preTurn hook; rely on agentSpawn prime + system prompt
backend: require OLLIE_BACKEND/OLLIE_MODEL env vars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tools/file_*: hard-fail when OLLIE_SESSION_ID is unset; surface errors
on all failure paths including dir checks, marker cleanup, and I/O
- tools/file_read: treat nonexistent path as new file (emit "(new file)",
write empty marker) so file_write can create new files
- tools/file_write: colorize new-file lines with + (U+FF0B)
- tools/file_glob, file_grep, memory_*, task_*: consistent error handling
and output to stdout so the model sees all failures
- tui/diffcolor.go: match +/− (U+FF0B/U+2212) lookalikes emitted by
file_edit/file_write; fix +++ / --- header pattern
- prompts: prohibit execute_code for file creation/modification;
enforce execute_tool with file_write/file_edit instead
- core submodule: surface isError from MCP responses; inject
OLLIE_SESSION_ID into execute server at session creation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The temp file + os.replace() (rename) pattern fails on FUSE-mounted paths
(e.g. $OLLIE/sk/, $OLLIE/pl/) because the 9P server doesn't implement Twstat.
Write directly to file_path instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>