#!/usr/bin/env python3 import argparse import json from pathlib import Path from app.models.workflow import WorkflowPackageRequest from app.services.adapters import adapters from app.services.intelligence import documentation, package_workflow, quality from app.services.validation import validator def load_workflow(path: Path): return adapters.importers["json"].load(path.read_text(encoding="utf-8")) def main() -> int: parser = argparse.ArgumentParser(prog="flowforge", description="Validate and package n8n workflows") subparsers = parser.add_subparsers(dest="command", required=True) for command in ("validate", "quality", "docs", "package"): subparser = subparsers.add_parser(command) subparser.add_argument("workflow", type=Path) if command in {"docs", "package"}: subparser.add_argument("--output", type=Path) args = parser.parse_args() workflow = load_workflow(args.workflow) if args.command == "validate": result = validator.validate(workflow) print(result.model_dump_json(indent=2)) return 0 if result.valid else 1 if args.command == "quality": result = quality(workflow) print(result.model_dump_json(indent=2)) return 0 if result.overall >= 70 else 1 if args.command == "docs": content = documentation(workflow).markdown if args.output: args.output.write_text(content, encoding="utf-8") else: print(content) return 0 content = package_workflow(WorkflowPackageRequest(workflow=workflow)).model_dump(mode="json") serialized = json.dumps(content, indent=2) if args.output: args.output.write_text(serialized, encoding="utf-8") else: print(serialized) return 0 if __name__ == "__main__": raise SystemExit(main())