Flowline 0.13.0

dotnet tool install --global Flowline --version 0.13.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local Flowline --version 0.13.0
                    
This package contains a .NET tool you can call from the shell/command line.
#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.

Docs CI NuGet NuGet downloads Donate

</td> <td width="120" align="right" valign="top">

Flowline CLI

</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 IPlugin classes 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 .dll or a NuGet .nupkg package (Dependent Assemblies).
  • Form events and web resource dependencies auto-wired from source// flowline:onload, // flowline:onsave, or // flowline:onchange binds a function straight to a form's event, closing the last manual step in the JS dev loop; // flowline:depends links JS-to-JS and RESX dependencies the same way. Both are registered and kept in sync on every push. 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. deploy cleans up removed solution components too. No stale registrations, no ghost records. Use --no-delete to opt out.
  • Dry-run before you touch anything--dry-run shows 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 designsync writes DATAVERSE_CONTEXT.md with your full schema (entities, attributes, option sets, forms, views, plugin steps); Copilot and Codex load it automatically via AGENTS.md; Claude Code via the CLAUDE.md file Flowline also scaffolds (a one-line @AGENTS.md import). Install Flowline as a Claude Code / Codex plugin (/plugin marketplace add RemyDuijkeren/Flowline) and an agent knows the full clone → push → sync → deploy loop — 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:onchange binds 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:depends links JS-to-JS and RESX dependencies, registered automatically on every push.
// flowline:onload account "Account Main"
export function onLoad(executionContext) { ... }

// flowline:onchange account "Account Main" creditlimit
export function onCreditLimitChange(executionContext) { ... }

Push WebResources wiki


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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
0.13.0 35 7/24/2026
0.12.0 97 7/17/2026
0.11.0 102 7/15/2026
0.10.0 104 7/12/2026
0.9.0 109 7/5/2026
0.8.0 115 6/29/2026
0.7.0 119 6/21/2026
0.6.0 126 6/5/2026
0.5.0 118 5/29/2026
0.4.0 138 5/7/2026
0.3.0 113 5/5/2026
0.2.0 130 4/19/2026
0.1.0 204 6/28/2025