All notable changes to Grinta will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Repository launch surface: a compact README hero, animated recovery preview, capability table, contributor call, and direct links to the strongest autonomous-run evidence.
- Public showcase: standardized case studies for the 4h 33m autonomous session, failure recovery, issue-tracker build, and Raft key-value store.
- Shareable media: a 1280 × 640 social-preview asset and a compressed, looping WebP excerpt that links to the full demo.
- Package discovery metadata: expanded the package description, keywords, classifiers, and project URLs for package-index searchability.
- Citation metadata: credits maintainer Youssef Mejdi and records the public repository URL.
-
read_symboltool removed after a brief trial. Targeted discovery remains infind_symbols; file content is read throughread_file. Removing the dedicated tool keeps the final public file surface at six tools. -
edit_symboltool removed. The model was not using it; the schema was complex (six optional disambiguation fields plusnew_content), andreplace_stringcovers the same ground with a simpler schema the model already uses confidently. Symbol discovery stays infind_symbols; content reads stay inread_file. -
create(type="symbol")mode removed.createis now file-only. Insert new symbols viareplace_stringwith an anchor line. -
multieditedit_symbolcommand removed.multieditnow supportsreplace_stringoperations only. TheallOf/if-thenconditional schema is gone; the operation shape is justpath,old_string,new_string,replace_all.
- Packaging: PDF/DOCX/PPTX/LaTeX parsers (
pypdf,python-docx,python-pptx,pylatexenc) are included in the base install; the[documents]extra is removed. Optional extras are now[rag],[browser], and[all]. - Packaging:
debugpyis no longer bundled in the base wheel. Python debugging is auto-detected whendebugpyis installed in the active environment (pip install debugpy), consistent with other DAP adapters and LSP servers. Contributor dev deps still includedebugpy. - Model-facing file API:
readrenamed toread_file,createrenamed tocreate_file, and the oldread(type="symbols")mode was retired. A dedicatedread_symboltool was tried and later removed. Final public tools:read_file,find_symbols,create_file,replace_string,multiedit,undo_last_edit. - CI:
py-testsrequired jobs on Linux and Windows run the fullbackend/tests/unitcorpus (fast PR gates), not a fixed nine-file slice. docs/CI.md documents the tiers. - Testing:
pytest.initestpathsdefaults tobackend/tests(full tree for a barepytest); usepytest backend/tests/unitto match the required gates locally. - Docs: CONTRIBUTING.md testing instructions match CI; added docs/RELEASE_CHECKLIST.md, docs/REGRESSION_TESTS.md; user-facing autonomy naming is conservative / balanced / full only (docs/SECURITY_CHECKLIST.md, docs/USER_GUIDE.md).
- OSS readiness: added governance and ownership policy docs (GOVERNANCE.md, MAINTAINERS.md), published docs/SUPPORT_MATRIX.md, expanded SUPPORT.md with response targets, and added THIRD_PARTY_NOTICES.md.
supervisedautonomy spelling: Config,/autonomy, andPermissionsConfig.get_preset()no longer acceptsupervised; useconservative(same behaviour). A clear validation error points toconservativeif old configs still saysupervised.
1.0.0-rc1 - 2026-04-29
First release candidate. Includes everything in 0.56.0 plus the
pre-launch polish below. Tagged as rc1 to invite community feedback
before the final 1.0.0 cut.
- Symbol-aware reading restored (tree-sitter-backed). Lets the
agent fetch named symbols or a whole file through the public file API,
replacing the previous multi-call dance of code search plus file reads.
Backed by the already-core
backend.utils.treesitter_editor.TreeSitterEditor.find_symbol(). Wired throughplanner.py,function_calling.py, and the CLI display layer. - README rewritten with a multi-line pitch and an 11-row competitor comparison table (Grinta vs Aider, Claude Code, Codex CLI) covering install size, provider-agnosticism, local-first posture, LSP, DAP, HUD, stuck-detection, hardened_local profile, checkpoint/resume, Windows parity, and MCP support.
- Demo material:
docs/DEMO_SCRIPT.md— a 60-second asciinema scenario (demo_app/calc.py::averageZeroDivisionError) plus anaggcommand for converting the cast into a GIF for the README. - Smoke-test scripts for clean-box install verification:
scripts/smoke/smoke_install.sh(Linux/macOS, accepts extras as positional args; prefers a local wheel from$WHEEL_DIR=./dist, falls back to PyPI).scripts/smoke/smoke_install.ps1(Windows mirror; reports site-packages MB).scripts/Dockerfile.smoke(Python 3.12-slim base, ripgrep pre-installed,EXTRASenv var picks the optional extras to test). Each script runspython -c "import backend",--help, andverify_optional_imports.pyso a broken extras gate is caught before publishing to PyPI.
- GitHub label catalog at
.github/labels.ymlcovering triage, type, severity, OS (os: windows|linux|macos), provider (provider: openai|anthropic|google|openrouter|ollama|lmstudio), area (area: cli|engine|execution|lsp|dap|rag|mcp|safety|telemetry|packaging), contributor onboarding, and release governance. Apply withgh label sync -f .github/labels.yml.
- Wheel size: stable at ~1.4 MB on the base install (see
0.56.0). - Issue template version hint bumped to
1.0.0rc1. - Autonomy is now a single-axis knob. The three modes
(
conservative/balanced/full) share identical execution, prompting, and retry behaviour. The only difference between them is when the runtime stops to ask the user before running an action: conservative asks for every action, balanced asks only for high-risk actions, full never asks. The system prompt no longer branches on the mode (the previous "FULL AUTONOMOUS MODE" block has been replaced by a single mode-agnostic sentence so the prompt stays correct when the user toggles modes mid-session via/autonomy). - Cost caps and iteration limits decoupled from autonomy.
max_cost_per_task,warn_at_cost,max_autonomous_iterations, andstuck_threshold_iterationsare now standalone config keys with global defaults; they apply universally regardless of autonomy mode.PermissionsConfig.get_preset()no longer pre-fills cost caps per mode, and the "this knob only applies in full autonomy" warning has been removed.
- Per-session "always allow" memory for the confirmation gate. The
approval prompt now offers
[y/n/a=always]; choosingawhitelists that exact action signature (e.g. the literal command string) for the remainder of the session so the agent does not re-ask for the samepytest -q,git status, orlsover and over. The whitelist is in-memory only and is cleared on process exit.
autonomy_level: supervisedis renamed toconservativeto better describe the behaviour ("confirm every action in the confirmation flow") and to avoid implying extra oversight features that don't exist. The stringsupervisedis rejected in config files and on the/autonomyslash command; useconservativeinstead.- Set
max_budget_per_taskexplicitly insettings.jsonfor per-task spend caps (see docs/SETTINGS.md).
0.56.0 - 2026-04-29
- Auto-discovery of LSP servers:
LspClientnow probesPATHfor installed language servers (pylsp, typescript-language-server, rust-analyzer, gopls, clangd, jdtls, omnisharp, lua-language-server, bash-language-server, vscode-html-language-server, vscode-css-language-server, vscode-json-language-server, yaml-language-server, ruby-lsp, solargraph, intelephense, terraform-ls). No more pylsp-only gating. - Auto-discovery of DAP debug adapters:
DAPDebugManagernow probesPATHfordlv,codelldb,lldb-dap,netcoredbg,node, etc. and falls back to a sensible adapter command when the model omitsadapter_command. Python remains batteries-included via bundleddebugpy. detect_lsp_servers()anddetect_debug_adapters()discovery helpers exported for diagnostics / UI.- Optional dependency extras:
[rag](chromadb + ONNX MiniLM-L6-v2),[documents](PyPDF2 / python-docx / python-pptx / pylatexenc),[browser](browser-use), and[all](everything).
enable_lsp_querynow defaults toTrue— the planner enables thelsptool whenever any supported LSP server is onPATH.- DAP
startno longer requires the model to supplyadapter_commandfor languages whose adapter is auto-discoverable. - Massive install slim-down: base wheel dropped from ~1.6GB to ~1.4MB.
Achieved by gating
chromadbbehind the[rag]extra, dropping the redundantsentence-transformers+torch+transformersstack in favour of chromadb's bundled ONNXDefaultEmbeddingFunction(384-dim, ~80MB) when[rag]is installed, and moving document parsers (PyPDF2,python-docx,python-pptx,pylatexenc) behind[documents].enable_vector_memoryandenable_hybrid_retrievalagent-config flags now default toFalse. MemoryMonitormigrated frommemory-profilerto apsutil-based RSS sampler thread (no behaviour change for callers).
- GraphRAG subsystem (
backend/context/graph_rag.py,graph_store.py) and its dependent tools (explore_tree_structure,read_symbol_definition). The four remaining retrieval primitives (grep/globvia ripgrep,find_symbols/readvia tree-sitter,lspvia LSP) cover the same surface without the index-maintenance cost. ReRankerclass and the cross-encoder rerank step fromEnhancedVectorStore— over-engineered for a CLI agent's recall workload. Hybrid retrieval now returns top-k candidates directly.- Unused dependencies dropped from base install:
sentence-transformers,optimum,puremagic,memory-profiler, plus the eager top-level imports ofpython-docx/python-pptx/pylatexenc/PyPDF2/chromadb.
0.55.0 - 2026-04-29
First public open-source release. Grinta is now a CLI-only, local-first coding agent with no managed web UI, no hosted control plane, and no built-in HTTP server.
- Open-source release on PyPI as
grinta, with Homebrew and Scoop manifests inpackaging/for native installs on macOS and Windows. CHANGELOG.mdfollowing keepachangelog.com format andSECURITY.mddescribing reporting, threat model, and supported versions.docs/SECURITY_CHECKLIST.mddocumenting the trust boundary, built-in protections, and operator pre-flight checklist for untrusted repositories.hardened_localexecution profile with workspace-scoped allowlists for git, package, and network-capable commands; CRITICAL refusal gate enforced insafety_validator.pyregardless of profile or autonomy level.- Session checkpoint and resume support via
SessionCheckpointManager. LLMRateGovernorper-session token-rate throttling and cost-acceleration loop detection inStuckDetectorto bound runaway agent loops.- Real auto-recovery in
ErrorRecoveryStrategycovering network retry, context truncation, and runtime restart. - Canonical local-server startup planner shared by
start_server.pyand the embedded mode, with the resolved plan surfaced in health and settings output. - Audit logging middleware for sensitive operations (settings, secrets,
conversations) writing to
~/.grinta/workspaces/<id>/storage/<session>/audit/. - Plugin authoring guide (
docs/PLUGIN_GUIDE.md) and MCP integration examples (docs/MCP_EXAMPLES.md). - Cross-platform CI matrix on GitHub Actions: Ubuntu and Windows are required
gates; macOS runs as advisory in both
py-tests.ymlande2e-tests.yml.
- Repositioned Grinta as a CLI-only coding agent. Removed the React web
UI, Socket.IO surface, Textual TUI prototype, and the public
/api/v1/monitoring/*HTTP endpoints. The CLI is the sole interactive surface. - Removed all cloud runtime dependencies (
e2b,modal,runloop-api-client,daytona) for a strictly local-first runtime. - Renamed
get_remote_runtime_config->get_runtime_config. - Hardened the local execution policy: interactive terminals, command cwd,
uploads, and direct file access stay workspace-scoped under
security.execution_profile = "hardened_local". - Crash recovery now fails closed more often, tracks restore provenance, and uses persisted control-event evidence to distinguish stale WAL from ambiguous recovery.
- Trimmed base dependencies:
asyncpgandlibtmuxmoved to optional groups;python-socketioremoved from base runtime. - Consolidated editor tools around a smaller public file API; older experimental editor modules are deprecated.
- Broke up
action_execution_server.py(1944 → 4 focused modules),conversation_memory.py(1709 → 4 focused modules), andconfig/utils.py(43 KB → 4 focused modules). - Rewrote
README.mdand the public docs set (docs/INSTALL.md,docs/QUICK_START.md,docs/USER_GUIDE.md,docs/TROUBLESHOOTING.md,docs/ARCHITECTURE.md,docs/DEVELOPER.md) for the CLI-only positioning. - Repository home moved to
josephsenior/Grinta-Coding-Agent; all release metadata, support links, and issue templates updated to match.
ultimate_editor.py— use the public file API instead.universal_editor.py— use the public file API oratomic_refactorinternally instead.
- React frontend, Socket.IO real-time streaming, Textual TUI replacement, and
the
/api/v1/monitoring/agent-metricsHTTP endpoint. start_backend.ps1,openapi.json, archivalclient/package, the deadservice_circuit_breaker.py, and stale socket-era tests.
- New
SECURITY.mddocuments reporting, supported versions, the threat model, and the trust boundary (Grinta runs as the operator’s OS user — it is not a sandbox). - Secret masker strips known credential patterns from event-stream output, audit logs, and panel renders before display.
- Telemetry remains off by default; the only on-disk telemetry is the
local
AuditLogger. No outbound calls are made beyond configured LLM providers and explicitly enabled MCP servers.