astronomer/agents/dag-factory
Claude Code and agent skill by astronomer/agents
- community
Checking that the SKILL.md file is still in the repository.
Authors Apache Airflow DAGs declaratively from dag-factory YAML configs. Use when building DAGs declaratively from YAML via dag-factory; creating/editing dag-factory templates/YAML configs,reating/editing dag-factory YAML configs, defaults, dynamic tasks, datasets, or callbacks; or validating dag-factory configurations; upgrading or re-pinning dag-factory.
Install
npx vskill@latest install astronomer/agents/dag-factorySKILL.md
DAG Factory
You are helping a user build Apache Airflow DAGs declaratively with dag-factory, a library that turns YAML configuration files into Airflow DAGs. Execute steps in order and prefer the simplest configuration that meets the user's needs.
Package:dag-factoryon PyPIRepo: https://github.com/astronomer/dag-factoryDocs: https://astronomer.github.io/dag-factory/latest/Targets: dag-factory v1.0+ only. For pre-1.0 projects, see reference/migration.md before applying any guidance from this skill.Requires: Python 3.10+, Airflow 2.4+ (Airflow 3 supported)
Before Starting
Confirm with the user:
- Airflow version ≥2.4
- Python version ≥3.10
- dag-factory version: this skill targets v1.0+. If the project is on <1.0, follow reference/migration.md to upgrade before continuing.
- Use case: dag-factory is for declarative, low-code DAG authoring. If the user needs reusable, validated Pythonic templates with Pydantic, suggest blueprint instead. If they need full Python flexibility, suggest the authoring-dags skill.
Determine What the User Needs
| User Request | Action | |
|---|---|---|
| "Create a YAML DAG" / "Convert this Python DAG to YAML" | Go to Defining a DAG in YAML | |
| "Set up dag-factory in my project" | Go to Project Setup | |
| "Share defaults across DAGs" / "Set start_date once" | Go to Defaults | |
| "Use a custom operator" / "Use KPO / Slack / Snowflake" | Go to Custom & Provider Operators | |
| "Dynamic / mapped tasks" / "expand / partial" | Go to Dynamic Task Mapping | |
| "Schedule on dataset" / "Outlets and inlets" | Go to Datasets | |
| "Add a callback" / "Slack on failure" | Go to Callbacks | |
| "Use a timetable" / "datetime in YAML" / "timedelta in YAML" | Go to Custom Python Objects (`__type__`) | |
| "Lint my YAML" / "Validate" | Go to Validation Commands | |
| "Convert Airflow 2 YAML to Airflow 3" | Go to Validation Commands (dagfactory convert) | |
| "Migrate from dag-factory <1.0" | See reference/migration.md | |
| dag-factory errors / troubleshooting | Go to Troubleshooting |
Project Setup
1. Install the Package
Add to requirements.txt:
dag-factory does not install Airflow providers automatically. Install any provider packages your YAML references (e.g., apache-airflow-providers-slack, apache-airflow-providers-cncf-kubernetes).
2. Create the Loader
Create dags/load_dags.py so Airflow's DAG processor will pick it up:
globals_dict=globals() is required so generated DAG objects are registered into the module namespace where Airflow can discover them.
3. Verify Installation
Defining a DAG in YAML
Each top-level YAML key (other than default) defines a DAG. The key becomes the dag_id. Use the list format for `tasks` and `task_groups` — it is the recommended format since v1.0.0.
Key Fields
| Field | Where | Purpose | |
|---|---|---|---|
default | top-level | Shared DAG-level args applied to every DAG in this file | |
default_args | DAG or default block | Standard Airflow default_args (owner, retries, start_date, ...) | |
schedule | DAG | Cron expression, preset (@daily), Dataset list, or __type__ timetable | |
catchup / description / tags | DAG | Standard Airflow DAG kwargs | |
tasks | DAG | List of task dicts; each requires task_id and operator | |
operator | task | Full import path to operator class (e.g. airflow.operators.bash.BashOperator) | |
dependencies | task / task_group | List of upstream task_ids or group_names | |
task_groups | DAG | List of group dicts; each requires group_name | |
task_group_name | task | Assigns a task to a task group |
Tasks do not need to be ordered by dependency in the YAML — dag-factory resolves the DAG topology.
Dictionary Format (Legacy)
Pre-1.0 dictionary format (where tasks is a dict keyed by task_id) still works for backward compatibility, but prefer the list format for new code.
Defaults
There are four ways to set defaults, in precedence order (highest first):
default_args/ DAG-level keys inside an individual DAG- The top-level
default:block in the same YAML file defaults_config_dict=argument toload_yaml_dags- A
defaults.yml(ordefaults.yaml) file viadefaults_config_path=(or auto-detected next to the DAG YAML)
Note: loader argument names and several other field names changed in v1.0.0. See reference/migration.md if you're working on an older project.
default Block in the Same File
Powerful for templating multiple DAGs from one file:
defaults.yml File
Place a defaults.yml next to the DAG YAML, or point defaults_config_path at a parent directory. dag-factory merges all defaults.yml files walking up the directory tree, with the file closest to the DAG YAML winning. DAG-level args (e.g. schedule, catchup) go at the root of defaults.yml; per-task defaults go under default_args.
Custom & Provider Operators
Reference any operator by its full Python import path. dag-factory passes all other task keys as kwargs to that operator.
The operator's package must be installed and importable. For Airflow 3, prefer airflow.providers.standard.operators.* over the legacy airflow.operators.* paths — the dagfactory convert CLI rewrites these automatically.
KubernetesPodOperator
Specify the operator path and pass kwargs directly. As of v1.0, dag-factory no longer does legacy type casting — use __type__ for nested k8s objects.
Dynamic Task Mapping
Use expand and partial keys on a task to map dynamically. dag-factory has two distinct ways to reference an upstream task's output:
- `task_id.output` — XCom-style reference, used inside
expandop_args/op_kwargs(and the equivalent kwargs of other operators). - `+task_id` — bare value reference, used when the value sits directly under
expand(e.g.expand: {number: +numbers_list}) or as a TaskFlow decorator argument.
Don't mix them: +request won't resolve inside op_args, and request.output won't resolve as a bare expand value.
Bare-value form (TaskFlow decorator tasks, or any non-op_args mapping):
For named map indices (Airflow 2.9+), set map_index_template: "{{ task.custom_mapping_key }}" and have the callable assign context["custom_mapping_key"].
Tested patterns: simple mapping, task-generated mapping, repeated mapping, partial, multiple-parameter mapping, map_index_template. Unsupported / untested: mapping over task groups, zipping, transforming expanding data.
Datasets
Use inlets / outlets on tasks to declare dataset producers, and a list of dataset URIs as schedule to consume them.
Conditional Dataset Scheduling (Airflow 2.9+ / dag-factory 0.22+)
Nesting the logical operators __and__ / __or__ under datasets key.
Callbacks
Three styles, all valid at the DAG, TaskGroup, or Task level (or under default_args):
1. String pointing to a callable
With kwargs:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/dag-factory/SKILL.md
Popularity
- Repository stars
- 412
- Repository forks
- 56
- 7-day trend score
- 30
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/astronomer/agents/dag-factory)