Configuration
opx reads .opx/config.json from the repository root. opx init and opx enable write it; you can edit it by hand but you don't have to.
{
"$schema": "https://unpkg.com/@allons-y/opx/schema/config.json",
"version": 1,
"lint": { "js": true, "json": true, "md": true },
"release": true,
"test": false
}
Keys
| Key | Type | Description |
|---|---|---|
$schema |
string | Optional. Enables editor validation and completion. |
version |
1 |
Required. The config format version. |
lint |
object | Lint plugins, keyed by short name |
build |
object | Build plugins, keyed by short name |
release |
plugin setting | Enables the release plugin |
test |
plugin setting | Reserved for a future test plugin |
Short names must be lowercase letters and digits (js, md).
Plugin settings
Wherever a plugin is configured, the value can be any one of:
| Value | Meaning |
|---|---|
true |
Enabled with defaults |
false |
Disabled |
"./path.js" |
Enabled, using your own config file. Resolved from the repository root. |
{ ... } |
Enabled, with inline settings the plugin understands |
Examples
Use your own ESLint flat config for JavaScript, and lint JSONC and JSON5 too:
{
"version": 1,
"lint": {
"js": "./eslint.config.js",
"json": { "dialects": ["jsonc", "json5"] }
}
}
The settings each plugin understands are documented on its page: js, json, md, release.
Defaults & errors
- If
.opx/config.jsondoesn't exist, opx behaves as if every task were empty andreleaseandtestwerefalse. - If it exists but isn't a valid JSON object, opx stops with an error that names the file.
State file
.opx/state.json is written by opx for its own bookkeeping. You shouldn't need to edit it, and it shouldn't be committed.
{
"version": 1,
"lastScanCommit": "a1b2c3d",
"deferrals": {
"md": { "branch": "main", "skipUntilDate": "2026-10-07", "reason": "later" }
}
}
See also
- API reference: the
@allons-y/opxengine, generated from its TypeScript sources.