When running `opencode attach` without `--dir`, the TUI session previously used the server's process.cwd() as its working directory. This changes the default to send the attaching client's cwd so the session operates in the directory where the attach command was invoked.
60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import { cmd } from "../cmd"
|
|
import { tui } from "./app"
|
|
import { win32DisableProcessedInput, win32InstallCtrlCGuard } from "./win32"
|
|
|
|
export const AttachCommand = cmd({
|
|
command: "attach <url>",
|
|
describe: "attach to a running opencode server",
|
|
builder: (yargs) =>
|
|
yargs
|
|
.positional("url", {
|
|
type: "string",
|
|
describe: "http://localhost:4096",
|
|
demandOption: true,
|
|
})
|
|
.option("dir", {
|
|
type: "string",
|
|
description: "directory to run in",
|
|
})
|
|
.option("session", {
|
|
alias: ["s"],
|
|
type: "string",
|
|
describe: "session id to continue",
|
|
})
|
|
.option("password", {
|
|
alias: ["p"],
|
|
type: "string",
|
|
describe: "basic auth password (defaults to OPENCODE_SERVER_PASSWORD)",
|
|
}),
|
|
handler: async (args) => {
|
|
const unguard = win32InstallCtrlCGuard()
|
|
try {
|
|
win32DisableProcessedInput()
|
|
|
|
const directory = (() => {
|
|
if (!args.dir) return process.cwd()
|
|
try {
|
|
process.chdir(args.dir)
|
|
return process.cwd()
|
|
} catch {
|
|
// If the directory doesn't exist locally (remote attach), pass it through.
|
|
return args.dir
|
|
}
|
|
})()
|
|
const headers = (() => {
|
|
const password = args.password ?? process.env.OPENCODE_SERVER_PASSWORD
|
|
if (!password) return undefined
|
|
const auth = `Basic ${Buffer.from(`opencode:${password}`).toString("base64")}`
|
|
return { Authorization: auth }
|
|
})()
|
|
await tui({
|
|
url: args.url,
|
|
args: { sessionID: args.session },
|
|
directory,
|
|
headers,
|
|
})
|
|
} finally {
|
|
unguard?.()
|
|
}
|
|
},
|
|
})
|