Flowline 0.13.0
dotnet tool install --global Flowline --version 0.13.0
dotnet new tool-manifest
dotnet tool install --local Flowline --version 0.13.0
#tool dotnet:?package=Flowline&version=0.13.0
nuke :add-package Flowline --version 0.13.0
Flowline
<table> <tr> <td>
Flowline is a Dataverse ALM CLI — structured workflow, Git-tracked solutions, and a fast push to DEV without the enterprise overhead.
</td> <td width="120" align="right" valign="top">
![]()
</td> </tr> </table>
PAC CLI gives you the primitives — Flowline gives you the workflow.
A professional Git-based workflow for plugin developers and solution architects, without the overhead of Power Platform Pipelines or managed solutions. clone → push → sync → deploy, from the inner dev loop to production, in one tool.
Where PAC CLI already handles it, Flowline wraps — it doesn't re-implement. Where PAC has no answer, Flowline fills the gap.
Pipelines are buried steel — permits, compressors, years to commission. A flowline goes where the pipeline can't.
Familiar with spkl? Flowline is an actively maintained successor inspired by spkl, whose last meaningful updates date back to 2021.
What sets Flowline apart:
- Attribute-driven plugin registration — decorate your
IPluginclasses with[Step],[Filter],[PreImage],[PostImage], and[CustomApi]; Flowline reads the assembly and handles every Dataverse registration. No Plugin Registration Tool needed. Works with a classic.dllor a NuGet.nupkgpackage (Dependent Assemblies). - Form events and web resource dependencies auto-wired from source —
// flowline:onload,// flowline:onsave, or// flowline:onchangebinds a function straight to a form's event, closing the last manual step in the JS dev loop;// flowline:dependslinks JS-to-JS and RESX dependencies the same way. Both are registered and kept in sync on everypush. No Maker Portal visits, no manual Configure Event dialogs, or dependency trees. - Orphan cleanup built in — steps, step images, and web resources missing from source are deleted from Dataverse on every
push.deploycleans up removed solution components too. No stale registrations, no ghost records. Use--no-deleteto opt out. - Dry-run before you touch anything —
--dry-runshows exactly what would change before a single Dataverse record is touched. Run it as a CI safety gate or any time you want confidence. No other Dataverse ALM tool offers this. - AI-native by design —
syncwritesDATAVERSE_CONTEXT.mdwith your full schema (entities, attributes, option sets, forms, views, plugin steps); Copilot and Codex load it automatically viaAGENTS.md; Claude Code via theCLAUDE.mdfile Flowline also scaffolds (a one-line@AGENTS.mdimport). Install Flowline as a Claude Code / Codex plugin (/plugin marketplace add RemyDuijkeren/Flowline) and an agent knows the fullclone → push → sync → deployloop — and how to migrate off other tools, like spkl — before you've even cloned a project.
Install
dotnet tool install --global Flowline
Prerequisites: .NET SDK 10 or later, Git, and PAC CLI:
Authenticate using PAC CLI before using Flowline:
pac auth create --environment https://your-org.crm4.dynamics.com
Quick start (project mode)
# One-time: bootstrap an existing solution into the Git repo
flowline clone ContosoSales --prod https://contoso.crm4.dynamics.com
# Daily dev loop
flowline push # push code assets to DEV
flowline sync # pull Dataverse changes back to source
git commit -m "feat: add validation"
# Promote
flowline deploy test
flowline deploy prod
For full setup, auth, and project workflow: Getting Started
Plugin registration
flowline push inspects your compiled plugin assembly and registers every step, image, and Custom API in Dataverse — no Plugin Registration Tool, no Maker Portal.
Decorate your IPlugin classes with [Step], [Filter], [PreImage], [PostImage], or [CustomApi] from the source-only Flowline.Attributes package:
<PackageReference Include="Flowline.Attributes" Version="1.0.0" PrivateAssets="all" />
Then you can do:
[Step("account")]
[Filter("creditlimit")]
public class CreditLimitValidationUpdatePlugin : IPlugin
{
public void Execute(IServiceProvider sp)
{
var ctx = (IPluginExecutionContext)sp.GetService(typeof(IPluginExecutionContext));
var target = (Entity)ctx.InputParameters["Target"];
if (target.GetAttributeValue<Money>("creditlimit")?.Value > 100_000)
throw new InvalidPluginExecutionException("Credit limit cannot exceed 100,000.");
}
}
Already have a built assembly? Push it standalone, no cloned project needed:
flowline push ContosoSales --pluginFile ./bin/Release/Plugins.dll --dev https://contoso-dev.crm4.dynamics.com
Flowline.Attributes reference · Push Plugins and Custom APIs wiki
Web resources
flowline push syncs your local web resource files straight to Dataverse — no Maker Portal upload, no manually created web resource records.
Point it at a build output folder, and it creates, updates, and removes web resources to match, standalone, no cloned project needed:
flowline push ContosoSales --webresources ./dist --dev https://contoso-dev.crm4.dynamics.com
Beyond the sync itself, Flowline reads // flowline:... comment annotations straight out of your built files and uses them to auto-wire Dataverse metadata that would otherwise mean a Maker Portal visit:
// flowline:onload,// flowline:onsave, or// flowline:onchangebinds a function to a form's event — Flowline registers (and keeps in sync) the Form Event Handler and its Form Library entry, closing the last manual step in the JS dev loop.// flowline:dependslinks JS-to-JS and RESX dependencies, registered automatically on everypush.
// flowline:onload account "Account Main"
export function onLoad(executionContext) { ... }
// flowline:onchange account "Account Main" creditlimit
export function onCreditLimitChange(executionContext) { ... }
Commands
| Command | What it does |
|---|---|
clone <solution> |
Bootstrap an existing solution from Dataverse into the repo |
push [solution] |
Build and sync code assets to DEV; or push standalone with --pluginFile / --webresources |
sync [solution] |
Pull the current solution state from DEV into source control |
deploy <target> |
Pack from the repo and import into test, uat, prod, or a URL |
provision [dev\|test\|uat] |
Provision a DEV, TEST or UAT environment by copying from production |
generate [solution] |
Generate early-bound C# types into Plugins/Models/ (configurable with --output) |
status |
Show environment info, Flowline version, and PAC CLI status |
drift <target> |
Compare committed source against a live environment; read-only, never deletes or modifies |
sln add <path> |
Add a .cdsproj to the solution file — dotnet sln add refuses those. Runs standalone |
Documentation
Full docs live on the Wiki. Using an AI agent? See AI Agents for the exit-code contract and how to install Flowline as a Claude Code / Codex plugin.
Coming from another tool? Migration from spkl · Migration from Daxif · Migration from ALM Accelerator · Migration from PACX
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.