Bump vite and vitest - #4
Open
dependabot[bot] wants to merge 27 commits into
Open
Conversation
* refactor: command generation * feat: add keyboard shortcuts modal and functionality
Replace vanilla HTML/JS with Vite + React 18 + TypeScript foundation. Remove legacy assets/ and old index.html. Generator (lib/generator/*) ported as pure TS with two-output PowerShell (display + clipboard) sharing one builder — prevents the display/clipboard drift bug from the old codebase. JSON action and Batch generators preserve the original escape/quoting rules verified against assets/js/generator.js @ commit 24169ae. 43 vitest cases cover escape utilities, magic-default omission (#64748b color, 0.5 size, empty commands), profile mapping (pwsh/cmd/ bash/wsl), JSON moveFocus tail, batch quote-doubling, single-line clipboard guarantee, and display↔clipboard parity. Build outputs 143KB / 46KB gzipped — well under the 200KB budget.
editorStore (Zustand + zundo, 50-step history, partialize to panels only). Actions: add/delete/update/reorder, setSelected, setSplit, resizePane, loadPanels, reset. First panel always normalized (split=null, size=1.0). PanelList uses @dnd-kit/sortable for reordering. Inspector edits all panel fields with Radix Select for profile, Radix Slider for size, and 11 preset colors + native color input for tab color. Split direction toggle hidden for first panel (it is the new-tab, not a split-pane). StaticPreview is a simple grid of panel cards as a placeholder — Phase 3 replaces it with the visual splitter editor. OutputTabs (Radix Tabs) renders the multi-line PowerShell display, JSON action, and batch file. The PowerShell tab's Copy button explicitly grabs the single-line clipboard variant so paste-into-terminal works. Bundle: 330KB / 108KB gzipped — under the 200KB budget. Tests 43/43 green.
LayoutCanvas builds a binary tree from the flat panel array (useLayoutTree.ts) and renders it via react-resizable-panels. Each split node's children[1] is always the leaf for the panel that introduced the split, so onLayout maps directly back to resizePane(panelId, sizes[1]/100). wt-to-rrp direction translation is centralized in useLayoutTree and documented inline: wt -V means "split to the right", which is rrp direction="horizontal" (panels laid out side by side). The inverse for -H. PaneNode + PaneContextMenu (Radix ContextMenu) replace the old static preview cards. Right-click offers Split V / Split H (both disabled at the 6-panel cap) and Delete pane (disabled when only one remains). Clicking a pane selects it and lights the active border; the inspector slider and the canvas splitter stay in sync via the shared store. Pinned react-resizable-panels to v2 — v4 renamed PanelGroup→Group, PanelResizeHandle→Separator and switched to a Layout map shape; v2's sizes-array onLayout fits the panelId-keyed model cleanly. LayoutCanvas re-keys the tree on structural changes so adding/removing a panel snaps to the new intended sizes rather than carrying stale state. Bundle: 377KB / 122KB gzipped. Typecheck + 43 tests still green.
lib/storage/* persists current panels (auto-save, debounced 400ms), settings, and user templates under v2 LS keys (wt-gen-v2-*). The shared sanitizer normalizes panels read from any source (LS, share URL, file import) so corrupt or partial input cannot crash the editor. URL share encodes panels to a base64url-safe param with compressed field names (t/d/c/cl/p/s/sz). buildShareUrl writes a v=2&p=… query string; useInitialLoad reads it on mount, hydrates the editor, and strips the params from the address bar so reloads fall through to the auto-saved LS copy. TopBar gains four toolbar groups: TemplateDrawer (6 presets + user list), SaveAsTemplateDialog, ImportExportButtons (file roundtrip with inline error toast), and ShareUrlButton (clipboard with check-icon feedback). Templates store persists CRUD through saveUserTemplates so the LS write is synchronous and resists racing tab unloads. Default templates load via unique synthetic ids so they participate in dnd-kit reordering without clashing. Bundle: 400KB / 129KB gzipped. Tests still 43/43 green.
lib/validation/* exposes pure functions that the editor consumes via useValidation. Each panel field carries its own issues (errors → red border, warnings → amber border, inline icon+message helper below). Empty title and empty directory are warnings, not errors, so a fresh panel is not painted red the moment it appears. Linter scans command bodies for eight dangerous patterns: rm -rf /, Remove-Item -Recurse -Force, format c:, del /s/q/f, shutdown /s|/r, fork-bomb, curl|bash, iex of Invoke-WebRequest / iwr|iex. Matches surface as warnings without blocking output generation. TopBar's ValidationBadge collapses the snapshot to a green "OK" pill or an icon+count pair for errors and warnings. Hovering reveals exact counts. Windows path regex broadened: accepts forward and backslash separators, UNC paths, ./… and ../… relatives, and %VAR%-prefixed paths so that templates using %USERPROFILE% don't trip the validator. Vitest grows to 59 cases: 8 panel-validation cases, 8 linter cases (positive and negative). Bundle: 404KB / 130KB gzipped.
useTheme + useAccent hooks resolve light/dark/system at the document root and apply the chosen accent as CSS variables (--accent / --accent-fg). The system listener swaps on prefers-color-scheme changes only when theme="system". Keyboard shortcuts: Ctrl+N (add panel), Del (delete focused panel), Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y (undo / redo via zundo temporal store), Ctrl+S (export JSON), ? (open shortcuts dialog). Field-aware: shortcuts that would conflict with typing only fire when an input is not focused. SettingsDialog exposes theme, accent, and auto-save toggles. ShortcutsDialog lists every binding with kbd-styled keys. InjectWizardDialog walks users through 3 steps of pasting the JSON action into settings.json, with the copy button right above the generated payload on the final step. OutputTabs now renders through prism-react-renderer with a theme-aware selector (dracula on dark, vsLight on light), so the syntax highlight swaps with the rest of the UI instead of staying fixed on a dark background. ProfileSelect adds an inline info hint when command body uses PowerShell-only or Unix-only syntax that conflicts with the selected profile — non-blocking, just a heads-up. Footer carries license/author/source-link with an inline GitHub SVG (lucide v1 dropped brand icons). index.html gets OG and Twitter meta tags for social previews. Note: Toast layer skipped — the existing inline feedback (button checkmark states, ImportExportButtons error pill) already covers the needed UX without adding a Radix portal layer. Bundle: 503KB / 161KB gzipped (prism added ~100KB). Tests still 59/59.
GitHub Actions workflow runs npm ci → npm test → typecheck → build and uploads dist/ as the Pages artifact. PR builds compile but do not deploy; pushes to master trigger the deploy job. README rewrites in the house style (taplock-app / claude-symlink / roadie): centered hero with shields.io badges, "What it solves" lead, live-app link, feature bullets, local-dev quickstart, command reference, tech-stack table, a code-walk of the layout, output samples, keyboard shortcuts, and notes/limitations. No emoji clutter. CLAUDE.md updated for the v2 architecture: ui→store→lib direction, the zundo partialize rule, the flat-array-to-binary-tree derivation in useLayoutTree, the wt↔rrp direction-name inversion warning, the display-vs-clipboard parity invariant, the schema-version-bump escape hatch, sanitize-vs-validate distinction, and the GH Pages base-path gotcha. Preview smoke test against `npm run preview` at the configured base path returns HTTP 200. Tests 59/59 green. Bundle 503KB / 161KB gzipped — under the 200KB gzipped target despite Prism syntax highlighter and Radix primitives.
…cuts Icon: a 64×64 rounded-square mark with a 2×2 pane grid and a ">" prompt in the active quadrant — mirrors the multi-pane editor the app produces. Lives in public/favicon.svg, served at the GH Pages subpath via Vite's automatic base-path rewrite, and referenced in the README hero. Shortcut overhaul: Ctrl+N (new window — not overridable in Chrome / Firefox) and Ctrl+S (browser save-page dialog, surprising even when suppressed) are gone. New bindings: N add panel (single-letter, only outside text fields) Del delete focused panel Ctrl+Z undo (app-level only outside inputs; native text undo inside) Ctrl+Shift+Z redo, same input gating Alt+E export configuration as JSON ? show shortcuts dialog The handler short-circuits before single-letter keys reach typing contexts, so the bindings can never eat characters mid-edit. The shortcuts dialog and the README's shortcut table reflect the new map.
Header now hugs the preview area directly — the gap-2 between the title bar and the canvas was leftover from the old mac-style mockup and made the chrome look detached. Replaces the red/yellow/green dots with a Windows 11 title bar layout: left side shows a WT logo + the first panel's title styled as the active tab (accent underline), right side has minimize / maximize / close buttons. The close button picks up the canonical Windows close color (#e81123) on hover. All three controls are aria-hidden and removed from the tab order — pure visual mockup. The drag/right-click hint moved to small muted text in the title bar so it doesn't compete with the canvas content.
PaneNode adds a small uppercase badge in the top-right of each canvas pane showing the profile (PS / CMD / sh / WSL) tinted to roughly match each profile's brand color. PROFILE_BADGES is its own data file so the mapping stays separate from styling. Dialog open/close animations replace the inert fade classes. Custom keyframes live in index.css — overlay fades 150ms / 100ms, content fades + scales 96% → 100% with a soft-out cubic curve over 180ms, reverse on close. No tailwindcss-animate dependency added. Footer drops the "Source" link slot. Author link on the left now carries the inline GitHub mark; the right slot holds the version / license tag and now links to the repo, so the source URL is still one click away.
The badge used to be a tooltip-only number — opaque on a busy form. It's now a button that opens a Radix Popover grouping issues by panel: each entry shows the colored dot + panel title (clickable, jumps the inspector to that panel and closes the popover), then a nested list of field-tagged error / warning lines. Header strip shows the error / warning counts in their respective severity colors. The popover reuses the existing dialog-content animation keyframes for open / close. The "OK" clean-state pill is unchanged: still a static badge, no interaction needed.
New Tab type ({ id, name, panels }) sits above Panel. editorStore now
holds tabs[] + activeTabId; panel actions all operate on the active
tab's panels. zundo partializes to (tabs, activeTabId) — selectedId
stays out of history so opening a dialog doesn't trip undo.
New tab actions: addTab, deleteTab, renameTab, setActiveTab,
reorderTabs. addPanel takes an optional SplitDirection so the
context-menu's split-vertical/horizontal actions reuse the same path.
useActivePanels selector replaces the dozen useEditorStore(s => s.panels)
calls scattered across components, keeping the dependency direction
ui → store one-way.
Generators consume Tab[]: every tab opens with new-tab, subsequent
panels in the same tab use split-pane, tabs join via the same `;
separator. JSON output emits a newTab action per tab and a single
trailing moveFocus. Batch wraps the joined PowerShell command as
before.
Storage / share / file roundtrip migrated to v3:
- LS uses wt-gen-v2-config under SCHEMA_VERSION=3; loadConfig auto-
migrates v2 panels-only payloads into a single tab so existing
users keep their setup.
- Share URLs are v=3&p=base64url(compactTabs); v=2 panel-only links
still decode (read as one tab).
- Exported JSON now has { version: 3, tabs }; import accepts the v2
{ panels } shape and lifts it into a tab.
TabStrip sits between the topbar and canvas. Double-click renames a
tab inline; close button appears on hover (hidden when only one tab
remains). MAX_TABS = 8.
Bundle: 517KB / 165KB gzipped. Tests grow to 62/62 with new fixtures
helper (singleTab, tab) and multi-tab cases for both PowerShell and
JSON generators.
All three side regions now collapse to a slim chevron bar:
- Rail (260 → 32 px) — keeps the toggle accessible when closed
- Inspector (320 → 32 px) — same treatment, right side
- Output (280 → 36 px height) — title bar with the toggle stays
visible so the editor canvas can occupy almost the full pane
State lives in settingsStore (railCollapsed / inspectorCollapsed /
outputCollapsed) and persists alongside the other UI settings — the
user's last layout returns on reload.
Transitions on grid-template-columns and the output's height give a
short ease-out animation; collapsed children unmount to keep the dom
small. The collapse triggers themselves stay rendered so toggling
back open is always one click.
Right-click → Duplicate pane copies the source panel's title, directory, commands, color, and profile, then appends it to the active tab as a vertical split with the default 0.5 size. The new pane is auto-selected so the user can immediately tweak it. Disabled when the tab is already at the 6-pane cap. Lives between Split V/H and Delete in the context menu, separated by a divider so a stray click can't delete and duplicate together.
Double-click a pane's title in the canvas to edit it inline — Enter or blur commits, Esc cancels. The input absorbs its own click and keydown events so editing doesn't reselect the pane underneath or trigger single-letter shortcuts (N for new panel, ? for help) while the user is typing. Mirrors the rename UX already on TabStrip so both surfaces feel the same. The Inspector's title field still works in parallel for users who want to edit from the side panel.
←/→ select the previous / next pane in the active tab (wraps around at the ends). ↑/↓ switch to the previous / next tab. Only fires when no text field is focused, so arrow-key cursor movement inside inputs keeps working. Both navigations are no-ops when there's only one pane / one tab. Wrap-around uses ((idx + delta) % len + len) % len to handle negative results from the modulo when going past the first item. Shortcut dialog gains the two new rows so the help screen stays in sync with the actual bindings.
New "Run in WT" button on the PowerShell output tab. Clicking it copies the single-line command to the clipboard and opens a small dialog with the three-step Win+R → Ctrl+V → Enter walkthrough. Numbered steps with kbd-styled key chips so the instructions read naturally without needing screenshots. If the clipboard write fails (insecure context, permission denied), the dialog still opens but the success banner is omitted and the description nudges the user to copy manually.
Trigger + content both wire mouseenter / mouseleave to a small schedule-open / schedule-close timer (80ms open, 180ms close). The close delay lets the cursor traverse the gap from trigger to content without flickering the popover shut. Clicking still toggles, and keyboard focus / blur drive the same open / close path. Selecting a panel from the list now also forces the popover closed immediately so the inspector takes focus cleanly. The onOpenAutoFocus suppression keeps the focus on the trigger when the popover opens via hover, so the layout doesn't shift the user's context unexpectedly.
Absolute-positioned CollapseTab overlapped the InspectorPanel's
'Panel N' heading. Replaced with an inline chevron inside each side
panel's own header — PanelList puts it next to 'Panels (n/6)',
InspectorPanel puts it after the new-tab/split-pane label, so the
chrome flows with content instead of stacking on top of it.
When a side panel is collapsed AppShell renders a thin CollapsedStub:
a centered chevron in the narrow strip pointing back towards the
content area, so it's obvious which direction expanding will push.
InspectorPanel's empty-state ('No panel selected') keeps the collapse
button visible in its own header bar so the user can still toggle the
side panel without selecting one first.
Copy / Run buttons used to be absolutely positioned inside each
TabsContent and the code block tried to compensate with pt-12 — but
because the buttons rendered before the pre, the first lines of the
generated command still slid below them and the toolbar scrolled away
with the content.
The new layout:
- CodePane wraps each tab's code block, owns the scroll, and is the
positioning context for the toolbar.
- Toolbar uses sticky top-0 z-10 with pointer-events-none on the
sticky strip and pointer-events-auto on the inner button group,
so the buttons stay pinned to the top-right while the code
scrolls underneath them.
- Buttons sit on a translucent rounded surface with a small
backdrop blur so they remain readable over either light or dark
syntax themes.
- CodeBlock loses its scroll / pt-12 — it's now purely a presentation
component; pre background is transparent so the parent's theme
bg shows through.
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) to 6.4.2 and updates ancestor dependency [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). These dependencies need to be updated together. Updates `vite` from 5.4.21 to 6.4.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v6.4.2/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v6.4.2/packages/vite) Updates `vitest` from 2.1.9 to 4.1.7 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.7/packages/vitest) --- updated-dependencies: - dependency-name: vite dependency-version: 6.4.2 dependency-type: indirect - dependency-name: vitest dependency-version: 4.1.7 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps vite to 6.4.2 and updates ancestor dependency vitest. These dependencies need to be updated together.
Updates
vitefrom 5.4.21 to 6.4.2Release notes
Sourced from vite's releases.
Changelog
Sourced from vite's changelog.
... (truncated)
Commits
6b3fad0release: v6.4.2ca4da5dfix: avoid path traversal with optimize deps sourcemap handler (#22161)fe28e47fix: apply server.fs check to env transport (#22159) (#22163)5487f4frelease: v6.4.11114b5dfix(dev): trim trailing slash beforeserver.fs.denycheck (#20968) (#20969)f12697crelease: v6.4.0ca6455efeat: allow passing down resolved config to vite's createServer (#20932)0e173d8release: v6.3.7c59a222fix(esbuild): inject esbuild helpers correctly for esbuild 0.25.9+ (#20940)3f337c5release: v6.3.6Updates
vitestfrom 2.1.9 to 4.1.7Release notes
Sourced from vitest's releases.
... (truncated)
Commits
a09d472chore: release v4.1.7a8fd24cchore: release v4.1.618af98cfix(browser): simplify orchestrator otel carrier (#10285)3188260feat(browser): provide project reference inToMatchScreenshotResolvePath(#...e399846chore: release v4.1.57dc6d54Revert "fix: respect diff config options in soft assertions (#8696)"9787dedfix: respect diff config options in soft assertions (#8696)325463afix(ast-collect): recognize _vi_import prefix in static test discovery (#10...0e0ff41feat(coverage): istanbul to supportinstrumenteroption (#10119)663b99ffix: aliasagentreporter tominimal(#10157)Maintainer changes
This version was pushed to npm by GitHub Actions, a new releaser for vitest since your current version.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)You can disable automated security fix PRs for this repo from the Security Alerts page.