#!/usr/bin/env node // Usage: node tools/n8n-pull.mjs [workflowId] [outputFile] // GET un workflow n8n et l'écrit en JSON (pretty) dans un fichier local. // Clé API lue depuis ~/.config/opencode/opencode.json (mcp.n8n-mcp.environment). import fs from 'fs'; import os from 'os'; import path from 'path'; const WORKFLOW_ID = process.argv[2] || 'ATswvGfG4KJUls0K'; const OUT = process.argv[3] || `workflows/pull-${WORKFLOW_ID}.json`; function loadApiConfig() { if (process.env.N8N_API_KEY) { return { url: process.env.N8N_URL || 'https://n8n.airtria.pro', key: process.env.N8N_API_KEY }; } const cfgPath = path.join(os.homedir(), '.config/opencode/opencode.json'); const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8')); const env = cfg?.mcp?.['n8n-mcp']?.environment || {}; if (!env.N8N_API_KEY) { console.error('Clé API n8n introuvable (env N8N_API_KEY ou opencode.json)'); process.exit(1); } return { url: (env.N8N_API_URL || 'https://n8n.airtria.pro/api/v1').replace(/\/api\/v1\/?$/, ''), key: env.N8N_API_KEY }; } const { url, key } = loadApiConfig(); const res = await fetch(`${url}/api/v1/workflows/${WORKFLOW_ID}`, { headers: { 'X-N8N-API-KEY': key } }); if (!res.ok) { console.error(`GET échoué: ${res.status} ${res.statusText}`); console.error(await res.text()); process.exit(1); } const wf = await res.json(); fs.mkdirSync(path.dirname(OUT), { recursive: true }); fs.writeFileSync(OUT, JSON.stringify(wf, null, 2) + '\n'); console.log(`OK: "${wf.name}" (${wf.nodes?.length} nodes, active=${wf.active}) -> ${OUT}`); console.log(`updatedAt: ${wf.updatedAt}`);