<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ensō</title><link>https://tarathestar.github.io/enso/</link><description>Recent content on ensō</description><generator>Hugo</generator><language>en</language><atom:link href="https://tarathestar.github.io/enso/index.xml" rel="self" type="application/rss+xml"/><item><title>Architecture</title><link>https://tarathestar.github.io/enso/advanced/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/advanced/architecture/</guid><description>&lt;h1 id="architecture"&gt;Architecture&lt;a class="anchor" href="#architecture"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A single Go binary with subcommands &lt;code&gt;tui&lt;/code&gt; (default), &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;daemon&lt;/code&gt;,
&lt;code&gt;attach&lt;/code&gt;, &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;trust&lt;/code&gt;, &lt;code&gt;fork&lt;/code&gt;, &lt;code&gt;export&lt;/code&gt;, &lt;code&gt;stats&lt;/code&gt;, &lt;code&gt;sandbox&lt;/code&gt;.
~26,000 lines of Go (~32% test).&lt;/p&gt;
&lt;h2 id="big-picture"&gt;Big picture&lt;a class="anchor" href="#big-picture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Inside one process the &lt;strong&gt;agent goroutine&lt;/strong&gt; runs the chat→tool loop
(&lt;code&gt;internal/agent&lt;/code&gt;), publishes typed events on a fan-out &lt;strong&gt;bus&lt;/strong&gt;
(&lt;code&gt;internal/bus&lt;/code&gt;), and persists state synchronously through a &lt;strong&gt;session
writer&lt;/strong&gt; (&lt;code&gt;internal/session&lt;/code&gt;) before the UI sees anything
(persist-before-render invariant). The &lt;strong&gt;TUI&lt;/strong&gt; (&lt;code&gt;internal/tui&lt;/code&gt; over
&lt;code&gt;tview&lt;/code&gt;/&lt;code&gt;tcell&lt;/code&gt;) subscribes for rendering, the &lt;strong&gt;permissions checker&lt;/strong&gt;
(&lt;code&gt;internal/permissions&lt;/code&gt;) gates tool calls with three-tier patterns,
&lt;strong&gt;MCP&lt;/strong&gt; servers (&lt;code&gt;internal/mcp&lt;/code&gt; via &lt;code&gt;mark3labs/mcp-go&lt;/code&gt;) plug their
tools into the same registry as built-ins (&lt;code&gt;internal/tools&lt;/code&gt;),
&lt;strong&gt;subagents&lt;/strong&gt; (&lt;code&gt;spawn_agent&lt;/code&gt; tool + &lt;code&gt;internal/workflow&lt;/code&gt; runner)
construct child agents that share the parent&amp;rsquo;s bus/provider/permissions
but get their own filtered tool registry. The &lt;strong&gt;daemon&lt;/strong&gt;
(&lt;code&gt;internal/daemon&lt;/code&gt;) hosts the same agent over a unix socket;
&lt;strong&gt;attach&lt;/strong&gt; is a TUI variant that reads events from the socket and
proxies user input + permission decisions back. &lt;strong&gt;Slash commands&lt;/strong&gt;
(&lt;code&gt;internal/slash&lt;/code&gt;) layer built-ins + file-loaded skills on top of the
input handler. &lt;strong&gt;LSP&lt;/strong&gt; (&lt;code&gt;internal/lsp&lt;/code&gt;) is a hand-rolled JSON-RPC
client that exposes language-server features as &lt;code&gt;lsp_*&lt;/code&gt; tools.
&lt;strong&gt;Sandbox&lt;/strong&gt; (&lt;code&gt;internal/sandbox&lt;/code&gt;) runs &lt;code&gt;bash&lt;/code&gt; inside a per-project
podman/docker container.&lt;/p&gt;</description></item><item><title>Install</title><link>https://tarathestar.github.io/enso/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/install/</guid><description>&lt;h1 id="install"&gt;Install&lt;a class="anchor" href="#install"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;ensō is a single static Go binary (named &lt;code&gt;enso&lt;/code&gt;). No CGO, no runtime
dependencies on the host beyond a POSIX shell (and optionally &lt;code&gt;podman&lt;/code&gt;
or &lt;code&gt;docker&lt;/code&gt; if you turn the bash sandbox on).&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;a class="anchor" href="#prerequisites"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go 1.23+&lt;/strong&gt; (only if building from source).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An OpenAI-compatible chat endpoint&lt;/strong&gt; — &lt;code&gt;llama.cpp&lt;/code&gt;&amp;rsquo;s &lt;code&gt;llama-server&lt;/code&gt;
is the reference target; vLLM, Ollama, OpenAI itself, anything that
speaks Chat Completions with SSE streaming will work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POSIX OS&lt;/strong&gt; (Linux/macOS/BSD). Windows builds compile but the
daemon path is unsupported there; run via WSL.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="build-from-source"&gt;Build from source&lt;a class="anchor" href="#build-from-source"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/TaraTheStar/enso.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; enso
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make build &lt;span class="c1"&gt;# produces ./bin/enso&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Common Make targets:&lt;/p&gt;</description></item><item><title>Reference</title><link>https://tarathestar.github.io/enso/config/reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/config/reference/</guid><description>&lt;h1 id="configuration-reference"&gt;Configuration reference&lt;a class="anchor" href="#configuration-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;ensō reads layered TOML files. Lowest → highest precedence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;/etc/enso/config.toml&lt;/code&gt; — system.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$XDG_CONFIG_HOME/enso/config.toml&lt;/code&gt; (≈ &lt;code&gt;~/.config/enso/&lt;/code&gt;) — user.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/config.toml&lt;/code&gt; — project, committed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/config.local.toml&lt;/code&gt; — project, gitignored. The
&amp;ldquo;Allow + Remember&amp;rdquo; target.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c &amp;lt;path&amp;gt;&lt;/code&gt; — one-off override.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each file is map-merged into the previous. Lists concatenate; nested
tables merge key-by-key.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso config init &lt;span class="c1"&gt;# write the default to the user path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso config init --print &lt;span class="c1"&gt;# dump to stdout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso config init --force &lt;span class="c1"&gt;# overwrite an existing file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso config show &lt;span class="c1"&gt;# list search paths and which exist&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The default config below is also embedded in the binary — &lt;code&gt;enso config init --print&lt;/code&gt; prints it verbatim.&lt;/p&gt;</description></item><item><title>TUI</title><link>https://tarathestar.github.io/enso/docs/tui/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/tui/</guid><description>&lt;h1 id="tui"&gt;TUI&lt;a class="anchor" href="#tui"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The default &lt;code&gt;enso&lt;/code&gt; command launches a tview-based terminal UI: a chat
pane, an input area at the bottom, an optional agents pane on the
right, and a status bar.&lt;/p&gt;
&lt;h2 id="keybindings"&gt;Keybindings&lt;a class="anchor" href="#keybindings"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Key&lt;/th&gt;
 &lt;th&gt;Action&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Submit the current input.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Shift+Enter&lt;/code&gt; / &lt;code&gt;Alt+Enter&lt;/code&gt; / &lt;code&gt;Ctrl+J&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Newline. &lt;code&gt;Ctrl+J&lt;/code&gt; is the cross-terminal-reliable one.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Cancel the current turn (no-op when idle).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+D&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Quit (cancels in-flight turn first).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+A&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Toggle the right-side agents pane.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+T&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Toggle visibility of completed reasoning blocks.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+R&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Open the recent-sessions overlay (Enter switches via &lt;code&gt;syscall.Exec&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@&lt;/code&gt; (at token start)&lt;/td&gt;
 &lt;td&gt;Open the file picker — type to filter, Enter inserts the path.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Close any modal (= &lt;strong&gt;Deny&lt;/strong&gt; on a permission prompt).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="slash-commands"&gt;Slash commands&lt;a class="anchor" href="#slash-commands"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;th&gt;What it does&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/help&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List all available commands.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/yolo on|off&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Toggle auto-allow for the rest of the session.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/tools&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List tools currently registered (built-ins + MCP + LSP).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/sessions&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Recent sessions, inline. Ctrl-R opens the overlay version.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/grep &amp;lt;pattern&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;One-shot project-wide grep, results inline.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/permissions&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Inspect and remove project-local permission rules in &lt;code&gt;config.local.toml&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/model [&amp;lt;name&amp;gt;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List configured providers (no arg) or switch the active one (with arg).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/compact&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Force a context-compaction pass.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/init [target]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Survey the project and write &lt;code&gt;ENSO.md&lt;/code&gt; (or any other filename).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/agents&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List declarative agent profiles (built-in + user + project).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/loop &amp;lt;interval&amp;gt; &amp;lt;prompt&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Re-submit a prompt every interval (≥5s); &lt;code&gt;/loop off&lt;/code&gt; stops.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/workflow &amp;lt;name&amp;gt; &amp;lt;args&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Run a declarative workflow.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/&amp;lt;skill-name&amp;gt; &amp;lt;args&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Any user-defined skill (project shadows user).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/quit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Exit.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="status-bar"&gt;Status bar&lt;a class="anchor" href="#status-bar"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two halves:&lt;/p&gt;</description></item><item><title>JSON event schema</title><link>https://tarathestar.github.io/enso/advanced/json-events/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/advanced/json-events/</guid><description>&lt;h1 id="json-event-schema"&gt;JSON event schema&lt;a class="anchor" href="#json-event-schema"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;enso run --format json&lt;/code&gt; emits one JSON object per line on stdout —
newline-delimited JSON, parseable with any streaming JSON tool
(&lt;code&gt;jq -c .&lt;/code&gt;, &lt;code&gt;python -m json.tool --json-lines&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;p&gt;The schema mirrors the internal bus events 1:1, with a leading
&lt;code&gt;session_start&lt;/code&gt; and trailing &lt;code&gt;session_end&lt;/code&gt; for boundaries.&lt;/p&gt;
&lt;h2 id="example"&gt;Example&lt;a class="anchor" href="#example"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ enso run --yolo --format json &lt;span class="s2"&gt;&amp;#34;list .go files in cmd/&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;session_start&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;cwd&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;/home/me/proj&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;4d8b2e9a-…&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;qwen3.6-35b-a3b&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;resumed&amp;#34;&lt;/span&gt;:false&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;user_message&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;list .go files in cmd/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;reasoning_delta&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;The user wants…&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;reasoning_delta&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34; to enumerate…&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;tool_call_start&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;**/*.go&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;call_1&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;glob&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;tool_call_end&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;:null,&lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;call_1&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;glob&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;cmd/enso/main.go\ncmd/enso/run.go\n…&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;assistant_delta&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;There are five Go files in cmd/:\n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;…
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;assistant_done&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;session_end&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;tool_errors&amp;#34;&lt;/span&gt;:false&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="event-types"&gt;Event types&lt;a class="anchor" href="#event-types"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every line has a &lt;code&gt;&amp;quot;type&amp;quot;&lt;/code&gt; field. Other fields depend on the type.&lt;/p&gt;</description></item><item><title>Quickstart</title><link>https://tarathestar.github.io/enso/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/quickstart/</guid><description>&lt;h1 id="quickstart"&gt;Quickstart&lt;a class="anchor" href="#quickstart"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Five minutes from &amp;ldquo;I cloned the repo&amp;rdquo; to &amp;ldquo;the agent is editing my code.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="1-build"&gt;1. Build&lt;a class="anchor" href="#1-build"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make build &lt;span class="c1"&gt;# → ./bin/enso&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-start-your-model"&gt;2. Start your model&lt;a class="anchor" href="#2-start-your-model"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re running &lt;code&gt;llama.cpp&lt;/code&gt;&amp;rsquo;s &lt;code&gt;llama-server&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;llama-server -m &amp;lt;model.gguf&amp;gt; --port &lt;span class="m"&gt;8080&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;ve configured a different backend, point your config there. See
&lt;a href="https://tarathestar.github.io/enso/install/"&gt;Install&lt;/a&gt; for the full command line.&lt;/p&gt;
&lt;h2 id="3-first-run"&gt;3. First run&lt;a class="anchor" href="#3-first-run"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./bin/enso&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first time ensō runs, it writes a default config to
&lt;code&gt;~/.config/enso/config.toml&lt;/code&gt; and creates &lt;code&gt;~/.enso/enso.db&lt;/code&gt; for session
storage. The TUI boots, talks to your model, and you can start typing.&lt;/p&gt;</description></item><item><title>Sessions</title><link>https://tarathestar.github.io/enso/docs/sessions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/sessions/</guid><description>&lt;h1 id="sessions"&gt;Sessions&lt;a class="anchor" href="#sessions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every conversation is a &lt;em&gt;session&lt;/em&gt; — a row in &lt;code&gt;~/.enso/enso.db&lt;/code&gt; with
its messages, tool calls, and bus events. Sessions persist
automatically (use &lt;code&gt;--ephemeral&lt;/code&gt; to skip), survive crashes, and can be
resumed, branched, or exported.&lt;/p&gt;
&lt;h2 id="persist-before-render"&gt;Persist-before-render&lt;a class="anchor" href="#persist-before-render"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every user message, assistant reply, and tool call is written to
SQLite &lt;em&gt;before&lt;/em&gt; the UI renders it. If you &lt;code&gt;kill -9&lt;/code&gt; enso mid-tool-call
and resume, the interrupted call comes back as a synthetic tool result
with the message &amp;ldquo;tool call interrupted (process exited before
completion); user has resumed the session&amp;rdquo; so the model can react.&lt;/p&gt;</description></item><item><title>Permissions</title><link>https://tarathestar.github.io/enso/docs/permissions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/permissions/</guid><description>&lt;h1 id="permissions"&gt;Permissions&lt;a class="anchor" href="#permissions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The permission system gates every tool call by matching it against
patterns in &lt;code&gt;[permissions]&lt;/code&gt;. Three rule lists, evaluated in
&lt;strong&gt;deny → ask → allow → mode default&lt;/strong&gt; order.&lt;/p&gt;
&lt;h2 id="modes"&gt;Modes&lt;a class="anchor" href="#modes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prompt&amp;#34;&lt;/span&gt; &lt;span class="c"&gt;# &amp;#34;prompt&amp;#34; | &amp;#34;allow&amp;#34; | &amp;#34;deny&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;prompt&amp;quot;&lt;/code&gt; — for unmatched calls, ask the user via a modal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;allow&amp;quot;&lt;/code&gt; — for unmatched calls, auto-allow.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;deny&amp;quot;&lt;/code&gt; — for unmatched calls, auto-deny.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;--yolo&lt;/code&gt; (or &lt;code&gt;/yolo on&lt;/code&gt;) overrides the mode and auto-allows everything
except patterns explicitly listed in &lt;code&gt;deny&lt;/code&gt;. Use it for unattended
runs.&lt;/p&gt;</description></item><item><title>Worktree mode</title><link>https://tarathestar.github.io/enso/advanced/worktree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/advanced/worktree/</guid><description>&lt;h1 id="worktree-mode"&gt;Worktree mode&lt;a class="anchor" href="#worktree-mode"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;--worktree&lt;/code&gt; creates a fresh git worktree at
&lt;code&gt;~/.enso/worktrees/&amp;lt;repo&amp;gt;-&amp;lt;rand&amp;gt;&lt;/code&gt; on a new &lt;code&gt;enso/&amp;lt;rand&amp;gt;&lt;/code&gt; branch off
your current HEAD, chdirs into it, and runs the session from there.
The agent operates in the worktree; your main checkout stays
untouched.&lt;/p&gt;
&lt;p&gt;Useful when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want a sacrificial branch for a speculative refactor without
contaminating your working tree.&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re running multiple agents in parallel — each on their own
worktree, so they can&amp;rsquo;t step on each other&amp;rsquo;s edits.&lt;/li&gt;
&lt;li&gt;You want to keep &lt;code&gt;git diff&lt;/code&gt; and &lt;code&gt;git status&lt;/code&gt; clean while the agent
experiments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;a class="anchor" href="#usage"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso --worktree &lt;span class="c1"&gt;# in-process TUI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso run --worktree --yolo &lt;span class="s2"&gt;&amp;#34;do thing&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# single-shot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both &lt;code&gt;enso&lt;/code&gt; (default &lt;code&gt;tui&lt;/code&gt;) and &lt;code&gt;enso run&lt;/code&gt; honour the flag. The
daemon and &lt;code&gt;attach&lt;/code&gt; paths don&amp;rsquo;t — they target an existing process
that might span multiple repos.&lt;/p&gt;</description></item><item><title>Sandbox</title><link>https://tarathestar.github.io/enso/docs/sandbox/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/sandbox/</guid><description>&lt;h1 id="sandbox"&gt;Sandbox&lt;a class="anchor" href="#sandbox"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;By default the &lt;code&gt;bash&lt;/code&gt; tool runs as your user on the host. With
&lt;code&gt;[bash] sandbox = &amp;quot;auto&amp;quot;&lt;/code&gt; (or &lt;code&gt;&amp;quot;podman&amp;quot;&lt;/code&gt; / &lt;code&gt;&amp;quot;docker&amp;quot;&lt;/code&gt;), every &lt;code&gt;bash&lt;/code&gt;
call instead runs inside a per-project container with the project cwd
bind-mounted at &lt;code&gt;/work&lt;/code&gt;. The agent&amp;rsquo;s shell can&amp;rsquo;t see &lt;code&gt;~&lt;/code&gt;, &lt;code&gt;~/.ssh&lt;/code&gt;,
sibling repos, or anything else outside the project.&lt;/p&gt;
&lt;p&gt;The sandbox is &lt;strong&gt;off by default&lt;/strong&gt;. Turn it on per project (or
globally in your user config) when you want the safety.&lt;/p&gt;</description></item><item><title>LSP</title><link>https://tarathestar.github.io/enso/docs/lsp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/lsp/</guid><description>&lt;h1 id="lsp-integration"&gt;LSP integration&lt;a class="anchor" href="#lsp-integration"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Configure language servers under &lt;code&gt;[lsp.&amp;lt;name&amp;gt;]&lt;/code&gt; and four tools become
available to the agent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lsp_hover(file, line, column)&lt;/code&gt; — type / signature / doc at a position.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lsp_definition(file, line, column)&lt;/code&gt; — where the symbol is defined.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lsp_references(file, line, column, include_declaration?)&lt;/code&gt; — every reference.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lsp_diagnostics(file)&lt;/code&gt; — errors / warnings the server has published.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Servers are spawned lazily on first use, scoped by file extension,
and reused for the rest of the session. ensō&amp;rsquo;s LSP client is
hand-rolled JSON-RPC over stdio (no new dependencies; ~600 lines of
pure Go), so anything that speaks standard LSP works.&lt;/p&gt;</description></item><item><title>Agents</title><link>https://tarathestar.github.io/enso/docs/agents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/agents/</guid><description>&lt;h1 id="declarative-agents"&gt;Declarative agents&lt;a class="anchor" href="#declarative-agents"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;em&gt;declarative agent&lt;/em&gt; is a reusable bundle of (system-prompt addition,
tool restrictions, sampler overrides, max-turns) that replaces the
default top-level configuration for a session. Pick one with &lt;code&gt;--agent &amp;lt;name&amp;gt;&lt;/code&gt; at startup; list them with &lt;code&gt;/agents&lt;/code&gt; in the TUI.&lt;/p&gt;
&lt;h2 id="built-in-plan-mode"&gt;Built-in: plan mode&lt;a class="anchor" href="#built-in-plan-mode"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enso --agent plan&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;plan&lt;/code&gt; agent is read-only. &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, and &lt;code&gt;edit&lt;/code&gt; are removed
from the registry; only &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;glob&lt;/code&gt;, &lt;code&gt;web_fetch&lt;/code&gt;, and &lt;code&gt;todo&lt;/code&gt;
remain. The system prompt explicitly tells the model: &lt;em&gt;investigate
and produce a plan; do not modify files&lt;/em&gt;. Use it for &amp;ldquo;tell me what
this codebase does&amp;rdquo; or &amp;ldquo;design a fix&amp;rdquo; sessions where you don&amp;rsquo;t want
the model touching anything.&lt;/p&gt;</description></item><item><title>Memory</title><link>https://tarathestar.github.io/enso/docs/memory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/memory/</guid><description>&lt;h1 id="auto-memory"&gt;Auto-memory&lt;a class="anchor" href="#auto-memory"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sessions don&amp;rsquo;t share state by default — each new session sees the
same system prompt and starts cold. Auto-memory is the mechanism for
making certain facts persistent across sessions.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;a class="anchor" href="#how-it-works"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two things, working together:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The &lt;code&gt;memory_save&lt;/code&gt; tool&lt;/strong&gt;. The agent calls it with a name and
content; ensō writes a markdown file at
&lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/memory/&amp;lt;slug&amp;gt;.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The instruction loader&lt;/strong&gt;. At session start, every &lt;code&gt;*.md&lt;/code&gt; under
&lt;code&gt;~/.enso/memory/&lt;/code&gt; (user) and &lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/memory/&lt;/code&gt; (project) is
concatenated and appended to the system prompt under a &lt;code&gt;## Auto-memory&lt;/code&gt;
header. Project files shadow user files on name collision.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A future session in the same project automatically inherits everything
the agent saved. No re-explaining the database constraints, no
re-stating the team&amp;rsquo;s lint policy.&lt;/p&gt;</description></item><item><title>Skills</title><link>https://tarathestar.github.io/enso/docs/skills/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/skills/</guid><description>&lt;h1 id="skills"&gt;Skills&lt;a class="anchor" href="#skills"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;em&gt;skill&lt;/em&gt; is a user-defined slash command. Drop a frontmatter-headed
markdown file at &lt;code&gt;~/.enso/skills/&amp;lt;name&amp;gt;.md&lt;/code&gt; (user) or
&lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/skills/&amp;lt;name&amp;gt;.md&lt;/code&gt; (project), and &lt;code&gt;/&amp;lt;name&amp;gt;&lt;/code&gt; becomes a slash
command in the TUI that injects the rendered body as the next user
message.&lt;/p&gt;
&lt;p&gt;Project shadows user on name collision.&lt;/p&gt;
&lt;h2 id="file-format"&gt;File format&lt;a class="anchor" href="#file-format"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: explain-this
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: read-only summariser — explains a file, function, or area of the codebase
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;allowed-tools: [read, grep, glob, lsp_hover, lsp_definition, lsp_references]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are about to explain a piece of this codebase to the user. The
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;target is:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .Args }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Investigate read-only first — use &lt;span class="sb"&gt;`glob`&lt;/span&gt; / &lt;span class="sb"&gt;`grep`&lt;/span&gt; to find relevant
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;files, &lt;span class="sb"&gt;`read`&lt;/span&gt; to inspect them, and &lt;span class="sb"&gt;`lsp_*`&lt;/span&gt; if a language server is
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;available for richer signal. Then write a concise explanation in this
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shape:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**What it is**&lt;/span&gt; — one paragraph, plain language. No code.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**How it fits in**&lt;/span&gt; — what calls it, what it depends on.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Subtleties**&lt;/span&gt; — anything non-obvious.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. &lt;span class="gs"&gt;**Where to look next**&lt;/span&gt; — 1–2 next files worth reading.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The body is a Go &lt;code&gt;text/template&lt;/code&gt;. Available variables:&lt;/p&gt;</description></item><item><title>Workflows</title><link>https://tarathestar.github.io/enso/docs/workflows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/workflows/</guid><description>&lt;h1 id="workflows"&gt;Workflows&lt;a class="anchor" href="#workflows"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;em&gt;workflow&lt;/em&gt; is a declarative agent pipeline — multiple roles with
their own prompts and tool restrictions, wired together by edges. The
canonical example is &lt;strong&gt;planner → coder → reviewer&lt;/strong&gt;: one agent
investigates and produces a plan, the next implements it, the third
critiques the result.&lt;/p&gt;
&lt;h2 id="file-format"&gt;File format&lt;a class="anchor" href="#file-format"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;~/.enso/workflows/&amp;lt;name&amp;gt;.md&lt;/code&gt; (user) or &lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/workflows/&amp;lt;name&amp;gt;.md&lt;/code&gt;
(project), frontmatter + body. One &lt;code&gt;## &amp;lt;role&amp;gt;&lt;/code&gt; section per agent.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;roles:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; planner:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tools: [read, grep, glob]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; coder:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tools: [read, write, edit, bash, grep, glob]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reviewer:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tools: [read, grep, glob]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edges:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; planner -&amp;gt; coder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; coder -&amp;gt; reviewer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## planner
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are the planner. Read the relevant code and produce a concrete,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file-scoped plan for the following request:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .Args }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output a numbered list of changes, each naming the file and the
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;specific modification. Do not write code yet. End with a short list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;of risks and open questions.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## coder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are the coder. Implement the plan below using read/write/edit/bash:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .planner }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Do not deviate from the plan; if you find the plan is wrong, stop and
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;explain rather than improvise.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## reviewer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are the reviewer. The implementation is below; the original plan
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;preceded it:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plan:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .planner }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Implementation summary:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .coder }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read the actual changed files and report:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; What&amp;#39;s correct.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; What&amp;#39;s wrong (severity-ordered).
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- What tests would catch regressions.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="frontmatter-fields"&gt;Frontmatter fields&lt;a class="anchor" href="#frontmatter-fields"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# role-name → role config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;...] &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# registry filter; empty = full registry&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;name&amp;gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# provider name from [providers.X]; empty = inherit default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# explicit dependencies — runner topo-sorts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;planner -&amp;gt; coder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;coder -&amp;gt; reviewer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;edges&lt;/code&gt; declares dependency direction (&lt;code&gt;a -&amp;gt; b&lt;/code&gt; means b waits for a).
Roles with no incoming edges run first. Sibling roles (no dependency
between them) run in parallel.&lt;/p&gt;</description></item><item><title>MCP servers</title><link>https://tarathestar.github.io/enso/docs/mcp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/mcp/</guid><description>&lt;h1 id="mcp-servers"&gt;MCP servers&lt;a class="anchor" href="#mcp-servers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt; servers
expose tools to the agent over a JSON-RPC transport. ensō&amp;rsquo;s MCP
client (built on &lt;code&gt;mark3labs/mcp-go&lt;/code&gt;) connects to as many servers as
you configure and merges their tools into the same registry as the
built-ins.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;a class="anchor" href="#configuration"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Stdio transport — server is a subprocess.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Only $ENSO_*-prefixed env vars expand here; everything else collapses&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# to &amp;#34;&amp;#34; (logged once). See [Secrets](/enso/docs/secrets/) for why.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gitea-mcp-server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;--token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$ENSO_GITEA_TOKEN&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# HTTP transport (Streamable-HTTP, falls back to SSE).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mcp.notion.com/v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Authorization&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Bearer $ENSO_NOTION_TOKEN&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;command&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stdio transport: the binary to spawn. Mutually exclusive with &lt;code&gt;url&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;args&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CLI args. &lt;code&gt;$VAR&lt;/code&gt; / &lt;code&gt;${VAR}&lt;/code&gt; resolve against the process env at startup.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP transport: the server&amp;rsquo;s base URL. Mutually exclusive with &lt;code&gt;command&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;headers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP transport only. Static map of header name → value, applied to every request. &lt;code&gt;$VAR&lt;/code&gt; expanded.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each block becomes one connection. ensō connects with a 10-second
per-server timeout and proceeds with whichever connect; failures are
logged but don&amp;rsquo;t abort startup.&lt;/p&gt;</description></item><item><title>Daemon</title><link>https://tarathestar.github.io/enso/docs/daemon/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/daemon/</guid><description>&lt;h1 id="daemon-mode"&gt;Daemon mode&lt;a class="anchor" href="#daemon-mode"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;enso daemon&lt;/code&gt; runs a long-lived agent server on a unix socket
(&lt;code&gt;~/.enso/daemon.sock&lt;/code&gt;). &lt;code&gt;enso run --detach&lt;/code&gt; submits a
fire-and-forget prompt to it and exits with the new session id.
&lt;code&gt;enso attach &amp;lt;id&amp;gt;&lt;/code&gt; opens an interactive TUI driven by the live event
stream.&lt;/p&gt;
&lt;p&gt;The daemon is &lt;strong&gt;POSIX-only&lt;/strong&gt; — Linux, macOS, BSD. Windows users run
via WSL.&lt;/p&gt;
&lt;h2 id="when-to-use-the-daemon"&gt;When to use the daemon&lt;a class="anchor" href="#when-to-use-the-daemon"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Long-running prompts&lt;/strong&gt; you want to leave going while you do other
work. &lt;code&gt;enso run --detach &amp;quot;audit the whole repo for X&amp;quot;&lt;/code&gt; returns
immediately with a session id.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent operations from automation / cron / CI&lt;/strong&gt; that need to
outlive the invoking script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For interactive day-to-day work, &lt;code&gt;enso&lt;/code&gt; (the in-process TUI) is the
right tool. The daemon path is intentionally narrower.&lt;/p&gt;</description></item><item><title>Secrets</title><link>https://tarathestar.github.io/enso/docs/secrets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/docs/secrets/</guid><description>&lt;h1 id="secrets"&gt;Secrets&lt;a class="anchor" href="#secrets"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;ensō is local-first; there&amp;rsquo;s no central secret store. The patterns
below cover provider API keys, MCP server tokens, and per-repo
secrets without paying for an OS keyring integration nobody asked
for.&lt;/p&gt;
&lt;h2 id="the-three-surfaces"&gt;The three surfaces&lt;a class="anchor" href="#the-three-surfaces"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Where&lt;/th&gt;
 &lt;th&gt;What&lt;/th&gt;
 &lt;th&gt;How to set&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[providers.&amp;lt;name&amp;gt;] api_key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;LLM endpoint bearer token&lt;/td&gt;
 &lt;td&gt;TOML literal &lt;em&gt;or&lt;/em&gt; &lt;code&gt;$ENSO_FOO&lt;/code&gt; reference&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[mcp.&amp;lt;name&amp;gt;] headers&lt;/code&gt; / &lt;code&gt;args&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Per-server auth (token, header)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$ENSO_FOO&lt;/code&gt; reference (literal also works)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;cwd&amp;gt;/.enso/config.local.toml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Per-repo overrides (gitignored)&lt;/td&gt;
 &lt;td&gt;Free-form TOML; same expansion rules apply&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="enso_-env-var-indirection"&gt;&lt;code&gt;$ENSO_*&lt;/code&gt; env-var indirection&lt;a class="anchor" href="#enso_-env-var-indirection"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Any &lt;code&gt;$VAR&lt;/code&gt; or &lt;code&gt;${VAR}&lt;/code&gt; reference inside the fields above is
expanded against the process environment, &lt;strong&gt;but only for variables
whose name starts with &lt;code&gt;ENSO_&lt;/code&gt;&lt;/strong&gt;. A reference to anything else
(e.g. &lt;code&gt;$AWS_SECRET_ACCESS_KEY&lt;/code&gt;) collapses to the empty string and
logs one &lt;code&gt;WARN&lt;/code&gt; to &lt;code&gt;~/.enso/enso.log&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Contributing</title><link>https://tarathestar.github.io/enso/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tarathestar.github.io/enso/contributing/</guid><description>&lt;h1 id="contributing"&gt;Contributing&lt;a class="anchor" href="#contributing"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;ensō is small enough that the contributor flow is mostly &amp;ldquo;read
&lt;code&gt;AGENTS.md&lt;/code&gt;, run &lt;code&gt;make check&lt;/code&gt;, send a patch.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="operating-instructions-for-agents-and-humans"&gt;Operating instructions for agents (and humans)&lt;a class="anchor" href="#operating-instructions-for-agents-and-humans"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; at the repo root is the source of truth. Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Always run &lt;code&gt;make check&lt;/code&gt;&lt;/strong&gt; before sending a patch — &lt;code&gt;gofmt + vet + test + build&lt;/code&gt;. CI runs the same target.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No CGO.&lt;/strong&gt; Every dependency must build with &lt;code&gt;CGO_ENABLED=0&lt;/code&gt;. SQLite
uses &lt;code&gt;modernc.org/sqlite&lt;/code&gt;, not &lt;code&gt;mattn/go-sqlite3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No new dependencies without surfacing the choice.&lt;/strong&gt; ensō is
deliberately minimal; we have a documented short list in
&lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Follow &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/strong&gt; It&amp;rsquo;s the architectural source of truth.
Anything that contradicts its conventions or non-goals (package
layout change, dep substitution, new abstraction) needs to be
discussed first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t &lt;code&gt;git push&lt;/code&gt; or &lt;code&gt;git commit&lt;/code&gt; unless asked.&lt;/strong&gt; Stage and report
what&amp;rsquo;s ready; let the reviewer commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t run destructive commands&lt;/strong&gt; (&lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;git reset --hard&lt;/code&gt;,
&lt;code&gt;git push --force&lt;/code&gt;) without confirmation in the same turn.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="repo-layout"&gt;Repo layout&lt;a class="anchor" href="#repo-layout"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;See &lt;a href="https://tarathestar.github.io/enso/advanced/architecture/"&gt;Architecture&lt;/a&gt; for the
full package map. Quick orientation:&lt;/p&gt;</description></item></channel></rss>