pi-agent-skill-evolution
Hermes Agent-style automated skill creation and evolution for Pi Agent
Package details
Install pi-agent-skill-evolution from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-agent-skill-evolution- Package
pi-agent-skill-evolution- Version
0.1.4- Published
- Aug 18, 2026
- Downloads
- 601/mo · 209/wk
- Author
- icefairy
- License
- MIT
- Types
- extension, skill
- Size
- 41.5 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./extensions/skill-evolution.ts"
],
"skills": [
"./skill-authoring"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-skill-evolution
Hermes Agent-style automated skill creation and evolution for Pi Agent.
Pi Agent already has a great skills system and extension API, but lacks the
closed-loop "auto-create, auto-modify, evolve skills" capability that Hermes
Agent achieves through background_review and skill_manage. This repo fills
that gap on top of Pi's event-driven architecture.
What it does
| Capability | Description |
|---|---|
| Auto-create skills | After a complex task, the agent saves the workflow as a skill via skill_manage |
| Auto-patch skills | When an existing skill can be improved, uses patch for minimal, safe edits |
| Background review loop | After each session, the agent self-audits and decides whether to save/update skills |
| Progressive disclosure | Only skill names + descriptions sit in the system prompt; full content loads on demand |
| Usage tracking | Every skill_manage call records usage count + timestamp in .skill-stats.json |
| Weekly inactive-skill reminder | Every 7 days, Pi reminds you about skills unused for 30+ days |
| Disable/enable skills | Rename a skill dir to .disabled-<name> so Pi stops discovering it, without deleting it |
Files
pi-skill-evolution/
├── README.md ← this file (EN)
├── README_ZH.md ← 中文说明
├── extensions/
│ └── skill-evolution.ts ← Pi extension: skill_manage tool + review loop
├── skill-authoring/
│ └── SKILL.md ← Skill authoring playbook for the agent
└── LICENSE
Installation
Via npm (recommended)
pi install npm:pi-agent-skill-evolution
This installs the published npm package, which bundles the extension and the authoring skill. Pi auto-discovers both — no settings changes needed.
Browse the package gallery at pi.dev/packages.
Direct copy (lightweight)
# Extension
cp extensions/skill-evolution.ts ~/.pi/agent/extensions/
# Authoring skill (recommended)
mkdir -p ~/.pi/agent/skills/skill-authoring
cp skill-authoring/SKILL.md ~/.pi/agent/skills/skill-authoring/
Pi auto-discovers both — no settings changes needed.
Environment variables
| Variable | Default | Description |
|---|---|---|
PI_SKILL_EVOLUTION_DIR |
~/.pi/agent/skills/ |
Directory where skills are stored |
How it works
Usage statistics
Every time the LLM calls skill_manage (create, edit, patch, inspect, delete, list), the extension records:
- Count — total number of successful invocations
- lastUsed — ISO timestamp of the most recent successful call
- description — latest description passed (for create/edit)
Data is stored in ~/.pi/agent/skills/.skill-stats.json and persists across sessions.
Weekly inactive-skill reminder
On every session_start, the extension checks:
- Is the reminder enabled? (default: yes)
- Has it been ≥ 7 days since the last check?
- Are there any skills that haven't been used in ≥ 30 days?
If all three pass, Pi sends a follow-up message listing inactive skills with suggestions to disable/remove them. The reminder can be toggled persistently via the /skill-evolution command (see below).
Disable / enable skills
Instead of deleting a skill you may want to keep, you can disable it:
disablerenames<name>/→.disabled-<name>/, so Pi's skill discovery skips itenablerenames it back, restoring it to active status- Disabled skills still appear in stats but are excluded from
skill_manage listand the inactive reminder scan
skill_manage tool
The extension registers a skill_manage tool callable by the LLM:
| Operation | Required params | What it does |
|---|---|---|
create |
skillName, description, content? |
Creates a new skill |
edit |
skillName, description, content |
Full rewrite of an existing skill |
patch |
skillName, find, replace? |
Exact find-and-replace inside SKILL.md (preferred — safest) |
delete |
skillName |
Removes a skill |
list |
— | Lists all available skills |
inspect |
skillName, content? |
Reads current skill content |
Skill names are validated per the Agent Skills spec: 1–64 chars, lowercase letters, digits, hyphens only, no leading/trailing/consecutive hyphens.
System prompt injection
On before_agent_start, appends:
After completing a complex task (5+ tool calls), fixing a tricky error, discovering a non-trivial workflow, or recovering from an unexpected failure, save the approach as a skill using the skill_manage tool so you can reuse it next time.
Background review loop
On agent_settled (every 10th settled event), sends a brief one-line follow-up prompt that asks the agent to review the completed session and create or patch skills with skill_manage. The message is kept minimal (single line with timestamp) so it does not clutter the conversation history.
You can also trigger a review manually at any time with /skill-evolution review now.
/skill-evolution command (extended)
The /skill-evolution slash command now supports subcommands for managing
usage tracking and inactive-skill reminders. All settings are persisted to
.skill-stats.json and survive Pi restarts.
| Command | What it does |
|---|---|
/skill-evolution review now |
Manually trigger a skill review session |
/skill-evolution reminder on |
Enable weekly inactive-skill reminder (default) |
/skill-evolution reminder off |
Disable the weekly reminder |
/skill-evolution reminder status |
Show whether reminders are on/off + last check time |
/skill-evolution reminder check |
Manually trigger an inactive-skill scan right now |
/skill-evolution inactive |
List skills unused for 30+ days |
/skill-evolution stats |
Show usage count + last-used for every tracked skill |
/skill-evolution disable <name> |
Rename <name>/ → .disabled-<name>/ (Pi stops discovering it) |
/skill-evolution enable <name> |
Rename .disabled-<name>/ → <name>/ (restore it) |
/skill-evolution (no args) |
Show help with all available subcommands |
Disabled skills are excluded from:
skill_manage listresults- The weekly inactive-skill reminder scan
- Pi's skill auto-discovery (they don't appear in the system prompt)
They are still tracked in usage stats and can be re-enabled at any time.
Skill authoring playbook
skill-authoring is a model-invoked skill that auto-loads when the agent uses
skill_manage. Covers:
- Name rules, description best practices, leading words
- Information hierarchy (step / reference / external reference)
- Progressive disclosure and when to split skills
- Failure modes: premature completion, duplication, sediment, sprawl, no-op
skill_manageoperation cheat sheet with preference order: patch loaded → patch existing → create
Hermes Agent vs pi-skill-evolution
| Dimension | Hermes Agent | pi-skill-evolution |
|---|---|---|
| Review trigger | Daemon thread (spawn_background_review) |
agent_settled event + sendUserMessage followUp |
| Skill management | Python skill_manager_tool.py |
TypeScript pi.registerTool() |
| Prompt injection | prompt_builder.py hardcoded layer |
before_agent_start event chain |
| Skill format | agentskills.io SKILL.md |
agentskills.io SKILL.md |
| Review agent | Separate sub-agent instance | Reuses main agent loop |
Pi's implementation is cleaner — no extra agent instances needed, fully leverages Pi's existing event-driven architecture and session system.
Development
Test the extension standalone
pi --extension /path/to/extensions/skill-evolution.ts
pi --extension /path/to/extensions/skill-evolution.ts \
-p "List all skills with skill_manage"
Publish a new version
The project is published as pi-agent-skill-evolution on npmjs.
To release a new version:
cd pi-skill-evolution
npm version patch # or minor/major
npm publish
The pi-package keyword in package.json ensures it appears on pi.dev/packages.
Compatibility
Requires Pi Agent ≥ 0.80 (needs pi.registerTool() dynamic registration and the
agent_settled event).