Commit Graph

11 Commits

Author SHA1 Message Date
czlonkowski
fc8fb66900 fix: enable schema-based resourceLocator mode validation
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>
2025-10-11 19:29:21 +02:00
czlonkowski
dd521d0d87 fix: handle baseDescription fallback for all node types in parsers
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>
2025-10-07 23:31:13 +02:00
czlonkowski
f3164e202f feat: add TypeScript type safety with strategic any assertions (v2.17.5)
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>
2025-10-07 22:16:59 +02:00
czlonkowski
8e2e1dce62 test: fix failing test and add comprehensive version extraction test coverage
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>
2025-10-07 20:23:45 +02:00
czlonkowski
b986beef2c fix: correct version extraction and typeVersion validation for langchain nodes
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>
2025-10-07 20:16:45 +02:00
czlonkowski
f508d9873b fix: resolve SplitInBatches output confusion for AI assistants (#97)
## 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>
2025-08-07 15:58:40 +02:00
czlonkowski
d870d0ab71 test: add comprehensive unit tests for database, parsers, loaders, and MCP tools
- Database layer tests (32 tests):
  - node-repository.ts: 100% coverage
  - template-repository.ts: 80.31% coverage
  - database-adapter.ts: interface compliance tests

- Parser tests (99 tests):
  - node-parser.ts: 93.10% coverage
  - property-extractor.ts: 95.18% coverage
  - simple-parser.ts: 91.26% coverage
  - Fixed parser bugs for version extraction

- Loader tests (22 tests):
  - node-loader.ts: comprehensive mocking tests

- MCP tools tests (85 tests):
  - tools.ts: 100% coverage
  - tools-documentation.ts: 100% coverage
  - docs-mapper.ts: 100% coverage

Total: 943 tests passing across 32 test files
Significant progress from 2.45% to ~30% overall coverage

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-28 20:16:38 +02:00
czlonkowski
3cd683abc7 fix: webhook and 4 other nodes incorrectly marked as non-triggers
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>
2025-07-06 11:51:22 +02:00
czlonkowski
e209bf3a81 fix: handle version arrays in node parser for correct version extraction
- 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>
2025-06-18 22:38:26 +02:00
czlonkowski
66f5d74e42 feat: implement node parser and property extractor with versioned node support 2025-06-12 18:45:20 +02:00
czlonkowski
8bf670c31e feat: Implement n8n-MCP Enhancement Plan v2.1 Final
- Implement simple node loader supporting n8n-nodes-base and langchain packages
- Create parser handling declarative, programmatic, and versioned nodes
- Build documentation mapper with 89% coverage (405/457 nodes)
- Setup SQLite database with minimal schema
- Create rebuild script for one-command database updates
- Implement validation script for critical nodes
- Update MCP server with documentation-focused tools
- Add npm scripts for streamlined workflow

Successfully loads 457/458 nodes with accurate documentation mapping.
Versioned node detection working (46 nodes detected).
3/4 critical nodes pass validation tests.

Known limitations:
- Slack operations extraction incomplete for some versioned nodes
- One langchain node fails due to missing dependency
- No AI tools detected (none have usableAsTool flag)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-12 14:18:19 +02:00