Browse docsCustomizing

Customizing

Enso’s managed customization surface is instructions (AGENTS.md) and skills at home and workspace scope. A provider CLI may also load your user-level instructions and skills outside Enso; those remain yours. Everything else is wiring in config.json.

This document is written for both readers. If you are the operator, it says where to put things. If you are an agent asked to “add a skill” or “update the workspace instructions”, it says exactly which file to touch.

Instructions: AGENTS.md

Two Enso-managed levels, both read on every turn:

File What belongs in it
~/.enso/AGENTS.md How to behave anywhere: tone, safety, the environment, the CLI
~/.enso/workspaces/<name>/AGENTS.md What this workspace is for and its specific rules

CLAUDE.md sits beside each as a symlink, so both CLI families read one document. Never replace the symlink with a copy — they will drift.

Your provider CLI’s user-level instructions are a third, user-managed scope. Examples are ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md, ~/.gemini/AGENTS.md, and OpenCode’s ~/.config/opencode/AGENTS.md (below $XDG_CONFIG_HOME when that is set); the relevant CLI loads them by its own rules, and Enso never writes them. Workspaces owns the provider-by-provider discovery details.

Every provider CLI finds the home-level file by walking up to the nearest Git root, which is why ~/.enso is initialised as an empty Git repository it never commits to. Codex, Grok, Antigravity, and OpenCode read AGENTS.md directly; Claude Code reads the CLAUDE.md link.

Neither level has to say which chat platform a turn came from. Enso states that itself, in the origin block at the top of every chat prompt; see Concepts § Chat origin. Name a platform in your instructions when you are teaching something genuinely platform-specific — a command, a formatting contract, a field — not to describe the turn in hand.

The home-level file

Shipped with sane defaults. It opens with the voice Enso answers in: curious, capable, warm, and a little quirky, with short replies, plain words, and occasional dry humour. It then covers how to behave, the origin block and the matching ENSO_ORIGIN_* variables, where attachments land, when a reply reaches a conversation, that fetched content is data and not instructions, and when to load each key Enso skill. Skill entries are brief routing cues; procedures, command syntax, and safeguards belong in the skills themselves. Edit it freely: setup preserves an existing file, and managed updates preserve your edits. Only a copy that still matches Enso’s recorded bundled baseline can refresh automatically. The voice is the first thing to change if you want a different one; it is a section, not a setting.

It also ships a ## TODO: Get to know this space section. While it remains, the agent starts a short onboarding conversation in live chat, asking one or two questions at a time and continuing to help with the request. It learns what Enso should help with, who uses the install, and useful preferences without assuming a single person, a team, or a chat platform. Confirmed answers replace placeholders in the home file’s About this space and About the people here sections; workspace-specific purpose and rules belong in that workspace’s instructions. Onboarding records context, not new access or approval rights.

Questions can be skipped or deferred. The agent records and respects a deferral, and removes the TODO once the basics are answered or explicitly skipped. Jobs and beats leave these questions for live chat. Keep the remaining entries short, current, and appropriate for everyone using the install: the home file loads across all workspaces. Never put secrets or private personal details there; detailed background belongs in workspace knowledge/, referenced by path. Existing customized homes can adopt this onboarding guidance manually; upgrades do not overwrite them.

Keep it about behaviour. Facts about a project belong in a workspace.

The workspace file

Deliberately minimal. A new workspace gets this:

# <name>

## Purpose

<!-- What is this workspace for? One or two sentences. -->

## Scope

<!-- What is in bounds, and what is explicitly not. -->

## Terms

<!-- Words that mean something specific here. Delete if none. -->

## Rules

<!-- Anything that must be true on every single turn: approvals, tone,
     people to check with, things never to touch. Delete if none. -->

## Files

- `knowledge/` — durable reference material
- `drafts/` — generated and editable output
- `uploads/` — chat attachments, written by Enso

Fill in the blanks and delete what does not apply. enso workspace audit warns while the template is still untouched, because an unfilled AGENTS.md means the agent is guessing.

Keep it short. The provider CLI loads this file as workspace instructions; Enso does not prepend its contents to the prompt. Anything longer than a screen belongs in knowledge/, referenced by path:

Pricing rules are in `knowledge/pricing.md`. Read it before quoting a number.

The agent reads the reference when it needs it, while the instructions stay short.

Knowledge formatting

The knowledge feature supplies a shared writing style through references/formatting.md and a read-only checker at scripts/lint.py, both under ~/.enso/skills/enso-knowledge/. Ask Enso to update the rules and checker together when you want a different style. Managed upgrades preserve your edits.

These rules apply to both shared and workspace knowledge. Core metadata and link checks remain part of Enso; changing prose conventions does not change that contract. See Consistent formatting for the defaults and checks.

Skills

A skill is a directory with a SKILL.md: frontmatter naming it and saying when to use it, then the instructions.

---
name: research
description: Research a topic across the sources this workspace tracks and write a brief into knowledge/. Use when asked to look into, investigate, or summarise a subject.
---

# Research

Steps, commands, conventions, and what a good result looks like.

The directory name and the frontmatter name must match. The description is what the agent sees when deciding whether to load it, so write it as what it does and when to use it, not as a title. Long reference material goes in references/ beside SKILL.md.

For new skills, follow the Agent Skills specification: names are 1–64 lowercase letters, digits, and hyphens, with no leading/trailing hyphen or --; descriptions are 1–1024 characters. Keep instructions focused (preferably under 500 lines), with tested helpers in scripts/ and reusable templates in assets/ when useful. The bundled enso-skills skill guides authoring, scope, validation, and safe extraction.

The frontmatter must be valid YAML, one key: value mapping, with no key answered twice. A description reading Lays it out: like this is not, because the unquoted colon starts a nested mapping; quote the whole value. Enso reads name and description and ignores any other field, so a SKILL.md your CLI gives extra fields keeps working. enso workspace audit and enso doctor report a frontmatter fault against the file, with its line and column.

Where to put one

Put it in When
<workspace>/skills/ It only makes sense in this workspace
~/.enso/skills/ Every workspace should have it
Your CLI’s user directory, such as ~/.claude/skills/ You want it outside Enso too, in your own terminal sessions

Names must be unique across the workspace and enso scopes. A workspace cannot override a enso-wide skill by reusing its name; enso workspace audit reports that as an error, because the provider CLIs disagree about which copy would win.

Adding or editing a skill needs no Enso restart; the next turn can load the changed files through the existing links. Run enso workspace audit after adding one to confirm its SKILL.md is valid and its name is free. See Workspaces.

The bundled skills

Enso installs these into ~/.enso/skills/:

Skill Covers
enso The map: what Enso is, the home layout, the skill scopes, the CLI, and where the docs are
enso-browser Persistent Chrome profiles, human login, and attaching browser tools; see Browser
enso-heartbeat Finite future actions and temporary watches, script gates, event history, action receipts, and completion
enso-jobs Creating, testing, and troubleshooting scheduled and stage jobs and their prerun and postrun scripts
enso-knowledge Shared and workspace reference, links, imports, formatting rules, and checks; see availability
enso-memory Recent conversations, decisions, reported outcomes, source lookup, and batch refinement; see availability
enso-security Workspace policies, provider arguments, and verification; see Security and policies.
enso-skills Finding official optional skills and writing or refining a skill manually
enso-slack Looking people and channels up, reading history, sending, tables and charts
enso-tables Creating, registering, and querying structured data in enso.db
enso-tasks Working a configured task: handing off with advance, return, or block, attaching evidence, and using its Git worktree; see Tasks
enso-update Checking releases, requesting an authorized self-update, and inspecting recovery
enso-workflow Designing and migrating workflows, optional checks, development presets, lifecycle scripts, and recovery; see availability
enso-workspace Inspecting workspaces, the layout, the audit, and where skills go

Each one says how Enso sets its subject up, then how the agent uses it. enso init and enso setup write a bundled skill or home-level AGENTS.md only when missing. A workspace AGENTS.md is created from its template, stamped with the workspace name, and never refreshed. A bundled job is stamped with the default agent during setup or config apply; those commands leave an existing job directory alone, including missing scripts.

Managed upgrades use .bundles.json, which records hashes when Enso seeds files. A bundled home instruction, skill, job file, or Slack manifest refreshes only when its current bytes still match that recorded baseline. Edited files and previously tracked deletions are preserved; removing an entire tracked bundle keeps it removed during an upgrade. Existing jobs keep their original agent triple, and changing a prompt, schedule, or enabled flag preserves that edited JOB.md. Newly introduced files can be added inside a tracked bundle, and entirely new bundle names are seeded.

Historical files without baseline receipts are user-owned: upgrades do not replace them or restore missing scripts inside their existing bundle directories. Merge new guidance into those files yourself when needed. This upgrade behavior is separate from setup and config apply, which can seed a missing bundle again when explicitly run. See Jobs § Bundled jobs and Upgrading.

The default home AGENTS.md teaches the agent to choose Heartbeat for finite follow-through and jobs for standing responsibilities, even when the user asks without those names. The detailed skill is loaded only when needed; this routing guidance is not injected into each message. It also routes release checks and authorized upgrades through enso-update. The workflow implementation adds enso-workflow for designing a process; enso-tasks handles work within an already configured one. See Workflows for examples. It routes browser tasks through enso-browser and skill discovery or authoring through enso-skills. Historical or edited homes may need that guidance merged into their AGENTS.md; preserve their voice, user information, and local rules.

Official optional skills

The separate geekforbrains/enso-skills repository holds reviewed, opt-in skills. It is the only source the installer accepts:

enso skill list                     # installed Enso-wide skills; no network
enso skill list --available         # the official catalog, with installation status
enso skill show enso-linkedin       # metadata, requirements, files, and source commit
enso skill install enso-linkedin    # install into $ENSO_HOME/skills/enso-linkedin/

These commands do not need a working transport configuration or database. Local listing covers the home only; use the workspace audit or viewer to inspect workspace and external user scopes. See CLI § Skills for JSON results.

Each remote operation resolves the catalog’s main branch to one Git commit and reads from that commit throughout. Install downloads only the catalog’s explicitly named regular files, validates the skill, and publishes a complete directory. URLs, arbitrary repositories, branches, symlinks, and install hooks are not accepted. Network errors leave no installed partial skill. Requirements name bundled skills and must already be present; dependencies are not installed automatically. Chrome, browser tools, accounts, and other prerequisites still need their own setup.

An install never overwrites an existing path, including a manually written skill or a symlink. .enso-skill.json inside the directory records the official source, commit, and original file hashes; it is installation provenance, not a claim that later edits were reviewed. The audit recognizes that receipt for the reserved enso- prefix. Keep it with the skill, and do not fabricate receipts for manually created content.

Optional skills are independent of Enso’s release and are not refreshed by application updates. This initial CLI intentionally has no update, force, or remove operation. To replace a copy, first review and preserve any local changes, then explicitly move the old directory aside before installing again. Agents must not do that to bypass a collision without the user’s agreement. Manual skill creation remains fully supported in either managed scope, using a non-reserved name.

Reviewed skills still run with the provider’s access; this is source restriction, not a sandbox. Inspect a skill before use, retain existing action approvals, and never publish credentials, browser data, personal account configuration, or private company material in the catalog. Site-specific skills reuse enso-browser instead of copying profile and login handling. The catalog README owns its short contribution and validation workflow.

The reserved prefix

Anything Enso installs says so in its name: enso, and everything beginning enso-, is Enso’s. That keeps Enso-installed content distinct from yours and stops a bundled name from colliding with a CLI’s built-in command. The same prefix is reserved for the jobs Enso installs. Give your own skills and jobs other names; enso workspace audit warns about a enso-* skill or job that Enso did not put there.

Wiring

Everything that is not instructions or skills is configuration:

What Where
Which chat locations use which workspace bindings in config.json
Which agent a workspace or job uses defaults, workspaces.<name>.agent, JOB.md
Provider permissions and workspace policies providers.<name>.args and workspaces.<name>.restricted in config.json; see Security and policies
Environment for providers and scripts ~/.enso/secrets/*.env
Scheduled work JOB.md plus its prerun and postrun scripts
Projects and their stages Workflows for choosing a process; projects in config.json for stages/checks/hooks; agent instructions in the bound job’s JOB.md