feat(dsh): adapt to DSH 0.1.5-rc.1 and restore the guide description
Baseline moves to DSH 0.1.5-rc.1 — the 0.1.5 line's first release candidate, and the npm `latest` dist-tag now: peer floor ^0.1.5-rc.1, devDependency pins, the CI mount-lane pin and dsh.plugin.json engines all follow. 0.1.5-alpha.2 users stay on v0.19.0-alpha.1. The upstream delta from alpha.2 is small: 373 changed files, mostly version bumps, sidebar preview polish and test snapshots. Exactly two changes touch this plugin, and only one needs work: - `SidebarRightGuideEntry.description` is back (optional). The native guide renders it only while it lists at most 4 entries; a longer list drops every description. The plugin restores `TabDescriptor.description` and the six built-in `guideDesc*` lines (20 dictionaries) verbatim from 0b6ac5d^, but deliberately does NOT restore the old generic `nativeGuideDesc` fallback: the host has no fallback of its own, so a descriptor that declares none now ships no `description` field at all and renders as a clean title-only capsule. Consequence worth knowing: the plugin contributes six guide entries, so the default composition is over the 4-entry limit and shows titles only. The mount lane proves the restored field end to end by shrinking the enabled set to three types through the plugin's own settings route (scratch profile only) and requiring the Files capsule to grow its line. - The built-in `files` type declares a guide description again and uses a coloured folder glyph; the plugin owns that kind, so nothing to do. Verified unchanged from alpha.2 (so nobody re-checks them): the global main-panel model, the file address grammar (util/workspace-path changed only its package.json), the native tab-body host contract (.paneBody is still a block scroller with a definite height), the core/agent/session/ subagent host APIs and the ui-primitives export surface. Restore caveat fixed in the lane: the settings route merges patches key-wise, so undoing a temporary `tabsEnabled` change by posting the original (empty) map leaves the disabled keys behind — the e2e restores every key it touched explicitly.
This commit is contained in:
@@ -165,8 +165,9 @@ describe('registerNativeSurface lifecycle (service-driven registration)', () =>
|
||||
const store = createSidebarStore()
|
||||
store.setSession('s1')
|
||||
const service = createBetterSidebarService(store)
|
||||
service.registerTab({ id: 'terminal', title: 'Terminal', component: () => null })
|
||||
service.registerTab({ id: 'editor', title: 'Files', component: () => null, icon: () => null })
|
||||
service.registerTab({ id: 'terminal', title: 'Terminal', component: () => null, description: () => 'Runs a shell' })
|
||||
service.registerTab({ id: 'editor', title: 'Files', component: () => null, icon: () => null, description: () => 'Browse the tree' })
|
||||
service.registerTab({ id: 'browser', title: 'Browser', component: () => null })
|
||||
const records = createNativeTabRecords()
|
||||
|
||||
const registered: Array<{ id: string; kind: string; title: (address: string) => string; guide: unknown }> = []
|
||||
@@ -208,7 +209,7 @@ describe('registerNativeSurface lifecycle (service-driven registration)', () =>
|
||||
},
|
||||
}
|
||||
runInjected?.()
|
||||
expect(registered.map(entry => entry.kind).sort()).toEqual(['editor', 'files', 'terminal'])
|
||||
expect(registered.map(entry => entry.kind).sort()).toEqual(['browser', 'editor', 'files', 'terminal'])
|
||||
expect(registered.map(entry => entry.id)).toContain('dsh-better-sidebar:files')
|
||||
expect(slotKeys).toContain('dsh-better-sidebar:terminal')
|
||||
expect(slotKeys).toContain('dsh-better-sidebar:files')
|
||||
@@ -228,19 +229,27 @@ describe('registerNativeSurface lifecycle (service-driven registration)', () =>
|
||||
expect(filesType?.guide).toBeDefined()
|
||||
// The takeover carries the editor's glyph, so the "Files" guide row is
|
||||
// not the only one with a blank icon slot.
|
||||
const filesGuide = filesType?.guide as Array<{ icon?: unknown; title: () => string; description?: unknown }> | undefined
|
||||
const filesGuide = filesType?.guide as Array<{ icon?: unknown; title: () => string; description?: () => string }> | undefined
|
||||
expect(filesGuide?.[0]?.icon).toBeDefined()
|
||||
// DSH 0.1.5-alpha.2 renders guide entries as icon+title capsules — the
|
||||
// `description` field is GONE from the host contract, so no entry may
|
||||
// carry one (a leftover would be silently ignored, not rendered).
|
||||
expect(filesGuide?.[0]?.description).toBeUndefined()
|
||||
expect('description' in (filesGuide?.[0] ?? {})).toBe(false)
|
||||
expect(filesGuide?.[0]?.title?.()).toBe('Files')
|
||||
// DSH 0.1.5-rc.1 restored the guide `description` as an optional
|
||||
// `() => string` (rendered only while the guide lists at most 4
|
||||
// entries). The takeover IS the editor's page, so its guide line is the
|
||||
// EDITOR descriptor's description (the takeover reuses it, exactly as it
|
||||
// reuses the glyph), evaluated fresh per call so a thunk follows the
|
||||
// active locale.
|
||||
expect(filesGuide?.[0]?.description?.()).toBe('Browse the tree')
|
||||
const terminalGuide = registered.find(entry => entry.kind === 'terminal')?.guide as
|
||||
Array<{ description?: () => string }> | undefined
|
||||
expect(terminalGuide?.[0]?.description?.()).toBe('Runs a shell')
|
||||
// A descriptor that declares NO description must reach the host with no
|
||||
// `description` field at all — the host has no fallback of its own, so
|
||||
// an empty thunk would render a blank second line instead of a clean
|
||||
// title-only capsule.
|
||||
const browserGuide = registered.find(entry => entry.kind === 'browser')?.guide as
|
||||
Array<{ title: () => string; description?: unknown }> | undefined
|
||||
expect(terminalGuide?.[0]?.description).toBeUndefined()
|
||||
expect('description' in (terminalGuide?.[0] ?? {})).toBe(false)
|
||||
expect(terminalGuide?.[0]?.title?.()).toBe('Terminal')
|
||||
expect(browserGuide?.[0]?.description).toBeUndefined()
|
||||
expect('description' in (browserGuide?.[0] ?? {})).toBe(false)
|
||||
expect(browserGuide?.[0]?.title?.()).toBe('Browser')
|
||||
|
||||
dispose()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user