Token导航 LogoToken导航TokenDH.com
研究检索敏感数据clawhub未标认证来源可访问clear审计提醒

workflow-migrate工作流程迁移

Agent Skill

workflow-migrate 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

15,696

周安装

654

GitHub Stars

1

下载量

5,232
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:workflow-migrate(工作流程迁移)
来源仓库:https://github.com/kevdogg102396-afk/workflow-migrate
安装命令:
openclaw skills install workflow-migrate
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install workflow-migrate

简介

workflow-migrate 将 N8N/Zapier/Make 可视化流程迁移为生产级 Python 或 Node.js 脚本。

  • 适用于自动化逻辑固化、平台锁定解除或代码化审计需求场景。
  • 通过重试机制重写原始流程描述,生成可直接运行的脚本文件。
  • 安装命令为 openclaw skills install workflow-migrate,需提供原流程描述文本。
  • 建议保留原始流程备份,并在新脚本上线前进行充分测试验证。

SKILL.md

name
workflow-migrate
description
Migrate N8N/Zapier/Make workflows to production-grade Python or Node.js scripts. Given a workflow description or paste, rewrites automation logic with retry, backoff, logging, and self-healing. Billable migration deliverable.
argument-hint
[workflow description, or paste workflow JSON/steps, or type "paste" to describe inline]
allowed-tools
Read, Write, Edit, Bash, Glob, Grep, WebSearch

Workflow Migrate — Automation Migration Tool

Why This Exists

N8N/Zapier/Make workflows break silently, can't be version-controlled, and cost $50-500/month in SaaS fees. This skill rewrites them as standalone scripts that run forever with zero subscription cost. Each migration is a $500-5000 billable deliverable.

Trigger

Use when: "migrate this workflow", "convert N8N to Python", "rewrite my Zapier", "turn this automation into a script", "get off N8N"

Invoked as: /workflow-migrate [workflow description or paste]


Process

Step 1: Parse the Workflow Input

From $ARGUMENTS:

  • If it's a description ("when a form is submitted, send email and update Airtable"): parse directly
  • If it's N8N JSON: read and extract nodes/connections
  • If it's Zapier steps: parse the trigger + action chain
  • If it's Make (formerly Integromat) scenario: parse modules

Extract and document:

Triggers:

  • Webhook (POST endpoint)
  • Cron/schedule (every X minutes/hours)
  • Form submission
  • Email received
  • File drop (S3, Google Drive, local folder)
  • DB row created/updated

Actions:

  • HTTP/API calls (list each endpoint, method, payload)
  • Database reads/writes
  • Email sends
  • File operations
  • Conditional logic (if/else branches)
  • Loops over arrays
  • Data transformations

Data flow:

  • Input payload fields used
  • Intermediate computed values
  • Output destinations

If the workflow description is too vague, ask 2-3 targeted questions before proceeding:

  • "What triggers it — webhook, schedule, or something else?"
  • "Which API endpoints does it call and with what data?"
  • "What counts as success? What should happen on failure?"

Step 2: Choose Language

Default to Python unless:

  • The workflow is heavily async/event-driven (prefer Node.js)
  • Existing codebase is Node.js
  • Kevin explicitly requests Node

Python stack: requests, schedule, logging, tenacity (retry), python-dotenv Node.js stack: axios, node-cron, winston, async-retry, dotenv


Step 3: Write the Script

Generate a complete, runnable script. Required elements:

Python Template Structure:

#!/usr/bin/env python3
"""
[Workflow Name] — Migrated from [N8N/Zapier/Make]
Original: [brief description of what the workflow did]
Migrated: [date]

Usage:
  python workflow_[name].py                    # run once
  python workflow_[name].py --schedule         # run on schedule
  python workflow_[name].py --dry-run          # test without side effects
"""

import os
import sys
import logging
import time
import argparse
from datetime import datetime
from typing import Optional, Dict, Any

import requests
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
from dotenv import load_dotenv

load_dotenv()

# ─── Logging ───────────────────────────────────────────────────────────────────
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.StreamHandler(sys.stdout),
        logging.FileHandler(f"logs/workflow_{datetime.now().strftime('%Y%m')}.log"),
    ]
)
log = logging.getLogger(__name__)

# ─── Config ────────────────────────────────────────────────────────────────────
API_KEY = os.getenv("API_KEY")         # from .env
WEBHOOK_URL = os.getenv("WEBHOOK_URL") # destination
DRY_RUN = False

# ─── Retry Decorator ───────────────────────────────────────────────────────────
@retry(
    stop=stop_after_attempt(3),
    wait=wait_exponential(multiplier=1, min=2, max=30),
    retry=retry_if_exception_type((requests.RequestException, ConnectionError)),
    before_sleep=lambda rs: log.warning(f"Retrying (attempt {rs.attempt_number})..."),
    reraise=True
)
def api_call(method: str, url: str, **kwargs) -> Dict[str, Any]:
    """Make an HTTP call with automatic retry and exponential backoff."""
    if DRY_RUN:
        log.info(f"[DRY RUN] {method.upper()} {url} payload={kwargs.get('json', {})}")
        return {"dry_run": True}
    resp = requests.request(method, url, timeout=30, **kwargs)
    resp.raise_for_status()
    return resp.json()

Node.js Template Structure:

#!/usr/bin/env node
/**
 * [Workflow Name] — Migrated from [N8N/Zapier/Make]
 * Original: [brief description]
 * Migrated: [date]
 *
 * Usage:
 *   node workflow_[name].js            # run once
 *   node workflow_[name].js --schedule # run on schedule
 *   node workflow_[name].js --dry-run  # test without side effects
 */

require('dotenv').config();
const axios = require('axios');
const retry = require('async-retry');
const cron = require('node-cron');
const winston = require('winston');
const fs = require('fs');

// ─── Logger ────────────────────────────────────────────────────────────────────
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
  transports: [
    new winston.transports.Console({ format: winston.format.simple() }),
    new winston.transports.File({ filename: `logs/workflow_${new Date().toISOString().slice(0,7)}.log` }),
  ],
});

// ─── Config ────────────────────────────────────────────────────────────────────
const API_KEY = process.env.API_KEY;
const DRY_RUN = process.argv.includes('--dry-run');

// ─── Retry Wrapper ─────────────────────────────────────────────────────────────
async function apiCall(method, url, data = {}, headers = {}) {
  return retry(async (bail, attempt) => {
    if (DRY_RUN) {
      logger.info(`[DRY RUN] ${method.toUpperCase()} ${url}`, { data });
      return { dry_run: true };
    }
    try {
      const resp = await axios({ method, url, data, headers, timeout: 30000 });
      return resp.data;
    } catch (err) {
      if (err.response && err.response.status < 500) bail(err); // 4xx = don't retry
      logger.warn(`Retrying attempt ${attempt}...`, { error: err.message });
      throw err;
    }
  }, { retries: 3, minTimeout: 2000, maxTimeout: 30000, factor: 2 });
}

For each action in the workflow, write a dedicated function:

  • One function per logical action (e.g., fetch_leads(), send_notification(), update_database())
  • Functions are composable and testable in isolation
  • Every function logs what it's doing: start, result, any errors

Main orchestrator:

def run(dry_run: bool = False):
    global DRY_RUN
    DRY_RUN = dry_run
    log.info("=== Workflow started ===")
    try:
        # Step 1: [action name]
        data = fetch_source_data()
        log.info(f"Fetched {len(data)} records")

        # Step 2: [action name]
        for item in data:
            result = process_item(item)
            if result:
                send_to_destination(result)

        log.info("=== Workflow completed successfully ===")
    except Exception as e:
        log.error(f"Workflow failed: {e}", exc_info=True)
        send_alert(f"Workflow [name] failed: {e}")  # self-healing alert
        raise

Self-healing patterns to include:

  • Alert on failure (Telegram message via Kevin's bot token if available, else log to file)
  • Idempotency: skip already-processed records (use a state file or DB flag)
  • Dead-letter queue: failed items saved to failed_[date].json for manual review
  • Heartbeat: log "still alive" every N runs for scheduled workflows

Step 4: Generate .env.example

# [Workflow Name] — Environment Variables
# Copy to .env and fill in values

API_KEY=your_api_key_here
WEBHOOK_URL=https://...
DATABASE_URL=...

# Optional: Telegram alerts on failure
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=8062428674

Step 5: Generate requirements.txt or package.json

Python:

requests>=2.31.0
tenacity>=8.2.0
python-dotenv>=1.0.0
schedule>=1.2.0  # only if cron-triggered

Node.js:

{
  "dependencies": {
    "axios": "^1.6.0",
    "async-retry": "^1.3.3",
    "node-cron": "^3.0.3",
    "winston": "^3.11.0",
    "dotenv": "^16.3.1"
  }
}

Step 6: If the Workflow is Recurring — Generate a SKILL.md

If the workflow runs on a schedule or will be reused:

  • Generate a SKILL.md in the same output directory
  • Name it after the workflow function
  • Description: "Run [workflow name] — [what it does in 10 words]"
  • Instructions: path to script, how to run it, what env vars are needed

Step 7: Save Outputs and Print Migration Summary

Output location: Ask Kevin where to save, default to ./workflow_[name]/

Create:

  • workflow_[name].py (or .js)
  • .env.example
  • requirements.txt (or package.json)
  • SKILL.md (if recurring)
  • README.md (quick usage guide — 20 lines max)

Print migration summary:

Migration complete.

Original: [N8N/Zapier/Make] workflow — [X] nodes/steps
Output:   ./workflow_[name]/workflow_[name].py

What changed:
  - [X] N8N nodes → [Y] lines of Python
  - Added: retry with exponential backoff (3 attempts, 2s-30s)
  - Added: rotating log file (monthly)
  - Added: dry-run mode (--dry-run flag)
  - Added: failure alerts via [Telegram/log]
  - Removed: $XX/month SaaS subscription

To run:
  cd workflow_[name]/
  cp .env.example .env   # fill in your keys
  pip install -r requirements.txt
  python workflow_[name].py --dry-run   # test first
  python workflow_[name].py             # run for real

Error Handling

  • Ambiguous workflow: ask 2-3 targeted questions, don't guess at API endpoints
  • Proprietary N8N nodes (e.g., OpenAI node): rewrite using the raw API — include API docs link in comments
  • Very complex workflow (>15 nodes): break into multiple scripts with a coordinator, document the dependency order
  • No credentials visible: generate .env.example with clear placeholders, add comments explaining where each key comes from
  • Webhook trigger: generate a Flask/Express endpoint stub that receives the webhook and calls the workflow function

Notes

  • Always test with --dry-run before running for real
  • State file for idempotency: ./state/processed_ids.json — create state/ dir if it doesn't exist
  • For scheduled runs, prefer cron / schedule over external task runners (fewer dependencies)

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

97.77%
按下载量换算5,115

安全审计

VirusTotal

可疑

ClawScan

可疑

Static analysis

未展示

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills