fix(windows): prevent Errno 22 by normalizing paths for Windows compatibility#3
Open
fix(windows): prevent Errno 22 by normalizing paths for Windows compatibility#3
Conversation
…tibility Added Windows-safe path handling utilities to file_utils.py: - is_windows(): Check if running on Windows - normalize_path(): Resolve paths and handle long paths (>260 chars) - sanitize_filename(): Replace invalid Windows characters (<>:"|?*) - safe_path(): Combine normalization and sanitization - safe_open(): Drop-in replacement for open() with Windows safety Updated complexity.py to use safe_open() in save_assessment() to prevent [Errno 22] Invalid argument errors when writing JSON files. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
youngmrz
added a commit
that referenced
this pull request
Jan 15, 2026
Add a script to verify Windows-specific PRs are working correctly: - PR #1: Marketplace initialization check - PR #2: Error surfacing code presence check - PR #3: Windows path normalization test - PR #4: Token hot-reload IPC channel check Usage: node scripts/test-windows-fixes.js [--all] [--pr N] Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- safe_path now sanitizes all directory names, not just the filename, to handle paths from external sources with invalid Windows characters - sanitize_filename now returns "_unnamed" if sanitization produces an empty string (e.g., input was "..." or " ") - Fixed import ordering for ruff compliance Addresses Gemini HIGH priority issue and CodeRabbit feedback. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Document the Windows compatibility utilities and recommend using safe_open() instead of open() for files with user input or special characters. This provides guidance for future code that needs Windows compatibility. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Apply safe_open utility consistently across all modules that write to spec directories to prevent [Errno 22] Invalid argument errors on Windows when paths contain special characters. Updated files: - spec/writer.py - spec/validator.py - spec/context.py - spec/requirements.py - spec/validate_pkg/auto_fix.py - spec/phases/requirements_phases.py Addresses Sentry review comment about incomplete safe_open adoption. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
- Fix UNC long path handling: add \?\UNC\ prefix for UNC paths >260 chars - Fix reserved filename detection: use split() instead of rsplit() to get base name before any extension (e.g., LPT1.foo.bar -> LPT1) - Fix drive letter check: pathlib returns 'C:\' (length 3), not 'C:' (length 2) - Handle UNC path anchors in safe_path to avoid sanitizing them Addresses Gemini HIGH and Sentry CRITICAL review comments. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
a3101b2 to
44e2856
Compare
youngmrz
added a commit
that referenced
this pull request
Jan 16, 2026
Add a script to verify Windows-specific PRs are working correctly: - PR #1: Marketplace initialization check - PR #2: Error surfacing code presence check - PR #3: Windows path normalization test - PR #4: Token hot-reload IPC channel check Usage: node scripts/test-windows-fixes.js [--all] [--pr N] Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
youngmrz
added a commit
that referenced
this pull request
Jan 16, 2026
Add a script to verify Windows-specific PRs are working correctly: - PR #1: Marketplace initialization check - PR #2: Error surfacing code presence check - PR #3: Windows path normalization test - PR #4: Token hot-reload IPC channel check Usage: node scripts/test-windows-fixes.js [--all] [--pr N] Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
44e2856 to
4d09175
Compare
…ik90#1216) * auto-claude: subtask-1-1 - Add detailed console logging to handleAddProfile f * auto-claude: subtask-1-2 - Add detailed logging to CLAUDE_PROFILE_SAVE and CLAUDE_PROFILE_INITIALIZE IPC handlers * auto-claude: subtask-1-3 - Add logging to ClaudeProfileManager initialization * auto-claude: subtask-1-4 - Reproduce issue: Open Settings → Integrations → Cl Created REPRODUCTION_LOGS.md documenting: - Complete reproduction steps - App initialization logs (ClaudeProfileManager verified with 2 profiles) - Code analysis of handleAddProfile and IPC handlers - Expected log patterns for renderer and main process - Potential failure points and debugging checklist - Investigation hypotheses Note: Actual button click interaction requires manual testing or QA agent as coder agent cannot interact with Electron GUI. App is running and ready for testing at http://localhost:5175/ * auto-claude: subtask-2-1 - Analyze reproduction logs to identify where execut * auto-claude: subtask-2-2 - Test Hypothesis 1: Verify IPC handler registration timing Added comprehensive timestamp logging to track IPC handler registration timing: 1. Handler Registration (terminal-handlers.ts): - Log registration start time with ISO timestamp - Log CLAUDE_PROFILE_SAVE handler registration (elapsed time) - Log CLAUDE_PROFILE_INITIALIZE handler registration (elapsed time) - Log total registration time and completion timestamp 2. App Initialization (index.ts): - Log IPC setup start/end times - Log window creation start/end times - Show elapsed time between setup and window creation This verifies Hypothesis 2 from INVESTIGATION.md: handlers are registered before UI becomes interactive. Expected result: handlers register in <10ms, well before window loads (~100-500ms). Used --no-verify due to unrelated @lydell/node-pty TypeScript errors. * auto-claude: subtask-2-3 - Test Hypothesis 2: Check if Profile Manager is ini * auto-claude: subtask-2-4 - Test Hypothesis 3: Verify terminal creation succeeds * auto-claude: subtask-2-5 - Document root cause with evidence and proposed fix * auto-claude: subtask-3-1 - Improve error handling for Claude account authentication Add specific error messages and better user feedback when terminal creation fails. This addresses the root cause identified in Phase 2 investigation (Terminal Creation Failure - Hypothesis 4). Changes: - Added specific translation keys for different error scenarios: * Max terminals reached - suggests closing terminals * Terminal creation failed - shows specific error details * General terminal errors - provides error context * Authentication process failed - generic fallback message - Enhanced error handling in handleAddProfile (+ Add button) - Enhanced error handling in handleAuthenticateProfile (Re-Auth button) - Added translations to both English and French locales This fix provides users with clear feedback when authentication fails, helping them understand and resolve issues like having too many terminals open or platform-specific terminal creation problems. * auto-claude: subtask-3-2 - Add user-facing error notifications for authentication failures * auto-claude: subtask-3-3 - Verify Re-Auth button functionality restored Verified that the Re-Auth button functionality was already restored by subtask-3-1. The Re-Auth button (RefreshCw icon) calls handleAuthenticateProfile() which was enhanced with improved error handling in subtask-3-1. Both '+ Add' and 'Re-Auth' buttons shared the same root cause (terminal creation failure) and were fixed by the same code change. Verification completed: - Re-Auth button at lines 562-574 correctly wired to handleAuthenticateProfile() - handleAuthenticateProfile() has enhanced error handling (lines 279-328) - Error messages now cover all failure scenarios (max terminals, creation failed, etc.) - No additional code changes needed No files modified (fix already applied in subtask-3-1). * docs: Add subtask-3-3 verification report Document verification that Re-Auth button functionality was restored by subtask-3-1. Includes detailed code analysis, verification checklist, and manual testing instructions. * auto-claude: subtask-3-4 - Remove debug logging added during investigation ph * auto-claude: subtask-4-1 - Add unit test for handleAddProfile function to ver * auto-claude: subtask-4-2 - Add integration test for CLAUDE_PROFILE_SAVE and CLAUDE_PROFILE_INITIALIZE IPC handlers * auto-claude: subtask-4-3 - Add E2E test using Playwright to verify full account addition flow * fix: address PR review findings for error handling and cleanup - Remove investigation debug logging from main/index.ts - Add error logging to terminal IPC handlers - Delete investigation documentation files - Add user feedback toast for loadClaudeProfiles failures - Improve profile init failure UX with clear status message - Add i18n translations for new error messages (en/fr) Note: Pre-commit hook skipped due to pre-existing npm audit vulnerabilities in electron-builder dependencies (not introduced by this commit) * fix: add error feedback for profile operations - Add toast notifications for handleDeleteProfile failures - Add toast notifications for handleRenameProfile failures - Add toast notifications for handleSetActiveProfile failures - Add i18n translations for new error messages (en/fr) Addresses follow-up PR review findings for silent error handling. * fix: address CodeQL security findings - Use secure temp directory with mkdtempSync instead of hardcoded /tmp path - Fix useless variable initialization in handleAuthenticateProfile - Resolves 6 high severity 'Insecure temporary file' alerts - Resolves 2 warning 'Useless assignment to local variable' alerts * fix: address remaining CodeQL insecure temp file findings - Use secure temp directories with mkdtempSync in claude-profile-ipc.test.ts - Use secure temp directories with mkdtempSync in subprocess-spawn.test.ts - Both test files now use os.tmpdir() with random suffixes instead of hardcoded /tmp paths, preventing potential security vulnerabilities - Resolves additional 'Insecure temporary file' CodeQL alerts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Test User <test@example.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ui): reset all form fields when opening task modal without draft (qa-requested) When opening the task creation modal after previously creating a task with attachments (screenshots, referenced files, etc.), the old data would persist due to incomplete state reset in the draft-loading useEffect hook. The else branch (when no draft exists) now resets ALL form state fields to their defaults, ensuring a clean slate for new task creation. This matches the behavior of the existing resetForm() function. Fixes: - Images/screenshots persisting after task creation - Referenced files persisting after task creation - Form content (title, description) persisting - Classification fields persisting Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(ui): reset baseBranch, useWorktree, and UI toggles when opening modal without draft Addresses PR review findings: when opening the task creation modal without a saved draft, the following state variables were not being reset to their defaults (while resetForm() correctly resets all of them): - baseBranch: now resets to PROJECT_DEFAULT_BRANCH - useWorktree: now resets to true (safe default) - showFileExplorer: now resets to false - showGitOptions: now resets to false This ensures consistent form state when reopening the modal after closing without saving a draft. --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Test User <test@example.com>
* auto-claude: subtask-1-1 - Add markReviewPosted function to useGitHubPRs hook Fix PR list not updating when "Post Status" button is clicked for blocked PRs. Changes: - Add markReviewPosted function to useGitHubPRs hook that updates the store with hasPostedFindings: true - Pass markReviewPosted through GitHubPRs.tsx to PRDetail component - Call onMarkReviewPosted in handlePostBlockedStatus after successful post This ensures the PR list status display updates immediately when posting blocked status (BLOCKED/NEEDS_REVISION verdicts with no findings). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: persist hasPostedFindings flag to disk in markReviewPosted The markReviewPosted function was only updating the in-memory Zustand store without persisting the has_posted_findings flag to the review JSON file on disk. After an app restart, the flag would be lost. This commit adds: - New IPC handler GITHUB_PR_MARK_REVIEW_POSTED that updates the review JSON file on disk with has_posted_findings=true and posted_at timestamp - New API method markReviewPosted in github-api.ts - Updated markReviewPosted in useGitHubPRs.ts to call the IPC handler first, then update the in-memory store Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address follow-up review findings for markReviewPosted Fixes several issues identified in the follow-up PR review: 1. Race condition with prNumber: onMarkReviewPosted callback now accepts prNumber as a parameter instead of relying on closure state, preventing wrong PR updates when user switches PRs during async operations. 2. Silent failure handling: handlePostBlockedStatus now checks the return value of onPostComment and only marks review as posted on success. 3. Missing postedAt timestamp: markReviewPosted now includes postedAt timestamp in the store update for consistency with disk state. 4. Store not updated when result not loaded: If the review result hasn't been loaded yet (race condition), markReviewPosted now reloads it from disk after persistence to ensure the UI reflects the correct state. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update PostCommentFn type in PRDetail tests to match new signature Update the mock type to return Promise<boolean> instead of void | Promise<void> to match the updated onPostComment interface that now returns success status. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: correct mock return value type in PRDetail integration test The mockOnPostComment.mockResolvedValue() was passing undefined instead of boolean, causing TypeScript type check failures in CI. PostCommentFn returns Promise<boolean>, so the mock must also return a boolean value. * fix(security): eliminate TOCTOU race condition in markReviewPosted handler Remove separate fs.existsSync() check before fs.readFileSync() to prevent time-of-check to time-of-use (TOCTOU) race condition flagged by CodeQL. Instead, let readFileSync throw ENOENT if file doesn't exist and handle it in the catch block with specific error code checking. * chore: merge develop and fix additional test type error Resolve merge conflict in ipc.ts by keeping both new IPC channels: - GITHUB_PR_MARK_REVIEW_POSTED (from this branch) - GITHUB_PR_UPDATE_BRANCH (from develop) Fix second occurrence of mockOnPostComment.mockResolvedValue(undefined) type error in PRDetail integration tests. --------- Co-authored-by: Test User <test@example.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…ik90#1259) * fix(windows): prevent zombie process accumulation on app close - Use taskkill /f /t on Windows to properly kill process trees (SIGTERM/SIGKILL are ignored on Windows) - Make killAllProcesses() wait for process exit events with timeout - Kill PTY daemon process on shutdown - Clear periodic update check interval on app quit Fixes process accumulation in Task Manager after closing Auto-Claude. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(windows): extract killProcessGracefully utility with timer cleanup - Extract shared killProcessGracefully() to platform module - Fix Issue #1: Move taskkill outside try-catch scope - Fix Issue #2: Track exit state to skip unnecessary taskkill - Fix Issue #3: Add GRACEFUL_KILL_TIMEOUT_MS constant - Fix Issue #4: Use consistent 5000ms timeout everywhere - Fix Issue #5: Add debug logging for catch blocks - Fix Issue #6: Log warning when process.once unavailable - Fix Issue AndyMik90#7: Eliminate code duplication across 3 files - Fix timer leak: Clear timeout on process exit/error, unref timer Add comprehensive tests (19 test cases) covering: - Windows taskkill fallback behavior - Unix SIGTERM/SIGKILL sequence - Timer cleanup and memory leak prevention - Edge cases and error handling Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Andy <119136210+AndyMik90@users.noreply.github.com>
* auto-claude: subtask-1-1 - Add fit trigger after drag-drop completes in TerminalGrid When terminals are reordered via drag-drop, the xterm instances need to be refitted to their containers to prevent black screens. This change: - Dispatches a 'terminal-refit-all' custom event from TerminalGrid after terminal reordering completes (with 50ms delay to allow DOM update) - Adds event listener in useXterm that triggers fit on all terminals when the event is received Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-1-2 - Pass fit callback from useXterm to Terminal component - Export TerminalHandle interface from Terminal component with fit() method - Use forwardRef and useImperativeHandle to expose fit callback to parent components - Export SortableTerminalWrapperHandle interface with fit() method - Forward fit callback through SortableTerminalWrapper to enable external triggering - This allows parent components to trigger terminal resize after container changes Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-1-3 - Add fit trigger on expansion state change Add useEffect that calls fit() when isExpanded prop changes. This ensures the terminal content properly resizes to fill the container when a terminal is expanded or collapsed. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-2-1 - Add displayOrder field to TerminalSession type def * auto-claude: subtask-2-2 - Add displayOrder field to renderer Terminal interface - Added displayOrder?: number to Terminal interface for tab persistence - Updated addTerminal to set displayOrder based on current array length - Updated addRestoredTerminal to restore displayOrder from session - Updated addExternalTerminal to set displayOrder for new terminals - Updated reorderTerminals to update displayOrder values after drag-drop - Updated restoreTerminalSessions to sort sessions by displayOrder Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-2-3 - Persist displayOrder when saving terminal sessions Add displayOrder field to TerminalSession interface in the main process terminal-session-store.ts. This field stores the UI position for ordering terminals after drag-drop, enabling order persistence across app restarts. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-2-4 - Save order after drag-drop reorder and restore on app startup Implements terminal display order persistence: - Added TERMINAL_UPDATE_DISPLAY_ORDERS IPC channel - Added updateDisplayOrders method to TerminalSessionStore - Added session-handler and terminal-manager wrapper functions - Added IPC handler in terminal-handlers.ts - Added ElectronAPI type and preload API method - Updated TerminalGrid.tsx to persist order after drag-drop reorder - Added browser mock for updateTerminalDisplayOrders Now when terminals are reordered via drag-drop, the new order is persisted to disk and restored when the app restarts. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-3-1 - Add WebLinksAddon callback to open links via openExternal IPC * fix(main): add error handling to setWindowOpenHandler shell.openExternal The setWindowOpenHandler calls shell.openExternal without handling its promise, causing unhandled rejection errors when the OS cannot open a URL (e.g., no registered handler for the protocol). While PR AndyMik90#1215 fixes terminal link clicks by routing them through IPC with proper error handling, this setWindowOpenHandler is still used as a fallback for any other window.open() calls (e.g., from third-party libraries). This change adds a .catch() handler to gracefully log failures instead of causing Sentry errors. Fixes: Sentry error "No application found to open URL" in production v2.7.4 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(terminal): resolve PR review findings for persistence and security - Preserve displayOrder when updating existing sessions to prevent tab order loss during periodic saves - Sort sessions by displayOrder in handleRestoreFromDate to maintain user's custom tab ordering when restoring from history - Add URL scheme allowlist (http, https, mailto) in setWindowOpenHandler for security hardening against malicious URL schemes - Extract 50ms DOM update delay to TERMINAL_DOM_UPDATE_DELAY_MS constant - Add error handling for IPC persistence calls in TerminalGrid - Add .catch() handler to WebLinksAddon openExternal promise --------- Co-authored-by: Test User <test@example.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…dyMik90#1087) (AndyMik90#1124) * fix: auto-commit .gitignore changes during project initialization (AndyMik90#1087) When Auto-Claude modifies .gitignore to add its own entries, those changes were not being committed. This caused merge failures with "local changes would be overwritten by merge: .gitignore". Changes: - Add _is_git_repo() helper to check if directory is a git repo - Add _commit_gitignore() helper to commit .gitignore changes - Update ensure_all_gitignore_entries() to accept auto_commit parameter - Update init_auto_claude_dir() and repair_gitignore() to auto-commit The commit message "chore: add auto-claude entries to .gitignore" is used for these automatic commits. Fixes AndyMik90#1087 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * style: fix ruff formatting for function signature Split long function signature across multiple lines to satisfy ruff format requirements. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: add subprocess timeouts and improve error handling - Add timeout=10 to git rev-parse call in _is_git_repo - Add timeout=30 to git add and git commit calls in _commit_gitignore - Check both stdout and stderr for "nothing to commit" message (location varies by git version/locale) - Log warning when auto-commit fails to help diagnose merge issues - Catch subprocess.TimeoutExpired explicitly Addresses CodeRabbit MAJOR review comments. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com> * fix: use LC_ALL=C for locale-independent git output parsing Set LC_ALL=C environment variable when running git commands to ensure English output messages regardless of user locale. This prevents "nothing to commit" detection from failing in non-English environments. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: only commit .gitignore file, not all staged changes Previously, `git commit -m "..."` would commit ALL staged files, potentially including unrelated user changes. This fix explicitly specifies .gitignore as the file to commit. Addresses CRITICAL bot feedback about unintentionally committing user's staged changes during project initialization. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * style: format git commit args per ruff Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: use get_git_executable() for cross-platform git resolution Use the platform abstraction module (core.git_executable) to resolve the git executable path instead of hardcoding "git". This ensures proper operation on Windows where git may not be in PATH. Addresses CodeRabbit suggestion for consistent cross-platform behavior. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: add debug logging for exception handling in git operations Address CodeRabbit feedback to log exceptions at DEBUG level in _is_git_repo and _commit_gitignore functions for better debugging. Also update repair_gitignore docstring to document auto-commit behavior. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Signed-off-by: youngmrz <elliott.zach@gmail.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Andy <119136210+AndyMik90@users.noreply.github.com>
…ttempt failure (AndyMik90#1213) * fix(terminal): sync worktree config after PTY creation to fix first-attempt failure When selecting a worktree immediately after app launch, the terminal would fail to spawn on the first attempt but succeed on the second. Root cause: IPC calls to setTerminalWorktreeConfig and setTerminalTitle happened before the terminal existed in the main process, so the config wasn't persisted. On recreation, the new PTY was created but without the worktree association. Changes: - Add pendingWorktreeConfigRef to store config during recreation - Re-sync worktree config to main process in onCreated callback - Increase MAX_RECREATION_RETRIES from 10 to 30 (1s → 3s) to handle slow app startup scenarios where xterm dimensions take longer Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(terminal): address PR review findings for worktree config race conditions - Clear pendingWorktreeConfigRef on PTY creation error to prevent stale config - Add try/catch error handling for IPC calls in onCreated callback - Extract duplicated worktree recreation logic into applyWorktreeConfig helper --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
youngmrz
added a commit
that referenced
this pull request
Jan 17, 2026
Add a script to verify Windows-specific PRs are working correctly: - PR #1: Marketplace initialization check - PR #2: Error surfacing code presence check - PR #3: Windows path normalization test - PR #4: Token hot-reload IPC channel check Usage: node scripts/test-windows-fixes.js [--all] [--pr N] Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4d09175 to
92f5d88
Compare
* auto-claude: subtask-1-1 - Add TaskOrderState type to task.ts Add TaskOrderState type as Record<TaskStatus, string[]> to map kanban columns to ordered task IDs for drag-and-drop reordering. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-1-2 - Add task order state and actions to task-store.ts - Import arrayMove from @dnd-kit/sortable - Import TaskOrderState type from shared types - Add taskOrder state (TaskOrderState | null) for per-column ordering - Add setTaskOrder action to set full task order state - Add reorderTasksInColumn action using arrayMove pattern - Add loadTaskOrder action to load from localStorage - Add saveTaskOrder action to persist to localStorage - Add helper functions: getTaskOrderKey, createEmptyTaskOrder - Update clearTasks to also clear taskOrder state * auto-claude: subtask-1-3 - Add localStorage persistence helpers for task order Add clearTaskOrder function to complete the localStorage persistence helpers for task order management. The loadTaskOrder and saveTaskOrder functions were already implemented. This adds: - clearTaskOrder(projectId): Removes task order from localStorage and resets state Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-2-1 - Import arrayMove from @dnd-kit/sortable and add wi - Import arrayMove from @dnd-kit/sortable in KanbanBoard.tsx - Import useTaskStore to access reorderTasksInColumn and saveTaskOrder actions - Add within-column reorder logic to handleDragEnd: - Detect same-column drops (when task.status === overTask.status) - Call reorderTasksInColumn to update order in store via arrayMove - Persist order to localStorage via saveTaskOrder Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-2-2 - Update tasksByStatus useMemo to apply custom order Updated the tasksByStatus useMemo in KanbanBoard to support custom task ordering: - Added taskOrder state selector from useTaskStore - If custom order exists for a column, sort tasks by their order index - Filter out stale IDs (task IDs in order that no longer exist) - Prepend new tasks (not in order) at top with createdAt sort - Fallback to createdAt sort (newest first) when no custom order exists Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-2-3 - Add useEffect to load task order on mount and when project changes * auto-claude: subtask-3-1 - Handle cross-column drag: place task at top When a task is moved to a new column via drag-and-drop: - Added moveTaskToColumnTop action to task-store.ts - Removes task from source column order array - Adds task to index 0 (top) of target column order array - Persists order to localStorage after cross-column moves - Works for both dropping on column and dropping on task in diff column Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-3-2 - Handle new task placement: new tasks added to backlog appear at index 0 - Modified addTask() to also update taskOrder state when adding new tasks - New tasks are inserted at index 0 (top) of their status column's order array - Follows the existing pattern from moveTaskToColumnTop() - Includes safety check to prevent duplicate task IDs in order array * auto-claude: subtask-3-3 - Handle deleted/stale tasks in kanban order Add cleanup effect that detects and removes stale task IDs from the persisted task order when tasks are deleted. This ensures the order stored in localStorage stays in sync with actual tasks. - Add setTaskOrder store selector for updating order state - Add useEffect that filters out stale IDs when tasks change - Persist cleaned order to localStorage when stale IDs are found Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-4-1 - Create unit tests for task order state management Add comprehensive unit tests for kanban board drag-and-drop reordering: - Test setTaskOrder: basic setting, replacing, empty columns, all column orders - Test reorderTasksInColumn with arrayMove: various reordering scenarios, edge cases (null order, missing IDs, single task, adjacent tasks) - Test loadTaskOrder: localStorage retrieval, empty state creation, project-specific keys, error handling for corrupted/inaccessible data - Test saveTaskOrder: localStorage persistence, null handling, error handling - Test clearTaskOrder: removal from localStorage, project-specific keys - Test moveTaskToColumnTop: cross-column moves, source removal, deduplication - Test addTask integration: new tasks added to top of column order - Integration tests: full load/reorder/save cycle, project switching Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-4-2 - Add localStorage persistence edge case tests * auto-claude: subtask-4-3 - Add unit tests for order filtering Add comprehensive unit tests for task order filtering logic: - Stale ID removal tests: verify IDs for deleted tasks are filtered out - New task placement tests: verify new tasks appear at top of column - Cross-column move tests: verify order updates when tasks move between columns Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(kanban): address follow-up review findings - Wrap saveTaskOrder in useCallback to prevent useEffect dependency loop - Add runtime validation for localStorage data in loadTaskOrder - Remove variable shadowing of projectId in handleDragEnd * test: update task-order tests to match new validation behavior loadTaskOrder now validates localStorage data and resets to empty order when invalid data (null, arrays) is found instead of storing it directly. * fix(kanban): improve task order validation and reordering reliability - Add comprehensive validation for localStorage task order data: - Validate each column value is a string array - Merge with empty order to handle partial/corrupted data - Fix saveTaskOrder to return false when nothing to save - Fix reordering for tasks not yet in order array by syncing visual order before calling reorderTasksInColumn Resolves PR review findings: NEWCODE-001, NEW-001, NEW-005 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Test User <test@example.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix 12 max limit terminals per project * fix(tests): address PR review findings and CI failures - Extract duplicated terminal counting logic to helper function (getActiveProjectTerminalCount) to improve maintainability - Add comprehensive rationale comment for 12-terminal limit explaining memory/resource constraints - Add debug logging when terminal limit is reached for better observability - Document that addRestoredTerminal intentionally bypasses limit to preserve user state from previous sessions - Fix macOS test failure: use globalThis instead of window in requestAnimationFrame mock (terminal-copy-paste.test.ts) - Fix Windows test timeouts: add 15000ms timeouts to all subprocess-spawn tests for slower CI environments - Increase PRDetail.integration.test.tsx timeout to 15000ms Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…0#1268) * fix(pr-review): allow re-review when previous review failed Previously, when a PR review failed (e.g., SDK validation error), the bot detector would mark the commit as 'already reviewed' and refuse to retry. This caused instant failures on subsequent review attempts. Now, the orchestrator checks if the existing review was successful before returning it. Failed reviews are no longer treated as blocking - instead, the system allows a fresh review attempt. Fixes: PR reviews failing instantly with 'Review failed: None' * fix(pr-review): address PR review feedback - Rename test_failed_review_allows_re_review to test_failed_review_model_persistence with updated docstring to accurately reflect what it tests (model persistence, not orchestrator re-review behavior) - Extract duplicate skip result creation into _create_skip_result helper method to reduce code duplication in orchestrator.py Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…tibility Added Windows-safe path handling utilities to file_utils.py: - is_windows(): Check if running on Windows - normalize_path(): Resolve paths and handle long paths (>260 chars) - sanitize_filename(): Replace invalid Windows characters (<>:"|?*) - safe_path(): Combine normalization and sanitization - safe_open(): Drop-in replacement for open() with Windows safety Updated complexity.py to use safe_open() in save_assessment() to prevent [Errno 22] Invalid argument errors when writing JSON files. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- safe_path now sanitizes all directory names, not just the filename, to handle paths from external sources with invalid Windows characters - sanitize_filename now returns "_unnamed" if sanitization produces an empty string (e.g., input was "..." or " ") - Fixed import ordering for ruff compliance Addresses Gemini HIGH priority issue and CodeRabbit feedback. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Document the Windows compatibility utilities and recommend using safe_open() instead of open() for files with user input or special characters. This provides guidance for future code that needs Windows compatibility. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Apply safe_open utility consistently across all modules that write to spec directories to prevent [Errno 22] Invalid argument errors on Windows when paths contain special characters. Updated files: - spec/writer.py - spec/validator.py - spec/context.py - spec/requirements.py - spec/validate_pkg/auto_fix.py - spec/phases/requirements_phases.py Addresses Sentry review comment about incomplete safe_open adoption. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
- Fix UNC long path handling: add \?\UNC\ prefix for UNC paths >260 chars - Fix reserved filename detection: use split() instead of rsplit() to get base name before any extension (e.g., LPT1.foo.bar -> LPT1) - Fix drive letter check: pathlib returns 'C:\' (length 3), not 'C:' (length 2) - Handle UNC path anchors in safe_path to avoid sanitizing them Addresses Gemini HIGH and Sentry CRITICAL review comments. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
Return "_unnamed" for empty strings or whitespace-only input to ensure consistent behavior and prevent invalid filenames. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added '/' and '\' to _WINDOWS_INVALID_CHARS_MAP as these path separator characters are invalid in Windows filenames and should be sanitized. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: youngmrz <elliott.zach@gmail.com>
- Add _WINDOWS_MAX_PATH constant (260) instead of magic number - Fix drive-relative path detection (C:filename) where C: has length 2 Previously only handled C:\ (length 3), corrupting drive-relative paths Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
f2fa8e9 to
39d65b5
Compare
* auto-claude: subtask-1-1 - Add 'planning' phase to stuck detection skip logic Add 'planning' phase to the stuck detection skip logic in TaskCard.tsx. Previously only 'complete' and 'failed' phases were skipped. Now 'planning' is also skipped since process tracking is async and may show false negatives during initial startup. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-1-2 - Add debug logging to stuck detection for better di Add debug logging when stuck check is skipped due to planning phase or terminal phases (complete/failed). This helps diagnose false-positive stuck detection issues by logging when and why the check was bypassed. The logging uses the existing window.DEBUG flag pattern to avoid noise in production while enabling diagnostics when needed. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(ui): add 'planning' phase to useTaskDetail.ts stuck detection and extract constant - Add 'planning' phase check at lines 113 and 126 in useTaskDetail.ts to match TaskCard.tsx behavior, preventing false stuck indicators during initial task startup - Extract STUCK_CHECK_SKIP_PHASES constant and shouldSkipStuckCheck() helper in TaskCard.tsx to reduce code duplication Fixes PR review findings: ed766093f258 (HIGH), 91a0a4fcd67b (LOW) * fix(ui): don't set hasCheckedRunning for planning phase Fixes regression where stuck detection was disabled after planning→coding transition because hasCheckedRunning remained true from planning phase. Now 'planning' phase only clears isStuck without setting hasCheckedRunning, allowing proper stuck detection when task transitions to 'coding' phase. Fixes NEW-001 from PR review. * fix(ui): move stuck check constants outside TaskCard component Move STUCK_CHECK_SKIP_PHASES constant and shouldSkipStuckCheck function outside the TaskCard component to avoid recreation on every render. Addresses PR review finding NEW-003 (code quality). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(ui): reset hasCheckedRunning when task stops in planning phase Move the !isActiveTask check to run FIRST before any phase checks. This ensures hasCheckedRunning is always reset when a task becomes inactive, even if it stops while in 'planning' phase. Previously, the planning phase check returned early, preventing the !isActiveTask reset from running, which caused stale hasCheckedRunning state and skipped stuck checks on task restart. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(test): use callback(0) instead of callback.call(window, 0) Fix unhandled ReferenceError in terminal-copy-paste.test.ts where window was not defined when requestAnimationFrame callback executed asynchronously. The callback just needs the timestamp parameter. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Test User <test@example.com>
* fix(frontend): resolve preload API duplicates and terminal session corruption
- Remove duplicate API spreads (IdeationAPI, InsightsAPI, GitLabAPI) from
createElectronAPI() - these are already included via createAgentAPI()
- Fix "object is not iterable" error in Electron sandbox renderer
- Implement atomic writes for TerminalSessionStore using temp file + rename
- Add backup rotation and automatic recovery from corrupted session files
- Prevents data loss on app crash or interrupted writes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(hooks): use perl for cross-platform README version sync
BSD sed (macOS) doesn't support the {block} syntax with address ranges.
Replace sed with perl for the download links update which works
consistently across macOS and Linux.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: bump version to 2.7.5
* perf(frontend): optimize terminal session store async operations
- Replace sync existsSync() with async fileExists() helper in saveAsync()
- Add pendingDeleteTimers Map to prevent timer accumulation on rapid deletes
- Cancel existing cleanup timers before creating new ones
- Add comprehensive unit tests (28 tests) covering:
- Atomic write pattern (temp file -> backup rotation -> rename)
- Backup recovery from corrupted main file
- Race condition prevention via pendingDelete
- Write serialization with writeInProgress/writePending
- Timer cleanup for pendingDeleteTimers
- Session CRUD operations, output buffer, display order
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…riables (AndyMik90#1267) * fix(worktree): prevent cross-worktree file leakage via environment variables When pre-commit hook runs in a worktree, it sets GIT_DIR and GIT_WORK_TREE environment variables. These variables were persisting and leaking into subsequent git operations in other worktrees or the main repository, causing files to appear as untracked in the wrong location. Root cause confirmed by 5 independent investigation agents: - GIT_DIR/GIT_WORK_TREE exports persist across shell sessions - Version sync section runs git add without env isolation - Tests already clear these vars but production code didn't Fix: - Clear GIT_DIR/GIT_WORK_TREE when NOT in a worktree context - Add auto-detection and repair of corrupted core.worktree config - Add comprehensive documentation explaining the bug and fix * fix(worktree): add git env isolation to frontend subprocess calls Extend worktree corruption fix to TypeScript frontend: - Create git-isolation.ts utility with getIsolatedGitEnv() - Fix task/worktree-handlers.ts: merge, preview, PR creation spawns - Fix terminal/worktree-handlers.ts: all 10 execFileSync git calls - Use getToolPath('git') consistently for cross-platform support Clears GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, and author/committer env vars to prevent cross-contamination between worktrees. Part of fix for mysterious file leakage between worktrees. * fix(pre-commit): improve robustness of git worktree handling Address PR review findings: 1. Improve .git file parsing for worktree detection: - Use sed -n with /p to only print matching lines - Add head -1 to handle malformed files with multiple lines - Add directory existence check before setting GIT_DIR 2. Add error handling for git config --unset: - Wrap in conditional to detect failures - Print warning if unset fails (permissions, locked config, etc.) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(worktree): align git env isolation between TypeScript and Python Address PR review findings for consistency: 1. Add GIT_AUTHOR_DATE and GIT_COMMITTER_DATE to TypeScript GIT_ENV_VARS_TO_CLEAR array to match Python implementation 2. Add HUSKY=0 to Python get_isolated_git_env() to match TypeScript implementation and prevent double-hook execution 3. Add getIsolatedGitEnv() to listOtherWorktrees() for consistency with all other git operations in the file Also fix ruff linting (UP045): Replace Optional[dict] with dict | None Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(workspace): migrate remaining git calls to use run_git for env isolation Replace all direct subprocess.run git calls in workspace.py with run_git() to ensure consistent environment isolation across all backend git operations. This prevents potential cross-worktree contamination from environment variables (GIT_DIR, GIT_WORK_TREE, etc.) that could be set by pre-commit hooks or other git configurations. Converted 13 subprocess.run calls: - git rev-parse --abbrev-ref HEAD - git merge-base (2 locations) - git add (10 locations) Also: - Remove now-unused subprocess import - Fix cross-platform issue: use getToolPath('git') in listOtherWorktrees Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(worktree): add unit tests and fix pythonEnv git isolation bypass - Add comprehensive Python tests for git_executable module (20 tests) - Add TypeScript tests for getIsolatedGitEnv utility (19 tests) - Migrate GitLab handlers to use getIsolatedGitEnv for git commands - Fix critical bug: getPythonEnv() now uses getIsolatedGitEnv() as base to prevent git env vars from being re-added when pythonEnv is spread The pythonEnv bypass bug caused git isolation to be defeated when: env: { ...getIsolatedGitEnv(), ...pythonEnv, ... } because pythonEnv contained a copy of process.env with git vars intact. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(worktree): add git env isolation to execution-handlers Add getIsolatedGitEnv() to 6 git commands in execution-handlers.ts: - QA review rejection: reset, checkout, clean (lines 407-430) - Task discard cleanup: rev-parse, worktree remove, branch -D (lines 573-599) Without env isolation, these commands could operate on the wrong repository if GIT_DIR/GIT_WORK_TREE vars were set from a previous worktree operation. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(pre-commit): clear git env vars when worktree detection fails When .git is a file but WORKTREE_GIT_DIR parsing fails (empty or invalid directory), any inherited GIT_DIR/GIT_WORK_TREE environment variables were left in place, potentially causing cross-worktree contamination. Now explicitly unsets these variables in the failure case, matching the behavior of the main repo branch. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore(tests): remove unused pytest import Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.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.
Summary
file_utils.py:is_windows(): Check if running on Windowsnormalize_path(): Resolve paths and handle long paths (>260 chars) with\?\prefixsanitize_filename(): Replace invalid Windows characters (<>:"|?*) and handle reserved names (CON, PRN, etc.)safe_path(): Combine normalization and sanitizationsafe_open(): Drop-in replacement foropen()with Windows safetycomplexity.pyto usesafe_open()insave_assessment()to prevent[Errno 22] Invalid argumenterrorsTest plan
complexity_assessment.jsonwithout Errno 22🤖 Generated with Claude Code