@path58/n8n-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_INSTALL.md +223 -0
- package/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js +465 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js +495 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js +639 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js +449 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js +575 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js +431 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js +356 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js +618 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js +1475 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js +716 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js +336 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/types.js +29 -0
- package/dist/autofix/suggestion-fixers/types.js.map +1 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js +197 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js.map +1 -0
- package/dist/classification/certification-engine.js +208 -0
- package/dist/classification/certification-engine.js.map +1 -0
- package/dist/classification/feedback-collector.js +516 -0
- package/dist/classification/feedback-collector.js.map +1 -0
- package/dist/classification/l5-parameter-analyzer.js +670 -0
- package/dist/classification/l5-parameter-analyzer.js.map +1 -0
- package/dist/classification/l6-graph-analyzer.js +613 -0
- package/dist/classification/l6-graph-analyzer.js.map +1 -0
- package/dist/classification/severity-classifier.js +237 -0
- package/dist/classification/severity-classifier.js.map +1 -0
- package/dist/config/env.js +280 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/env.schema.js +234 -0
- package/dist/config/env.schema.js.map +1 -0
- package/dist/config/scraperEnv.js +55 -0
- package/dist/config/scraperEnv.js.map +1 -0
- package/dist/db/postgresClient.js +38 -0
- package/dist/db/postgresClient.js.map +1 -0
- package/dist/db/scraperDb.js +6 -0
- package/dist/db/scraperDb.js.map +1 -0
- package/dist/db/scraperPostgresClient.js +118 -0
- package/dist/db/scraperPostgresClient.js.map +1 -0
- package/dist/db/validationRepository.js +55 -0
- package/dist/db/validationRepository.js.map +1 -0
- package/dist/db/validatorPostgresClient.js +248 -0
- package/dist/db/validatorPostgresClient.js.map +1 -0
- package/dist/db/workflowInstanceMappingRepository.js +128 -0
- package/dist/db/workflowInstanceMappingRepository.js.map +1 -0
- package/dist/errors/AppError.js +156 -0
- package/dist/errors/AppError.js.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/factory/error-to-problem-mappers.js +385 -0
- package/dist/factory/error-to-problem-mappers.js.map +1 -0
- package/dist/factory/gap-recorder.js +260 -0
- package/dist/factory/gap-recorder.js.map +1 -0
- package/dist/factory/problem-recorder.js +94 -0
- package/dist/factory/problem-recorder.js.map +1 -0
- package/dist/factory/warning-to-gap-mappers.js +493 -0
- package/dist/factory/warning-to-gap-mappers.js.map +1 -0
- package/dist/factory/workflow-normalizer.js +247 -0
- package/dist/factory/workflow-normalizer.js.map +1 -0
- package/dist/mcp/adapters/catalog.js +13 -0
- package/dist/mcp/adapters/catalog.js.map +1 -0
- package/dist/mcp/adapters/index.js +36 -0
- package/dist/mcp/adapters/index.js.map +1 -0
- package/dist/mcp/adapters/supabase-catalog.js +467 -0
- package/dist/mcp/adapters/supabase-catalog.js.map +1 -0
- package/dist/mcp/adapters/test-catalog-adapter.js +100 -0
- package/dist/mcp/adapters/test-catalog-adapter.js.map +1 -0
- package/dist/mcp/adapters/validation.js +258 -0
- package/dist/mcp/adapters/validation.js.map +1 -0
- package/dist/mcp/build-email-workflow.js +113 -0
- package/dist/mcp/build-email-workflow.js.map +1 -0
- package/dist/mcp/config.js +22 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/formatters/errors.js +217 -0
- package/dist/mcp/formatters/errors.js.map +1 -0
- package/dist/mcp/formatters/index.js +12 -0
- package/dist/mcp/formatters/index.js.map +1 -0
- package/dist/mcp/formatters/response.js +141 -0
- package/dist/mcp/formatters/response.js.map +1 -0
- package/dist/mcp/quick-test.js +33 -0
- package/dist/mcp/quick-test.js.map +1 -0
- package/dist/mcp/server.js +70 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/test-mcp-error.js +81 -0
- package/dist/mcp/test-mcp-error.js.map +1 -0
- package/dist/mcp/test-mcp.js +80 -0
- package/dist/mcp/test-mcp.js.map +1 -0
- package/dist/mcp/tools/fixes/expression-fixes.js +166 -0
- package/dist/mcp/tools/fixes/expression-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/flow-fixes.js +155 -0
- package/dist/mcp/tools/fixes/flow-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/index.js +91 -0
- package/dist/mcp/tools/fixes/index.js.map +1 -0
- package/dist/mcp/tools/fixes/node-fixes.js +233 -0
- package/dist/mcp/tools/fixes/node-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js +277 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/types.js +10 -0
- package/dist/mcp/tools/fixes/types.js.map +1 -0
- package/dist/mcp/tools/handlers/check-parameter.js +300 -0
- package/dist/mcp/tools/handlers/check-parameter.js.map +1 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js +121 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js.map +1 -0
- package/dist/mcp/tools/handlers/get-node-info.js +131 -0
- package/dist/mcp/tools/handlers/get-node-info.js.map +1 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js +141 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js.map +1 -0
- package/dist/mcp/tools/handlers/list-nodes.js +126 -0
- package/dist/mcp/tools/handlers/list-nodes.js.map +1 -0
- package/dist/mcp/tools/handlers/list-operations.js +138 -0
- package/dist/mcp/tools/handlers/list-operations.js.map +1 -0
- package/dist/mcp/tools/handlers/suggest-fix.js +120 -0
- package/dist/mcp/tools/handlers/suggest-fix.js.map +1 -0
- package/dist/mcp/tools/handlers/validate-workflow.js +92 -0
- package/dist/mcp/tools/handlers/validate-workflow.js.map +1 -0
- package/dist/mcp/tools/index.js +190 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/schemas.js +195 -0
- package/dist/mcp/tools/schemas.js.map +1 -0
- package/dist/mcp/tools/validate.js +95 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/types/mcp.js +7 -0
- package/dist/mcp/types/mcp.js.map +1 -0
- package/dist/mcp/utils/timeout.js +78 -0
- package/dist/mcp/utils/timeout.js.map +1 -0
- package/dist/services/BatchProcessor.js +433 -0
- package/dist/services/BatchProcessor.js.map +1 -0
- package/dist/services/CheckpointManager.js +281 -0
- package/dist/services/CheckpointManager.js.map +1 -0
- package/dist/services/CostCalculator.js +211 -0
- package/dist/services/CostCalculator.js.map +1 -0
- package/dist/services/EmbeddingCache.js +68 -0
- package/dist/services/EmbeddingCache.js.map +1 -0
- package/dist/services/EmbeddingService.js +143 -0
- package/dist/services/EmbeddingService.js.map +1 -0
- package/dist/services/RankingService.js +81 -0
- package/dist/services/RankingService.js.map +1 -0
- package/dist/services/RedisCache.js +376 -0
- package/dist/services/RedisCache.js.map +1 -0
- package/dist/services/RedisCatalogCache.js +680 -0
- package/dist/services/RedisCatalogCache.js.map +1 -0
- package/dist/services/ResumeManager.js +252 -0
- package/dist/services/ResumeManager.js.map +1 -0
- package/dist/services/SearchService.js +282 -0
- package/dist/services/SearchService.js.map +1 -0
- package/dist/services/SemanticCatalogSearch.js +405 -0
- package/dist/services/SemanticCatalogSearch.js.map +1 -0
- package/dist/services/ValidationCache.js +157 -0
- package/dist/services/ValidationCache.js.map +1 -0
- package/dist/services/WorkflowPipelineService.js +1997 -0
- package/dist/services/WorkflowPipelineService.js.map +1 -0
- package/dist/services/catalog/index.js +34 -0
- package/dist/services/catalog/index.js.map +1 -0
- package/dist/services/catalog/interfaces.js +17 -0
- package/dist/services/catalog/interfaces.js.map +1 -0
- package/dist/services/catalog/loaders.js +169 -0
- package/dist/services/catalog/loaders.js.map +1 -0
- package/dist/services/catalog/types.js +138 -0
- package/dist/services/catalog/types.js.map +1 -0
- package/dist/services/documentation-normalization/docUrlUtils.js +88 -0
- package/dist/services/documentation-normalization/docUrlUtils.js.map +1 -0
- package/dist/services/error-quality/ErrorQualityService.js +262 -0
- package/dist/services/error-quality/ErrorQualityService.js.map +1 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js +260 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js.map +1 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js +380 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js.map +1 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js +267 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js.map +1 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js +963 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js.map +1 -0
- package/dist/services/error-quality/index.js +25 -0
- package/dist/services/error-quality/index.js.map +1 -0
- package/dist/services/error-quality/reports/ReportGenerator.js +343 -0
- package/dist/services/error-quality/reports/ReportGenerator.js.map +1 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js +698 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js.map +1 -0
- package/dist/services/error-quality/types.js +11 -0
- package/dist/services/error-quality/types.js.map +1 -0
- package/dist/services/progress/ProgressTracker.js +288 -0
- package/dist/services/progress/ProgressTracker.js.map +1 -0
- package/dist/services/progress/formatters.js +122 -0
- package/dist/services/progress/formatters.js.map +1 -0
- package/dist/services/progress/index.js +36 -0
- package/dist/services/progress/index.js.map +1 -0
- package/dist/services/progress/types.js +7 -0
- package/dist/services/progress/types.js.map +1 -0
- package/dist/services/search/embeddingGenerator.js +112 -0
- package/dist/services/search/embeddingGenerator.js.map +1 -0
- package/dist/types/aiCapabilities.js +7 -0
- package/dist/types/aiCapabilities.js.map +1 -0
- package/dist/types/aiConfigSchema.js +7 -0
- package/dist/types/aiConfigSchema.js.map +1 -0
- package/dist/utils/bannerLogger.js +186 -0
- package/dist/utils/bannerLogger.js.map +1 -0
- package/dist/utils/bannerService.js +23 -0
- package/dist/utils/bannerService.js.map +1 -0
- package/dist/utils/bannerServiceAdapter.js +54 -0
- package/dist/utils/bannerServiceAdapter.js.map +1 -0
- package/dist/utils/batchLogger.js +171 -0
- package/dist/utils/batchLogger.js.map +1 -0
- package/dist/utils/bottomStickyBanner.js +239 -0
- package/dist/utils/bottomStickyBanner.js.map +1 -0
- package/dist/utils/credentialMatcher.js +206 -0
- package/dist/utils/credentialMatcher.js.map +1 -0
- package/dist/utils/credentialNormalizer.js +442 -0
- package/dist/utils/credentialNormalizer.js.map +1 -0
- package/dist/utils/integratedBannerLogger.js +59 -0
- package/dist/utils/integratedBannerLogger.js.map +1 -0
- package/dist/utils/n8nSourceGit.js +195 -0
- package/dist/utils/n8nSourceGit.js.map +1 -0
- package/dist/utils/nodeTypeNormalizer.js +131 -0
- package/dist/utils/nodeTypeNormalizer.js.map +1 -0
- package/dist/utils/openaiClient.js +397 -0
- package/dist/utils/openaiClient.js.map +1 -0
- package/dist/utils/productionLogger.js +16 -0
- package/dist/utils/productionLogger.js.map +1 -0
- package/dist/utils/progressBarBanner.js +132 -0
- package/dist/utils/progressBarBanner.js.map +1 -0
- package/dist/utils/scriptHeartbeat.js +117 -0
- package/dist/utils/scriptHeartbeat.js.map +1 -0
- package/dist/utils/scriptLogger.js +125 -0
- package/dist/utils/scriptLogger.js.map +1 -0
- package/dist/utils/scriptRunner.js +95 -0
- package/dist/utils/scriptRunner.js.map +1 -0
- package/dist/utils/scriptTimeout.js +128 -0
- package/dist/utils/scriptTimeout.js.map +1 -0
- package/dist/utils/scriptWrapper.js +219 -0
- package/dist/utils/scriptWrapper.js.map +1 -0
- package/dist/utils/stickyBanner.js +226 -0
- package/dist/utils/stickyBanner.js.map +1 -0
- package/dist/utils/terminalSpinner.js +97 -0
- package/dist/utils/terminalSpinner.js.map +1 -0
- package/dist/utils/threeLineBanner.js +427 -0
- package/dist/utils/threeLineBanner.js.map +1 -0
- package/dist/utils/validatorCheckpointManager.js +170 -0
- package/dist/utils/validatorCheckpointManager.js.map +1 -0
- package/dist/utils/validatorConnectionManager.js +124 -0
- package/dist/utils/validatorConnectionManager.js.map +1 -0
- package/dist/validation/catalog.js +56 -0
- package/dist/validation/catalog.js.map +1 -0
- package/dist/validation/config/deprecated-nodes.js +234 -0
- package/dist/validation/config/deprecated-nodes.js.map +1 -0
- package/dist/validation/config/l6-severity.js +227 -0
- package/dist/validation/config/l6-severity.js.map +1 -0
- package/dist/validation/config/terminal-nodes.js +132 -0
- package/dist/validation/config/terminal-nodes.js.map +1 -0
- package/dist/validation/config/unreachable-nodes.js +67 -0
- package/dist/validation/config/unreachable-nodes.js.map +1 -0
- package/dist/validation/core.js +47 -0
- package/dist/validation/core.js.map +1 -0
- package/dist/validation/docExtraction.js +12 -0
- package/dist/validation/docExtraction.js.map +1 -0
- package/dist/validation/dryRunMockRunner.js +128 -0
- package/dist/validation/dryRunMockRunner.js.map +1 -0
- package/dist/validation/fixtureEngine.js +61 -0
- package/dist/validation/fixtureEngine.js.map +1 -0
- package/dist/validation/index.js +15 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/k-levels/k2-blockers.js +222 -0
- package/dist/validation/k-levels/k2-blockers.js.map +1 -0
- package/dist/validation/l1-structure.js +296 -0
- package/dist/validation/l1-structure.js.map +1 -0
- package/dist/validation/l2-nodes.js +282 -0
- package/dist/validation/l2-nodes.js.map +1 -0
- package/dist/validation/l3-credentials.js +322 -0
- package/dist/validation/l3-credentials.js.map +1 -0
- package/dist/validation/l4-connections.js +698 -0
- package/dist/validation/l4-connections.js.map +1 -0
- package/dist/validation/l5-parameters.js +803 -0
- package/dist/validation/l5-parameters.js.map +1 -0
- package/dist/validation/l6-checks/ai-tool-variants.js +407 -0
- package/dist/validation/l6-checks/ai-tool-variants.js.map +1 -0
- package/dist/validation/l6-checks/catalog-checks.js +260 -0
- package/dist/validation/l6-checks/catalog-checks.js.map +1 -0
- package/dist/validation/l6-checks/data-contracts.js +197 -0
- package/dist/validation/l6-checks/data-contracts.js.map +1 -0
- package/dist/validation/l6-checks/deprecation.js +133 -0
- package/dist/validation/l6-checks/deprecation.js.map +1 -0
- package/dist/validation/l6-checks/error-handling.js +193 -0
- package/dist/validation/l6-checks/error-handling.js.map +1 -0
- package/dist/validation/l6-checks/expression-syntax.js +387 -0
- package/dist/validation/l6-checks/expression-syntax.js.map +1 -0
- package/dist/validation/l6-checks/flow-integrity.js +504 -0
- package/dist/validation/l6-checks/flow-integrity.js.map +1 -0
- package/dist/validation/l6-checks/index.js +106 -0
- package/dist/validation/l6-checks/index.js.map +1 -0
- package/dist/validation/l6-checks/loops.js +370 -0
- package/dist/validation/l6-checks/loops.js.map +1 -0
- package/dist/validation/l6-checks/performance.js +182 -0
- package/dist/validation/l6-checks/performance.js.map +1 -0
- package/dist/validation/l6-checks/security.js +273 -0
- package/dist/validation/l6-checks/security.js.map +1 -0
- package/dist/validation/l6-patterns.js +472 -0
- package/dist/validation/l6-patterns.js.map +1 -0
- package/dist/validation/mockLevelResolver.js +95 -0
- package/dist/validation/mockLevelResolver.js.map +1 -0
- package/dist/validation/n8nApiClient.js +21 -0
- package/dist/validation/n8nApiClient.js.map +1 -0
- package/dist/validation/n8nCli.js +87 -0
- package/dist/validation/n8nCli.js.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/usageStats.js +82 -0
- package/dist/validation/usageStats.js.map +1 -0
- package/package.json +274 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* n8n Source Git Utilities
|
|
3
|
+
* -------------------------
|
|
4
|
+
*
|
|
5
|
+
* Utilities for working with the n8n source repository.
|
|
6
|
+
* Provides git operations and commit information.
|
|
7
|
+
*
|
|
8
|
+
* Created: January 1, 2026
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
/**
|
|
14
|
+
* Get the path to the n8n source repository
|
|
15
|
+
*
|
|
16
|
+
* @returns Path to n8n source directory
|
|
17
|
+
*/
|
|
18
|
+
export function getN8nSourcePath() {
|
|
19
|
+
const envPath = process.env.N8N_SOURCE_PATH;
|
|
20
|
+
if (envPath && fs.existsSync(envPath)) {
|
|
21
|
+
return envPath;
|
|
22
|
+
}
|
|
23
|
+
// Default: assume n8n source is in a sibling directory
|
|
24
|
+
const defaultPath = path.resolve(process.cwd(), '..', 'n8n');
|
|
25
|
+
if (fs.existsSync(defaultPath)) {
|
|
26
|
+
return defaultPath;
|
|
27
|
+
}
|
|
28
|
+
throw new Error('n8n source path not found. Set N8N_SOURCE_PATH environment variable.');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if n8n source repository has uncommitted changes
|
|
32
|
+
*
|
|
33
|
+
* @returns True if repository has uncommitted changes
|
|
34
|
+
*/
|
|
35
|
+
export function isN8nSourceDirty() {
|
|
36
|
+
try {
|
|
37
|
+
const n8nPath = getN8nSourcePath();
|
|
38
|
+
const result = execSync('git status --porcelain', {
|
|
39
|
+
cwd: n8nPath,
|
|
40
|
+
encoding: 'utf-8',
|
|
41
|
+
});
|
|
42
|
+
return result.trim().length > 0;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('Error checking n8n source git status:', error);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the current commit hash of n8n source
|
|
51
|
+
*
|
|
52
|
+
* @returns Commit hash
|
|
53
|
+
*/
|
|
54
|
+
export function getN8nSourceCommit() {
|
|
55
|
+
try {
|
|
56
|
+
const n8nPath = getN8nSourcePath();
|
|
57
|
+
return execSync('git rev-parse HEAD', {
|
|
58
|
+
cwd: n8nPath,
|
|
59
|
+
encoding: 'utf-8',
|
|
60
|
+
}).trim();
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new Error(`Failed to get n8n source commit: ${error}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the commit date of n8n source
|
|
68
|
+
*
|
|
69
|
+
* @param commit - Optional commit hash (defaults to HEAD)
|
|
70
|
+
* @returns Commit date
|
|
71
|
+
*/
|
|
72
|
+
export function getN8nSourceCommitDate(commit) {
|
|
73
|
+
try {
|
|
74
|
+
const n8nPath = getN8nSourcePath();
|
|
75
|
+
const timestamp = execSync('git log -1 --format=%ct', {
|
|
76
|
+
cwd: n8nPath,
|
|
77
|
+
encoding: 'utf-8',
|
|
78
|
+
}).trim();
|
|
79
|
+
return new Date(parseInt(timestamp) * 1000);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new Error(`Failed to get n8n source commit date: ${error}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the current branch of n8n source
|
|
87
|
+
*
|
|
88
|
+
* @returns Branch name
|
|
89
|
+
*/
|
|
90
|
+
export function getN8nSourceBranch() {
|
|
91
|
+
try {
|
|
92
|
+
const n8nPath = getN8nSourcePath();
|
|
93
|
+
return execSync('git rev-parse --abbrev-ref HEAD', {
|
|
94
|
+
cwd: n8nPath,
|
|
95
|
+
encoding: 'utf-8',
|
|
96
|
+
}).trim();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new Error(`Failed to get n8n source branch: ${error}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the commit message of the current commit
|
|
104
|
+
*
|
|
105
|
+
* @param commit - Optional commit hash (defaults to HEAD)
|
|
106
|
+
* @returns Commit message
|
|
107
|
+
*/
|
|
108
|
+
export function getN8nSourceCommitMessage(commit) {
|
|
109
|
+
try {
|
|
110
|
+
const n8nPath = getN8nSourcePath();
|
|
111
|
+
const commitRef = commit || 'HEAD';
|
|
112
|
+
return execSync(`git log -1 --format=%s ${commitRef}`, {
|
|
113
|
+
cwd: n8nPath,
|
|
114
|
+
encoding: 'utf-8',
|
|
115
|
+
}).trim();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
throw new Error(`Failed to get n8n source commit message: ${error}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get full commit information
|
|
123
|
+
*
|
|
124
|
+
* @returns Commit information object
|
|
125
|
+
*/
|
|
126
|
+
export function getN8nSourceCommitInfo() {
|
|
127
|
+
try {
|
|
128
|
+
const n8nPath = getN8nSourcePath();
|
|
129
|
+
const hash = execSync('git rev-parse HEAD', {
|
|
130
|
+
cwd: n8nPath,
|
|
131
|
+
encoding: 'utf-8',
|
|
132
|
+
}).trim();
|
|
133
|
+
const timestamp = execSync('git log -1 --format=%ct', {
|
|
134
|
+
cwd: n8nPath,
|
|
135
|
+
encoding: 'utf-8',
|
|
136
|
+
}).trim();
|
|
137
|
+
const message = execSync('git log -1 --format=%s', {
|
|
138
|
+
cwd: n8nPath,
|
|
139
|
+
encoding: 'utf-8',
|
|
140
|
+
}).trim();
|
|
141
|
+
const author = execSync('git log -1 --format=%an', {
|
|
142
|
+
cwd: n8nPath,
|
|
143
|
+
encoding: 'utf-8',
|
|
144
|
+
}).trim();
|
|
145
|
+
const date = new Date(parseInt(timestamp) * 1000);
|
|
146
|
+
return {
|
|
147
|
+
hash,
|
|
148
|
+
date,
|
|
149
|
+
message,
|
|
150
|
+
author,
|
|
151
|
+
// Additional properties for test compatibility
|
|
152
|
+
commitHash: hash,
|
|
153
|
+
commitDate: date,
|
|
154
|
+
commitMessage: message,
|
|
155
|
+
branch: getN8nSourceBranch(),
|
|
156
|
+
isDirty: isN8nSourceDirty(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
throw new Error(`Failed to get n8n source commit info: ${error}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Verify that a commit exists in the repository
|
|
165
|
+
*
|
|
166
|
+
* @param commit - Commit hash to verify
|
|
167
|
+
* @returns True if commit exists
|
|
168
|
+
*/
|
|
169
|
+
export function verifyCommitExists(commit) {
|
|
170
|
+
try {
|
|
171
|
+
const n8nPath = getN8nSourcePath();
|
|
172
|
+
execSync(`git cat-file -e ${commit}`, {
|
|
173
|
+
cwd: n8nPath,
|
|
174
|
+
stdio: 'ignore',
|
|
175
|
+
});
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* n8n Source Git utilities object
|
|
184
|
+
*/
|
|
185
|
+
export const n8nSourceGit = {
|
|
186
|
+
getN8nSourcePath,
|
|
187
|
+
isN8nSourceDirty,
|
|
188
|
+
getN8nSourceCommit,
|
|
189
|
+
getN8nSourceCommitDate,
|
|
190
|
+
getN8nSourceBranch,
|
|
191
|
+
getN8nSourceCommitMessage,
|
|
192
|
+
getN8nSourceCommitInfo,
|
|
193
|
+
verifyCommitExists,
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=n8nSourceGit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n8nSourceGit.js","sourceRoot":"","sources":["../../src/utils/n8nSourceGit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Type Normalization Utility
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Provide consistent node type normalization across the codebase
|
|
5
|
+
* to handle case-sensitivity mismatches between workflow node types and catalog node types.
|
|
6
|
+
*
|
|
7
|
+
* Problem:
|
|
8
|
+
* - Catalog stores: n8n-nodes-base.httprequest (lowercase)
|
|
9
|
+
* - Workflows use: n8n-nodes-base.httpRequest (camelCase)
|
|
10
|
+
*
|
|
11
|
+
* Solution:
|
|
12
|
+
* - Normalize all node types to lowercase for comparison
|
|
13
|
+
* - Maintain original casing for display/storage
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes a node type string for comparison purposes.
|
|
17
|
+
*
|
|
18
|
+
* Rules:
|
|
19
|
+
* - Remove @n8n/ prefix (workflows use it, catalog doesn't)
|
|
20
|
+
* - Convert to lowercase
|
|
21
|
+
* - Trim whitespace
|
|
22
|
+
* - Preserve structure (dots, dashes, etc.)
|
|
23
|
+
*
|
|
24
|
+
* @param nodeType - The node type to normalize (e.g., "@n8n/n8n-nodes-langchain.vectorStoreRedis")
|
|
25
|
+
* @returns Normalized node type (e.g., "n8n-nodes-langchain.vectorstoreredis")
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* normalizeNodeType("n8n-nodes-base.httpRequest") // "n8n-nodes-base.httprequest"
|
|
29
|
+
* normalizeNodeType("@n8n/n8n-nodes-langchain.vectorStoreRedis") // "n8n-nodes-langchain.vectorstoreredis"
|
|
30
|
+
* normalizeNodeType("n8n-nodes-base.stopAndError") // "n8n-nodes-base.stopanderror"
|
|
31
|
+
*/
|
|
32
|
+
export function normalizeNodeType(nodeType) {
|
|
33
|
+
if (!nodeType) {
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
// Remove @n8n/ prefix if present (workflows use it, catalog doesn't)
|
|
37
|
+
let normalized = nodeType.replace(/^@n8n\//, '');
|
|
38
|
+
// Convert to lowercase and trim
|
|
39
|
+
normalized = normalized.toLowerCase().trim();
|
|
40
|
+
// Canonicalize common alias: `nodes-*` → `n8n-nodes-*`
|
|
41
|
+
// Some sources (including tests) use `@n8n/nodes-langchain.*` while the catalog/whitelists use
|
|
42
|
+
// `n8n-nodes-langchain.*`. This keeps comparisons and DB lookups stable.
|
|
43
|
+
if (normalized.startsWith('nodes-')) {
|
|
44
|
+
normalized = `n8n-${normalized}`;
|
|
45
|
+
}
|
|
46
|
+
return normalized;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Checks if two node types match (case-insensitive).
|
|
50
|
+
*
|
|
51
|
+
* @param type1 - First node type
|
|
52
|
+
* @param type2 - Second node type
|
|
53
|
+
* @returns True if the normalized types match
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* nodeTypesMatch("n8n-nodes-base.httpRequest", "n8n-nodes-base.httprequest") // true
|
|
57
|
+
*/
|
|
58
|
+
export function nodeTypesMatch(type1, type2) {
|
|
59
|
+
return normalizeNodeType(type1) === normalizeNodeType(type2);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Creates a normalized map from an array of node types.
|
|
63
|
+
* Maps normalized -> original for lookup purposes.
|
|
64
|
+
*
|
|
65
|
+
* @param nodeTypes - Array of node type strings
|
|
66
|
+
* @returns Map of normalized -> original node type
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* const map = createNormalizedMap(["n8n-nodes-base.httprequest", "n8n-nodes-base.googlesheets"]);
|
|
70
|
+
* map.get("n8n-nodes-base.httprequest") // "n8n-nodes-base.httprequest"
|
|
71
|
+
* map.get("n8n-nodes-base.httprequest") // "n8n-nodes-base.httprequest" (exact match)
|
|
72
|
+
*/
|
|
73
|
+
export function createNormalizedMap(nodeTypes) {
|
|
74
|
+
const map = new Map();
|
|
75
|
+
nodeTypes.forEach(nodeType => {
|
|
76
|
+
const normalized = normalizeNodeType(nodeType);
|
|
77
|
+
// Keep first occurrence if duplicates exist
|
|
78
|
+
if (!map.has(normalized)) {
|
|
79
|
+
map.set(normalized, nodeType);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return map;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Finds a catalog match for a workflow node type.
|
|
86
|
+
*
|
|
87
|
+
* @param workflowNodeType - Node type from workflow
|
|
88
|
+
* @param catalogNodeTypesExact - Set of exact catalog node types
|
|
89
|
+
* @param catalogNodeTypesNormalized - Map of normalized -> original catalog node types
|
|
90
|
+
* @returns The matching catalog node type, or null if not found
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const exact = new Set(["n8n-nodes-base.httprequest"]);
|
|
94
|
+
* const normalized = createNormalizedMap(["n8n-nodes-base.httprequest"]);
|
|
95
|
+
* findCatalogMatch("n8n-nodes-base.httpRequest", exact, normalized) // "n8n-nodes-base.httprequest"
|
|
96
|
+
*/
|
|
97
|
+
export function findCatalogMatch(workflowNodeType, catalogNodeTypesExact, catalogNodeTypesNormalized) {
|
|
98
|
+
// First try exact match
|
|
99
|
+
if (catalogNodeTypesExact.has(workflowNodeType)) {
|
|
100
|
+
return workflowNodeType;
|
|
101
|
+
}
|
|
102
|
+
// Then try case-insensitive match
|
|
103
|
+
const normalized = normalizeNodeType(workflowNodeType);
|
|
104
|
+
if (catalogNodeTypesNormalized.has(normalized)) {
|
|
105
|
+
return catalogNodeTypesNormalized.get(normalized);
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Checks if a node type exists in the catalog (case-insensitive).
|
|
111
|
+
*
|
|
112
|
+
* @param nodeType - Node type to check
|
|
113
|
+
* @param catalogNodeTypesExact - Set of exact catalog node types
|
|
114
|
+
* @param catalogNodeTypesNormalized - Map of normalized -> original catalog node types
|
|
115
|
+
* @returns True if the node type exists in catalog
|
|
116
|
+
*/
|
|
117
|
+
export function isNodeTypeInCatalog(nodeType, catalogNodeTypesExact, catalogNodeTypesNormalized) {
|
|
118
|
+
return findCatalogMatch(nodeType, catalogNodeTypesExact, catalogNodeTypesNormalized) !== null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Creates catalog lookup structures from database results.
|
|
122
|
+
*
|
|
123
|
+
* @param catalogRows - Array of rows with node_type field
|
|
124
|
+
* @returns Object with exact set and normalized map
|
|
125
|
+
*/
|
|
126
|
+
export function createCatalogLookup(catalogRows) {
|
|
127
|
+
const exact = new Set(catalogRows.map(r => r.node_type));
|
|
128
|
+
const normalized = createNormalizedMap(catalogRows.map(r => r.node_type));
|
|
129
|
+
return { exact, normalized };
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=nodeTypeNormalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeTypeNormalizer.js","sourceRoot":"","sources":["../../src/utils/nodeTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAmC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,qEAAqE;IACrE,IAAI,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjD,gCAAgC;IAChC,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE7C,uDAAuD;IACvD,+FAA+F;IAC/F,yEAAyE;IACzE,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,UAAU,GAAG,OAAO,UAAU,EAAE,CAAC;IACnC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgC,EAAE,KAAgC;IAC/F,OAAO,iBAAiB,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAmB;IACrD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC3B,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/C,4CAA4C;QAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAC9B,gBAAwB,EACxB,qBAAkC,EAClC,0BAA+C;IAE/C,wBAAwB;IACxB,IAAI,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,kCAAkC;IAClC,MAAM,UAAU,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,OAAO,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,qBAAkC,EAClC,0BAA+C;IAE/C,OAAO,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,0BAA0B,CAAC,KAAK,IAAI,CAAC;AAChG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAgB;IAKhB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC"}
|