<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>User guide on ensō</title><link>https://tarathestar.github.io/enso/docs/</link><description>Recent content in User guide on ensō</description><generator>Hugo</generator><language>en</language><atom:link href="https://tarathestar.github.io/enso/docs/index.xml" rel="self" type="application/rss+xml"/><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>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>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></channel></rss>