Config schema¶
Full dotted-path keys, flattened from the per-struct FieldDoc tables.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
maps |
object |
no | — | Named, reusable key→value tables. Each entry: map_name -> { key: value }. Referenced by REMAP (whole-value lookup) / REPLACE (substring) via their 'name' argument. A template may also define a same-named maps block that overrides a global entry. |
maps.* |
object |
no | — | One named map. Keys and values are arbitrary strings; key order is preserved (REPLACE applies pairs in declaration order). |
conversion_templates |
object |
yes | — | Map of template_id -> broker config. Each key is a unique template identifier used with --template flag. When bxp-cli runs without --template, all templates execute in declaration order. |
conversion_templates.* |
object |
no | — | One conversion template — see conversion_templates.*.* fields for contents. |
conversion_templates..input_schema. |
expression |
yes | — | Expression evaluated per input row. Result stored in the $variable. Use [ColumnName] to reference input CSV columns. |
conversion_templates..output_schema. |
string |
yes | — | $variable whose evaluated value fills this output column. Must start with $. |
conversion_templates..row_rules. |
object |
no | — | One row rule. Schema-ordered children: when (condition), rows (output rows produced when matched). |
conversion_templates..row_rules..rows.* |
object |
no | — | One output row. Map of $variable -> expression overriding the value from input_schema. Empty object {} = take all values verbatim from input_schema. |
conversion_templates.*.pre_pass.when |
expression |
yes | — | Legacy single-block form. Filter — only rows matching this condition are added to the lookup table. |
conversion_templates.*.pre_pass.key |
expression |
yes | — | Legacy single-block form. Expression evaluated per row to produce the lookup key string. |
conversion_templates.*.pre_pass.values |
object |
yes | — | Legacy single-block form. Map of field_name -> expression. Each value is evaluated per pre-pass row and stored for retrieval via LOOKUP(key, 'field_name'). Field names have no $ prefix. |
conversion_templates..pre_pass.values. |
expression |
yes | — | Expression evaluated per pre-pass row. Result stored under the field name for LOOKUP retrieval. |
conversion_templates..pre_pass. |
object |
no | — | Named pre_pass block. The map key is the block name (typed by the user in the GUI's Add-Child dialog or written directly in JSON5) and becomes part of the LOOKUP namespace; different names cannot collide. The insert_template below is the inner { when, key, values } body — the outer name1: { ... } wrapper is supplied by whatever creates the entry (free-form key input in the GUI; verbatim JSON5 syntax for hand-edited configs). |
conversion_templates..pre_pass..values.* |
expression |
yes | — | Expression evaluated per pre-pass row. Result stored under the field name for LOOKUP retrieval. |
conversion_templates.*.description |
string |
no | — | Optional one-line summary of what this template converts, e.g. "Trading 212 -> Wealthfolio". Never read by the engine; returned by template listings so a person or an agent can pick between templates. |
conversion_templates.*.data_dir |
string |
yes | — | Path to input files, relative to this config file. e.g. "my_source", "../data/exports", or an absolute path. |
conversion_templates.*.file_type_in |
string |
no | csv |
Input file format. "json" reads an array-of-objects. One of: csv, json. |
conversion_templates.*.file_type_out |
string |
no | csv |
Output file format. "json" writes an array-of-objects. One of: csv, json. |
conversion_templates.*.file_pattern_in |
string |
yes | — | Literal suffix filter for input files in data_dir — NOT a glob. e.g. ".csv" (all), "_cash.csv" (specific suffix). A file matches when its name ends with this exact text; "*" has no special meaning. The matched suffix is also stripped to form the output filename (with file_pattern_out). |
conversion_templates.*.file_pattern_out |
string |
yes | — | Output filename suffix. Replaces file_pattern_in in the output filename. |
conversion_templates.*.csv_header_line |
number |
no | 1 |
1-based line number of the CSV header row (default 1). 0 = headerless input: no line is treated as headers, the first line is data, and columns are reachable only by position via FIELDS(n). N>1 skips N-1 preamble lines. CSV input only. |
conversion_templates.*.csv_delimiter_in |
string |
no | , |
Input CSV field separator (single character). One of: ,, ;, , |. |
conversion_templates.*.csv_delimiter_out |
string |
no | , |
Output CSV field separator (single character). One of: ,, ;, , |. |
conversion_templates.*.csv_decimal_separator_in |
string |
no | . |
Decimal separator in input numeric fields. Set to "," for European-style CSV. Must differ from csv_delimiter_in. One of: ., ,. |
conversion_templates.*.csv_decimal_separator_out |
string |
no | . |
Decimal separator written in numeric output fields. One of: ., ,. |
conversion_templates.*.csv_text_quote_in |
string |
no | double |
Input CSV text quoting style. Use ''' in expressions for a literal single-quote. One of: none, single, double. |
conversion_templates.*.csv_text_quote_out |
string |
no | none |
Output CSV text quoting style. One of: none, single, double. |
conversion_templates.*.csv_input_encoding |
string |
no | utf-8 |
Character encoding of the input CSV file. Transcoded to UTF-8 on read. Use for legacy non-UTF-8 exports (e.g. "windows-1250" for Czech Excel). CSV only — JSON/xlsx are always UTF-8. One of: utf-8, windows-1250, windows-1252, iso-8859-1, iso-8859-2, iso-8859-15. |
conversion_templates.*.csv_output_encoding |
string |
no | utf-8 |
Character encoding of the output CSV file. UTF-8 is transcoded to this code page on write; characters with no equivalent become '?'. CSV only. One of: utf-8, windows-1250, windows-1252, iso-8859-1, iso-8859-2, iso-8859-15. |
conversion_templates.*.maps |
object |
no | — | Template-local named key→value maps: { map_name: { key: value } }. Merged over the top-level maps registry (this template's entry wins on a name collision). Referenced by REMAP / REPLACE via their 'name' argument. |
conversion_templates.*.date_filter_from_filename |
boolean |
no | false |
When true, rows whose $date falls outside the date range encoded in the filename (YYYY-MM-DD_YYYY-MM-DD) are silently skipped. Requires $date in input_schema. A row whose $date is too short to compare (an empty one, typically a [Column] the file does not have) is a fatal error rather than a pass-through: the filter was asked for and cannot be applied to that row. Filenames carrying no range are unfiltered as before. |
conversion_templates.*.combined_output |
boolean |
no | false |
When true, all input files in data_dir additionally write their rows to one merged output file '1-<template_id>-combined.csvx', alongside the normal per-input outputs (it is an extra file, not a replacement). Files are processed in alphabetical order so combined row order is deterministic. |
conversion_templates.*.row_rules_debug_missing |
boolean |
no | false |
When true, rows that match no row_rules entry are printed in --debug output. |
conversion_templates.*.xlsx_sheet |
object |
no | — | When set, the xlsx file in data_dir is converted to an intermediate CSV before the normal CSV processing loop. |
conversion_templates.*.zip_input |
object |
no | — | When set, every member of each *.zip in data_dir whose name ends with entry_pattern is streamed out to a flat intermediate CSV (N per zip) before the normal CSV loop. For zipped CSV exports (e.g. RÚIAN address registry). |
conversion_templates.*.pre_pass |
object |
no | — | First-pass lookup table(s) built before the main loop. Two accepted shapes: legacy single block { when, key, values } (detected by the presence of when) — accessed via 2-arg LOOKUP(key, 'field'); or named blocks { name1: { when, key, values }, ... } — each block is its own namespace, accessed via 3-arg LOOKUP('name', key, 'field'). |
conversion_templates.*.input_schema |
object |
yes | — | Map of $variable -> expression. Each expression is evaluated per input row. Variables are referenced in output_schema and row_rules. Iteration order does not affect results. |
conversion_templates.*.output_schema |
object |
yes | — | Output CSV column headers mapped to $variable values. Insertion order determines column order in the output file. |
conversion_templates.*.row_rules |
array |
no | — | Ordered list of conditional routing rules. The first rule whose when matches produces the output rows; later rules are not evaluated. Rows matching no rule are silently skipped (or shown via row_rules_debug_missing). Omitting the key entirely is accepted by the loader, but then nothing matches and the template produces no output at all. |
conversion_templates.*.xlsx_sheet.name |
string |
yes | — | Sheet name as it appears in the xlsx workbook (e.g. "CASH OPERATION"). |
conversion_templates.*.xlsx_sheet.header_row |
number |
yes | — | 1-based row number that contains the column headers within this sheet. |
conversion_templates.*.xlsx_sheet.output_suffix |
string |
yes | — | Appended before ".csv" in the intermediate filename (e.g. "_3"). Use "" for no suffix. |
conversion_templates.*.zip_input.entry_pattern |
string |
no | .csv |
Literal suffix filter for zip members to extract — NOT a glob. A member matches when its in-zip name ends with this exact text. Default ".csv". |
conversion_templates.*.zip_input.dir_mode |
string |
no | basename |
How a member's in-zip path becomes a flat output filename in data_dir (the CSV loop reads data_dir non-recursively). "basename" keeps the last path segment; "keep_path" replaces every '/' with path_separator (collision-safe). One of: basename, keep_path. |
conversion_templates.*.zip_input.path_separator |
string |
no | _ |
Replacement for '/' when dir_mode is "keep_path" (e.g. "CSV/x.csv" -> "CSV_x.csv"). Ignored for "basename". |
conversion_templates..row_rules..when |
expression |
yes | — | Condition expression. Rule applies when this evaluates to truthy (non-empty, non-zero, non-"false"). |
conversion_templates..row_rules..rows |
array |
yes | — | Output rows produced when when matches. Each entry is an object overriding $variables; rows: [] silently skips the row, rows: [{}] emits one row using input_schema variables verbatim. |
conversion_templates..pre_pass..when |
expression |
yes | — | Filter — only rows matching this condition are added to the named lookup table. |
conversion_templates..pre_pass..key |
expression |
yes | — | Expression evaluated per row to produce the lookup key string for this named block. |
conversion_templates..pre_pass..values |
object |
yes | — | Map of field_name -> expression evaluated per pre-pass row, retrieved via 3-arg LOOKUP('name', key, 'field_name'). |