Commit graph

111 commits

Author SHA1 Message Date
delibae
51e038495f feat: version-free release filenames, inline updater UI (v1.0.3)
- Rename build artifacts to fixed names (ClaudePrism-macOS.dmg, etc.)
- Update latest.json URLs to use fixed filenames
- Update README download links to /releases/latest
- Inline update UI on home screen with version badge
- Gitignore Tauri gen/schemas
- Bump to v1.0.3

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 15:40:18 +09:00
delibae
2f3276a80e feat: inline update UI on home screen, gitignore gen/schemas (v1.0.2)
- Replace toast-based updater with inline version badge on home screen
- Show version + check/update/progress states directly in ProjectPicker
- Move Toaster to App level for workspace toast support
- Remove auto-generated Tauri schemas from git tracking
- Bump to v1.0.2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 15:26:21 +09:00
delibae
15b0a24103 fix: move Toaster to App level, add version display, set v1.0.1
Toaster was only in WorkspaceWithClaude so update toasts didn't show
on the home screen. Moved to App level. Also shows version on home.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 15:03:54 +09:00
delibae
4dfe6b1946 feat: show app version on home screen, bump to v1.0.2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 14:47:11 +09:00
delibae
ac47bf87fe fix: regenerate signing key with password, reference PASSWORD secret
Previous key generated with --ci had unusable password. Regenerated
with explicit password and updated pubkey + workflow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 14:08:26 +09:00
delibae
08e54f263d feat: add auto-updater and fix macOS black screen on focus loss (v1.0.1)
- Add tauri-plugin-updater with signed update artifacts
- Add backgroundThrottling: disabled to prevent WKWebView black screen
- Add update check UI with toast notifications (sonner)
- Update build scripts to generate latest.json for GitHub Releases
- Add multi-platform CI workflow (macOS/Linux/Windows) with draft releases
- Bump version to 1.0.1

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 13:16:39 +09:00
Hanjin Bae
a3a2282dd6
fix: adjust titlebar height for Windows overlay mode (#42)
Reduce from 32px to 12px — 32px was too much padding, pushing content
too far from the top edge.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 03:46:40 +09:00
Hanjin Bae
32397bb611
fix: show folder name only in sidebar on Windows (#41)
projectRoot.split("/") didn't handle Windows backslash paths, causing
the full path (C:\Users\...\project) to display in the sidebar header.
Now splits on both / and \ so only the folder name is shown.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 03:37:19 +09:00
Hanjin Bae
d32c732c36
fix: Windows titlebar, installer fixes, and responsive PDF toolbar (#40)
Changes missed from PR #37 squash merge:
- Set --titlebar-height to 32px on Windows (was 0px, content hidden
  behind native overlay titlebar)
- Add ExecutionPolicy Bypass to PowerShell installers (uv + Claude Code)
- Add ~/.local/bin/uv.exe to Windows uv binary search paths
- PDF toolbar: Export/History as icon-only buttons, Capture & Ask text
  hidden on narrow panels via container query

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 03:16:02 +09:00
Hanjin Bae
0b6fd62d0a
fix: move macOS icon setup to RunEvent::Ready to prevent SIGBUS (#38) (#39)
Setting the dock icon in setup() caused SIGBUS on first launch from
signed release binaries due to Gatekeeper App Translocation interfering
with ImageIO plugin initialization.

Moved set_macos_app_icon() to RunEvent::Ready, which fires after the
app is fully initialized — matching Tauri's own approach for dev icons.

Closes #38

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 03:12:30 +09:00
Hanjin Bae
ebcb190d7a
fix: detect missing Git for Windows and guide users to install it (#37)
Windows users without Git for Windows see "Install Claude Code" loop
because Claude Code requires git-bash but the app never checks for it.
Now check_claude_status reports missing_git on Windows, and the setup UI
shows a dedicated "Git for Windows Required" screen with a download link
and re-check button.

Also adds Windows-essential env vars to uv installer and improves the
CI workflow to support manual release_tag input.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 00:27:15 +09:00
delibae
4f07dcfcec fix: resolve Windows process spawn and CLI detection issues
- Add CREATE_NO_WINDOW flag to all child process spawns on Windows to
  prevent blank console windows from flashing (claude.rs: 4 sites,
  uv.rs: 5 sites)
- Fix claude.exe detection: native installer path check now uses .exe
  extension on Windows (~/.local/bin/claude.exe)
- Fix PATH separator in install_claude_cli: use ";" on Windows instead
  of hardcoded ":"
- Add strip_ansi() to filter terminal escape sequences ([?2026h] etc.)
  from install/login output streamed to the frontend UI
- Fix slash_commands.rs path splitting to handle Windows backslashes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 21:55:37 +09:00
delibae
6cafe39baf fix: standardize default file name to main.tex across the application 2026-03-14 21:12:23 +09:00
delibae
1068869a45 feat: enhance editor CLI resolution on macOS and improve file creation logic 2026-03-14 18:36:13 +09:00
delibae
653c4994f9 fix: use pkg-config instead of vcpkg for tectonic dependencies on Linux
vcpkg root was not available, causing build failures for freetype2,
graphite2, and ICU. System pkg-config resolves these reliably.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:43:06 +09:00
delibae
7daeb97486 Remove TypeScript build info file and add Linux build script for ClaudePrism 2026-03-14 17:33:33 +09:00
delibae
c8f7741d80 chore: remove covector, simplify release to manual tag-based flow
- Remove covector and .changes/ directory
- Remove covector workflow, keep only build-desktop.yml
- Replace custom changelog with GitHub auto-generated release notes
- Move Homebrew cask management to delibae/homebrew-claude-prism tap repo
- Remove in-repo homebrew/ directory
- Bump version to 1.0.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 02:00:38 +09:00
delibae
792b6dc58f fix: address Copilot review — update comments and add binary extension tests
- Update IGNORED_EXTENSIONS comment from "LaTeX build artifacts" to reflect
  that it now includes general non-editable/binary files
- Update getFileType comment to match the broader scope of ignored extensions
- Add test coverage for representative binary extensions (.docx, .xlsx, .hwp,
  .accdb, .zip, .exe, .mp3, .mp4, .psd, .sqlite, .dll, .pptx)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:08:42 +09:00
GunwoongP
13f32a2437 fix: exclude binary file types from project file tree
Add 40+ binary extensions (.hwp, .docx, .xlsx, .accdb, .zip, .exe,
media files, etc.) to IGNORED_EXTENSIONS so they are filtered out
during directory scanning. These files cannot be meaningfully edited
in the text editor and would only cause unnecessary I/O and memory
usage when present in a project folder.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:45:46 +09:00
Minsoo Kim
dc306eaebe fix: resolve merge conflicts, prevent recompile recursion, and improve test isolation
- Resolve git merge conflict markers in latex-editor.tsx compileRef
- Use setTimeout for pending recompile to prevent unbounded call stack recursion
- Add clearPdfBytesCache() in test beforeEach for proper test isolation
- Use existing `state` variable instead of redundant getState() calls
- Log when strip_nul actually strips nul bytes for diagnostics

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:14:06 +09:00
Minsoo Kim
2459067e77 fix: resolve PDF white-screen crash, nul-byte spawn error, and dropped recompiles
Three interconnected issues caused degraded UX:

1. **White-screen crash**: Large PDF `Uint8Array` buffers (often 5-20MB) stored
   directly in Zustand state caused React to diff them on every render. This
   triggered excessive memory pressure and eventual WebView white-screen crashes,
   especially with multi-root projects keeping a `pdfCache` Map in state.

2. **"nul byte found in provided data" spawn error**: Clipboard artifacts or
   encoding issues could introduce interior nul bytes into Claude CLI arguments,
   causing `Command::spawn()` to fail on macOS/Linux (which use C strings
   internally).

3. **Silently dropped recompiles**: When a compile was requested while another
   was already running (`isCompiling === true`), the request was silently
   discarded. This meant edits made during compilation never triggered a
   follow-up compile.

- Replaced `pdfData: Uint8Array | null` and `pdfCache: Map<string, Uint8Array>`
  in Zustand with an external module-level `_pdfBytesCache` Map.
- Added a `pdfRevision` counter in state that increments whenever PDF bytes
  change, triggering React re-renders without diffing the actual buffer.
- Exposed `getPdfBytes()`, `getCurrentPdfBytes()`, `hasPdfData()`, and
  `clearPdfBytesCache()` as direct accessors for components.
- Added `migratePdfBytesKey()` helper to deduplicate cache re-keying logic
  used by `renameFile` and `moveFile`.
- Conditional `pdfRevision` bumping in `setActiveFile` — only bumps when the
  PDF root actually changes, avoiding unnecessary re-renders on tab switches
  within the same root.
- `setPdfData(null)` no longer copies `compileErrorCache`/`lastCompiledGenerations`
  Maps since it doesn't need to modify them.

- Added `strip_nul()` using `Cow<str>` for zero-allocation fast path when no
  nul bytes are present (the common case).
- Applied to program, args, cwd, and inherited PATH in `create_command()`.
- Added structured error logging on spawn failure with tab ID for debugging.

- Added `pendingRecompile` boolean to document store.
- When `isCompiling` is true and a compile is requested, sets
  `pendingRecompile = true` instead of silently returning.
- After compilation finishes (in `finally` block), checks `pendingRecompile`
  and triggers a follow-up compile if queued.
- Applied consistently in latex-editor, pdf-preview, and use-claude-events.

- Added `js_log` IPC command for frontend → stderr logging that survives
  white-screen crashes.
- Added PDF size logging in `compile_latex` for monitoring.

- Updated test state shape (`pdfRevision` instead of `pdfData`, added
  `pendingRecompile`).
- Fixed `setActiveFile` test: cursor position is preserved (editor manages
  per-file cursor cache), not reset to 0.
- Updated `setPdfData` test to use `getCurrentPdfBytes()` accessor.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 02:53:24 +09:00
delibae
4b07d7443b fix: address Copilot review — optimize stat calls and support large image preview
Only call stat() for image/other file types during project scan to avoid
unnecessary I/O overhead on tex/bib/style/pdf files. Use convertFileSrc
(asset URL) as fallback in ImagePreview when dataUrl is not available,
so large images are viewable without loading them entirely into memory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 01:31:46 +09:00
Hanjin Bae
4a95160984
Update apps/desktop/src/components/workspace/editor/latex-editor.tsx
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-11 01:20:41 +09:00
Hanjin Bae
e37afc5a2a
Update apps/desktop/src/lib/latex-compiler.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-11 01:20:10 +09:00
GunwoongP
c0c7b23ebc fix: resolve Windows Claude CLI .cmd wrapper to node for reliable spawning
On Windows, claude.cmd is an npm wrapper that breaks when arguments
contain special characters (quotes, &, |, etc.) because cmd.exe
interprets them. Instead, resolve the .cmd to the underlying
node_modules/@anthropic-ai/claude-code/cli.js and invoke node directly.
This fixes "batch file arguments are invalid" errors on Windows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:54:54 +09:00
GunwoongP
8340d9e29d feat: lazy-load large files to prevent editor slowdown
Skip auto-loading files > 1 MB during project open. Large non-essential
files (e.g., .jsonl training data) show a VS Code-style "Open Anyway"
prompt instead of being read into memory immediately.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:54:54 +09:00
Gunwoong Park
7f16944725
Merge branch 'delibae:main' into fix/missing-tex-file-error-handling 2026-03-10 23:47:44 +09:00
GunwoongP
dcb20b779e fix: handle missing .tex file gracefully instead of hardcoded fallback
resolveCompileTarget now returns null when no .tex file exists in the
project, instead of falling back to a hardcoded "document.tex" path.
All 4 call sites (editor, pdf-preview, claude-events) check for null
and show a descriptive error. Rust backend also validates file existence
before attempting Tectonic compilation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:12:22 +09:00
delibae
56c0cec531 chore: bump version to 0.5.4 and enhance error handling across multiple modules 2026-03-10 23:11:19 +09:00
Minsoo Kim
0d59255edb feat: add PDF page navigation, folder deletion, and dirty file indicator
- Add Page Up/Down buttons and editable page indicator to PDF preview toolbar
- Track current visible page via scroll with rAF throttling
- Implement proper recursive folder deletion in sidebar and document store
- Replace text asterisk with blue dot indicator for modified files in sidebar
- Extract shared scrollToPage helper to deduplicate scroll math in pdf-viewer

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 22:08:58 +09:00
delibae
4803561aa2 feat: embed Zotero credentials at compile time and bump to v0.5.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 22:05:46 +09:00
delibae
5111dff588 feat: enhance Zotero credential handling with dotenvy support 2026-03-10 21:59:51 +09:00
delibae
e033c36678 chore: version bump 2026-03-10 12:27:44 +00:00
Hanjin Bae
2cc4e2b3f9
Merge pull request #14 from delibae/covector/version-bump
chore: version bump
2026-03-10 21:24:43 +09:00
Hanjin Bae
cbecd38570
Merge pull request #15 from vv137/feat/pdf-loading-perf
feat: optimize PDF loading and file switch UX
2026-03-10 21:24:33 +09:00
delibae
9a9fffc25a chore: version bump 2026-03-10 12:22:43 +00:00
delibae
1be93229da fix: fix postversion script newline and repair tauri.conf.json 2026-03-10 21:22:13 +09:00
Minsoo Kim
3cea905569 refactor: replace custom ErrorBoundary with react-error-boundary
Remove duplicated error-boundary.tsx in favor of upstream's
react-error-boundary library already in package.json.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:21:51 +09:00
Minsoo Kim
2e083a3a19 feat: keep-alive PDF viewers and per-file state preservation on switch
Keep PdfViewer instances mounted (visibility:hidden) instead of
unmounting on file switch, so canvas/scroll state is preserved
instantly. Also cache editor cursor+scroll and PDF zoom per file.

- Keep-alive up to 5 PdfViewer instances with LRU eviction
- Save/restore scrollTop via isActive prop on visibility toggle
- Per-file editor cursor + scroll cache (editorStateCache)
- Per-root PDF zoom + fitMode cache (zoomCache)
- Gate IntersectionObserver on isActive to avoid work for hidden viewers
- Extract scrollToPageEl helper to deduplicate scroll-retry logic
- Deduplicate getOrOpenDocument to reuse getCachedDocument
- Clear all caches on project close

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:20:19 +09:00
Minsoo Kim
2a315f5bf7 fix: address review findings and fix structured clone error
- Fix non-reactive getState() in render path → use activeFile?.id
- Replace linear cache scan with cache.get() O(1) lookup
- Remove redundant fingerprint field from CachedDoc
- Parallelize clearDocCache() with Promise.all
- Revert buffer.slice() optimization — always copy to avoid structured
  clone errors from non-transferable Tauri buffers and prevent pdfCache
  corruption from ArrayBuffer detachment
- Add clearScrollPositionCache() on project close to prevent memory leak

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:20:19 +09:00
Minsoo Kim
84b8f2339a feat: optimize PDF loading with LRU doc cache, scroll caching, and eager import
- Add PDF document LRU cache (max 5 open docs) with fingerprint-based identity check
- Skip MuPDF close/reopen cycle when switching to already-cached PDF
- Remove lazy() import for PdfViewer to eliminate Suspense flash
- Cache scroll position per root file and restore on file switch
- Clear doc cache on project close

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:20:19 +09:00
Minsoo Kim
5f4c446e8e fix: add error boundaries and stability improvements to prevent white screen crashes
- Add global ErrorBoundary with error details UI (stack trace, copy button)
- Wrap PdfViewer Suspense with ErrorBoundary for graceful PDF crash recovery
- Add 30s timeout to MuPDF worker calls to prevent infinite hangs
- Add unhandled promise rejection handler in main.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:19:52 +09:00
delibae
fa5f14f557 chore: version bump 2026-03-10 12:11:01 +00:00
delibae
678b8d3a7a fix: add missing newline at end of tauri.conf.json 2026-03-10 20:53:17 +09:00
delibae
f0a4d0e2f2 chore: version bump 2026-03-10 11:49:40 +00:00
delibae
cd794ca954 chore: version bump 2026-03-10 11:43:27 +00:00
delibae
e0986f060e feat: add aria-labels for accessibility improvements in various components 2026-03-10 20:31:58 +09:00
delibae
bd18e75f3c fix: improve error handling in various components and ensure root element exists 2026-03-10 20:27:00 +09:00
delibae
cad77ba71b feat: add ErrorBoundary with fallback component for better error handling 2026-03-10 20:17:35 +09:00
Hanjin Bae
9e89bd8f31
Merge pull request #9 from vv137/fix/multi-tex-compile
feat: multi-tex compilation with per-root PDF caching
2026-03-10 16:29:16 +09:00