{"id":49941542,"url":"https://github.com/chelslava/autoflow-net","last_synced_at":"2026-05-17T11:37:03.913Z","repository":{"id":352099666,"uuid":"1208499850","full_name":"chelslava/autoflow-net","owner":"chelslava","description":"Automate anything. Write less code. Ship faster.  A modern, cross-platform automation framework with elegant YAML DSL. Build workflows in minutes, not days.","archived":false,"fork":false,"pushed_at":"2026-04-25T18:48:22.000Z","size":451,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-25T20:26:34.219Z","etag":null,"topics":["automation","browser-automation","cross-platform","dotnet","dsl","playwright","rpa","task-automation","workflow-engine","yaml","yaml-dsl"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chelslava.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-12T11:20:33.000Z","updated_at":"2026-04-25T18:48:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chelslava/autoflow-net","commit_stats":null,"previous_names":["chelslava/autoflow-net"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/chelslava/autoflow-net","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chelslava%2Fautoflow-net","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chelslava%2Fautoflow-net/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chelslava%2Fautoflow-net/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chelslava%2Fautoflow-net/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chelslava","download_url":"https://codeload.github.com/chelslava/autoflow-net/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chelslava%2Fautoflow-net/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33137098,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T09:28:26.183Z","status":"ssl_error","status_checked_at":"2026-05-17T09:27:52.702Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","browser-automation","cross-platform","dotnet","dsl","playwright","rpa","task-automation","workflow-engine","yaml","yaml-dsl"],"created_at":"2026-05-17T11:36:58.555Z","updated_at":"2026-05-17T11:37:03.908Z","avatar_url":"https://github.com/chelslava.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eEnglish\u003c/strong\u003e | \u003ca href=\"README.ru.md\"\u003eРусский\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/.NET-10.0-512BD4?style=for-the-badge\u0026logo=dotnet\" alt=\".NET 10\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/YAML-DSL-FFB13B?style=for-the-badge\u0026logo=yaml\" alt=\"YAML DSL\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Playwright-Browser-2EAD33?style=for-the-badge\u0026logo=playwright\" alt=\"Playwright\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/VS_Code-Extension-007ACC?style=for-the-badge\u0026logo=visual-studio-code\" alt=\"VS Code Extension\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-green?style=for-the-badge\" alt=\"MIT License\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Release-v1.1.0-green?style=for-the-badge\" alt=\"Release v1.1.0\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e⚡ AutoFlow.NET\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAutomate anything. Write less code. Ship faster.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  A modern, cross-platform automation framework with elegant YAML DSL.\u003cbr\u003e\n  Build workflows in minutes, not days.\n\u003c/p\u003e\n\n---\n\n## 🎯 Why AutoFlow.NET?\n\n**Stop writing boilerplate automation scripts.** Define your workflows in clean YAML and let the engine handle the complexity.\n\n```yaml\nschema_version: 1\nname: fetch_and_process\n\ntasks:\n  main:\n    steps:\n      - parallel:\n          max_concurrency: 5\n          steps:\n            - step: { id: users, uses: http.request, with: { url: \"${api}/users\" } }\n            - step: { id: posts, uses: http.request, with: { url: \"${api}/posts\" } }\n            - step: { id: comments, uses: http.request, with: { url: \"${api}/comments\" } }\n```\n\nThat's it. **3 parallel HTTP requests** with automatic error handling, logging, and reporting.\n\n---\n\n## ✨ Features that matter\n\n| Feature | What it means for you |\n|---------|----------------------|\n| **YAML DSL** | Describe workflows declaratively — no complex code |\n| **Parallel Execution** | Run independent steps concurrently — 5x faster workflows |\n| **Exponential Backoff Retry** | Auto-retry with smart delays — resilient by default |\n| **Secrets Management** | Inject secrets safely — auto-masked in logs \u0026 reports |\n| **Lifecycle Hooks** | Intercept any event — full observability |\n| **Browser Automation** | Playwright-powered — test any web app |\n| **SQLite Persistence** | Full execution history — audit everything |\n\n---\n\n## 🧩 VS Code Extension\n\nInstall the AutoFlow.NET extension for the best development experience:\n\n[![VS Code](https://img.shields.io/badge/VS%20Code-Install-007ACC?style=for-the-badge\u0026logo=visual-studio-code)](https://github.com/chelslava/autoflow-net/releases)\n\n**Features:**\n\n| Feature | Description |\n|---------|-------------|\n| 🎨 **Syntax Highlighting** | Keywords, variables, control flow |\n| 💡 **IntelliSense** | Keywords, arguments, outputs, variables |\n| 🔍 **Code Navigation** | Go to Definition, Find References, Workspace Symbols |\n| ✏️ **Code Editing** | Quick Fixes, Signature Help, Code Folding |\n| 🖥️ **UI** | Status Bar, Tree View, Document Links |\n| 📝 **Snippets** | 20+ workflow patterns |\n| 🚀 **CLI Integration** | Run, validate, history, stats |\n\n```bash\n# Download from releases and install\ncode --install-extension autoflow-1.1.0.vsix\n```\n\nSee [vscode-autoflow/README.md](vscode-autoflow/README.md) for full documentation.\n\n---\n\n## 🚀 Quick Start\n\n```bash\n# Clone and run in 30 seconds\ngit clone https://github.com/chelslava/autoflow-net.git\ncd autoflow-net\ndotnet run --project src/AutoFlow.Cli -- run examples/flow.yaml\n```\n\n**Prerequisites:** [.NET 10 SDK](https://dotnet.microsoft.com/download)\n\n### Browser Automation Setup\n\nFor browser automation workflows, install Playwright browsers:\n\n```bash\n# Build the CLI first\ndotnet build src/AutoFlow.Cli\n\n# Install browsers (Chromium, Firefox, WebKit)\npwsh src/AutoFlow.Cli/bin/Debug/net10.0/playwright.ps1 install\n\n# Or install only Chromium (faster, ~150 MB)\npwsh src/AutoFlow.Cli/bin/Debug/net10.0/playwright.ps1 install chromium\n```\n\n**Run browser example:**\n\n```bash\ndotnet run --project src/AutoFlow.Cli -- run examples/browser_login.yaml\n```\n\n---\n\n## 📖 Examples\n\n### Ready-to-run workflows in `examples/`\n\n| File | Shows |\n|------|-------|\n| `examples/flow.yaml` | Smallest possible workflow with `log.info` |\n| `examples/file_roundtrip.yaml` | Local file automation with `files.write`, `files.exists`, `files.read`, `datetime.now`, and `if` |\n| `examples/http_json_report.yaml` | HTTP request + JSON extraction + local report generation |\n| `examples/excel_summary.yaml` | Downloading an Excel file and reading rows with `excel.read` |\n| `examples/imports_report.yaml` | Focused imports example with shared variables and imported tasks |\n| `examples/parallel_fetch_report.yaml` | Focused `parallel` example that writes a summary report |\n| `examples/report_cli_demo.yaml` | Simple workflow intended for JSON/HTML report generation from the CLI |\n| `examples/advanced_flow.yaml` | `if`, `foreach`, `call`, and file reads |\n| `examples/advanced_features.yaml` | `parallel`, `retry`, `on_error`, and `finally` |\n| `examples/imports/main.yaml` | Workflow imports and reusable tasks |\n| `examples/browser_login.yaml` | Browser login flow |\n| `examples/browser_ecommerce.yaml` | Browser e-commerce scenario |\n| `examples/rpa_challenge.yaml` | Full 10-round RPA Challenge run until `Congratulations!` |\n| `examples/reframework/main.yaml` | REFramework-style structure for the RPA Challenge |\n\n**Quick start for the new examples:**\n\n```bash\ndotnet run --project src/AutoFlow.Cli -- run examples/file_roundtrip.yaml\ndotnet run --project src/AutoFlow.Cli -- run examples/http_json_report.yaml\ndotnet run --project src/AutoFlow.Cli -- run examples/excel_summary.yaml\ndotnet run --project src/AutoFlow.Cli -- run examples/imports_report.yaml\ndotnet run --project src/AutoFlow.Cli -- run examples/parallel_fetch_report.yaml\n```\n\n### JSON/HTML report generation from the CLI\n\n```bash\n# JSON report\ndotnet run --project src/AutoFlow.Cli -- run examples/report_cli_demo.yaml --output reports/report_cli_demo.json\n\n# HTML report\ndotnet run --project src/AutoFlow.Cli -- run examples/report_cli_demo.yaml --output reports/report_cli_demo.html\n```\n\n### Real-world Example\n\n### Parallel API Fetch with Retry\n\n```yaml\nschema_version: 1\nname: data_pipeline\n\nvariables:\n  api_base: https://api.example.com\n\ntasks:\n  main:\n    on_error:\n      - step: { id: alert, uses: log.info, with: { message: \"❌ Pipeline failed!\" } }\n    \n    finally:\n      - step: { id: cleanup, uses: log.info, with: { message: \"🧹 Cleanup done\" } }\n    \n    steps:\n      # Fetch in parallel — 3 concurrent requests\n      - parallel:\n          id: fetch_data\n          max_concurrency: 3\n          steps:\n            - step:\n                id: users\n                uses: http.request\n                with: { url: \"${api_base}/users\", method: GET }\n                save_as: { body: users_data }\n            \n            - step:\n                id: posts\n                uses: http.request\n                with: { url: \"${api_base}/posts\", method: GET }\n                save_as: { body: posts_data }\n      \n      # Auto-retry with exponential backoff\n      - step:\n          id: unstable_endpoint\n          uses: http.request\n          with: { url: \"${api_base}/flaky\", method: GET }\n          retry:\n            attempts: 5\n            type: exponential\n            delay: \"1s\"\n            max_delay: \"30s\"\n```\n\n### Browser Automation\n\n```yaml\nschema_version: 1\nname: login_test\n\ntasks:\n  main:\n    steps:\n      - step:\n          id: open_browser\n          uses: browser.open\n          with: { browser: chromium, headless: true }\n          save_as: { browserId: browser_id }\n      \n      - step:\n          id: navigate\n          uses: browser.goto\n          with: { browserId: \"${browser_id}\", url: \"https://app.example.com/login\" }\n      \n      - step:\n          id: fill_credentials\n          uses: browser.fill\n          with:\n            browserId: \"${browser_id}\"\n            selector: \"#email\"\n            value: \"${secret:TEST_USER_EMAIL}\"\n      \n      - step:\n          id: submit\n          uses: browser.click\n          with: { browserId: \"${browser_id}\", selector: \"button[type=submit]\" }\n      \n      - step:\n          id: verify\n          uses: browser.assert_text\n          with: { browserId: \"${browser_id}\", selector: \".welcome\", expected: \"Welcome\" }\n```\n\n---\n\n## 🔧 CLI Commands\n\n```bash\n# Run a workflow\ndotnet run --project src/AutoFlow.Cli -- run workflow.yaml\n\n# Generate HTML report\ndotnet run --project src/AutoFlow.Cli -- run workflow.yaml --output report.html\n\n# Validate before running\ndotnet run --project src/AutoFlow.Cli -- validate workflow.yaml\n\n# View execution history\ndotnet run --project src/AutoFlow.Cli -- history --status Failed\n\n# Get statistics\ndotnet run --project src/AutoFlow.Cli -- stats --days 7\n\n# List available keywords\ndotnet run --project src/AutoFlow.Cli -- list-keywords\n```\n\n---\n\n## 🧩 Available Keywords\n\n### HTTP \u0026 Data\n\n| Keyword | Description |\n|---------|-------------|\n| `http.request` | HTTP/HTTPS requests with full control |\n| `json.parse` | Extract values from JSON |\n\n### Files\n\n| Keyword | Description |\n|---------|-------------|\n| `files.read` | Read file contents |\n| `files.write` | Write to files |\n| `files.exists` | Check file existence |\n| `files.delete` | Delete files |\n\n### Browser (Playwright)\n\n| Keyword | Description |\n|---------|-------------|\n| `browser.open` | Launch Chromium/Firefox/WebKit |\n| `browser.goto` | Navigate to URL |\n| `browser.click` | Click elements |\n| `browser.fill` | Fill form fields |\n| `browser.wait` | Wait for elements |\n| `browser.screenshot` | Capture screenshots |\n| `browser.assert_text` | Verify page content |\n| `browser.evaluate` | Execute JavaScript |\n\n### Control Flow\n\n| Keyword | Description |\n|---------|-------------|\n| `if` | Conditional execution |\n| `for_each` | Loop over items |\n| `parallel` | Concurrent execution |\n| `call` | Reusable tasks |\n| `group` | Logical grouping |\n\n---\n\n## 🔐 Security First\n\n### Path Traversal Protection\nFile operations automatically reject `../` and absolute paths outside allowed directories.\n\n### SSRF Protection\nHTTP requests to `localhost`, `192.168.x.x`, `10.x.x.x` blocked by default. Enable explicitly with `allowPrivateNetworks: true`.\n\n### Secret Masking\nSecrets are automatically masked in logs and reports:\n\n```\n[INFO] Calling API with token: ***\n```\n\n---\n\n## 🔌 Extend with Custom Keywords\n\n```csharp\n[Keyword(\"slack.notify\", Category = \"Notifications\", Description = \"Send Slack message\")]\npublic class SlackNotifyKeyword : IKeywordHandler\u003cSlackNotifyArgs\u003e\n{\n    public async Task\u003cKeywordResult\u003e ExecuteAsync(\n        KeywordContext context,\n        SlackNotifyArgs args,\n        CancellationToken ct = default)\n    {\n        // Your logic here\n        return KeywordResult.Success(new { messageId = \"msg_123\" });\n    }\n}\n```\n\nRegister and use:\n\n```yaml\n- step:\n    id: notify_team\n    uses: slack.notify\n    with:\n      channel: \"#deployments\"\n      message: \"Deploy complete! 🚀\"\n```\n\n---\n\n## 📊 Architecture\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                     YAML Workflow                        │\n└─────────────────────┬───────────────────────────────────┘\n                      ▼\n┌─────────────────────────────────────────────────────────┐\n│                    Parser (AST)                          │\n└─────────────────────┬───────────────────────────────────┘\n                      ▼\n┌─────────────────────────────────────────────────────────┐\n│                   Validation                             │\n└─────────────────────┬───────────────────────────────────┘\n                      ▼\n┌─────────────────────────────────────────────────────────┐\n│                   Runtime Engine                         │\n│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │\n│  │   Secrets   │  │   Hooks     │  │  Variables  │     │\n│  └─────────────┘  └─────────────┘  └─────────────┘     │\n└─────────────────────┬───────────────────────────────────┘\n                      ▼\n┌─────────────────────────────────────────────────────────┐\n│              Keyword Executors                           │\n│  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐           │\n│  │  HTTP  │ │ Files  │ │Browser │ │ Custom │           │\n│  └────────┘ └────────┘ └────────┘ └────────┘           │\n└─────────────────────────────────────────────────────────┘\n```\n\n---\n\n## 📦 Project Structure\n\n```\nAutoFlow.NET/\n├── src/\n│   ├── AutoFlow.Abstractions/    # Core contracts\n│   ├── AutoFlow.Runtime/         # Execution engine\n│   ├── AutoFlow.Parser/          # YAML → AST\n│   ├── AutoFlow.Validation/      # Schema validation\n│   ├── AutoFlow.Reporting/       # JSON/HTML reports\n│   ├── AutoFlow.Database/        # SQLite persistence\n│   └── AutoFlow.Cli/             # Command-line tool\n├── libraries/\n│   ├── AutoFlow.Library.Http/    # HTTP keywords\n│   ├── AutoFlow.Library.Files/   # File keywords\n│   └── AutoFlow.Library.Browser/ # Browser keywords\n└── tests/                        # Test projects\n```\n\n---\n\n## 🗺️ Roadmap\n\n| Feature | Status |\n|---------|--------|\n| YAML Parser | ✅ |\n| Control Flow (if/foreach/call) | ✅ |\n| Parallel Execution | ✅ |\n| Lifecycle Hooks | ✅ |\n| Secrets Management | ✅ |\n| Browser Automation | ✅ |\n| SQLite Persistence | ✅ |\n| Expression Language | 🚧 |\n| Visual Workflow Editor | 📋 Planned |\n| Cloud Execution | 📋 Planned |\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n1. Fork the repo\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'feat: add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n---\n\n## 📄 License\n\nMIT License — use it for anything, commercial or personal.\n\n---\n\n## 💬 Community\n\n- **Issues**: [GitHub Issues](https://github.com/chelslava/autoflow-net/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/chelslava/autoflow-net/discussions)\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eMade with ❤️ for automation engineers\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#-quick-start\"\u003eGet started in 30 seconds →\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchelslava%2Fautoflow-net","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchelslava%2Fautoflow-net","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchelslava%2Fautoflow-net/lists"}