hermes-agent/ui-tui/src/__tests__/paths.test.ts
alt-glitch 2bd9c9b881 opentui(phase3): launcher integration — HERMES_TUI_ENGINE dual-engine
hermes --tui launches the native OpenTUI engine (Bun) when
HERMES_TUI_ENGINE=opentui (env) or display.tui_engine=opentui (config);
Ink stays the default and the shipping path is untouched.

- _resolve_tui_engine() (env > config > ink); refuses opentui on
  Windows/Termux (no Bun) -> falls back to ink with a notice.
- _make_opentui_argv() -> [bun, src/entry.real.tsx] (no build step).
- _bun_bin() with HERMES_BUN override.
- Branch at top of _make_tui_argv BEFORE _ensure_tui_node (Bun-only host
  must not bootstrap Node).
- Gate _launch_tui NODE_OPTIONS/--max-old-space-size on engine==ink (Bun
  is JSC; the V8 flag errors/ignores).

Verified end-to-end via tmux: real hermes --tui -> Bun -> OpenTUI ->
real Python gateway streamed a real reply. No-flag default still ink.
2026-06-08 11:11:54 +00:00

70 lines
1.9 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { fmtCwdBranch, shortCwd } from '../domain/paths.js'
describe('shortCwd', () => {
const origHome = process.env.HOME
beforeEach(() => {
process.env.HOME = '/Users/bb'
})
afterEach(() => {
process.env.HOME = origHome
})
it('collapses HOME to ~', () => {
expect(shortCwd('/Users/bb/proj/repo')).toBe('~/proj/repo')
})
it('leaves non-HOME paths alone', () => {
expect(shortCwd('/tmp/work')).toBe('/tmp/work')
})
it('truncates long paths from the left with ellipsis', () => {
const out = shortCwd('/var/long/deeply/nested/workspace/here', 10)
expect(out.startsWith('…')).toBe(true)
expect(out.length).toBe(10)
expect('/var/long/deeply/nested/workspace/here'.endsWith(out.slice(1))).toBe(true)
})
it('keeps paths shorter than max intact', () => {
expect(shortCwd('/a/b', 10)).toBe('/a/b')
})
})
describe('fmtCwdBranch', () => {
const origHome = process.env.HOME
beforeEach(() => {
process.env.HOME = '/Users/bb'
})
afterEach(() => {
process.env.HOME = origHome
})
it('returns bare cwd when branch is null', () => {
expect(fmtCwdBranch('/Users/bb/proj', null)).toBe('~/proj')
})
it('returns bare cwd when branch is empty', () => {
expect(fmtCwdBranch('/Users/bb/proj', '')).toBe('~/proj')
})
it('appends branch in parens', () => {
expect(fmtCwdBranch('/Users/bb/proj', 'main')).toBe('~/proj (main)')
})
it('truncates the path to keep the branch tag readable', () => {
const out = fmtCwdBranch('/Users/bb/very/deeply/nested/project/folder', 'feature-branch', 30)
expect(out).toMatch(/ \(feature-branch\)$/)
expect(out.length).toBeLessThanOrEqual(30)
})
it('truncates very long branch names from the right', () => {
const out = fmtCwdBranch('/Users/bb/p', 'a-very-long-feature-branch-name')
expect(out).toMatch(/^~\/p \(…/)
expect(out).toContain(')')
})
})