The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "XspQfnwYpWM0xZbs",
"name": "Module Dependency Analysis",
"description": null,
"active": true,
"isArchived": false,
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "module-analysis",
"responseMode": "responseNode",
"options": {}
},
"id": "1618f709-74bb-4176-a21c-eb025a4a80a0",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
0,
336
]
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 2
}
]
}
},
"id": "89cad40a-f4b1-4d95-8a8f-2d7a6caf2929",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
528
]
},
{
"parameters": {
"operation": "executeQuery",
"query": "CALL api_wf.sp_module_load('{{ $json.modulesJson }}', 'n8n-automation', '{{ $json.runTimestamp }}')\n",
"options": {
"queryReplacement": "="
}
},
"id": "e1358a46-1c8e-42af-918b-569d33eb26af",
"name": "Load Modules",
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
1120,
240
],
"credentials": {
"mySql": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "executeQuery",
"query": "CALL api_wf.sp_module_map(CAST('{{ $json.depsJson }}' AS JSON), 'n8n-automation')",
"options": {}
},
"id": "f383f8d6-3f72-4c7d-8a2d-cdcd1c4ea526",
"name": "Map Dependencies",
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
1120,
456
],
"credentials": {
"mySql": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"respondWith": "text",
"responseBody": "=Module analysis complete. Processed {{ $('Analyze').item.json.totalModules }} modules and {{ $('Analyze').item.json.totalDependencies }} dependencies.",
"options": {}
},
"id": "77df85f8-d4b2-479c-8f04-d22f4c91c387",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
672,
528
]
},
{
"parameters": {
"method": "POST",
"url": "http://host.docker.internal:3010/api/execute",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "command",
"value": "cd /workspace && depcruise --config .dependency-cruiser.cjs --output-type json ."
}
]
},
"options": {}
},
"id": "33294a2f-ac0d-4184-8337-f5f32bd94dcb",
"name": "Dependancy Cruise",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
224,
432
]
},
{
"parameters": {
"jsCode": "// Parse dependency-cruiser output\n const response = $input.item.json;\n const depData = JSON.parse(response.stdout);\n\n const modules = [];\n const dependencies = [];\n\n // Helper: Get module type from path\n function getModuleType(filePath) {\n if (filePath.includes('/controller/')) return 'controller';\n if (filePath.includes('/component/') || filePath.includes('/components/')) return 'component';\n if (filePath.includes('/util/') || filePath.includes('/utils/')) return 'utility';\n if (filePath.includes('/route/') || filePath.includes('/routes/')) return 'routing';\n if (filePath.includes('.config.')) return 'config';\n if (filePath.includes('.test.') || filePath.includes('.spec.')) return 'test';\n return 'module';\n }\n\n // Process dependency-cruiser data\n for (const module of depData.modules) {\n const filePath = module.source;\n\n modules.push({\n file_path: filePath,\n module_type: getModuleType(filePath)\n });\n\n // Build dependencies - use resolved paths\n if (module.dependencies) {\n for (const dep of module.dependencies) {\n dependencies.push({\n from_path: filePath,\n to_path: dep.resolved\n });\n }\n }\n }\n\n console.log(`Analyzed ${modules.length} modules and ${dependencies.length} dependencies`);\n\n return [{\n json: {\n modules: modules,\n dependencies: dependencies,\n totalModules: modules.length,\n totalDependencies: dependencies.length\n }\n }];\n"
},
"id": "abd53c6b-71f8-4507-916a-73e173047fd0",
"name": "Analyze",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
448,
432
]
},
{
"parameters": {
"jsCode": "const runTimestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');\n return [{ json: {\n ...$input.item.json,\n runTimestamp: runTimestamp\n }}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
672,
336
],
"id": "fe139fc1-a8fb-4978-b092-946f4a57a577",
"name": "Gen Timestamp"
},
{
"parameters": {
"operation": "executeQuery",
"query": "CALL api_wf.sp_module_cleanup('n8n-automation', '{{ $('Gen Timestamp').item.json.runTimestamp }}')",
"options": {
"queryReplacement": "="
}
},
"id": "e0329f83-9267-4902-8cff-7da717601d10",
"name": "Set deleted_at Col",
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
1568,
336
],
"credentials": {
"mySql": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Prepare ALL modules at once (no splitting)\n const modules = $input.item.json.modules;\n\n // Serialize to JSON string with SQL escaping\n const modulesJson = JSON.stringify(modules).replace(/'/g, \"''\");\n\n return [{\n json: {\n modulesJson: modulesJson,\n totalModules: modules.length,\n runTimestamp: $input.item.json.runTimestamp // Pass through!\n }\n }];\n\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
896,
240
],
"id": "0f2598e4-cbc6-48a4-98f9-7efa318db64a",
"name": "Prep Modules"
},
{
"parameters": {
"jsCode": "// Prepare ALL dependencies at once\n const dependencies = $input.item.json.dependencies;\n const depsJson = JSON.stringify(dependencies);\n\n return [{\n json: {\n depsJson: depsJson,\n totalDeps: dependencies.length,\n runTimestamp: $input.item.json.runTimestamp // Pass through!\n }\n }];\n\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
896,
456
],
"id": "b1527186-72d0-49d8-b721-205546f135b0",
"name": "Prep Dependancies"
},
{
"parameters": {},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
1344,
352
],
"id": "7b864218-18e7-4500-a56b-3d2d33cff692",
"name": "Merge"
}
],
"connections": {
"Load Modules": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Map Dependencies": {
"main": [
[]
]
},
"Webhook": {
"main": [
[
{
"node": "Dependancy Cruise",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Dependancy Cruise",
"type": "main",
"index": 0
}
]
]
},
"Dependancy Cruise": {
"main": [
[
{
"node": "Analyze",
"type": "main",
"index": 0
}
]
]
},
"Analyze": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
},
{
"node": "Gen Timestamp",
"type": "main",
"index": 0
}
]
]
},
"Prep Modules": {
"main": [
[
{
"node": "Load Modules",
"type": "main",
"index": 0
}
]
]
},
"Prep Dependancies": {
"main": [
[
{
"node": "Map Dependencies",
"type": "main",
"index": 0
}
]
]
},
"Gen Timestamp": {
"main": [
[
{
"node": "Prep Modules",
"type": "main",
"index": 0
},
{
"node": "Prep Dependancies",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Set deleted_at Col",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"availableInMCP": true,
"timeSavedMode": "fixed",
"callerPolicy": "workflowsFromSameOwner"
},
"staticData": {
"node:Schedule Trigger": {
"recurrenceRules": []
}
},
"versionId": "573ff32c-ed98-4f2e-a8e8-e15345e22f90",
"createdAt": "2025-12-27 05:03:26.789",
"updatedAt": "2025-12-28 13:11:55.534"
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
mySql
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow automates the analysis of module dependencies in your codebase, helping developers and teams quickly identify potential issues like circular references or outdated links without manual effort. It saves hours of debugging by generating a comprehensive report on how modules interconnect, making it ideal for software engineers maintaining large projects or preparing for releases. The key step involves querying your MySQL database to load modules and map their relationships, followed by an HTTP request to a dependency analysis tool that processes the data into actionable insights.
Use this workflow when you need periodic scans of your project's structure, such as during CI/CD pipelines or after major code changes, to catch dependency problems early. Avoid it for one-off analyses or tiny projects where built-in IDE tools suffice, as the setup requires a MySQL backend. Common variations include integrating with GitHub webhooks for on-commit triggers or extending the output to Slack notifications for team alerts.
About this workflow
Module Dependency Analysis. Uses scheduleTrigger, mySql, respondToWebhook, httpRequest. Webhook trigger; 12 nodes.
Source: https://github.com/pchambless/wf-monorepo/blob/47cd16469735c59a12b7c76e2552861f899e335d/.n8n/workflows/module-analysis.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Module Dependency Analysis. Uses scheduleTrigger, httpRequest, splitInBatches, mySql. Webhook trigger; 11 nodes.
Send Dingtalk Message On New Azure Devops Pull Request. Uses mySql, httpRequest, stickyNote. Webhook trigger; 5 nodes.
Portfolio Orchestrator. Uses httpRequest. Webhook trigger; 59 nodes.
jump-section: Comment Fix Pipeline. Uses httpRequest. Webhook trigger; 24 nodes.
GitHub Issues Router (Linear / Jira / ClickUp). Uses stickyNote, httpRequest, respondToWebhook. Webhook trigger; 23 nodes.