Files
claude-skills/fal-workflow/scripts/create-workflow.sh
2026-01-30 03:04:10 +00:00

139 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
# fal.ai Workflow Creation Script
# Usage: ./create-workflow.sh --name NAME --title TITLE --description DESC --nodes JSON --outputs JSON
# Returns: Workflow JSON definition
set -e
# Default values
NAME=""
TITLE=""
DESCRIPTION=""
NODES=""
OUTPUTS=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--name)
NAME="$2"
shift 2
;;
--title)
TITLE="$2"
shift 2
;;
--description)
DESCRIPTION="$2"
shift 2
;;
--nodes)
NODES="$2"
shift 2
;;
--outputs)
OUTPUTS="$2"
shift 2
;;
*)
echo "Unknown option: $1" >&2
exit 1
;;
esac
done
# Validate required inputs
if [ -z "$NAME" ]; then
echo "Error: --name is required" >&2
exit 1
fi
if [ -z "$TITLE" ]; then
TITLE="$NAME"
fi
if [ -z "$NODES" ]; then
echo "Error: --nodes is required (JSON array)" >&2
exit 1
fi
if [ -z "$OUTPUTS" ]; then
echo "Error: --outputs is required (JSON object)" >&2
exit 1
fi
# Create temp directory
TEMP_DIR=$(mktemp -d)
trap 'rm -rf "$TEMP_DIR"' EXIT
echo "Creating workflow: $TITLE..." >&2
# Parse nodes array and build workflow structure
# This is a simplified version - the MCP tool handles complex validation
WORKFLOW_FILE="$TEMP_DIR/workflow.json"
# Build the workflow JSON
cat > "$WORKFLOW_FILE" << EOF
{
"_type": "ComfyApp",
"version": "0.1.0",
"name": "$NAME",
"title": "$TITLE",
"description": "$DESCRIPTION",
"nodes": {},
"outputs": $OUTPUTS
}
EOF
# Process nodes and add to workflow
# Note: This is a basic implementation. For full validation, use the MCP tool.
echo "Processing nodes..." >&2
# Use Python/jq if available for proper JSON manipulation
if command -v python3 &> /dev/null; then
python3 << PYTHON_EOF
import json
import sys
# Read workflow
with open("$WORKFLOW_FILE", "r") as f:
workflow = json.load(f)
# Parse nodes
nodes = json.loads('''$NODES''')
# Build nodes object
for node in nodes:
node_id = node.get("nodeId", "")
model_id = node.get("modelId", "")
node_input = node.get("input", {})
depends_on = node.get("dependsOn", [])
# Detect dependencies from input references
for key, value in node_input.items():
if isinstance(value, str) and value.startswith("\$") and not value.startswith("\$input"):
ref_node = value.split(".")[0][1:] # Remove $ and get node name
if ref_node not in depends_on:
depends_on.append(ref_node)
workflow["nodes"][node_id] = {
"app": model_id,
"input": node_input
}
if depends_on:
workflow["nodes"][node_id]["dependsOn"] = depends_on
# Write result
print(json.dumps(workflow, indent=2))
PYTHON_EOF
else
# Fallback: output the basic structure
echo "Warning: Python not available, outputting basic structure" >&2
cat "$WORKFLOW_FILE"
fi
echo "" >&2
echo "Workflow created successfully!" >&2