@h-rig/cli 0.0.6-alpha.45 → 0.0.6-alpha.47

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.
package/dist/src/index.js CHANGED
@@ -2884,7 +2884,8 @@ function readRepoConnection(projectRoot) {
2884
2884
  return {
2885
2885
  selected,
2886
2886
  project: typeof record.project === "string" ? record.project : undefined,
2887
- linkedAt: typeof record.linkedAt === "string" ? record.linkedAt : undefined
2887
+ linkedAt: typeof record.linkedAt === "string" ? record.linkedAt : undefined,
2888
+ serverProjectRoot: typeof record.serverProjectRoot === "string" && record.serverProjectRoot.trim() ? record.serverProjectRoot.trim() : undefined
2888
2889
  };
2889
2890
  }
2890
2891
  function writeRepoConnection(projectRoot, state) {
@@ -2895,13 +2896,19 @@ function resolveSelectedConnection(projectRoot, options = {}) {
2895
2896
  if (!repo)
2896
2897
  return null;
2897
2898
  if (repo.selected === "local")
2898
- return { alias: "local", connection: { kind: "local", mode: "auto" } };
2899
+ return { alias: "local", connection: { kind: "local", mode: "auto" }, serverProjectRoot: repo.serverProjectRoot };
2899
2900
  const global = readGlobalConnections(options);
2900
2901
  const connection = global.connections[repo.selected];
2901
2902
  if (!connection) {
2902
2903
  throw new CliError2(`Selected Rig server "${repo.selected}" was not found. Run \`rig server list\` or \`rig server use local\`.`, 1);
2903
2904
  }
2904
- return { alias: repo.selected, connection };
2905
+ return { alias: repo.selected, connection, serverProjectRoot: repo.serverProjectRoot };
2906
+ }
2907
+ function writeRepoServerProjectRoot(projectRoot, serverProjectRoot) {
2908
+ const repo = readRepoConnection(projectRoot);
2909
+ if (!repo)
2910
+ return;
2911
+ writeRepoConnection(projectRoot, { ...repo, serverProjectRoot });
2905
2912
  }
2906
2913
 
2907
2914
  // packages/cli/src/commands/_server-client.ts
@@ -2942,17 +2949,21 @@ async function ensureServerForCli(projectRoot) {
2942
2949
  try {
2943
2950
  const selected = resolveSelectedConnection(projectRoot);
2944
2951
  if (selected?.connection.kind === "remote") {
2952
+ const authToken = readGitHubBearerTokenForRemote(projectRoot);
2953
+ const serverProjectRoot = selected.serverProjectRoot ?? await backfillRemoteServerProjectRoot(projectRoot, selected.connection.baseUrl, authToken);
2945
2954
  return {
2946
2955
  baseUrl: selected.connection.baseUrl,
2947
- authToken: readGitHubBearerTokenForRemote(projectRoot),
2948
- connectionKind: "remote"
2956
+ authToken,
2957
+ connectionKind: "remote",
2958
+ serverProjectRoot
2949
2959
  };
2950
2960
  }
2951
2961
  const connection = await ensureLocalRigServerConnection(projectRoot);
2952
2962
  return {
2953
2963
  baseUrl: connection.baseUrl,
2954
2964
  authToken: connection.authToken,
2955
- connectionKind: "local"
2965
+ connectionKind: "local",
2966
+ serverProjectRoot: resolve11(projectRoot)
2956
2967
  };
2957
2968
  } catch (error) {
2958
2969
  if (error instanceof Error) {
@@ -2961,6 +2972,29 @@ async function ensureServerForCli(projectRoot) {
2961
2972
  throw error;
2962
2973
  }
2963
2974
  }
2975
+ async function backfillRemoteServerProjectRoot(projectRoot, baseUrl, authToken) {
2976
+ const repo = readRepoConnection(projectRoot);
2977
+ const slug = repo?.project?.trim();
2978
+ if (!slug)
2979
+ return null;
2980
+ try {
2981
+ const response = await fetch(`${baseUrl}/api/projects/${encodeURIComponent(slug)}`, {
2982
+ headers: mergeHeaders(undefined, authToken)
2983
+ });
2984
+ if (!response.ok)
2985
+ return null;
2986
+ const payload = await response.json();
2987
+ const project = payload.project && typeof payload.project === "object" && !Array.isArray(payload.project) ? payload.project : null;
2988
+ const checkouts = Array.isArray(project?.checkouts) ? project.checkouts : [];
2989
+ const latestCheckout = [...checkouts].reverse().find((entry) => Boolean(entry && typeof entry === "object" && !Array.isArray(entry) && typeof entry.path === "string"));
2990
+ const path = typeof latestCheckout?.path === "string" && latestCheckout.path.trim() ? latestCheckout.path.trim() : null;
2991
+ if (path)
2992
+ writeRepoServerProjectRoot(projectRoot, path);
2993
+ return path;
2994
+ } catch {
2995
+ return null;
2996
+ }
2997
+ }
2964
2998
  function appendTaskFilterParams(url, filters) {
2965
2999
  if (filters.assignee)
2966
3000
  url.searchParams.set("assignee", filters.assignee);
@@ -2995,9 +3029,12 @@ function diagnosticMessage(payload) {
2995
3029
  }
2996
3030
  async function requestServerJson(context, pathname, init = {}) {
2997
3031
  const server = await ensureServerForCli(context.projectRoot);
3032
+ const headers = mergeHeaders(init.headers, server.authToken);
3033
+ if (server.serverProjectRoot)
3034
+ headers.set("x-rig-project-root", server.serverProjectRoot);
2998
3035
  const response = await fetch(`${server.baseUrl}${pathname}`, {
2999
3036
  ...init,
3000
- headers: mergeHeaders(init.headers, server.authToken)
3037
+ headers
3001
3038
  });
3002
3039
  const text2 = await response.text();
3003
3040
  const payload = text2.trim().length > 0 ? (() => {
@@ -3104,22 +3141,12 @@ async function switchServerProjectRootViaServer(context, projectRoot, options =
3104
3141
  if (!switched) {
3105
3142
  throw new CliError2(`Rig server did not accept project-root switch to ${projectRoot} before timeout (${lastError instanceof Error ? lastError.message : String(lastError ?? "no response")}).`, 1);
3106
3143
  }
3107
- while (Date.now() < deadline) {
3108
- try {
3109
- const status = await requestServerJson(context, "/api/server/status");
3110
- if (status && typeof status === "object" && !Array.isArray(status)) {
3111
- const record = status;
3112
- if (record.projectRoot === projectRoot) {
3113
- return { ok: true, switched, status: record };
3114
- }
3115
- lastError = `server projectRoot=${String(record.projectRoot ?? "unknown")}`;
3116
- }
3117
- } catch (error) {
3118
- lastError = error;
3119
- }
3120
- await sleep(pollMs);
3144
+ const record = switched && typeof switched === "object" && !Array.isArray(switched) ? switched : {};
3145
+ if (record.ok === true) {
3146
+ writeRepoServerProjectRoot(context.projectRoot, projectRoot);
3147
+ return { ok: true, switched: record };
3121
3148
  }
3122
- throw new CliError2(`Rig server did not switch to ${projectRoot} before timeout (${lastError instanceof Error ? lastError.message : String(lastError ?? "no status")}).`, 1);
3149
+ throw new CliError2(`Rig server rejected project-root scope ${projectRoot}: ${String(record.message ?? record.error ?? "unknown error")}`, 1);
3123
3150
  }
3124
3151
  async function listRunsViaServer(context, options = {}) {
3125
3152
  const url = new URL("http://rig.local/api/runs");
@@ -3251,6 +3278,8 @@ async function buildRunPiEventsWebSocketUrl(context, runId) {
3251
3278
  url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
3252
3279
  if (server.authToken)
3253
3280
  url.searchParams.set("token", server.authToken);
3281
+ if (server.serverProjectRoot)
3282
+ url.searchParams.set("rigProjectRoot", server.serverProjectRoot);
3254
3283
  return url.toString();
3255
3284
  }
3256
3285
  async function submitTaskRunViaServer(context, input) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h-rig/cli",
3
- "version": "0.0.6-alpha.45",
3
+ "version": "0.0.6-alpha.47",
4
4
  "type": "module",
5
5
  "description": "Rig package",
6
6
  "license": "UNLICENSED",
@@ -23,11 +23,11 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@clack/prompts": "^1.2.0",
26
- "@earendil-works/pi-coding-agent": "npm:@h-rig/pi-coding-agent@0.0.6-alpha.45",
27
- "@rig/core": "npm:@h-rig/core@0.0.6-alpha.45",
28
- "@rig/runtime": "npm:@h-rig/runtime@0.0.6-alpha.45",
29
- "@rig/client": "npm:@h-rig/client@0.0.6-alpha.45",
30
- "@rig/server": "npm:@h-rig/server@0.0.6-alpha.45",
26
+ "@earendil-works/pi-coding-agent": "npm:@h-rig/pi-coding-agent@0.0.6-alpha.47",
27
+ "@rig/core": "npm:@h-rig/core@0.0.6-alpha.47",
28
+ "@rig/runtime": "npm:@h-rig/runtime@0.0.6-alpha.47",
29
+ "@rig/client": "npm:@h-rig/client@0.0.6-alpha.47",
30
+ "@rig/server": "npm:@h-rig/server@0.0.6-alpha.47",
31
31
  "picocolors": "^1.1.1"
32
32
  }
33
33
  }