@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.
Files changed (319) hide show
  1. package/AGENT_INSTALL.md +223 -0
  2. package/CHANGELOG.md +38 -0
  3. package/LICENSE +21 -0
  4. package/README.md +187 -0
  5. package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js +465 -0
  6. package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js.map +1 -0
  7. package/dist/autofix/suggestion-fixers/fixer-registry.js +495 -0
  8. package/dist/autofix/suggestion-fixers/fixer-registry.js.map +1 -0
  9. package/dist/autofix/suggestion-fixers/l1-structure-fixer.js +639 -0
  10. package/dist/autofix/suggestion-fixers/l1-structure-fixer.js.map +1 -0
  11. package/dist/autofix/suggestion-fixers/l4-connection-fixer.js +449 -0
  12. package/dist/autofix/suggestion-fixers/l4-connection-fixer.js.map +1 -0
  13. package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js +575 -0
  14. package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js.map +1 -0
  15. package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js +431 -0
  16. package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js.map +1 -0
  17. package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js +356 -0
  18. package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js.map +1 -0
  19. package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js +618 -0
  20. package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js.map +1 -0
  21. package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js +1475 -0
  22. package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js.map +1 -0
  23. package/dist/autofix/suggestion-fixers/llm-fixer.js +716 -0
  24. package/dist/autofix/suggestion-fixers/llm-fixer.js.map +1 -0
  25. package/dist/autofix/suggestion-fixers/missing-credential-fixer.js +336 -0
  26. package/dist/autofix/suggestion-fixers/missing-credential-fixer.js.map +1 -0
  27. package/dist/autofix/suggestion-fixers/types.js +29 -0
  28. package/dist/autofix/suggestion-fixers/types.js.map +1 -0
  29. package/dist/autofix/suggestion-fixers/typo-fixer.js +197 -0
  30. package/dist/autofix/suggestion-fixers/typo-fixer.js.map +1 -0
  31. package/dist/classification/certification-engine.js +208 -0
  32. package/dist/classification/certification-engine.js.map +1 -0
  33. package/dist/classification/feedback-collector.js +516 -0
  34. package/dist/classification/feedback-collector.js.map +1 -0
  35. package/dist/classification/l5-parameter-analyzer.js +670 -0
  36. package/dist/classification/l5-parameter-analyzer.js.map +1 -0
  37. package/dist/classification/l6-graph-analyzer.js +613 -0
  38. package/dist/classification/l6-graph-analyzer.js.map +1 -0
  39. package/dist/classification/severity-classifier.js +237 -0
  40. package/dist/classification/severity-classifier.js.map +1 -0
  41. package/dist/config/env.js +280 -0
  42. package/dist/config/env.js.map +1 -0
  43. package/dist/config/env.schema.js +234 -0
  44. package/dist/config/env.schema.js.map +1 -0
  45. package/dist/config/scraperEnv.js +55 -0
  46. package/dist/config/scraperEnv.js.map +1 -0
  47. package/dist/db/postgresClient.js +38 -0
  48. package/dist/db/postgresClient.js.map +1 -0
  49. package/dist/db/scraperDb.js +6 -0
  50. package/dist/db/scraperDb.js.map +1 -0
  51. package/dist/db/scraperPostgresClient.js +118 -0
  52. package/dist/db/scraperPostgresClient.js.map +1 -0
  53. package/dist/db/validationRepository.js +55 -0
  54. package/dist/db/validationRepository.js.map +1 -0
  55. package/dist/db/validatorPostgresClient.js +248 -0
  56. package/dist/db/validatorPostgresClient.js.map +1 -0
  57. package/dist/db/workflowInstanceMappingRepository.js +128 -0
  58. package/dist/db/workflowInstanceMappingRepository.js.map +1 -0
  59. package/dist/errors/AppError.js +156 -0
  60. package/dist/errors/AppError.js.map +1 -0
  61. package/dist/errors/index.js +7 -0
  62. package/dist/errors/index.js.map +1 -0
  63. package/dist/factory/error-to-problem-mappers.js +385 -0
  64. package/dist/factory/error-to-problem-mappers.js.map +1 -0
  65. package/dist/factory/gap-recorder.js +260 -0
  66. package/dist/factory/gap-recorder.js.map +1 -0
  67. package/dist/factory/problem-recorder.js +94 -0
  68. package/dist/factory/problem-recorder.js.map +1 -0
  69. package/dist/factory/warning-to-gap-mappers.js +493 -0
  70. package/dist/factory/warning-to-gap-mappers.js.map +1 -0
  71. package/dist/factory/workflow-normalizer.js +247 -0
  72. package/dist/factory/workflow-normalizer.js.map +1 -0
  73. package/dist/mcp/adapters/catalog.js +13 -0
  74. package/dist/mcp/adapters/catalog.js.map +1 -0
  75. package/dist/mcp/adapters/index.js +36 -0
  76. package/dist/mcp/adapters/index.js.map +1 -0
  77. package/dist/mcp/adapters/supabase-catalog.js +467 -0
  78. package/dist/mcp/adapters/supabase-catalog.js.map +1 -0
  79. package/dist/mcp/adapters/test-catalog-adapter.js +100 -0
  80. package/dist/mcp/adapters/test-catalog-adapter.js.map +1 -0
  81. package/dist/mcp/adapters/validation.js +258 -0
  82. package/dist/mcp/adapters/validation.js.map +1 -0
  83. package/dist/mcp/build-email-workflow.js +113 -0
  84. package/dist/mcp/build-email-workflow.js.map +1 -0
  85. package/dist/mcp/config.js +22 -0
  86. package/dist/mcp/config.js.map +1 -0
  87. package/dist/mcp/formatters/errors.js +217 -0
  88. package/dist/mcp/formatters/errors.js.map +1 -0
  89. package/dist/mcp/formatters/index.js +12 -0
  90. package/dist/mcp/formatters/index.js.map +1 -0
  91. package/dist/mcp/formatters/response.js +141 -0
  92. package/dist/mcp/formatters/response.js.map +1 -0
  93. package/dist/mcp/quick-test.js +33 -0
  94. package/dist/mcp/quick-test.js.map +1 -0
  95. package/dist/mcp/server.js +70 -0
  96. package/dist/mcp/server.js.map +1 -0
  97. package/dist/mcp/test-mcp-error.js +81 -0
  98. package/dist/mcp/test-mcp-error.js.map +1 -0
  99. package/dist/mcp/test-mcp.js +80 -0
  100. package/dist/mcp/test-mcp.js.map +1 -0
  101. package/dist/mcp/tools/fixes/expression-fixes.js +166 -0
  102. package/dist/mcp/tools/fixes/expression-fixes.js.map +1 -0
  103. package/dist/mcp/tools/fixes/flow-fixes.js +155 -0
  104. package/dist/mcp/tools/fixes/flow-fixes.js.map +1 -0
  105. package/dist/mcp/tools/fixes/index.js +91 -0
  106. package/dist/mcp/tools/fixes/index.js.map +1 -0
  107. package/dist/mcp/tools/fixes/node-fixes.js +233 -0
  108. package/dist/mcp/tools/fixes/node-fixes.js.map +1 -0
  109. package/dist/mcp/tools/fixes/parameter-fixes.js +277 -0
  110. package/dist/mcp/tools/fixes/parameter-fixes.js.map +1 -0
  111. package/dist/mcp/tools/fixes/types.js +10 -0
  112. package/dist/mcp/tools/fixes/types.js.map +1 -0
  113. package/dist/mcp/tools/handlers/check-parameter.js +300 -0
  114. package/dist/mcp/tools/handlers/check-parameter.js.map +1 -0
  115. package/dist/mcp/tools/handlers/find-similar-pattern.js +121 -0
  116. package/dist/mcp/tools/handlers/find-similar-pattern.js.map +1 -0
  117. package/dist/mcp/tools/handlers/get-node-info.js +131 -0
  118. package/dist/mcp/tools/handlers/get-node-info.js.map +1 -0
  119. package/dist/mcp/tools/handlers/get-operation-schema.js +141 -0
  120. package/dist/mcp/tools/handlers/get-operation-schema.js.map +1 -0
  121. package/dist/mcp/tools/handlers/list-nodes.js +126 -0
  122. package/dist/mcp/tools/handlers/list-nodes.js.map +1 -0
  123. package/dist/mcp/tools/handlers/list-operations.js +138 -0
  124. package/dist/mcp/tools/handlers/list-operations.js.map +1 -0
  125. package/dist/mcp/tools/handlers/suggest-fix.js +120 -0
  126. package/dist/mcp/tools/handlers/suggest-fix.js.map +1 -0
  127. package/dist/mcp/tools/handlers/validate-workflow.js +92 -0
  128. package/dist/mcp/tools/handlers/validate-workflow.js.map +1 -0
  129. package/dist/mcp/tools/index.js +190 -0
  130. package/dist/mcp/tools/index.js.map +1 -0
  131. package/dist/mcp/tools/schemas.js +195 -0
  132. package/dist/mcp/tools/schemas.js.map +1 -0
  133. package/dist/mcp/tools/validate.js +95 -0
  134. package/dist/mcp/tools/validate.js.map +1 -0
  135. package/dist/mcp/types/mcp.js +7 -0
  136. package/dist/mcp/types/mcp.js.map +1 -0
  137. package/dist/mcp/utils/timeout.js +78 -0
  138. package/dist/mcp/utils/timeout.js.map +1 -0
  139. package/dist/services/BatchProcessor.js +433 -0
  140. package/dist/services/BatchProcessor.js.map +1 -0
  141. package/dist/services/CheckpointManager.js +281 -0
  142. package/dist/services/CheckpointManager.js.map +1 -0
  143. package/dist/services/CostCalculator.js +211 -0
  144. package/dist/services/CostCalculator.js.map +1 -0
  145. package/dist/services/EmbeddingCache.js +68 -0
  146. package/dist/services/EmbeddingCache.js.map +1 -0
  147. package/dist/services/EmbeddingService.js +143 -0
  148. package/dist/services/EmbeddingService.js.map +1 -0
  149. package/dist/services/RankingService.js +81 -0
  150. package/dist/services/RankingService.js.map +1 -0
  151. package/dist/services/RedisCache.js +376 -0
  152. package/dist/services/RedisCache.js.map +1 -0
  153. package/dist/services/RedisCatalogCache.js +680 -0
  154. package/dist/services/RedisCatalogCache.js.map +1 -0
  155. package/dist/services/ResumeManager.js +252 -0
  156. package/dist/services/ResumeManager.js.map +1 -0
  157. package/dist/services/SearchService.js +282 -0
  158. package/dist/services/SearchService.js.map +1 -0
  159. package/dist/services/SemanticCatalogSearch.js +405 -0
  160. package/dist/services/SemanticCatalogSearch.js.map +1 -0
  161. package/dist/services/ValidationCache.js +157 -0
  162. package/dist/services/ValidationCache.js.map +1 -0
  163. package/dist/services/WorkflowPipelineService.js +1997 -0
  164. package/dist/services/WorkflowPipelineService.js.map +1 -0
  165. package/dist/services/catalog/index.js +34 -0
  166. package/dist/services/catalog/index.js.map +1 -0
  167. package/dist/services/catalog/interfaces.js +17 -0
  168. package/dist/services/catalog/interfaces.js.map +1 -0
  169. package/dist/services/catalog/loaders.js +169 -0
  170. package/dist/services/catalog/loaders.js.map +1 -0
  171. package/dist/services/catalog/types.js +138 -0
  172. package/dist/services/catalog/types.js.map +1 -0
  173. package/dist/services/documentation-normalization/docUrlUtils.js +88 -0
  174. package/dist/services/documentation-normalization/docUrlUtils.js.map +1 -0
  175. package/dist/services/error-quality/ErrorQualityService.js +262 -0
  176. package/dist/services/error-quality/ErrorQualityService.js.map +1 -0
  177. package/dist/services/error-quality/analyzers/CredentialAnalyzer.js +260 -0
  178. package/dist/services/error-quality/analyzers/CredentialAnalyzer.js.map +1 -0
  179. package/dist/services/error-quality/analyzers/IssuePredictor.js +380 -0
  180. package/dist/services/error-quality/analyzers/IssuePredictor.js.map +1 -0
  181. package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js +267 -0
  182. package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js.map +1 -0
  183. package/dist/services/error-quality/data/ErrorPatternSeeder.js +963 -0
  184. package/dist/services/error-quality/data/ErrorPatternSeeder.js.map +1 -0
  185. package/dist/services/error-quality/index.js +25 -0
  186. package/dist/services/error-quality/index.js.map +1 -0
  187. package/dist/services/error-quality/reports/ReportGenerator.js +343 -0
  188. package/dist/services/error-quality/reports/ReportGenerator.js.map +1 -0
  189. package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js +698 -0
  190. package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js.map +1 -0
  191. package/dist/services/error-quality/types.js +11 -0
  192. package/dist/services/error-quality/types.js.map +1 -0
  193. package/dist/services/progress/ProgressTracker.js +288 -0
  194. package/dist/services/progress/ProgressTracker.js.map +1 -0
  195. package/dist/services/progress/formatters.js +122 -0
  196. package/dist/services/progress/formatters.js.map +1 -0
  197. package/dist/services/progress/index.js +36 -0
  198. package/dist/services/progress/index.js.map +1 -0
  199. package/dist/services/progress/types.js +7 -0
  200. package/dist/services/progress/types.js.map +1 -0
  201. package/dist/services/search/embeddingGenerator.js +112 -0
  202. package/dist/services/search/embeddingGenerator.js.map +1 -0
  203. package/dist/types/aiCapabilities.js +7 -0
  204. package/dist/types/aiCapabilities.js.map +1 -0
  205. package/dist/types/aiConfigSchema.js +7 -0
  206. package/dist/types/aiConfigSchema.js.map +1 -0
  207. package/dist/utils/bannerLogger.js +186 -0
  208. package/dist/utils/bannerLogger.js.map +1 -0
  209. package/dist/utils/bannerService.js +23 -0
  210. package/dist/utils/bannerService.js.map +1 -0
  211. package/dist/utils/bannerServiceAdapter.js +54 -0
  212. package/dist/utils/bannerServiceAdapter.js.map +1 -0
  213. package/dist/utils/batchLogger.js +171 -0
  214. package/dist/utils/batchLogger.js.map +1 -0
  215. package/dist/utils/bottomStickyBanner.js +239 -0
  216. package/dist/utils/bottomStickyBanner.js.map +1 -0
  217. package/dist/utils/credentialMatcher.js +206 -0
  218. package/dist/utils/credentialMatcher.js.map +1 -0
  219. package/dist/utils/credentialNormalizer.js +442 -0
  220. package/dist/utils/credentialNormalizer.js.map +1 -0
  221. package/dist/utils/integratedBannerLogger.js +59 -0
  222. package/dist/utils/integratedBannerLogger.js.map +1 -0
  223. package/dist/utils/n8nSourceGit.js +195 -0
  224. package/dist/utils/n8nSourceGit.js.map +1 -0
  225. package/dist/utils/nodeTypeNormalizer.js +131 -0
  226. package/dist/utils/nodeTypeNormalizer.js.map +1 -0
  227. package/dist/utils/openaiClient.js +397 -0
  228. package/dist/utils/openaiClient.js.map +1 -0
  229. package/dist/utils/productionLogger.js +16 -0
  230. package/dist/utils/productionLogger.js.map +1 -0
  231. package/dist/utils/progressBarBanner.js +132 -0
  232. package/dist/utils/progressBarBanner.js.map +1 -0
  233. package/dist/utils/scriptHeartbeat.js +117 -0
  234. package/dist/utils/scriptHeartbeat.js.map +1 -0
  235. package/dist/utils/scriptLogger.js +125 -0
  236. package/dist/utils/scriptLogger.js.map +1 -0
  237. package/dist/utils/scriptRunner.js +95 -0
  238. package/dist/utils/scriptRunner.js.map +1 -0
  239. package/dist/utils/scriptTimeout.js +128 -0
  240. package/dist/utils/scriptTimeout.js.map +1 -0
  241. package/dist/utils/scriptWrapper.js +219 -0
  242. package/dist/utils/scriptWrapper.js.map +1 -0
  243. package/dist/utils/stickyBanner.js +226 -0
  244. package/dist/utils/stickyBanner.js.map +1 -0
  245. package/dist/utils/terminalSpinner.js +97 -0
  246. package/dist/utils/terminalSpinner.js.map +1 -0
  247. package/dist/utils/threeLineBanner.js +427 -0
  248. package/dist/utils/threeLineBanner.js.map +1 -0
  249. package/dist/utils/validatorCheckpointManager.js +170 -0
  250. package/dist/utils/validatorCheckpointManager.js.map +1 -0
  251. package/dist/utils/validatorConnectionManager.js +124 -0
  252. package/dist/utils/validatorConnectionManager.js.map +1 -0
  253. package/dist/validation/catalog.js +56 -0
  254. package/dist/validation/catalog.js.map +1 -0
  255. package/dist/validation/config/deprecated-nodes.js +234 -0
  256. package/dist/validation/config/deprecated-nodes.js.map +1 -0
  257. package/dist/validation/config/l6-severity.js +227 -0
  258. package/dist/validation/config/l6-severity.js.map +1 -0
  259. package/dist/validation/config/terminal-nodes.js +132 -0
  260. package/dist/validation/config/terminal-nodes.js.map +1 -0
  261. package/dist/validation/config/unreachable-nodes.js +67 -0
  262. package/dist/validation/config/unreachable-nodes.js.map +1 -0
  263. package/dist/validation/core.js +47 -0
  264. package/dist/validation/core.js.map +1 -0
  265. package/dist/validation/docExtraction.js +12 -0
  266. package/dist/validation/docExtraction.js.map +1 -0
  267. package/dist/validation/dryRunMockRunner.js +128 -0
  268. package/dist/validation/dryRunMockRunner.js.map +1 -0
  269. package/dist/validation/fixtureEngine.js +61 -0
  270. package/dist/validation/fixtureEngine.js.map +1 -0
  271. package/dist/validation/index.js +15 -0
  272. package/dist/validation/index.js.map +1 -0
  273. package/dist/validation/k-levels/k2-blockers.js +222 -0
  274. package/dist/validation/k-levels/k2-blockers.js.map +1 -0
  275. package/dist/validation/l1-structure.js +296 -0
  276. package/dist/validation/l1-structure.js.map +1 -0
  277. package/dist/validation/l2-nodes.js +282 -0
  278. package/dist/validation/l2-nodes.js.map +1 -0
  279. package/dist/validation/l3-credentials.js +322 -0
  280. package/dist/validation/l3-credentials.js.map +1 -0
  281. package/dist/validation/l4-connections.js +698 -0
  282. package/dist/validation/l4-connections.js.map +1 -0
  283. package/dist/validation/l5-parameters.js +803 -0
  284. package/dist/validation/l5-parameters.js.map +1 -0
  285. package/dist/validation/l6-checks/ai-tool-variants.js +407 -0
  286. package/dist/validation/l6-checks/ai-tool-variants.js.map +1 -0
  287. package/dist/validation/l6-checks/catalog-checks.js +260 -0
  288. package/dist/validation/l6-checks/catalog-checks.js.map +1 -0
  289. package/dist/validation/l6-checks/data-contracts.js +197 -0
  290. package/dist/validation/l6-checks/data-contracts.js.map +1 -0
  291. package/dist/validation/l6-checks/deprecation.js +133 -0
  292. package/dist/validation/l6-checks/deprecation.js.map +1 -0
  293. package/dist/validation/l6-checks/error-handling.js +193 -0
  294. package/dist/validation/l6-checks/error-handling.js.map +1 -0
  295. package/dist/validation/l6-checks/expression-syntax.js +387 -0
  296. package/dist/validation/l6-checks/expression-syntax.js.map +1 -0
  297. package/dist/validation/l6-checks/flow-integrity.js +504 -0
  298. package/dist/validation/l6-checks/flow-integrity.js.map +1 -0
  299. package/dist/validation/l6-checks/index.js +106 -0
  300. package/dist/validation/l6-checks/index.js.map +1 -0
  301. package/dist/validation/l6-checks/loops.js +370 -0
  302. package/dist/validation/l6-checks/loops.js.map +1 -0
  303. package/dist/validation/l6-checks/performance.js +182 -0
  304. package/dist/validation/l6-checks/performance.js.map +1 -0
  305. package/dist/validation/l6-checks/security.js +273 -0
  306. package/dist/validation/l6-checks/security.js.map +1 -0
  307. package/dist/validation/l6-patterns.js +472 -0
  308. package/dist/validation/l6-patterns.js.map +1 -0
  309. package/dist/validation/mockLevelResolver.js +95 -0
  310. package/dist/validation/mockLevelResolver.js.map +1 -0
  311. package/dist/validation/n8nApiClient.js +21 -0
  312. package/dist/validation/n8nApiClient.js.map +1 -0
  313. package/dist/validation/n8nCli.js +87 -0
  314. package/dist/validation/n8nCli.js.map +1 -0
  315. package/dist/validation/types.js +8 -0
  316. package/dist/validation/types.js.map +1 -0
  317. package/dist/validation/usageStats.js +82 -0
  318. package/dist/validation/usageStats.js.map +1 -0
  319. 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"}