From bcc3f90457b39c9a56f1bdee753db1caefa669b3 Mon Sep 17 00:00:00 2001 From: Shun Okada Date: Fri, 10 Jul 2026 08:02:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20herdr=20=E3=82=BB=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E4=B8=80=E8=A6=A7=E3=81=AB=E4=BD=9C=E6=A5=AD?= =?UTF-8?q?=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88=E3=83=AA=E3=82=92?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit herdr pane list から最初のペインの cwd を取得し、 MultiplexerSessionInfo の workingDirectory にマッピングする。 Closes #131 Co-Authored-By: Claude Opus 4.6 --- packages/desktop/src/main/pty-server.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/desktop/src/main/pty-server.ts b/packages/desktop/src/main/pty-server.ts index 22697ce..0c723cb 100644 --- a/packages/desktop/src/main/pty-server.ts +++ b/packages/desktop/src/main/pty-server.ts @@ -1089,12 +1089,22 @@ export async function getMultiplexerSessions(): Promise = Array.isArray(parsed) ? parsed : parsed.sessions ?? [] + + let paneCwd: string | undefined + try { + const { stdout: paneOut } = await execAsync('herdr pane list', { env: EXEC_ENV }) + const paneData = JSON.parse(paneOut) + const panes: Array<{ cwd?: string }> = paneData?.result?.panes ?? [] + paneCwd = panes[0]?.cwd + } catch { /* pane list unavailable — skip */ } + for (const s of sessions) { if (!s.name || !SAFE_SESSION_NAME_RE.test(s.name)) continue results.push({ tool: 'herdr', sessionName: s.name, detail: s.running ? 'running' : 'stopped', + ...(paneCwd ? { workingDirectory: paneCwd } : {}), }) } return results From de1e78f5b1e54fab86d7fe9051657fbf3c865bc5 Mon Sep 17 00:00:00 2001 From: Shun Okada Date: Fri, 10 Jul 2026 09:40:06 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20herdr=20pane=20list=20=E3=81=AE?= =?UTF-8?q?=E3=83=91=E3=83=BC=E3=82=B9=E5=A4=B1=E6=95=97=E6=99=82=E3=81=AB?= =?UTF-8?q?=E3=82=BB=E3=83=83=E3=82=B7=E3=83=A7=E3=83=B3=E4=B8=80=E8=A6=A7?= =?UTF-8?q?=E3=81=8C=E6=B6=88=E3=81=88=E3=82=8B=E9=80=80=E8=A1=8C=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Promise.all 化の際に JSON.parse の例外が collectHerdr 全体を reject させていた。try/catch で囲み、パース失敗時は workingDirectory なしでセッション一覧を返すようにする。 Co-Authored-By: Claude Opus 4.6 --- packages/desktop/src/main/pty-server.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/desktop/src/main/pty-server.ts b/packages/desktop/src/main/pty-server.ts index 0c723cb..3e9ba0a 100644 --- a/packages/desktop/src/main/pty-server.ts +++ b/packages/desktop/src/main/pty-server.ts @@ -1084,27 +1084,30 @@ export async function getMultiplexerSessions(): Promise { - const results: MultiplexerSessionInfo[] = [] - const { stdout } = await execAsync('herdr session list --json', { env: EXEC_ENV }) - const parsed = JSON.parse(stdout) + const [sessionResult, paneResult] = await Promise.all([ + execAsync('herdr session list --json', { env: EXEC_ENV }), + execAsync('herdr pane list', { env: EXEC_ENV }).catch(() => null), + ]) + + const parsed = JSON.parse(sessionResult.stdout) const sessions: Array<{ name: string; running: boolean; session_dir?: string }> = Array.isArray(parsed) ? parsed : parsed.sessions ?? [] let paneCwd: string | undefined try { - const { stdout: paneOut } = await execAsync('herdr pane list', { env: EXEC_ENV }) - const paneData = JSON.parse(paneOut) - const panes: Array<{ cwd?: string }> = paneData?.result?.panes ?? [] - paneCwd = panes[0]?.cwd - } catch { /* pane list unavailable — skip */ } + if (paneResult) { + paneCwd = (JSON.parse(paneResult.stdout)?.result?.panes as Array<{ cwd?: string }> | undefined)?.[0]?.cwd + } + } catch { /* pane list parse failure — proceed without workingDirectory */ } + const results: MultiplexerSessionInfo[] = [] for (const s of sessions) { if (!s.name || !SAFE_SESSION_NAME_RE.test(s.name)) continue results.push({ tool: 'herdr', sessionName: s.name, detail: s.running ? 'running' : 'stopped', - ...(paneCwd ? { workingDirectory: paneCwd } : {}), + workingDirectory: paneCwd, }) } return results From f54ea8a62e43826c86d06841507847f27d3d0ae7 Mon Sep 17 00:00:00 2001 From: Shun Okada Date: Fri, 10 Jul 2026 13:30:23 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20herdr=20=E3=82=BB=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=81=8C=E8=A4=87=E6=95=B0=E3=81=82=E3=82=8B?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AB=E8=AA=A4=E3=81=A3=E3=81=9F=20workin?= =?UTF-8?q?gDirectory=20=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pane list はセッションスコープで取得できないため、 セッションが1つの場合のみ workingDirectory を設定する。 Co-Authored-By: Claude Opus 4.6 --- packages/desktop/src/main/pty-server.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/desktop/src/main/pty-server.ts b/packages/desktop/src/main/pty-server.ts index 3e9ba0a..7684106 100644 --- a/packages/desktop/src/main/pty-server.ts +++ b/packages/desktop/src/main/pty-server.ts @@ -1100,17 +1100,13 @@ export async function getMultiplexerSessions(): Promise s.name && SAFE_SESSION_NAME_RE.test(s.name)) + return validSessions.map((s) => ({ + tool: 'herdr' as const, + sessionName: s.name, + detail: s.running ? 'running' : 'stopped', + workingDirectory: validSessions.length === 1 ? paneCwd : undefined, + })) } const collectors: Record Promise> = {