{"id":"34111fbb-c648-4dfd-b67c-1665250e81b0","shortId":"6We7Kd","kind":"skill","title":"contribute-turbo","tagline":"Submit turbo skill improvements back to the upstream repo. Adapts to repo mode: fork mode creates a PR, source mode pushes directly. Use when the user asks to \"contribute to turbo\", \"submit turbo changes\", \"PR my skill changes\", \"contribute back\", or \"upstream my changes\".","description":"# Contribute Turbo\n\nSubmit staged turbo skill improvements from `~/.turbo/repo/` back to the upstream repo. The workflow adapts based on `repoMode` in `~/.turbo/config.json`.\n\n## Step 1: Verify Contributor Status\n\nRead `~/.turbo/config.json` and check `repoMode`:\n\n- `\"fork\"` or `\"source\"` — proceed\n- `\"clone\"` — tell the user that contributions require a fork. Offer to help convert their clone to a fork (add their fork as origin, rename current origin to upstream). Stop.\n- Missing config or repo — tell the user to run the Turbo setup first. Stop.\n\nVerify the repo exists and has the expected remotes:\n\n```bash\ngit -C ~/.turbo/repo remote -v\n```\n\n## Step 2: Mirror Installed Skill Changes\n\nPort session corrections from `~/.claude/skills/<name>/` (where edits land first) into `~/.turbo/repo/skills/<name>/` (the basis for the contribution), leaving any persistent local customizations in the installed copy untouched.\n\nDetect drifted skills:\n\n```bash\nfor skill in ~/.claude/skills/*/; do\n  name=$(basename \"$skill\")\n  repo_dir=~/.turbo/repo/skills/\"$name\"\n  [ -d \"$repo_dir\" ] || continue\n  diff -rq \"$skill\" \"$repo_dir\" >/dev/null 2>&1 && continue\n  echo \"$name\"\ndone\n```\n\nFor each drifted skill, first check whether the repo copy already has unstaged changes for it (`git -C ~/.turbo/repo status --porcelain skills/<name>/`). If it does, use `AskUserQuestion` to ask the user how to proceed before mirroring — those changes will conflate with mirrored corrections in Step 3 if not resolved.\n\nThen read both versions of every changed file and classify each hunk:\n\n- **Correction** — a session edit meant to improve the skill upstream. For modified files, apply each correction hunk with the Edit tool. For new files in the installed copy, create the matching file in the repo copy with the Write tool. For files deleted from the installed copy, remove the repo copy with `rm`.\n- **Customization** — a persistent local addition that does not belong upstream (extra workflow steps, personal paths, machine-specific notes, internal references). Leave it in the installed copy; do not propagate.\n- **Ambiguous** — use `AskUserQuestion` to confirm classification before applying.\n\n## Step 3: Review Pending Changes\n\nCheck what changes exist in the local repo:\n\n```bash\ngit -C ~/.turbo/repo diff --name-only\ngit -C ~/.turbo/repo diff --cached --name-only\n```\n\nIf there are unstaged changes to skill files, stage the specific skill directories that changed:\n\n```bash\ngit -C ~/.turbo/repo add skills/<name>/\n```\n\nIf there are no changes at all, tell the user there is nothing to contribute and stop.\n\nPresent the changes in a summary table:\n\n```\n| # | Skill | Change Summary |\n|---|-------|----------------|\n| 1 | /evaluate-findings | Added handling for security-default findings |\n| 2 | /self-improve | Clarified routing for trusted reviewer feedback |\n```\n\nUse `AskUserQuestion` to confirm which changes to include. If the user deselects some, unstage those files.\n\n## Step 4: Validate Skill Quality\n\nRead `~/.turbo/repo/SKILL-CONVENTIONS.md` for the turbo project's skill conventions. These conventions supplement `/create-skill`'s general best practices with turbo-specific patterns.\n\nFor each confirmed skill, if `/create-skill` has not been invoked for it in this session, run `/create-skill` to review and refine the skill. Any improvements from the review become part of the contribution.\n\n## Step 5: Craft Contribution Context\n\nFor each change, construct a \"why\" explanation. The goal: the turbo maintainer should understand what happened and why the existing instructions were insufficient, without learning anything about the contributor's project.\n\nUse this template:\n\n> During [general workflow description], the skill's instructions [what was missing or wrong]. This caused [what happened]. The change [what it does] so that [benefit].\n\n**Example:**\n\n> During a code review session, the evaluate-findings skill encountered a finding with `security-default` severity. The existing instructions only handled `critical`, `high`, `medium`, and `low` severities, causing the finding to be silently dropped. The change adds `security-default` to the severity handling table so these findings are properly triaged.\n\n### Privacy Filter\n\nBefore finalizing, verify each \"why\" description contains none of the following:\n\n- Project or repo names\n- File paths from the user's project\n- Company or product names\n- API keys, URLs, or credentials\n- Business logic or domain-specific terminology that identifies the project\n- User names beyond the contributor's GitHub handle\n\nOutput the drafted context as text. Then use `AskUserQuestion` for approval. The user must approve the contribution message before proceeding.\n\n## Step 6: Commit Rules\n\nRun `/commit-rules` to load commit message rules and technical constraints.\n\n## Step 7: Create Branch and Commit\n\nWhen multiple skills were changed, batch related changes into a single branch and commit. Create separate branches only when changes are independent and unrelated.\n\n### Fork mode\n\nCreate a feature branch:\n\n```bash\ngit -C ~/.turbo/repo checkout -b improve/<skill-name>-<short-desc>\n```\n\nCommit with a message matching the turbo repo style (check `git -C ~/.turbo/repo log -n 10 --oneline`). Incorporate the \"why\" context in the commit message.\n\n### Source mode\n\nStay on main. Commit directly with the same message style.\n\n## Step 8: Push\n\n### Fork mode\n\nRun `/github-voice` to load writing style rules.\n\nPush and create a PR:\n\n```bash\ngit -C ~/.turbo/repo push -u origin improve/<skill-name>-<short-desc>\n```\n\nCreate the PR against the upstream repo:\n\n```bash\ngh pr create --repo tobihagemann/turbo --head <user>:improve/<skill-name>-<short-desc> --title \"...\" --body \"...\"\n```\n\nPR body format:\n\n```markdown\n## Summary\n- [1-3 bullet points]\n\n## Context\n[The crafted \"why\" explanation from Step 5]\n```\n\nReturn to main after creating the PR:\n\n```bash\ngit -C ~/.turbo/repo checkout main\n```\n\nReport the PR URL.\n\n### Source mode\n\nPull and rebase before pushing to incorporate any upstream changes:\n\n```bash\ngit -C ~/.turbo/repo pull --rebase origin main\n```\n\nIf the rebase pulled in new commits, run `/update-turbo` to apply upstream changes (skill updates, migrations, config changes) to the local installation before pushing.\n\nThen push:\n\n```bash\ngit -C ~/.turbo/repo push origin main\n```\n\nReport the pushed commit hash.\n\n## Step 9: Update Config\n\nIn source mode, update `~/.turbo/config.json` so the next `/update-turbo` does not re-surface the just-pushed changes:\n\n1. Read `~/.turbo/config.json`\n2. Set `lastUpdateHead` (add the key if it does not exist) to the current HEAD: `git -C ~/.turbo/repo rev-parse HEAD`\n3. Write the updated config back\n\nReport that the contribution is complete.\n\nSkip this step in fork mode (the upstream has not changed until the PR is merged).","tags":["contribute","turbo","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-contribute-turbo","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-developer-tools","topic-skills"],"categories":["turbo"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tobihagemann/turbo/contribute-turbo","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tobihagemann/turbo","source_repo":"https://github.com/tobihagemann/turbo","install_from":"skills.sh"}},"qualityScore":"0.597","qualityRationale":"deterministic score 0.60 from registry signals: · indexed on github topic:agent-skills · 295 github stars · SKILL.md body (6,830 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-08T06:54:07.801Z","embedding":null,"createdAt":"2026-04-18T22:03:35.298Z","updatedAt":"2026-05-08T06:54:07.801Z","lastSeenAt":"2026-05-08T06:54:07.801Z","tsv":"'-3':860 '/.claude/skills':152,181 '/.turbo/config.json':69,76,954,971 '/.turbo/repo':56,139,224,374,381,405,771,787,832,881,903,937,989 '/.turbo/repo/skill-conventions.md':474 '/.turbo/repo/skills':158,188 '/commit-rules':723 '/create-skill':485,500,511 '/dev/null':199 '/evaluate-findings':436 '/github-voice':818 '/self-improve':445 '/update-turbo':916,958 '1':71,201,435,859,969 '10':790 '2':143,200,444,972 '3':251,359,994 '4':469 '5':529,870 '6':719 '7':733 '8':813 '9':947 'ad':437 'adapt':13,64 'add':102,406,631,975 'addit':324 'alreadi':216 'ambigu':350 'anyth':558 'api':674 'appli':280,357,918 'approv':708,712 'ask':30,234 'askuserquest':232,352,453,706 'b':773 'back':8,43,57,999 'base':65 'basenam':184 'bash':136,177,371,402,768,829,844,878,900,934 'basi':160 'batch':743 'becom':523 'belong':328 'benefit':591 'best':488 'beyond':692 'bodi':853,855 'branch':735,749,754,767 'bullet':861 'busi':679 'c':138,223,373,380,404,770,786,831,880,902,936,988 'cach':383 'caus':581,622 'chang':37,41,47,147,219,243,261,362,365,391,401,412,427,433,457,535,585,630,742,745,757,899,920,925,968,1016 'check':78,211,363,784 'checkout':772,882 'clarifi':446 'classif':355 'classifi':264 'clone':84,98 'code':595 'commit':720,726,737,751,775,798,805,914,944 'compani':670 'complet':1005 'config':114,924,949,998 'confirm':354,455,497 'conflat':245 'constraint':731 'construct':536 'contain':654 'context':532,701,795,863 'continu':193,202 'contribut':2,32,42,48,89,163,422,527,531,714,1003 'contribute-turbo':1 'contributor':73,561,694 'convent':481,483 'convert':96 'copi':172,215,294,302,313,317,346 'correct':150,248,267,282 'craft':530,865 'creat':19,295,734,752,764,826,837,847,875 'credenti':678 'critic':616 'current':108,985 'custom':168,320 'd':190 'default':442,609,634 'delet':309 'descript':570,653 'deselect':463 'detect':174 'diff':194,375,382 'dir':187,192,198 'direct':25,806 'directori':399 'domain':683 'domain-specif':682 'done':205 'draft':700 'drift':175,208 'drop':628 'echo':203 'edit':154,270,286 'encount':603 'evalu':600 'evaluate-find':599 'everi':260 'exampl':592 'exist':130,366,552,612,982 'expect':134 'explan':539,867 'extra':330 'featur':766 'feedback':451 'file':262,279,290,298,308,394,467,663 'filter':647 'final':649 'find':443,601,605,624,642 'first':125,156,210 'follow':658 'fork':17,80,92,101,104,762,815,1010 'format':856 'general':487,568 'gh':845 'git':137,222,372,379,403,769,785,830,879,901,935,987 'github':696 'goal':541 'handl':438,615,638,697 'happen':548,583 'hash':945 'head':850,986,993 'help':95 'high':617 'hunk':266,283 'identifi':687 'improv':7,54,273,519,774,836,851 'includ':459 'incorpor':792,896 'independ':759 'instal':145,171,293,312,345,929 'instruct':553,574,613 'insuffici':555 'intern':339 'invok':504 'just-push':965 'key':675,977 'land':155 'lastupdatehead':974 'learn':557 'leav':164,341 'load':725,820 'local':167,323,369,928 'log':788 'logic':680 'low':620 'machin':336 'machine-specif':335 'main':804,873,883,907,940 'maintain':544 'markdown':857 'match':297,779 'meant':271 'medium':618 'merg':1021 'messag':715,727,778,799,810 'migrat':923 'mirror':144,241,247 'miss':113,577 'mode':16,18,23,763,801,816,889,952,1011 'modifi':278 'multipl':739 'must':711 'n':789 'name':183,189,204,377,385,662,673,691 'name-on':376,384 'new':289,913 'next':957 'none':655 'note':338 'noth':420 'offer':93 'onelin':791 'origin':106,109,835,906,939 'output':698 'pars':992 'part':524 'path':334,664 'pattern':494 'pend':361 'persist':166,322 'person':333 'point':862 'porcelain':226 'port':148 'pr':21,38,828,839,846,854,877,886,1019 'practic':489 'present':425 'privaci':646 'proceed':83,239,717 'product':672 'project':478,563,659,669,689 'propag':349 'proper':644 'pull':890,904,911 'push':24,814,824,833,894,931,933,938,943,967 'qualiti':472 're':962 're-surfac':961 'read':75,256,473,970 'rebas':892,905,910 'refer':340 'refin':515 'relat':744 'remot':135,140 'remov':314 'renam':107 'repo':12,15,61,116,129,186,191,197,214,301,316,370,661,782,843,848 'repomod':67,79 'report':884,941,1000 'requir':90 'resolv':254 'return':871 'rev':991 'rev-pars':990 'review':360,450,513,522,596 'rm':319 'rout':447 'rq':195 'rule':721,728,823 'run':121,510,722,817,915 'secur':441,608,633 'security-default':440,607,632 'separ':753 'session':149,269,509,597 'set':973 'setup':124 'sever':610,621,637 'silent':627 'singl':748 'skill':6,40,53,146,176,179,185,196,209,227,275,393,398,407,432,471,480,498,517,572,602,740,921 'skill-contribute-turbo' 'skip':1006 'sourc':22,82,800,888,951 'source-tobihagemann' 'specif':337,397,493,684 'stage':51,395 'status':74,225 'stay':802 'step':70,142,250,332,358,468,528,718,732,812,869,946,1008 'stop':112,126,424 'style':783,811,822 'submit':4,35,50 'summari':430,434,858 'supplement':484 'surfac':963 'tabl':431,639 'technic':730 'tell':85,117,415 'templat':566 'terminolog':685 'text':703 'titl':852 'tobihagemann/turbo':849 'tool':287,306 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'triag':645 'trust':449 'turbo':3,5,34,36,49,52,123,477,492,543,781 'turbo-specif':491 'u':834 'understand':546 'unrel':761 'unstag':218,390,465 'untouch':173 'updat':922,948,953,997 'upstream':11,45,60,111,276,329,842,898,919,1013 'url':676,887 'use':26,231,351,452,564,705 'user':29,87,119,236,417,462,667,690,710 'v':141 'valid':470 'verifi':72,127,650 'version':258 'whether':212 'without':556 'workflow':63,331,569 'write':305,821,995 'wrong':579","prices":[{"id":"89d6234a-5b31-4488-aa24-44ca26ed669e","listingId":"34111fbb-c648-4dfd-b67c-1665250e81b0","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tobihagemann","category":"turbo","install_from":"skills.sh"},"createdAt":"2026-04-18T22:03:35.298Z"}],"sources":[{"listingId":"34111fbb-c648-4dfd-b67c-1665250e81b0","source":"github","sourceId":"tobihagemann/turbo/contribute-turbo","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/contribute-turbo","isPrimary":false,"firstSeenAt":"2026-04-18T22:03:35.298Z","lastSeenAt":"2026-05-08T06:54:07.801Z"}],"details":{"listingId":"34111fbb-c648-4dfd-b67c-1665250e81b0","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"contribute-turbo","github":{"repo":"tobihagemann/turbo","stars":295,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-05-01T15:45:15Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"643c8bd8311b4680a1ad123a6c8be13fb7d93c8e","skill_md_path":"skills/contribute-turbo/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/contribute-turbo"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"contribute-turbo","description":"Submit turbo skill improvements back to the upstream repo. Adapts to repo mode: fork mode creates a PR, source mode pushes directly. Use when the user asks to \"contribute to turbo\", \"submit turbo changes\", \"PR my skill changes\", \"contribute back\", or \"upstream my changes\"."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/contribute-turbo"},"updatedAt":"2026-05-08T06:54:07.801Z"}}