Jedan članak da sve shvatiš — šta su zapravo Skills koji su postali hit celog interneta (uz TRAE + Java izvorni kod)
Poslednjih nedelja, najspektakularniji koncept u AI krugovima svakako su Claude Skills. GitHub repozitorijum anthropics/skills za samo par meseci stigao je do 47,5k+ zvezdica, a developer zajednica svuda raspravlja o ovoj novoj mehanici koja Agent-ima "daje krila".

Iskreno, kad sam prvi put naleteo na Skills, nisam baš razumeo poentu. Nije li to samo prompt engineering upakovan u fajl? Ali kad sam se dublje udubio, shvatio sam da dizajnerska ideja zaista ima supstancu — naročito mehanizam progresivnog otkrivanja, koji direktno rešava bolni problem rasipanja tokena kod velikih modela.
U današnjem članku povešću te da temeljno shvatiš:
- šta su Skills zapravo i zašto su toliko popularni
- princip progresivnog učitavanja i logika poziva Skills-a
- u čemu je stvarna razlika između Skills i MCP
- koja zvanično preporučena Skills isplati se koristiti
- kako napraviti svoje Skills u TRAE-u
- i konačno, sami ćemo implementirati mehanizam nalik Claude Skills
Ajde da krenemo.
01. Šta je Claude Skills?
Jednom rečenicom: Skills su "paketi stručnosti" za Claude — kroz predefinisane tokove rada i instrukcije Claude postaje stručniji u određenoj oblasti.

Možeš da zamisliš ovako:
- MCP su Claude-ove "ruke i noge" (povezuju spoljne alate)
- Skills su Claude-ov "tok rada mozga" (zadaju metodu rada)
Jedan konkretan primer.
Zamisli da želiš da ti Claude pomogne oko pisanja tehničkog članka o Spring Boot-u. Bez Skills-a, svaki put bi verovatno morao ovakav razgovor:
Korisnik: Napiši mi članak o Spring Boot-u
Claude: U redu, koja tema?
Korisnik: Nove karakteristike Spring Boot 4.x
Claude: Dobro, ko je ciljna publika? Koliko reči? Koji stil?
Korisnik: Java developeri, 3000 reči, u onom pristupačnom stilu kao Erge...Sa Skills-om, ta "pravila pisanja" se spakuju u jedan ai-article Skill. Dovoljno je da kažeš:
Korisnik: Pomoću ai-article veštine napiši članak o novim karakteristikama Spring Boot 4.xClaude automatski učitava kompletnu definiciju Skill-a i završava članak po unapred zadatom toku rada, stilu i formatu. Zar nije odlično?
Sa tehničke strane, jedan Skill je direktorijum koji sadrži:
SKILL.md— glavni fajl definicije (opis, uslovi okidanja, tok izvršenja)sample/— referentni primeritools/— prilagođeni alati (opciono)
02. Ključni princip Skills: progresivno otkrivanje
Ovo je najbolji deo dizajna Skills.
Znatno je da je kontekstni prozor velikog modela ograničen resurs — na primer, Claude Sonnet 4.5 ima kontekst od 200k tokena. Ako bi u svakom razgovoru strpali kompletne definicije svih Skills, zar to ne bi bilo rasipanje?

Anthropicovi inženjeri osmislili su trojni mehanizam progresivnog učitavanja:
Prvi sloj: pred učitavanje metapodataka
Pri pokretanju Claude Code-a, samo ime i kratak opis svakog Skill-a se učitavaju u system prompt.
Na primer, ako imaš 20 Skills, to možda zauzme samo par stotina tokena, a Claude već zna "aha, trenutno su mi dostupne ove sposobnosti".
## Available Skills
- ai-article: Piše AI tehničke članke u Erge stilu
- qiuzhi: Piše članke o poslu u Erge stilu
- commit: Pravi standardima usklađene Git commit poruke
- pdf: Obradi PDF fajlove — ekstrakcija, spajanje, popunjavanje formulara
...Drugi sloj: kompletno učitavanje na zahtev
Tek kada tvoj zahtev aktivira opis nekog Skill-a, Claude učitava kompletan SKILL.md fajl.
Odluka o okidanju je automatska — ne moraš ručno da pozivaš. Claude na osnovu semantičkog poklapanja procenjuje "koji Skill koristiti za ovaj zahtev".
Na primer, kažeš "napiši AI članak", Claude uoči jako poklapanje sa opisom ai-article i onda:
- Pročita kompletan
SKILL.md - Izvrši po toku rada definisanom u njemu
- Nakon završetka oslobodi kontekst
Treći sloj: lenjo učitavanje referentne dokumentacije
Neki Skill može sadržati obimne referentne materijale (na primer, moj ai-article Skill sadrži kompletan vodič za pisanje). Taj sadržaj se može smestiti u zasebne fajlove koji se čitaju tek kada zaista zatrebaju.
Tok logike poziva
Ceo proces poziva izgleda ovako:
Korisnički zahtev
↓
Claude analizira semantiku zahteva
↓
Poklapa metapodatke Skills-a (prvi sloj)
↓
Odlučuje da li učitati kompletan Skill
↓
Učitava SKILL.md (drugi sloj)
↓
Izvršava po toku rada iz Skill-a
↓
Vraća rezultatPrednosti ovog dizajna:
- Štedi token: Skill koji se ne koristi se ne učitava
- Brži odziv: manje buke u kontekstu
- Automatsko otkrivanje: Claude sam procenjuje koji Skill da koristi, bez ručnog zadavanja
03. Skills naspram MCP
Ovo je mesto gde mnogi brkaju stvari. Prvo ću ti dati tabelu poređenja:
| Dimenzija | MCP | Skills |
|---|---|---|
| Pozicija | Protokol-most | Modul za izvršenje zadataka |
| Funkcija | Povezuje spoljne sisteme (baze, API-je, pregledače itd.) | Pakuje tok rada i instrukcije |
| Metafora | "Ruke i noge velikog modela" | "Tok rada mozga velikog modela" |
| Način upotrebe | Zahteva podešenje servera ili lokalnog servisa | Učitava se na zahtev, kao dodatak |
| Ulazni prag | Visok, mora se razviti MCP Server | Nizak, dovoljan Markdown fajl |
| Slučaj upotrebe | Pristup spoljnim izvorima podataka | Standardizacija ponavljajućih zadataka |
Razlika u jednoj rečenici
MCP omogućava Claude-u da "dohvati" spoljne alate, dok Skills nauče Claude kako da "koristi" tok rada za specifičan zadatak.
Primer:
- Želiš da Claude automatizuje testove u Chrome pregledaču → koristi Playwright MCP
- Želiš da Claude piše komentare koda po određenom standardu → koristi Skills
Zašto postoje Skills kad imamo MCP?
Tri razloga:
- Skills su lakši za upotrebu — MCP zahteva podizanje Servera, a Skills zahteva samo Markdown, pa i običan korisnik brzo može napraviti svoj Skill
- Komplementarni su, nisu zamena — MCP daje sposobnost povezivanja alata, Skills daje standardizovani tok rada, i može ih se kombinovati: jedan Skill može pozivati MCP alate
- Veća ušteda tokena — opis metapodataka Skill-a je sažetiji od opisa MCP alata, a mehanizam progresivnog učitavanja izbegava jednokratno učitavanje previše sadržaja
04. Kako napisati dobar Skill?
Pisanje Skill-a je zapravo pisanje "super prompt-a", ali ima nekoliko ključnih tačaka na koje treba obratiti pažnju.
Osnovna struktura Skill-a
# [Naziv Skill-a]
## Description
Jednom rečenicom objasni šta ovaj Skill radi — za Claude automatsko poklapanje
## Trigger Conditions
U kojim situacijama koristiti ovaj Skill
## Workflow
1. Korak jedan
2. Korak dva
3. Korak tri
## Output Format
Zadaje stil, format i ton ispisa
## Notes
- Bitna stavka 1
- Bitna stavka 25 principa dobrog Skill-a
1. Opis mora biti precizan
❌ Loš primer: Skill za pisanje članaka
✅ Dobar primer: Piše AI tehničke članke u Erge stilu, 2000-3000 reči, pristupačan ton2. Tok rada mora biti jasan Nemoj ostaviti Claude-u da sam "improvizuje" — zapiši svaki korak jasno:
## Workflow
1. Potvrdi trenutni datum (koristi date komandu)
2. Odredi tip članka (AI tehnički / posao)
3. Pročitaj odgovarajući vodič za pisanje
4. Prikupi relevantne materijale
5. Napiši članak po šablonu
6. Sačuvaj u zadati direktorijum3. Priloži referentne primere U sample/ direktorijum stavi nekoliko uspešnih primera, da Claude nauči stil.
Ovo je najvažnije — direktno utiče na kvalitet ispisa.

4. Zadaj jasan format ispisa
## Output Format
---
title: Naslov članka
shortTitle: Kratak naslov
description: Opis članka
tag:
- Tag 1
- Tag 2
category:
- Tehnički članak
author: Erge
date: YYYY-MM-DD
---
Sadržaj...5. Uključi listu za proveru kvaliteta
## Quality Check
- [ ] Da li početak koristi ""
- [ ] Da li se čitaocu obraćaš sa "ti"
- [ ] Da li telo koristi format "## 01. Naslov"
...05. Preporuka zvaničnih Claude Skills
Anthropic je na GitHub-u otvorio zvanični Skills repozitorijum, koji sadrži 20+ praktičnih veština. Izdvojiću ti nekoliko najkorisnijih:
Top 5 obavezno
1. skill-creator
- Funkcija: Meta-alat za kreiranje i upravljanje drugim Skills
- Slučaj upotrebe: Obavezan kad želiš sam da pišeš Skill
- Instalacija:
git clone https://github.com/anthropics/skills.git
2. commit
- Funkcija: Automatski kreira standardima usklađene Git commit poruke
- Karakteristike: Automatski analizira izmene, generiše višelinijske commit poruke, prati Co-Authored-By konvenciju
- Upotreba: Prosto kaži "pomozi mi da komitujem ove izmene"
3. pdf
- Funkcija: Ekstrakcija, spajanje, deljenje i popunjavanje formulara PDF fajlova
- Karakteristike: Dobra obrada PDF-ova sa ne-latiničnim pismom, čuva format
- Slučaj upotrebe: Obrada dokumenata, izveštaja, ugovora itd.
4. docx
- Funkcija: Kreiranje, uređivanje i mode revizije Word dokumenata
- Karakteristike: Podržava praćenje izmena, komentare, čuvanje formata
- Slučaj upotrebe: Kolaborativni dokumenti, generisanje izveštaja
5. frontend-design
- Funkcija: Kreira produkcione frontend interfejse
- Karakteristike: Koristi React, Tailwind CSS, shadcn/ui
- Slučaj upotrebe: Brzi prototipovi, Landing Page, Dashboard
Druge korisne Skills
- pptx: Kreiranje i uređivanje prezentacija
- xlsx: Obrada Excel tabela, izračunavanje formula
- mcp-builder: Gradnja MCP servera
- slack-gif-creator: Kreiranje animiranih GIF-ova za Slack
- canvas-design: Kreiranje vizuelnog dizajna u .png i .pdf formatu
Awesome liste zajednice
Na GitHub-u postoji nekoliko Skills kolekcija koje održava zajednica, na primer:
- awesome-claude-skills: Zbirka najboljih praksi zajednice
- claude-skills-examples: Primeri Skills za različite scenarije
Preporuka za početnike: kreni od zvaničnih Skills, a tek kad savladaš mehanizam, kreći da pišeš svoje.
06. Praktikum: kreiranje Skills u TRAE-u
TRAE je AI IDE iz Kine koji takođe podržava Skills funkcionalnost. Povašću te korak po korak da napraviš jedan.
Preduslovi
- Preuzmi i instaliraj TRAE IDE (https://docs.trae.cn/)
- Proveri da je verzija najnovija
Ručno kreiranje Skill-a
Ako želiš sam da definišeš Skill, postupi ovako:
Korak 1: Napravi direktorijum za Skill
mkdir -p ~/trae-skills/my-java-skill
cd ~/trae-skills/my-java-skillKorak 2: Napiši SKILL.md
# Java Code Review Skill
## Description
Code review po standardu Alibaba Java development handbook-a
## Trigger Conditions
Korisnik traži code review, predloge za optimizaciju koda, poštovanje Java coding standarda
## Workflow
1. Pročitaj Java kod na pregled
2. Proveri konvencije imenovanja (ime klase, metode, promenljive)
3. Proveri konvencije komentara (komentar klase, metode, linijski komentar)
4. Proveri obradu izuzetaka (izbegavaj gutanje izuzetaka, poruke izuzetaka moraju biti konkretne)
5. Proveri upravljanje resursima (IO tokovi i DB konekcije se moraju zatvoriti)
6. Proveri thread safety (thread sigurnost, upotreba lock-ova)
7. Generiši izveštaj revizije
## Output Format
### Code Review Report
**File**: xxx.java
**Issue List**:
1. [Critical] Loše ime klase: `test` treba da bude `Test`
2. [Minor] Nedostaje komentar metode
3. [Suggestion] Koristi try-with-resources za upravljanje tokovima
**Score**: 7/10
**Suggestions**:
[konkretni primer koda]
Korak 3: Uvezi u TRAE
- Otvori interfejs za upravljanje Skills
- Klikni na "Uvezi lokalni Skill"
- Izaberi
my-java-skilldirektorijum - Potvrdi uvoz

Korak 4: Testiranje U TRAE solo modu unesi:
Pregledaj mi ovu klasu
[ nalepi svoj Java kod ]
I videćeš da je TRAE učitao codereview Skill.
07. Sami implementirajmo Skills sistem
Ako želiš duboko da razumeš principe Skills, najbolji način je da sam implementiraš jedan. Napravićemo jednostavan Skills sistem u Javi.
Struktura projekta
myskills/
├── skills/ # Direktorijum za Skills
│ ├── ai-article/
│ │ └── SKILL.md
│ └── git-commit/
│ └── SKILL.md
├── src/main/java/
│ └── com/claude/skills/
│ ├── SkillLoader.java # Skill loader
│ ├── SkillMatcher.java # Skill matcher
│ ├── MySkills.java # Glavni program
│ └── Main.java # Ulazna klasa
└── pom.xml # Maven konfiguracijaImplementacija jezgra
SkillLoader.java — progresivno učitavanje
/**
* Skills loader — implementira mehanizam trojnog progresivnog otkrivanja
*/
public class SkillLoader {
/**
* Skill metadata klasa
*/
public static class SkillMetadata {
private final String description;
private final List<String> triggerConditions;
public SkillMetadata(String description, List<String> triggerConditions) {
this.description = description;
this.triggerConditions = triggerConditions;
}
public String getDescription() {
return description;
}
public List<String> getTriggerConditions() {
return triggerConditions;
}
}
private final String skillsDir;
// Prvi sloj keša: keš metapodataka (učitava se pri pokretanju)
private final Map<String, SkillMetadata> metadataCache = new ConcurrentHashMap<>();
// Drugi sloj keša: keš kompletnih Skills (učitava se na zahtev)
private final Map<String, String> fullSkillCache = new ConcurrentHashMap<>();
public SkillLoader(String skillsDir) {
this.skillsDir = skillsDir;
}
/**
* Prvi sloj: učitava metapodatke svih Skills
* Čita samo ime, opis i uslove okidanja — štedi token
*/
public Map<String, SkillMetadata> loadMetadata() throws IOException {
if (!metadataCache.isEmpty()) {
return metadataCache;
}
Path skillsPath = Paths.get(skillsDir);
if (!Files.exists(skillsPath)) {
throw new IOException("Skills direktorijum ne postoji: " + skillsDir);
}
// Prolazi kroz sve Skill direktorijume
Files.list(skillsPath)
.filter(Files::isDirectory)
.forEach(skillDir -> {
String skillName = skillDir.getFileName().toString();
Path skillFile = skillDir.resolve("SKILL.md");
if (Files.exists(skillFile)) {
try {
List<String> lines = Files.readAllLines(skillFile);
SkillMetadata metadata = extractMetadata(lines);
metadataCache.put(skillName, metadata);
} catch (IOException e) {
System.err.println("Neuspelo čitanje Skill-a: " + skillName);
}
}
});
return metadataCache;
}
/**
* Drugi sloj: učitava kompletan Skill na zahtev
* Kompletan sadržaj se učitava samo kada je zaista potreban
*/
public String loadFullSkill(String skillName) throws IOException {
// Proveri keš
if (fullSkillCache.containsKey(skillName)) {
return fullSkillCache.get(skillName);
}
Path skillPath = Paths.get(skillsDir, skillName, "SKILL.md");
if (!Files.exists(skillPath)) {
throw new FileNotFoundException("Skill not found: " + skillName);
}
String content = Files.readString(skillPath);
fullSkillCache.put(skillName, content);
return content;
}
/**
* Izdvaja metapodatke iz SKILL.md (opis i uslove okidanja)
*/
private SkillMetadata extractMetadata(List<String> lines) {
String description = "Bez opisa";
List<String> triggerConditions = new java.util.ArrayList<>();
boolean inTriggerSection = false;
for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i).trim();
// Izdvoji opis
if (line.startsWith("## Description")) {
if (i + 1 < lines.size()) {
description = lines.get(i + 1).trim();
}
}
// Izdvoji uslove okidanja
if (line.startsWith("## Trigger Conditions")) {
inTriggerSection = true;
continue;
}
// Kraj sekcije uslova okidanja
if (inTriggerSection && line.startsWith("##")) {
inTriggerSection = false;
}
// Čita stavke liste uslova okidanja
if (inTriggerSection && line.startsWith("-")) {
String condition = line.substring(1).trim();
if (!condition.isEmpty()) {
triggerConditions.add(condition);
}
}
}
return new SkillMetadata(description, triggerConditions);
}
/**
* Izdvaja opis iz SKILL.md
*/
private String extractDescription(List<String> lines) {
for (int i = 0; i < lines.size(); i++) {
if (lines.get(i).startsWith("## Description")) {
// Uzmi sledeću liniju
if (i + 1 < lines.size()) {
return lines.get(i + 1).trim();
}
}
}
return "Bez opisa";
}
/**
* Generiše system prompt sa metapodacima
*/
public String getSystemPrompt() throws IOException {
Map<String, SkillMetadata> metadata = loadMetadata();
StringBuilder prompt = new StringBuilder("## Available Skills\n\n");
metadata.forEach((name, meta) ->
prompt.append("- ").append(name).append(": ").append(meta.getDescription()).append("\n")
);
return prompt.toString();
}
/**
* Čisti keš (za testiranje ili ponovno učitavanje)
*/
public void clearCache() {
metadataCache.clear();
fullSkillCache.clear();
}
}SkillMatcher.java — semantičko poklapanje
/**
* Skills matcher — poklapa odgovarajući Skill na osnovu korisničkog unosa
*/
public class SkillMatcher {
private final SkillLoader loader;
public SkillMatcher(SkillLoader loader) {
this.loader = loader;
}
/**
* Poklapa odgovarajući Skill na osnovu korisničkog unosa
* Vraća ime Skill-a sa najvišim skorom poklapanja
*/
public Optional<String> matchSkill(String userInput) throws IOException {
Map<String, SkillLoader.SkillMetadata> metadata = loader.loadMetadata();
// Jednostavno poklapanje ključnih reči (u praksi se koristi semantička sličnost)
String bestMatch = null;
double bestScore = 0.0;
for (Map.Entry<String, SkillLoader.SkillMetadata> entry : metadata.entrySet()) {
String skillName = entry.getKey();
SkillLoader.SkillMetadata meta = entry.getValue();
double score = calculateScore(userInput, meta);
if (score > bestScore) {
bestScore = score;
bestMatch = skillName;
}
}
// Zadaje prag — ispod 0.3 se smatra da nema poklapanja
if (bestScore > 0.3) {
return Optional.of(bestMatch);
}
return Optional.empty();
}
/**
* Računa skor poklapanja
* Prvo poklapa uslove okidanja, zatim opis
*/
private double calculateScore(String userInput, SkillLoader.SkillMetadata metadata) {
double triggerScore = calculateTriggerScore(userInput, metadata.getTriggerConditions());
double descScore = calculateDescriptionScore(userInput, metadata.getDescription());
// Uslovi okidanja imaju veću težinu
return triggerScore * 0.7 + descScore * 0.3;
}
/**
* Računa skor poklapanja uslova okidanja
*/
private double calculateTriggerScore(String userInput, List<String> triggerConditions) {
if (triggerConditions.isEmpty()) {
return 0.0;
}
int matchCount = 0;
for (String condition : triggerConditions) {
// Izdvaja ključne reči iz uslova (obradi format poput 'korisnik pominje "AI članak", "tehnički članak"')
if (condition.contains("korisnik pominje") || condition.contains("sadrži") || condition.contains("odnosi se na")) {
// Izdvoji ključne reči iz navodnika
List<String> keywords = extractKeywords(condition);
for (String keyword : keywords) {
if (userInput.contains(keyword)) {
matchCount++;
break; // Dovoljno je jedno poklapanje uslova
}
}
} else {
// Direktno poklapanje sadržaja
if (userInput.contains(condition)) {
matchCount++;
}
}
}
return (double) matchCount / triggerConditions.size();
}
/**
* Izdvaja ključne reči iz opisa uslova (sadržaj u navodnicima)
*/
private List<String> extractKeywords(String condition) {
List<String> keywords = new java.util.ArrayList<>();
// Razdvaja po različitim vrstama navodnika
String[] parts = condition.split("\"");
for (int i = 0; i < parts.length; i++) {
String part = parts[i].trim();
// Sadržaj u navodnicima je obično na neparnim indeksima
if (!part.isEmpty() && i % 2 == 1) {
keywords.add(part);
}
}
// Ako nema navodnika, podeli po zarezu
if (keywords.isEmpty()) {
String[] tokens = condition.split("[,;]");
for (String token : tokens) {
String cleaned = token.trim();
if (!cleaned.isEmpty() && !cleaned.contains("korisnik") && !cleaned.contains("sadrži")) {
keywords.add(cleaned);
}
}
}
return keywords;
}
/**
* Računa skor poklapanja opisa (originalna pojednostavljena verzija)
*/
private double calculateDescriptionScore(String userInput, String description) {
// Pretvori unos u mala slova i podeli na reči
Set<String> userWords = Arrays.stream(userInput.toLowerCase().split("\\s+"))
.filter(word -> !word.isEmpty())
.collect(Collectors.toSet());
Set<String> descWords = Arrays.stream(description.toLowerCase().split("\\s+"))
.filter(word -> !word.isEmpty())
.collect(Collectors.toSet());
if (userWords.isEmpty()) {
return 0.0;
}
// Izračunaj odnos preseka
Set<String> intersection = new HashSet<>(userWords);
intersection.retainAll(descWords);
return (double) intersection.size() / userWords.size();
}
}MySkills.java — glavni program
/**
* Glavni program Skills sistema
*/
public class MySkills {
private final SkillLoader loader;
private final SkillMatcher matcher;
private final Scanner scanner;
public MySkills(String skillsDir) {
this.loader = new SkillLoader(skillsDir);
this.matcher = new SkillMatcher(loader);
this.scanner = new Scanner(System.in);
}
/**
* Obrađuje korisnički unos
*/
public String process(String userInput) {
try {
// 1. Poklopi Skill
Optional<String> skillNameOpt = matcher.matchSkill(userInput);
if (skillNameOpt.isEmpty()) {
return "Izvinite, nisam pronašao odgovarajući Skill za ovaj zahtev.";
}
String skillName = skillNameOpt.get();
// 2. Učitaj kompletan Skill
String skillContent = loader.loadFullSkill(skillName);
// 3. Ovde bi se pozvao LLM API, sa Skill sadržajem kao system prompt-om
// Pojednostavljena verzija: direktno vraća Skill sadržaj
return "[Koristi Skill: " + skillName + "]\n\n" + skillContent;
} catch (IOException e) {
return "Greška pri obradi zahteva: " + e.getMessage();
}
}
/**
* Prikazuje sve dostupne Skills
*/
public void showAvailableSkills() {
try {
Map<String, SkillLoader.SkillMetadata> metadata = loader.loadMetadata();
System.out.println("=== Dostupni Skills ===");
metadata.forEach((name, meta) ->
System.out.println("- " + name + ": " + meta.getDescription())
);
} catch (IOException e) {
System.err.println("Neuspelo učitavanje Skills-a: " + e.getMessage());
}
}
/**
* Pokreće interaktivni CLI interfejs
*/
public void run() {
// Prikaži dostupne Skills
showAvailableSkills();
System.out.println("\nUnesi svoj zahtev (unesi 'exit' ili 'quit' za izlaz):");
// Interaktivna petlja razgovora
while (true) {
System.out.print("\nTvoj zahtev: ");
String userInput = scanner.nextLine().trim();
if (userInput.equalsIgnoreCase("exit") ||
userInput.equalsIgnoreCase("quit")) {
break;
}
if (userInput.isEmpty()) {
continue;
}
String response = process(userInput);
System.out.println("\nClaude: " + response);
}
System.out.println("Doviđenja!");
scanner.close();
}
public static void main(String[] args) {
String skillsDir = args.length > 0 ? args[0] : "skills";
MySkills mySkills = new MySkills(skillsDir);
mySkills.run();
}
}pom.xml — Maven konfiguracija
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.claude</groupId>
<artifactId>myskills</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Ako je potrebna integracija HTTP klijenta za poziv Claude API-ja -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- JSON obrada (opciono) -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- Jedinično testiranje -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
</plugins>
</build>
</project>Primer Skill
skills/ai-article/SKILL.md
# AI Technical Article Generator
## Description
Piše AI tehničke članke u Erge stilu, 2000-3000 reči, pristupačan ton
## Trigger Conditions
- Korisnik pominje "AI članak", "tehnički članak"
- Sadrži ključne reči poput "napiši članak", "stvori"
- Odnosi se na AI alate, velike modele, programske alate
## Workflow
1. Potvrdi trenutni datum
2. Prikupi relevantne materijale
3. Generiši nacrt članka
4. Napiši članak u Erge stilu
5. Proveri kvalitet
## Output Format
---
title: Naslov članka
shortTitle: Kratak naslov
description: Opis članka
tag:
- AI
- Tehnički članak
category:
- Tehnički članak
author: Erge
date: YYYY-MM-DD
---
Sadržaj...Rezultat pokretanja
# Kompajliraj projekat
# Pokreni program
MySkills
=== Dostupni Skills ===
- ai-article: Piše AI tehničke članke u Erge stilu
- git-commit: Pravi standardima usklađene Git commit poruke
Unesi svoj zahtev (unesi 'exit' ili 'quit' za izlaz):
Tvoj zahtev: Napiši mi AI članak o Claude Skills
Claude: [Koristi Skill: ai-article]
# AI Technical Article Generator
## Description
Piše AI tehničke članke u Erge stilu, 2000-3000 reči, pristupačan ton
[Kompletan Skill sadržaj...]
Razlika u odnosu na prave Claude Skills
Ova pojednostavljena verzija pokazuje jezgro ideje, ali zaostaje za pravim Claude Skills:
- Algoritam poklapanja: mi koristimo jednostavno poklapanje ključnih reči, Claude koristi semantičko razumevanje
- LLM integracija: prava verzija poziva Claude API i ubacuje sadržaj Skill-a u system prompt
- Podrška za alate: prava verzija podržava pozive spoljnih alata iz Skill-a (poput pretrage, operacija nad fajlovima)
- Upravljanje kontekstom: prava verzija upravlja kontekstnim prozorom i izbegava prekoračenje
Za produkciono okruženje potrebno je:
- Integrisati Anthropic API (ili GLM-4.7)
- Koristiti vektorsku bazu za semantičko poklapanje
- Implementirati mehanizam poziva alata
- Dodati upravljanje kontekstom
ending
Danas smo sistematski naučili Claude Skills — od ključnih principa, preko praktične primene, do sopstvene implementacije.
Pregled ključnih tačaka:
- Skills su "paketi stručnosti" koji kroz tok rada čine AI stručnijim
- Mehanizam progresivnog otkrivanja rešava problem rasipanja tokena
- Skills i MCP su komplementarni, nije odnos zamene
- Ključ dobrog Skill-a je jasan tok rada i izričit format ispisa
- AI IDE-ovi poput TRAE već podržavaju Skills funkcionalnost
Pojavljivanje Skills pomoglo je AI-u da od "opšteg asistenta" napravi korak ka "stručnjaku za domene". Zar to nije embrion Agent-a?
Predlog sledećih koraka:
- Probaj zvanične Skills u Claude Code-u
- Napiši Skill koji odgovara tvom toku rada
- Ako te zanima, implementiraj kompletan Skills sistem
To bi bilo sve za danas. Ako ti je koristilo, ne zaboravi lajk i praćenje!
Reference:
