eb3467d06a60f0930e7e6ec6a853687f710d02ec
97 findings to zero. Most were mechanical — 52 unsorted import blocks, 10 unsorted __all__, assorted pyupgrade and simplify hints. Two were not, and both were visible only because the lint made me look. `webber version` did not exist. src/cli/commands/version.py defines show_version(), main.py imported it, and the registration line was never written — the CLI exposed chat and explore only. The import carried `# noqa: F401`, which is what kept the omission quiet: someone marked the symptom as intentional instead of asking why it was unused. show_version is not redundant with the --version flag; it prints the resolved Ollama URL, model and debug state, which is the form worth having when something is misconfigured. Registered, and the suppression dropped because the import is now genuinely used. test_spawn_explore_agent asserted nothing. It built a mock RunContext, patched get_agent, and stopped at the comment "For now, verify the explore agent would be called correctly". It had been counted as a passing test. An AST sweep of all 238 test functions found it was the only one, which is worth knowing — the problem was contained, not systemic. It is now skipped with a reason, so it reports as unfinished rather than as passing. Reducing it rather than deleting its imports was the point: tidying the imports would have made a hollow test look clean. Two findings were false positives, and both are recorded rather than silently worked around: B023 flagged run_agent closing over full_prompt and ctx. Traced: agent_task is awaited at line 326 before `continue` reaches the next iteration, so neither name can be rebound while the closure is pending, and the exception path cancels and awaits too. Not a bug. Bound as defaults anyway, because that stays true if the await ever moves. I had called it a live bug before tracing it, which is the mistake Rule 5 exists for. RUF012 flagged `rules: list[ApprovalRule] = []` on ApprovalRuleSet. Its suggested fix — annotate ClassVar — would remove the field from the model. ApprovalRuleSet is a pydantic model and pydantic deep-copies defaults per instance; verified by constructing two and confirming their lists are distinct objects. Suppressed with that evidence in the comment. Ruff cannot see the pydantic base because BaseSchema is a local subclass of BaseModel. Also moved a stray `from src.shared.logging import ...` that had drifted below a function definition, and merged a nested if in the ollama provider. 215 passed, 23 skipped, unchanged except for the new skip. `webber version` exercised end to end. mypy is NOT addressed here and the gate still fails on it — 55 errors in 14 files, 35 of them no-any-return from pydantic_ai's untyped returns. That was hidden behind ruff, because the gate stops at the first failing stage. Co-Authored-By: Claude <noreply@anthropic.com>
Webber - Multi-Agent AI Development System
A Claude Code-inspired development assistant powered by local LLMs via Ollama.
Features
- 3 Agents - Explore (read-only), Plan (architecture), Task (orchestrator)
- 8 Tools - File read/write/edit, glob, grep, bash, web search
- Conversations - Multi-turn memory with context summarization
- Streaming - Real-time response display
- Self-hosted - Runs on your own hardware with Ollama
Structure
This is a monorepo containing three subprojects:
| Directory | Description |
|---|---|
webber-api/ |
FastAPI backend server with agent orchestration |
webber-cli/ |
Command-line client for interacting with the API |
webber-sandbox/ |
Test project for functional testing |
Additional Directories
| Directory | Description |
|---|---|
sandbox-templates/ |
Reusable project templates for the sandbox |
.gitea/workflows/ |
CI/CD workflows for releases |
Quick Start
1. Start the API Server
cd webber-api
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt
./wakeup.sh
2. Set Up the CLI
cd webber-cli
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install -e .
# Test connection
webber-cli status
3. Explore with Webber
# One-shot exploration
webber-cli explore "find all bugs in the code" -d /path/to/project
# Interactive chat
webber-cli chat -d /path/to/project
Available Tools
| Tool | Description |
|---|---|
read_file |
Read file contents with line numbers |
glob_files |
Find files by pattern |
grep_content |
Search file contents with regex |
bash_readonly |
Safe bash commands (ls, git status, etc.) |
edit_file |
Find-and-replace editing |
write_file |
Create/overwrite files |
bash |
Full bash with safety controls |
web_search |
Search web via SearXNG |
Agents
| Agent | Purpose | Tools |
|---|---|---|
| Explore | Fast codebase navigation, search | Read-only (glob, grep, read, bash_readonly) |
| Plan | Design implementation strategies | Read-only (same as Explore) |
| Task | Autonomous multi-step execution | All tools + spawn_agent |
API Endpoints
# Stateless agent execution
POST /agents/run # Execute agent, get response
POST /agents/stream # Execute with SSE streaming
GET /agents/ # List available agents
# Stateful conversations (multi-turn memory)
POST /conversations/ # Create conversation
GET /conversations/ # List conversations
POST /conversations/{id}/messages # Add message, get agent response
Versioning
This project uses prefixed tags for independent release cycles:
api/v0.4.0- Triggers API Docker build and deploymentcli/v0.1.0- Triggers CLI installer build (future)
Requirements
- Python 3.12+
- Ollama running with
gemma4:e2bmodel - Docker (for production deployment)
- SearXNG (optional, for web search)
Documentation
CLAUDE.md- Agent development guidelines (repo-wide)webber-api/docs/COVERAGE.md- Feature coverage and roadmapwebber-api/docs/architecture.md- System architecturewebber-cli/README.md- CLI usage guide
License
MIT
Releases
5
API Release v1.1.0
Latest
Languages
Python
97%
Shell
2%
Makefile
0.9%
Dockerfile
0.1%