Repository navigation
Releases
Release v1.2.0
Release v1.2.0
This release redesigns the Desktop Harness (Night Galley) and lets a small
local model spend more compute per task: candidate patches are checked in a
scratch copy, failures go back to the model, and several samples compete on
the real checks.
Added
- Small-model quality through compute:
delegate_codeand the CLI accept
repair_rounds(default 2),samples(best-of-N, selected by the checks),
strategy(single,per_file,tests,plan),max_model_callsand an
explicitthinkopt-in. Each candidate is applied and checked in an
isolated scratch copy before anything touches the workspace. Benchmark
cases, oracles and a judge measure the modes;RUNTIME_TIPS.mdcollects
runtime tuning recipes. - Night Galley desktop redesign: scheme selection, theme presets and a
custom palette wheel with contrast checks on the server; a collapsible mode
selector; a separate diff viewer with file headers; selectable delegated
tasks. - Help tab: user documents ship in the wheel and the sidecar and appear in
the desktop Help tab, with About and a FAQ.local-agent help-docs [slug] --jsonlists and prints them from the terminal. - Frameless window: the top strip is the title bar, with Windows 11 Snap
Layouts on the maximize button. - App icon: the retro computer from
docs/brand/retro-computer.svgis the
Desktop Harness and installer icon. The README opens with a dark and light
banner.
Changed
- Release builds of the desktop shell use the Windows GUI subsystem: no
console window. - Tests and build tools moved to
dev/testsanddev/tools.
Fixed
- Apply and Rollback report the true outcome and the rejection cause, act on
the item the pane shows, and keep unsaved replies in the transcript. A
refusal before any write reportsworkspace_state: "original". parse_unified_diffcounts hunk lines against the@@header, so the
allowlist check sees every filegit applywould change. Lines past the
header counts are reported as an error, becausegit applysilently drops
them.- The sidecar no longer hangs Help and
/api/status: child processes stop
inheriting its stdin pipe. With--exit-on-stdin-closeit stops when the
shell exits. - The headless readiness line is written as UTF-8 whatever the console code
page. - An LF patch now applies to a CRLF file on Linux and macOS too, and the file
keeps its CRLF endings. Before, it applied only where Git converts line
endings (Git for Windows setscore.autocrlfsystem-wide).
Security
- GET requests to the desktop server check the Host header against the
loopback allowlist, like POST, so a DNS-rebinding page cannot read/app
and its token. - Links from Help open in the system browser only for an allowlist of sites.
Release v1.1.1
Release v1.1.1
This release prepares the package for the official MCP Registry
(io.github.pvnc228/local-coding-agent) and makes the MCP server start from a
bare uvx local-coding-agent serve-mcp.
Added
- MCP Registry metadata:
server.jsondescribes the PyPI package, its
stdiotransport and theserve-mcparguments. The README carries the
mcp-name:marker the registry uses to verify PyPI ownership.
tests/test_version_consistency.pykeeps both in step withpyproject.toml.
Changed
- The MCP SDK (
mcp==2.0.0) is a core dependency. Registry clients launch the
package without extras, so the server previously could not import its SDK.
The[mcp]extra remains for existing install commands. delegate_codeaccepts an omittedmodel_profileand falls back to the
server's--profile.
Fixed
serve-mcpignored--profileand--endpoint, althoughinit-mcp
writes--profileinto every generated client config. Both now reach the
delegation service;--endpointoverrides the endpoint of every resolved
profile.
Release v1.1.0
Release v1.1.0
This release makes "applied" mean one thing everywhere. The service, the CLI,
and the desktop harness previously had three different apply paths, and only the
service enforced the full gate — the CLI could apply a patch with no declared
scope and no test at all. All three now go through one controller-owned gate.
Security
- One verified apply gate:
mediated_apply(local_coding_agent/controller/_post_apply.py)
now backs the service, CLI, and desktop apply paths. A patch must declare its
file scope, parse as a unified diff, passgit apply --check, and clear
semantic lint before the workspace is mutated. - No evidence, no apply: an apply with no targeted check is refused with
apply_requires_checkson every surface. Previously the CLI accepted
local-agent apply --patch-file p.diff --workspace .with no check at all and
reported success. - Verified rollback: the SHA-256 baseline of every file the patch changes is
recorded before applying. A rollback is only reported as clean when the
baseline is actually restored; otherwise the result carries
workspace_modified: true,workspace_state: "unknown", and risk kind
rollback_failedinstead of a false success.
Fixed
- Desktop apply no longer reports unverified success. The "Applying &
Verifying:" path trusted an inline command loop and the rawgit apply
exit code. It now returns the gate'sstatus,checks, androlled_back
fields, and recordslast_applied_files/last_applied_patchonly when the
patch is genuinely applied.
Breaking
local-agent applyrequires the declared scope via--file(repeatable); a
patch touching an undeclared file is rejected withpatch_outside_scope. The
command exits0only whenappliedistrue.- The desktop apply action requires a check command. The UI asks for it when a
session has none instead of silently defaulting topytest. - A patch file whose hunk contains a trailing blank line is now rejected as
patch_parse_failed. The CLI previously did not parse the diff at all.
Added
- PyPI Trusted Publishing: a
publish-pypiCI job publishes the built
distributions after the GitHub Release is published, usingid-token: write
and no stored token. The action is pinned to a commit SHA. - Desktop client asks for the verification command and remembers the last one
entered.
Corrections
- The
0.5.xfield report claimed "100% first-turn success" and
"100% confidence ... zero regressions across the 290-test test suite".
Those are point estimates from a single-model development run, not measured
rates, and are withdrawn. The measured figures are the 20-task suite in
docs/BENCHMARK.md:qwen3.8-27b-q4at 100.0% correctness
(95% Wilson interval [83.9%, 100.0%]) andqwen3-8b-q6kat 90.0%
([69.9%, 97.2%]). The narrow wording is the honest one.
Release v1.0.4
Release v1.0.4
This maintenance release hardens the Windows desktop server and publishes the CLI and Windows Desktop Harness artifacts.
Fixed
- Bounded desktop request framing: malformed, negative, partial, and oversized
Content-Lengthvalues are rejected before any state mutation. Incomplete bodies use a bounded idle timeout, and unsynchronized sockets are closed explicitly. - Stable rejected POST responses on Windows: ordinary rejected mutations still return
403after a bounded body drain, avoiding a connection reset while preserving the no-mutation guarantee.
Changed
- Synchronized release metadata: Python, MCP, npm, Tauri, Cargo, README, and changelog metadata are aligned on
1.0.4. - Windows desktop release gate: CI built and checked the NSIS installer, transferred it as a workflow artifact, and published it with the wheel, source archive, and SHA-256 inventory after the tag/version guard and test matrix passed.
Published assets: CLI wheel, CLI source archive, Windows NSIS installer, and SHA256SUMS.txt.
Local Coding Agent v1.0.3
This release makes local delegation safer and more predictable when a cloud coding agent hands work to a model on your machine. Local Coding Agent remains the controlled local execution path for Codex, Claude Code, Cursor, Windsurf, Cline, OpenCode, Antigravity, and other compatible harnesses through MCP, the Agent Skill, or the CLI.
Fixed
- Safer patch application: applying a proposal now rolls it back when a check runner times out or raises an operating-system error. A failed rollback is reported as an unknown workspace state instead of being presented as a clean failure.
- Safer parallel drafting:
--speculative-draftscannot apply competing patches to the same workspace. Drafts stay proposal-only until one result is selected. - Reliable task recovery: a task interrupted by restart now returns a terminal
process_interruptedresult instead of appearing to run forever. - Accurate local-model status: unknown GPU memory, model identity, context fit, telemetry, and backend state stay unknown. The desktop app no longer fills gaps with invented values or treats a policy cap as a model's verified context limit.
- Stricter local backend handling: incomplete or malformed streamed responses now fail visibly; a missing or ambiguous local model is no longer silently substituted with a similarly named model.
- Honest readiness and smoke results: a failed live backend check stays a failed live check. Mock execution requires an explicit mock or fallback option and is labelled as synthetic.
- Safer configuration and session files: malformed MCP configuration and session data are preserved and reported instead of being silently replaced. Successful writes use an atomic replace in the same directory.
- Clearer task intent: ambiguous requests, guessed source files, guessed test runners, and incomplete build scopes now ask for context instead of creating a change task from assumptions.
- Correct review and tool feedback: malformed tool calls are reported without discarding valid calls from the same response; missing model summaries no longer become a fabricated successful completion.
- Faithful desktop text: code snippets containing dollar signs or backslashes keep their literal text and copy correctly.
- More dependable local launches: a request that cannot fit in the available context is rejected before it disturbs a running local backend, and local
llama-serverdiscovery works consistently with standard executable names across Windows, macOS, and Linux. - Stable Windows model identity: the same GGUF model path keeps one ID even when Windows returns its drive or folders with different letter casing.
- More reliable interactive tasks: terminal output is collected with a short bounded wait, avoiding false failures when a local Python or shell process needs a moment to start.
Changed
- Release checks now run the project test suite with pytest, so module-level pytest tests are no longer skipped by the CI and release workflows.
- Python wheels now include the desktop CSS and JavaScript assets and the release workflow checks the built wheel before publishing it.
- README starts with the integration story: it now explains how a cloud coding harness delegates narrowly scoped work to a local model while the controller enforces workspace, patch, and check boundaries.
Local Coding Agent v1.0.0 — CLI + Desktop Harness
Local Coding Agent 1.0.0 is a complete local coding workspace for practical development with local AI models. The Windows Harness brings Interactive Chat, Build, Plan, and Auto modes together with workspace sessions, model management, diagnostics, and task delegation in one application.
Downloads
CLI release — terminal package
Choose the CLI package for terminal workflows, scripts, CI, automation, and integrations with other AI coding environments.
Desktop Harness release for Windows
Choose the Windows installer for the complete graphical application. It includes the CLI and task-delegation capabilities automatically, so no separate Python or CLI setup is required.
Both packages use the same local-first coding foundation. The CLI is for terminal work; the Desktop Harness is the ready-to-use Windows experience.
Release v0.8.2
Release v0.8.2
🛠 Fixed
- Cross-platform CI green again: repaired three platform-dependent/flaky test assumptions (POSIX process-group assertion vs
/bin/shfork-vs-exec behavior, spill-store path comparison against unresolved macOS/Windows temp dirs, MCP tasks lifecycle teardown racing the background worker) in PR #9; no production code changed.
🚀 Headline Features
- Standalone Desktop AI Coding Harness (
local-agent desktop) (R23):- High-precision engineering cockpit with native WebView2 / system browser fallback.
- Interactive chat arena, delegated task queue, real-time hardware telemetry (
nvidia-smi), and model management.
- Tool Output Spill Store, Ripgrep & FS Observation Policy (R24):
local_coding_agent.spill: Session-scoped private storage (.local_agent/spill/<session_id>/) with automatic spilling for outputs exceeding 30KB / 1,000 lines.local_coding_agent.ripgrep: Directrg --jsonsubprocess execution with full quoting safety and transparent pure-Python stdlib fallback.local_coding_agent.observation_policy: Enforces strict read-before-edit invariant (FS_NOT_OBSERVED), preventing blind model hallucinations.- CLI subcommands:
local-agent spill-read <locator> [--offset N] [--limit N] [--json]andlocal-agent grep <query> [paths...] [--regex] [--json].
- Generic LSP Stdio Code Intelligence Seam (
local_coding_agent.lsp) (R25):- Standard JSON-RPC stdio language server protocol client with Content-Length framing.
- Multi-language server router (
pyright,typescript-language-server,rust-analyzer,gopls) and built-in AST/regex fallback engine. - Operations:
definition,references,hover,symbols. - CLI subcommand:
local-agent lsp --operation {definition|references|hover|symbols} --file <path> [--json].
- Persistent PTY Terminal Seam & Interactive Process Control (
local_coding_agent.terminal) (R26):- Persistent background interactive shell / process wrapper with circular scrollback buffers and non-blocking I/O.
- Cross-platform process tree termination and signal delivery (
SIGINT/Ctrl+C,SIGTERM). - Model tool suite:
terminal_open,terminal_send,terminal_read,terminal_signal,terminal_list,terminal_close.
- Plan Mode Controller, Structured Questions & Dynamic Checklist (
local_coding_agent.plan_mode) (R27):- Formal Plan Mode state machine enforcing read-only tool policy during exploration until human approval.
- Interactive multiple-choice
ask_user_questiontool with default write-in and programmatic simulation. - Dynamic
todo_writechecklist tool with single-active task discipline and ASCII/Markdown rendering.
- Event-Sourced Session Engine & SQLite FTS5 Search Index (
local_coding_agent.session_events,local_coding_agent.session_query) (R28):- Append-only immutable typed session events enforcing the Model-Visible ⟺ Logged invariant.
- Session forking (
fork_session) for time-travel replay and causal branch pruning. - SQLite FTS5 search index with injection-proof sanitization across historical session records.
- Universal Agent Client Protocol (ACP) Server (
local_coding_agent.acp_server) (R29):- Standard JSON-RPC 2.0 ACP stdio server with auto-detecting
Content-LengthandJSONLcodec framing. - Subcommand:
local-agent serve-acp [--workspace ...] [--profile ...] [--framing ...].
- Standard JSON-RPC 2.0 ACP stdio server with auto-detecting
- Continuable Background Subagents & External Agent Hook Bridges (
local_coding_agent.subagent,local_coding_agent.hooks) (R30):- In-process continuable subagent worker loops with isolated
TaskEnvelopesandboxes and structured mailboxes. - External lifecycle hook bridges with full wire-protocol adapters for Claude Code and OpenAI Codex.
- In-process continuable subagent worker loops with isolated
🔍 Field Insights (best-practice adoption pass, pattern-level only — source repo is AGPL-3.0)
- Background Task Queue in the Desktop Harness:
POST /api/tasks/GET /api/tasks/POST /api/tasks/cancel, sequential daemon worker (0.3s poll, oldest-first) mirroring_handle_delegateconstruction, cancel Events passed into the Controller, records persisted at<workspace>/.local_agent_tasks.json(cap 100, stale-runningrecovery on restart), injectablecontroller_factorytest seam; UI panel with live status badges and Apply/Rollback reusing the existing/api/apply+/api/rollbackendpoints. - Chat-history auto-compaction (
local_coding_agent/chat_compaction.py): honest token estimation (CJK-aware, long-run pricing), whole-turn eviction that never drops system/last messages,[context compacted: N ...]notice insertion, sticky boundary (next_sticky_boundary = sticky_boundary + dropped_count) to preserve llama-server prefix cache. Module complete; CLI REPL/desktop wiring pending. - VRAM-fit context sizing (
local_coding_agent/vram_fit.py): header-only GGUF parser (v2/v3, suffix-matched keys, early exit, never raises → all-None on corruption),kv_bytes_per_token,max_fitting_ctx(15% reserve, 256-alignment, native-context cap). Module complete;_handle_model_load num_ctx:"auto"wiring pending. run_testssubprocess hardening (repository_tools.py): name-based secret-env scrubbing (_SECRET_ENV_NAME_RE: token/secret/password/api-key/aws_/azure_client), POSIX preexec (setsid, PR_SET_PDEATHSIG via ctypes, RLIMIT_CPU=timeout+30, RLIMIT_NOFILE=256; RLIMIT_AS deliberately skipped), WindowsCREATE_NO_WINDOW.- OpenAI-compatible
/v1router in the Desktop Harness:GET /v1/modelsandPOST /v1/chat/completionsnow proxy to whichever local backend serves the requested model id (resident llama-server first, then Ollama — both speak the OpenAI wire format natively, so routing is byte-level with streamed passthrough viahttp.client). Unknown models get a prescriptive 404 listing available ids. local-agent init-agentsubcommand: emits agent-native wiring pointing at the harness/v1endpoint — Codex[model_providers.local_agent]TOML (wire_api = "chat",CODEX_HOME-aware, duplicate-safe with exit code 1 on refusal) or genericOPENAI_BASE_URL/OPENAI_API_KEYenv instructions. Preview by default,--writeto persist,--jsonsupported.
✅ Adoption pass completed (handoff — prior "🚧 In progress")
- Tool-call text parser module (
local_coding_agent/tool_call_parser.py):extract_tool_calls(text, allowed_names=None) -> ToolCallExtraction(calls, remaining_text, formats_detected); emitters: qwen<tool_call>JSON, qwen XML<function=NAME><parameter=K>(plus<parameter name="K">), llama<|python_tag|>{json}, mistral[TOOL_CALLS] [...]; promotes only allowlisted names, truncated/invalid tails left in text, never raises (empty[TOOL_CALLS]array guarded). - Parser → controller integration:
controller/_controller.pyrun-loop falls back toextract_tool_calls(content, allowed_names=...)when_decode_content_tool_callreturns None; promotes tomessage.tool_calls+text_tool_call_promotedaudit event (now carryingformats). - Compaction → CLI REPL wiring:
cli/_handlers2.pymulti-turn loop guards each model call withfit_history(messages, max(1024, profile.num_ctx-1024), sticky_boundary); sticky boundary persisted per session;[context compacted]notice on trigger. - VRAM auto-fit → desktop model load wiring:
desktop/server/_handlers.py_handle_model_loadacceptsnum_ctx:"auto"on the GGUF branch via_auto_fit_llama_ctx(read_gguf_ctx_params+ free VRAM fromget_nvidia_gpu_telemetry()→max_fitting_ctx, guarded on all-Nonemetadata); explicit int behavior stays byte-identical. - Full suite green:
741 passed, 2 skipped(pytest tests/).
- Effective-context read-back (llama-server
/props): after every llama-server launch the controller now queries/propsand storesllama_effective_ctxon the server; when the servedn_ctxdiffers from the requested-cvalue (llama.cpp silently clamps to the model's native context length), actx_warningis surfaced in/api/model/loadresponses and requested/effective ctx are exposed in/api/status. Reality over intent. - Tool-call argument healing: small models frequently emit wrong-but-close argument names (
filepath→path,pattern→query,cmd→command). The controller now repairs these against the tool schema (case/underscore-insensitive + explicit alias map) before execution instead of burning a retry turn; ambiguous or shadowed keys pass through untouched. Audited astool_arguments_healed. - CLI parity fix:
chatsubcommand now declares its own--num-ctxflag (previously only reachable as a root-level option before the subcommand).
Full Changelog: v0.7.0...v0.8.2
Release v0.7.0
Full Changelog: v0.6.0...v0.7.0
Release v0.6.0
⚡ Local Coding Agent v0.6.0
🚀 Headline Features
-
Multi-Dimensional Capability Ladder (
local_coding_agent.capability) (R15):- 5-tier difficulty taxonomy: Tier 0 (Syntax & Typo Repair), Tier 1 (Atomic Pure Functions), Tier 2 (Single-File Multi-Hunk), Tier 3 (Cross-File Invariants), Tier 4 (Algorithmic & Strict Constraints).
- Adaptive Early-Exit ladder benchmark (
local-agent benchmark --ladder). - Formal
CapabilityVectortracking 95% Wilson confidence intervals, tokens/second generation speed, and maximum digestible chunk size (granularity_tolerance).
-
MCP Capability Discovery & Pre-Flight Gatekeeper (R16):
- Exposes official MCP resource
model://profileproviding host agents (Codex, Claude, Antigravity) with dynamic insight into local model intelligence tiers and latest benchmark scores. - Pre-flight complexity gatekeeper rejecting out-of-tier task envelopes with
CAPABILITY_OVERLOADand pinpointed decomposition advice.
- Exposes official MCP resource
-
Multi-Backend Resilience (
llama-server/ OpenAI API):- Graceful fallback in
ModelMemoryManager.snapshot()when VRAM introspection is not exposed by OpenAI-compatible backends. - Controller and tool context headroom optimizations (128 KB limit support).
- Human-friendly ASCII capability ladder rendering in console CLI (
local-agent benchmark --ladder).
- Graceful fallback in
🔬 Real-World Dogfooding & Field Report (Built with Local Coding Agent)
Important
100% Dogfooding Proof: This entire release (R15 & R16) was engineered and developed using our own Local Coding Agent service, delegating real implementation and refactoring tasks directly to the local Ling-3.0-tiny model!
Model Hardware & Hugging Face Specifications:
- Model:
inclusionAI/Ling-3.0-tiny(Ant Group / inclusionAI). - Architecture: BailingMoeV3 hybrid MoE with hybrid linear-attention (3:1 alternating stack of KDA: Kimi Delta Attention and MLA: Multi-Head Latent Attention).
- Parameters: 7.9B total parameters, with only ~1.3B–1.4B active parameters per token (128 routed experts, 8 active + 1 shared).
- Format & Runtime:
Ling-3.0-tiny-Q6_K.gguf(6.5 GB) served locally viallama-serverdaemon.
Key Empirical Field Findings:
- Ultra-Fast Local Generation: Because only ~1.3B parameters are activated per token, the model sustains 118.8 tokens/sec on local hardware, completing atomic subtasks in 2–3 seconds without cloud latency or API billing.
- The Context Window Invariant: Small models fail when dumped with wide context (>300 lines of source code triggers context limits). Restricting tasks to strict 1-file / 1-function envelopes with character-exact
SEARCH/REPLACEblocks yielded 100% first-turn success. - SEARCH/REPLACE vs. Unified Diff: MoE models struggle with line-offset arithmetic in raw
@@ -x,y +x,y @@unified diffs, but generate structured JSONedits(file,search,replace) with surgical accuracy. The controller's internal translation togit apply --checkeliminates all friction. - Verified Intelligence Ceiling: The capability ladder proved
Ling-3.0-tinyis a solid Tier 2 (Single-File Multi-Hunk) engine (100% Tier 0, 100% Tier 2 single-file edits, 95% on 20-case baseline benchmark), while multi-file coordination (Tier 3) requires decomposition by the host agent. - Zero-Distillation Mediated Apply: Automatic test verification and git auto-rollback gave 100% confidence during development — zero regressions across the 290-test test suite.
Release v0.5.0
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[0.5.0] - 2026-08-18
🚀 Headline Features
- Universal Agent Skill (
skills/local-coding-agent/SKILL.md):- Full support for any AI coding harness (Claude Code, Cursor, Windsurf, Roo Code, ChatGPT Codex, Google Antigravity, OpenCode).
- Built-in multi-agent installer:
local-agent init-skill --write. - Comprehensive delegation decision matrix, envelope construction blueprint, and model tier recommendations.
- 100% CLI-First Console Parity ("Fool-Proof" Control):
- First-class CLI subcommands with
--jsonoutput and standard return codes for every feature:delegate/run: Run atomic delegation directly via console.decompose/atomize: Preflight and decompose wide task envelopes.profiles: Query and inspect registered model profiles with Ollama availability checks.memory: Manage Ollama VRAM, unload models, and enforce memory limits.calibrate: Derive worker pool capacity for a given VRAM budget.apply: Safely apply patches to workspace with test validation and auto-rollback.init-skill: Export/install Agent Skills to agent directories.
- First-class CLI subcommands with
- Multi-Runtime Support: Native Ollama & llama.cpp (
llama-server):- Direct support for
llama-serverand any OpenAI-compatible runtime (/v1/chat/completions) with precise timing extraction (prompt_ms,predicted_ms). - Runtime-agnostic profile dispatch via
OpenAICompatibleClient.
- Direct support for
🛡️ Safety & Architecture
- CLI-First Invariant: Formalized architectural rule that all future features must maintain 100% CLI parity with automated tests.
- Verified Test Suite: Full cross-platform test suite verifying CLI subcommands, skill installers, worker pools, and memory management.
[0.4.0] - 2026-08-15
Added
- Pinpointed Prescriptions Engine (
local_coding_agent.prescriptions):- Deterministic in-context diagnostic translation for small models (2B–4B).
- Zero Distillation Guarantee: Rule-based translation without leaking host LLM reasoning.
- Multi-Client MCP Configuration Generator (
init-mcp):- Auto-detection and multi-client configuration merger for Claude, Cursor, Windsurf, Cline, Antigravity, OpenCode, Codex.
- System Diagnostic Wizard (
doctor):- Automated environment checks for Ollama API, Git CLI, RAM/VRAM, and model catalog.
- Real-Time HTTP Monitoring & Dashboard (
monitor):- Web dashboard showing worker load, queue latency, and live tokens per second.
What's Changed
- docs: document local model shortlist and Ollama import by @pvnc228 in #1
- feat: add bounded direct delegation service by @pvnc228 in #2
New Contributors
Full Changelog: https://github.com/pvnc228/local-coding-agent/commits/v0.5.0