@meistrari/remy-cli 1.25.0 → 1.25.1-rc.0

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 (3) hide show
  1. package/README.md +2 -0
  2. package/dist/remy.js +39 -10
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -40,6 +40,8 @@ On first use, Remy opens browser-based device authorization, validates your Codi
40
40
 
41
41
  Run `remy update` to install a newer CLI release using the package manager that owns your installation (mise, Bun, pnpm, or npm). No sign-in is required. Use `remy --version` to print the installed version.
42
42
 
43
+ For mise installations, updates change the existing owning TOML or `.tool-versions` config to the exact new version and keep the previous installation available for running processes. Shared-cache npm installs are supported.
44
+
43
45
  Stable versions check npm’s `latest` channel. Release candidates check both `rc` and `latest` and choose the newer version; Remy never downgrades. To switch from stable to RC, use the explicit `@rc` install command above.
44
46
 
45
47
  Each interactive `remy` or `remy dashboard` startup checks for an update before sign-in or the splash. When one is available, type `y` or `yes`, then Enter, to upgrade. Press Enter or type `n` to continue with the current version. Lookup failures or a two-second timeout let startup continue. After a successful upgrade, Remy exits and asks you to run it again. Installation failures exit with an error so you can resolve the package-manager problem and retry.
package/dist/remy.js CHANGED
@@ -34592,17 +34592,23 @@ function formatSessionJson({
34592
34592
  `;
34593
34593
  }
34594
34594
  // src/version.ts
34595
- var remyCliVersion = "1.25.0";
34595
+ var remyCliVersion = "1.25.1-rc.0";
34596
34596
 
34597
34597
  // src/self-update.ts
34598
34598
  import { spawn } from "child_process";
34599
34599
  import { realpath } from "fs/promises";
34600
- import { join as join3, relative, isAbsolute } from "path";
34600
+ import { join as join3, isAbsolute } from "path";
34601
34601
  import { createInterface } from "readline/promises";
34602
34602
  var {semver } = globalThis.Bun;
34603
34603
  var packageName = "@meistrari/remy-cli";
34604
34604
  var versionSchema = exports_external2.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-rc\.(0|[1-9]\d*))?$/);
34605
34605
  var tagsSchema = exports_external2.object({ latest: versionSchema, rc: versionSchema.optional() });
34606
+ var miseInstallationsSchema = exports_external2.array(exports_external2.object({
34607
+ install_path: exports_external2.string(),
34608
+ active: exports_external2.boolean(),
34609
+ installed: exports_external2.boolean(),
34610
+ source: exports_external2.object({ type: exports_external2.string(), path: exports_external2.string() }).optional()
34611
+ }));
34606
34612
  function createCliUpdates({
34607
34613
  currentVersion,
34608
34614
  entryPath,
@@ -34650,11 +34656,26 @@ function createCliUpdates({
34650
34656
  };
34651
34657
  let argv;
34652
34658
  let updatedEntry = runningEntry;
34653
- const miseRoot = await probe(["mise", "where", `npm:${packageName}@${currentVersion}`]);
34654
- const miseRelative = miseRoot ? relative(miseRoot, runningEntry) : "";
34655
- const usesMise = miseRoot !== "" && miseRelative !== "" && !miseRelative.startsWith("..") && !isAbsolute(miseRelative);
34659
+ const miseRoot = await probe(["mise", "where", `npm:${packageName}`]);
34660
+ let miseRelative = "";
34661
+ if (miseRoot) {
34662
+ for (const layout of ["node_modules", "lib/node_modules"]) {
34663
+ const candidate = join3(layout, packageName, "dist", "remy.js");
34664
+ if (await matchesEntry(join3(miseRoot, candidate))) {
34665
+ miseRelative = candidate;
34666
+ break;
34667
+ }
34668
+ }
34669
+ }
34670
+ const usesMise = miseRelative !== "";
34656
34671
  if (usesMise) {
34657
- argv = ["mise", "upgrade", `npm:${packageName}@${version5}`, "--bump", "--no-prune"];
34672
+ const lookup = await probe(["mise", "ls", `npm:${packageName}`, "--current", "--json"]);
34673
+ const installations = lookup ? miseInstallationsSchema.parse(JSON.parse(lookup)) : [];
34674
+ const owners = installations.filter((installation) => installation.active && installation.installed && installation.install_path === miseRoot);
34675
+ const source = owners.length === 1 ? owners[0]?.source : undefined;
34676
+ if (!source || !["mise.toml", ".tool-versions"].includes(source.type) || !isAbsolute(source.path))
34677
+ throw new Error("Cannot identify the owning mise config for this Remy installation. Update it with mise directly, then retry remy --version.");
34678
+ argv = ["mise", "use", "--path", source.path, "--pin", `npm:${packageName}@${version5}`];
34658
34679
  } else {
34659
34680
  const bunBin = await probe(["bun", "pm", "bin", "-g"]);
34660
34681
  if (bunBin && await matchesEntry(join3(bunBin, "remy"))) {
@@ -34679,7 +34700,7 @@ function createCliUpdates({
34679
34700
  if (result.exitCode !== 0)
34680
34701
  throw new Error(`Remy update failed: ${argv[0]} exited with code ${result.exitCode}. Resolve the package manager error and retry remy update.`);
34681
34702
  if (usesMise) {
34682
- const located = await runProcess({ argv: ["mise", "where", `npm:${packageName}@${version5}`], signal, display: false });
34703
+ const located = await runProcess({ argv: ["mise", "where", `npm:${packageName}`], signal, display: false });
34683
34704
  if (located.exitCode !== 0 || !located.stdout.trim())
34684
34705
  throw new Error("Update finished but the new mise installation could not be located. Check remy --version before retrying.");
34685
34706
  updatedEntry = join3(located.stdout.trim(), miseRelative);
@@ -37746,7 +37767,7 @@ function createWorkspaceController({ client, sessionId, signal, operations = {},
37746
37767
  }
37747
37768
  return;
37748
37769
  }
37749
- if (selection.kind !== "changes" && selection.repositoryId !== event.repositoryId)
37770
+ if (event.kind !== "turn-ended" && selection.kind !== "changes" && selection.repositoryId !== event.repositoryId)
37750
37771
  return;
37751
37772
  if (event.kind === "initialized") {
37752
37773
  if (initializedRepositories.has(event.repositoryId))
@@ -41492,7 +41513,7 @@ var SPINNER_INTERVAL_MS = 80;
41492
41513
  // src/tui/path-completion.ts
41493
41514
  import { readdir } from "fs/promises";
41494
41515
  import { homedir } from "os";
41495
- import { basename as basename5, dirname as dirname5, isAbsolute as isAbsolute2, join as join8, relative as relative2, resolve as resolve2, sep } from "path";
41516
+ import { basename as basename5, dirname as dirname5, isAbsolute as isAbsolute2, join as join8, relative, resolve as resolve2, sep } from "path";
41496
41517
  var maximumCandidates = 50;
41497
41518
  async function completePathToken({ text, cwd, homeDirectory = homedir() }) {
41498
41519
  const token = activePathToken(text);
@@ -41512,7 +41533,7 @@ async function completePathToken({ text, cwd, homeDirectory = homedir() }) {
41512
41533
  }
41513
41534
  return entries.filter((entry2) => entry2.name.toLowerCase().startsWith(prefix.toLowerCase())).sort((left, right) => left.name.localeCompare(right.name)).slice(0, maximumCandidates).map((entry2) => {
41514
41535
  const completedPath = join8(directory, entry2.name);
41515
- const replacementPath = pathUsesTilde ? `~/${relative2(homeDirectory, completedPath)}` : isAbsolute2(pathText) ? completedPath : relative2(cwd, completedPath) || entry2.name;
41536
+ const replacementPath = pathUsesTilde ? `~/${relative(homeDirectory, completedPath)}` : isAbsolute2(pathText) ? completedPath : relative(cwd, completedPath) || entry2.name;
41516
41537
  const normalized = replacementPath.split(sep).join("/");
41517
41538
  const suffix = entry2.isDirectory() ? "/" : "";
41518
41539
  const completed = `${normalized}${suffix}`;
@@ -46660,6 +46681,10 @@ var workspaceInvalidationEventSchema = exports_external2.object({
46660
46681
  type: exports_external2.enum(["session.workspace.git.initialized", "session.workspace.git.committed", "session.workspace.git.pushed"]),
46661
46682
  payload: exports_external2.object({ repository: exports_external2.object({ id: exports_external2.string().min(1) }) })
46662
46683
  });
46684
+ var mainAgentTurnEndedEventSchema = exports_external2.object({
46685
+ type: exports_external2.literal("agent.turn.ended"),
46686
+ actor: exports_external2.object({ type: exports_external2.literal("main") })
46687
+ });
46663
46688
  async function runAttachedSession({
46664
46689
  dependencies,
46665
46690
  operations,
@@ -46852,6 +46877,10 @@ async function runAttachedSession({
46852
46877
  connection = state.connectionStatus;
46853
46878
  if (frame?.kind !== "retained")
46854
46879
  return;
46880
+ if (mainAgentTurnEndedEventSchema.safeParse(frame.data.event).success) {
46881
+ invalidateWorkspace({ kind: "turn-ended" });
46882
+ return;
46883
+ }
46855
46884
  const event = workspaceInvalidationEventSchema.safeParse(frame.data.event);
46856
46885
  if (!event.success)
46857
46886
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/remy-cli",
3
- "version": "1.25.0",
3
+ "version": "1.25.1-rc.0",
4
4
  "description": "Remy, the Coding Agent terminal client.",
5
5
  "type": "module",
6
6
  "bin": {