- Refactor: extract shared find_git_bash() function used by both
create_command and check_claude_status (eliminates code duplication)
- Validate user-specified CLAUDE_CODE_GIT_BASH_PATH exists before using it,
falling back to auto-detection if the path is invalid
- Check existing error state before setting stderr errors to avoid
masking more specific earlier errors
- Make zero-output error message platform-aware (git-bash hint only on Windows)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The env var cleanup logic was stripping CLAUDE_CODE_GIT_BASH_PATH along
with other CLAUDE_CODE_* vars, causing Claude Code to fail even when the
user had explicitly set it. This also adds auto-detection of git-bash
from common install paths and git.exe on PATH.
Additionally, surface git-bash related stderr errors to the UI and show
a clear error message when the process fails with zero output.
Closes#109
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The separate debug webview failed in dev mode due to CORS preflight
blocking Tauri IPC calls, resulting in a blank window (#109 reporter
also experienced this).
Replace it with a bottom panel overlay in the main window:
- Same webview = no IPC issues, direct access to log buffer
- Toggle with Ctrl+Shift+D (same shortcut)
- Lazy-loaded DebugPage component
- Click backdrop or press shortcut again to close
- Revert log-store.ts cross-window emitTo back to emit
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Expand %USERPROFILE% etc. via ExpandEnvironmentStringsW when reading
registry PATH entries
- Use is_file() instead of exists() for binary detection
- Fix debug window showing blank: use emitTo() for cross-window events
instead of emit() which only targets the current window
- Update step numbering and doc comments
- Improve error message to avoid double-wrapping
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GUI apps inherit a stale PATH from login time, so if Claude was
installed afterwards it won't be found by which::which(). Read the
real User + System PATH from the Windows registry (HKCU/HKLM) and
search for claude.exe / claude.cmd there.
Also adds fallback paths for Volta, Scoop, pnpm global, and standard
Node.js installs, and replaces the bare "claude" fallback with a
proper error.
Addresses #109
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
resolveTexRoot now detects \documentclass to find the actual root file
instead of treating the active sub-file as the compilation target.
This fixes incorrect PDF preview when editing non-main .tex files.
Closes#106
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Windows (#101): Add explicit FS scopes to each permission in
default.json so Tauri's scope validator accepts Windows paths.
Remove silent .catch(() => {}) on mkdir/writeTextFile so errors
surface via toast instead of failing silently. Replace all
.split("/").pop() with .split(/[/\\]/).pop() (14 occurrences)
for correct path parsing on Windows.
Linux (#100): Add ELF linker version script (symbols.map) that
hides statically linked ICU/HarfBuzz/FreeType/Fontconfig/Graphite2
symbols from the dynamic symbol table. This prevents symbol
collisions with WebKit2GTK's own dynamic copies of these libraries,
which caused a segfault at startup. The static linking introduced
in v1.0.10 to fix#91 is preserved—ICU remains embedded in the
binary so it works across distros.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tectonic's limited package support makes it unusable for academic work
with custom .sty/.cls files. This adds opt-in support for shelling out
to a locally installed TeXLive distribution.
Backend (latex.rs):
- compile_with_texlive(): multi-pass compilation (2-3 engine passes +
optional bibtex/biber), with xdvipdfmx fallback for .xdv → .pdf
- find_texlive_binary(): resolves binaries via PATH, standard install
locations, and macOS login-shell fallback for GUI apps
- detect_bib_tool(): scans .tex for biblatex/bibliography to choose
biber vs bibtex
- texlive_env_path(): injects TeXLive bin dir into subprocess PATH so
xelatex can find xdvipdfmx internally
- detect_texlive Tauri command: reports available engines and version
- compile_latex gains use_texlive parameter; error messages show which
backend ran (e.g. "Compilation failed (TeXLive/xelatex)")
- All paths passed to TeX are relative to avoid tilde expansion in
iCloud paths (com~apple~CloudDocs)
Frontend:
- New settings-store.ts with persisted compilerBackend preference
- Backend selector dropdown in PDF preview toolbar
- All compile call sites pass the setting through to the backend
- detectTexlive() and TexliveStatus for engine availability checks
Tectonic remains the default. TeXLive is opt-in via the toolbar
dropdown. All existing tests pass (152/152).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On macOS 12 (Monterey), the app launches but no main window appears.
The root cause is WebKit bug #242740: Safari 15's WKWebView has a race
condition with top-level await in ES modules, causing silent JS failure
that prevents `getCurrentWindow().show()` from ever being called.
Three complementary fixes:
1. Change Vite build target from `esnext` to `safari14` (Tauri recommended)
and add `vite-plugin-top-level-await` to transform TLA into compatible
Promise chains, avoiding the WebKit bug entirely.
2. Replace top-level `await import("./App")` in main.tsx with a `.then()`
chain, removing TLA dependency at the source level.
3. Add a Rust-side 8-second timeout safety net in `setup()` that
force-shows the main window if the frontend JS fails to do so,
preventing permanently hidden windows regardless of the failure cause.
Closes#95
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three related environment issues are addressed:
1. Linux ICU version mismatch (#91):
The Linux build used pkg-config to dynamically link against the host's
ICU (libicuuc.so.70 on Ubuntu 22.04). Users on newer distros (e.g.
Ubuntu 25.10 with ICU 76) get "cannot open shared object" errors.
Switch to vcpkg static linking, mirroring the macOS fix (commit 9566956).
2. MCP servers fail on macOS GUI app (#87):
macOS GUI apps inherit a minimal PATH (/usr/bin:/bin) that lacks
/opt/homebrew/bin, so MCP server commands like `uv` silently fail.
Prepend common tool directories (~/.local/bin, ~/.cargo/bin,
/opt/homebrew/bin, NVM paths, etc.) to the child process PATH in
create_command().
3. Existing NVM-installed Claude Code ignored (#90):
find_claude_binary() relied on `which` which fails in GUI apps without
NVM in PATH. Add NVM_BIN env var check and login shell fallback
(`$SHELL -l -c "which claude"`) to discover claude through the user's
actual shell configuration.
Closes#87, closes#90, closes#91
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract shared is_essential_env_var() with case-insensitive matching
- Replace duplicated inline env var lists in install_claude_cli, login_claude, and install_uv
- Add 16 Windows-essential env vars (USERPROFILE, APPDATA, SYSTEMROOT, etc.)
- Use eq_ignore_ascii_case for PATH checks
Without these variables, PowerShell/npm cannot function correctly,
causing the "Installing CLI" step to fail on Windows.
Closes#88
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
vcpkg ports (gperf, fontconfig) need autoconf/automake/libtool to
build from source. These are compile-time tools only — they don't
create runtime dylib dependencies.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>