{"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: 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 3: 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 4: 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 5: Commit Rules\n\nRun `/commit-rules` to load commit message rules and technical constraints.\n\n## Step 6: 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 7: 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 4]\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 8: 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.590","qualityRationale":"deterministic score 0.59 from registry signals: · indexed on github topic:agent-skills · 280 github stars · SKILL.md body (5,299 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-04-22T00:54:08.447Z","embedding":null,"createdAt":"2026-04-18T22:03:35.298Z","updatedAt":"2026-04-22T00:54:08.447Z","lastSeenAt":"2026-04-22T00:54:08.447Z","tsv":"'-3':644 '/.turbo/config.json':69,76,738,755 '/.turbo/repo':56,139,158,165,189,555,571,616,665,687,721,773 '/.turbo/repo/skill-conventions.md':258 '/commit-rules':507 '/create-skill':269,284,295 '/evaluate-findings':220 '/github-voice':602 '/self-improve':229 '/update-turbo':700,742 '1':71,219,643,753 '10':574 '2':143,228,756 '3':253,778 '4':313,654 '5':503 '6':517 '7':597 '8':731 'ad':221 'adapt':13,64 'add':102,190,415,759 'anyth':342 'api':458 'appli':702 'approv':492,496 'ask':30 'askuserquest':237,490 'b':557 'back':8,43,57,783 'base':65 'bash':136,155,186,552,613,628,662,684,718 'batch':527 'becom':307 'benefit':375 'best':272 'beyond':476 'bodi':637,639 'branch':519,533,538,551 'bullet':645 'busi':463 'c':138,157,164,188,554,570,615,664,686,720,772 'cach':167 'caus':365,406 'chang':37,41,47,146,149,175,185,196,211,217,241,319,369,414,526,529,541,683,704,709,752,800 'check':78,147,568 'checkout':556,666 'clarifi':230 'clone':84,98 'code':379 'commit':504,510,521,535,559,582,589,698,728 'compani':454 'complet':789 'config':114,708,733,782 'confirm':239,281 'constraint':515 'construct':320 'contain':438 'context':316,485,579,647 'contribut':2,32,42,48,89,206,311,315,498,787 'contribute-turbo':1 'contributor':73,345,478 'convent':265,267 'convert':96 'craft':314,649 'creat':19,518,536,548,610,621,631,659 'credenti':462 'critic':400 'current':108,769 'default':226,393,418 'descript':354,437 'deselect':247 'diff':159,166 'direct':25,590 'directori':183 'domain':467 'domain-specif':466 'draft':484 'drop':412 'encount':387 'evalu':384 'evaluate-find':383 'exampl':376 'exist':130,150,336,396,766 'expect':134 'explan':323,651 'featur':550 'feedback':235 'file':178,251,447 'filter':431 'final':433 'find':227,385,389,408,426 'first':125 'follow':442 'fork':17,80,92,101,104,546,599,794 'format':640 'general':271,352 'gh':629 'git':137,156,163,187,553,569,614,663,685,719,771 'github':480 'goal':325 'handl':222,399,422,481 'happen':332,367 'hash':729 'head':634,770,777 'help':95 'high':401 'identifi':471 'improv':7,54,303,558,620,635 'includ':243 'incorpor':576,680 'independ':543 'instal':713 'instruct':337,358,397 'insuffici':339 'invok':288 'just-push':749 'key':459,761 'lastupdatehead':758 'learn':341 'load':509,604 'local':153,712 'log':572 'logic':464 'low':404 'main':588,657,667,691,724 'maintain':328 'markdown':641 'match':563 'medium':402 'merg':805 'messag':499,511,562,583,594 'migrat':707 'miss':113,361 'mode':16,18,23,547,585,600,673,736,795 'multipl':523 'must':495 'n':573 'name':161,169,446,457,475 'name-on':160,168 'new':697 'next':741 'none':439 'noth':204 'offer':93 'onelin':575 'origin':106,109,619,690,723 'output':482 'pars':776 'part':308 'path':448 'pattern':278 'pend':145 'point':646 'pr':21,38,612,623,630,638,661,670,803 'practic':273 'present':209 'privaci':430 'proceed':83,501 'product':456 'project':262,347,443,453,473 'proper':428 'pull':674,688,695 'push':24,598,608,617,678,715,717,722,727,751 'qualiti':256 're':746 're-surfac':745 'read':75,257,754 'rebas':676,689,694 'refin':299 'relat':528 'remot':135,140 'renam':107 'repo':12,15,61,116,129,154,445,566,627,632 'repomod':67,79 'report':668,725,784 'requir':90 'return':655 'rev':775 'rev-pars':774 'review':144,234,297,306,380 'rout':231 'rule':505,512,607 'run':121,294,506,601,699 'secur':225,392,417 'security-default':224,391,416 'separ':537 'session':293,381 'set':757 'setup':124 'sever':394,405,421 'silent':411 'singl':532 'skill':6,40,53,177,182,191,216,255,264,282,301,356,386,524,705 'skill-contribute-turbo' 'skip':790 'sourc':22,82,584,672,735 'source-tobihagemann' 'specif':181,277,468 'stage':51,179 'status':74 'stay':586 'step':70,142,252,312,502,516,596,653,730,792 'stop':112,126,208 'style':567,595,606 'submit':4,35,50 'summari':214,218,642 'supplement':268 'surfac':747 'tabl':215,423 'technic':514 'tell':85,117,199 'templat':350 'terminolog':469 'text':487 'titl':636 'tobihagemann/turbo':633 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'triag':429 'trust':233 'turbo':3,5,34,36,49,52,123,261,276,327,565 'turbo-specif':275 'u':618 'understand':330 'unrel':545 'unstag':174,249 'updat':706,732,737,781 'upstream':11,45,60,111,626,682,703,797 'url':460,671 'use':26,236,348,489 'user':29,87,119,201,246,451,474,494 'v':141 'valid':254 'verifi':72,127,434 'without':340 'workflow':63,353 'write':605,779 'wrong':363","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-04-22T00:54:08.447Z"}],"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":280,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-04-21T12:22:12Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"17339f129e6c1faa195da1871ad1b6dbb329f82c","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-04-22T00:54:08.447Z"}}