Skip to main content
Loopy has five extension points, from zero-code Markdown files to full Java SPIs.

Skills

Domain knowledge the agent reads on demand

Slash Commands

Markdown-defined commands from files

Subagents

Specialist agents for delegation

Tool Profiles

New tools via Java SPI

Skills

Skills are the fastest way to make Loopy smarter. A skill is a Markdown file with YAML frontmatter. The agent sees skill names and descriptions upfront but only loads full content when relevant — no tokens wasted.

Create a skill

Place a SKILL.md in your project:
Next time you run Loopy in that directory, the agent discovers the skill automatically.

Where skills live

LocationPathUse case
Project.claude/skills/*/SKILL.mdTeam conventions, checked into the repo
Global~/.claude/skills/*/SKILL.mdPersonal skills across all projects
ClasspathMETA-INF/skills/*/SKILL.md in JARsPublished skill packages (Maven dep)

Install from the catalog

Loopy ships with 23+ curated skills from 8 publishers:

Publish skills as a JAR (SkillsJars)

Package skills as a Maven dependency so teams get them automatically:
Add the JAR to pom.xml and Loopy discovers it on the classpath. Skills follow the agentskills.io spec — they work in 40+ agentic CLIs, not just Loopy.

Slash Commands

Slash commands let you define reusable prompts as Markdown files, following Claude Code’s ~/.claude/commands/ convention. Type /command-name in the chat and the agent executes the expanded prompt.

Create a slash command

Create a .md file in your project or home directory:

How it works

  1. YAML front mattername and description fields. If no front matter, the filename becomes the name.
  2. $ARGUMENTS substitution — replaced with whatever the user types after the command. /review focus on error handling substitutes “focus on error handling”.
  3. Agent delegation — the expanded prompt is sent to the agent as if the user typed it.

Where commands are discovered

LocationPath
Project.claude/commands/*.md
Global~/.claude/commands/*.md
Markdown commands override built-in Java commands with the same name.

Subagents

Subagents are specialist agents the main agent delegates to via the Task tool. Define them as Markdown files — no Java required.

Create a subagent

Create .claude/agents/test-runner.md:
The main agent delegates testing tasks to this subagent automatically based on the description field.

Frontmatter fields

FieldRequiredDescription
nameYesUnique identifier (lowercase, hyphens)
descriptionYesWhen to use — the main agent reads this to decide
toolsNoAllowed tools (comma-separated). Inherits all if omitted
modelNohaiku, sonnet, or opus

Tips

  • Keep description specific — “Runs tests and reports results” routes better than “helps with testing”
  • Restrict tools to what the subagent needs. A test runner doesn’t need Edit
  • Subagents run in isolated context windows — they can’t see the main conversation
  • Subagents cannot spawn other subagents (the Task tool is excluded automatically)

Tool Profiles (Java SPI)

Add new tools the agent can call. Implement a Java interface, package as a JAR, and Loopy discovers it at startup via ServiceLoader.

Implement ToolProfileContributor

Register via ServiceLoader

Create META-INF/services/io.github.markpollack.loopy.tools.ToolProfileContributor:

What ToolFactoryContext provides

FieldTypeDescription
workingDirectoryPathAgent’s working directory
chatModelChatModelThe active LLM (for tools that need AI)
commandTimeoutDurationTool execution timeout (default 120s)
interactivebooleanTrue in TUI mode, false in print/REPL

Built-in profiles

ProfileDescription
devFull interactive toolset (bash, file I/O, search, skills, subagents)
bootSpring Boot scaffolding tools
headlessSame as dev minus AskUserQuestion (for CI/CD)
readonlyRead-only: file read, grep, glob, list directory
Custom profiles load alongside built-in profiles, not replacing them.

Listeners

Observe what the agent does without changing its behavior.

ToolCallListener

Fires around every tool execution:

AgentLoopListener

Fires at loop lifecycle boundaries:
Wire listeners through the MiniAgent builder:
Listener methods should not throw exceptions — exceptions are logged and swallowed to avoid crashing the agent loop.

Programmatic API

Embed Loopy’s agent in other Java applications:

Multi-step with session memory

Context is preserved across run() calls by default:

Builder options

MethodDescriptionDefault
.model(String)Model IDclaude-sonnet-4-6
.workingDirectory(Path)Agent’s working directoryrequired
.systemPrompt(String)Custom system promptBuilt-in coding prompt
.maxTurns(int)Max loop iterations80
.costLimit(double)Max cost in dollars$5.00
.sessionMemory(boolean)Preserve context across run() callstrue
.timeout(Duration)Overall loop timeout10 min
.disabledTools(Set<String>)Tools to excludenone

Custom endpoints (vLLM, LM Studio)