Skip to main content

Command line interface

Reqon provides a CLI for running and managing missions. The CLI is the reqon binary; install the reqon-dsl package to get it.

Basic usage​

reqon <file-or-folder> [options]

Run a single mission file:

reqon sync-customers.vague

Run a mission folder (multi-file mission):

reqon ./missions/customer-sync/

Options​

OptionDescription
--dry-runRun without making actual HTTP requests
--verboseAlias for --log-level info — shows a live progress line
--log-level <level>Log verbosity: debug, info, warn, error (default: quiet)
--log-format <fmt>Log output format: text (default) or json (JSON Lines)
--devDevelopment mode: let sql/nosql stores fall back to local JSON files
--auth <file>Path to a JSON file containing authentication credentials
--env <file>Path to a .env file (default: .env in the current directory)
--output <path>Export all stores to a single JSON file after execution
--report <path>Write Vague dataset statistics as JSON, Markdown, or HTML
--compare <path>Compare stores with a golden JSON dataset and fail on differences
--daemonRun as a daemon, executing scheduled missions
--onceRun scheduled missions once immediately, then exit
--webhookEnable the webhook server for wait steps
--webhook-port <n>Port for the webhook server (default: 3000)
--webhook-url <url>Base URL for webhook endpoints (default: http://localhost:3000)
--controlEnable the control server for pause/resume and status queries
--control-port <n>Port for the control server (default: 3001)
--debugEnable step-through debugging
--resume <id>Resume a paused or failed execution by ID
--help, -hShow the help message

Examples​

Dry run mode​

Validate your mission syntax without making actual API calls:

reqon sync-data.vague --dry-run

Verbose output​

--verbose is an alias for --log-level info. Rather than narrating every item, it prints a single progress line, throttled to at most once every two seconds (or every 1,000 items), driven by loop and fetch events:

reqon sync-data.vague --verbose
12,431/500,000 (2.5%) · 87 req/s · p50 112ms · 3 retries · 0 failed · ETA 1h33m

Each console line is stamped with the elapsed time since the run started (+1234ms).

Log level and format​

--log-level is the real verbosity knob:

reqon sync-data.vague --log-level debug # progress line + per-item narration
reqon sync-data.vague --log-level warn # warnings and errors only, no progress
  • debug — everything, including per-request narration (Fetched GET /users, incremental-sync and pagination detail) with structured context.
  • info — the throttled progress line and mission lifecycle events (what --verbose selects). Per-item narration is hidden.
  • warn / error — resilience warnings and failures only; no progress line.

Use --log-format json to emit newline-delimited JSON (JSON Lines) instead of human-readable text, for log aggregation. Progress ticks are emitted as {"type":"progress", ...} objects:

reqon sync-data.vague --log-level info --log-format json

Authentication​

Provide credentials via a JSON file:

reqon sync-data.vague --auth ./credentials.json

The credentials file should match your source names:

{
"Xero": {
"type": "oauth2",
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"accessToken": "current-token",
"refreshToken": "refresh-token",
"tokenEndpoint": "https://identity.xero.com/connect/token"
},
"GitHub": {
"type": "bearer",
"token": "ghp_xxxxxxxxxxxx"
}
}

Exporting results​

Save store contents to JSON after execution:

reqon sync-data.vague --output ./output.json

This writes a single JSON file, an object keyed by store name, with each store's items as an array:

{
"customers": [ { "id": 1, "name": "Ada" } ],
"orders": [ { "id": 100, "customerId": 1 } ]
}

Dataset reports​

Write field statistics, distributions, record counts, and a Vague data attestation after a run. The extension selects JSON, Markdown, or HTML:

reqon seed-test-data.vague --report ./artifacts/data-report.html

The attestation describes data as synthetic, so use this flag for generated or test datasets rather than production data fetched from an API.

Golden dataset comparison​

Compare every exported store with a checked-in JSON snapshot:

reqon reconciliation.vague --compare ./testdata/reconciliation.golden.json

The comparison prints collection, record, and field differences. A mismatch sets exit code 1, which makes the command suitable for CI regression checks.

Daemon mode​

Run scheduled missions continuously:

reqon ./missions/ --daemon

The daemon:

  • Parses all missions in the folder
  • Executes scheduled missions according to their schedule
  • Respects rate limits and backoff strategies
  • Handles graceful shutdown on SIGINT/SIGTERM

One-shot scheduled execution​

Run all scheduled missions once:

reqon ./missions/ --once

Useful for cron-triggered executions where you want external scheduling.

Webhook server​

Enable the webhook server for missions that use wait steps:

reqon payment-flow.vague --webhook --verbose

With custom port and URL (for production or tunnels):

reqon payment-flow.vague --webhook --webhook-port 8080 --webhook-url https://my-server.ngrok.io

Control server​

Enable the control server to pause, resume, and inspect a running mission:

reqon long-running.vague --control --control-port 3001 --verbose

When --control is enabled, the server exposes these endpoints:

MethodEndpointDescription
POST/pauseRequest a graceful pause at the next safe point
POST/resumeClear a pause request
GET/statusGet the current execution state and progress
GET/healthHealth check

Resuming an execution​

If a mission pauses or fails, the CLI prints its execution ID. Resume it with --resume:

reqon long-running.vague --resume exec_abc123

Development mode​

Let sql and nosql stores fall back to local JSON files instead of requiring a database:

reqon sync-data.vague --dev

Environment files​

Load environment variables from a specific file:

reqon sync-data.vague --env .env.production --auth ./credentials.json

The --env flag supports:

  • Custom .env file paths
  • Environment variable interpolation in auth files

Exit codes​

CodeMeaning
0Success
1Failure (parse error, runtime error, validation error, missing scheduled mission, etc.)

A paused mission also exits with code 0; resume it with --resume.

Environment variables​

The CLI reads .env files (via --env or a .env in the current directory) and discovers per-source credentials from the environment. It does not read configuration flags from environment variables.

Auto-discovery from environment​

Reqon can automatically discover credentials from environment variables:

Variable PatternDescription
REQON_{SOURCE}_TOKENBearer token for a source
REQON_{SOURCE}_TYPEAuth type: bearer, oauth2, api_key, basic
REQON_{SOURCE}_API_KEYAPI key for a source

Example:

export REQON_GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
export REQON_GITHUB_TYPE="bearer"

# No --auth file needed for GitHub source
reqon sync-repos.vague

Credential file interpolation​

Auth files support environment variable interpolation:

{
"Xero": {
"type": "oauth2",
"clientId": "$XERO_CLIENT_ID",
"clientSecret": "${XERO_CLIENT_SECRET}",
"accessToken": "${XERO_ACCESS_TOKEN:-default-token}"
}
}

Supported formats:

  • $VAR_NAME - Simple variable
  • ${VAR_NAME} - Braced variable
  • ${VAR_NAME:-default} - With default value

Multi-file missions​

For complex missions, organize them as a folder with a mission.vague root file plus one action file per action, all in the same directory:

missions/
└── customer-sync/
├── mission.vague # Sources, stores, schemas, and the pipeline
├── fetch.vague # Action file
├── transform.vague # Action file
└── export.vague # Action file

Run with:

reqon ./missions/customer-sync/

Reqon loads mission.vague and merges every other .vague file in the folder as an action. The files sit side by side; nested subfolders are not scanned.

Integrating with CI/CD​

GitHub Actions​

name: Sync Data
on:
schedule:
- cron: '0 */6 * * *' # Every 6 hours

jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm install
- run: npx reqon ./missions/sync.vague --auth ./credentials.json
env:
API_TOKEN: ${{ secrets.API_TOKEN }}

Docker​

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npx", "reqon", "./missions/", "--daemon"]

Troubleshooting​

"Cannot find module 'reqon-dsl'"​

Ensure Reqon is installed:

npm install reqon-dsl

"Permission denied"​

The data directory (.reqon-data) needs write access:

chmod 755 .reqon-data

Debugging HTTP issues​

Use verbose mode to see request/response details:

reqon mission.vague --verbose 2>&1 | tee debug.log