Commit graph

127 commits

Author SHA1 Message Date
delibae
90d351bca9 chore: bump version to 1.0.6
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 01:13:07 +09:00
delibae
a10afacd6c fix: improve Linux AppImage compatibility and login reliability
- Add sanitize_appimage_env() to restore original LD_LIBRARY_PATH/PATH
  when spawning child processes from AppImage (fixes xdg-open, curl)
- Pass DISPLAY, WAYLAND_DISPLAY, XDG_*, DBUS_SESSION_BUS_ADDRESS to
  child processes for Linux desktop integration
- Add stdin(Stdio::null()) to install_claude_cli to prevent interactive
  prompt hangs
- Add 120s timeout to login_claude to prevent indefinite hang when
  browser fails to open
- Show "Setup Guide" link to code.claude.com/docs/quickstart on login
  failure
- Keep releases as draft in CI workflow for manual publish

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 01:11:02 +09:00
delibae
95c4072ec1 chore: fix all lint and formatting issues (biome check)
- Fix unused imports and variables
- Apply biome formatting (template literals, semicolons, line width)
- Fix a11y issues (label associations, anchor content)
- Fix Node.js import protocol (node:fs, node:path)
- Use self.onmessage in web worker

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 17:04:36 +09:00
Minsoo Kim
ea04d34bb4
Merge pull request #63 from delibae/feat/debug-and-black-screen-fix
fix: black screen on app switch + debug infrastructure
2026-03-16 16:47:20 +09:00
delibae
2480715f22 fix: macOS WKWebView black screen on focus restore & bump v1.0.5
- Add dual workaround for WKWebView failing to repaint after returning
  from background (1px resize nudge + DOM reflow)
- Use version-free download links in landing page
- Resolve app version dynamically from Tauri in sidebar
- Bump version to 1.0.5

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 16:40:10 +09:00
Minsoo Kim
585c631a86 fix: debug window log sync, auto-scroll, and IPC efficiency
- Fix echo loop: only debug window listens for debug-log-entry events
- Gate emit on _debugWindowConnected flag (no IPC when debug window closed)
- Simplify bulk sync: replace buffer on open instead of timestamp dedup
- Auto-scroll: use instant behavior, only scroll when already at bottom
- Fix systemInfo useEffect to run once ([] deps instead of [systemInfo])
2026-03-16 16:31:54 +09:00
Minsoo Kim
363b8c3482 refactor: separate debug window, cross-window log sync, simplify
- Debug panel is now a separate Tauri window (survives main window
  black screen) opened via Cmd+Shift+D or open_debug_window command
- Cross-window log bridging via Tauri events: main window emits
  entries, debug window receives them + bulk sync on open
- Log store uses mutable ring buffer + version counter instead of
  array spread per log; caches localStorage debug flag
- Debounce app-visibility-restored (200ms) to coalesce duplicate
  visibilitychange + Tauri Focused events
- Single getImageData(2x2) call in isCanvasBlank instead of 3x 1x1
- Extract shared getGpuRenderer (cached), SystemInfo type,
  getVisibilityLogs into log-store.ts
- Event name constants (APP_VISIBILITY_RESTORED)
- Remove debug UI from error-fallback.tsx and App.tsx
- Fix misplaced import in document-store.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 16:31:54 +09:00
Minsoo Kim
cc5011b98a feat: add structured logging, debug panel, and bug report generation
Add comprehensive debugging infrastructure:

- Structured log store (Zustand ring buffer, 2000 entries) with
  level/source filtering and auto-forwarding warn/error to Rust stderr
- createLogger() factory replacing ad-hoc console.log("[prefix]") calls
  across 16 files (claude-event, pdf-viewer, mupdf, sidebar, etc.)
- Debug panel UI (Cmd+Shift+D) with Logs/System/Visibility tabs
- Bug report generator collecting logs, system info, GPU renderer,
  and visibility events into copyable JSON
- "Copy Debug Info" button on error fallback screen
- get_system_info Tauri command for OS/arch/version data
2026-03-16 16:31:53 +09:00
Minsoo Kim
db97ea59ad fix: resolve black screen on app switch (macOS M1)
Add visibility/focus recovery to prevent black screen when returning
from another app. When macOS reclaims GPU/WebView resources during app
switching, canvas contexts are silently invalidated. This adds:

- visibilitychange + Tauri Focused event listeners in main.tsx
- Canvas blank detection and auto-re-render in mupdf-page.tsx
- IntersectionObserver reconnection via focusGen in pdf-viewer.tsx
- MuPDF worker error recovery and resetMupdfClient() in mupdf-client.ts
- Cmd+Shift+D debug panel keyboard shortcut
2026-03-16 16:31:53 +09:00
delibae
3d329af3a6 chore: bump version to v1.0.4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 16:13:10 +09:00
delibae
b6b7085db3 fix: resolve all platform-specific Rust warnings
- lib.rs: #[allow(unused_mut)] on builder (mut only needed on macOS)
- claude.rs: move CommandExt import to module level with #[cfg(windows)]
- claude.rs: #[allow(unused_variables)] on home (used only on Unix)
- claude.rs: add #[cfg(not(windows))] to Unix-only dir helper functions
- uv.rs: move CommandExt import to module level with #[cfg(windows)]
- skills.rs: fix unreachable Ok(()) after #[cfg] return branches

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 16:11:55 +09:00
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
9fd32ffbc7
docs: correct privacy claims in READMEs (closes #43) (#46)
- Remove "your files stay on your machine" unqualified claim
- Intro: "local-first alternative" with explicit API transmission caveat
- Section "Your Research, Your Machine" → "Data & Privacy"
- Bold disclaimer: prompts + file contents sent to Anthropic API
- Remove (cloud)/(local CLI) from AI Model row
- Remove "private" from tagline
- Update landing submodule with matching fixes
- Sync all languages (en, ko, ja, zh-CN)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 12:21:59 +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