Loopy has five extension points, from zero-code Markdown files to full Java SPIs.Documentation Index
Fetch the complete documentation index at: https://lab.pollack.ai/llms.txt
Use this file to discover all available pages before exploring further.
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 aSKILL.md in your project:
Where skills live
| Location | Path | Use case |
|---|---|---|
| Project | .claude/skills/*/SKILL.md | Team conventions, checked into the repo |
| Global | ~/.claude/skills/*/SKILL.md | Personal skills across all projects |
| Classpath | META-INF/skills/*/SKILL.md in JARs | Published 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: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
- YAML front matter —
nameanddescriptionfields. If no front matter, the filename becomes the name. $ARGUMENTSsubstitution — replaced with whatever the user types after the command./review focus on error handlingsubstitutes “focus on error handling”.- Agent delegation — the expanded prompt is sent to the agent as if the user typed it.
Where commands are discovered
| Location | Path |
|---|---|
| Project | .claude/commands/*.md |
| Global | ~/.claude/commands/*.md |
Subagents
Subagents are specialist agents the main agent delegates to via theTask tool. Define them as Markdown files — no Java required.
Create a subagent
Create.claude/agents/test-runner.md:
description field.
Frontmatter fields
| Field | Required | Description |
|---|---|---|
name | Yes | Unique identifier (lowercase, hyphens) |
description | Yes | When to use — the main agent reads this to decide |
tools | No | Allowed tools (comma-separated). Inherits all if omitted |
model | No | haiku, sonnet, or opus |
Tips
- Keep
descriptionspecific — “Runs tests and reports results” routes better than “helps with testing” - Restrict
toolsto what the subagent needs. A test runner doesn’t needEdit - Subagents run in isolated context windows — they can’t see the main conversation
- Subagents cannot spawn other subagents (the
Tasktool 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 viaServiceLoader.
Implement ToolProfileContributor
Register via ServiceLoader
CreateMETA-INF/services/io.github.markpollack.loopy.tools.ToolProfileContributor:
What ToolFactoryContext provides
| Field | Type | Description |
|---|---|---|
workingDirectory | Path | Agent’s working directory |
chatModel | ChatModel | The active LLM (for tools that need AI) |
commandTimeout | Duration | Tool execution timeout (default 120s) |
interactive | boolean | True in TUI mode, false in print/REPL |
Built-in profiles
| Profile | Description |
|---|---|
dev | Full interactive toolset (bash, file I/O, search, skills, subagents) |
boot | Spring Boot scaffolding tools |
headless | Same as dev minus AskUserQuestion (for CI/CD) |
readonly | Read-only: file read, grep, glob, list directory |
Listeners
Observe what the agent does without changing its behavior.ToolCallListener
Fires around every tool execution:AgentLoopListener
Fires at loop lifecycle boundaries: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 acrossrun() calls by default:
Builder options
| Method | Description | Default |
|---|---|---|
.model(String) | Model ID | claude-sonnet-4-6 |
.workingDirectory(Path) | Agent’s working directory | required |
.systemPrompt(String) | Custom system prompt | Built-in coding prompt |
.maxTurns(int) | Max loop iterations | 80 |
.costLimit(double) | Max cost in dollars | $5.00 |
.sessionMemory(boolean) | Preserve context across run() calls | true |
.timeout(Duration) | Overall loop timeout | 10 min |
.disabledTools(Set<String>) | Tools to exclude | none |