SIGN IN SIGN UP

fix(session): fix --continue flag to resume sessions across all Claude Code versions

Previous behavior: --continue flag created new sessions instead of resuming
existing ones. Two bugs caused this:

1. claudeCheckSession() only validated sessions with 'uuid' field (Claude Code
   2.1.x format), rejecting sessions from older Claude Code versions that use
   'messageId' or 'leafUuid' fields
2. claudeLocal.ts checked hasUserSessionControl AFTER extracting session flags,
   preventing --resume from being added to Claude CLI arguments in hook mode

Result: claudeFindLastSession() found valid session ID, but --resume flag was
not passed to Claude Code, causing new session creation instead of resumption.

What changed:
- src/claude/utils/claudeCheckSession.ts: Accept uuid, messageId, leafUuid fields + error logging
  - Lines 20-30: Parse JSON once, check uuid OR messageId OR leafUuid (with length > 0)
  - Line 21: Skip empty lines explicitly (not parse errors)
  - Line 32: Log malformed JSON errors per project convention (claudeRemoteLauncher.ts pattern)
  - Line 38: Log final validation result (valid/invalid) for transparency
- src/claude/utils/claudeFindLastSession.ts: Add error logging + update documentation
  - Line 5: Import logger module
  - Line 10: Update JSDoc to document all supported field types (uuid, messageId, leafUuid)
  - Line 49: Log errors in catch block per project logging convention
- src/claude/claudeLocal.ts: Fix --resume flag passing in hook mode
  - Lines 184-189: Remove hasUserSessionControl condition that blocked --resume
  - Add --resume to args when startFrom exists (user flags already extracted, must re-add)
  - Fix: hasUserSessionControl set before extraction but checked after, blocking --resume
- src/claude/utils/claudeCheckSession.test.ts: Add 17 unit tests covering all scenarios
  - Claude 2.1.x sessions (uuid field), older Claude sessions (messageId), summaries (leafUuid)
  - Edge cases (empty strings, null, missing fields, malformed JSON, empty files)
  - File system edge cases (non-existent sessions, large files)
- src/claude/utils/claudeFindLastSession.test.ts: Add 14 integration tests
  - Session finding with multiple formats, mtime sorting, UUID filtering
  - Mixed scenario tests (valid + invalid sessions)
- scripts/test-continue-fix.sh: Add manual verification script for session finder

Why: Claude Code changed message ID field names between versions. Older Claude
Code uses 'messageId', version 2.1.x uses 'uuid', summary lines use 'leafUuid'.
Session validation must check all three field types for backwards compatibility
with sessions created by any Claude Code version. In hook mode, session flags
are extracted from claudeArgs array before spawning Claude CLI. The
hasUserSessionControl variable was set before extraction but checked after when
building args, incorrectly preventing --resume from being added even though
flags were removed. Added error logging to all catch blocks following project
convention (claudeRemoteLauncher.ts, claudeLocalLauncher.ts pattern).

Files affected:
- src/claude/utils/claudeCheckSession.ts: Multi-format validation + logging (14 lines modified)
- src/claude/utils/claudeFindLastSession.ts: Error logging + JSDoc (3 lines modified)
- src/claude/claudeLocal.ts: Fix hook mode --resume passing (4 lines modified)
- src/claude/utils/claudeCheckSession.test.ts: Comprehensive unit tests (188 lines, new)
- src/claude/utils/claudeFindLastSession.test.ts: Integration tests (210 lines, new)
- scripts/test-continue-fix.sh: Manual verification script (79 lines, new)

Testable:
- Run unit/integration tests: npm test -- src/claude/utils/
- Test --continue behavior: happy --continue "test message"
- Verify --resume in args: grep "Args.*--resume" logs
- Expected: Session resumes correctly (not new session created)
A
Andrew Hundt committed
a42d0b68cdd6fb7233733a3fecd8bdabc447972d
Parent: 3b189f8