Skip to content

Skills#

Skills are folders with SKILL.md which teachs LLM how to solve a specific task or gain knowledge about it. Following the agentskills standard, ECA searches for skills in these locations, where each SKILL.md should contain name and description metadatas:

  • Workspace: .eca/skills/some-skill/SKILL.md and .agents/skills/some-skill/SKILL.md
  • Global: ~/.config/eca/skills/some-skill/SKILL.md and ~/.agents/skills/some-skill/SKILL.md

.agents/skills and ~/.agents/skills are the cross-tool locations, also read by other agents like Codex, Cursor, Copilot and pi, so skills placed there are shared between them.

When more than one skill has the same name, ECA keeps only the first one found in this order: configured skills paths, workspace .eca/skills, workspace .agents/skills, ~/.config/eca/skills, ~/.agents/skills, plugin skills, then built-in skills. This means a workspace skill overrides a global skill with the same name.

When sending a prompt request to LLM, ECA will send only name and description of all available skills, LLM then can choose to load a skill via eca__skill tool if that matches user request.

Check the examples:

~/.config/eca/skills/lint-fix/SKILL.md
---
name: lint-fix
description: Learn how to lint and fix the code
---

# Instructions

Run `clojure-lsp diagnostics` to lint the code
~/.config/eca/skills/gif-generator/SKILL.md
---
name: gif-generator
description: Knowledge and utils to create gifs. Provide concepts and scripts, use when requested to create gifs.
---

- Use scripts/gif-generate.py passing gif name and dimensions.
- <More complex instructions here>
...
~/.config/eca/skills/gif-generator/scripts/generator.py
from PIL import Image
# Python code that generates a gif here
....

It's possible to control which skills LLM have access globally or for a specific agent. You just need to define a tool call approval for the eca__skill for a specific skill name:

Example disabling all skills but one for an agent

~/.config/eca/config.json
{
  "toolCall": {
    "approval": {
      "deny": {
        "eca__skill": {}
      }
    }
  },
  "agent": {
    "reviewer": {
      "toolCall": {
        "approval": {
          "allow": {
            "eca__skill": {"argsMatchers": {"name": ["my-skill"]}}
          }
        }
      }
    }
  }
}

Add to your config the skills key. path can point to a single skill directory (containing SKILL.md) or a directory containing multiple skill subdirectories. Directories load SKILL.md files recursively. Relative paths are searched from each workspace root if not an absolute path:

~/.config/eca/config.json
{
  "skills": [{"path": "/home/user/skills"}]
}

Parameterized skills#

Skills can receive arguments when invoked as slash commands, using the same variable substitution as custom commands: $ARGS, $ARGUMENTS, and positional $1, $2, etc.

When arguments are provided, ECA substitutes them directly into the skill body instead of asking the LLM to load the skill via eca__skill.

~/.config/eca/skills/review-pr/SKILL.md
---
name: review-pr
description: Review a pull request given its URL
---

Review the following pull request: $ARGS
Focus on code quality, correctness, and test coverage.

Then invoke it with:

/review-pr https://github.com/org/repo/pull/123

ECA will substitute $ARGS with the URL and send the full skill body as the prompt.

You can have more directories and contents like scripts/, references/, assets/ for a skill making it really powerful, check the spec for more details.