Replace 'multi-document batch runs' and 'batch processing' terminology
with 'Auto Run' (individual documents) and 'Playbook' (collections of
Auto Run documents) across user-facing documentation.
Preserves 'batch mode' references where they describe Claude Code's
actual non-interactive operation mode.
Rename "Audio Feedback" → "Custom Notification" and "TTS Command" →
"Command Chain" to better reflect the flexible nature of this feature.
Users can chain commands together with pipes to mix and match
notification tools (TTS, logging, desktop notifications, etc.).
Closes#168
Adds a /skills slash command (Claude Code only) that reads skill files
from .claude/skills/*/skill.md directories and displays them in chat
with name, description, and approximate token count.
When the wizard generates Auto Run documents, it now defaults to using
<agentPath>/Auto Run Docs for the {{AUTORUN_FOLDER}} template variable
instead of leaving it empty when not explicitly provided.
- Remove incorrect normalization for Claude Code (reports per-turn values directly)
- Keep normalization only for Codex (reports cumulative session totals)
- Create src/shared/contextUsage.ts as single source of truth
- Consolidate duplicate code from renderer, main, and web/mobile
- Add w-full to ContextWarningSash for full-width display
- Update tests to reflect correct formula and behavior
Show complete command with all arguments instead of limiting to first 5
args. Full command visibility is essential for debugging SSH and other
spawn issues.
- Extract LiveSessionManager (178 lines) for live session and AutoRun state tracking
- Extract CallbackRegistry (208 lines) for centralized callback management
- Reduce WebServer.ts from 778 to 582 lines (25% reduction)
- Add managers/ directory with proper exports
- Maintain consistent public API (no breaking changes)
- Move WebServer class to dedicated file and add module index
- Extract shared types to centralized types.ts
- Fix XSS vulnerability by sanitizing sessionId/tabId in URL parameters
- Fix IPC listener memory leak with proper cleanup on timeout
- Add autoRunStates cleanup when sessions go offline
- Refactor message handlers with send() and sendError() helpers
- Add XSS sanitization tests and e2e test configuration
- Add retry logic with exponential backoff for stats DB insertions
(100ms, 200ms, 400ms delays, max 3 attempts)
- Fix import order in types.ts (move constant after imports)
- Update stats-listener tests for async retry behavior
- Add new test for retry success on transient failure
Addresses review recommendations:
- High: Stats database error handling with retry logic
- Low: Import order consistency
- Extract agent:clearError and agent:retryAfterError handlers from
main/index.ts to dedicated handlers/agent-error.ts module
- Add comprehensive test coverage for agent error handlers (29 tests)
- Centralize GROUP_CHAT_PREFIX constant in process-listeners/types.ts
to eliminate duplication across 4 listener files
- Remove unused ipcMain import from main/index.ts (all IPC handlers
now registered through handlers module)
PR Review Fixes:
- Fix race condition in exit-listener by moving markAndMaybeSynthesize
to explicit code paths instead of finally() block
- Add buffer size limits (MAX_BUFFER_SIZE 10MB) with warning logs
- Add REGEX_BATCH_SESSION and REGEX_SYNOPSIS_SESSION for proper filtering
- Fix type safety using canonical ToolExecution and UsageStats imports
- Fix usage-listener indentation bug where safeSend was inside wrong block
Performance Optimizations:
- Add GROUP_CHAT_PREFIX constant for fast string prefix checks
- Skip expensive regex matching for non-group-chat sessions
- Eliminate redundant loadGroupChat calls by using updateParticipant
return value directly (DB caching)
- Add MSG_ID_RANDOM_LENGTH constant for web broadcast deduplication
Test Coverage:
- Add 4 new test files (exit, data, usage, session-id listeners)
- Total 93 tests covering edge cases, DB caching, and performance
- Verify exact participants data flow from updateParticipant
- Test optional emitter handling and empty participants arrays
- types.ts: ProcessListenerDependencies interface and type re-exports.
- data-listener.ts: Process output streaming with group chat buffering.
- exit-listener.ts: Process exit handling with routing, recovery, synthesis.
- session-id-listener.ts: Agent session ID tracking for group chat.
- usage-listener.ts: Token/cost statistics for participants and moderator.
- error-listener.ts: Agent error logging and forwarding.
- stats-listener.ts: Query-complete events for stats database.
- forwarding-listeners.ts: Simple IPC forwarding (slash-commands, etc.).
This reduces main/index.ts by ~600 lines (1270 → 670) and adds 15 new tests covering forwarding, error, and stats listeners.
When creating 3+ phase documents for a single effort, agents should now place them in a dedicated subdirectory for easier organization and batch addition.
The automatic synopsis triggered on process exit was using a short
hardcoded prompt that didn't include anti-caveat instructions. This
caused the agent to add unhelpful preambles like "I don't have any
record of previous work in this session" in toast notifications.
Now uses autorunSynopsisPrompt which includes instructions to jump
straight to the accomplishment without session context caveats.
Implements #165 - adds a third "sticky" mode for the thinking toggle
that keeps thinking content visible after the response completes.
- Add ThinkingMode type ('off' | 'on' | 'sticky') to shared types
- Update settings modal with three-position toggle button group
- Update thinking pill UI to show pin icon for sticky mode
- Update Cmd+Shift+K to cycle through all three states
- Add visual differentiation: off (dim), on (accent), sticky (warning+pin)
- Maintain backward compatibility for legacy boolean settings
Closes#165
- Remove unrelated husky and lint-staged dev dependencies
- Fix Windows path encoding in session storage (handle backslashes)
- Add debug logging to empty catch blocks for better diagnostics
- Add type guard validation for JSON parsing in output parser
- Ensure remoteCwd is set for all remote git operations (isRepo, status, diff, branch, remote, numstat, tags, branches, info)
- Resolves warning about missing remote working directory
- Enables correct git repo detection and status for remote directories in wizard and agent flows
- Ensure prompts for remote SSH agents are sent via stdin as JSON in stream-json mode, fixing agent crashes with large prompts
- Always run background synopsis (history tab) on the correct remote host by propagating SSH config from the main session
- Improve wizard error handling: treat nonzero agent exit codes as success if output parses as a valid response, preventing false error states in confidence-building chat
- General reliability improvements for remote agent session management and output parsing
The handler expected documentPaths[] but preload/App.tsx send totalDocuments.
Changed handler to accept totalDocuments directly since only the count is needed.
Add the Symphony hotkey (⌘⇧Y) and command palette entry that were lost
during the rebase. Changes include:
- Add onOpenSymphony to QuickActionsModalProps and command palette actions
- Add onOpenSymphony prop chain through AppModals to App.tsx
- Add setSymphonyModalOpen to keyboard handler context
- Add openSymphony shortcut handler in useMainKeyboardHandler
- Add symphony API mock to test setup (getRegistry, getIssues, getState, etc.)
- Add Music and Server icons to SessionList test mocks
- Add setSymphonyModalOpen prop to SessionList test defaults
All 16,138 tests now pass.
The handler expects { url: string } but preload was passing just the
url string directly. This caused "Invalid URL" errors when trying to
preview document content.
The Symphony handlers were defined but never called in src/main/index.ts.
Added import and invocation of registerSymphonyHandlers with app and
getMainWindow dependencies.
- Import SymphonyModal and SymphonyContributionData
- Add SymphonyModal component with full onStartContribution handler
- Add symphonyMetadata to Session interface in types/index.ts
- Import and re-export SymphonySessionMetadata from shared types
- Fix registerActive call to use totalDocuments instead of documentPaths
- Fix setRightPanelTab to setActiveRightTab
- Added Music icon import to SessionList.tsx
- Added setSymphonyModalOpen to HamburgerMenuContentProps
- Added Symphony button between Usage Dashboard and divider
- Updated SessionListProps with setSymphonyModalOpen
- Updated useSessionListProps hook to pass Symphony setter
- Extracted symphonyModalOpen from ModalContext in App.tsx
- Use full agent path (claude.exe) on Windows to avoid shell:true
which breaks stdin piping for stream-json input mode
- Fix SSH condition to check enabled flag, not just config existence
- Pass sessionSshRemoteConfig through inline wizard to enable remote execution
- Add synopsis SSH inheritance from parent session as backend workaround
Fixes local wizard crashing with exit code 1 and SSH sessions
incorrectly using local paths when SSH was disabled.
- Added Python 3.11 to Windows CI to restore distutils support required by node-gyp
- Ensured native module rebuilds (better-sqlite3, node-pty) succeed on Windows runners
- Fixed TypeScript build errors to restore clean compilation across all platforms
- Added extensive DEBUG-level logging for SSH command execution, spawn details, exit codes, and configuration flow
- Improved Wizard SSH remote support:
- Debounced remote directory validation to reduce excessive SSH calls
- Fixed git.isRepo() to correctly pass remoteCwd for remote checks
- Persisted SSH config in SerializableWizardState and validated directories over SSH
- Ensured ConversationScreen and ConversationSession consistently pass SSH config for remote agent execution
- Fixed "agent not available" errors by forwarding stdin via exec and enabling stream-json mode for large prompts
- Enhanced remote agent execution logic in ProcessManager with stdin streaming, exec-based forwarding, and useStdin flag
- Improved SSH file browser behavior:
- Added resolveSshPath() to locate SSH binaries on Windows (Electron spawn PATH issue)
- Corrected getSshContext() handling of enabled/remoteId states
- Ensured synopsis background tasks run via SSH instead of local paths
- Added Windows development improvements: dev:win script and PowerShell launcher for separate renderer/main terminals
- Added additional SSH directory debugging logs for remote-fs and wizard flows
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added full SSH remote support to the wizard, including propagation of SSH config through all phases
- Ensured SSH config flows correctly through IPC bridge (renderer → preload → main)
- Improved agent detection with optional sshRemoteId and remote `which` resolution
- Fixed SSH config transfer during manual agent creation and auto-selection flows
- Added extensive debugging and structured logging for SSH execution, agent availability, and wizard message flow
- Improved stdin/JSON streaming for large prompts and remote execution
- Added input/output JSON stream handling and enhanced logging for SSH transport
- Added sourcing of bash profiles to correctly resolve claude-code binary paths on remote hosts
Removes the unconditional auto-scroll effect that snapped users back to
the bottom whenever new messages arrived, even when they had scrolled up
to review earlier output. TerminalOutput.tsx already handles scroll
behavior correctly: terminal mode auto-scrolls, AI mode shows a "New
Messages" button when scrolled up.
Closes issue #237
Slash commands like `/speckit.plan Blah blah blah` now correctly parse
the base command and arguments. The arguments are stored in QueuedItem
and substituted for $ARGUMENTS in prompt templates when executed.
- Parse command text into base command and args in useInputProcessing
- Add commandArgs field to QueuedItem interface
- Substitute $ARGUMENTS in prompts before template variable substitution
- Add comprehensive test cases for argument parsing