Perforce ends the ticket on its own schedule, so a long day outlives a login.
Every command then failed and the only way back was Exit + restart, which threw
away the scope, selection and open panels.
- p4.ts routes all ~110 commands through one invoke wrapper that recognises an
auth failure (isAuthError) and raises onAuthLost, so no call site can miss it.
p4_login / p4_restore / p4_clients are exempt: they report bad credentials
inline and would otherwise loop the prompt.
- The server poll no longer treats an expired ticket as an outage. The server
answered, it just refused us — the offline banner it used to raise never
cleared, since polling stayed refused forever.
- ReauthModal asks for the password over the running app, keeping all state,
and offers Sign out as the way back to the Connect screen.
The failed command is NOT retried automatically — re-auth then refresh only.
Replaying a half-finished submit or revert unattended is worse than asking.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ue bridge: Launch / Build now read live refs. They captured startBuild /
launchUE from the render where plugins loaded — before the async .uproject
and .sln detection had resolved — so both saw empty paths forever. hasProject
used the live ref, so the menu items showed up and then did nothing.
- Get Latest / Sync to revision: summarise `p4 sync` stdout (syncSummary)
instead of dumping every depot path into the toast. flash() caps length and
.toast caps height so no raw output can blow up the bubble again.
- Team Relay: use the real theme tokens — --txt / --add / --del, not
--text / --ok / --err, which don't exist and silently fell back to a
near-white hardcode, invisible on the light theme. Bumped to 1.0.1.
- Plugin dock panels get a status-bar button next to Terminal / Log; the tabs
were otherwise only reachable from the Actions menu.
- PLUGINS.md documents the theme token names.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Plugin catalog/install failed silently: the webview fetch() to Gitea raw is
blocked by CORS (no ACAO header). Route registry reads through a new Rust
command registry_http_get (host-restricted) — catalog + installs now work.
- Updater: removed the floating card that overlapped the Terminal/Log/Updates
buttons. Update state now shows as a single status-bar download icon (no text):
idle → download glyph, available → accent + dot, checking/downloading → spinner.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Official plugin registry hosted on Gitea; client fetches registry.json over
HTTPS and installs plugins via backend plugin_write_file.
- Auto-install autoInstall plugins on first connect; per-machine enabled state.
- Extract all Unreal tooling (Build Solution / Unreal Log) into a separate
"unreal" plugin (defaultEnabled) driven through the new host.ue bridge;
core UI no longer hard-wires Unreal.
- Settings → Plugins: "Official plugins" section with Install buttons.
- Status bar: "Updates" button (right of Log) triggers an update check without
restarting the client.
- Fixes: NEW badge hard-right/centered without shifting text; History commit
size no longer flickers (cached per change); giant icons in empty plugin/
People lists; Get Latest hover contrast.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Themes: built-in presets (Ember/Forest/Ocean/Rosé) + custom-theme editor
(per-token color pickers, live preview, JSON export/import). src/themes.ts.
- Plugin platform: JS/ESM plugins loaded via blob-module import (CSP
script-src blob:), Host SDK with menu / file-context / view / submit-hook
contribution points + permission model. Backend commands to list/read/enable/
install/remove plugins under <config>/plugins/. Example plugin + PLUGINS.md.
- Settings redesigned into a sectioned hub (General / Appearance / Plugins);
Themes and Plugins moved in, removed from the Actions menu.
- "NEW" badge on History commits submitted < 3h ago.
- Smooth tab transitions: sliding underline + content fade on Changes/History,
and matching fades on the view-panel and dock tab groups.
- Fix: settings close button used the default browser style.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Client:
- Commit: batch `p4 reopen` so huge changelists (63k+) no longer blow the
Windows command-line limit; live "N / total" progress + spinner during commit.
- Submit dialog: white arrow, "N of total" + % bar, running file log,
Cancel button (aborts pre-commit; changelist stays pending).
- Disk scan: streaming reconcile with a live "found N files" counter + Cancel.
- Thumbnails: only decode browser-renderable image formats; glyph fallback
(+ onError) instead of a broken-image icon for bmp/tga/dds/etc.
Landing + waitlist:
- waitlist-server: Express + SQLite email collector (dedup) with a secure
admin panel (scrypt auth, rate-limited login, signed cookies) and CSV export.
- landing form now POSTs signups to the waitlist API.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Tabbed view panel: File Viewer / File Tree / File Locks, header hidden at one tab, re-openable from Window, state persisted
- Right-click Workspace/Working-folder zones -> Show in File Tree (focuses the right side)
- Commit weight shown in History (p4 sizes -s //...@=CH)
- Rich code editor (highlighted underlay + gutter) and clean spec-editor surfaces (no more grey notepad)
- System tray (close-to-tray, tray menu Quit) + native OS notifications for teammate submits, even when hidden
- 'You're behind the server' banner + native notification (p4 sync -n), rechecked only when the server advances
- Audio & video preview with playback (media-src blob CSP); File Locks dockable into the view panel
- Backend: depot_ls/fs_ls, p4_change_sizes, p4_behind; tauri-plugin-notification + tray-icon
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Explicit Work Offline toggle (P4V-style): stops server polling, calm offline banner, persisted
- Reconcile Offline Work dialog: preview adds/edits/deletes with per-file checkboxes, opens picked into a changelist
- Make writable (offline edit) context action; backend p4_reconcile_preview/apply + p4_set_writable
- Tooltips (title) on every top-menu item, 5 languages
- Fix .ldr spinner rendering (inline-block + box-sizing) so it's a clean circle everywhere
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- File history button in the preview header opens a per-file revision timeline
(rev, changelist, action, user, date, description) with Diff to previous
- Backend p4 filelog -l; filelogRevs parser
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Tools -> Streams: list server streams, switch the workspace to a stream,
merge down from parent / copy up to parent (into a pending changelist)
- Backend p4 streams, client -s -S, merge/copy -S
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Tools -> Integrate / Merge / Copy: pick op + source/target paths, runs into a
new pending changelist; resolve (if needed) via the Resolve UI and submit
- Backend p4 merge/copy/integrate -c
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Tools -> Labels: list server labels, create/tag a label at current head,
one-click Sync workspace to a label (via Get Revision)
- Backend p4 labels, p4 tag -l
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Actions -> Get Revision... (enter CL number, label, or YYYY/MM/DD)
- History right-click -> Sync workspace to #N
- Backend p4 sync scope@rev with live transfer progress
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Tools -> Exclusive Locks (typemap): view/edit server typemap, one-click add
recommended binary+l rules for UE asset types (.uasset/.umap/.fbx/textures/etc)
- Per-file 'Set exclusive-lock type (+l)' in the Changes context menu
- Backend p4 typemap -o/-i and reopen -t
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Built-in code editor: edit working-copy source files in place (Edit → textarea
→ Save) before committing, no external IDE needed. Backend write_depot opens
the file for edit, clears read-only, writes UTF-8; confined to the client root.
- .uasset previews: pull the embedded Unreal thumbnail (PNG) server-side for both
working copy and history; on-demand real 3D via a headless Unreal FBX export
(commandlet mode, no editor window), temp file deleted right after — nothing
cached on disk. Plugin content paths mapped to their mount point.
- New app icon (brand mark on a theme tile) + theme-aware in-app logo.
- Connection pill / Settings show the actual connected server (P4PORT), not the
server's internal self-reported address.
- Fix: the "select all" checkbox no longer renders as a giant empty square when
not everything is selected (size pinned).
- IDE picker chooses which installed editor opens code; AI replies in UI language.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Security and robustness (backend):
- Strict CSP (was null); confine read_file/launch_file/ue_log to the client root
- p4 trust without -f: surface fingerprint CHANGES instead of auto-accepting (MITM)
- stdin=null by default + non-interactive P4EDITOR so terminal commands never hang
- 64 MB read caps on read_depot/read_file/print_depot (no OOM on huge .uasset/.pak)
- Recover from mutex poisoning instead of crashing every later p4 call
- Decode p4 output as UTF-8 then cp1251 (Cyrillic paths no longer corrupt)
- p4_changes never deletes changelists that hold shelved files
- Validate changelist number in p4_undo_change
Bug fixes (frontend):
- Focus-refresh preserves the checkbox selection (never re-checks deselected files)
- Staleness guards on refresh/describe/AI-summary/user-groups (no cross-selection races)
- Real F5/Ctrl+R/G/S/B handlers; match e.code so Ctrl+backquote works on RU layout
- Confirm dialog no longer fires on a stray global Enter
- Panel/dock/history drags end on window blur (no stuck resize)
- Commit draft clears on Submit only if unchanged since committing
- Summary/IDE buttons gated to real source files (not .pak/.dll/binaries)
New features:
- Exclusive lock/unlock plus held-by/locked-by indicators (p4 opened -a)
- Shelve/unshelve/delete-shelf on pending changelists
- Resolve UI (auto-merge / accept yours / accept theirs, per file or all) + banner
- Diff a history revision against the previous one; blame/annotate view
- Depot file search (Tools -> Search depot)
- Move opened files between pending changelists
- New-submit toasts from teammates + offline banner with auto-reconnect
Also: bake OpenRouter key at build time (git-ignored), drop AI settings UI,
IDE picker (detect installed editors), AI replies in the UI language,
persistent code summaries, metadata/CSP polish.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- History: GitHub-style split view of submitted changelists; preview file
contents at their exact revision (code/image/3D/uasset) via `p4 print`
- People & Roles modal: who works on the depot, activity indicators,
group/role assignment (p4 users / groups / group -i)
- AI commit summaries via OpenRouter (sparkle button); key/model in Settings
- Commit-message draft persists until Submit (not cleared on local commit)
- Resizable History file-list column (pointer-capture drag)
- Fix UI-scale leaving a gap at the bottom (compensate zoom in .win height)
- Author avatars on history rows; bump version to 0.2.2
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Build Solution now opens a configuration picker (Development Editor,
Development, DebugGame, Shipping) and passes /p:Configuration=<cfg>
/p:Platform=Win64 to MSBuild, which drives UnrealBuildTool for the chosen
config. Streams into the same minimizable build overlay.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Changes tab now shows committed-but-not-submitted changelists as cards
above the working set: expandable to their files (click to preview), each
with per-CL Submit, plus Edit description / Uncommit (reopen -c default) /
Discard in a ⋯ menu, and a Submit-all button. Backend adds p4_reopen_default
and p4_set_desc; a small text-prompt modal edits descriptions. Preview panel
now shows either the working selection or a clicked pending-CL file.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
find_sln locates a .sln in the working folder; build_sln locates MSBuild
via vswhere and builds the solution's default config (compiles the UE game
module for Unreal projects), streaming output as build-log events. A build
overlay shows the live log with error/warning coloring and a status. Wired
into Tools (Ctrl+B) and the Working-folder right-click menu when a .sln is
found. New strings translated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Code/text files get a VS Code action in the preview header; a backend
open_in_vscode command resolves the depot file to its local working copy
and launches `code <path>` via the shell.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Launch now goes through a backend launch_file command (shell `start`), so
it works for any path — fixes "Not allowed to open path" from the opener
plugin's scoped open-path.
- Removed the toolbar Launch-Unreal button; it's now a right-click item on the
Working folder ("Launch Unreal Engine"), shown only when a .uproject exists.
- Reload History after a successful Submit so the new changelist shows without
a manual F5.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the ugly native <select> on the connect screen with a themed
custom dropdown (Select component). Add a Launch-Unreal button that appears
when the chosen working folder contains a .uproject: backend find_uproject
resolves the scope to disk and searches it (and one level down); the button
opens the project via the opener plugin. Bundled the UE icon (currentColor,
so white-on-dark / black-on-light per theme). New strings translated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>