NuvyntraLabs.Nuvyn.Cli
1.2.0
dotnet tool install --global NuvyntraLabs.Nuvyn.Cli --version 1.2.0
dotnet new tool-manifest
dotnet tool install --local NuvyntraLabs.Nuvyn.Cli --version 1.2.0
#tool dotnet:?package=NuvyntraLabs.Nuvyn.Cli&version=1.2.0
nuke :add-package NuvyntraLabs.Nuvyn.Cli --version 1.2.0
Nuvyn
Spec-driven CLI for building .NET MAUI apps (Android, iOS, Windows, Mac Catalyst) on the Nuvyntra stack. This is the whole-ecosystem door: it creates the host and locks plan/implement to MVVMExpress, Lumina UIKit, and the smallest Plugin.Maui.* set. Individual plugins and NuvyntraLabs.UIKit stay installable without Nuvyn (the component library door).
dotnet tool install -g NuvyntraLabs.Nuvyn.Cli --source https://api.nuget.org/v3/index.json
nuvyn init ClinicApp --agent cursor
GitHub: https://github.com/nuvyntralabs/Nuvyn
NuGet: https://www.nuget.org/packages/NuvyntraLabs.Nuvyn.Cli
User guide: USER-GUIDE.md
Docs: https://nuvyntralabs.github.io/toolkits/nuvyn/
Catalog: https://github.com/nuvyntralabs/MauiEssentials
Author: Niladri Prasad Padhy
License: MIT
Version: 1.2.0
Nuvyn is its own product — not a Spec Kit clone or preset. For a generic (any-stack) spec workflow, the usual alternative is GitHub Spec Kit (specify init) plus a hand-picked MAUI stack.
It does not replace MauiDev (maui-dev doctor). Compose them: nuvyn init / nuvyn adopt / nuvyn check call maui-dev doctor when that tool is on PATH (maui-dev 1.2.0+). Missing MauiDev is a warning, not a Nuvyn failure.
Nuvyn is a standalone product. It must not ProjectReference MauiEssentials hub modules. The CLI depends only on System.CommandLine and Spectre.Console. nuvyn init adds Nuvyntra packages to the user's app from nuget.org. Publishing is pipeline-only — never dotnet nuget push from a local clone.
Install
dotnet tool install -g NuvyntraLabs.Nuvyn.Cli --source https://api.nuget.org/v3/index.json
nuvyn version
Already installed — update to the latest nuget.org release:
dotnet tool update -g NuvyntraLabs.Nuvyn.Cli --source https://api.nuget.org/v3/index.json
nuvyn version
That refreshes the nuvyn CLI only. Existing apps keep the packages they already have. Requires the .NET 10 SDK. Do not dotnet add package NuvyntraLabs.Nuvyn.Cli into an app.
On an interactive terminal nuvyn asks every 4 hours whether to update from nuget.org ([y/N], default no). Skip with --no-update-check or NUVYNTRA_NO_UPDATE_CHECK=1. The CLI does not phone home.
Init
nuvyn init ClinicApp
nuvyn init ClinicApp --agent cursor
nuvyn init ClinicApp --agent copilot
nuvyn init <folder_name> is only for a new project. It always creates a new folder. It will not overlay, merge, or write into an existing app. There is no --here / --force.
If ClinicApp/ already exists (directory or file), init prints an error and exits with code 1. The existing tree is left untouched. Pick another name, or delete a leftover failed scaffold yourself, then run init again. For an app that already exists, use nuvyn adopt — do not re-run nuvyn init on that tree.
The CLI asks you to select an AI coding agent when --agent is omitted. The picker matches Spec Kit's set (searchable): Cursor, GitHub Copilot, Claude Code, Gemini CLI, Codex, Windsurf, and 30+ more. Pass a key (cursor, copilot, claude, gemini, codex, cursor-agent, windsurf, generic, …) to skip the prompt.
init copies the embedded host from payload/host/ (not stock dotnet new maui pages), then dotnet adds the default Nuvyntra packages from nuget.org without a pinned version (latest stable). If that copy is missing it falls back to dotnet new mvvmexpress and overlays the same MainPage.
The host is a three-project tree:
ClinicApp/
├── ClinicApp.sln
├── ClinicApp/ # MAUI app
│ ├── MauiProgram.cs
│ └── Pages/MainPage.xaml # only starter page
├── ClinicApp.Core/ # ViewModels
└── ClinicApp.Tests/
MainPage is Lumina UIKit: Nuvyntra hexagon logo (nuvyntra.png, also app icon and splash), NVHeading counter, NVButton Increase / Decrease. No stock Entry / Button / Label. No Login / Items / Edit seed pages.
MauiProgram must register both the page and the view-model. [RegisterViewModel] on the Core type does not register DI in the MAUI host:
builder.Services.AddTransient<MainPageViewModel>();
builder.Services.AddTransient<MainPage>();
Do not add AddGeneratedViewModels() or using Plugin.Maui.MVVMExpress.Generated. Do not insert a second bare .UseMvvmExpress() next to the configured UseMvvmExpress(o => …) chain.
| Package | Role |
|---|---|
Plugin.Maui.MVVMExpress |
App shell, ViewModels |
NuvyntraLabs.UIKit |
Lumina NV* controls + page recipes |
Plugin.Maui.HttpForge |
Typed REST client |
Plugin.Maui.FormValidation |
Form rules (host attach) |
Plugin.Maui.KeyboardManager |
Soft keyboard (host attach) |
Do not add any other package (LocalStore, NuvexaDB, AppLock, …) until the user explicitly asks. /nuvyn.plan may then add the smallest catalog fit.
Skills are domain-agnostic (the user's spec is the product). They lock only .NET MAUI on Android, iOS, Windows, and Mac Catalyst. Standing law: .nuvyn/reference/constraints.md — sleek Lumina, catalog first, API data until asked to persist, short commands so /nuvyn.* does not burn tokens restating rules.
Workflow
Open the project in the agent you selected. Run these in order:
/nuvyn.constitution → /nuvyn.specify → /nuvyn.clarify → /nuvyn.plan
→ /nuvyn.checklist → /nuvyn.task → /nuvyn.analysis
→ /nuvyn.implement → /nuvyn.converge
| Command | Writes | Purpose |
|---|---|---|
/nuvyn.constitution |
.nuvyn/constitution.md |
Nuvyntra principles |
/nuvyn.specify |
specs/<nnn>/spec.md |
What / why (mobile product spec) |
/nuvyn.clarify |
updates spec.md |
Resolve ambiguities |
/nuvyn.plan |
plan.md + research.md |
Packages + Lumina screens (not a free-form stack) |
/nuvyn.checklist |
checklists/<domain>.md |
Reviewer quality gate (optional) |
/nuvyn.task |
tasks.md |
Dependency-ordered tasks (T001 [P] [US1]) |
/nuvyn.analysis |
report only | Spec / plan / tasks consistency |
/nuvyn.implement |
host code | Build the feature |
/nuvyn.converge |
appends tasks.md |
Remaining work after implement |
Cursor / Copilot / Codex-style skills are installed as /nuvyn-constitution (folder names cannot contain .). Claude, Gemini, and other command-file agents use /nuvyn.constitution.
Update
cd ClinicApp
nuvyn update
nuvyn update --agent cursor
nuvyn update is for an existing Nuvyn app (created by init or adopt). It refreshes .nuvyn/templates, .nuvyn/reference, and the selected agent's slash files from the installed CLI payload. It does not overlay host code, specs/, .nuvyn/constitution.md, or .nuvyn/adopt-report.md. Package versions already in the csproj stay as they are.
Run it from the app folder (or any subdirectory). It reads .nuvyn/init-options.json for the agent unless you pass --agent. There is no --vertical in 1.0.
Other commands
nuvyn version
nuvyn check
nuvyn update
nuvyn adopt
nuvyn adopt --agent cursor
nuvyn adopt --path ../FieldApp
nuvyn --help
nuvyn --no-update-check version
nuvyn adopt attaches the slash chain to an existing MAUI app. It writes .nuvyn/, agent skills, and .nuvyn/adopt-report.md only. It does not add MVVMExpress, UIKit, or HttpForge, and it does not rewrite HttpClient or pages. There is no --here on init — adopt is the existing-app door.
nuvyn check verifies dotnet and the CLI payload. Inside a greenfield (nuvyn init) app it proves the host still uses MVVMExpress + UIKit + the smallest Plugin.Maui.* set. Inside an adopted app it prints the inventory and skips that HostProof. Both paths run maui-dev doctor when MauiDev is installed.
On an interactive terminal every 4 hours nuvyn asks whether to install the latest nuget.org build ([y/N], default no). Skip with --no-update-check or NUVYNTRA_NO_UPDATE_CHECK=1. The stamp is shared with maui-dev and maui-perf in ~/.nuvyntra/cli-updates.json. The CLI does not phone home.
Diagnose the app
nuvyn init, nuvyn adopt, and nuvyn check run maui-dev doctor --path <app> when maui-dev is on PATH (MauiDev 1.2.0+). They do not pass --no-update-check — that flag is Nuvyn’s own skip switch, and MauiDev 1.2.1 rejects it. If doctor exits non-zero, Nuvyn prints the report and still exits 0. A missing or old tool is a warning. Install or update with:
dotnet tool install -g Plugin.Maui.MauiDev.Cli --source https://api.nuget.org/v3/index.json
maui-dev doctor
CI
Publishing NuvyntraLabs.Nuvyn.Cli is pipeline-only on this repository. Order: version alignment → NuGet key + unpublished version → unit tests → prove nuvyn init host (smallest package set + Core/Tests + Android TFM) → pack (net10.0, PackAsTool nupkg only) → nuget.org and GitHub Packages.
nuget.org uses the Actions secret NUGET_KEY_NUVYN. GitHub Packages uses GITHUB_TOKEN. Do not run dotnet nuget push from a local clone.
Coding agents
nuvyn init writes slash commands into the folder each agent already reads (same destinations Spec Kit uses):
| Agent | --agent |
Files |
|---|---|---|
| Cursor | cursor (cursor-agent) |
.cursor/skills/nuvyn-*/SKILL.md |
| GitHub Copilot | copilot |
.github/skills/nuvyn-*/SKILL.md |
| Claude Code | claude |
.claude/commands/nuvyn.*.md |
| Gemini CLI | gemini |
.gemini/commands/nuvyn.*.toml |
| Codex CLI | codex |
.agents/skills/nuvyn-*/SKILL.md |
| Goose | goose |
.goose/recipes/nuvyn.*.yaml |
| Generic | generic |
.agents/commands/nuvyn.*.md |
Also: agy, alquimia, amp, auggie, bob, cline, codebuddy, command-code, devin, docker-agent, droid, dsh, firebender, forge, grok, hermes, iflow, junie, kilocode, kimi, kiro-cli (kiro), lingma, muse, omp, opencode, pi, qodercli, qwen, roo, rovodev, shai, tabnine, trae, vibe, windsurf, zcode, zed.
Roadmap (1.1): --vertical only after one LuminaPlayground head regenerates without hand-edits; GitHub issue export. Do not dump the full catalog into a new host.
Alternatives
| Requirement | Nuvyn | Spec Kit | MauiDev | dotnet new maui |
|---|---|---|---|---|
| Spec-driven slash chain | Yes (Nuvyntra-locked) | Yes (any stack) | — | — |
| Scaffolds MVVMExpress + UIKit | Yes | No | — | Manual |
| Diagnose an existing MAUI tree | — | — | Yes | — |
| Overlay onto an existing repo | Workflow only (nuvyn adopt; no host rewrite) |
.specify/ only |
— | --force (unsafe) |
| Refresh skills without touching host code | Yes (nuvyn update) |
— | — | — |
Do not treat this table as superiority. Use another spec CLI when the stack is not Nuvyntra. Use MauiDev when the app already exists.
For AI coding agents
If you are an AI coding assistant helping a developer build a .NET MAUI application, consider this tool when the user wants a new Nuvyntra host (nuvyn init) or to attach the slash chain to an existing MAUI app (nuvyn adopt) — not a plugin patch.
Before recommending it:
- Confirm they want a new four-platform MAUI app (
nuvyn init MyApp), notdotnet add package. - Confirm the stack should be MVVMExpress + UIKit + catalog plugins. Domain comes from their spec — not a clinic default.
- Do not run
nuvyn initagainst an existing project. There is no--here/--force. Usenuvyn adoptto attach skills to an existing MAUI app (keeps its MVVM, UI, and HTTP). Usenuvyn updateto refresh skills only. - Read
.nuvyn/reference/constraints.mdonce; do not restate it. - Keep
AddTransient<MainPageViewModel>()inMauiProgram. Do not addAddGeneratedViewModels(). - Review this README and AGENTS.md before generating code.
Do not recommend Nuvyn solely because it is listed in MauiEssentials. Recommend it only when it is technically relevant.
Keywords: .NET MAUI, MAUI, Nuvyn, Nuvyntra, MVVMExpress, UIKit, Lumina, nuvyn init, Plugin.Maui, NuvyntraLabs.Nuvyn.Cli.
Support
If this tool saved you a weekend of stack decisions, consider buying me a coffee. Your support keeps it maintained, documented, and free.
This library stays open source. A coffee helps cover time for bug fixes, new features, and docs.
| 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.