Root cause analysis revealed validator was looking at wrong path for
modes data. n8n stores modes at top level of properties, not nested
in typeOptions.
Changes:
- config-validator.ts: Changed from prop.typeOptions?.resourceLocator?.modes
to prop.modes (lines 273-310)
- property-extractor.ts: Added modes field to normalizeProperties to
capture mode definitions from n8n nodes
- Updated all test cases to match real n8n schema structure with modes
at property top level
- Rebuilt database with modes field
Results:
- 100% coverage: All 70 resourceLocator nodes now have modes defined
- Schema-based validation now ACTIVE (was being skipped before)
- False positive eliminated: Google Sheets "name" mode now validates
- Helpful error messages showing actual allowed modes from schema
Testing:
- All 33 unit tests pass
- Verified with n8n-mcp-tester: valid "name" mode passes, invalid modes
fail with clear error listing allowed options [list, url, id, name]
Fixes#304 (Google Sheets false positive)
Related to #306 (validator improvements)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixes VersionedNodeType parsing failures where test mocks only have
baseDescription without the description getter that real instances have.
Changes:
- Add baseDescription fallback in regular (non-VersionedNodeType) paths
- Check instance-level baseDescription/nodeVersions for versioned detection
- Prevent fallback for incomplete mocks testing edge cases
This resolves 11 test failures caused by v2.17.5 TypeScript type safety
changes interacting with test mocks that don't fully implement n8n's
VersionedNodeType interface.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added comprehensive TypeScript type definitions for n8n node parsing while
maintaining zero compilation errors. Uses pragmatic "70% benefit with 0%
breakage" approach with strategic `any` assertions.
## Type Definitions (src/types/node-types.ts)
- NodeClass union type replaces `any` in method signatures
- Type guards: isVersionedNodeInstance(), isVersionedNodeClass()
- Utility functions for safe node handling
## Parser Updates
- node-parser.ts: All methods use NodeClass (15+ methods)
- simple-parser.ts: Strongly typed method signatures
- property-extractor.ts: Typed extraction methods
- 30+ method signatures improved
## Strategic Pattern
- Strong types in public method signatures (caller type safety)
- Strategic `as any` assertions for internal union type access
- Pattern: const desc = description as any; // Access union properties
## Benefits
- Better IDE support and auto-complete
- Compile-time safety at call sites
- Type-based documentation
- Zero compilation errors
- Bug prevention (would have caught v2.17.4 baseDescription issue)
## Test Updates
- All test files updated with `as any` for mock objects
- Zero compilation errors maintained
## Known Limitations
- ~70% type coverage (signatures typed, internal logic uses assertions)
- Union types (INodeTypeBaseDescription vs INodeTypeDescription) not fully resolved
- Future work: Conditional types or overloads for 100% type safety
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Address code review feedback from PR #285:
1. Fix Failing Test (CRITICAL)
- Updated test from baseDescription.defaultVersion to description.defaultVersion
- Added test to verify baseDescription is correctly ignored (legacy bug)
2. Add Missing Test Coverage (HIGH PRIORITY)
- Test currentVersion priority over description.defaultVersion
- Test currentVersion = 0 edge case (version 0 should be valid)
- All 34 tests now passing
3. Enhanced Documentation
- Added comprehensive JSDoc for extractVersion() explaining priority chain
- Enhanced validation comments explaining why typeVersion must run before langchain skip
- Clarified that parameter validation (not typeVersion) is skipped for langchain nodes
Test Results:
- ✅ 34/34 tests passing
- ✅ Version extraction priority chain validated
- ✅ Edge cases covered (version 0, missing properties)
- ✅ Legacy bug prevention tested
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit fixes two critical bugs affecting AI Agent and other langchain nodes:
1. Version Extraction Bug (node-parser.ts)
- AI Agent was returning version "3" instead of "2.2" (the defaultVersion)
- Root cause: extractVersion() checked non-existent instance.baseDescription.defaultVersion
- Fix: Updated priority to check currentVersion first, then description.defaultVersion
- Impact: All VersionedNodeType nodes now return correct version
2. typeVersion Validation Bypass (workflow-validator.ts)
- Langchain nodes with invalid typeVersion passed validation (even typeVersion: 99999)
- Root cause: langchain skip happened before typeVersion validation
- Fix: Moved typeVersion validation before langchain parameter skip
- Impact: Invalid typeVersion values now properly caught for all nodes
Also includes:
- Database rebuilt with corrected version data (536 nodes)
- Version bump: 2.17.3 → 2.17.4
- Comprehensive CHANGELOG entry
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Problem
AI assistants were consistently connecting SplitInBatches node outputs backwards because:
- Output index 0 = "done" (runs after loop completes)
- Output index 1 = "loop" (processes items inside loop)
This counterintuitive ordering caused incorrect workflow connections.
## Solution
Enhanced the n8n-mcp system to expose and clarify output information:
### Database & Schema
- Added `outputs` and `output_names` columns to nodes table
- Updated NodeRepository to store/retrieve output information
### Node Parsing
- Enhanced NodeParser to extract outputs and outputNames from nodes
- Properly handles versioned nodes like SplitInBatchesV3
### MCP Server
- Modified getNodeInfo to return detailed output descriptions
- Added connection guidance for each output
- Special handling for loop nodes (SplitInBatches, IF, Switch)
### Documentation
- Enhanced DocsMapper to inject critical output guidance
- Added warnings about counterintuitive output ordering
- Provides correct connection patterns for loop nodes
### Workflow Validation
- Added validateSplitInBatchesConnection method
- Detects reversed connections and provides specific errors
- Added checkForLoopBack with depth limit to prevent stack overflow
- Smart heuristics to identify likely connection mistakes
## Testing
- Created comprehensive test suite (81 tests)
- Unit tests for all modified components
- Edge case handling for malformed data
- Performance testing with large workflows
## Impact
AI assistants will now:
- See explicit output indices and names (e.g., "Output 0: done")
- Receive clear connection guidance
- Get validation errors when connections are reversed
- Have enhanced documentation explaining the correct pattern
Fixes#97🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated trigger detection logic in both parsers to check if a node's group array includes 'trigger'. This fixes an issue where webhook, cron, interval, and emailReadImap nodes were not being identified as triggers despite having category='trigger'.
Note: After pulling this change, run `npm run rebuild` to update your local database.
Fixes#13🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed extractVersion to properly handle nodes with version arrays like [1, 1.1, 1.2]
- Updated detectVersioned to mark nodes with version arrays as versioned
- Added test script to verify version extraction
- Gmail Trigger now correctly shows version 1.2 instead of 1
- All 97 nodes with version arrays now show their latest version
- Database rebuilt with correct versions for all affected nodes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>