CLI
clove — CloveJS project commands
clove dev [--port <n>] [--host <h>] Run the dev server with file watching
clove build Generate types and compile with tsc
clove types Generate .clove/types.d.ts only
clove scaffold [--js] [--force] Create the default project structure
clove routes Print the resolved route table
clove mcp [--stdio] Print the MCP surface, or serve it over stdio
clove skills [--ide <a,b>] [--force] Install CloveJS instructions for AI editors
Options:
--dir <path> Project root (defaults to the current directory)
--help Show this messageRun it via npx clove <command>, or through the dev / build / start scripts that clove scaffold adds to package.json.
clove dev
Runs the app with file watching and type generation. Changes under the source directory regenerate .clove/types.d.ts and reload the server.
npx clove dev --port 8080 --host 0.0.0.0| Flag | Default | Meaning |
|---|---|---|
--port <n> | 3000 | Port to listen on |
--host <h> | localhost | Interface to bind |
--dir <path> | cwd | Project root |
Module caching is disabled in dev so a reload actually re-reads changed files. SIGINT/SIGTERM shut the server down cleanly.
clove build
- Regenerates
.clove/types.d.ts. - Runs
npx tscin the project root.
If there is no tsconfig.json, step 2 is skipped and the command reports that there was nothing to compile — the correct behaviour for a JavaScript project.
When tsc reports errors, they are printed as-is and the process exits non-zero. No stack trace is added on top, so CI logs stay readable.
clove types
Regenerates .clove/types.d.ts only, and makes sure .clove/ is in the project's .gitignore. Prints the path it wrote.
Use it in CI before type-checking, or after a fresh clone where .clove/ does not exist yet:
npx clove types && npx tsc --noEmitGeneration is a path-level scan — files are never executed — so it is fast and cannot be broken by a module that throws at import time.
clove scaffold
Creates the default project structure.
| Flag | Meaning |
|---|---|
--js | JavaScript layout: directories at the project root, no tsconfig.json |
--force | Overwrite files that already exist |
Without --force, existing files are left alone and reported as skipped, so the command is safe to run inside a project that is already partly set up.
It creates api/, ws/, di/, services/ and middlewares/, a starter route, service and config file, main.ts, a .gitignore, a tsconfig.json (TypeScript only), and adds type: "module" plus dev/build/start scripts to package.json without clobbering scripts you already have.
Why not an install prompt?
Scaffolding is an explicit command rather than an install-time prompt: package managers suppress or sandbox postinstall, and prompts break CI.
clove routes
Prints the resolved route table — method and path, one per line:
GET /api/v1/users
GET /api/v1/users/:id
POST /api/v1/loginThe fastest way to confirm that a filename produced the URL you expected. It boots the app with logging silenced, so convention violations still surface as boot errors.
WebSocket endpoints and the MCP endpoint are listed too:
GET /api/v1/users
WS /ws/echo
MCP /mcpclove mcp
Prints the MCP surface — every tool, resource and prompt the project exposes, with the name or URI it resolved to:
Endpoint /mcp
tool searchNotes Full-text search across the user's notes
tool createNote Create a new note
resource notes://{id} A single note by id
resource config://app Server configuration
prompt summarize Summarize a noteThe clove routes of MCP: the fastest way to confirm a filename produced the tool name or resource URI you expected.
--stdio
Serves the project over stdio instead of printing, for clients that launch an MCP server as a subprocess:
{
"mcpServers": {
"my-app": {
"command": "npx",
"args": ["clove", "mcp", "--stdio"],
"cwd": "/path/to/project"
}
}
}stdout carries the protocol, so console.log, .info and .debug are redirected to stderr before the project boots. The process serves until the client disconnects.
clove skills
Teaches AI coding assistants the framework's conventions, so they stop inventing route registries and reach for ctx instead of importing providers directly. The AI editors guide covers the reasoning; this is the flag reference.
npx clove skillsOne body of guidance is written in each editor's own format:
| Editor | File |
|---|---|
| Claude Code | .claude/skills/clovejs/SKILL.md |
| Cursor | .cursor/rules/clovejs.mdc |
| Antigravity | .antigravity/rules/clovejs.md |
| Codex, Gemini CLI, Jules, … | AGENTS.md |
| Flag | Meaning |
|---|---|
--ide <a,b> | Only these editors — claude, cursor, antigravity, codex |
--force | Overwrite editor files that already exist |
npx clove skills --ide cursor,codexFiles under .cursor/, .claude/ and .antigravity/ belong to the command: without --force an existing one is reported as skipped and left untouched.
AGENTS.md belongs to your project and usually holds instructions of your own, so it is treated differently — the command maintains a single delimited block and preserves everything around it:
# AGENTS.md
Your own house rules stay exactly where they are.
<!-- clovejs:begin -->
## CloveJS
...
<!-- clovejs:end -->Re-running the command refreshes that block in place rather than appending a second copy, so upgrading CloveJS and re-running is idempotent. Commit the generated files: they are project configuration, and everyone working in the repository benefits from them.
--dir
Every command accepts --dir <path> to operate on a project other than the current directory:
npx clove routes --dir ./services/api