JustDummies.Cli
1.1.0-beta.3
dotnet tool install --global JustDummies.Cli --version 1.1.0-beta.3
dotnet new tool-manifest
dotnet tool install --local JustDummies.Cli --version 1.1.0-beta.3
#tool dotnet:?package=JustDummies.Cli&version=1.1.0-beta.3&prerelease
nuke :add-package JustDummies.Cli --version 1.1.0-beta.3
dum — the JustDummies scaffolder
dum writes the dummy generator for one of your types, once, as ordinary
code you own and edit. It is not a source generator and it does not run at build
time: it reads your compilation, emits a file, and gets out of the way.
dotnet tool install --global JustDummies.Cli
dum generate Order
What it produces
Run from your test project — that is where the file belongs, and where the type is reachable from:
$ dum generate Order
Analyzing Shop.Domain.Order
constructor Order(OrderReference, Customer, int, OrderStatus, IReadOnlyList<string>, DateTime)
reference OrderReference Any.String().NonEmpty().As(OrderReference.Create) factory, guard
customer Customer — TODO
quantity int Any.Int32().Positive() guard
status OrderStatus Any.Enum<OrderStatus>()
tags IReadOnlyList<string> Any.ListOf(Any.String().NonEmpty())
placedAt DateTime Any.DateTime()
✓ AnyOrder.cs — 5 of 6 parameters inferred, 1 TODO.
The file will not compile until you resolve it. That is deliberate.
AnyOrder.cs is a partial class implementing IAny<Order>, with a With…
method per constructor parameter. It is yours from that moment: read it, edit
it, commit it. Re-running with --force overwrites it.
What the right-hand column means
It is the point of the recap, not decoration — it says what was inferred and what was guessed:
| Word | Meaning |
|---|---|
| (empty) | straight from the base table for that type |
guard |
a constructor guard tightened it (quantity <= 0 → .Positive()) |
factory |
composed through a static factory (.As(OrderReference.Create)) |
AnyX |
a generator you already scaffolded was reused |
TODO |
nothing could be inferred; the file names what to do |
unavailable |
the generator exists in JustDummies but not in the asset your project resolves |
customer above is open because AnyCustomer does not exist yet. Scaffold it,
rebuild, re-run with --force, and the line closes to new AnyCustomer(). That
two-step is the intended way through a graph of aggregates.
A TODO is not a failure. The tool emits an identifier that does not exist, so your own build reports what it could not infer, at the exact line, with the type in hand. A generator that quietly drew a plausible value there would be far worse.
Reaching it as Any.Order()
new AnyOrder() always works. If you would rather the arrange block read alike
throughout — Any.Int32() on one line and Any.Order() on the next — ask for an
entry point, and a second file lands beside the generator:
dum generate Order --entry-point any # Any.Order() needs C# 14
dum generate Order --entry-point static:Dummies # Dummies.Order() needs nothing
AnyOrder.cs is byte-identical either way, so nothing about the generator
changes. Below C# 14 the first form is refused rather than quietly swapped for
the second.
Reporting to a script
A file written with open TODOs is a success, so the exit code reads the
same whether every parameter resolved or a third of them did not. --format json
says which — one JSON document on stdout, with summary.openParameters and a row
per parameter. The exit codes are unchanged; this adds a channel.
Setting defaults once
Options that describe the project rather than the invocation go in a dum.json
beside the project file — output, namespace, entryPoint,
entryPointNamespace, format. The command line always wins over it, and a key
it does not read is refused rather than ignored.
Options
| Option | Default | Meaning |
|---|---|---|
--project <path> |
the single *.csproj in the current directory |
project whose compilation is analyzed |
--output <dir> |
the current directory | where the file is written |
--namespace <ns> |
the target type's namespace | namespace of the emitted type |
--entry-point <v> |
none |
also emit an entry point: none, static:<Name> or any |
--entry-point-namespace <ns> |
the emitted type's namespace | namespace of the entry-point file alone |
--force |
off | overwrite an existing file — both files, where there are two |
--dry-run |
off | print the file to stdout; write nothing |
--format <f> |
human |
how the run reports itself: human or json |
dum generate Order Customer Invoice scaffolds several; they are processed
independently, and the exit code is the worst of them. Exit 0 is a file
written (TODOs and all), 1 a scaffolding run that failed, 2 an instruction the
tool could not read — a command line, or a dum.json.
It never references JustDummies
The tool resolves every library symbol by name against your compilation, and
declares no dependency on the library. So the tool and the library version
independently, and dum will not drag a JustDummies upgrade into your project —
if a generator does not exist in the asset you resolve, it says so rather than
emitting a call that will not compile.
Requires
The JustDummies package in the
project being analyzed — without it nothing can be resolved, and dum says so.
The tool itself targets .NET 8 and rolls forward, so any newer runtime you have
installed will run it.
Links
Credits
The package icon is a crash-test dummy by Magnific, from Flaticon.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.0-beta.3 | 124 | 8/24/2026 |
| 1.1.0-beta.2 | 128 | 8/22/2026 |
| 1.1.0-beta.1 | 70 | 8/13/2026 |
| 1.0.0-beta.1 | 595 | 8/10/2026 |