Zum Inhalt springen
Denofy
Esc
  • Seiten

    Alle Pakete durchsuchen
  • Verifizierte Pakete
  • Neue Pakete
  • Sammlungen
  • Dokumentation
  • CLI-Referenz
  • So funktioniert die Prüfung
  • Skill veröffentlichen
↑↓ zum Navigieren · Enter zum Öffnen

CLI reference

Every command of @denofy/cli with options, examples, exit codes, the lockfile and where files are installed.

Diese Seite ist noch nicht übersetzt und wird auf Englisch angezeigt.

Installation#

Run it with npx, nothing to install:

bash
npx @denofy/cli <command>
npx @denofy/cli --help

In the examples below, denofy <command> is short for npx @denofy/cli <command>.

The 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 does not belong to Denofy — do not install or run it (running it without the @denofy/ scope would start that other package).

Global options#

OptionDescription
--registry <url>registry URL (default: $DENOFY_API_URL or https://denofy.com)
-V, --versionprint the CLI version
-h, --helpshow help for the CLI or a command

Commands#

The examples use the short denofy command; with npx write npx @denofy/cli instead.

Full-text search over names, summaries, tags and descriptions. Prints name, latest version, verification status, type and installs.

bash
denofy search <query...> [options]
ArgumentRequiredDescription
query …yessearch terms
OptionDescription
-t, --type <type>skill | rule | agents-md | subagent | command
--tool <tool>claude-code | codex | cursor
--verifiedonly verified packages
bash
denofy search commit                         # find packages about commits
denofy search review --tool cursor --verified # verified packages that work with Cursor

denofy 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.

bash
denofy add <packages...> [options]
ArgumentRequiredDescription
packages …yespackage[@version|range]
OptionDescription
--tool <tool>claude-code | codex | cursor (default: auto-detect)
-g, --globalinstall for the current user instead of the project
-y, --yesdo not ask before installing unverified packages
bash
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 warning

denofy listalias ls#

Shows every package in denofy.lock with version, verification status, commit and the paths written per tool.

bash
denofy list [options]
OptionDescription
-g, --globallist user-wide packages
bash
denofy list                                  # packages of this project

denofy 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.

bash
denofy update [packages...] [options]
ArgumentRequiredDescription
packages …nopackages to update (default: all)
OptionDescription
-g, --globalupdate user-wide packages
-y, --yesdo not ask before installing unverified versions
--latestignore the recorded range and move to the latest version
bash
denofy update                                # update everything within its range
denofy update <name> --latest                # move one package to its latest version

denofy 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.

bash
denofy remove <packages...> [options]
ArgumentRequiredDescription
packages …yespackages to remove
OptionDescription
-g, --globalremove user-wide packages
bash
denofy remove <name>                         # uninstall from this project

denofy 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.

bash
denofy login
bash
denofy login                                 # sign in on this machine
DENOFY_TOKEN=… denofy add <name>             # CI: use a token from the environment instead

denofy logout#

Revokes the token on the registry and removes it from the credentials file. Sign-ins can also be revoked under Settings → Connected accounts.

bash
denofy logout
bash
denofy logout                                # sign out on this machine

denofy whoami#

Prints the Denofy user the stored token belongs to.

bash
denofy whoami
bash
denofy whoami                                # check the sign-in

Version specs#

denofy add accepts name, name@1.0.0 (exact), name@latest and any semver range such as name@^1.0.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):

ToolDetected 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.

TypeClaude CodeOpenAI CodexCursor
Skill
.claude/skills/<name>
global: ~/.claude/skills/<name>
.agents/skills/<name>
global: ~/.codex/skills/<name>
.cursor/rules
Cursor Rule——
.cursor/rules
AGENTS.md
CLAUDE.md
global: ~/.claude/CLAUDE.md
AGENTS.md
global: ~/.codex/AGENTS.md
AGENTS.md
Subagent
.claude/agents
global: ~/.claude/agents
——
Slash Command
.claude/commands
global: ~/.claude/commands
global: ~/.codex/prompts
.cursor/commands
global: ~/.cursor/commands
  • AGENTS.md snippets are merged into AGENTS.md / CLAUDE.md between <!-- denofy:begin name --> and <!-- denofy:end name --> markers. Edits inside the block are overwritten on update; everything outside stays untouched. denofy remove deletes only the block.
  • Skills for Cursor become one .mdc rule 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.

json
{
  "lockfileVersion": 1,
  "packages": {
    "conventional-commits": {
      "version": "1.0.0",
      "requested": "^1.0.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/conventional-commits"]
        },
        {
          "tool": "cursor",
          "mode": "skill-to-mdc",
          "paths": [".cursor/rules/conventional-commits.mdc", ".cursor/rules/conventional-commits"]
        }
      ]
    }
  }
}
FieldMeaning
versionInstalled version
requestedWhat you asked for (latest, an exact version or a range); update respects it
commitShaGit commit the version was built from
integritysha256 of the downloaded tarball
statusVerification status at install time
installsTools and the exact paths written, used by update and remove

What happens on install#

  1. The version is resolved through the REST API.
  2. The tarball is downloaded and its sha256 compared with the registry's value.
  3. 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.
  4. Packages that are not verified print their findings with file and line and ask for confirmation. --yes skips the question (CI) and prints the findings anyway.
  5. Files are written, the lockfile is updated.

Exit codes#

CodeMeaning
0Success (also when there was nothing to update).
1Error: 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#

VariableEffect
DENOFY_API_URLRegistry URL (same as --registry). Default https://denofy.com.
DENOFY_TOKENToken for premium downloads (CI); takes precedence over denofy login.
DENOFY_CONFIG_DIRFolder of credentials.json. Default: $XDG_CONFIG_HOME/denofy or ~/.config/denofy (%APPDATA%\denofy on Windows).
DENOFY_TELEMETRYSet to 0 to turn off anonymous usage statistics (tool, CLI version, OS family, CI flag).
DO_NOT_TRACKSet to 1 to turn off telemetry as well (consoledonottrack.com).
CIDetected 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.

Diese Seite auf GitHub bearbeiten