@h-rig/runtime 0.0.6-alpha.2 → 0.0.6-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/bin/rig-agent-dispatch.js +20 -0
  2. package/dist/bin/rig-agent.js +49 -6
  3. package/dist/src/control-plane/agent-wrapper.js +20 -0
  4. package/dist/src/control-plane/harness-main.js +49 -6
  5. package/dist/src/control-plane/hooks/completion-verification.js +49 -6
  6. package/dist/src/control-plane/hooks/submodule-branch.js +19 -0
  7. package/dist/src/control-plane/hooks/task-runtime-start.js +19 -0
  8. package/dist/src/control-plane/native/git-ops.js +47 -4
  9. package/dist/src/control-plane/native/harness-cli.js +49 -6
  10. package/dist/src/control-plane/native/task-ops.js +2 -2
  11. package/dist/src/control-plane/runtime/index.js +20 -0
  12. package/dist/src/control-plane/runtime/isolation/home.js +20 -0
  13. package/dist/src/control-plane/runtime/isolation/index.js +20 -0
  14. package/dist/src/control-plane/runtime/isolation/runner.js +20 -0
  15. package/dist/src/control-plane/runtime/isolation.js +20 -0
  16. package/dist/src/control-plane/runtime/queue.js +20 -0
  17. package/native/darwin-arm64/{bin/rig-git → rig-git} +0 -0
  18. package/native/darwin-arm64/rig-git.build-manifest.json +4 -0
  19. package/native/darwin-arm64/{bin/rig-shell → rig-shell} +0 -0
  20. package/native/darwin-arm64/rig-shell.build-manifest.json +4 -0
  21. package/native/darwin-arm64/{bin/rig-tools → rig-tools} +0 -0
  22. package/native/darwin-arm64/rig-tools.build-manifest.json +4 -0
  23. package/native/darwin-arm64/{lib/runtime-native.dylib → runtime-native.dylib} +0 -0
  24. package/package.json +6 -6
  25. package/native/darwin-arm64/lib/runtime-native-darwin-arm64.dylib +0 -0
  26. package/native/darwin-arm64/manifest.json +0 -1
  27. package/native/linux-x64/bin/rig-git +0 -0
  28. package/native/linux-x64/bin/rig-shell +0 -0
  29. package/native/linux-x64/bin/rig-tools +0 -0
  30. package/native/linux-x64/lib/runtime-native-linux-x64.so +0 -0
  31. package/native/linux-x64/lib/runtime-native.so +0 -0
  32. package/native/linux-x64/manifest.json +0 -1
@@ -5887,6 +5887,10 @@ async function runtimeEnv(projectRoot, runtime) {
5887
5887
  env[key] = value;
5888
5888
  }
5889
5889
  }
5890
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
5891
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
5892
+ env.GITHUB_TOKEN = rigGithubToken;
5893
+ }
5890
5894
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
5891
5895
  if (fallbackGithubToken) {
5892
5896
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -5897,6 +5901,13 @@ async function runtimeEnv(projectRoot, runtime) {
5897
5901
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
5898
5902
  env.GH_TOKEN = env.GITHUB_TOKEN;
5899
5903
  }
5904
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
5905
+ if (gitHubToken) {
5906
+ env.RIG_GITHUB_TOKEN = gitHubToken;
5907
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
5908
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
5909
+ applyGitHubCredentialHelperEnv(env);
5910
+ }
5900
5911
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
5901
5912
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
5902
5913
  }
@@ -5977,12 +5988,21 @@ async function materializeRuntimeCertBundle(runtime) {
5977
5988
  }
5978
5989
  return targetPath;
5979
5990
  }
5991
+ function applyGitHubCredentialHelperEnv(env) {
5992
+ env.GIT_TERMINAL_PROMPT = "0";
5993
+ env.GIT_CONFIG_COUNT = "2";
5994
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
5995
+ env.GIT_CONFIG_VALUE_0 = "";
5996
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
5997
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
5998
+ }
5980
5999
  function persistRuntimeSecrets(runtimeRoot, env) {
5981
6000
  const secretsPath = resolve25(runtimeRoot, "runtime-secrets.json");
5982
6001
  const persisted = {};
5983
6002
  for (const key of [
5984
6003
  "GITHUB_TOKEN",
5985
6004
  "GH_TOKEN",
6005
+ "RIG_GITHUB_TOKEN",
5986
6006
  "GREPTILE_GITHUB_TOKEN",
5987
6007
  "GREPTILE_API_KEY",
5988
6008
  "AI_REVIEW_MODE",
@@ -6389,7 +6389,7 @@ This file records approaches that did not work.
6389
6389
  `, "utf-8");
6390
6390
  }
6391
6391
  const content = readFileSync12(failedPath, "utf-8");
6392
- const attempts = (content.match(new RegExp(`^## ${escapeRegExp(activeTask)}\\b`, "gm")) || []).length + 1;
6392
+ const attempts = (content.match(new RegExp(`^## ${escapeRegExp2(activeTask)}\\b`, "gm")) || []).length + 1;
6393
6393
  appendFileSync(failedPath, `
6394
6394
  ## ${activeTask} - Attempt ${attempts} (${nowIso()})
6395
6395
 
@@ -6885,7 +6885,7 @@ function printArtifactSection(path, header) {
6885
6885
  process.stdout.write(readFileSync12(path, "utf-8"));
6886
6886
  console.log("");
6887
6887
  }
6888
- function escapeRegExp(value) {
6888
+ function escapeRegExp2(value) {
6889
6889
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6890
6890
  }
6891
6891
  function changedFilesForTask(projectRoot, taskId, scoped) {
@@ -7112,17 +7112,15 @@ function gitOpenPr(options) {
7112
7112
  const target = options.target || (taskId ? "monorepo" : "project");
7113
7113
  let repoRoot = options.projectRoot;
7114
7114
  let repoLabel = "project-rig";
7115
- let defaultBase = process.env.RIG_PR_BASE_PROJECT || "main";
7115
+ const envBase = target === "monorepo" ? process.env.RIG_PR_BASE_MONOREPO?.trim() || "" : process.env.RIG_PR_BASE_PROJECT?.trim() || "";
7116
7116
  if (target === "monorepo") {
7117
7117
  repoRoot = resolveOptionalMonorepoRoot(options.projectRoot) || resolveMonorepoRoot2(options.projectRoot);
7118
7118
  repoLabel = "monorepo";
7119
- defaultBase = process.env.RIG_PR_BASE_MONOREPO || "main";
7120
7119
  if (taskId) {
7121
7120
  gitSyncBranch(options.projectRoot, taskId, "monorepo");
7122
7121
  }
7123
7122
  } else if (taskId) {
7124
7123
  gitSyncBranch(options.projectRoot, taskId, "project");
7125
- defaultBase = inferProjectBase(options.projectRoot, defaultBase);
7126
7124
  }
7127
7125
  if (!existsSync22(resolve26(repoRoot, ".git"))) {
7128
7126
  throw new Error(`Repository not available for open-pr target ${target}: ${repoRoot}`);
@@ -7131,9 +7129,9 @@ function gitOpenPr(options) {
7131
7129
  if (!branch || branch === "HEAD") {
7132
7130
  throw new Error(`Cannot open PR from detached HEAD in ${repoLabel}. Checkout a branch first.`);
7133
7131
  }
7134
- const base = options.base || defaultBase;
7135
7132
  const repoNameWithOwner = resolveRepoNameWithOwner(options.projectRoot, repoRoot);
7136
7133
  const networkRemote = resolveNetworkRemoteName(options.projectRoot, repoRoot, repoNameWithOwner);
7134
+ const base = options.base || envBase || inferRepositoryDefaultBase(options.projectRoot, repoRoot, repoNameWithOwner, networkRemote, target === "project" ? inferProjectBase(options.projectRoot, "main") : "main");
7137
7135
  refreshRemoteBaseRef(options.projectRoot, repoRoot, base);
7138
7136
  let reviewer = (options.reviewer || "").trim();
7139
7137
  let reviewerSource = reviewer ? "flag" : undefined;
@@ -7559,6 +7557,32 @@ function withGhRepo(command, repoNameWithOwner) {
7559
7557
  }
7560
7558
  return [command[0], command[1], command[2], ...ghRepoArgs(repoNameWithOwner), ...command.slice(3)];
7561
7559
  }
7560
+ function inferRepositoryDefaultBase(projectRoot, repoRoot, repoNameWithOwner, remoteName, fallback) {
7561
+ const remote = remoteName || "origin";
7562
+ const symbolic = runCapture2(gitCmd(projectRoot, repoRoot, "symbolic-ref", "--short", `refs/remotes/${remote}/HEAD`), projectRoot);
7563
+ if (symbolic.exitCode === 0) {
7564
+ const ref = symbolic.stdout.trim().replace(new RegExp(`^${escapeRegExp(remote)}/`), "");
7565
+ if (ref && ref !== "HEAD") {
7566
+ return ref;
7567
+ }
7568
+ }
7569
+ const lsRemote = runCapture2(gitCmd(projectRoot, repoRoot, "ls-remote", "--symref", remote, "HEAD"), projectRoot);
7570
+ if (lsRemote.exitCode === 0) {
7571
+ const match = lsRemote.stdout.match(/^ref:\s+refs\/heads\/([^\t\r\n]+)\s+HEAD/m);
7572
+ if (match?.[1]) {
7573
+ return match[1];
7574
+ }
7575
+ }
7576
+ const gh = resolveGithubCliBinary(projectRoot);
7577
+ if (gh && repoNameWithOwner) {
7578
+ const api = runCapture2(withGhRepo([gh, "repo", "view", "--json", "defaultBranchRef", "--jq", ".defaultBranchRef.name"], repoNameWithOwner), repoRoot);
7579
+ const branch = api.exitCode === 0 ? api.stdout.trim() : "";
7580
+ if (branch) {
7581
+ return branch;
7582
+ }
7583
+ }
7584
+ return fallback;
7585
+ }
7562
7586
  function inferProjectBase(projectRoot, fallback) {
7563
7587
  const containing = runCapture2(gitCmd(projectRoot, projectRoot, "branch", "-r", "--contains", "HEAD"), projectRoot);
7564
7588
  if (containing.exitCode !== 0) {
@@ -7940,6 +7964,10 @@ function runtimeGitEnv(projectRoot) {
7940
7964
  }
7941
7965
  env[key] = value;
7942
7966
  }
7967
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
7968
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
7969
+ env.GITHUB_TOKEN = rigGithubToken;
7970
+ }
7943
7971
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
7944
7972
  env.GITHUB_TOKEN = env.GH_TOKEN;
7945
7973
  }
@@ -7963,6 +7991,13 @@ function runtimeGitEnv(projectRoot) {
7963
7991
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
7964
7992
  env.GH_TOKEN = env.GITHUB_TOKEN;
7965
7993
  }
7994
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
7995
+ if (gitHubToken) {
7996
+ env.RIG_GITHUB_TOKEN = gitHubToken;
7997
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
7998
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
7999
+ applyGitHubCredentialHelperEnv(env);
8000
+ }
7966
8001
  if (runtimeKnownHosts && existsSync22(runtimeKnownHosts)) {
7967
8002
  const sshParts = [
7968
8003
  "ssh",
@@ -7979,6 +8014,14 @@ function runtimeGitEnv(projectRoot) {
7979
8014
  }
7980
8015
  return Object.keys(env).length > 0 ? env : undefined;
7981
8016
  }
8017
+ function applyGitHubCredentialHelperEnv(env) {
8018
+ env.GIT_TERMINAL_PROMPT = "0";
8019
+ env.GIT_CONFIG_COUNT = "2";
8020
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
8021
+ env.GIT_CONFIG_VALUE_0 = "";
8022
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
8023
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
8024
+ }
7982
8025
  function loadPersistedRuntimeSecrets(runtimeRoot) {
7983
8026
  if (!runtimeRoot) {
7984
8027
  return {};
@@ -5887,6 +5887,10 @@ async function runtimeEnv(projectRoot, runtime) {
5887
5887
  env[key] = value;
5888
5888
  }
5889
5889
  }
5890
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
5891
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
5892
+ env.GITHUB_TOKEN = rigGithubToken;
5893
+ }
5890
5894
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
5891
5895
  if (fallbackGithubToken) {
5892
5896
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -5897,6 +5901,13 @@ async function runtimeEnv(projectRoot, runtime) {
5897
5901
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
5898
5902
  env.GH_TOKEN = env.GITHUB_TOKEN;
5899
5903
  }
5904
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
5905
+ if (gitHubToken) {
5906
+ env.RIG_GITHUB_TOKEN = gitHubToken;
5907
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
5908
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
5909
+ applyGitHubCredentialHelperEnv(env);
5910
+ }
5900
5911
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
5901
5912
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
5902
5913
  }
@@ -5977,12 +5988,21 @@ async function materializeRuntimeCertBundle(runtime) {
5977
5988
  }
5978
5989
  return targetPath;
5979
5990
  }
5991
+ function applyGitHubCredentialHelperEnv(env) {
5992
+ env.GIT_TERMINAL_PROMPT = "0";
5993
+ env.GIT_CONFIG_COUNT = "2";
5994
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
5995
+ env.GIT_CONFIG_VALUE_0 = "";
5996
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
5997
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
5998
+ }
5980
5999
  function persistRuntimeSecrets(runtimeRoot, env) {
5981
6000
  const secretsPath = resolve25(runtimeRoot, "runtime-secrets.json");
5982
6001
  const persisted = {};
5983
6002
  for (const key of [
5984
6003
  "GITHUB_TOKEN",
5985
6004
  "GH_TOKEN",
6005
+ "RIG_GITHUB_TOKEN",
5986
6006
  "GREPTILE_GITHUB_TOKEN",
5987
6007
  "GREPTILE_API_KEY",
5988
6008
  "AI_REVIEW_MODE",
@@ -5461,7 +5461,7 @@ This file records approaches that did not work.
5461
5461
  `, "utf-8");
5462
5462
  }
5463
5463
  const content = readFileSync10(failedPath, "utf-8");
5464
- const attempts = (content.match(new RegExp(`^## ${escapeRegExp(activeTask)}\\b`, "gm")) || []).length + 1;
5464
+ const attempts = (content.match(new RegExp(`^## ${escapeRegExp2(activeTask)}\\b`, "gm")) || []).length + 1;
5465
5465
  appendFileSync(failedPath, `
5466
5466
  ## ${activeTask} - Attempt ${attempts} (${nowIso()})
5467
5467
 
@@ -5960,7 +5960,7 @@ function printArtifactSection(path, header) {
5960
5960
  process.stdout.write(readFileSync10(path, "utf-8"));
5961
5961
  console.log("");
5962
5962
  }
5963
- function escapeRegExp(value) {
5963
+ function escapeRegExp2(value) {
5964
5964
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5965
5965
  }
5966
5966
  function changedFilesForTask(projectRoot, taskId, scoped) {
@@ -6187,17 +6187,15 @@ function gitOpenPr(options) {
6187
6187
  const target = options.target || (taskId ? "monorepo" : "project");
6188
6188
  let repoRoot = options.projectRoot;
6189
6189
  let repoLabel = "project-rig";
6190
- let defaultBase = process.env.RIG_PR_BASE_PROJECT || "main";
6190
+ const envBase = target === "monorepo" ? process.env.RIG_PR_BASE_MONOREPO?.trim() || "" : process.env.RIG_PR_BASE_PROJECT?.trim() || "";
6191
6191
  if (target === "monorepo") {
6192
6192
  repoRoot = resolveOptionalMonorepoRoot(options.projectRoot) || resolveMonorepoRoot2(options.projectRoot);
6193
6193
  repoLabel = "monorepo";
6194
- defaultBase = process.env.RIG_PR_BASE_MONOREPO || "main";
6195
6194
  if (taskId) {
6196
6195
  gitSyncBranch(options.projectRoot, taskId, "monorepo");
6197
6196
  }
6198
6197
  } else if (taskId) {
6199
6198
  gitSyncBranch(options.projectRoot, taskId, "project");
6200
- defaultBase = inferProjectBase(options.projectRoot, defaultBase);
6201
6199
  }
6202
6200
  if (!existsSync21(resolve24(repoRoot, ".git"))) {
6203
6201
  throw new Error(`Repository not available for open-pr target ${target}: ${repoRoot}`);
@@ -6206,9 +6204,9 @@ function gitOpenPr(options) {
6206
6204
  if (!branch || branch === "HEAD") {
6207
6205
  throw new Error(`Cannot open PR from detached HEAD in ${repoLabel}. Checkout a branch first.`);
6208
6206
  }
6209
- const base = options.base || defaultBase;
6210
6207
  const repoNameWithOwner = resolveRepoNameWithOwner(options.projectRoot, repoRoot);
6211
6208
  const networkRemote = resolveNetworkRemoteName(options.projectRoot, repoRoot, repoNameWithOwner);
6209
+ const base = options.base || envBase || inferRepositoryDefaultBase(options.projectRoot, repoRoot, repoNameWithOwner, networkRemote, target === "project" ? inferProjectBase(options.projectRoot, "main") : "main");
6212
6210
  refreshRemoteBaseRef(options.projectRoot, repoRoot, base);
6213
6211
  let reviewer = (options.reviewer || "").trim();
6214
6212
  let reviewerSource = reviewer ? "flag" : undefined;
@@ -6659,6 +6657,32 @@ function withGhRepo(command, repoNameWithOwner) {
6659
6657
  }
6660
6658
  return [command[0], command[1], command[2], ...ghRepoArgs(repoNameWithOwner), ...command.slice(3)];
6661
6659
  }
6660
+ function inferRepositoryDefaultBase(projectRoot, repoRoot, repoNameWithOwner, remoteName, fallback) {
6661
+ const remote = remoteName || "origin";
6662
+ const symbolic = runCapture2(gitCmd(projectRoot, repoRoot, "symbolic-ref", "--short", `refs/remotes/${remote}/HEAD`), projectRoot);
6663
+ if (symbolic.exitCode === 0) {
6664
+ const ref = symbolic.stdout.trim().replace(new RegExp(`^${escapeRegExp(remote)}/`), "");
6665
+ if (ref && ref !== "HEAD") {
6666
+ return ref;
6667
+ }
6668
+ }
6669
+ const lsRemote = runCapture2(gitCmd(projectRoot, repoRoot, "ls-remote", "--symref", remote, "HEAD"), projectRoot);
6670
+ if (lsRemote.exitCode === 0) {
6671
+ const match = lsRemote.stdout.match(/^ref:\s+refs\/heads\/([^\t\r\n]+)\s+HEAD/m);
6672
+ if (match?.[1]) {
6673
+ return match[1];
6674
+ }
6675
+ }
6676
+ const gh = resolveGithubCliBinary(projectRoot);
6677
+ if (gh && repoNameWithOwner) {
6678
+ const api = runCapture2(withGhRepo([gh, "repo", "view", "--json", "defaultBranchRef", "--jq", ".defaultBranchRef.name"], repoNameWithOwner), repoRoot);
6679
+ const branch = api.exitCode === 0 ? api.stdout.trim() : "";
6680
+ if (branch) {
6681
+ return branch;
6682
+ }
6683
+ }
6684
+ return fallback;
6685
+ }
6662
6686
  function inferProjectBase(projectRoot, fallback) {
6663
6687
  const containing = runCapture2(gitCmd(projectRoot, projectRoot, "branch", "-r", "--contains", "HEAD"), projectRoot);
6664
6688
  if (containing.exitCode !== 0) {
@@ -7040,6 +7064,10 @@ function runtimeGitEnv(projectRoot) {
7040
7064
  }
7041
7065
  env[key] = value;
7042
7066
  }
7067
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
7068
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
7069
+ env.GITHUB_TOKEN = rigGithubToken;
7070
+ }
7043
7071
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
7044
7072
  env.GITHUB_TOKEN = env.GH_TOKEN;
7045
7073
  }
@@ -7063,6 +7091,13 @@ function runtimeGitEnv(projectRoot) {
7063
7091
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
7064
7092
  env.GH_TOKEN = env.GITHUB_TOKEN;
7065
7093
  }
7094
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
7095
+ if (gitHubToken) {
7096
+ env.RIG_GITHUB_TOKEN = gitHubToken;
7097
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
7098
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
7099
+ applyGitHubCredentialHelperEnv(env);
7100
+ }
7066
7101
  if (runtimeKnownHosts && existsSync21(runtimeKnownHosts)) {
7067
7102
  const sshParts = [
7068
7103
  "ssh",
@@ -7079,6 +7114,14 @@ function runtimeGitEnv(projectRoot) {
7079
7114
  }
7080
7115
  return Object.keys(env).length > 0 ? env : undefined;
7081
7116
  }
7117
+ function applyGitHubCredentialHelperEnv(env) {
7118
+ env.GIT_TERMINAL_PROMPT = "0";
7119
+ env.GIT_CONFIG_COUNT = "2";
7120
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
7121
+ env.GIT_CONFIG_VALUE_0 = "";
7122
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
7123
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
7124
+ }
7082
7125
  function loadPersistedRuntimeSecrets(runtimeRoot) {
7083
7126
  if (!runtimeRoot) {
7084
7127
  return {};
@@ -5,7 +5,7 @@
5
5
  import { appendFileSync as appendFileSync2, existsSync as existsSync21, mkdirSync as mkdirSync11, readFileSync as readFileSync12, writeFileSync as writeFileSync11 } from "fs";
6
6
  import { resolve as resolve24 } from "path";
7
7
  import {
8
- escapeRegExp,
8
+ escapeRegExp as escapeRegExp2,
9
9
  resolveBunCli,
10
10
  resolveBunCliInvocation,
11
11
  resolveProjectRoot,
@@ -6101,17 +6101,15 @@ function gitOpenPr(options) {
6101
6101
  const target = options.target || (taskId ? "monorepo" : "project");
6102
6102
  let repoRoot = options.projectRoot;
6103
6103
  let repoLabel = "project-rig";
6104
- let defaultBase = process.env.RIG_PR_BASE_PROJECT || "main";
6104
+ const envBase = target === "monorepo" ? process.env.RIG_PR_BASE_MONOREPO?.trim() || "" : process.env.RIG_PR_BASE_PROJECT?.trim() || "";
6105
6105
  if (target === "monorepo") {
6106
6106
  repoRoot = resolveOptionalMonorepoRoot(options.projectRoot) || resolveMonorepoRoot2(options.projectRoot);
6107
6107
  repoLabel = "monorepo";
6108
- defaultBase = process.env.RIG_PR_BASE_MONOREPO || "main";
6109
6108
  if (taskId) {
6110
6109
  gitSyncBranch(options.projectRoot, taskId, "monorepo");
6111
6110
  }
6112
6111
  } else if (taskId) {
6113
6112
  gitSyncBranch(options.projectRoot, taskId, "project");
6114
- defaultBase = inferProjectBase(options.projectRoot, defaultBase);
6115
6113
  }
6116
6114
  if (!existsSync20(resolve23(repoRoot, ".git"))) {
6117
6115
  throw new Error(`Repository not available for open-pr target ${target}: ${repoRoot}`);
@@ -6120,9 +6118,9 @@ function gitOpenPr(options) {
6120
6118
  if (!branch || branch === "HEAD") {
6121
6119
  throw new Error(`Cannot open PR from detached HEAD in ${repoLabel}. Checkout a branch first.`);
6122
6120
  }
6123
- const base = options.base || defaultBase;
6124
6121
  const repoNameWithOwner = resolveRepoNameWithOwner(options.projectRoot, repoRoot);
6125
6122
  const networkRemote = resolveNetworkRemoteName(options.projectRoot, repoRoot, repoNameWithOwner);
6123
+ const base = options.base || envBase || inferRepositoryDefaultBase(options.projectRoot, repoRoot, repoNameWithOwner, networkRemote, target === "project" ? inferProjectBase(options.projectRoot, "main") : "main");
6126
6124
  refreshRemoteBaseRef(options.projectRoot, repoRoot, base);
6127
6125
  let reviewer = (options.reviewer || "").trim();
6128
6126
  let reviewerSource = reviewer ? "flag" : undefined;
@@ -6669,6 +6667,32 @@ function withGhRepo(command, repoNameWithOwner) {
6669
6667
  }
6670
6668
  return [command[0], command[1], command[2], ...ghRepoArgs(repoNameWithOwner), ...command.slice(3)];
6671
6669
  }
6670
+ function inferRepositoryDefaultBase(projectRoot, repoRoot, repoNameWithOwner, remoteName, fallback) {
6671
+ const remote = remoteName || "origin";
6672
+ const symbolic = runCapture2(gitCmd(projectRoot, repoRoot, "symbolic-ref", "--short", `refs/remotes/${remote}/HEAD`), projectRoot);
6673
+ if (symbolic.exitCode === 0) {
6674
+ const ref = symbolic.stdout.trim().replace(new RegExp(`^${escapeRegExp(remote)}/`), "");
6675
+ if (ref && ref !== "HEAD") {
6676
+ return ref;
6677
+ }
6678
+ }
6679
+ const lsRemote = runCapture2(gitCmd(projectRoot, repoRoot, "ls-remote", "--symref", remote, "HEAD"), projectRoot);
6680
+ if (lsRemote.exitCode === 0) {
6681
+ const match = lsRemote.stdout.match(/^ref:\s+refs\/heads\/([^\t\r\n]+)\s+HEAD/m);
6682
+ if (match?.[1]) {
6683
+ return match[1];
6684
+ }
6685
+ }
6686
+ const gh = resolveGithubCliBinary(projectRoot);
6687
+ if (gh && repoNameWithOwner) {
6688
+ const api = runCapture2(withGhRepo([gh, "repo", "view", "--json", "defaultBranchRef", "--jq", ".defaultBranchRef.name"], repoNameWithOwner), repoRoot);
6689
+ const branch = api.exitCode === 0 ? api.stdout.trim() : "";
6690
+ if (branch) {
6691
+ return branch;
6692
+ }
6693
+ }
6694
+ return fallback;
6695
+ }
6672
6696
  function inferProjectBase(projectRoot, fallback) {
6673
6697
  const containing = runCapture2(gitCmd(projectRoot, projectRoot, "branch", "-r", "--contains", "HEAD"), projectRoot);
6674
6698
  if (containing.exitCode !== 0) {
@@ -7013,6 +7037,10 @@ function runtimeGitEnv(projectRoot) {
7013
7037
  }
7014
7038
  env[key] = value;
7015
7039
  }
7040
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
7041
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
7042
+ env.GITHUB_TOKEN = rigGithubToken;
7043
+ }
7016
7044
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
7017
7045
  env.GITHUB_TOKEN = env.GH_TOKEN;
7018
7046
  }
@@ -7036,6 +7064,13 @@ function runtimeGitEnv(projectRoot) {
7036
7064
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
7037
7065
  env.GH_TOKEN = env.GITHUB_TOKEN;
7038
7066
  }
7067
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
7068
+ if (gitHubToken) {
7069
+ env.RIG_GITHUB_TOKEN = gitHubToken;
7070
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
7071
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
7072
+ applyGitHubCredentialHelperEnv(env);
7073
+ }
7039
7074
  if (runtimeKnownHosts && existsSync20(runtimeKnownHosts)) {
7040
7075
  const sshParts = [
7041
7076
  "ssh",
@@ -7052,6 +7087,14 @@ function runtimeGitEnv(projectRoot) {
7052
7087
  }
7053
7088
  return Object.keys(env).length > 0 ? env : undefined;
7054
7089
  }
7090
+ function applyGitHubCredentialHelperEnv(env) {
7091
+ env.GIT_TERMINAL_PROMPT = "0";
7092
+ env.GIT_CONFIG_COUNT = "2";
7093
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
7094
+ env.GIT_CONFIG_VALUE_0 = "";
7095
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
7096
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
7097
+ }
7055
7098
  function loadPersistedRuntimeSecrets(runtimeRoot) {
7056
7099
  if (!runtimeRoot) {
7057
7100
  return {};
@@ -7493,7 +7536,7 @@ async function recordVerifierFailure(projectRoot, taskId, paths) {
7493
7536
  let attempts = 1;
7494
7537
  if (existsSync21(failedApproachesPath)) {
7495
7538
  const content = readFileSync12(failedApproachesPath, "utf-8");
7496
- attempts = (content.match(new RegExp(`^## ${escapeRegExp(taskId)}\\b`, "gm")) || []).length + 1;
7539
+ attempts = (content.match(new RegExp(`^## ${escapeRegExp2(taskId)}\\b`, "gm")) || []).length + 1;
7497
7540
  } else {
7498
7541
  mkdirSync11(resolve24(failedApproachesPath, ".."), { recursive: true });
7499
7542
  writeFileSync11(failedApproachesPath, `# Failed Approaches
@@ -4509,6 +4509,10 @@ function runtimeGitEnv(projectRoot) {
4509
4509
  }
4510
4510
  env[key] = value;
4511
4511
  }
4512
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
4513
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
4514
+ env.GITHUB_TOKEN = rigGithubToken;
4515
+ }
4512
4516
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
4513
4517
  env.GITHUB_TOKEN = env.GH_TOKEN;
4514
4518
  }
@@ -4532,6 +4536,13 @@ function runtimeGitEnv(projectRoot) {
4532
4536
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
4533
4537
  env.GH_TOKEN = env.GITHUB_TOKEN;
4534
4538
  }
4539
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
4540
+ if (gitHubToken) {
4541
+ env.RIG_GITHUB_TOKEN = gitHubToken;
4542
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
4543
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
4544
+ applyGitHubCredentialHelperEnv(env);
4545
+ }
4535
4546
  if (runtimeKnownHosts && existsSync22(runtimeKnownHosts)) {
4536
4547
  const sshParts = [
4537
4548
  "ssh",
@@ -4548,6 +4559,14 @@ function runtimeGitEnv(projectRoot) {
4548
4559
  }
4549
4560
  return Object.keys(env).length > 0 ? env : undefined;
4550
4561
  }
4562
+ function applyGitHubCredentialHelperEnv(env) {
4563
+ env.GIT_TERMINAL_PROMPT = "0";
4564
+ env.GIT_CONFIG_COUNT = "2";
4565
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
4566
+ env.GIT_CONFIG_VALUE_0 = "";
4567
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
4568
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
4569
+ }
4551
4570
  function loadPersistedRuntimeSecrets(runtimeRoot) {
4552
4571
  if (!runtimeRoot) {
4553
4572
  return {};
@@ -4509,6 +4509,10 @@ function runtimeGitEnv(projectRoot) {
4509
4509
  }
4510
4510
  env[key] = value;
4511
4511
  }
4512
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
4513
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
4514
+ env.GITHUB_TOKEN = rigGithubToken;
4515
+ }
4512
4516
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
4513
4517
  env.GITHUB_TOKEN = env.GH_TOKEN;
4514
4518
  }
@@ -4532,6 +4536,13 @@ function runtimeGitEnv(projectRoot) {
4532
4536
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
4533
4537
  env.GH_TOKEN = env.GITHUB_TOKEN;
4534
4538
  }
4539
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
4540
+ if (gitHubToken) {
4541
+ env.RIG_GITHUB_TOKEN = gitHubToken;
4542
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
4543
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
4544
+ applyGitHubCredentialHelperEnv(env);
4545
+ }
4535
4546
  if (runtimeKnownHosts && existsSync22(runtimeKnownHosts)) {
4536
4547
  const sshParts = [
4537
4548
  "ssh",
@@ -4548,6 +4559,14 @@ function runtimeGitEnv(projectRoot) {
4548
4559
  }
4549
4560
  return Object.keys(env).length > 0 ? env : undefined;
4550
4561
  }
4562
+ function applyGitHubCredentialHelperEnv(env) {
4563
+ env.GIT_TERMINAL_PROMPT = "0";
4564
+ env.GIT_CONFIG_COUNT = "2";
4565
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
4566
+ env.GIT_CONFIG_VALUE_0 = "";
4567
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
4568
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
4569
+ }
4551
4570
  function loadPersistedRuntimeSecrets(runtimeRoot) {
4552
4571
  if (!runtimeRoot) {
4553
4572
  return {};
@@ -1773,17 +1773,15 @@ function gitOpenPr(options) {
1773
1773
  const target = options.target || (taskId ? "monorepo" : "project");
1774
1774
  let repoRoot = options.projectRoot;
1775
1775
  let repoLabel = "project-rig";
1776
- let defaultBase = process.env.RIG_PR_BASE_PROJECT || "main";
1776
+ const envBase = target === "monorepo" ? process.env.RIG_PR_BASE_MONOREPO?.trim() || "" : process.env.RIG_PR_BASE_PROJECT?.trim() || "";
1777
1777
  if (target === "monorepo") {
1778
1778
  repoRoot = resolveOptionalMonorepoRoot(options.projectRoot) || resolveMonorepoRoot2(options.projectRoot);
1779
1779
  repoLabel = "monorepo";
1780
- defaultBase = process.env.RIG_PR_BASE_MONOREPO || "main";
1781
1780
  if (taskId) {
1782
1781
  gitSyncBranch(options.projectRoot, taskId, "monorepo");
1783
1782
  }
1784
1783
  } else if (taskId) {
1785
1784
  gitSyncBranch(options.projectRoot, taskId, "project");
1786
- defaultBase = inferProjectBase(options.projectRoot, defaultBase);
1787
1785
  }
1788
1786
  if (!existsSync9(resolve11(repoRoot, ".git"))) {
1789
1787
  throw new Error(`Repository not available for open-pr target ${target}: ${repoRoot}`);
@@ -1792,9 +1790,9 @@ function gitOpenPr(options) {
1792
1790
  if (!branch || branch === "HEAD") {
1793
1791
  throw new Error(`Cannot open PR from detached HEAD in ${repoLabel}. Checkout a branch first.`);
1794
1792
  }
1795
- const base = options.base || defaultBase;
1796
1793
  const repoNameWithOwner = resolveRepoNameWithOwner(options.projectRoot, repoRoot);
1797
1794
  const networkRemote = resolveNetworkRemoteName(options.projectRoot, repoRoot, repoNameWithOwner);
1795
+ const base = options.base || envBase || inferRepositoryDefaultBase(options.projectRoot, repoRoot, repoNameWithOwner, networkRemote, target === "project" ? inferProjectBase(options.projectRoot, "main") : "main");
1798
1796
  refreshRemoteBaseRef(options.projectRoot, repoRoot, base);
1799
1797
  let reviewer = (options.reviewer || "").trim();
1800
1798
  let reviewerSource = reviewer ? "flag" : undefined;
@@ -2345,6 +2343,32 @@ function withGhRepo(command, repoNameWithOwner) {
2345
2343
  }
2346
2344
  return [command[0], command[1], command[2], ...ghRepoArgs(repoNameWithOwner), ...command.slice(3)];
2347
2345
  }
2346
+ function inferRepositoryDefaultBase(projectRoot, repoRoot, repoNameWithOwner, remoteName, fallback) {
2347
+ const remote = remoteName || "origin";
2348
+ const symbolic = runCapture2(gitCmd(projectRoot, repoRoot, "symbolic-ref", "--short", `refs/remotes/${remote}/HEAD`), projectRoot);
2349
+ if (symbolic.exitCode === 0) {
2350
+ const ref = symbolic.stdout.trim().replace(new RegExp(`^${escapeRegExp(remote)}/`), "");
2351
+ if (ref && ref !== "HEAD") {
2352
+ return ref;
2353
+ }
2354
+ }
2355
+ const lsRemote = runCapture2(gitCmd(projectRoot, repoRoot, "ls-remote", "--symref", remote, "HEAD"), projectRoot);
2356
+ if (lsRemote.exitCode === 0) {
2357
+ const match = lsRemote.stdout.match(/^ref:\s+refs\/heads\/([^\t\r\n]+)\s+HEAD/m);
2358
+ if (match?.[1]) {
2359
+ return match[1];
2360
+ }
2361
+ }
2362
+ const gh = resolveGithubCliBinary(projectRoot);
2363
+ if (gh && repoNameWithOwner) {
2364
+ const api = runCapture2(withGhRepo([gh, "repo", "view", "--json", "defaultBranchRef", "--jq", ".defaultBranchRef.name"], repoNameWithOwner), repoRoot);
2365
+ const branch = api.exitCode === 0 ? api.stdout.trim() : "";
2366
+ if (branch) {
2367
+ return branch;
2368
+ }
2369
+ }
2370
+ return fallback;
2371
+ }
2348
2372
  function inferProjectBase(projectRoot, fallback) {
2349
2373
  const containing = runCapture2(gitCmd(projectRoot, projectRoot, "branch", "-r", "--contains", "HEAD"), projectRoot);
2350
2374
  if (containing.exitCode !== 0) {
@@ -2726,6 +2750,10 @@ function runtimeGitEnv(projectRoot) {
2726
2750
  }
2727
2751
  env[key] = value;
2728
2752
  }
2753
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
2754
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
2755
+ env.GITHUB_TOKEN = rigGithubToken;
2756
+ }
2729
2757
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
2730
2758
  env.GITHUB_TOKEN = env.GH_TOKEN;
2731
2759
  }
@@ -2749,6 +2777,13 @@ function runtimeGitEnv(projectRoot) {
2749
2777
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
2750
2778
  env.GH_TOKEN = env.GITHUB_TOKEN;
2751
2779
  }
2780
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
2781
+ if (gitHubToken) {
2782
+ env.RIG_GITHUB_TOKEN = gitHubToken;
2783
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
2784
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
2785
+ applyGitHubCredentialHelperEnv(env);
2786
+ }
2752
2787
  if (runtimeKnownHosts && existsSync9(runtimeKnownHosts)) {
2753
2788
  const sshParts = [
2754
2789
  "ssh",
@@ -2765,6 +2800,14 @@ function runtimeGitEnv(projectRoot) {
2765
2800
  }
2766
2801
  return Object.keys(env).length > 0 ? env : undefined;
2767
2802
  }
2803
+ function applyGitHubCredentialHelperEnv(env) {
2804
+ env.GIT_TERMINAL_PROMPT = "0";
2805
+ env.GIT_CONFIG_COUNT = "2";
2806
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
2807
+ env.GIT_CONFIG_VALUE_0 = "";
2808
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
2809
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
2810
+ }
2768
2811
  function loadPersistedRuntimeSecrets(runtimeRoot) {
2769
2812
  if (!runtimeRoot) {
2770
2813
  return {};
@@ -5455,7 +5455,7 @@ This file records approaches that did not work.
5455
5455
  `, "utf-8");
5456
5456
  }
5457
5457
  const content = readFileSync10(failedPath, "utf-8");
5458
- const attempts = (content.match(new RegExp(`^## ${escapeRegExp(activeTask)}\\b`, "gm")) || []).length + 1;
5458
+ const attempts = (content.match(new RegExp(`^## ${escapeRegExp2(activeTask)}\\b`, "gm")) || []).length + 1;
5459
5459
  appendFileSync(failedPath, `
5460
5460
  ## ${activeTask} - Attempt ${attempts} (${nowIso()})
5461
5461
 
@@ -5954,7 +5954,7 @@ function printArtifactSection(path, header) {
5954
5954
  process.stdout.write(readFileSync10(path, "utf-8"));
5955
5955
  console.log("");
5956
5956
  }
5957
- function escapeRegExp(value) {
5957
+ function escapeRegExp2(value) {
5958
5958
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5959
5959
  }
5960
5960
  function changedFilesForTask(projectRoot, taskId, scoped) {
@@ -6181,17 +6181,15 @@ function gitOpenPr(options) {
6181
6181
  const target = options.target || (taskId ? "monorepo" : "project");
6182
6182
  let repoRoot = options.projectRoot;
6183
6183
  let repoLabel = "project-rig";
6184
- let defaultBase = process.env.RIG_PR_BASE_PROJECT || "main";
6184
+ const envBase = target === "monorepo" ? process.env.RIG_PR_BASE_MONOREPO?.trim() || "" : process.env.RIG_PR_BASE_PROJECT?.trim() || "";
6185
6185
  if (target === "monorepo") {
6186
6186
  repoRoot = resolveOptionalMonorepoRoot(options.projectRoot) || resolveMonorepoRoot2(options.projectRoot);
6187
6187
  repoLabel = "monorepo";
6188
- defaultBase = process.env.RIG_PR_BASE_MONOREPO || "main";
6189
6188
  if (taskId) {
6190
6189
  gitSyncBranch(options.projectRoot, taskId, "monorepo");
6191
6190
  }
6192
6191
  } else if (taskId) {
6193
6192
  gitSyncBranch(options.projectRoot, taskId, "project");
6194
- defaultBase = inferProjectBase(options.projectRoot, defaultBase);
6195
6193
  }
6196
6194
  if (!existsSync21(resolve24(repoRoot, ".git"))) {
6197
6195
  throw new Error(`Repository not available for open-pr target ${target}: ${repoRoot}`);
@@ -6200,9 +6198,9 @@ function gitOpenPr(options) {
6200
6198
  if (!branch || branch === "HEAD") {
6201
6199
  throw new Error(`Cannot open PR from detached HEAD in ${repoLabel}. Checkout a branch first.`);
6202
6200
  }
6203
- const base = options.base || defaultBase;
6204
6201
  const repoNameWithOwner = resolveRepoNameWithOwner(options.projectRoot, repoRoot);
6205
6202
  const networkRemote = resolveNetworkRemoteName(options.projectRoot, repoRoot, repoNameWithOwner);
6203
+ const base = options.base || envBase || inferRepositoryDefaultBase(options.projectRoot, repoRoot, repoNameWithOwner, networkRemote, target === "project" ? inferProjectBase(options.projectRoot, "main") : "main");
6206
6204
  refreshRemoteBaseRef(options.projectRoot, repoRoot, base);
6207
6205
  let reviewer = (options.reviewer || "").trim();
6208
6206
  let reviewerSource = reviewer ? "flag" : undefined;
@@ -6653,6 +6651,32 @@ function withGhRepo(command, repoNameWithOwner) {
6653
6651
  }
6654
6652
  return [command[0], command[1], command[2], ...ghRepoArgs(repoNameWithOwner), ...command.slice(3)];
6655
6653
  }
6654
+ function inferRepositoryDefaultBase(projectRoot, repoRoot, repoNameWithOwner, remoteName, fallback) {
6655
+ const remote = remoteName || "origin";
6656
+ const symbolic = runCapture2(gitCmd(projectRoot, repoRoot, "symbolic-ref", "--short", `refs/remotes/${remote}/HEAD`), projectRoot);
6657
+ if (symbolic.exitCode === 0) {
6658
+ const ref = symbolic.stdout.trim().replace(new RegExp(`^${escapeRegExp(remote)}/`), "");
6659
+ if (ref && ref !== "HEAD") {
6660
+ return ref;
6661
+ }
6662
+ }
6663
+ const lsRemote = runCapture2(gitCmd(projectRoot, repoRoot, "ls-remote", "--symref", remote, "HEAD"), projectRoot);
6664
+ if (lsRemote.exitCode === 0) {
6665
+ const match = lsRemote.stdout.match(/^ref:\s+refs\/heads\/([^\t\r\n]+)\s+HEAD/m);
6666
+ if (match?.[1]) {
6667
+ return match[1];
6668
+ }
6669
+ }
6670
+ const gh = resolveGithubCliBinary(projectRoot);
6671
+ if (gh && repoNameWithOwner) {
6672
+ const api = runCapture2(withGhRepo([gh, "repo", "view", "--json", "defaultBranchRef", "--jq", ".defaultBranchRef.name"], repoNameWithOwner), repoRoot);
6673
+ const branch = api.exitCode === 0 ? api.stdout.trim() : "";
6674
+ if (branch) {
6675
+ return branch;
6676
+ }
6677
+ }
6678
+ return fallback;
6679
+ }
6656
6680
  function inferProjectBase(projectRoot, fallback) {
6657
6681
  const containing = runCapture2(gitCmd(projectRoot, projectRoot, "branch", "-r", "--contains", "HEAD"), projectRoot);
6658
6682
  if (containing.exitCode !== 0) {
@@ -7034,6 +7058,10 @@ function runtimeGitEnv(projectRoot) {
7034
7058
  }
7035
7059
  env[key] = value;
7036
7060
  }
7061
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
7062
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
7063
+ env.GITHUB_TOKEN = rigGithubToken;
7064
+ }
7037
7065
  if (!env.GITHUB_TOKEN && env.GH_TOKEN) {
7038
7066
  env.GITHUB_TOKEN = env.GH_TOKEN;
7039
7067
  }
@@ -7057,6 +7085,13 @@ function runtimeGitEnv(projectRoot) {
7057
7085
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
7058
7086
  env.GH_TOKEN = env.GITHUB_TOKEN;
7059
7087
  }
7088
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || env.RIG_GITHUB_TOKEN || rigGithubToken;
7089
+ if (gitHubToken) {
7090
+ env.RIG_GITHUB_TOKEN = gitHubToken;
7091
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
7092
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
7093
+ applyGitHubCredentialHelperEnv(env);
7094
+ }
7060
7095
  if (runtimeKnownHosts && existsSync21(runtimeKnownHosts)) {
7061
7096
  const sshParts = [
7062
7097
  "ssh",
@@ -7073,6 +7108,14 @@ function runtimeGitEnv(projectRoot) {
7073
7108
  }
7074
7109
  return Object.keys(env).length > 0 ? env : undefined;
7075
7110
  }
7111
+ function applyGitHubCredentialHelperEnv(env) {
7112
+ env.GIT_TERMINAL_PROMPT = "0";
7113
+ env.GIT_CONFIG_COUNT = "2";
7114
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
7115
+ env.GIT_CONFIG_VALUE_0 = "";
7116
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
7117
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
7118
+ }
7076
7119
  function loadPersistedRuntimeSecrets(runtimeRoot) {
7077
7120
  if (!runtimeRoot) {
7078
7121
  return {};
@@ -5634,7 +5634,7 @@ This file records approaches that did not work.
5634
5634
  `, "utf-8");
5635
5635
  }
5636
5636
  const content = readFileSync10(failedPath, "utf-8");
5637
- const attempts = (content.match(new RegExp(`^## ${escapeRegExp(activeTask)}\\b`, "gm")) || []).length + 1;
5637
+ const attempts = (content.match(new RegExp(`^## ${escapeRegExp2(activeTask)}\\b`, "gm")) || []).length + 1;
5638
5638
  appendFileSync(failedPath, `
5639
5639
  ## ${activeTask} - Attempt ${attempts} (${nowIso()})
5640
5640
 
@@ -6290,7 +6290,7 @@ function printArtifactSection(path, header) {
6290
6290
  process.stdout.write(readFileSync10(path, "utf-8"));
6291
6291
  console.log("");
6292
6292
  }
6293
- function escapeRegExp(value) {
6293
+ function escapeRegExp2(value) {
6294
6294
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6295
6295
  }
6296
6296
  function changedFilesForTask(projectRoot, taskId, scoped) {
@@ -6331,6 +6331,10 @@ async function runtimeEnv(projectRoot, runtime) {
6331
6331
  env[key] = value;
6332
6332
  }
6333
6333
  }
6334
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
6335
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
6336
+ env.GITHUB_TOKEN = rigGithubToken;
6337
+ }
6334
6338
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
6335
6339
  if (fallbackGithubToken) {
6336
6340
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -6341,6 +6345,13 @@ async function runtimeEnv(projectRoot, runtime) {
6341
6345
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
6342
6346
  env.GH_TOKEN = env.GITHUB_TOKEN;
6343
6347
  }
6348
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
6349
+ if (gitHubToken) {
6350
+ env.RIG_GITHUB_TOKEN = gitHubToken;
6351
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
6352
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
6353
+ applyGitHubCredentialHelperEnv(env);
6354
+ }
6344
6355
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
6345
6356
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
6346
6357
  }
@@ -6436,12 +6447,21 @@ async function materializeRuntimeCertBundle(runtime) {
6436
6447
  }
6437
6448
  return targetPath;
6438
6449
  }
6450
+ function applyGitHubCredentialHelperEnv(env) {
6451
+ env.GIT_TERMINAL_PROMPT = "0";
6452
+ env.GIT_CONFIG_COUNT = "2";
6453
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
6454
+ env.GIT_CONFIG_VALUE_0 = "";
6455
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
6456
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
6457
+ }
6439
6458
  function persistRuntimeSecrets(runtimeRoot, env) {
6440
6459
  const secretsPath = resolve27(runtimeRoot, "runtime-secrets.json");
6441
6460
  const persisted = {};
6442
6461
  for (const key of [
6443
6462
  "GITHUB_TOKEN",
6444
6463
  "GH_TOKEN",
6464
+ "RIG_GITHUB_TOKEN",
6445
6465
  "GREPTILE_GITHUB_TOKEN",
6446
6466
  "GREPTILE_API_KEY",
6447
6467
  "AI_REVIEW_MODE",
@@ -863,6 +863,10 @@ async function runtimeEnv(projectRoot, runtime) {
863
863
  env[key] = value;
864
864
  }
865
865
  }
866
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
867
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
868
+ env.GITHUB_TOKEN = rigGithubToken;
869
+ }
866
870
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
867
871
  if (fallbackGithubToken) {
868
872
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -873,6 +877,13 @@ async function runtimeEnv(projectRoot, runtime) {
873
877
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
874
878
  env.GH_TOKEN = env.GITHUB_TOKEN;
875
879
  }
880
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
881
+ if (gitHubToken) {
882
+ env.RIG_GITHUB_TOKEN = gitHubToken;
883
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
884
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
885
+ applyGitHubCredentialHelperEnv(env);
886
+ }
876
887
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
877
888
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
878
889
  }
@@ -968,12 +979,21 @@ async function materializeRuntimeCertBundle(runtime) {
968
979
  }
969
980
  return targetPath;
970
981
  }
982
+ function applyGitHubCredentialHelperEnv(env) {
983
+ env.GIT_TERMINAL_PROMPT = "0";
984
+ env.GIT_CONFIG_COUNT = "2";
985
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
986
+ env.GIT_CONFIG_VALUE_0 = "";
987
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
988
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
989
+ }
971
990
  function persistRuntimeSecrets(runtimeRoot, env) {
972
991
  const secretsPath = resolve7(runtimeRoot, "runtime-secrets.json");
973
992
  const persisted = {};
974
993
  for (const key of [
975
994
  "GITHUB_TOKEN",
976
995
  "GH_TOKEN",
996
+ "RIG_GITHUB_TOKEN",
977
997
  "GREPTILE_GITHUB_TOKEN",
978
998
  "GREPTILE_API_KEY",
979
999
  "AI_REVIEW_MODE",
@@ -5631,6 +5631,10 @@ async function runtimeEnv(projectRoot, runtime) {
5631
5631
  env[key] = value;
5632
5632
  }
5633
5633
  }
5634
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
5635
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
5636
+ env.GITHUB_TOKEN = rigGithubToken;
5637
+ }
5634
5638
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
5635
5639
  if (fallbackGithubToken) {
5636
5640
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -5641,6 +5645,13 @@ async function runtimeEnv(projectRoot, runtime) {
5641
5645
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
5642
5646
  env.GH_TOKEN = env.GITHUB_TOKEN;
5643
5647
  }
5648
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
5649
+ if (gitHubToken) {
5650
+ env.RIG_GITHUB_TOKEN = gitHubToken;
5651
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
5652
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
5653
+ applyGitHubCredentialHelperEnv(env);
5654
+ }
5644
5655
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
5645
5656
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
5646
5657
  }
@@ -5736,12 +5747,21 @@ async function materializeRuntimeCertBundle(runtime) {
5736
5747
  }
5737
5748
  return targetPath;
5738
5749
  }
5750
+ function applyGitHubCredentialHelperEnv(env) {
5751
+ env.GIT_TERMINAL_PROMPT = "0";
5752
+ env.GIT_CONFIG_COUNT = "2";
5753
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
5754
+ env.GIT_CONFIG_VALUE_0 = "";
5755
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
5756
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
5757
+ }
5739
5758
  function persistRuntimeSecrets(runtimeRoot, env) {
5740
5759
  const secretsPath = resolve25(runtimeRoot, "runtime-secrets.json");
5741
5760
  const persisted = {};
5742
5761
  for (const key of [
5743
5762
  "GITHUB_TOKEN",
5744
5763
  "GH_TOKEN",
5764
+ "RIG_GITHUB_TOKEN",
5745
5765
  "GREPTILE_GITHUB_TOKEN",
5746
5766
  "GREPTILE_API_KEY",
5747
5767
  "AI_REVIEW_MODE",
@@ -2261,6 +2261,10 @@ async function runtimeEnv(projectRoot, runtime) {
2261
2261
  env[key] = value;
2262
2262
  }
2263
2263
  }
2264
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
2265
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
2266
+ env.GITHUB_TOKEN = rigGithubToken;
2267
+ }
2264
2268
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
2265
2269
  if (fallbackGithubToken) {
2266
2270
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -2271,6 +2275,13 @@ async function runtimeEnv(projectRoot, runtime) {
2271
2275
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
2272
2276
  env.GH_TOKEN = env.GITHUB_TOKEN;
2273
2277
  }
2278
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
2279
+ if (gitHubToken) {
2280
+ env.RIG_GITHUB_TOKEN = gitHubToken;
2281
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
2282
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
2283
+ applyGitHubCredentialHelperEnv(env);
2284
+ }
2274
2285
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
2275
2286
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
2276
2287
  }
@@ -2318,12 +2329,21 @@ async function materializeRuntimeCertBundle(runtime) {
2318
2329
  }
2319
2330
  return targetPath;
2320
2331
  }
2332
+ function applyGitHubCredentialHelperEnv(env) {
2333
+ env.GIT_TERMINAL_PROMPT = "0";
2334
+ env.GIT_CONFIG_COUNT = "2";
2335
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
2336
+ env.GIT_CONFIG_VALUE_0 = "";
2337
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
2338
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
2339
+ }
2321
2340
  function persistRuntimeSecrets(runtimeRoot, env) {
2322
2341
  const secretsPath = resolve11(runtimeRoot, "runtime-secrets.json");
2323
2342
  const persisted = {};
2324
2343
  for (const key of [
2325
2344
  "GITHUB_TOKEN",
2326
2345
  "GH_TOKEN",
2346
+ "RIG_GITHUB_TOKEN",
2327
2347
  "GREPTILE_GITHUB_TOKEN",
2328
2348
  "GREPTILE_API_KEY",
2329
2349
  "AI_REVIEW_MODE",
@@ -5631,6 +5631,10 @@ async function runtimeEnv(projectRoot, runtime) {
5631
5631
  env[key] = value;
5632
5632
  }
5633
5633
  }
5634
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
5635
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
5636
+ env.GITHUB_TOKEN = rigGithubToken;
5637
+ }
5634
5638
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
5635
5639
  if (fallbackGithubToken) {
5636
5640
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -5641,6 +5645,13 @@ async function runtimeEnv(projectRoot, runtime) {
5641
5645
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
5642
5646
  env.GH_TOKEN = env.GITHUB_TOKEN;
5643
5647
  }
5648
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
5649
+ if (gitHubToken) {
5650
+ env.RIG_GITHUB_TOKEN = gitHubToken;
5651
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
5652
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
5653
+ applyGitHubCredentialHelperEnv(env);
5654
+ }
5644
5655
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
5645
5656
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
5646
5657
  }
@@ -5736,12 +5747,21 @@ async function materializeRuntimeCertBundle(runtime) {
5736
5747
  }
5737
5748
  return targetPath;
5738
5749
  }
5750
+ function applyGitHubCredentialHelperEnv(env) {
5751
+ env.GIT_TERMINAL_PROMPT = "0";
5752
+ env.GIT_CONFIG_COUNT = "2";
5753
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
5754
+ env.GIT_CONFIG_VALUE_0 = "";
5755
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
5756
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
5757
+ }
5739
5758
  function persistRuntimeSecrets(runtimeRoot, env) {
5740
5759
  const secretsPath = resolve25(runtimeRoot, "runtime-secrets.json");
5741
5760
  const persisted = {};
5742
5761
  for (const key of [
5743
5762
  "GITHUB_TOKEN",
5744
5763
  "GH_TOKEN",
5764
+ "RIG_GITHUB_TOKEN",
5745
5765
  "GREPTILE_GITHUB_TOKEN",
5746
5766
  "GREPTILE_API_KEY",
5747
5767
  "AI_REVIEW_MODE",
@@ -6355,6 +6355,10 @@ async function runtimeEnv(projectRoot, runtime) {
6355
6355
  env[key] = value;
6356
6356
  }
6357
6357
  }
6358
+ const rigGithubToken = process.env.RIG_GITHUB_TOKEN?.trim() || "";
6359
+ if (rigGithubToken && !env.GITHUB_TOKEN && !env.GH_TOKEN) {
6360
+ env.GITHUB_TOKEN = rigGithubToken;
6361
+ }
6358
6362
  const fallbackGithubToken = !env.GITHUB_TOKEN && !env.GH_TOKEN ? await resolveGithubCliAuthToken(hostGhBinary) : "";
6359
6363
  if (fallbackGithubToken) {
6360
6364
  env.GITHUB_TOKEN = fallbackGithubToken;
@@ -6365,6 +6369,13 @@ async function runtimeEnv(projectRoot, runtime) {
6365
6369
  if (!env.GH_TOKEN && env.GITHUB_TOKEN) {
6366
6370
  env.GH_TOKEN = env.GITHUB_TOKEN;
6367
6371
  }
6372
+ const gitHubToken = env.GITHUB_TOKEN || env.GH_TOKEN || rigGithubToken;
6373
+ if (gitHubToken) {
6374
+ env.RIG_GITHUB_TOKEN = gitHubToken;
6375
+ env.GITHUB_TOKEN = env.GITHUB_TOKEN || gitHubToken;
6376
+ env.GH_TOKEN = env.GH_TOKEN || gitHubToken;
6377
+ applyGitHubCredentialHelperEnv(env);
6378
+ }
6368
6379
  if (!env.GREPTILE_GITHUB_TOKEN && env.GITHUB_TOKEN) {
6369
6380
  env.GREPTILE_GITHUB_TOKEN = env.GITHUB_TOKEN;
6370
6381
  }
@@ -6460,12 +6471,21 @@ async function materializeRuntimeCertBundle(runtime) {
6460
6471
  }
6461
6472
  return targetPath;
6462
6473
  }
6474
+ function applyGitHubCredentialHelperEnv(env) {
6475
+ env.GIT_TERMINAL_PROMPT = "0";
6476
+ env.GIT_CONFIG_COUNT = "2";
6477
+ env.GIT_CONFIG_KEY_0 = "credential.helper";
6478
+ env.GIT_CONFIG_VALUE_0 = "";
6479
+ env.GIT_CONFIG_KEY_1 = "credential.helper";
6480
+ env.GIT_CONFIG_VALUE_1 = '!f() { test "$1" = get || exit 0; token="${GITHUB_TOKEN:-${GH_TOKEN:-${RIG_GITHUB_TOKEN:-}}}"; test -n "$token" || exit 0; echo username=x-access-token; echo password="$token"; }; f';
6481
+ }
6463
6482
  function persistRuntimeSecrets(runtimeRoot, env) {
6464
6483
  const secretsPath = resolve27(runtimeRoot, "runtime-secrets.json");
6465
6484
  const persisted = {};
6466
6485
  for (const key of [
6467
6486
  "GITHUB_TOKEN",
6468
6487
  "GH_TOKEN",
6488
+ "RIG_GITHUB_TOKEN",
6469
6489
  "GREPTILE_GITHUB_TOKEN",
6470
6490
  "GREPTILE_API_KEY",
6471
6491
  "AI_REVIEW_MODE",
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "buildKey": "{\"version\":1,\"sourcePath\":\"/var/folders/zr/6js4xbjs3bgf46v76j145mlw0000gn/T/rig-native/rig-git-darwin-arm64\",\"sourceDigest\":\"5d1f9d17af5789a15328b4c4aff2b155962bd9d8e180812fa67a30c1685b2bf3\"}"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "buildKey": "{\"version\":1,\"sourcePath\":\"/var/folders/zr/6js4xbjs3bgf46v76j145mlw0000gn/T/rig-native/rig-shell-darwin-arm64\",\"sourceDigest\":\"082addd699beb1eb87d242208741012bba54becf7e2c3cd85904c68c200be3e3\"}"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "buildKey": "{\"version\":1,\"sourcePath\":\"/var/folders/zr/6js4xbjs3bgf46v76j145mlw0000gn/T/rig-native/rig-tools-darwin-arm64\",\"sourceDigest\":\"a0950e37e897d520196d93e5487bade084e5f0cad45c57843b4e9f16a6421da8\"}"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h-rig/runtime",
3
- "version": "0.0.6-alpha.2",
3
+ "version": "0.0.6-alpha.3",
4
4
  "type": "module",
5
5
  "description": "Rig package",
6
6
  "license": "UNLICENSED",
@@ -64,11 +64,11 @@
64
64
  "module": "./dist/src/index.js",
65
65
  "dependencies": {
66
66
  "@libsql/client": "^0.17.2",
67
- "@rig/contracts": "npm:@h-rig/contracts@0.0.6-alpha.2",
68
- "@rig/core": "npm:@h-rig/core@0.0.6-alpha.2",
69
- "@rig/hook-kit": "npm:@h-rig/hook-kit@0.0.6-alpha.2",
70
- "@rig/shared": "npm:@h-rig/shared@0.0.6-alpha.2",
71
- "@rig/validator-kit": "npm:@h-rig/validator-kit@0.0.6-alpha.2",
67
+ "@rig/contracts": "npm:@h-rig/contracts@0.0.6-alpha.3",
68
+ "@rig/core": "npm:@h-rig/core@0.0.6-alpha.3",
69
+ "@rig/hook-kit": "npm:@h-rig/hook-kit@0.0.6-alpha.3",
70
+ "@rig/shared": "npm:@h-rig/shared@0.0.6-alpha.3",
71
+ "@rig/validator-kit": "npm:@h-rig/validator-kit@0.0.6-alpha.3",
72
72
  "effect": "4.0.0-beta.78",
73
73
  "smol-toml": "^1.6.0"
74
74
  }
@@ -1 +0,0 @@
1
- {"platform":"darwin-arm64","suffix":"dylib","builtAt":"2026-06-07T22:55:24Z"}
Binary file
Binary file
Binary file
@@ -1 +0,0 @@
1
- {"platform":"linux-x64","suffix":"so","builtAt":"2026-06-07T22:56:41Z"}