[ docs · cli reference ]live

One CLI, two surfaces.

Every operation Quill performs is also a CLI subcommand — discovery, workflow generation, the pipeline, category seeding, dev-doc captures, and the approvals ledger that gates what goes live. The portal calls these same primitives. You can drive the whole product from a terminal.

One binary. Approvals and the pipeline live under a single quill binary. The legacy pnpm demodemon alias still works during the deprecation window, but quill run is the command going forward.
[ pipeline ]

quill run — run the full pipeline

Discover features, plan workflows, run the browser, narrate, compose video, generate MDX. Without arguments, processes every feature in your catalog. Pass a feature id to run just one.

$ quill run # all features $ quill run flows_create # one feature, by id
[ self-serve ]

quill run onboard — end-to-end mega-command

The fastest path to your first generated article. Runs the testid proposer, initializes the workspace's feature catalog and workflows, executes the pipeline, and seeds help-center categories — in that order, one command.

$ quill run onboard ./path/to/your-app $ quill run onboard ./your-app --dry-run # preview only, no writes
[ feature catalog ]

quill run init — propose features + workflows

Reads your repo source, proposes a feature catalog (one record per customer-facing capability), and generates a workflow.json per feature so the pipeline can run end-to-end. Requires the target app to be running so route discovery is grounded in reality.

$ quill run init # use config.target.repoPath $ quill run init ./path/to/repo # override repo path $ quill run init --force # overwrite existing $ quill run init --skip-workflows # features only
[ stable selectors ]

quill run testids — propose data-testids

Walks your repo for interactive elements (buttons, inputs, links) that lack a data-testid attribute and proposes stable ids for each one. Dry-run by default. The runner uses these attributes as its only contract with the UI — never CSS classes, never text content.

$ quill run testids # dry-run, prints proposals $ quill run testids --apply # write to disk
[ help center taxonomy ]

quill run categorize — propose categories

Looks at your features and proposes a help-center category taxonomy — one level deep, customer-facing labels. Writes to .demodemon/categories.json; the portal renders the help center against it.

$ quill run categorize
[ dev docs ]

quill run devdocs — capture API routes

Walks your backend route handlers, hits each GET endpoint against a running dev server, captures the response shape, and lands draft dev-doc pages in the portal queue.

$ quill run devdocs $ quill run devdocs --repo apps/api # walk a subpath $ quill run devdocs --url http://localhost:4000 $ quill run devdocs --discovery-only # skip captures $ quill run devdocs --recapture # rebuild + flag drift $ quill run devdocs --tag v1.2.3 # named version

The --include-side-effects flag is an operator-only override; the pipeline's auto-runs must never use it.

[ approvals ledger ]

quill approve · revoke · status · queue

The same approval ledger the portal's review queue writes to, from your terminal. A workflow only goes live once it's approved; these commands read and write that record directly. Without DATABASE_URL they fall back to the local file ledger — pass --remote (or set DATABASE_URL) to target production. Workspace comes from --workspace or QUILL_WORKSPACE_ID.

$ quill approve flows_create --workflow ./workflow.json --approved-by you@team.com $ quill revoke flows_create --revoked-by you@team.com --reason "selector removed" $ quill status flows_create --verbose $ quill queue --feature flows_create --limit 10

approve writes a first or re-approval (refuses on a revoked feature); revoke retires the active workflow; status prints the current ledger state; queue lists open proposals and recent rejections. Add --yes to skip the confirmation prompt.

[ schema ]

quill init-schema — provision the ledger tables

One-time setup for the production ledger: runs the idempotent schema migration against DATABASE_URL. Safe to re-run — it only creates what's missing. Not needed for the local file ledger.

$ DATABASE_URL=postgres://… quill init-schema
[ environment ]

Environment variables.

The CLI reads .env.local at the workspace root before any engine touches process.env. Shell-exported vars still win — the loader is non-destructive.

ANTHROPIC_API_KEY=sk-ant-... # required: workflow agent, narration, docs-gen OPENAI_API_KEY=sk-... # optional: alternate TTS provider QUILL_WORKSPACE_ID=acme-prod # required in production QUILL_SESSION_SECRET=# 32+ char random DEMODEMON_GEN_DIR=# absolute path to generated/ DEMODEMON_TARGET_REPO_PATH=# absolute path to customer repo

Drive the pipeline from your terminal.

The portal calls these same primitives — and you can call them yourself.