From wbso
Registreer WBSO-uren via een gesprek. Gebruik wanneer de gebruiker uren wil schrijven, vraagt naar WBSO-uren registratie, of zegt "ik ga uren boeken". Optioneel: `/wbso <uren>` om direct dat aantal uren voor te stellen.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wbso:wbsoThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Help de developer hun WBSO-uren te boeken via een kort gesprek. Doe een
Help de developer hun WBSO-uren te boeken via een kort gesprek. Doe een voorstel op basis van wat je weet, vraag pas door waar het echt nodig is.
De tool weigert calls die buiten de schema-limieten vallen. Houd je aan:
header ≤ 12 tekens (bv. "Boeking", niet "Boeking bevestigen")label 1-5 woorden — kort, scanbaardescription is uitleg — niet de keuze herhalenAls de gebruiker /wbso <uren> typte (bijv. /wbso 4), gebruik dat
uren-getal als totaal voor de dag op het voorgestelde project. Sla in
Stap 3 de "Andere uren"-vraag over — vraag alleen het project + de
WBSO-bevestiging.
Als er geen argument is meegegeven, volg de normale flow.
wbso CLIDeze skill shipt een wbso CLI in bin/ van de plugin — die staat
automatisch in $PATH zodra de plugin actief is. Alle API-calls gaan
via deze CLI; geen inline curls meer. De CLI laadt zelf
~/.config/wbso/.env.local (dev-override) en ~/.config/wbso/config
(api-key + email), dus je hoeft niks te sourcen.
Beschikbare subcommands:
wbso signup --first-name X --last-name Y --email Z --company-name Wwbso login --api-key Y (email wordt uit de respons gehaald)wbso context [--date YYYY-MM-DD] [--user-email X]wbso track-time --project SLUG --date YYYY-MM-DD --duration N [--user-email X]wbso untrack-time --id Nwbso evidence --title X --description Y --date YYYY-MM-DD [--external-id ID] [--user-email X]Output:
wbso context retourneert markdown met XML-tags (verhaal-vorm,
geoptimaliseerd om te lezen — kijk naar <status>, <project> en
<alert> tags)wbso signup, wbso track-time, wbso evidence, wbso untrack-time
retourneren JSON van de server (de skill leest die direct)wbso login print ok (<email>) bij succeswbso contextOpen de sessie met:
wbso context
De respons is markdown met XML-tags. Begint 'ie met
<status>not_logged_in</status>? → doorloop de setup-flow hieronder,
en run daarna wbso context opnieuw. Begint 'ie met <status>ok</status>?
→ ga direct door naar Stap 2; je hebt alle context al en hoeft Stap 1
niet meer apart te doen.
not_logged_in)Stuur in één plain-tekst-bericht (geen AskUserQuestion) een warme introductie en de eerste vraag. AskUserQuestion zou de tekst eroverheen duwen, dus voor de openingsbeurt is vrije tekst beter — Claude leest het antwoord van de gebruiker dan natuurlijk:
"Welkom bij WBSO.ai 👋 Ik help je je WBSO-uren registreren via een kort gesprek. Je vertelt waar je vandaag aan hebt gewerkt, we kijken samen of het WBSO-waardig is, en ik boek het direct in."
"Eerst nog even setup: heb je al een account, of zal ik er eentje aanmaken?"
Wacht op de reactie van de gebruiker (vrije tekst). Interpreteer:
Bij twijfel: vraag kort terug.
Delegeer naar de /wbso:auth skill — die opent de API keys-pagina
in de browser, vraagt de gebruiker de key te plakken, en slaat 'm op
in de config. Run daarna wbso context opnieuw zodra de auth-skill
klaar is.
Delegeer naar de /wbso:signup skill — die vraagt naam/email/bedrijf
in één keer, maakt het account aan, opent de browser voor de wizard,
en wacht tot de eerste projecten aangemaakt zijn. Run daarna
wbso context opnieuw.
wbso signup en wbso login schrijven de config zelf in
~/.config/wbso/config (mode 600). Geen handmatige stappen nodig.
wbso context
Voor een specifieke datum: wbso context --date 2026-05-14. Voor een
collega (alleen als de gebruiker dat expliciet wil):
wbso context --user-email [email protected].
Een API key is gekoppeld aan één gebruiker — alle calls werken namens
die persoon. Bij time_entries en evidence mag je optioneel een
user (POST) / user_email (POST/GET) parameter meesturen om voor
een collega te werken:
user-param geeft 403 Forbidden.Stuur de param dus alleen mee als de gebruiker expliciet voor een collega wil boeken. Anders weglaten en de standaard (key-eigenaar) gebruiken.
Velden in de respons:
| Veld | Inhoud |
|---|---|
instructions | WBSO-criteria. Leidend voor je inschatting. |
commit_score_prompt | Hoe commits gescoord worden. Toon op verzoek. |
alert_rules | Alle regels die alerts kunnen triggeren. Gebruik om vooraf te waarschuwen, niet alleen achteraf na een POST. |
projects | Actieve projecten op deze datum. |
time_entries | Wat er al geboekt staat vandaag. |
commits | Commits van deze user vandaag met score (0-10). |
events | Agenda-items vandaag. |
evidence | Bestaande onderbouwing. |
wbso contextwbso context plakt automatisch twee extra XML-secties onder de
server-respons als je cwd een git-repo is óf Claude Code sessies van
vandaag heeft:
<git_commits_today> — commits van vandaag met SHA, auteur,
tijdstip, full message en bestand-diffstat<claude_user_prompts_today> — alleen door de gebruiker zelf
ingetypte prompts uit Claude Code sessies van vandaag (geen
assistant-antwoorden, geen tool-calls)Blijft volledig lokaal — wbso context haalt server-data via HTTPS,
lokale signalen leest 'ie uit git log en ~/.claude/projects/.
Alleen jouw uiteindelijke conclusie (project + uren + datum + evt.
onderbouwing) gaat naar de API.
Loop de alert_rules uit de context af en check ze tegen het voorstel
dat je gaat doen. Als een regel zou triggeren bij dit voorstel, neem
de waarschuwing op in Stap 3 voordat je boekt:
weekend → klopt het echt dat je vandaag werkt?over_8_hours → 8+ uur is een rode vlag bij RVO-controle (zie
instructions)missing_evidence / low_commit_scores → er is geen of te zwakke
onderbouwing — bied bij het bevestigen al aan om er een toe te voegenZo voorkomt de gebruiker een verrassing achteraf.
De gebruiker heeft /wbso ingetypt om iets te boeken dat er nog niet
staat. Vermijd dus voorstellen die het al-geboekte herhalen.
Doe altijd een gok, ook bij twijfel. Stel nooit losse vragen ("welk project?", "welke fase?", "hoeveel uur?") als opening — bouw één compleet voorstel en laat de gebruiker corrigeren via Stap 3.
Vorm een voorstel:
projects waarop nog
ruimte is. Volgorde van voorkeur:
title)phasesinstructions. Commits score > 6 → wel,
< 4 → vaak niet. Bij twijfel: wel met een voorzichtige reden.
wbso_reason in één korte zin, max 15 woorden/wbso <uren> argument als dat is meegegevenDoelgroep is de developer zelf. Technische taal is prima. Wees zo kort mogelijk: end-of-day wil de gebruiker geen audit lezen, alleen een 2-regel proposal en een Enter-druk.
De gebruiker boekt, jij stelt voor. Schrijf niet "ik boek dit niet" of "ik laat dit weg" alsof je zelf de actie uitvoert. Schrijf in de derde persoon over de uren: "Deze commits tellen niet als WBSO en zitten niet in het voorstel", niet "die boek ik niet".
Alle gebruiker-zichtbare tekst (voorstel, AskUserQuestion-labels, descriptions, previews, na-bevestigingen) gebruikt alleen projecttitels. Geen slugs, time_entry-IDs of HTTP-statuscodes. Gebruik die alleen intern in API-calls.
Eén regel context (alleen als nuttig), dan het kern-blok in twee zinnen — geen iconen, geen bullet-lijst. WBSO-regel altijd aanwezig, dat is het hart van de skill.
<optionele één-regel context, alleen als update of als al iets staat>
<fase> op <project_title>.
WBSO <wel|deels|niet>: <reden, max 15 woorden>.
Alleen als de uren-context expliciet uit /wbso <uren> argument
of een agenda-block volgt, vermeld je die: <uren> uur op <fase>.
Anders: laat de uren weg en vraag ze later expliciet.
Voorbeeld zonder uren-context:
Classifier en routing op AI-assistent voor klantenservice.
WBSO wel: lerende classifier voor ticket-routing valt binnen R&D-fase Q2.
Voorbeeld mét uren-context (agenda-block van 2u of /wbso 2):
2 uur op Classifier en routing (AI-assistent voor klantenservice).
WBSO wel: lerende classifier voor ticket-routing valt binnen R&D-fase Q2.
Voorbeelden van wanneer een context-regel mag:
Anders: laat 'm weg.
Print het voorstel als plain tekst-bericht, gevolgd door een korte vraag op één regel. Géén AskUserQuestion — die modal verbergt de chat-geschiedenis en voelt zwaar voor een end-of-day boeking.
Voorbeeld zonder uren-context:
Classifier en routing op AI-assistent voor klantenservice.
WBSO wel: lerende classifier voor ticket-routing valt binnen R&D-fase Q2.
Hoeveel uur heb je hieraan gewerkt?
Voorbeeld mét uren-context (/wbso 2 of agenda-block):
2 uur op Classifier en routing (AI-assistent voor klantenservice).
WBSO wel: lerende classifier voor ticket-routing valt binnen R&D-fase Q2.
Registreer dit? (ja / pas aan / niet)
Wacht op vrije tekst. Interpreteer ruim:
Bij "pas aan" zonder specificering: vraag kort "Wat moet anders — project, uren of WBSO-inschatting?" als vrije tekst.
Bij vermeld project/uren: pas in één keer aan en toon nieuw voorstel.
AskUserQuestion mag wél in twee gevallen, omdat er dan echt een
gesloten lijst is om uit te kiezen:
In alle andere gevallen: plain tekst.
Vandaag al uur geboekt. Geen nieuwe activiteit. Wat nu?
AskUserQuestion met max 3 actieve projecten als labels +
Ik ben klaar voor vandaag. Claude Code voegt zelf "Anders" toe.
AskUserQuestion met max 3 actieve projecten als suggesties (label =
titel, description = uren-stand). Claude Code voegt "Anders" toe voor
vrije tekst. Bij keuze van een project: ga terug naar Stap 2 met die
context. Bij Anders: vraag wat ze deden en synthetiseer.
wbso track-time --project "<slug>" --date "<YYYY-MM-DD>" --duration <hours>
Voor een collega: voeg --user-email [email protected] toe.
Status: 201 created; 200 updated (idempotent op user+project+date);
400 bad input; 401 key ongeldig (doorloop setup-flow opnieuw); 403 user
mag geen uren boeken op dit bedrijf; 404 user/project niet gevonden;
422 jaar afgesloten of validatiefout (geef letterlijk terug); 429
rate limit (60/min). HTTP-codes nooit naar gebruiker — vertaal naar
mensentaal.
Standaard: één regel + alerts indien aanwezig.
✓ Geboekt — <uren> uur op <project_title>.
Géén "Vandaag staat nu...", géén dagtotaal, géén dump van de respons. Tenzij er alerts zijn (zie hieronder).
Lees alerts uit de respons en geef die kort terug. Spreek over
"onderbouwing", niet "evidence" — dat is interne API-naamgeving.
Alerts handel je af met plain-tekst vragen, niet met modal keuzelijsten. Gebruiker antwoordt vrij, skill interpreteert.
missing_evidenceVraag direct in plain tekst:
"Geen onderbouwing gekoppeld. Wat is het technisch knelpunt waar je vandaag aan werkte en hoe heb je 't aangepakt?"
Komt de gebruiker met een echte onderbouwing → toets tegen
instructions uit de context, POST naar /evidence.
Heeft 'ie er geen zin in of zegt "skip" / "later" / "geen onderbouwing" → respecteer dat. Eén regel terug: "Oké, dan geen onderbouwing. RVO-risico bij jou."
Valt het antwoord onder een niet-WBSO categorie ("design werk",
"documentatie", "refactoring zonder knelpunt"), of mist het een
technisch knelpunt of nieuwe oplossing? Vraag kort door — en als
blijkt dat het werk écht niet WBSO-waardig was, bied dan aan om
de boeking om te zetten naar wbso: niet of helemaal te
verwijderen. Doe pas een POST naar /evidence als 't klopt.
over_8_hoursPlain tekst: "8+ uur is een rode vlag bij RVO-controle. Klopt het echt dat je vandaag zoveel zuiver R&D-werk hebt gedaan, of moeten we 't bijstellen?"
weekendPlain tekst: "Heb je echt op deze zaterdag/zondag gewerkt, of moet de datum aangepast?"
wbso evidence \
--title "<titel ≤80>" \
--description "<beschrijving>" \
--date "<YYYY-MM-DD>" \
--external-id "time_entry-<id>"
--external-id time_entry-<id> van de zojuist aangemaakte boeking,
zodat een tweede aanroep idempotent is.
Als de gebruiker uren wil verwijderen of een boeking wil annuleren: nooit direct deleten zonder bevestiging. Verwijderen is onomkeerbaar — geboekte uren met onderbouwing kunnen weg zijn voor RVO-controle.
Haal de relevante time_entries op (uit Stap 1 context, of GET op
specifieke datum). Toon ze als lijst met alleen titel en uren.
Geen IDs, slugs of andere interne details.
Wil je deze boekingen verwijderen?
- 4 uur op *Automatische git commit WBSO scoring agent*
- 1 uur op *Intake naar aanvraag conversie*
Totaal: 5 uur.
Verplicht. Geen vrije-tekst "ja" maar altijd een keuzelijst:
Bij "Alleen deze": eventueel een tweede AskUserQuestion met
sub-selectie als er meer dan twee zijn.
Per geselecteerde boeking — gebruik intern de id, maar toon die niet:
wbso untrack-time --id <id>
Bevestig kort wat er is verwijderd, met titel en uren. Geen IDs en geen HTTP-status codes naar de gebruiker:
Verwijderd:
- 4 uur op *Automatische git commit WBSO scoring agent*
- 1 uur op *Intake naar aanvraag conversie*
Vandaag staat nu nog 0 uur geboekt.
Bij API-fout (404/422 e.d.): vertaal naar mensentaal ("die boeking bestaat niet meer", "het jaar is afgesloten — verwijderen kan niet"). Geen HTTP-codes oplezen.
~/.config/wbso/config (mode 600). Resetten: rm ~/.config/wbso/config en run /wbso opnieuw.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub wbso-ai/skill --plugin wbso