@tappify/cli
v1.6.0
Published
Tappify CLI - Command line interface for managing deployments and more
Downloads
12,449
Maintainers
Readme
Tappify CLI
A command line interface for managing deployments and more.
Installation
The CLI ships as a standalone binary (no Node.js required). npm remains available for Node users.
curl (macOS/Linux)
curl -fsSL https://get.tappify.ai | shwinget (Windows)
winget install Tappify.CLINPM
npm install -g @tappify/cliHomebrew (macOS/Linux)
brew tap tappify-dev/homebrew-tap
brew install tappifyScoop (Windows)
scoop bucket add tappify https://github.com/tappify-dev/scoop-bucket
scoop install tappifyChocolatey (Windows)
choco install tappifyUsage
tappify --help
tappify login
tappify environment
tappify extension init
tappify extension dev
tappify extension publishCommands
login, logout
Authenticate with Tappify through the device authorization flow, and clear the stored session.
upgrade
Update the CLI to the latest version. Self-updates binary installs; otherwise prints the right command for your package manager.
environment, env
Choose whether the CLI connects to Production or the internal Staging sandbox:
tappify environment
tappify environment current
tappify environment use production
tappify environment use staging --yesStaging requires confirmation unless --yes is supplied:
WARNING: INTERNAL TESTING ENVIRONMENT
Staging uses https://staging.api.tappify.ai.
Data may be incomplete, changed, or deleted.
Do not use this environment unless you know what you are doing.Switching environments logs the CLI out and clears the selected sandbox project, so run tappify login again. TAPPIFY_API_URL is an internal and CI escape hatch; while set, it overrides the selected environment and emits a custom-API warning.
link
Link this directory to a Tappify project and its apps, writing .tappify/project.json.
deployments configure
Configure CI code signing for an app.
vendor create
Create a vendor account, its workspace and its sandbox project. Every extension command that finds no vendor points you here.
extension
Build, test and publish an extension. tappify ext is the same command.
| Command | Does |
| -------------------------------- | ------------------------------------------------------------------ |
| extension init [dir] | Scaffolds an extension from the starter |
| extension add <kind> [name] | Adds a contribution, scaffolds its files and regenerates the types |
| extension remove <kind> <id> | Removes a contribution and, with confirmation, its files |
| extension list | Lists the contributions and scopes this extension declares |
| extension set <field> <value> | Sets one field in the manifest |
| extension scopes add <key> | Grants this extension one more scope |
| extension scopes remove <key> | Takes one scope away |
| extension events add <name> | Receives one Tappify event on your server |
| extension events remove <name> | Stops receiving one Tappify event on your server |
| extension types | Regenerates src/tappify.d.ts |
| extension dev | Serves the extension and previews it while you edit |
| extension doctor | Runs every check the Tap Store runs, here |
| extension publish | Builds, checks and sends the release to the Tap Store |
| extension retire | Takes the extension out of the Tap Store and every install |
| extension status | Shows the live release, the release in review and the installs |
| extension whoami | Shows the vendor, your role and the sandbox project |
Run tappify extension <command> --help for the flags.
mcp
Serves the MCP server for agents over stdio.
Editors and agents run tappify mcp themselves. The Claude Code plugin at tappify-dev/claude-plugin declares it, so installing that plugin is all a Claude Code user does.
--json
Every vendor and extension command takes --json and prints one object on stdout: the same result its two human lines describe. A failure prints { "ok": false, "error": { "what": …, "why": …, "fix": … } } and exits non-zero. login, logout, link, upgrade and deployments configure take no --json, and mcp has none either — its stdout carries the protocol.
Each payload below also carries ok: true.
| Command | Keys |
| --------------------------------- | ---------------------------------------------------------- |
| tappify vendor create | vendor, workspace, sandboxProject |
| tappify extension init | id, name, directory, files |
| tappify extension add | kind, id, files, scopesAdded |
| tappify extension remove | kind, id, files |
| tappify extension list | id, contributions, scopes |
| tappify extension set | field, value |
| tappify extension scopes add | key, justification, requiresSecurityReview |
| tappify extension scopes remove | key, stillNeeded |
| tappify extension events add | name, events |
| tappify extension events remove | name, events, usedBy |
| tappify extension types | file, schemas |
| tappify extension dev | id, remoteEntry, previewUrl, hostUrl, installId |
| tappify extension doctor | id, errors, warnings, passed, fixed, checks |
| tappify extension publish | id, status, releaseId, bytes, entries, pending |
| tappify extension retire | id, status |
| tappify extension status | id, live, pending, timeline, installCount |
| tappify extension whoami | user, vendor, role, sandboxProject |
publish carries pending only when the release goes to review with scopes or contribution kinds the live release does not have. doctor prints the same six keys whether or not a check failed; when one did, the object is the ok: false form and errors is above zero. fixed lists what --fix changed, and is empty without the flag. scopes remove carries stillNeeded on both forms: null when the scope went, and the reason it stayed when it did not. A failure carries whatever keys the command has beside error, so the shape a command prints does not change when it refuses.
events remove carries usedBy: the markers and banners that draw the event, which keep working because they are inbound webhooks rather than this subscription.
tappify vendor --json, tappify extension --json, tappify extension scopes --json and tappify extension events --json print { commands } — the verbs the group holds, not a result.
License
MIT
