feat(v0.3): M6 — new tab opens in the active tab's directory

- title-util.cwdFromOsc7: parse cwd from OSC 7 (file:// URL); 4 unit tests
- terminal-session: register OSC 7 handler → cwd getter; opts.cwd → sent in the
  attach frame on a fresh session
- protocol/types: ClientMessage attach.cwd (absolute path); validated
- session/manager/server: thread cwd → createSession spawn cwd (defaults homeDir)
- tabs: '+' (newTab) opens in the active tab's reported cwd, falls back to home
- Verified: server attach.cwd spawns there; cd /private/tmp → + → new tab pwd is
  /private/tmp. 212 tests green.
This commit is contained in:
Yaojia Wang
2026-06-18 07:14:52 +02:00
parent f79f14b89d
commit 87e11734d8
9 changed files with 97 additions and 13 deletions

View File

@@ -1,5 +1,21 @@
import { describe, it, expect } from 'vitest'
import { folderFromTitle } from '../public/title-util.js'
import { folderFromTitle, cwdFromOsc7 } from '../public/title-util.js'
describe('cwdFromOsc7', () => {
it('extracts the path from a file:// URL with a host', () => {
expect(cwdFromOsc7('file://mac.local/Users/me/web-terminal')).toBe('/Users/me/web-terminal')
})
it('extracts the path with an empty host (file:///)', () => {
expect(cwdFromOsc7('file:///Users/me/dir')).toBe('/Users/me/dir')
})
it('decodes percent-encoded spaces', () => {
expect(cwdFromOsc7('file://h/Users/me/my%20dir')).toBe('/Users/me/my dir')
})
it('returns null for non-file URLs', () => {
expect(cwdFromOsc7('http://x/y')).toBeNull()
expect(cwdFromOsc7('garbage')).toBeNull()
})
})
describe('folderFromTitle', () => {
it('extracts the folder from user@host:~/path', () => {