PaiCLI Skill sistem: Neka Agent nauči pravilne načine rada
PaiCLI Skill sistem: Neka Agent nauči pravilne načine rada
Prošli period smo rešili CDP sesiju ponovne upotrebe, Agent konačno može direktno povezati svakodnevni Chrome, GitHub privatni repozitorijum, intranet sistem, Feishu dokument ove sadržaje koji trebaju prijavu Agent sve može videti.
Ali postoje novi problemi.
Na primer, neka PaiCLI prevuče nepoznat URL.
Razumna odluka: prvo probaj web_fetch da li može direktno dobiti glavni sadržaj, ne može prebaci na Chrome DevTools MCP pregledač, pregledač takođe ne može idi na Jina Reader zaštitu.

U ovom periodu, dodajemo PaiCLI Skill sistem.
Odlučuje Agent u kojem scenariju koji alat koristi, kako zaobići prepreke. Nakon dodavanja, PaiCLI će iz "Agent-a sa gomilom alata" postati "Agent sa iskustvom".
01, Razlika između Skill-a i MCP-a
MCP pruža mogućnost, može pretraživati, može vući web stranice, može operisati pregledačem.
Skill pruža odluku, kad pretraživati, kad vući web stranice, kad pokrenuti pregledač.

Claude Code krajem 2025. prvi uveo koncept Skill-a.
Jedan Skill je jedan folder, unutra stavi SKILL.md (priručnik za odluke) plus opcione references fajlove.
Do sada, SKILL.md nije samo stvar Claude Code. Anthropic, OpenAI, Google trojka pod Linux Foundation zajedno su osnovali Agentic AI Foundation, SKILL.md su učinili otvorenim standardom preko alata.
To znači, Skill koji napišeš za Claude Code, na Codex-u može direktno koristiti.
02, Tro-slojna arhitektura učitavanja Skill-a
PaiCLI Skill sistem dizajnira tro-slojni mehanizam učitavanja:
Prvi sloj: ugrađeni Skill, zapakovan u PaiCLI jar paketu, objavljuje se sa verzijom. Trenutno ugrađuje jedan web-access Skill, uči Agent kako da radi internet operacije.
Drugi sloj: korisnički Skill, postavljen u ~/.paicli/skills/<name>/SKILL.md. Postavi svoje globalne Skillove, svi projekti mogu koristiti.
Treći sloj: projektni Skill, postavljen u <projekat>/.paicli/skills/<name>/SKILL.md. Specifični za projekat Skillovi, najviši prioritet.

SkillRegistry je ključna klasa koja upravlja ovim tri sloja skeniranja i spajanja. Skenira po redosledu builtin → user → project, svaki put kad nađe istoimeni Skill direktno prekida prethodni sloj.
PaiCLI start-up-a će ispisati jedan sažetak učitavanja Skill-a:
📚 Skills učitavanje (1)...
✓ web-access builtin description 88 znakova
1/1 omogućeno, indeks segmenata 0.6KBOvaj log odmah možeš videti koliko Skill-a je učitano, izvor je šta, indeks segmenata koliko zauzima prostora.

Da verifikujemo.
Pokreni PaiCLI, unesi /skill list:

Samo jedan ugrađeni web-access. Sada u korisničkom direktorijumu kreiram isti Skill da probam efekat prekidanja:
mkdir -p ~/.paicli/skills/web-access
cat > ~/.paicli/skills/web-access/SKILL.md << 'EOF'
---
name: web-access
description: Prilagođeno korisničko uputstvo za internet operacije (prekida ugrađenu verziju)
version: "9.9.9"
---
Ovo je korisnička verzija web-access, prioritet je viši od ugrađene verzije.
EOFZatim u PaiCLI izvrši /skill reload:

Izvor iz builtin postao user, prekid deluje.
Nakon verifikacije ne zaboravi obrisati korisničku verziju, obnovi ugrađenu verziju:
rm -rf ~/.paicli/skills/web-accessPonovo /skill reload vraća se na ugrađenu.

03, Struktura SKILL.md
Jezgro svakog Skill-a je jedan SKILL.md fajl, deli se u dva dela: YAML frontmatter (metapodaci) i Markdown body (priručnik za odluke).
---
name: web-access
description: |
Sve internet operacije moraju ići kroz ovaj skill,
uključuje pretragu, vučenje web stranica, operacije posle prijave
version: "1.0.0"
author: PaiCLI
tags: [web, browser, search]
---
# web-access Skill
## Filozofija pretraživanja
Određivanje cilja → Izbor početnog punkta → Provera procesa → Odluka o završetku...frontmatter ima samo dva obavezna polja: name i description.
version, author, tags svi su opcionalni. Nepoznata polja se direktno ignorišu.
body deo je priručnik za odluke za LLM. Možeš pisati šta hoćeš, ali je ključno reći LLM-u koji scenarij koju odluku donosi.
Ovde postoji jedan ključan dizajn: body se ne stavlja u system prompt pri start-u. LLM u system prompt-u vidi samo name i description (sažetak jednog reda) svakog Skill-a, kad treba kroz load_skill alat učitava kompletni body.

Zašto ovakav dizajn?
Jer system prompt ima token budžet. Ako se pri start-u svi Skill-i kompletni sadržaj stavi u njega, uključi 10 Skill-a može pojesti nekoliko desetina hiljada token-a. Po potrebi učitavanje, lagani indeks, ovo je dizajn filozofija Skill sistema Claude Code, zove se Progressive Disclosure(postepeno otkrivanje).
04, Ručni YAML parser
SkillFrontmatterParser pokriva 95% stvarnih scenara korišćenja.

Da vidimo nekoliko slučajeva. Normalna jednostruka vrednost:
name: web-access
version: "1.0.0"Višelinijska description (| cevni simbol):
description: |
Sve internet operacije moraju ići kroz ovaj skill,
uključuje pretragu, vučenje web stranica, operacije posle prijaveInline niz:
tags: [web, browser, search]Ako napuješ sintaksu koju ne podržavamo, na primer ugnježdeni objekat {nested: object}, parser će preskočiti ovo polje i u stderr ispisati upozorenje, neće blokirati učitavanje drugih Skill-ova.
⚠️ Skill 'broken' frontmatter parsing upozorenje: red 5 sadrži nepodržanu sintaksu, preskočeno05, Neka LLM sam odlučuje šta učitati
Ovo je ključni mehanizam celog Skill sistema.
Tradicionalni način je korišćenje poklapanja ključnih reči. Korisnik kaže "pomozi mi videti web stranicu", automatski učitava web-access Skill. Ali poklapanje ključnih reči nikada nije dovoljno precizno, "videti web stranicu", "pregledač", "vući", "pretraživati" sve može okidati, takođe može propustiti.
PaiCLI način: registriraj load_skill kao ugrađeni alat, neka LLM sam proceni da li treba pozvati.
U system prompt-u LLM-a će imati jedan odeljak Skill indeks:
## Dostupni Skill-ovi(po potrebi pozivaj load_skill učitaj kompletno uputstvo)
- **web-access**: Sve internet operacije moraju ići kroz ovaj skill, uključuje pretragu, vučenje web stranica, operacije posle prijave...
Kriterijum odluke: kad opis zadatka poklapa sa nekim skill okidačkim scenarijem, pozovi load_skill(name) učitaj kompletno uputstvo,
zatim sledi uputstvo izvrši. Već učitani skill u sledećem krugu će u `## Već učitani Skill` odeljak pojaviti se u tvojoj poruci.
Ne ponavljaj učitavanje istog skill-a; u jednoj sesiji jednom je dovoljno.LLM vidi da problem uključuje internet operacije, sam pozove load_skill("web-access").
Da verifikujemo. Direktno kaži PaiCLI:
> Pomozi mi da vidim šta ovaj članak govoriPosmatraj Agent ponašanje:

LLM nije direktno krenuo da vuče web stranicu, nego prvo učitao web-access priručnik za odluke. Zatim u sledećem krugu, po priručniku za odluke, prvo koristi web_fetch probao jednom (WeChat članak je SPA, ne može dobiti glavni sadržaj), zatim prebaci na Chrome DevTools MCP korišćenjem pregledača otvara stranicu dobio kompletnan sadržaj.
Ovo je vrednost Skill-a——neka Agent nauči pravilne načine rada.
06, Duhovit dizajn user message
Ovaj detalj dizajna je najvrednija tačka za dublju analizu u celom Skill sistemu.
Kad LLM pozove load_skill("web-access"), PaiCLI radi dve stvari:
- Alat vraća jedan kratku potvrdu: "Već učitao skill 'web-access' kompletno uputstvo (3.2KB), u sledećem krugu kontekstu će se odraziti"
- SKILL.md body piše u
SkillContextBuffer
Obrati pažnju, u rezultatu povratka alata nema kompletnog sadržaja body-a. Body je u sledećem krugu konstrukcije user message, iz buffer-a uzima i stavlja ispred korisničkog unosa:
## Već učitani Skill:web-access
<SKILL.md body kompletni sadržaj>
---
Korisnik unos:<korisnikova originalna poruka>Zašto ne direktno u rezultatu povratka alata stavi body?
Zašto ne stavlja u system prompt?
Prvo pitanje: sadržaj povrata alata u LLM očima je "fakt input", LLM teži da ga tretira kao referentnu informaciju. Ali SKILL.md body je "operativno uputstvo", nadamo se da LLM to tretira kao naredbu za izvršenje. Stavlja u user message, LLM će ga tretirati kao "dodatni zahtev korisnika", težina odluke je viša.
Drugo pitanje: system prompt jednom promenjen, API prompt cache će prestati važiti. Ako svaki put load_growth ide promeniti system prompt, prethodno keširane nekoliko hiljada token-a svi su propali. Ide kroz user message injekciju, system prompt uvek ostaje nepromenjen, prompt cache se može zadržati.

Sa perspektive implementacije, load_skill kod je u ToolRegistry.registerSkillTools(). Prvo iz SkillRegistry traži da li skill postoji i omogućen, zatim čita body sadržaj, seče na 5KB, push-uje u SkillContextBuffer, konačno vraća jednu poruku potvrde. Celi proces je vrlo čist, bez ikakvih sporednih efekata.
07, Životni ciklus SkillContextBuffer
SkillContextBuffer je ključna data struktura celog mehanizma injekcije.

Njegov životni ciklus ima nekoliko ključnih karakteristika:
①, Jednokratna potrošnja: drain() uzima sadržaj nakon toga buffer se čisti. Sledeći krug user message neće nositi prethodno uvećeni Skill body. Ovo izbjegava da se body u razgovoru stalno akumulira i eksplodira kontekst.
②, Najviše 3 Skill-a: Ako LLM u istom krugu kontinuirano pozove 3 i više load_skill, buffer čuva samo najskorije 3.
③, Istog imena zamena: Isti Skill je učitan dva puta, novi body zamenjuje stari, neće se ponavljati akumulacija.
④, Izolacija uloga: U PlanExecute režimu, Planner, Worker, Reviewer tri uloge svaki drži nezavisnu buffer instancu, međusobno ne remeti. AgentOrchestrator pri kreiranju SubAgent dodeljuje svakoj ulozi nezavisni SkillContextBuffer.
Zašto izolacija?
Jer Worker je mogao učitati web-access da vuče web stranicu, a Reviewer ne treba ovaj Skill priručnik za odluke — njegova odgovornost je pregledati kvalitet koda, ne pretraživati web. Ako deljen buffer, user message Reviewer-a će biti ubačen gomila nevezanih priručnika za pretraživanje, uzalud troši token.
⑤, /clear reset: izvršenje /clear komande će očistiti buffer, sledeći krug kreće od nule. Ovo je naročito korisno pri debug-iranju Skill-a. Nakon promene SKILL.md sadržaja, prvo /clear očisti stari buffer, zatim /skill reload ponovo učitava, osiguravaš da Agent čita najnoviju verziju.
Prvo neka Agent učita web-access:
> Pomozi mi da vidim
[Agent poziva load_skill("web-access"), završio operaciju]
> Još jedan članak https://www.xiaohongshu.com/explore/67371552000000001901b2aa?xsec_token=ABNTdVgv-ySnmZCIY8jBfaLyQ4YqdGukYbpdtR_-S6j-0=&xsec_source=pc_user
[posmatrać: Agent neće ponoviti poziv load_skill, jer system prompt podssetećuje "jednom u jednoj sesiji je dovoljno"]

U drugom krugu user message neće ponovo pojaviti ## Već učitani Skill:web-access odeljak, ali LLM se seća da je prošli krug već pročitao priručnik za odluke, nastavlja delovati po uputstvu.
08, Duboka analiza web-access Skill-a
PaiCLI ugrađeni prvi Skill je web-access, najčešće korišćeni priručnik za odluke.
Prošli period smo već rekli princip CDP, ovaj period fokusirajmo se na to šta kapacitet odluke web-access kao Skill daje Agent-u.

web-access SKILL.md približno deli se u nekoliko odeljaka:
①, Filozofija pretraživanja, četiri koraka pravilo: odredi cilj (šta informaciju treba dobiti) → izaberi početni punkt (koristi najlakši način pokušaj) → proveri proces (da li dobijeni sadržaj zadovoljava očekivanje) → odluka o završetku (da li je informacija dovoljna).
②, Tabela izbora alata, različiti scenariji odgovaraju različitim alatima. Pretraga koristi web_search, poznati URL koristi web_fetch, SPA dinamički renderovane sajtove koristi Chrome DevTools MCP navigate_page + take_snapshot, web_fetch i pregledač ne mogu rešiti koriste Jina Reader(curl https://r.jina.ai/<url>)zaštitu.
③, Prioritet pregledača, ovo je najesencijalni deo priručnika za odluke. Postepeno nadogradnja strategija: prvo web_fetch probaj jednom (najniži trošak, najmanji token) → neuspeh prebaci na Chrome DevTools isolated režim (nezavisna instanca) → treba prijavljeno stanje prebaci na shared režim (ponovno upotrebljava tvoj Chrome).
④, Direktorijum iskustva sajta. references/site-patterns/ ispod je predvideo 6 sajtova iskustva operacije:
| Sajt | Ključna tačka |
|---|---|
| mp.weixin.qq.com | SPA renderovanje, web_fetch ne može dobiti glavni sadržaj, mora ići pregledačem |
| zhuanlan.zhihu.com | Lazy loading, treba skroliranje okida rendering sadržaja |
| x.com | Striktno ograničenje frekvencije, prijavljeno stanje utiče vidljivost sadržaja |
| xiaohongshu.com | Jačina anti-crawl, može samo koristiti CDP režim |
| github.com | API prioritet, prijavljeno stanje vidi privatni skladište |
| juejin.cn | SSR renderovanje prijateljsko, web_fetch obično može direktno vući |
Jezgro su tri segmenta: ovaj sajt je kakva tehnička arhitektura (SPA ili SSR, jačina anti-crawl, treba li prijavu), koji način može uspešno dobiti sadržaj (verifikovani URL obrasci, CSS selektori, JS izvodi fragmenti), i česti oblici neuspeha i načini rešavanja.
Ugrađene reference se PaiCLI start-up-a kroz SkillBuiltinExtractor iz jar paketa otpakuje u ~/.paicli/skills-cache/web-access/references/.

Otpakivanje nije svaki start-up pokreće, extractor će proveriti skills-cache/<name>/.version fajl i jar ugrađenu verziju broja da li je konzistentan, ako je konzistentan preskače, štedi IO trošak start-up-a. Verzija nije konzistentna ili .version fajl ne postoji tek prepiše ceo cache direktorijum.
LLM kroz read_file čita ove fajlove da dobije iskustvo sajta.
Na primer priprema da vuče WeChat javni nalog članak, prvo read_file("~/.paicli/skills-cache/web-access/references/site-patterns/mp.weixin.qq.com.md"), vidi "SPA renderovanje, web_fetch nevažeći, mora CDP" ove informacije, zatim donosi pravilnu odluku izbora alata.
09, /skill komanda grupa praksa
PaiCLI pruža grupu /skill komandi za upravljanje životnim ciklusom Skill-a:
/skill list, lista sve Skillove, prikazuje ime, izvor, verziju, omogućeno stanje.
> /skill list
● predstavlja omogućeno, ○ predstavlja onemogućeno.
/skill show <name>, vidi kompletnan SKILL.md sadržaj, uključuje frontmatter i body.
> /skill show web-access
/skill off <name>, onemogući jedan Skill. Nakon onemogućavanja LLM u system prompt indeksu ne vidi ga, poziv load_skill će biti odbijen.
> /skill off web-access
Onemogućeno stanje perzistira u ~/.paicli/skills.json fajlu, format je vrlo jednostavan:
{
"disabled": ["web-access"]
}Nakon PaiCLI restart-a onemogućeno stanje i dalje važi.
/skill on <name>, ponovo omogući jedan onemogućeni Skill. Iz skills.json disabled liste uklanja odgovarajuće ime.

/skill reload, ponovo skenira tri direktorijuma, vruće učitava novododate ili izmenjene Skill-ove.
reload utiče samo na sledeći razgovor, neće prekinuti trenutno tekući LLM poziv.
10, Napiši svoj Skill
Razumevši princip, hajde da napišemo projektni Skill.
Pretpostavimo da tvoj projekat ima fiksni proces revizije koda, svaki review treba proveriti bezbednosne rupe, performans rizike, stil koda tri dimenzije. Možeš ovo iskustvo napisati kao jedan Skill:
mkdir -p .paicli/skills/code-reviewcat > .paicli/skills/code-review/SKILL.md << 'EOF'
---
name: code-review
description: |
Priručnik za odluke revizije koda, kad korisnik traži review koda učitava,
po bezbednost, performans, stil tri dimenzije proverava jedan po jedan
version: "1.0.0"
author: Tvoje ime
tags: [review, security, performance]
---
# Code Review Skill
## Proces revizije
Pri primanju zahteva revizije koda, izvrši po sledećem redosledu:
### 1. Bezbednosna dimenzija
- Proveri SQL injection rizik (da li koristi parametrizovani upit)
- Proveri XSS rizik (da li radi escape na korisnički unos)
- Proveri hardcoded API Key ili lozinku
- Proveri da li spajanje fajl putanje postoji rizik traversanja putanje
### 2. Performans dimenzija
- N+1 problem upita
- Poziv baze podataka u velikoj petlji
- Zatvoreni resursi (veza, tok)
- Nepotrebne sinhronizacije brave
### 3. Stilska dimenzija
- Da li dužina metoda prelazi 50 redova
- Da li dubina ugnježdenja prelazi 4 sloja
- Da li imeniranje jasno izražava nameru
EOFNakon čuvanja /skill reload, PaiCLI može prepoznati:

Sledeći put kažeš "pomozi mi da review-ujem ovaj kod", LLM u system prompt indeksu vidi code-review description i tvoj zahtev se poklapa, pozvaće load_skill("code-review"), zatim po bezbednost, performans, stil tri dimenzije proverava jedan po jedan.


11, Kako PaiCLI napisati na CV?
Naziv projekta: PaiCLI - Skill-Driven Agent CLI
Opis projekta: Komandna linija AI Agent-a bazirana na Javi, podržava Skill sistem realizuje kapacitet inteligentnog agenta koji vodi se odlukama, kompatibilno sa SKILL.md otvorenim standardom.
Tehnološki stack: Java 21, Claude API, Chrome DevTools Protocol, MCP protokol, YAML parsiranje
Glavne odgovornosti:
- Dizajn i implementacija tro-slojne Skill arhitekture učitavanja (builtin/user/project), podržava istog imena prekid i vruće reloadovanje, realizuje slojevitu ponovnu upotrebu znanja odluka
- Implementacija load_skill ugrađenog alata, LLM kroz semantičko razumevanje sam učitava
- Dizajn SkillContextBuffer mehanizma injekcije, body ide kroz user message umesto system prompt, zadržava prompt cache pogodak, smanjuje API trošak poziva za oko 15%
