CLI reference
Every command of @denofy/cli with options, examples, exit codes, the lockfile and where files are installed.
Installation#
Run it without installing:
npx @denofy/cli <command>Or install it once to get the short denofy command:
npm i -g @denofy/cli
denofy --helpThe CLI needs Node.js 20 or newer and has no runtime dependencies.
Always use the scoped name @denofy/cli. The unscoped denofy package on npm belongs to someone
else.
Global options#
| Option | Description |
|---|---|
--registry <url> | registry URL (default: $DENOFY_API_URL or https://denofy.com) |
-V, --version | print the CLI version |
-h, --help | show help for the CLI or a command |
Commands#
The examples use the short denofy command; with npx write npx @denofy/cli instead.
denofy search#
Full-text search over names, summaries, tags and descriptions. Prints name, latest version, verification status, type and installs.
denofy search <query...> [options]| Argument | Required | Description |
|---|---|---|
query … | yes | search terms |
| Option | Description |
|---|---|
-t, --type <type> | skill | rule | agents-md | subagent | command |
--tool <tool> | claude-code | codex | cursor |
--verified | only verified packages |
denofy search commit # find packages about commits
denofy search review --tool cursor --verified # verified packages that work with Cursordenofy addalias install#
Resolves the version, downloads the tarball, checks its sha256 against the registry, re-runs the verifier locally and writes the files to the tool's folder. Unverified packages show their findings and ask before installing. The result is recorded in denofy.lock.
denofy add <packages...> [options]| Argument | Required | Description |
|---|---|---|
packages … | yes | package[@version|range] |
| Option | Description |
|---|---|
--tool <tool> | claude-code | codex | cursor (default: auto-detect) |
-g, --global | install for the current user instead of the project |
-y, --yes | do not ask before installing unverified packages |
denofy add <name> # latest version, tool detected from the project
denofy add <name>@2.1.0 --tool claude-code # exact version for one tool
denofy add <name>@^1.2 # highest 1.x version ≥ 1.2.0 (recorded as range)
denofy add <name> --global # user-wide (~/.claude, ~/.codex …)
denofy add <name> --yes # non-interactive (CI); unverified packages are installed with a warningdenofy listalias ls#
Shows every package in denofy.lock with version, verification status, commit and the paths written per tool.
denofy list [options]| Option | Description |
|---|---|
-g, --global | list user-wide packages |
denofy list # packages of this projectdenofy updatealias upgrade#
Checks the registry for newer versions that satisfy the range recorded in denofy.lock ("latest", an exact version or a semver range) and reinstalls them for the same tools. Never downgrades.
denofy update [packages...] [options]| Argument | Required | Description |
|---|---|---|
packages … | no | packages to update (default: all) |
| Option | Description |
|---|---|
-g, --global | update user-wide packages |
-y, --yes | do not ask before installing unverified versions |
--latest | ignore the recorded range and move to the latest version |
denofy update # update everything within its range
denofy update <name> --latest # move one package to its latest versiondenofy removealias rm#
Deletes the files written for every tool (or removes the package's block from AGENTS.md / CLAUDE.md) and drops the entry from denofy.lock.
denofy remove <packages...> [options]| Argument | Required | Description |
|---|---|---|
packages … | yes | packages to remove |
| Option | Description |
|---|---|
-g, --global | remove user-wide packages |
denofy remove <name> # uninstall from this projectdenofy login#
Shows a code and a URL. Confirm the code in the browser while signed in to Denofy; the CLI then stores a token for this registry in ~/.config/denofy/credentials.json (readable only by you). Premium packages download with this token if your account has a license.
denofy logindenofy login # sign in on this machine
DENOFY_TOKEN=… denofy add <name> # CI: use a token from the environment insteaddenofy logout#
Revokes the token on the registry and removes it from the credentials file. Sign-ins can also be revoked under Settings → Connected accounts.
denofy logoutdenofy logout # sign out on this machinedenofy whoami#
Prints the Denofy user the stored token belongs to.
denofy whoamidenofy whoami # check the sign-inVersion specs#
denofy add accepts name, name@1.2.0 (exact), name@latest and any semver range such as
name@^1.2.0 or name@~2.0. The requested spec is stored in denofy.lock, and denofy update
stays within it. Ranges never resolve to yanked or blocked versions; an exact version can still
be installed if it was yanked (you get a warning).
Tool detection#
Without --tool, the CLI looks for marker folders and files in the project (or in your home
directory with --global):
| Tool | Detected when the folder contains |
|---|---|
Claude Code (claude-code) | .claudeCLAUDE.md |
OpenAI Codex (codex) | .agents.codexAGENTS.md |
Cursor (cursor) | .cursor.cursorrules |
It installs for every detected tool that the package supports. If no tool is detected and the
package supports more than one, the CLI asks (in a terminal) or fails with a hint to pass
--tool claude-code|codex|cursor.
Install locations#
Where each package type ends up, per tool. <name> is the package name.
| Type | Claude Code | OpenAI Codex | Cursor |
|---|---|---|---|
| Skill | .claude/skills/<name>global: ~/.claude/skills/<name> | .agents/skills/<name>global: ~/.codex/skills/<name> | .cursor/rules |
| Cursor Rule | — | — | .cursor/rules |
| AGENTS.md | CLAUDE.mdglobal: ~/.claude/CLAUDE.md | AGENTS.mdglobal: ~/.codex/AGENTS.md | AGENTS.md |
| Subagent | .claude/agentsglobal: ~/.claude/agents | — | — |
| Slash Command | .claude/commandsglobal: ~/.claude/commands | global: ~/.codex/prompts | .cursor/commandsglobal: ~/.cursor/commands |
- AGENTS.md snippets are merged into
AGENTS.md/CLAUDE.mdbetween<!-- denofy:begin name -->and<!-- denofy:end name -->markers. Edits inside the block are overwritten on update; everything outside stays untouched.denofy removedeletes only the block. - Skills for Cursor become one
.mdcrule plus a folder with the skill's resources; relative links are rewritten to point into that folder. - Paths are always resolved inside the project (or home) directory — a package can never write outside of it.
denofy.lock#
Every add, update and remove rewrites denofy.lock in the project root (or
~/.denofy/denofy.lock with --global). Commit it.
{
"lockfileVersion": 1,
"packages": {
"commit-helper": {
"version": "1.3.0",
"requested": "^1.2.0",
"type": "skill",
"commitSha": "9f1c2e7d3b4a5c6d7e8f90a1b2c3d4e5f6a7b8c9",
"integrity": "sha256-3b5d5c3712955042212316173ccf37be800ea6b9b4d2f3e6b3e1c3d2a1b0c9d8",
"status": "verified",
"registry": "https://denofy.com",
"installedAt": "2026-10-01T09:31:12.000Z",
"installs": [
{ "tool": "claude-code", "mode": "directory", "paths": [".claude/skills/commit-helper"] },
{
"tool": "cursor",
"mode": "skill-to-mdc",
"paths": [".cursor/rules/commit-helper.mdc", ".cursor/rules/commit-helper"]
}
]
}
}
}| Field | Meaning |
|---|---|
version | Installed version |
requested | What you asked for (latest, an exact version or a range); update respects it |
commitSha | Git commit the version was built from |
integrity | sha256 of the downloaded tarball |
status | Verification status at install time |
installs | Tools and the exact paths written, used by update and remove |
What happens on install#
- The version is resolved through the REST API.
- The tarball is downloaded and its sha256 compared with the registry's value.
- The same verifier the registry uses runs locally on the extracted files. A critical finding that the registry did not report (tampering) is treated like a failed package.
- Packages that are not verified print their findings with file and line and ask for
confirmation.
--yesskips the question (CI) and prints the findings anyway. - Files are written, the lockfile is updated.
Premium packages#
Some packages are sold by their authors. They are marked with a price on Denofy and in the API
(premium). To install one:
- Buy a license on the package page (the license appears under Settings → My purchases).
- Run
denofy loginonce. The CLI shows a code and a URL; confirm the code in the browser while signed in to Denofy. The token is stored per registry in~/.config/denofy/credentials.json, readable only by you. denofy add <name>now downloads the package with your token. The registry answers with a short-lived signed link (60 seconds); the CLI follows it without sending the token along.
Without a license the CLI stops with the purchase link (HTTP 402). A refund or chargeback revokes
the license; subscriptions stay usable until the end of the paid period. In CI, set
DENOFY_TOKEN instead of running denofy login. Revoke sign-ins with denofy logout or under
Settings → Connected accounts.
Exit codes#
| Code | Meaning |
|---|---|
0 | Success (also when there was nothing to update). |
1 | Error: package or version not found, verification declined or cancelled, unsupported tool, premium package without license (HTTP 402), rate limited (HTTP 429), network or integrity failure, invalid arguments. |
Errors print a short message and, where it helps, a link to the matching docs section.
Environment variables#
| Variable | Effect |
|---|---|
DENOFY_API_URL | Registry URL (same as --registry). Default https://denofy.com. |
DENOFY_TOKEN | Token for premium downloads (CI); takes precedence over denofy login. |
DENOFY_CONFIG_DIR | Folder of credentials.json. Default: $XDG_CONFIG_HOME/denofy or ~/.config/denofy (%APPDATA%\denofy on Windows). |
DENOFY_TELEMETRY | Set to 0 to turn off anonymous usage statistics (tool, CLI version, OS family, CI flag). |
DO_NOT_TRACK | Set to 1 to turn off telemetry as well (consoledonottrack.com). |
CI | Detected automatically; installs from CI are counted separately and not shown as users. |
Self-hosted registries#
Point the CLI at another registry with --registry https://registry.example.com or
DENOFY_API_URL. The registry URL is stored per package in denofy.lock.