Split out from #34. The retry core (#43) wraps the URL fetcher, embeddings, and Pinecone upsert, but the git source clone/fetch path is not yet retried. `packages/template/src/sources/git-source.ts` runs git via synchronous `execFileSync`. A failed clone throws an exec error carrying a non-zero exit + stderr — not the `ECONNRESET`/`ETIMEDOUT` codes that `withRetry`'s default `isRetryableError` recognizes. So this needs a git-specific retry predicate that only retries the network ops (clone/fetch), not the local `reset`/scrub steps, plus tests. Now shared by both GitHub and GitLab fetchers (post-#46), so one change covers both.