{"id":"59a2e189-4297-417c-aeb9-aabcc7b972b7","shortId":"t4ZtVL","kind":"skill","title":"learn","tagline":"Manage project learnings. Review, search, prune, and export what vibestack\nhas learned across sessions. Use when asked to \"what have we learned\",\n\"show learnings\", \"prune stale learnings\", or \"export learnings\".\nProactively suggest when the user asks about past patterns or wonder","description":"## Preamble\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\" 2>/dev/null || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l < \"$_LEARN_FILE\" 2>/dev/null | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>/dev/null; then\n    ~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n# Project Learnings Manager\n\nYou are a **Staff Engineer who maintains the team wiki**. Your job is to help the user\nsee what vibestack has learned across sessions on this project, search for relevant\nknowledge, and prune stale or contradictory entries.\n\n**HARD GATE:** Do NOT implement code changes. This skill manages learnings only.\n\n---\n\n## Detect command\n\nParse the user's input to determine which command to run:\n\n- `/learn` (no arguments) → **Show recent**\n- `/learn search <query>` → **Search**\n- `/learn prune` → **Prune**\n- `/learn export` → **Export**\n- `/learn stats` → **Stats**\n- `/learn add` → **Manual add**\n\n---\n\n## Show recent (default)\n\nShow the most recent 20 learnings, grouped by type.\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\"\n~/.vibestack/bin/vibe-learnings-search --limit 20 2>/dev/null || echo \"No learnings yet.\"\n```\n\nPresent the output in a readable format. If no learnings exist, tell the user:\n\"No learnings recorded yet. As you use /review, /ship, /investigate, and other skills,\nvibestack will automatically capture patterns, pitfalls, and insights it discovers.\"\n\n---\n\n## Search\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\"\n~/.vibestack/bin/vibe-learnings-search --query \"USER_QUERY\" --limit 20 2>/dev/null || echo \"No matches.\"\n```\n\nReplace USER_QUERY with the user's search terms. Present results clearly.\n\n---\n\n## Prune\n\nCheck learnings for staleness and contradictions.\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\"\n~/.vibestack/bin/vibe-learnings-search --limit 100 2>/dev/null\n```\n\nFor each learning in the output:\n\n1. **File existence check:** If the learning has a `files` field, check whether those\n   files still exist in the repo using Glob. If any referenced files are deleted, flag:\n   \"STALE: [key] references deleted file [path]\"\n\n2. **Contradiction check:** Look for learnings with the same `key` but different or\n   opposite `insight` values. Flag: \"CONFLICT: [key] has contradicting entries —\n   [insight A] vs [insight B]\"\n\nPresent each flagged entry via AskUserQuestion:\n- A) Remove this learning\n- B) Keep it\n- C) Update it (I'll tell you what to change)\n\nFor removals, read the learnings.jsonl file and remove the matching line, then write\nback. For updates, append a new entry with the corrected insight (append-only, the\nlatest entry wins).\n\n---\n\n## Export\n\nExport learnings as markdown suitable for adding to CLAUDE.md or project documentation.\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\"\n~/.vibestack/bin/vibe-learnings-search --limit 50 2>/dev/null\n```\n\nFormat the output as a markdown section:\n\n```markdown\n## Project Learnings\n\n### Patterns\n- **[key]**: [insight] (confidence: N/10)\n\n### Pitfalls\n- **[key]**: [insight] (confidence: N/10)\n\n### Preferences\n- **[key]**: [insight]\n\n### Architecture\n- **[key]**: [insight] (confidence: N/10)\n```\n\nPresent the formatted output to the user. Ask if they want to append it to CLAUDE.md\nor save it as a separate file.\n\n---\n\n## Stats\n\nShow summary statistics about the project's learnings.\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\"\nVIBESTACK_HOME=\"${VIBESTACK_HOME:-$HOME/.vibestack}\"\nLEARN_FILE=\"$VIBESTACK_HOME/projects/$SLUG/learnings.jsonl\"\nif [ -f \"$LEARN_FILE\" ]; then\n  TOTAL=$(wc -l < \"$LEARN_FILE\" | tr -d ' ')\n  echo \"TOTAL: $TOTAL entries\"\n  # Count by type (after dedup)\n  python3 - <<'PYEOF'\nimport json, sys\nfrom collections import Counter\nlearn_file = \"$LEARN_FILE\"\ntry:\n    raw = open(learn_file).read().strip().split('\n')\nexcept FileNotFoundError:\n    print(\"NO_LEARNINGS\"); sys.exit(0)\nentries = []\nfor l in raw:\n    try: entries.append(json.loads(l))\n    except: pass\nseen = {}\nfor e in entries:\n    dk = (e.get('key',''), e.get('type',''))\n    if dk not in seen or e.get('ts','') >= seen[dk].get('ts',''):\n        seen[dk] = e\nuniq = list(seen.values())\nby_type = Counter(e.get('type','?') for e in uniq)\nby_src  = Counter(e.get('source','?') for e in uniq)\navg_c   = sum(e.get('confidence',0) for e in uniq) / max(len(uniq),1)\nprint(f\"UNIQUE: {len(uniq)} (after dedup)\")\nprint(f\"RAW_ENTRIES: {len(entries)}\")\nprint(f\"BY_TYPE: {dict(by_type)}\")\nprint(f\"BY_SOURCE: {dict(by_src)}\")\nprint(f\"AVG_CONFIDENCE: {avg_c:.1f}\")\nPYEOF\nelse\n  echo \"NO_LEARNINGS\"\nfi\n```\n\nPresent the stats in a readable table format.\n\n---\n\n## Manual add\n\nThe user wants to manually add a learning. Use AskUserQuestion to gather:\n1. Type (pattern / pitfall / preference / architecture / tool)\n2. A short key (2-5 words, kebab-case)\n3. The insight (one sentence)\n4. Confidence (1-10)\n5. Related files (optional)\n\nThen log it:\n\n```bash\n~/.vibestack/bin/vibe-learnings-log '{\"skill\":\"learn\",\"type\":\"TYPE\",\"key\":\"KEY\",\"insight\":\"INSIGHT\",\"confidence\":N,\"source\":\"user-stated\",\"files\":[\"FILE1\"]}'\n```","tags":["learn","vibestack","timurgaleev","agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"capabilities":["skill","source-timurgaleev","skill-learn","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-cursor-ide","topic-developer-tools","topic-kiro","topic-mcp","topic-prompt-engineering","topic-slash-commands"],"categories":["vibestack"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/timurgaleev/vibestack/learn","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add timurgaleev/vibestack","source_repo":"https://github.com/timurgaleev/vibestack","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (5,265 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:06:21.997Z","embedding":null,"createdAt":"2026-05-18T19:06:21.997Z","updatedAt":"2026-05-18T19:06:21.997Z","lastSeenAt":"2026-05-18T19:06:21.997Z","tsv":"'-10':726 '-5':713 '/.vibestack/bin/vibe-learnings-log':735 '/.vibestack/bin/vibe-learnings-search':91,207,259,294,439 '/.vibestack/bin/vibe-slug':46,204,256,291,436,506 '/dev/null':48,50,74,89,95,206,211,258,266,293,298,438,443,508 '/investigate':239 '/learn':169,174,177,180,183,186 '/learnings.jsonl':61 '/projects':58 '/review':237 '/ship':238 '0':567,630 '1':305,638,701,725 '100':296 '1f':672 '2':47,49,73,88,94,205,210,257,265,292,297,340,437,442,507,708,712 '20':197,209,264 '3':718 '4':723 '5':87,93,727 '50':441 'across':14,129 'ad':428 'add':187,189,688,694 'append':406,415,484 'append-on':414 'architectur':467,706 'argument':171 'ask':18,37,479 'askuserquest':372,698 'automat':245 'avg':625,668,670 'b':366,377 'back':403 'bash':44,202,254,289,434,504,734 'c':380,626,671 'captur':246 'case':717 'chang':150,389 'check':283,308,316,342 'claude.md':430,487 'clear':281 'code':149 'collect':546 'command':157,166 'confid':457,462,470,629,669,724,744 'conflict':357 'contradict':288,341,360 'contradictori':142 'correct':412 'count':68,80,85,535 'counter':548,609,618 'd':76,530 'dedup':539,645 'default':192 'delet':332,337 'detect':156 'determin':164 'dict':656,663 'differ':351 'discov':252 'dk':584,590,598,602 'document':433 'e':581,603,613,622,632 'e.get':585,587,595,610,619,628 'echo':77,99,212,267,531,675 'els':98,674 'engin':111 'entri':81,143,361,370,409,419,534,568,583,649,651 'entries.append':574 'eval':45,203,255,290,435,505 'except':561,577 'exist':226,307,321 'export':9,30,181,182,421,422 'f':63,520,640,647,653,660,667 'fi':97,103,678 'field':315 'file':54,65,72,306,314,319,330,338,395,494,515,522,528,550,552,557,729,750 'file1':751 'filenotfounderror':562 'flag':333,356,369 'format':222,444,474,686 'gate':145 'gather':700 'get':599 'glob':326 'group':199 'gt':86 'hard':144 'help':121 'home':56,510,512 'home/.vibestack':57,513 'home/projects':517 'implement':148 'import':542,547 'input':162 'insight':250,354,362,365,413,456,461,466,469,720,742,743 'job':118 'json':543 'json.loads':575 'kebab':716 'kebab-cas':715 'keep':378 'key':335,349,358,455,460,465,468,586,711,740,741 'knowledg':137 'l':70,526,570,576 'latest':418 'learn':1,4,13,23,25,28,31,53,64,67,71,78,79,84,100,105,128,154,198,214,225,231,284,301,311,345,376,423,453,503,514,521,527,549,551,556,565,677,696,737 'learnings.jsonl':394 'len':636,642,650 'limit':92,208,263,295,440 'line':400 'list':605 'll':384 'load':82 'log':732 'look':343 'maintain':113 'manag':2,106,153 'manual':188,687,693 'markdown':425,449,451 'match':269,399 'max':635 'n':745 'n/10':458,463,471 'new':408 'none':101 'one':721 'open':555 'opposit':353 'option':730 'output':218,304,446,475 'pars':158 'pass':578 'past':39 'path':339 'pattern':40,247,454,703 'pitfal':248,459,704 'preambl':43 'prefer':464,705 'present':216,279,367,472,679 'print':563,639,646,652,659,666 'proactiv':32 'project':3,104,133,432,452,501 'prune':7,26,139,178,179,282 'pyeof':541,673 'python3':540 'queri':260,262,272 'raw':554,572,648 'read':392,558 'readabl':221,684 'recent':173,191,196 'record':232 'refer':336 'referenc':329 'relat':728 'relev':136 'remov':374,391,397 'replac':270 'repo':324 'result':280 'review':5 'run':168 'save':489 'search':6,134,175,176,253,277 'section':450 'see':124 'seen':579,593,597,601 'seen.values':606 'sentenc':722 'separ':493 'session':15,130 'short':710 'show':24,172,190,193,496 'skill':152,242,736 'skill-learn' 'slug':51,59 'slug/learnings.jsonl':518 'sourc':620,662,746 'source-timurgaleev' 'split':560 'src':617,665 'staff':110 'stale':27,140,286,334 'stat':184,185,495,681 'state':749 'statist':498 'still':320 'strip':559 'suggest':33 'suitabl':426 'sum':627 'summari':497 'sys':544 'sys.exit':566 'tabl':685 'team':115 'tell':227,385 'term':278 'tool':707 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-cursor-ide' 'topic-developer-tools' 'topic-kiro' 'topic-mcp' 'topic-prompt-engineering' 'topic-slash-commands' 'total':524,532,533 'tr':75,529 'tri':553,573 'true':96 'ts':596,600 'type':201,537,588,608,611,655,658,702,738,739 'uniq':604,615,624,634,637,643 'uniqu':641 'unknown':52,60 'updat':381,405 'use':16,236,325,697 'user':36,123,160,229,261,271,275,478,690,748 'user-st':747 'valu':355 'via':371 'vibestack':11,55,126,243,509,511,516 'vs':364 'want':482,691 'wc':69,525 'whether':317 'wiki':116 'win':420 'wonder':42 'word':714 'write':402 'yet':102,215,233","prices":[{"id":"9e2de65d-0f75-4efd-b328-1a85b770e062","listingId":"59a2e189-4297-417c-aeb9-aabcc7b972b7","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"timurgaleev","category":"vibestack","install_from":"skills.sh"},"createdAt":"2026-05-18T19:06:21.997Z"}],"sources":[{"listingId":"59a2e189-4297-417c-aeb9-aabcc7b972b7","source":"github","sourceId":"timurgaleev/vibestack/learn","sourceUrl":"https://github.com/timurgaleev/vibestack/tree/main/skills/learn","isPrimary":false,"firstSeenAt":"2026-05-18T19:06:21.997Z","lastSeenAt":"2026-05-18T19:06:21.997Z"}],"details":{"listingId":"59a2e189-4297-417c-aeb9-aabcc7b972b7","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"timurgaleev","slug":"learn","github":{"repo":"timurgaleev/vibestack","stars":15,"topics":["agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"license":"mit","html_url":"https://github.com/timurgaleev/vibestack","pushed_at":"2026-05-18T18:19:05Z","description":"vibestack is a portable skill pack for AI coding agents. Slash commands like /office-hours, /ship, /investigate, /tdd, /review install once and work across every agent that supports the Agent Skills open standard — Claude Code, Cursor, Kiro, and a growing list of others. ","skill_md_sha":"7542fd36617fcc7ba3a3b4b9fc2be3d44aff25cb","skill_md_path":"skills/learn/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/timurgaleev/vibestack/tree/main/skills/learn"},"layout":"multi","source":"github","category":"vibestack","frontmatter":{"name":"learn","description":"Manage project learnings. Review, search, prune, and export what vibestack\nhas learned across sessions. Use when asked to \"what have we learned\",\n\"show learnings\", \"prune stale learnings\", or \"export learnings\".\nProactively suggest when the user asks about past patterns or wonders\n\"didn't we fix this before?\""},"skills_sh_url":"https://skills.sh/timurgaleev/vibestack/learn"},"updatedAt":"2026-05-18T19:06:21.997Z"}}