{"id":"09254c52-54a3-4138-b8cb-084c72c87017","shortId":"mSgQ2s","kind":"skill","title":"git-worktree","tagline":">-","description":"# Git worktree manager\n\n## Always use the manager script\n\nNever call `git worktree add` directly -- always use the `worktree-manager.sh` script.\n\nThe script handles critical setup that raw git commands don't:\n1. Copies `.env`, `.env.local`, `.env.test`, etc. from main repo\n2. Ensures `.worktrees` is in `.gitignore`\n3. Creates consistent directory structure\n4. After creation, install dependencies if detected: `package.json` → `npm install`, `composer.json` → `composer install`, `pyproject.toml` → `pip install -e .`, `go.mod` → `go mod download`\n\n## Safety Verification\n\nBefore creating a worktree, verify the worktree directory is gitignored:\n\n```bash\n# Verify .worktrees is ignored (should output \".worktrees\")\ngit check-ignore .worktrees || echo \"WARNING: .worktrees not in .gitignore\"\n```\n\nIf not ignored, add it to `.gitignore` before proceeding. The manager script handles this, but verify when troubleshooting.\n\n### Branch from a fresh remote base (manager-script behavior)\n\nThis subsection documents the safety logic `worktree-manager.sh create` implements when branching from the default branch — it is not a manual sequence to run. The script handles the steps; the rationale lives here so users can reason about the behavior.\n\nWhen creating a worktree's branch from the default branch (`main`/`master`), the local base may be ahead of `origin/<base>` due to another session, worktree, or background task. Branching from local HEAD silently carries those unrelated commits into the new feature branch and the eventual PR — and an unconditional `git reset --hard origin/<base>` would silently drop the user's intentional unpushed work.\n\nThe script's safe sequence:\n\n```bash\ngit fetch --no-tags origin <base>\nunpushed=$(git log \"origin/$base..$base\" --oneline)\nif [ -n \"$unpushed\" ]; then\n  # Surface the commit list and prompt: carry forward (base_ref=$base) or leave on local <base> (base_ref=origin/$base)\n  ...\nfi\ngit worktree add .worktrees/<name> -b <branch> \"$base_ref\"\n```\n\nTwo failure modes the prompt distinguishes:\n\n- **Stale-base contamination** — another session advanced local `<base>` past `origin/<base>` with unrelated commits. The user wants `origin/<base>` as the new branch's base; the unpushed commits stay on local `<base>` for separate handling.\n- **Forgot-to-branch** — the user authored real commits on local `<base>` intending them for a feature branch. The user wants HEAD as the new branch's base so the commits carry forward.\n\nLocal git state alone cannot distinguish these (author email is unreliable in multi-session setups), so the script surfaces the choice rather than guessing. Default fallback when the user can't be reached: branch from `origin/<base>` and report the unpushed commits in the change summary so the user resolves them deliberately. If the script does not implement this yet, that is a known gap — open an issue rather than working around with raw `git worktree add`.\n\nAfter creating a worktree, run the project's test suite to establish a clean baseline. Pre-existing failures in the worktree should be caught before starting new work -- not discovered mid-implementation.\n\n```bash\n# CORRECT - Always use the script\nbash ${CLAUDE_PLUGIN_ROOT}/skills/ia-git-worktree/scripts/worktree-manager.sh create feature-name\n\n# WRONG - Never do this directly\ngit worktree add .worktrees/feature-name -b feature-name main\n```\n\n## Commands\n\n| Command | Description | Example |\n|---------|-------------|---------|\n| `create <branch> [from]` | Create worktree + branch (default: from main) | `...worktree-manager.sh create feature-login` |\n| `list` / `ls` | List all worktrees with status | `...worktree-manager.sh list` |\n| `switch <name>` / `go` | Switch to existing worktree | `...worktree-manager.sh switch feature-login` |\n| `copy-env <name>` | Copy .env files to existing worktree | `...worktree-manager.sh copy-env feature-login` |\n| `cleanup` / `clean` | Interactively remove inactive worktrees | `...worktree-manager.sh cleanup` |\n\nAfter cleanup, run `git worktree prune` to remove any orphaned worktree metadata from manually deleted directories.\n\nAll commands use: `bash ${CLAUDE_PLUGIN_ROOT}/skills/ia-git-worktree/scripts/worktree-manager.sh <command>`\n\n## Environment Detection\n\nBefore creating worktrees, detect the execution context:\n\n1. **Already in a worktree?** Check `git rev-parse --show-toplevel` against `git worktree list`. If the current directory is already a linked worktree, skip creation -- work directly in the existing worktree.\n2. **Codex/sandbox environment?** If `$CODEX_SANDBOX` is set or the repo is at a non-standard path (e.g., `/tmp/`, `/workspace/`), worktrees may not be supported. Fall back to regular branch switching.\n3. **Bare repo?** If `git rev-parse --is-bare-repository` returns true, worktrees are the only way to have a working directory. Adjust paths accordingly.\n\nAdapt the workflow to the detected context rather than failing with a generic error.\n\n## Integration with Workflows\n\n### `/ia-review`\n\n1. Check current branch\n2. If ALREADY on target branch -> stay there, no worktree needed\n3. If DIFFERENT branch -> offer worktree: \"Use worktree for isolated review? (y/n)\"\n\n### `/ia-work`\n\nAlways offer choice:\n1. New branch on current worktree (live work)\n2. Worktree (parallel work)\n\n## Branch Completion\n\nWhen work in a worktree is done, verify tests pass, then present exactly 4 options:\n\n1. **Merge locally** -- merge into base branch, delete worktree branch, clean up worktree\n2. **Push + PR** -- push branch, create PR with `gh pr create`, keep worktree until merged\n3. **Keep as-is** -- leave branch and worktree for later\n4. **Discard** -- requires typing \"discard\" to confirm. Deletes branch and worktree. No silent discards.\n\nClean up the worktree directory only for options 1 and 4. For option 2, the worktree stays until the PR merges.\n\n## Change Summary\n\nWhen completing work in a worktree (before merge or PR), output a structured summary:\n\n```\nCHANGES MADE:\n- src/routes/tasks.ts: Added validation middleware\n\nTHINGS I DIDN'T TOUCH (intentionally):\n- src/routes/auth.ts: Has similar validation gap but out of scope\n\nPOTENTIAL CONCERNS:\n- The Zod schema is strict -- rejects extra fields. Confirm this is desired.\n```\n\nThe \"DIDN'T TOUCH\" section prevents reviewers from wondering whether adjacent issues were missed or intentionally deferred.\n\n## Hook Safety Under Husky\n\nInstalling hooks into `.git/hooks/` silently fails on any repo that uses Husky. Husky sets `core.hooksPath` (typically to `.husky/_`) and git ignores `.git/hooks/` entirely when that config is non-empty. The hook file lands on disk, is executable, is correct, and is dead. Invisible failure until someone asks why the post-merge behavior isn't running.\n\n### Detection rule before writing any hook\n\n```bash\nhooks_path=$(git -C \"$repo\" config --get core.hooksPath)\n```\n\n- Empty output: write to `$(git rev-parse --git-common-dir)/hooks/<name>` as usual.\n- `.husky/_` (or any path containing `husky.sh` / `h` trampoline): Husky v9 setup. Write to `.husky/<name>`; do NOT include the v8-era `. \"$(dirname \"$0\")/_/husky.sh\"` line (v9 prints a deprecation warning if you do).\n- Unrecognized non-empty value: refuse to write the hook and surface the path to the user. Silent writes to the wrong location waste debug cycles later.\n\n### Worktree-safe hook body\n\n`.git/hooks/` lives in the common git dir and runs for every worktree of the clone. A hook installed once fires across all trees. Two rules to stay safe:\n\n1. Resolve the invoking worktree's root inside the hook body with `git rev-parse --show-toplevel`, not a hardcoded path. Hardcoding means the last `install-hooks` invocation wins for every worktree.\n2. Guard the tool invocation with an existence check on the tool's per-tree state dir. Siblings without your tool's setup must no-op, not spawn a failing background process per git op.\n\n```sh\n#!/bin/sh\nroot=\"$(git rev-parse --show-toplevel 2>/dev/null)\" || exit 0\n[ -d \"$root/.my-tool\" ] || exit 0\n( cd \"$root\" && my-tool index ) >>\"$root/.my-tool/hook.log\" 2>&1 &\nexit 0\n```\n\nRedirect to a log file inside the tool's state dir, not `/dev/null` — silent failures produce stale state you only notice hours later.\n\n## Local Excludes: .git/info/exclude vs .gitignore\n\nTooling artifacts (local index dirs, hook helpers, per-developer scratch files) belong in `.git/info/exclude`, NOT in the tracked `.gitignore`.\n\n- `.gitignore` is content — tracked, shared with the team, reviewed in PRs. Adding a personal tooling rule there pollutes a shared file. On foreign repos (upstream projects, third-party clones) the rule either rides into a PR by accident or sits as a dirty working tree forever.\n- `.git/info/exclude` is local — untracked, lives in the common git dir, shared across every worktree of the clone. Same syntax and semantics as `.gitignore` without the leakage.\n\n### Resolving the path correctly under worktrees\n\nDon't hardcode `$repo/.git/info/exclude`. In a worktree, `.git` is a file (gitlink), not a directory. Use git itself:\n\n```bash\nexclude=$(git -C \"$repo\" rev-parse --git-path info/exclude)\n```\n\n### Idempotent append\n\n```bash\nline=\"/.my-tool/\"\nmkdir -p \"$(dirname \"$exclude\")\"\ngrep -qxF \"$line\" \"$exclude\" 2>/dev/null || printf '\\n# my-tool\\n%s\\n' \"$line\" >> \"$exclude\"\n```\n\n`grep -qxF` matches the exact line with no regex surprises.\n\n### When to break the rule\n\nOnly when the artifact is genuinely team-shared and belongs in the repo (build outputs used in CI, generated files, vendored dependencies). If in doubt, ask: \"would another contributor benefit from this rule?\" If no, exclude locally.\n\n## Verify\n\n- `git worktree list` shows the new entry\n- `.worktrees` directory confirmed in `.gitignore`\n- Dependencies installed in the worktree\n- Baseline test suite passes in the worktree\n\n## References\n\n- [workflow-examples.md](./references/workflow-examples.md) - Code review and parallel development workflows\n- [troubleshooting.md](./references/troubleshooting.md) - Common issues, directory structure, how it works\n- [worktree-manager.sh](./scripts/worktree-manager.sh) - The manager script","tags":["git","worktree","skills","iliaal","agent-skills","ai-coding-assistant","ai-tools","claude-code"],"capabilities":["skill","source-iliaal","skill-git-worktree","topic-agent-skills","topic-ai-coding-assistant","topic-ai-tools","topic-claude-code","topic-skills"],"categories":["ai-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/iliaal/ai-skills/git-worktree","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add iliaal/ai-skills","source_repo":"https://github.com/iliaal/ai-skills","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 13 github stars · SKILL.md body (10,107 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:07:02.289Z","embedding":null,"createdAt":"2026-05-09T01:05:35.298Z","updatedAt":"2026-05-18T19:07:02.289Z","lastSeenAt":"2026-05-18T19:07:02.289Z","tsv":"'/.my-tool':1348 '/_/husky.sh':1016 '/bin/sh':1159 '/dev/null':1169,1199,1358 '/hooks':990 '/ia-review':699 '/ia-work':727 '/references/troubleshooting.md':1457 '/references/workflow-examples.md':1449 '/scripts/worktree-manager.sh':1466 '/skills/ia-git-worktree/scripts/worktree-manager.sh':476,579 '/tmp':642 '/workspace':643 '0':1015,1171,1175,1186 '1':34,589,700,731,760,821,1086,1184 '2':43,623,704,739,773,826,1121,1168,1183,1357 '3':49,655,715,788 '4':54,758,799,823 'accid':1273 'accord':681 'across':1078,1293 'ad':853,1246 'adapt':682 'add':16,109,280,431,488 'adjac':895 'adjust':679 'advanc':297 'ahead':190 'alon':358 'alreadi':590,611,706 'alway':7,18,468,728 'anoth':195,295,1412 'append':1345 'around':426 'artifact':1216,1387 'as-i':790 'ask':953,1410 'author':329,362 'b':282,490 'back':650 'background':199,1153 'bare':656,665 'base':129,187,251,252,266,268,273,276,283,293,313,349,765 'baselin':446,1440 'bash':87,240,466,472,575,969,1332,1346 'behavior':133,172,959 'belong':1227,1394 'benefit':1414 'bodi':1057,1096 'branch':124,144,148,178,182,201,214,311,326,339,347,389,503,653,703,709,718,733,743,766,769,777,794,807 'break':1381 'build':1398 'c':973,1335 'call':13 'cannot':359 'carri':206,264,353 'caught':456 'cd':1176 'chang':399,834,850 'check':97,594,701,1129 'check-ignor':96 'choic':376,730 'ci':1402 'claud':473,576 'clean':445,549,770,813 'cleanup':548,555,557 'clone':1072,1264,1298 'code':1450 'codex':627 'codex/sandbox':624 'command':31,495,496,573 'commit':209,260,303,316,331,352,396 'common':988,1062,1289,1458 'complet':744,837 'compos':65 'composer.json':64 'concern':872 'config':931,975 'confirm':805,881,1432 'consist':51 'contain':997 'contamin':294 'content':1237 'context':588,688 'contributor':1413 'copi':35,533,535,543 'copy-env':532,542 'core.hookspath':920,977 'correct':467,945,1311 'creat':50,78,141,174,433,477,499,501,508,583,778,783 'creation':56,616 'critic':26 'current':608,702,735 'cycl':1051 'd':1172 'dead':948 'debug':1050 'default':147,181,380,504 'defer':901 'delet':570,767,806 'deliber':406 'depend':58,1406,1435 'deprec':1021 'descript':497 'desir':884 'detect':60,581,585,687,963 'develop':1224,1454 'didn':858,886 'differ':717 'dir':989,1064,1138,1197,1219,1291 'direct':17,485,618 'directori':52,84,571,609,678,817,1328,1431,1460 'dirnam':1014,1351 'dirti':1278 'discard':800,803,812 'discov':462 'disk':941 'distinguish':290,360 'document':136 'done':751 'doubt':1409 'download':74 'drop':228 'due':193 'e':70 'e.g':641 'echo':100 'either':1267 'email':363 'empti':935,978,1029 'ensur':44 'entir':928 'entri':1429 'env':36,534,536,544 'env.local':37 'env.test':38 'environ':580,625 'era':1013 'error':695 'establish':443 'etc':39 'eventu':217 'everi':1068,1119,1294 'exact':757,1373 'exampl':498 'exclud':1211,1333,1352,1356,1368,1420 'execut':587,943 'exist':449,525,539,621,1128 'exit':1170,1174,1185 'extra':879 'fail':691,911,1152 'failur':286,450,950,1201 'fall':649 'fallback':381 'featur':213,338,479,492,510,530,546 'feature-login':509,529,545 'feature-nam':478,491 'fetch':242 'fi':277 'field':880 'file':537,938,1191,1226,1255,1324,1404 'fire':1077 'foreign':1257 'forev':1281 'forgot':324 'forgot-to-branch':323 'forward':265,354 'fresh':127 'gap':419,866 'generat':1403 'generic':694 'genuin':1389 'get':976 'gh':781 'git':2,4,14,30,95,222,241,248,278,356,429,486,559,595,603,659,925,972,982,987,1063,1098,1156,1161,1290,1321,1330,1334,1341,1423 'git-common-dir':986 'git-path':1340 'git-worktre':1 'git/hooks':909,927,1058 'git/info/exclude':1212,1229,1282 'gitignor':48,86,105,112,1214,1234,1235,1304,1434 'gitlink':1325 'go':72,522 'go.mod':71 'grep':1353,1369 'guard':1122 'guess':379 'h':999 'handl':25,118,159,322 'hard':224 'hardcod':1107,1109,1316 'head':204,343 'helper':1221 'hook':902,907,937,968,970,1035,1056,1074,1095,1115,1220 'hour':1208 'huski':905,917,918,1001,1006 'husky.sh':998 'husky/_':923,993 'idempot':1344 'ignor':91,98,108,926 'implement':142,412,465 'inact':552 'includ':1009 'index':1181,1218 'info/exclude':1343 'insid':1093,1192 'instal':57,63,66,69,906,1075,1114,1436 'install-hook':1113 'integr':696 'intend':334 'intent':232,861,900 'interact':550 'invis':949 'invoc':1116,1125 'invok':1089 'is-bare-repositori':663 'isn':960 'isol':724 'issu':422,896,1459 'keep':784,789 'known':418 'land':939 'last':1112 'later':798,1052,1209 'leakag':1307 'leav':270,793 'line':1017,1347,1355,1367,1374 'link':613 'list':261,512,514,520,605,1425 'live':164,737,1059,1286 'local':186,203,272,298,319,333,355,762,1210,1217,1284,1421 'locat':1048 'log':249,1190 'logic':139 'login':511,531,547 'ls':513 'made':851 'main':41,183,494,506 'manag':6,10,116,131,1468 'manager-script':130 'manual':153,569 'master':184 'match':1371 'may':188,645 'mean':1110 'merg':761,763,787,833,843,958 'metadata':567 'mid':464 'mid-implement':463 'middlewar':855 'miss':898 'mkdir':1349 'mod':73 'mode':287 'multi':368 'multi-sess':367 'must':1145 'my-tool':1178,1361 'n':255,1360,1364,1366 'name':480,493 'need':714 'never':12,482 'new':212,310,346,459,732,1428 'no-op':1146 'no-tag':243 'non':638,934,1028 'non-empti':933,1027 'non-standard':637 'notic':1207 'npm':62 'offer':719,729 'onelin':253 'op':1148,1157 'open':420 'option':759,820,825 'origin':192,225,246,250,275,300,307,391 'orphan':565 'output':93,846,979,1399 'p':1350 'package.json':61 'parallel':741,1453 'pars':598,662,985,1101,1164,1339 'parti':1263 'pass':754,1443 'past':299 'path':640,680,971,996,1039,1108,1310,1342 'per':1135,1155,1223 'per-develop':1222 'per-tre':1134 'person':1248 'pip':68 'plugin':474,577 'pollut':1252 'post':957 'post-merg':956 'potenti':871 'pr':218,775,779,782,832,845,1271 'pre':448 'pre-exist':447 'present':756 'prevent':890 'print':1019 'printf':1359 'proceed':114 'process':1154 'produc':1202 'project':438,1260 'prompt':263,289 'prs':1245 'prune':561 'push':774,776 'pyproject.toml':67 'qxf':1354,1370 'rather':377,423,689 'rational':163 'raw':29,428 'reach':388 'real':330 'reason':169 'redirect':1187 'ref':267,274,284 'refer':1447 'refus':1031 'regex':1377 'regular':652 'reject':878 'remot':128 'remov':551,563 'repo':42,633,657,914,974,1258,1336,1397 'repo/.git/info/exclude':1317 'report':393 'repositori':666 'requir':801 'reset':223 'resolv':404,1087,1308 'return':667 'rev':597,661,984,1100,1163,1338 'rev-pars':596,660,983,1099,1162,1337 'review':725,891,1243,1451 'ride':1268 'root':475,578,1092,1160,1177 'root/.my-tool':1173 'root/.my-tool/hook.log':1182 'rule':964,1082,1250,1266,1383,1417 'run':156,436,558,962,1066 'safe':238,1055,1085 'safeti':75,138,903 'sandbox':628 'schema':875 'scope':870 'scratch':1225 'script':11,22,24,117,132,158,236,373,409,471,1469 'section':889 'semant':1302 'separ':321 'sequenc':154,239 'session':196,296,369 'set':630,919 'setup':27,370,1003,1144 'sh':1158 'share':1239,1254,1292,1392 'show':600,1103,1166,1426 'show-toplevel':599,1102,1165 'sibl':1139 'silent':205,227,811,910,1043,1200 'similar':864 'sit':1275 'skill' 'skill-git-worktree' 'skip':615 'someon':952 'source-iliaal' 'spawn':1150 'src/routes/auth.ts':862 'src/routes/tasks.ts':852 'stale':292,1203 'stale-bas':291 'standard':639 'start':458 'state':357,1137,1196,1204 'status':518 'stay':317,710,829,1084 'step':161 'strict':877 'structur':53,848,1461 'subsect':135 'suit':441,1442 'summari':400,835,849 'support':648 'surfac':258,374,1037 'surpris':1378 'switch':521,523,528,654 'syntax':1300 'tag':245 'target':708 'task':200 'team':1242,1391 'team-shar':1390 'test':440,753,1441 'thing':856 'third':1262 'third-parti':1261 'tool':1124,1132,1142,1180,1194,1215,1249,1363 'topic-agent-skills' 'topic-ai-coding-assistant' 'topic-ai-tools' 'topic-claude-code' 'topic-skills' 'toplevel':601,1104,1167 'touch':860,888 'track':1233,1238 'trampolin':1000 'tree':1080,1136,1280 'troubleshoot':123 'troubleshooting.md':1456 'true':668 'two':285,1081 'type':802 'typic':921 'uncondit':221 'unpush':233,247,256,315,395 'unrecogn':1026 'unrel':208,302 'unreli':365 'untrack':1285 'upstream':1259 'use':8,19,469,574,721,916,1329,1400 'user':167,230,305,328,341,384,403,1042 'usual':992 'v8':1012 'v8-era':1011 'v9':1002,1018 'valid':854,865 'valu':1030 'vendor':1405 'verif':76 'verifi':81,88,121,752,1422 'vs':1213 'want':306,342 'warn':101,1022 'wast':1049 'way':673 'whether':894 'win':1117 'without':1140,1305 'wonder':893 'work':234,425,460,617,677,738,742,746,838,1279,1464 'workflow':684,698,1455 'workflow-examples.md':1448 'worktre':3,5,15,45,80,83,89,94,99,102,176,197,279,281,430,435,453,487,502,516,526,540,553,560,566,584,593,604,614,622,644,669,713,720,722,736,740,749,768,772,785,796,809,816,828,841,1054,1069,1090,1120,1295,1313,1320,1424,1430,1439,1446 'worktree-manager.sh':21,140,507,519,527,541,554,1465 'worktree-saf':1053 'worktrees/feature-name':489 'would':226,1411 'write':966,980,1004,1033,1044 'wrong':481,1047 'y/n':726 'yet':414 'zod':874","prices":[{"id":"8847af0d-76c7-439e-a45c-4fdc37c657c8","listingId":"09254c52-54a3-4138-b8cb-084c72c87017","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"iliaal","category":"ai-skills","install_from":"skills.sh"},"createdAt":"2026-05-09T01:05:35.298Z"}],"sources":[{"listingId":"09254c52-54a3-4138-b8cb-084c72c87017","source":"github","sourceId":"iliaal/ai-skills/git-worktree","sourceUrl":"https://github.com/iliaal/ai-skills/tree/master/skills/git-worktree","isPrimary":false,"firstSeenAt":"2026-05-09T01:05:35.298Z","lastSeenAt":"2026-05-18T19:07:02.289Z"}],"details":{"listingId":"09254c52-54a3-4138-b8cb-084c72c87017","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"iliaal","slug":"git-worktree","github":{"repo":"iliaal/ai-skills","stars":13,"topics":["agent-skills","ai-coding-assistant","ai-tools","claude-code","skills"],"license":"mit","html_url":"https://github.com/iliaal/ai-skills","pushed_at":"2026-05-16T13:15:17Z","description":"Curated collection of agent skills for AI coding assistants.","skill_md_sha":"c252908811e982661620df7b93f2064a7731cc32","skill_md_path":"skills/git-worktree/SKILL.md","default_branch":"master","skill_tree_url":"https://github.com/iliaal/ai-skills/tree/master/skills/git-worktree"},"layout":"multi","source":"github","category":"ai-skills","frontmatter":{"name":"git-worktree","description":">-"},"skills_sh_url":"https://skills.sh/iliaal/ai-skills/git-worktree"},"updatedAt":"2026-05-18T19:07:02.289Z"}}