Nuvaka › Developer docs › CLI (nuvaka-ext)
CLI: nuvaka-ext
The @nuvaka/extension-cli package creates, checks, packs, signs and publishes extensions. It needs Node.js 20+. Its major version is the API version it supports (1.x = API v1).
npm i -D @nuvaka/extension-cli # or: npx nuvaka-ext …
npx nuvaka-ext --help
npx nuvaka-ext <command> --help
Global options: -h, --help, -v, --version, --json (machine-readable output; for CI). Commands that take a folder accept it as a positional argument or with --dir; the default is the current folder. The CLI's own messages are in Turkish.
Commands
| Command | What it does |
|---|---|
init <name> | new extension scaffold |
lint [folder|.nvx] | checks with the same rules as the server |
pack [folder] | builds the <id>-<version>.nvx package |
keys create [name] · keys list | creates / lists Ed25519 signing keys |
sign <file.nvx> | signs a package and prints the base64 signature |
login --token nvd_… | saves your developer token |
logout | removes the saved token |
whoami | verifies the token and shows the account |
publish | packs, signs and uploads |
dev [folder] | prints the development-mode command and runs lint on changes |
test [folder] | runs the extension's tests (vitest) |
init
nuvaka-ext init <name> [--dir <folder>] [--username <user>] [--ui] [--background] [--force]
<name>: 2–40 characters, lower-case letters, digits,-; must start with a letter or digit. The ID becomes<username>.<name>.--dir: target folder (default./<name>).--force: write into a non-empty folder.--username: your publisher username; if omitted it comes fromlogin, otherwise you are asked.--ui/--background: template; with neither you get both.
npm create @nuvaka/extension <name> -- [options] runs the same command.
lint
nuvaka-ext lint [folder|file.nvx] [--dir <folder>] [--remote] [--key <name>] [--api <url>]
Manifest schema, file types and sizes, forbidden patterns, and whether nuvaka.<name> uses match permissions. Exit code 1 on errors. Checklist: Security rules.
--remote: sends the package to the server for checking without publishing (needs a token).--key: signing key for--remote(needed if your account has a key registered).
$ nuvaka-ext lint examples/apps/github-watcher
tarikgkhsn.github-watcher 0.1.0 — 7 dosya, açılmış 16.1 KB, paket 8.1 KB
Tamam: 0 uyarı
pack
nuvaka-ext pack [folder] [--dir <folder>] [--out <file|folder>]
Builds a deterministic .nvx (sorted entries, fixed timestamps) and prints its SHA-256 and size. No package is built if lint finds errors. Left out of the package: .git, node_modules, test/tests/__tests__/__mocks__/coverage folders, *.test.*/*.spec.*, dot files, *.nvx, a root package.json, lock files, tsconfig.json/jsconfig.json, vitest.config.*/vite.config.*.
keys and sign
nuvaka-ext keys create [name] [--force] # default name: default
nuvaka-ext keys list
nuvaka-ext sign <file.nvx> [--key <name|path>]
The private key is written to ~/.config/nuvaka/keys/<name>.key, readable only by you (0600); the first key becomes the default. Add the public key to your account in the app under Profile › Developer › Publisher signing keys (this needs an app session; it cannot be done with a developer token). sign signs the raw 32-byte SHA-256 digest of the package with Ed25519.
login, logout, whoami
nuvaka-ext login --token nvd_… [--api <url>] [--username <name>] [--no-verify]
nuvaka-ext logout
nuvaka-ext whoami [--api <url>]
Create the token in the app under Profile › Developer › Developer tokens; it starts with nvd_, is shown once, is valid for 1 year, only works on publisher endpoints and can be revoked at any time. login verifies the token with the server and saves it to ~/.config/nuvaka/credentials.json (0600). --no-verify saves without verifying. whoami prints your username and extensions.
publish
nuvaka-ext publish [folder] [--dir <folder>] [--changelog "…"] [--key <name|path>] [--no-sign] [--api <url>]
Packs (stops on lint errors), signs if a key is available, and uploads. The result:
published— live;review— waiting for review (a publisher's first extension, a version asking for critical permissions, or a new version of a verified extension);rejected— scan findings are printed, exit code 1.
Key selection: --key › NUVAKA_KEY › default key › the only key. --changelog up to 2000 characters. --no-sign uploads unsigned (rejected if your account has a key registered). Packages are limited to 20 MB.
dev
nuvaka-ext dev [folder] [--dir <folder>]
Watches the folder and runs lint on every change (exit with Ctrl+C). For those running the app from source it also prints the command that loads the folder at startup:
# in the generalappclient folder (only debug builds load it)
NUVAKA_EXT_DEV_DIR='/path/hello' npm run tauri dev
# PowerShell
$env:NUVAKA_EXT_DEV_DIR="C:\path\hello"; npm run tauri dev
Several folders are separated with the operating system's path separator (: on Linux/macOS, ; on Windows). Folders are loaded when the session starts; reload in the app after a change. In the released app, Apps › Manage apps › Load from folder does the same (with developer mode on in the Profile tab).
test
nuvaka-ext test [folder] [--dir <folder>] [-- vitest options]
Runs npx vitest run in the extension folder; anything after -- goes to vitest. Tests use the mock nuvaka from @nuvaka/extension-sdk/testing (SDK).
Environment variables
| Variable | Meaning |
|---|---|
NUVAKA_TOKEN | developer token (CI); takes precedence over the saved token |
NUVAKA_API | API URL (default https://generalappapi.nuvaka.com) |
NUVAKA_KEY | signing key name or file path |
NUVAKA_CONFIG_DIR | config folder (default ~/.config/nuvaka) |
CI example
# Secrets: NUVAKA_TOKEN (nvd_…) and the signing key file
npm ci
npx nuvaka-ext lint
NUVAKA_KEY=./ci.key npx nuvaka-ext publish --json --changelog "$CHANGELOG"
Nuvaka Apps API v1 · last updated 2026-09-27