|

Nous Research Adds /learn to Hermes Agent’s Skills System, Capturing Workflows as Slash Commands Without Hand-Writing SKILL.md

🔗

Nous Research has expanded the Skills System inside Hermes Agent, its open-source self-improving agent. The new addition is /learn, a command that writes a reusable skill for you. Point it at a doc web page, an area SDK, a previous dialog, or pasted notes. The reside agent gathers the fabric, then authors a SKILL.md in your behalf.

Hermes Skills System

Skills are on-demand data paperwork the agent hundreds when wanted. Each one is a folder containing a SKILL.md file with directions. They observe a progressive disclosure sample to preserve token utilization low. The format is suitable with the agentskills.io open commonplace.

All expertise reside in ~/.hermes/expertise/, the only supply of reality. On a recent set up, bundled expertise are copied from the repo. Hub-installed and agent-created expertise land there too. Every put in ability turns into a slash command mechanically. Running /plan or /axolotl hundreds that ability’s directions into the flip.

Think of a ability as a reference doc the agent reads solely when related. Memory, in contrast, holds small sturdy info that ought to at all times keep in context.

How /study Works

/study removes the hand-writing step. You describe a supply, and the agent does the sourcing with instruments it already has. It reads native directories with read_file and search_files. It fetches on-line docs with web_extract. It also can seize a workflow you simply walked it by.

# A neighborhood SDK or doc listing
/study the REST consumer in ~/initiatives/acme-sdk, concentrate on auth + pagination

# An on-line doc web page
/study https://docs.instance.com/api/quickstart

# The workflow you simply accomplished on this dialog
/find out how I simply deployed the staging server

# Pasted notes or a described process
/study submitting an expense: open the portal, New > Expense, connect receipt, submit

The agent then authors a ability that follows the home authoring requirements. That means an outline below 60 characters, the usual part order, and Hermes-tool framing. It doesn’t invent instructions that don’t exist.

There is not any separate ingestion engine. /study builds a standards-guided immediate and arms it to the agent as a standard flip. So it really works the identical within the CLI, the messaging gateway, the TUI, and the dashboard. It additionally works on any terminal backend, whether or not native, Docker, or distant. The dashboard provides a Learn a ability button with a listing area, a URL area, and a textual content field.

The agent saves the end result with the skill_manage instrument. If you could have the write-approval gate on, that approval step nonetheless applies.

Why Skills Stay Cheap

Skills load in three ranges, so the agent pays just for what it makes use of.

Level Call Returns Approx. price
0 skills_list() Names, descriptions, classes ~3k tokens
1 skill_view(title) Full content material plus metadata Varies
2 skill_view(title, path) A selected reference file Varies

The agent sees a compact index always. It hundreds full ability content material solely when a activity wants it. This retains a big ability library from flooding the context window.

Four Ways to Create a Skill

/study is one path amongst a number of. The proper selection relies on who authors the ability and the place the supply lives.

Method Who authors Source enter Review gate Best for
Hand-write SKILL.md You Your personal data None Full management over wording
/study The reside agent Dir, URL, dialog, notes skill_manage gate Turning current materials right into a ability quick
skill_manage (auto) The agent itself A workflow it simply solved write_approval gate Capturing procedural reminiscence after exhausting duties
Skills Hub set up A 3rd social gathering Registry or GitHub repo Security scanner Reusing neighborhood or vendor expertise

Agent-created expertise are the agent’s procedural reminiscence. The agent might save an method after a posh activity of 5 or extra instrument calls. It additionally saves when it hit a useless finish and located the working path. By default, write_approval is fake, so the agent writes freely. Set it to true to stage each write for overview below ~/.hermes/pending/expertise/.

Use Cases With Examples

  • Onboarding an inner API: Run /study in your non-public docs URL. The agent produces a ability overlaying auth, pagination, and customary calls. New teammates then invoke it as a slash command.
  • Capturing a deploy runbook: Walk the agent by one staging deploy. Then run /find out how I simply deployed the staging server. The process turns into repeatable throughout the CLI and chat platforms.
  • Grouping a recurring activity: Use a ability bundle to load a number of expertise without delay. One slash command then pulls in overview, check, and PR expertise collectively.
# ~/.hermes/skill-bundles/backend-dev.yaml
title: backend-dev
description: Backend characteristic work — overview, check, PR workflow.
expertise:
  - github-code-review
  - test-driven-development
  - github-pr-workflow
instruction: |
  Always begin by writing failing assessments, then implement.

A Look on the SKILL.md Format

A ability is generally a markdown file with YAML frontmatter. The physique follows a hard and fast part order. /study targets this actual form so output stays constant.

---
title: my-skill
description: Brief description of what this ability does
model: 1.0.0
platforms: [macos, linux]     # Optional — prohibit to particular OS
metadata:
  hermes:
    tags: [python, automation]
    class: devops
---

# Skill Title

## When to Use
Trigger circumstances for this ability.

## Procedure
1. Step one
2. Step two

## Pitfalls
- Known failure modes and fixes

## Verification
How to affirm it labored.

The platforms area can disguise a ability on incompatible working techniques. Conditional fields also can present a ability solely when sure toolsets are current or absent.

Interactive Explainer

Local listing</div>
<div class=”tab” data-src=”url”>🔗 Doc URL</div>
<div class=”tab” data-src=”conv”>💬 Conversation</div>
<div class=”tab” data-src=”notes”>📝 Pasted notes</div>
</div>

<div class=”row”>
<div>
<label>Skill title (slug)</label>
<enter id=”hl-name” worth=”acme-api” maxlength=”40″ placeholder=”lowercase-with-hyphens”>
</div>
<div>
<label>Category</label>
<enter id=”hl-cat” worth=”devops” maxlength=”24″ placeholder=”e.g. devops”>
</div>
</div>

<label>Description (home commonplace: ≤ 60 characters)</label>
<enter id=”hl-desc” worth=”Acme REST API: auth, pagination, widespread calls” maxlength=”90″>
<div class=”ct” id=”hl-ct”>45 / 60</div>

<label id=”hl-srclabel”>Directory path</label>
<enter id=”hl-src” worth=”~/initiatives/acme-sdk”>

<label id=”hl-foclabel”>Focus / instruction (optionally available)</label>
<enter id=”hl-focus” worth=”concentrate on auth + pagination”>

<div class=”cmdprev cmd” id=”hl-cmdprev”></div>

<button class=”run” id=”hl-run”>Run /study ▸</button>

<div class=”out” id=”hl-out”>
<div class=”pd”>
<div class=”lv”><b>Level 0</b><span>skills_list() · ~3k tokens</span></div>
<div class=”lv”><b>Level 1</b><span>skill_view(title) · full</span></div>
<div class=”lv”><b>Level 2</b><span>skill_view(title, path)</span></div>
</div>
<div class=”stage” id=”hl-stage”></div>
<div class=”skillwrap”>
<div class=”cap”><b>Generated ~/.hermes/expertise/&lt;class&gt;/&lt;title&gt;/SKILL.md</b>
<button class=”copy” id=”hl-copy”>Copy</button></div>
<pre id=”hl-skill”></pre>
</div>
<div class=”notice”>Saved through the <span class=”cmd”>skill_manage</span> instrument. With <span class=”cmd”>expertise.write_approval: true</span>, this write is staged below <span class=”cmd”>~/.hermes/pending/expertise/</span> for overview.</div>
</div>
</div>

<div class=”ft”>
<span>Progressive disclosure · agentskills.io commonplace</span>
<span>Demo by <b>Marktechpost</b></span>
</div>

<script>
(perform(){
var root=doc.getElementById(‘hl-learn-demo’);
var src=’dir’;
var tabs=root.querySelectorAll(‘.tab’);
var srcLabel=root.querySelector(‘#hl-srclabel’);
var srcIn=root.querySelector(‘#hl-src’);
var focLabel=root.querySelector(‘#hl-foclabel’);
var focIn=root.querySelector(‘#hl-focus’);
var nameIn=root.querySelector(‘#hl-name’);
var catIn=root.querySelector(‘#hl-cat’);
var descIn=root.querySelector(‘#hl-desc’);
var ct=root.querySelector(‘#hl-ct’);
var cmdPrev=root.querySelector(‘#hl-cmdprev’);
var runBtn=root.querySelector(‘#hl-run’);
var out=root.querySelector(‘#hl-out’);
var stage=root.querySelector(‘#hl-stage’);
var skillPre=root.querySelector(‘#hl-skill’);
var copyBtn=root.querySelector(‘#hl-copy’);

var presets={
dir:{label:’Directory path’,foc:’Focus / instruction (optionally available)’,ph:’~/initiatives/acme-sdk’,
val:’~/initiatives/acme-sdk’,focv:’concentrate on auth + pagination’,instrument:’read_file + search_files’,
verb:’Reading listing’},
url:{label:’Doc URL’,foc:’Focus / instruction (optionally available)’,ph:’https://docs.instance.com/api/quickstart’,
val:’https://docs.instance.com/api/quickstart’,focv:”,instrument:’web_extract’,verb:’Fetching web page’},
conv:{label:’What you simply did’,foc:’Extra element (optionally available)’,ph:’how I simply deployed the staging server’,
val:’how I simply deployed the staging server’,focv:”,instrument:’dialog historical past’,verb:’Reviewing this dialog’},
notes:{label:’Pasted process’,foc:’Extra element (optionally available)’,ph:’open the portal, New > Expense, connect receipt, submit’,
val:’open the portal, New > Expense, connect receipt, submit’,focv:”,instrument:’pasted textual content’,verb:’Parsing pasted notes’}
};

perform slug(s)
perform esc(s)”).exchange(/&/g,’&amp;’).exchange(/</g,’&lt;’).exchange(/>/g,’&gt;’);

perform updateCt(){
var n=descIn.worth.size;
ct.textContent=n+’ / 60′;
ct.className=’ct’+(n>60?’ over’:”);
}

perform updateCmd(){
var p=presets[src];
var arg=srcIn.worth.trim();
var foc=focIn.worth.trim();
var tail=foc?(‘, ‘+foc):”;
if(src===’dir’) tail = foc?(‘ ‘+foc):”;
var physique;
if(src===’dir’) physique=arg+(foc?(‘, ‘+foc):”);
else if(src===’url’) physique=arg;
else physique=arg+(foc?(‘ — ‘+foc):”);
cmdPrev.innerHTML='<span class=”pl”>$ </span>/study ‘+esc(physique);
}

perform setTab(s){
src=s;
tabs.forEach(perform(t){t.classList.toggle(‘on’,t.dataset.src===s);});
var p=presets[s];
srcLabel.textContent=p.label;
focLabel.textContent=p.foc;
srcIn.worth=p.val;srcIn.placeholder=p.ph;
focIn.worth=p.focv;
updateCmd();
}

tabs.forEach(perform(t){t.addEventListener(‘click on’,perform(){setTab(t.dataset.src);});});
[srcIn,focIn].forEach(perform(el){el.addEventListener(‘enter’,updateCmd);});
descIn.addEventListener(‘enter’,updateCt);

perform constructSkill(){
var title=slug(nameIn.worth);
var cat=slug(catIn.worth)||’normal’;
var desc=descIn.worth.trim().slice(0,60);
var p=presets[src];
var arg=srcIn.worth.trim();
var foc=focIn.worth.trim();
var tagBase=title.break up(‘-‘).slice(0,2);
var tags='[‘+tagBase.join(‘, ‘)+’]’;

var whenLine, procLines, verifyLine, sourceNote;
if(src===’dir’){
whenLine=’Use when working with the code in ‘+arg+’.’;
sourceNote=’Authored from native supply: ‘+arg+(foc?(‘ (‘+foc+’).’):’.’);
procLines=[‘1. Inspect the relevant module before calling it.’,
‘2. Apply the documented auth and request pattern.’,
‘3. Handle pagination and errors as the source specifies.’];
verifyLine=’Run a pattern name and ensure a sound response.’;
} else if(src===’url’){
whenLine=’Use when integrating the API documented at ‘+arg+’.’;
sourceNote=’Authored from doc web page: ‘+arg+’.’;
procLines=[‘1. Read the quickstart steps in order.’,
‘2. Set credentials and the base URL.’,
‘3. Make the first request and inspect the payload.’];
verifyLine=’Confirm the response matches the documented schema.’;
} else if(src===’conv’){
whenLine=’Use to repeat this process: ‘+arg+’.’;
sourceNote=’Captured from a accomplished workflow in dialog.’;
procLines=[‘1. Reproduce the steps in the order performed.’,
‘2. Substitute environment-specific values where noted.’,
‘3. Stop and report if any step fails.’];
verifyLine=’Confirm the top state matches the unique run.’;
} else {
whenLine=’Use to observe this process: ‘+arg+’.’;
sourceNote=’Authored from pasted notes.’;
procLines=[‘1. ‘+arg.split(‘,’)[0].trim()+’.’,
‘2. Continue by every listed step so as.’,
‘3. Confirm completion earlier than closing the duty.’];
verifyLine=’Confirm the ultimate step accomplished efficiently.’;
}

var L=’n’;
var s=”;
s+='<span class=”fm”>—</span>’+L;
s+='<span class=”key”>title:</span> ‘+esc(title)+L;
s+='<span class=”key”>description:</span> ‘+esc(desc)+L;
s+='<span class=”key”>model:</span> 1.0.0’+L;
s+='<span class=”key”>metadata:</span>’+L;
s+=’ <span class=”key”>hermes:</span>’+L;
s+=’ <span class=”key”>tags:</span> ‘+esc(tags)+L;
s+=’ <span class=”key”>class:</span> ‘+esc(cat)+L;
s+='<span class=”fm”>—</span>’+L+L;
s+='<span class=”h1″># ‘+esc(title.exchange(/-/g,’ ‘).exchange(/bw/g,perform(c){return c.toUpperCase();}))+'</span>’+L+L;
s+='<span class=”h2″>## When to Use</span>’+L+esc(whenLine)+L+L;
s+='<span class=”h2″>## Procedure</span>’+L+procLines.map(esc).be part of(L)+L+L;
s+='<span class=”h2″>## Pitfalls</span>’+L+’- Do not invent calls the supply doesn’t outline.’+L+’- Re-check the supply if conduct adjustments.’+L+L;
s+='<span class=”h2″>## Verification</span>’+L+esc(verifyLine)+L+L;
s+='<span class=”fm”>&lt;!– ‘+esc(sourceNote)+’ –&gt;</span>’;
return {html:s, title:title, cat:cat};
}

perform plainSkill(title,cat,html){
var tmp=html.exchange(/<[^>]+>/g,”);
var d=doc.createElement(‘textarea’);d.innerHTML=tmp;return d.worth;
}

perform typeStage(strains,carried out){
stage.innerHTML=”;
strains.forEach(perform(t,i){
var d=doc.createElement(‘div’);
d.className=’ln’;d.type.animationDelay=(i*0.32)+’s’;
d.innerHTML=t;stage.appendChild(d);
});
setTimeout(carried out, strains.size*320+150);
}

perform run(){
var p=presets[src];
runBtn.disabled=true;runBtn.textContent=’Running…’;
out.classList.add(‘present’);
var constructed=constructSkill();
var strains=[
‘<span class=”tool”>→ ‘+p.verb+'</span> via <span class=”ok”>’+p.tool+'</span>’,
‘→ Building standards-guided prompt (≤60-char description, fixed section order)’,
‘→ Agent authoring <span class=”ok”>SKILL.md</span> as a normal turn’,
‘<span class=”ok”>✓ skill_manage(create)</span> → ~/.hermes/skills/’+built.cat+’/’+built.name+’/’,
‘<span class=”ok”>✓ Slash command ready:</span> /’+built.name
];
typeStage(strains,perform(){
skillPre.innerHTML=constructed.html;
runBtn.disabled=false;runBtn.textContent=’Run /study ▸’;
report();
});
report();
}

copyBtn.addEventListener(‘click on’,perform(){
var txt=skillPre.innerText;
if(navigator.clipboard){navigator.clipboard.writeText(txt);}
copyBtn.textContent=’Copied ✓’;
setTimeout(perform(){copyBtn.textContent=’Copy’;},1400);
});

runBtn.addEventListener(‘click on’,run);

// auto-resize for WordPress iframe embedding
perform report(){
var h=doc.physique.offsetHeight+40;
if(window.mum or dad){window.mum or dad.postMessage({hlLearnPeak:h},’*’);}
}
window.addEventListener(‘load’,report);
window.addEventListener(‘resize’,report);
new MutationObserver(report).observe(root,{subtree:true,childList:true,attributes:true});

// init
updateCt();setTab(‘dir’);
setTimeout(report,200);
})();
</script>
</div>
</physique></html>”>

Key Takeaways

  • Hermes Agent’s new /study command authors a reusable ability from a listing, URL, dialog, or pasted notes — no hand-writing wanted.
  • The reside agent sources materials with its personal instruments (read_file, search_files, web_extract), then writes a standards-compliant SKILL.md.
  • There is not any separate ingestion engine, so /study works the identical throughout the CLI, TUI, messaging gateway, and dashboard.
  • Progressive disclosure retains expertise low cost: a ~3k-token index hundreds first, and full content material hundreds solely when a activity wants it.
  • Skills save through skill_manage, so the write_approval gate can stage each write for overview earlier than it lands.


Sources

The submit Nous Research Adds /learn to Hermes Agent’s Skills System, Capturing Workflows as Slash Commands Without Hand-Writing SKILL.md appeared first on MarkTechPost.

Similar Posts