{"id":50971883,"url":"https://github.com/workato-devs/recipe-lint","last_synced_at":"2026-06-19T03:01:22.075Z","repository":{"id":354286995,"uuid":"1171183638","full_name":"workato-devs/recipe-lint","owner":"workato-devs","description":"Deterministic recipe validation, shipped as a wk plugin. Catches datapill syntax errors, schema mismatches, and structural issues that agents can't self-validate. Runs on wk lint and automatically before wk push.","archived":false,"fork":false,"pushed_at":"2026-06-18T05:51:50.000Z","size":239,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2026-06-18T06:26:13.536Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","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/workato-devs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing-builtins.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-03-03T00:41:39.000Z","updated_at":"2026-06-18T05:50:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/workato-devs/recipe-lint","commit_stats":null,"previous_names":["workato-devs/wk-lint-beta","workato-devs/recipe-lint"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/workato-devs/recipe-lint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workato-devs%2Frecipe-lint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workato-devs%2Frecipe-lint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workato-devs%2Frecipe-lint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workato-devs%2Frecipe-lint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/workato-devs","download_url":"https://codeload.github.com/workato-devs/recipe-lint/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workato-devs%2Frecipe-lint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34515405,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-19T03:01:20.933Z","updated_at":"2026-06-19T03:01:22.061Z","avatar_url":"https://github.com/workato-devs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wk lint\n\nRecipe validation plugin for the `wk` CLI. Validates Workato recipe JSON files against 52 built-in rules across four tiers of analysis, from basic JSON schema checks through cross-step data flow validation. Runs as a standalone command or as an automatic pre-push gate on `wk push`.\n\nTeams can extend the linter with [custom rules defined in JSON](docs/rule-authoring.md) — no Go code required.\n\n## Installation\n\nInstall the `wk` CLI and recipe linter together using the [Workato Labs install guide](https://github.com/workato-devs/labs#install-the-toolkit) (Homebrew, Scoop, or manual).\n\nAfter installing, register the plugin:\n\n```bash\nwk plugins install recipe-lint\nwk lint --help\n```\n\n## Usage\n\n```bash\n# Lint a single recipe\nwk lint recipe.json\n\n# Lint all recipes in a directory\nwk lint ./recipes/\n\n# Run only schema and step-level rules (Tiers 0-1, fast)\nwk lint recipe.json --tiers 0,1\n\n# Use the strict profile\nwk lint recipe.json --profile strict\n\n# Load connector-specific rules from a skills directory\nwk lint recipe.json --skills-path ./skills/\n```\n\n### Flags\n\n| Flag | Type | Description |\n|------|------|-------------|\n| `--skills-path` | string | Path to connector skills directory (loads `lint-rules.json` files) |\n| `--config-path` | string | Path to `.wklintrc.json` configuration file |\n| `--tiers` | int array | Tier levels to run (e.g., `0,1`). Default: all |\n| `--profile` | string | Lint profile to use (overrides `.wklintrc.json` setting) |\n\nAlso runs automatically as a pre-push gate on `wk push` — errors block the push, warnings display but don't block, `--skip-lint` to bypass.\n\n## Tiers\n\nRules are organized into four tiers based on the analysis context they require.\n\n| Tier | What it checks | Tool |\n|------|---------------|------|\n| **0** | JSON structure — required keys, field types, step shape | Struct validation |\n| **1** | Each step independently — numbering, UUIDs, datapill syntax, EIS, formulas | Tree walker |\n| **2** | Relationships between steps — control flow ordering, terminal coverage, path completeness | Control flow graph |\n| **3** | Cross-step data flow — datapill reference resolution, provider matching, reachability | Graph + alias map |\n\nIf the control flow graph fails to build, Tiers 2-3 are skipped with a warning. Tiers 0-1 always run.\n\nSee the [Rule Reference](docs/rule-reference.md) for every rule ID, description, and default severity.\n\n## Custom Rules\n\nTeams can author custom lint rules as JSON — structural constraints, naming conventions, field requirements, architectural patterns. Rules run through the same tier engine as built-in rules.\n\n```json\n{\n  \"version\": \"0.2.0\",\n  \"rules\": [{\n    \"rule_id\": \"MAX_ONE_ACTION\",\n    \"tier\": 1, \"level\": \"error\",\n    \"message\": \"Recipe must have at most one action step\",\n    \"scope\": \"recipe\",\n    \"assert\": { \"step_count\": { \"where\": { \"keyword\": \"action\" }, \"max\": 1 } }\n  }]\n}\n```\n\nRules are discovered from two locations:\n- **Connector skills**: `lint-rules.json` files loaded via `--skills-path`\n- **Project rules**: `.wklint/rules/*.json` auto-discovered from the project root\n\nSee the [Rule Authoring Guide](docs/rule-authoring.md) for the full matcher reference, profiles, configuration, and examples.\n\n## Exit Codes\n\n| Code | Meaning |\n|------|---------|\n| 0 | No errors (warnings are OK) |\n| 1 | One or more lint errors found |\n| 2 | Invalid input (file not found, not valid JSON) |\n\n## Docs\n\n- [Rule Reference](docs/rule-reference.md) — every built-in rule ID, description, and default severity\n- [Rule Authoring Guide](docs/rule-authoring.md) — profiles, `.wklintrc.json` configuration, custom rule authoring\n- [Architecture Decisions](docs/adrs/) — tiered architecture, formula validation, profile system design, and how we use ADRs\n- [Linter Workflow Guide](https://github.com/workato-devs/recipe-skills/blob/main/docs/cli-guidance.md) — skills + linter integration patterns\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkato-devs%2Frecipe-lint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fworkato-devs%2Frecipe-lint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkato-devs%2Frecipe-lint/lists"}