ion-elgreco/rivers/migrate-to-rivers
Claude Code and agent skill by ion-elgreco/rivers
- community
Checking that the SKILL.md file is still in the repository.
Translate a Dagster or Prefect project to rivers, the Rust-powered asset orchestrator. Use when porting assets, ops, flows, tasks, jobs, schedules, sensors, partitions, IO managers, resources, retries, or automation conditions to rivers — or when asked to migrate/convert a data pipeline to rivers.
Install
npx vskill@latest install ion-elgreco/rivers/migrate-to-riversSKILL.md
Migrate to rivers
Port a Dagster or Prefect project to rivers without inventing API.
rivers is asset-centric like Dagster, so most Dagster concepts map closely — but the spellings differ in ways that look right and fail at import. Prefect maps loosely: its flows are imperative, rivers' graph is declarative, so parts of a Prefect project need design decisions rather than translation.
Ground rule
Never write a rivers symbol you have not verified. The API is small enough to check and niche enough that a plausible guess is usually wrong. Before using any name:
- Check
references/rivers-api.md(in this skill) — signature-exact, generated from the type stubs. - If it isn't there, read the stubs directly:
python/rivers/_core/**/__init__.pyiin the rivers source, orpython -c "import rivers; help(rivers.X)". - Only then, the docs site.
Guessing costs more than checking: PartitionsDefinition.static_ (trailing underscore), MetadataValue.float_, daily(start=datetime(...)) (a datetime, not a string) are all things a confident guess gets wrong.
Workflow
1. Inventory the source project
Read the whole source project before porting anything. Produce a written inventory:
- Assets/flows — name, upstream deps, partitioning, IO manager, resources used
- Orchestration — jobs, schedules, sensors, automation conditions/triggers
- Infrastructure — executors, work pools, K8s config, concurrency limits
- Config & secrets —
dg.Configclasses,ConfigurableResources, Prefect Blocks, env vars - Things with no rivers equivalent — asset checks, integrations without a rivers port, Prefect transactions, Cloud-only features
Report the last group to the user early. Do not silently drop or fake them.
2. Map concepts
Read the relevant reference file in full before writing code:
- Dagster →
references/from-dagster.md - Prefect →
references/from-prefect.md
Both carry a mapping table, before/after code for every concept, and a gotchas section covering the traps that survive a naive port (sensor cursors, config generics, partition key formats).
3. Port, in dependency order
Bottom-up. The graph is the skeleton; everything else attaches to it.
- Resources and IO handlers — assets reference them, so they exist first
- Assets — the DAG, without partitions or automation
- Partitions — partition defs, then partition mappings on the edges
- Automation — automation conditions, schedules, sensors
- Jobs, executors, concurrency — the run-shaping layer
- `CodeRepository` — assembled last, since it registers all of the above
Port a slice at a time and validate it (step 4) before moving on. A 40-asset project ported in one shot fails with 40 tangled errors.
Keep the source project's module layout unless the user asks otherwise — a diffable port is easier to review than a reorganized one.
4. Validate continuously
Three gates, cheapest first:
repo.validate() is the fast inner loop: it catches cycles, missing upstreams, unresolvable resource params, and bad partition defs in milliseconds without touching storage. Run it after every slice; only reach for the other two once a slice validates.
Then port the tests. If the source project has none, write at least one materialization test per asset group — rivers tests are ordinary pytest against repo.materialize() and repo.load_node().
5. Report
Summarize for the user:
- What ported cleanly
- What changed semantically — every place the rivers version behaves differently (see the gotchas sections; sensor cursors and Prefect's imperative control flow are the usual culprits)
- What was dropped, and why
- What needs their decision
Semantic drift is the thing a migration must surface. A port that runs but computes something subtly different is worse than one that fails loudly.
Scope discipline
Translate what exists. A migration is not the moment to redesign the pipeline, add error handling the original lacked, or "improve" asset boundaries. If the source has a genuine bug, mention it — don't fix it silently in the port.
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/migrate-to-rivers/SKILL.md
Popularity
- Repository stars
- 101
- Repository forks
- 9
- 7-day trend score
- 23
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 23 Sep 2026, a month ago.
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/ion-elgreco/rivers/migrate-to-rivers)