Skip to content

Commit fbc4398

Browse files
committed
Derive SSH srcBaseDir from username
When parsing SSH runtime strings, extract the username from user@host format and use it to construct the srcBaseDir path. This ensures workspace creation targets the correct user's home directory. - 'ssh user@host' -> srcBaseDir: /home/user/cmux - 'ssh hostname' -> srcBaseDir: /home/$USER/cmux (current user) Resolves Codex review comment about hard-coded /home/cmux.
1 parent 3a421a9 commit fbc4398

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

src/utils/chatCommands.test.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe("parseRuntimeString", () => {
1818
expect(result).toEqual({
1919
type: "ssh",
2020
host: "user@host",
21-
srcBaseDir: "/home/cmux",
21+
srcBaseDir: "/home/user/cmux",
2222
});
2323
});
2424

@@ -27,7 +27,7 @@ describe("parseRuntimeString", () => {
2727
expect(result).toEqual({
2828
type: "ssh",
2929
host: "User@Host.Example.Com",
30-
srcBaseDir: "/home/cmux",
30+
srcBaseDir: "/home/User/cmux",
3131
});
3232
});
3333

@@ -36,7 +36,7 @@ describe("parseRuntimeString", () => {
3636
expect(result).toEqual({
3737
type: "ssh",
3838
host: "user@host",
39-
srcBaseDir: "/home/cmux",
39+
srcBaseDir: "/home/user/cmux",
4040
});
4141
});
4242

@@ -47,19 +47,23 @@ describe("parseRuntimeString", () => {
4747

4848
test("accepts SSH with hostname only (user will be inferred)", () => {
4949
const result = parseRuntimeString("ssh hostname", workspaceName);
50+
// When no user is specified, uses current user (process.env.USER)
51+
const expectedUser = process.env.USER || "user";
5052
expect(result).toEqual({
5153
type: "ssh",
5254
host: "hostname",
53-
srcBaseDir: "/home/cmux",
55+
srcBaseDir: `/home/${expectedUser}/cmux`,
5456
});
5557
});
5658

5759
test("accepts SSH with hostname.domain only", () => {
5860
const result = parseRuntimeString("ssh dev.example.com", workspaceName);
61+
// When no user is specified, uses current user (process.env.USER)
62+
const expectedUser = process.env.USER || "user";
5963
expect(result).toEqual({
6064
type: "ssh",
6165
host: "dev.example.com",
62-
srcBaseDir: "/home/cmux",
66+
srcBaseDir: `/home/${expectedUser}/cmux`,
6367
});
6468
});
6569

src/utils/chatCommands.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,16 @@ export function parseRuntimeString(
5151
throw new Error("SSH runtime requires host (e.g., 'ssh hostname' or 'ssh user@host')");
5252
}
5353

54+
// Extract username from user@host format, or default to current user
55+
const atIndex = hostPart.indexOf("@");
56+
const user = atIndex > 0 ? hostPart.substring(0, atIndex) : process.env.USER || "user";
57+
5458
// Accept both "hostname" and "user@hostname" formats
5559
// SSH will use current user or ~/.ssh/config if user not specified
5660
return {
5761
type: RUNTIME_MODE.SSH,
5862
host: hostPart,
59-
srcBaseDir: "/home/cmux", // Default remote base directory (NOT including workspace name)
63+
srcBaseDir: `/home/${user}/cmux`, // Default remote base directory (NOT including workspace name)
6064
};
6165
}
6266

0 commit comments

Comments
 (0)