Skip to content

Conversation

@jmandel
Copy link

@jmandel jmandel commented Jan 15, 2026

This PR adds a skills system to Shelley, following Anthropic's skill format.

Overview

Skills extend Shelley with additional capabilities that are automatically discovered and injected into the system prompt at conversation start.

How it works

  1. Skills are installed to ~/.config/shelley/skills/<name>/
  2. Each skill directory contains a SKILL.md with YAML frontmatter (name and description fields), plus any additional files the skill needs (scripts, templates, UI assets, etc.)
  3. On new conversation start, Shelley scans the skills directory and includes a summary of installed skills in the system prompt
  4. The full SKILL.md content tells Shelley when and how to use the skill

System Prompt Changes

New <skills> section added:

  • Lists installed skills as "name: description"
  • Includes one-liner install command for skills distributed as .zip files
  • Instructions to check ~/.config/shelley/skills/ for full skill details

Installation

Skills can be distributed as zip files containing SKILL.md plus supporting files (scripts, libraries, UI components, etc.). Install via:

curl -sL <url> -o /tmp/s.zip && \
  n=$(unzip -p /tmp/s.zip SKILL.md | grep '^name:' | cut -d: -f2 | tr -d ' ') && \
  mkdir -p ~/.config/shelley/skills/$n && \
  unzip -o /tmp/s.zip -d ~/.config/shelley/skills/$n

Changes

  • server/system_prompt.go: Add loadSkillPreambles() and parseSkillPreamble()
  • server/system_prompt.txt: Add <skills> section to template
  • server/skill_test.go: Tests for YAML frontmatter parsing

exe.dev user and others added 2 commits January 15, 2026 17:54
Skills are installed to ~/.claude/skills/<name>/SKILL.md, following
Anthropic's official skill format (https://docs.anthropic.com/en/docs/claude-code/skills).

Each skill's SKILL.md has YAML frontmatter with required 'name' and 'description'
fields. The description tells Claude when to apply the skill.

System prompt changes:
- Add <skills> section listing installed skills as 'name: description'
- Include manual installation instructions (curl + unzip)
- Instruct Shelley how to dynamically discover new skills

Code changes:
- Add SkillPreambles field to CodebaseInfo
- Add loadSkillPreambles() to scan ~/.claude/skills/ directory
- Add parseSkillPreamble() to extract name+description from YAML frontmatter

Example SKILL.md:
---
name: code-reviewer
description: Reviews PRs for code quality. Use when reviewing pull requests.
---
Full instructions here...

Co-authored-by: Shelley <shelley@exe.dev>
Include ShelleyPort and ShelleyBaseURL in the system prompt data so
Shelley can generate links to conversations.

For exe.dev:
- Port 9999 uses https://<hostname>.shelley.exe.xyz
- Other ports use https://<hostname>.exe.xyz:<port>

For non-exe.dev: http://localhost:<port>

The system prompt now includes a <shelley_web_ui> section with the base
URL and instructions for linking to conversations.

Co-authored-by: Shelley <shelley@exe.dev>
@cla-bot
Copy link

cla-bot bot commented Jan 15, 2026

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: exe.dev user.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

Josh Mandel and others added 4 commits January 15, 2026 21:50
…ills

Use Shelley's own config directory for skills instead of Claude Code's
directory structure. This keeps all Shelley configuration in one place.

Co-authored-by: Shelley <shelley@exe.dev>
Include the LLM model being used in the system prompt so the agent
knows what model it's running on.

Co-authored-by: Shelley <shelley@exe.dev>
Move system prompt creation from Hydrate() to AcceptUserMessage(),
after ensureLoop() sets the modelID. This ensures the model name
is available when generating the system prompt.

Co-authored-by: Shelley <shelley@exe.dev>
The system prompt is created after ensureLoop() because the model ID
isn't known until then. However, the loop captures cm.system at creation
time, which is empty. This adds SetSystem() to the loop and calls it
after creating the system prompt so it actually reaches the LLM.

Co-authored-by: Shelley <shelley@exe.dev>
@cla-bot
Copy link

cla-bot bot commented Jan 15, 2026

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: exe.dev user, Josh Mandel.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant