Run independent tasks side by side, each in its own git worktree, with loop —parallel
--parallel N runs up to N independent tasks side by side instead of one after another:
taskgraph loop --parallel 3 --trust
TaskGraph picks the tasks from the graph: wave 1 of taskgraph graph, the tasks whose dependencies are all done. For each one it:
Claims the task, the same way taskgraph next --claim does: the task goes in-progress with claimedBy and claimedAt in its metadata, so another session won’t pick it up.
Creates a git worktree at .taskgraph/worktrees/task-<id> on a new branch taskgraph/task-<id>, starting from your current commit.
Starts one Claude Code process in that worktree. Its output goes to .taskgraph/worktrees/task-<id>.log.
Claude reads the task with taskgraph show, does the work, commits it on the task’s branch, and marks the task review with taskgraph set-status.
Every task’s Claude Code process runs with --dangerously-skip-permissions: permission prompts are off, nobody watches it, and it can read, edit and run anything your user account can, not only files in its worktree. With --parallel 4, four of them run at once. The first run in a project asks you to approve this (or pass --trust). --sandbox isn’t available with --parallel: a worktree’s git data lives in the main repository’s .git, outside the folder the Docker sandbox mounts, so Claude couldn’t commit. Run parallel tasks only in a repository you trust, on a machine where that’s acceptable.
While they run you get one status line per task. When all have finished you get a summary:
✓ 2 of 3 tasks done · 1 failed · 1 branch to review 1 taskgraph/task-1 · 2 commits 2 no changes; worktree removed 3 failed: exit 1 · .taskgraph/worktrees/task-3.logNext: review with git log -p HEAD..taskgraph/task-1
Nothing is merged. A task that left commits or changes keeps its worktree and its branch, ready for you to review and merge yourself. It’s in review if Claude got that far, and otherwise stays claimed (in-progress). A task that left nothing has its worktree and branch removed, and its claim released: it goes back to pending, unless Claude already marked it.Ctrl-C stops every Claude Code process and releases every claim (the tasks still in-progress go back to pending; one Claude already marked review stays there). Closing the terminal or sending SIGTERM does the same. Worktrees with work in them stay. Run the same command again to pick up where they left off: an existing taskgraph/task-<id> branch or worktree is reused. A second Ctrl-C exits at once, without the cleanup, but still kills the Claude Code processes.Before it starts, --parallel refuses to run when tracked files have uncommitted changes, because the worktrees start from your last commit and wouldn’t have them. Commit or stash first. Changes to .taskgraph/tasks/ and .taskgraph/state.json don’t count, since claims and status changes are written there; other files under .taskgraph/, such as config.json, do..taskgraph/worktrees must be a real folder. If it, a task’s worktree path or a log file is a symlink, that task fails instead of writing through it.--parallel takes a number from 1 to 16 and works with --tag, --trust and --project. It can’t be combined with --prompt (other than default), --iterations, --id, --verbose or --sandbox (see the warning above). The exit code is 0 when every task finished, 1 when one failed, and 130 after Ctrl-C.
.taskgraph/ is committed, so each worktree has its own copy of tasks.json, as of your last commit. Every Claude Code process gets the TASKGRAPH_PROJECT_ROOT environment variable set to your project, so the taskgraph commands it runs read and write your project’s tasks.json, not the worktree’s copy. The TaskGraph plugin’s hooks and the TaskGraph MCP server follow it too: an MCP tool call that passes the task’s worktree as projectRoot works on your project.Because of that:
Status changes and notes land in your project’s tasks.json, through the same locked write as any other taskgraph command, so taskgraph list shows them while the run goes on.
A task you added and haven’t committed yet still works: the worktree’s copy doesn’t have it, but Claude never reads that copy.
The task branches carry only Claude’s work, so merging several of them doesn’t bring tasks.json conflicts.
Claude marks a finished task review, not done, because its work is on a branch you haven’t merged. A task in review doesn’t count as finished, so the tasks that depend on it wait: a later loop --parallel won’t start them from a commit that lacks their dependency. After you merge the branch, mark the task done with taskgraph set-status --id=<id> --status=done.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TaskGraph","colors":{"primary":"#3366CC","light":"#6699FF","dark":"#24478F"},"logo":{"light":"https://mintcdn.com/myself-fcf8480c/GzHIJhIlhqfXn7i0/logo/light.png?fit=max\u0026auto=format\u0026n=GzHIJhIlhqfXn7i0\u0026q=85\u0026s=a9a99fb754babb33f3e453d5b6fad8bd","dark":"https://mintcdn.com/myself-fcf8480c/GzHIJhIlhqfXn7i0/logo/dark.png?fit=max\u0026auto=format\u0026n=GzHIJhIlhqfXn7i0\u0026q=85\u0026s=9a151e3e3fae6e29a90682861902973d"},"favicon":"https://mintcdn.com/myself-fcf8480c/GzHIJhIlhqfXn7i0/favicon.svg?fit=max\u0026auto=format\u0026n=GzHIJhIlhqfXn7i0\u0026q=85\u0026s=0faee9c94d472bab5c924c6d85eb19db","footer":{"socials":{"github":"https://github.com/stephennmiller/taskgraph-ai"}},"navigation":{"global":{"anchors":[{"anchor":"Github","icon":"github","href":"https://github.com/stephennmiller/taskgraph-ai"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"myself-fcf8480c","hasAudioNarration":false,"actualSubdomain":"myself-fcf8480c","customDomains":["taskgraph-ai.com"],"gitSource":{"type":"github","owner":"stephennmiller","repo":"taskgraph-ai","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":false,"mountPath":"","label":"","_id":"6adbe6592725bd848f58b0e3"},"chroma":{"latestBuiltDeploymentHistoryId":"6adbf51b4d6e429942b87e92","collectionId":"1d717a79-019a-4849-afb0-34e1c4f7c186","liveDeploymentHistoryId":"6adbf51b4d6e429942b87e92","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6adbf8263c71c34680b073dc","clientVersion":"0.0.3962","searchFilterCounts":[{"language":"default","tag":"TaskGraph Documentation","count":35},{"language":"default","tag":"Technical Capabilities","count":16},{"language":"default","tag":"Getting Started","count":13},{"language":"default","tag":"Quick Start","count":7},{"language":"default","tag":"CLI Commands","count":5},{"language":"default","tag":"Best Practices","count":3},{"language":"default","tag":"Welcome","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#navbar img{height:auto!important;width:200px!important;margin-top:5px!important}"}],"page":{"pagePath":"capabilities/loop-parallel","slug":"/capabilities/loop-parallel","pageMetadata":{"title":"Run Tasks in Parallel","sidebarTitle":"Parallel Loop","description":"Run independent tasks side by side, each in its own git worktree, with loop --parallel","href":"/capabilities/loop-parallel"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Run independent tasks side by side, each in its own git worktree, with loop —parallel\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`--parallel N`}),` runs up to N independent tasks side by side instead of one after another:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`taskgraph`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` loop`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --parallel`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 3`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --trust`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`TaskGraph picks the tasks from the graph: wave 1 of `,_jsx(_components.code,{children:`taskgraph graph`}),`, the tasks whose dependencies are all done. For each one it:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Claims the task, the same way `,_jsx(_components.code,{children:`taskgraph next --claim`}),` does: the task goes `,_jsx(_components.code,{children:`in-progress`}),` with `,_jsx(_components.code,{children:`claimedBy`}),` and `,_jsx(_components.code,{children:`claimedAt`}),` in its metadata, so another session won’t pick it up.`]}),`\n`,_jsxs(_components.li,{children:[`Creates a git worktree at `,_jsx(_components.code,{children:`.taskgraph/worktrees/task-\u003cid>`}),` on a new branch `,_jsx(_components.code,{children:`taskgraph/task-\u003cid>`}),`, starting from your current commit.`]}),`\n`,_jsxs(_components.li,{children:[`Starts one Claude Code process in that worktree. Its output goes to `,_jsx(_components.code,{children:`.taskgraph/worktrees/task-\u003cid>.log`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Claude reads the task with `,_jsx(_components.code,{children:`taskgraph show`}),`, does the work, commits it on the task’s branch, and marks the task `,_jsx(_components.code,{children:`review`}),` with `,_jsx(_components.code,{children:`taskgraph set-status`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Every task’s Claude Code process runs with `,_jsx(_components.code,{children:`--dangerously-skip-permissions`}),`: permission prompts are off, nobody watches it, and it can read, edit and run anything your user account can, not only files in its worktree. With `,_jsx(_components.code,{children:`--parallel 4`}),`, four of them run at once. The first run in a project asks you to approve this (or pass `,_jsx(_components.code,{children:`--trust`}),`). `,_jsx(_components.code,{children:`--sandbox`}),` isn’t available with `,_jsx(_components.code,{children:`--parallel`}),`: a worktree’s git data lives in the main repository’s `,_jsx(_components.code,{children:`.git`}),`, outside the folder the Docker sandbox mounts, so Claude couldn’t commit. Run parallel tasks only in a repository you trust, on a machine where that’s acceptable.`]})}),`\n`,_jsx(_components.p,{children:`While they run you get one status line per task. When all have finished you get a summary:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`6`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`✓ 2 of 3 tasks done · 1 failed · 1 branch to review`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` 1 taskgraph/task-1 · 2 commits`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` 2 no changes; worktree removed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` 3 failed: exit 1 · .taskgraph/worktrees/task-3.log`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Next: review with git log -p HEAD..taskgraph/task-1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Nothing is merged.`}),` A task that left commits or changes keeps its worktree and its branch, ready for you to review and merge yourself. It’s in `,_jsx(_components.code,{children:`review`}),` if Claude got that far, and otherwise stays claimed (`,_jsx(_components.code,{children:`in-progress`}),`). A task that left nothing has its worktree and branch removed, and its claim released: it goes back to `,_jsx(_components.code,{children:`pending`}),`, unless Claude already marked it.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Ctrl-C`}),` stops every Claude Code process and releases every claim (the tasks still `,_jsx(_components.code,{children:`in-progress`}),` go back to `,_jsx(_components.code,{children:`pending`}),`; one Claude already marked `,_jsx(_components.code,{children:`review`}),` stays there). Closing the terminal or sending `,_jsx(_components.code,{children:`SIGTERM`}),` does the same. Worktrees with work in them stay. Run the same command again to pick up where they left off: an existing `,_jsx(_components.code,{children:`taskgraph/task-\u003cid>`}),` branch or worktree is reused. A second Ctrl-C exits at once, without the cleanup, but still kills the Claude Code processes.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Before it starts`}),`, `,_jsx(_components.code,{children:`--parallel`}),` refuses to run when tracked files have uncommitted changes, because the worktrees start from your last commit and wouldn’t have them. Commit or stash first. Changes to `,_jsx(_components.code,{children:`.taskgraph/tasks/`}),` and `,_jsx(_components.code,{children:`.taskgraph/state.json`}),` don’t count, since claims and status changes are written there; other files under `,_jsx(_components.code,{children:`.taskgraph/`}),`, such as `,_jsx(_components.code,{children:`config.json`}),`, do.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`.taskgraph/worktrees`}),` must be a real folder. If it, a task’s worktree path or a log file is a symlink, that task fails instead of writing through it.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`--parallel`}),` takes a number from 1 to 16 and works with `,_jsx(_components.code,{children:`--tag`}),`, `,_jsx(_components.code,{children:`--trust`}),` and `,_jsx(_components.code,{children:`--project`}),`. It can’t be combined with `,_jsx(_components.code,{children:`--prompt`}),` (other than `,_jsx(_components.code,{children:`default`}),`), `,_jsx(_components.code,{children:`--iterations`}),`, `,_jsx(_components.code,{children:`--id`}),`, `,_jsx(_components.code,{children:`--verbose`}),` or `,_jsx(_components.code,{children:`--sandbox`}),` (see the warning above). The exit code is 0 when every task finished, 1 when one failed, and 130 after Ctrl-C.`]}),`\n`,_jsx(Heading,{level:`2`,id:`status-goes-to-the-main-project`,children:`Status goes to the main project`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`.taskgraph/`}),` is committed, so each worktree has its own copy of `,_jsx(_components.code,{children:`tasks.json`}),`, as of your last commit. Every Claude Code process gets the `,_jsx(_components.code,{children:`TASKGRAPH_PROJECT_ROOT`}),` environment variable set to your project, so the `,_jsx(_components.code,{children:`taskgraph`}),` commands it runs read and write your project’s `,_jsx(_components.code,{children:`tasks.json`}),`, not the worktree’s copy. The TaskGraph plugin’s hooks and the TaskGraph MCP server follow it too: an MCP tool call that passes the task’s worktree as `,_jsx(_components.code,{children:`projectRoot`}),` works on your project.`]}),`\n`,_jsx(_components.p,{children:`Because of that:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Status changes and notes land in your project’s `,_jsx(_components.code,{children:`tasks.json`}),`, through the same locked write as any other `,_jsx(_components.code,{children:`taskgraph`}),` command, so `,_jsx(_components.code,{children:`taskgraph list`}),` shows them while the run goes on.`]}),`\n`,_jsx(_components.li,{children:`A task you added and haven’t committed yet still works: the worktree’s copy doesn’t have it, but Claude never reads that copy.`}),`\n`,_jsxs(_components.li,{children:[`The task branches carry only Claude’s work, so merging several of them doesn’t bring `,_jsx(_components.code,{children:`tasks.json`}),` conflicts.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Claude marks a finished task `,_jsx(_components.code,{children:`review`}),`, not `,_jsx(_components.code,{children:`done`}),`, because its work is on a branch you haven’t merged. A task in `,_jsx(_components.code,{children:`review`}),` doesn’t count as finished, so the tasks that depend on it wait: a later `,_jsx(_components.code,{children:`loop --parallel`}),` won’t start them from a commit that lacks their dependency. After you merge the branch, mark the task done with `,_jsx(_components.code,{children:`taskgraph set-status --id=\u003cid> --status=done`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Run Tasks in Parallel","sidebarTitle":"Parallel Loop","description":"Run independent tasks side by side, each in its own git worktree, with loop --parallel","href":"/capabilities/loop-parallel"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Status goes to the main project","slug":"status-goes-to-the-main-project","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"myself-fcf8480c","siteName":"TaskGraph","title":"Run Tasks in Parallel - TaskGraph","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T22:57:46.741Z","originalFileLocation":"capabilities/loop-parallel.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Run independent tasks side by side, each in its own git worktree, with loop --parallel\">\u003cmeta data-mint-head name=\"application-name\" content=\"TaskGraph\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Run Tasks in Parallel - TaskGraph\">\u003cmeta data-mint-head property=\"og:description\" content=\"Run independent tasks side by side, each in its own git worktree, with loop --parallel\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TaskGraph\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://taskgraph-ai.com/capabilities/loop-parallel\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://myself-fcf8480c.mintlify.app/_mintlify/api/og/v2?division=Technical+Capabilities\u0026amp;title=Run+Tasks+in+Parallel\u0026amp;description=Run+independent+tasks+side+by+side%2C+each+in+its+own+git+worktree%2C+with+loop+--parallel\u0026amp;theme=bffb9e5eb7ba1722e7c9de5f\u0026amp;signature=443e49ab6f0227e91b5653e3f69eaf4ce04fb2730bdb93aee80397e5284c2d80\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Run Tasks in Parallel - TaskGraph\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Run independent tasks side by side, each in its own git worktree, with loop --parallel\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://myself-fcf8480c.mintlify.app/_mintlify/api/og/v2?division=Technical+Capabilities\u0026amp;title=Run+Tasks+in+Parallel\u0026amp;description=Run+independent+tasks+side+by+side%2C+each+in+its+own+git+worktree%2C+with+loop+--parallel\u0026amp;theme=bffb9e5eb7ba1722e7c9de5f\u0026amp;signature=443e49ab6f0227e91b5653e3f69eaf4ce04fb2730bdb93aee80397e5284c2d80\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/myself-fcf8480c/VIQSwQGWxMOj2gkJ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TaskGraph\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3366CC\">\u003clink data-mint-head rel=\"canonical\" href=\"https://taskgraph-ai.com/capabilities/loop-parallel\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/capabilities/loop-parallel.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://taskgraph-ai.com/#organization\",\"name\":\"TaskGraph\",\"url\":\"https://taskgraph-ai.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/myself-fcf8480c/GzHIJhIlhqfXn7i0/logo/light.png?fit=max\u0026auto=format\u0026n=GzHIJhIlhqfXn7i0\u0026q=85\u0026s=a9a99fb754babb33f3e453d5b6fad8bd\"}},{\"@type\":\"WebSite\",\"@id\":\"https://taskgraph-ai.com#website\",\"name\":\"TaskGraph\",\"url\":\"https://taskgraph-ai.com\",\"publisher\":{\"@id\":\"https://taskgraph-ai.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://taskgraph-ai.com/capabilities/loop-parallel#webpage\",\"url\":\"https://taskgraph-ai.com/capabilities/loop-parallel\",\"name\":\"Run Tasks in Parallel\",\"description\":\"Run independent tasks side by side, each in its own git worktree, with loop --parallel\",\"dateModified\":\"2026-10-23T22:57:46.741Z\",\"isPartOf\":{\"@id\":\"https://taskgraph-ai.com#website\"},\"breadcrumb\":{\"@id\":\"https://taskgraph-ai.com/capabilities/loop-parallel#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://taskgraph-ai.com/capabilities/loop-parallel#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Technical Capabilities\",\"item\":\"https://taskgraph-ai.com/capabilities/mcp\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Run Tasks in Parallel\",\"item\":\"https://taskgraph-ai.com/capabilities/loop-parallel\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://taskgraph-ai.com/capabilities/loop-parallel#article\",\"headline\":\"Run Tasks in Parallel\",\"name\":\"Run Tasks in Parallel\",\"description\":\"Run independent tasks side by side, each in its own git worktree, with loop --parallel\",\"url\":\"https://taskgraph-ai.com/capabilities/loop-parallel\",\"mainEntityOfPage\":{\"@id\":\"https://taskgraph-ai.com/capabilities/loop-parallel#webpage\"},\"dateModified\":\"2026-10-23T22:57:46.741Z\",\"publisher\":{\"@id\":\"https://taskgraph-ai.com/#organization\"},\"isPartOf\":{\"@id\":\"https://taskgraph-ai.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TaskGraph\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TaskGraph","nav":{"global":{"anchors":[{"anchor":"Github","icon":"github","href":"https://github.com/stephennmiller/taskgraph-ai"}]},"tabs":[{"tab":"TaskGraph Documentation","groups":[{"group":"Welcome","pages":[{"title":"TaskGraph: task management for Claude Code","sidebarTitle":"Introduction","href":"/introduction"},{"title":"Upgrading","href":"/upgrading"},{"title":"Migrating from Task Master","href":"/migrating-from-taskmaster"}]},{"group":"Getting Started","pages":[{"group":"Quick Start","pages":[{"title":"Quick Start","sidebarTitle":"Quick Start","href":"/getting-started/quick-start/quick-start"},{"title":"Requirements","sidebarTitle":"Requirements","href":"/getting-started/quick-start/requirements"},{"title":"Installation","sidebarTitle":"Installation","href":"/getting-started/quick-start/installation"},{"title":"Configuration","sidebarTitle":"Configuration","href":"/getting-started/quick-start/configuration-quick"},{"title":"PRD Creation and Parsing","sidebarTitle":"PRD Creation and Parsing","href":"/getting-started/quick-start/prd-quick"},{"title":"Tasks Setup","sidebarTitle":"Tasks Setup","href":"/getting-started/quick-start/tasks-quick"},{"title":"Executing Tasks","sidebarTitle":"Executing Tasks","href":"/getting-started/quick-start/execute-quick"}]},{"title":"Authentication","sidebarTitle":"Authentication","href":"/getting-started/api-keys"},{"title":"Configuration","href":"/configuration"},{"title":"Tutorial","href":"/tutorial"},{"title":"Example Interactions","sidebarTitle":"Examples","href":"/examples"},{"title":"FAQ","sidebarTitle":"FAQ","href":"/getting-started/faq"},{"title":"Contributing to TaskGraph","href":"/getting-started/contribute"}]},{"group":"Best Practices","pages":[{"title":"Intro to Advanced Usage","sidebarTitle":"Advanced Usage","href":"/best-practices/index"},{"title":"Advanced Configuration","sidebarTitle":"Advanced Configuration","href":"/best-practices/configuration-advanced"},{"title":"Advanced Tasks","sidebarTitle":"Advanced Tasks","href":"/best-practices/advanced-tasks"}]},{"group":"Technical Capabilities","pages":[{"title":"MCP Tools","sidebarTitle":"MCP Tools","href":"/capabilities/mcp"},{"title":"Claude Code Integration","sidebarTitle":"Claude Code","href":"/capabilities/claude-code"},{"group":"CLI Commands","pages":[{"title":"CLI Commands","sidebarTitle":"Overview","href":"/capabilities/cli-root-commands"},{"title":"Finding Work","sidebarTitle":"Finding Work","href":"/capabilities/cli-viewing-commands"},{"title":"Updating Tasks","sidebarTitle":"Updating Tasks","href":"/capabilities/cli-updating-commands"},{"title":"Planning Commands","sidebarTitle":"Planning Commands","href":"/capabilities/cli-planning-commands"},{"title":"Project Setup","sidebarTitle":"Project Setup","href":"/capabilities/cli-project-commands"}]},{"title":"Task Structure","sidebarTitle":"Task Structure","href":"/capabilities/task-structure"},{"title":"Dependency Graph","sidebarTitle":"Dependency Graph","href":"/capabilities/dependency-graph"},{"title":"Archiving finished tasks","sidebarTitle":"Archive","href":"/capabilities/archive"},{"title":"Loop Command","sidebarTitle":"Loop Command","description":"Run Claude Code in autonomous loops for batch task completion","href":"/capabilities/loop"},{"title":"Run Tasks in Parallel","sidebarTitle":"Parallel Loop","href":"/capabilities/loop-parallel"},{"title":"Loop presets","href":"/capabilities/loop-presets"},{"title":"Research","sidebarTitle":"Research","href":"/capabilities/research"},{"title":"GitHub Sync","sidebarTitle":"GitHub Sync","href":"/capabilities/github-sync"},{"title":"Merging tasks.json","sidebarTitle":"Merging tasks.json","href":"/capabilities/merge-driver"},{"title":"JSON Output","sidebarTitle":"JSON Output","href":"/capabilities/json-output"}]}]}]},"title":"Run Tasks in Parallel - TaskGraph","buildId":"dpl_7EGD3AHhNmnVNgQ8U7beMHiqTzw8","deploymentId":"dpl_7EGD3AHhNmnVNgQ8U7beMHiqTzw8","dynamics":[],"chunks":[]}