Foundation.Data.Doublets.Cli 3.1.0

dotnet add package Foundation.Data.Doublets.Cli --version 3.1.0
                    
NuGet\Install-Package Foundation.Data.Doublets.Cli -Version 3.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Foundation.Data.Doublets.Cli" Version="3.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Foundation.Data.Doublets.Cli" Version="3.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Foundation.Data.Doublets.Cli" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Foundation.Data.Doublets.Cli --version 3.1.0
                    
#r "nuget: Foundation.Data.Doublets.Cli, 3.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Foundation.Data.Doublets.Cli@3.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Foundation.Data.Doublets.Cli&version=3.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Foundation.Data.Doublets.Cli&version=3.1.0
                    
Install as a Cake Tool

C# CI/CD Pipeline NuGet (clink) NuGet (library) GitHub Release

This directory contains the production .NET implementation, published as two NuGet packages from a shared source tree:

Package Project Install Use case
clink Foundation.Data.Doublets.Cli/ dotnet tool install --global clink Run the CLI without writing any C#.
Foundation.Data.Doublets.Cli Foundation.Data.Doublets.Cli.Library/ dotnet add package Foundation.Data.Doublets.Cli Embed the parser, query processors, decorators, named/pinned types, persistent transformation trigger decorator, and LiNo I/O in another .NET project.

The CLI csproj only contains Program.cs plus the System.CommandLine wiring; every reusable type lives in the library project so external apps can recreate or extend the CLI without re-implementing any of the internals.

Install

dotnet tool install --global clink

Update an existing installation:

dotnet tool update --global clink

To consume the library inside another .NET project:

dotnet add package Foundation.Data.Doublets.Cli

API documentation is generated by DocFX from the library's XML doc comments and is published to GitHub Pages alongside the Rust rustdoc site by .github/workflows/docs.yml.

Use

clink '() ((1 1))' --changes --after

The CLI exposes the complete command surface, including persistent transformation triggers with --always, --once, --never, --triggers, --triggers-file, and --embed-triggers. Each option is implemented in the public library, so other .NET applications can call into the same processors directly.

Optional Transactions and Version Control

Pass --transactions (or any flag in the family — --transactions-file, --commit-mode, --retention, --log) to record each Create/Update/Delete as a reversible transition in a sidecar doublets store. Pass --vc (or --vc-file, --branch, --branch-from, --checkout, --tag, --list-branches, --list-tags) to add a version-control layer over the recorded transitions log:

# Record reversible transitions into data.transitions.links
clink --db data.links --transactions --auto-create-missing-references '() ((1 1))'
clink --db data.links --log

# Branch and tag on top of the transitions log
clink --db data.links --vc --tag v1
clink --db data.links --vc --branch feature --branch-from 1
clink --db data.links --vc --list-branches

BeginTransaction() / Commit() / Rollback() are also exposed on the library API for explicit batches. End-to-end demo scripts live in examples/transactions/ and examples/version-control/.

Use as a library

Foundation.Data.Doublets.Cli.Library is usable as an embedded transactional store, not only as the code behind clink.

using Foundation.Data.Doublets.Cli;
// `CreateAndUpdate` and `Exists` are extension methods on `ILinks<T>`.
using Platform.Data;
using Platform.Data.Doublets;

// A `ulong`-addressed store; the CLI's own `uint` store is the
// non-generic `TransactionsDecorator`.
using var data = new NamedTypesDecorator<ulong>("db.links");
using var log = new NamedTypesDecorator<ulong>("db.transitions.links");
using var transactions = new TransactionsDecorator<ulong>(data, log);

using (var transaction = transactions.BeginTransaction())
{
    transactions.CreateAndUpdate(transactions.Constants.Null, transactions.Constants.Null);
    transaction.Commit();
}

A runnable version of this is examples/embedded-store/csharp (dotnet run --project examples/embedded-store/csharp).

  • Any address type. TransactionsDecorator<TLinkAddress> works over any INamedTypesLinks<TLinkAddress> whose address is an IUnsignedNumber<TLinkAddress>; the non-generic TransactionsDecorator stays behind as the uint specialisation the CLI uses. The transitions wire format writes addresses in decimal under the invariant culture, so it is identical across address types, and an address that does not fit the target type is rejected rather than silently truncated.
  • Crash recovery. Recovery runs when the decorator is constructed: committed-but-unapplied transitions are replayed and transitions that were never committed are rolled back, so an abandoned transaction leaves nothing behind after a reopen.
  • Multi-process access. LinksFileLock locks a <database>.lock sidecar, shared for readers and exclusive for writers, with a blocking Acquire and a non-blocking TryAcquire. StorageRevision.Of(path) / revision.HasChanged(path) answer "has anyone else written since I last looked?" without reparsing the database. The lock file path and the shared/exclusive semantics match the Rust storage::lock module, so both implementations can guard the same database.

Develop

dotnet restore
dotnet build --configuration Release
dotnet test --configuration Release

Release automation for this package lives in csharp/scripts/ and uses changesets from csharp/.changeset/.

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.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.1.0 74 8/29/2026
3.0.0 79 8/29/2026
2.6.0 87 8/18/2026
2.5.0 129 5/15/2026