[{"data":1,"prerenderedAt":40},["ShallowReactive",2],{"$f19cgbn8os4bqs":3},{"href":4,"title":5,"description":6,"kind":7,"mark":7,"planned":8,"contributors":9,"provenance":7,"html":10,"headings":11},"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace","Workspace tools","The workspace.* tools: read, search, change, commit and push a throwaway clone of a repository.",null,false,[],"\u003Cp>\u003Cem>Generated from the built-in tools registry. Do not edit by hand.\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>A run whose task declares \u003Ccode>workspace.*\u003C\u002Fcode> tools gets a throwaway clone of the repository named in its \u003Ccode>repo\u003C\u002Fcode> input. The repository sets the clone up itself (its \u003Ccode>.os\u002Fworkspace.yml\u003C\u002Fcode>, or an install the runner detects), and the clone is destroyed when the run ends. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets one.\u003C\u002Fp>\n\u003Cp>These tools work on that clone only. Issues and pull requests stay with the enterprise's own GitHub tools. What a task may change is its write policy: \u003Ccode>writeAllow\u003C\u002Fcode>, \u003Ccode>rewriteAllow\u003C\u002Fcode>, \u003Ccode>writeDeny\u003C\u002Fcode> and \u003Ccode>appendOnly\u003C\u002Fcode> on the task version.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-read-file\">\u003Ccode>workspace.read_file\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Read a file from the clone, whole or one numbered window of it.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-list-dir\">\u003Ccode>workspace.list_dir\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>List a directory in the clone.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-write-file\">\u003Ccode>workspace.write_file\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Write a whole file in the clone.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-delete-file\">\u003Ccode>workspace.delete_file\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Delete a file from the clone outright.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-edit\">\u003Ccode>workspace.edit\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Replace one exact piece of text in a file.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-search\">\u003Ccode>workspace.search\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Search the clone for a string or pattern.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-run-command\">\u003Ccode>workspace.run_command\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Run one allowlisted binary in the clone, with no shell.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-git-commit\">\u003Ccode>workspace.git_commit\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Commit the tracked changes and the files this run wrote.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fworkspace#workspace-git-push\">\u003Ccode>workspace.git_push\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Push the current branch, never the default one.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Ch2 id=\"workspace-read-file\">\u003Ccode>workspace.read_file\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Read a file from the clone, whole or one numbered window of it.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Read a file from the run workspace. Pass path for the whole file, or add startLine (1-based) and limit to read one numbered window of a large file. Prefer a window over a scratch script.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>startLine\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>First line to read, 1-based. Omit to read the whole file.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>limit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>How many lines to read from startLine. Default 200.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> The file as UTF-8 text, or the requested window of it with line numbers.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>exploration_budget_exceeded\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Too many reads back over ground already covered with no write, edit or commit in between, or more distinct files, folders and searches than the per-run budget.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;path&quot;: &quot;src\u002Findex.ts&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;path&quot;: &quot;src\u002Findex.ts&quot;,\n  &quot;startLine&quot;: 200,\n  &quot;limit&quot;: 80\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-list-dir\">\u003Ccode>workspace.list_dir\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>List a directory in the clone.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">List a directory in the run workspace. Pass path (default .).\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> The directory listing.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>exploration_budget_exceeded\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Too many reads back over ground already covered with no write, edit or commit in between, or more distinct files, folders and searches than the per-run budget.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;path&quot;: &quot;src&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-write-file\">\u003Ccode>workspace.write_file\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Write a whole file in the clone.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Write a file in the run workspace. Pass path and content.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>content\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Idempotent: a repeat of the same call acts once, or leaves the same state. Writing the same content again leaves the same file.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>The task version's \u003Ccode>workspace.writeAllow\u003C\u002Fcode>, \u003Ccode>rewriteAllow\u003C\u002Fcode>, \u003Ccode>writeDeny\u003C\u002Fcode> and \u003Ccode>appendOnly\u003C\u002Fcode> decide which paths it may change.\u003C\u002Fli>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> \u003Ccode>{ ok: true }\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_write_not_allowed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is outside the task's write globs, or matches \u003Ccode>writeDeny\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_append_only\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is add-only for this task, and the call would change or remove a line it had when the run started.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;path&quot;: &quot;src\u002Fgreeting.ts&quot;,\n  &quot;content&quot;: &quot;export const greeting = 'hello'\\n&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-delete-file\">\u003Ccode>workspace.delete_file\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Delete a file from the clone outright.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Delete a file in the run workspace outright, instead of overwriting it empty. Pass path.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Not retry-safe: a repeat acts again. A repeat finds nothing to delete and fails \u003Ccode>delete_file_missing\u003C\u002Fcode>; the file stays deleted.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>The task version's \u003Ccode>workspace.writeAllow\u003C\u002Fcode>, \u003Ccode>rewriteAllow\u003C\u002Fcode>, \u003Ccode>writeDeny\u003C\u002Fcode> and \u003Ccode>appendOnly\u003C\u002Fcode> decide which paths it may change.\u003C\u002Fli>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>delete_file_missing\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Nothing is at that path.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>delete_file_is_directory\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is a directory.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_write_not_allowed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is outside the task's write globs, or matches \u003Ccode>writeDeny\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_append_only\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is add-only for this task, and the call would change or remove a line it had when the run started.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;path&quot;: &quot;src\u002Funused.ts&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-edit\">\u003Ccode>workspace.edit\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Replace one exact piece of text in a file.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Replace one exact piece of text in a workspace file. Pass path, oldString and newString. oldString must appear exactly once unless you pass replaceAll. Use this to change a file, not write_file, which rewrites the whole file.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>oldString\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>Exact text to replace, whitespace included.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>newString\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>Replacement text. Empty string deletes oldString.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>replaceAll\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Replace every occurrence instead of requiring one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Not retry-safe: a repeat acts again. A repeat no longer finds oldString and fails \u003Ccode>edit_no_match\u003C\u002Fcode>; the first edit stands.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>The task version's \u003Ccode>workspace.writeAllow\u003C\u002Fcode>, \u003Ccode>rewriteAllow\u003C\u002Fcode>, \u003Ccode>writeDeny\u003C\u002Fcode> and \u003Ccode>appendOnly\u003C\u002Fcode> decide which paths it may change.\u003C\u002Fli>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>edit_old_string_required\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>oldString\u003C\u002Fcode> is missing or empty.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>edit_no_match\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The file does not contain \u003Ccode>oldString\u003C\u002Fcode> exactly.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>edit_not_unique\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>oldString\u003C\u002Fcode> appears more than once and \u003Ccode>replaceAll\u003C\u002Fcode> is not set.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>edit_file_missing\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Nothing is at that path.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_write_not_allowed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is outside the task's write globs, or matches \u003Ccode>writeDeny\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_append_only\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is add-only for this task, and the call would change or remove a line it had when the run started.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;path&quot;: &quot;src\u002Fgreeting.ts&quot;,\n  &quot;oldString&quot;: &quot;'hello'&quot;,\n  &quot;newString&quot;: &quot;'hello, world'&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-search\">\u003Ccode>workspace.search\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Search the clone for a string or pattern.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Search the run workspace for a string. Pass pattern, optionally globs (e.g. [&quot;apps\u002Fapi\u002F**\u002F*.ts&quot;]), ignoreCase, regex, maxResults. Returns path, line and text per match. Use this instead of writing a script to grep.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pattern\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>globs\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array of string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Limit to these path globs.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ignoreCase\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>regex\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Treat pattern as a POSIX extended regexp.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>maxResults\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Default 100, ceiling 500.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> Path, line and text for each match.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>search_pattern_required\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pattern\u003C\u002Fcode> is missing or empty.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>exploration_budget_exceeded\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Too many reads back over ground already covered with no write, edit or commit in between, or more distinct files, folders and searches than the per-run budget.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;pattern&quot;: &quot;TODO&quot;,\n  &quot;globs&quot;: [\n    &quot;src\u002F**\u002F*.ts&quot;\n  ],\n  &quot;maxResults&quot;: 20\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-run-command\">\u003Ccode>workspace.run_command\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Run one allowlisted binary in the clone, with no shell.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Run an allowlisted binary in the run workspace. Pass argv as a JSON array of strings. Example: {&quot;argv&quot;:[&quot;git&quot;,&quot;status&quot;]}. No shell, no pipes, no cd. Allowed bins: git, pnpm, npm, node, mise.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>argv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array of string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>argv[0] is the binary. Example [&quot;pnpm&quot;,&quot;test&quot;]\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Not retry-safe: a repeat acts again. The command runs again.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> \u003Ccode>{ code, stdout, stderr }\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>argv_required\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>argv\u003C\u002Fcode> is missing or is not an array of strings.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bin_not_allowlisted\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>argv[0]\u003C\u002Fcode> is not one of git, pnpm, npm, node, mise, or is a path.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>git_push_via_run_command\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The command would push. Push with \u003Ccode>workspace.git_push\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>git_hooks_skip_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The command would skip the repo's git hooks (\u003Ccode>--no-verify\u003C\u002Fcode>, \u003Ccode>core.hooksPath\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>direct_typecheck_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The command runs a typechecker (\u003Ccode>tsc\u003C\u002Fcode>), a task-graph runner (\u003Ccode>turbo\u003C\u002Fcode>) or a package-manager typecheck script directly, around the repo's verification task. Verify with \u003Ccode>mise run os:red &lt;issue&gt;\u003C\u002Fcode>, which returns the typecheck's exit code and compiler output; \u003Ccode>mise run &lt;task&gt;\u003C\u002Fcode> is never refused.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>scratch_execution_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The command would execute a file this run created outside the task's full-write paths, whether run directly or loaded by an inline script (\u003Ccode>node -e &quot;require('.\u002Ftmp.mjs')&quot;\u003C\u002Fcode>), and whether named in full or the way Node resolves it (\u003Ccode>node tmp\u003C\u002Fcode>, \u003Ccode>require('.\u002Ftmp')\u003C\u002Fcode>, a directory's \u003Ccode>index\u003C\u002Fcode>). Use \u003Ccode>workspace.read_file\u003C\u002Fcode>, \u003Ccode>workspace.search\u003C\u002Fcode> or \u003Ccode>mise run os:red &lt;issue&gt;\u003C\u002Fcode> instead. Files already in the clone, and files in the full-write paths, run as before.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;argv&quot;: [\n    &quot;git&quot;,\n    &quot;status&quot;\n  ]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;argv&quot;: [\n    &quot;npm&quot;,\n    &quot;test&quot;\n  ]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-git-commit\">\u003Ccode>workspace.git_commit\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Commit the tracked changes and the files this run wrote.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Commit in the run workspace. Pass message. Stages tracked changes and the files you wrote or edited; a new file only a command created may be left out, so `git add` it with workspace.run_command first if it belongs in the commit.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Not retry-safe: a repeat acts again. A repeat makes another commit, even an empty one.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>The task version's \u003Ccode>workspace.writeAllow\u003C\u002Fcode>, \u003Ccode>rewriteAllow\u003C\u002Fcode>, \u003Ccode>writeDeny\u003C\u002Fcode> and \u003Ccode>appendOnly\u003C\u002Fcode> decide which paths it may change.\u003C\u002Fli>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_commit_not_allowed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The commit would include paths outside the task's write globs. Nothing is committed.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_append_only\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is add-only for this task, and the call would change or remove a line it had when the run started.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>git_commit_failed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>git refused the commit, for example a pre-commit hook failed.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;message&quot;: &quot;Add the greeting&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"workspace-git-push\">\u003Ccode>workspace.git_push\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Push the current branch, never the default one.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Push the current non-default branch. No arguments.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>No declared fields: the schema accepts any object.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Idempotent: a repeat of the same call acts once, or leaves the same state. A repeat with nothing new to push changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> a run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Needs:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>The task version's \u003Ccode>workspace.writeAllow\u003C\u002Fcode>, \u003Ccode>rewriteAllow\u003C\u002Fcode>, \u003Ccode>writeDeny\u003C\u002Fcode> and \u003Ccode>appendOnly\u003C\u002Fcode> decide which paths it may change.\u003C\u002Fli>\n\u003Cli>A \u003Ccode>repo\u003C\u002Fcode> input on the run — a git remote address, or whatever short form the code host binding's \u003Ccode>git.repoTemplate\u003C\u002Fcode> custom prop expands — which the runner clones. A code host binding may name the repository instead, in its \u003Ccode>git.repo\u003C\u002Fcode> prop. A task without \u003Ccode>workspace.*\u003C\u002Fcode> tools never gets a clone.\u003C\u002Fli>\n\u003Cli>A code host tool bound in the run's cascade whose \u003Ccode>git.host\u003C\u002Fcode> custom prop matches the remote: the push authenticates with that binding's credential, and with no other.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>default_branch_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The current branch is the default branch.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>workspace_append_only\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The path is add-only for this task, and the call would change or remove a line it had when the run started.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>git_push_failed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>git refused the push, for example the repo's pre-push hook failed.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n",[12,16,19,22,25,28,31,34,37],{"id":13,"text":14,"level":15,"planned":8},"workspace-read-file","workspace.read_file",2,{"id":17,"text":18,"level":15,"planned":8},"workspace-list-dir","workspace.list_dir",{"id":20,"text":21,"level":15,"planned":8},"workspace-write-file","workspace.write_file",{"id":23,"text":24,"level":15,"planned":8},"workspace-delete-file","workspace.delete_file",{"id":26,"text":27,"level":15,"planned":8},"workspace-edit","workspace.edit",{"id":29,"text":30,"level":15,"planned":8},"workspace-search","workspace.search",{"id":32,"text":33,"level":15,"planned":8},"workspace-run-command","workspace.run_command",{"id":35,"text":36,"level":15,"planned":8},"workspace-git-commit","workspace.git_commit",{"id":38,"text":39,"level":15,"planned":8},"workspace-git-push","workspace.git_push",1791124519769]