Changelog
All notable changes to this project will be documented in this file. See commit-and-tag-version for commit guidelines.
0.1.1 (2026-10-02)
Packaging-only release. 0.1.0 reached npm and crates.io but never PyPI; this is the first release published there. No grammar changes.
Fixes
- PyPI sdist builds again. The sdist job now installs
brotli, whichsetup.pyneeds to inflate the committedparser.c.brblobs. - The sdist is installable.
setup.pyfalls back to the already-inflatedparser.cwhen there is no.brblob, importsbrotlionly when it actually inflates something, and the sdist now includes the basesrc/scanner.cthat every dialect scanner#includes. - A failed sdist build blocks the PyPI publish instead of uploading wheels without a source distribution.
0.1.0 (2026-08-31)
0.3.11 shipped an ANSI base with four dialects on top. There are now 22, the base grammar is strictly ISO SQL, and coverage is measured against outside parsers rather than against our own test suite. This is also, in practice, the project's first real release: nothing under the previous 0.3.x line was ever published to npm, crates.io or PyPI, so the version starts fresh at 0.1.0 instead of continuing 0.3.x — don't read the number as a downgrade or expect SemVer continuity with anything before it.
Breaking changes
- Project renamed and moved. The fork was cut loose from
tree-sitter-sql-extendedinto its own repo,RelativelyUnknown/tree-sitter-sql-polyglot(GitHub org renamed fromRedPandaMC). The npm scope, the crates.io/PyPI package name and the Go module path all changed to match; anything importing under the old names or pointing at the old org needs to update. - Base grammar is ANSI only.
LIMITandLIMIT ... OFFSET,CREATE INDEX,CREATE MATERIALIZED VIEW,EXPLAIN,SELECT DISTINCT ON, trailingGROUP BY ... WITH ROLLUP/WITH CUBE, PL/SQL declarations and block/WHILEstatements no longer parse in the base grammar, which keeps the ANSIOFFSET ... FETCHform instead. Every dialect that really has the syntax re-adds it in its own override, so no dialect lost a feature. - Node names lost their dialect prefixes.
bq_,db2_,plsql_,pg_,sf_,tsql_,iceberg_,oracle_,mysql_andflink_prefixes are gone; the nodes now use the plain cross-dialect names (optimizer_hint,table_partition_by,with_properties, and so on). Queries and tools written against the old names need updating. - Dialect grammars were tightened to match their real engines. Constructs a dialect inherited but never actually supported now fail to parse:
LIMITin Oracle and Db2,OFFSET ... FETCHin MySQL and BigQuery, materialized views in Spark, MySQL, SQLite and T-SQL, savepoints in ClickHouse and Trino,QUALIFYin Trino and Athena.
Dialects
17 dialects joined the existing Spark/Hive, Databricks, PostgreSQL and MySQL grammars:
| Dialect | Extends | Dialect | Extends |
|---|---|---|---|
| snowflake | base | clickhouse | base |
| bigquery | base | flink | base |
| sqlite | base | redshift | base |
| oracle | base | trino | base |
| db2 | base | athena | trino |
| tsql | base | mariadb | mysql |
| duckdb | base | cockroachdb | postgres |
| teradata | base | spanner | bigquery |
| hana | base |
Hive was also split out of the combined Spark/Hive grammar into its own dialect extending the base directly, giving the chain databricks -> spark -> hive -> base and bringing the total to 22.
Features
- Base (ANSI):
GRANT/REVOKE;GROUP BY ROLLUP/CUBE/GROUPING SETS;FETCH {FIRST|NEXT} n {ROW|ROWS} {ONLY|WITH TIES};WITHIN GROUP (ORDER BY ...);TRIM([{BOTH|LEADING|TRAILING} [char] FROM] str); interval qualifiers (INTERVAL '1' DAY);SAVEPOINT/RELEASE SAVEPOINT/ROLLBACK TO SAVEPOINT;START TRANSACTIONwithISOLATION LEVELandREAD ONLY/READ WRITE;BEGIN/COMMIT/ROLLBACK WORK; typed temporal literals (DATE '...',TIME '...',TIMESTAMP '...'); datetime value functions (CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,LOCALTIME,LOCALTIMESTAMP);LIKE ... ESCAPE '...';DECLARE ... CURSORwithOPEN/FETCH/CLOSE; namedCONSTRAINT fk FOREIGN KEY (...) REFERENCES ...table constraints. COMMENT ONis wired into the base DDL dispatch and every dialect override. It was previously unreachable in 14 dialects.- PostgreSQL:
CREATE DOMAIN,CREATE CAST,CREATE AGGREGATE,CREATE SERVERandCREATE FOREIGN TABLE;PUBLICATION/SUBSCRIPTION;DOblocks; identity columns; recursiveSEARCH/CYCLE;LISTEN/NOTIFY/UNLISTEN;FOR UPDATE/SHAREwithNOWAIT/SKIP LOCKEDandLOCK TABLE ... IN ... MODE;GRANT ... ON ALL TABLES/SEQUENCES/FUNCTIONS IN SCHEMA;SELECT DISTINCT ON (...);ILIKE;PREPARE/EXECUTE/DEALLOCATE;DELETE ... USING;CALL;EXPLAIN ( option ... ); table partitioning,PARTITION OF ... FOR VALUES,CREATE TABLE (LIKE ...)andINHERITS; completeVACUUM,ALTER INDEXandALTER MATERIALIZED VIEW. - MySQL:
SHOW,DESCRIBE/DESC,LIMIT offset, count,@/@@variables; stored procedure and trigger bodies; cursors,DECLARE HANDLER/CONDITIONand proceduralCASE; partitioning DDL andALTER TABLEpartition management;FOR UPDATE/SHAREwithNOWAIT/SKIP LOCKEDandLOCK IN SHARE MODE;SET GLOBAL/SESSION/PERSIST[_ONLY],SET NAMES,SET CHARACTER SET;CREATE/ALTER/DROP/RENAME USERwith'user'@'host'accounts;REPAIR/CHECK/ANALYZE TABLEincluding histograms;STRAIGHT_JOIN;ALTER TABLE ... ALGORITHM=/LOCK=; multi-tableDELETE;MATCH (...) AGAINST (...);SELECT ... INTO OUTFILE/DUMPFILE;GROUP BY ... WITH ROLLUP; completeALTER VIEW,DROP INDEXandLOAD DATA. - MariaDB: split from MySQL with temporal tables, system versioning,
RETURNING,PACKAGEandCREATE OR REPLACE TABLE. - Oracle: PL/SQL bodies (assignment,
IF/ELSIF,WHILE,LOOPwithEXIT [WHEN], numericFOR ... IN 1..10,RETURN,CONTINUE,NULL),FORALL,BULK COLLECT INTO,RETURNING INTO,PRAGMAandPIPE ROW; cursors;CREATE TRIGGERwith a PL/SQL block body; Oracle scalar types and optimizer hints; partitioning DDL andDATEliterals;FLASHBACK AS OF,CREATE SYNONYM,CREATE DATABASE LINK;FOR UPDATE [OF ...] [NOWAIT|WAIT n|SKIP LOCKED];ANALYZE TABLE/INDEX; theMODELclause;ALTER SYSTEM/ALTER SESSION,CREATE/DROP DIRECTORY,GRANT READ/WRITE ON DIRECTORY;PIVOT/UNPIVOT;MATCH_RECOGNIZE;fn(...) KEEP (DENSE_RANK {FIRST|LAST} ORDER BY ...);ORGANIZATION {HEAP|INDEX|EXTERNAL};JSON_TABLE(...)andXMLTABLE(...); materialized view logs, zonemaps and index rebuild. - Db2: SQL PL bodies (
BEGIN...END,DECLARE,SET,IF/ELSEIF,WHILE...DO,LOOP,LEAVE,ITERATE); cursors and theFOR ... AS ... DO ... END FORloop;SELECT ... FROM FINAL/NEW/OLD TABLE (dml);LABEL ON {TABLE|COLUMN}; temporal queriesFOR {SYSTEM_TIME|BUSINESS_TIME};DECLARE GLOBAL TEMPORARY TABLE;CREATE TABLE ... ORGANIZE BY {ROW|COLUMN|DIMENSIONS (...)}for column-organized and multidimensional clustering tables;AUDIT,WHENEVER,GOTO,ALLOCATE CURSOR,ASSOCIATE LOCATORS;SET SCHEMAand the special registers it accepts. - T-SQL: scripting,
CROSS/OUTER APPLY,PIVOT/UNPIVOT,#temp/##globalidentifiers; cursors;EXEC/EXECUTE,RETURN,OPTION()hints,WAITFOR;USE database;CREATE/DROP SYNONYM;LOGINandUSERsecurity DDL;IDENTITY[(seed, increment)]and computed columnscol AS (expr) [PERSISTED];CREATE TYPE ... AS TABLE (...)andCREATE TYPE ... FROM base_type; select-list variable assignment (SELECT @v = expr);CREATE/ALTER DATABASEfile specs and option lists;GROUP BY ... WITH ROLLUP/WITH CUBE. - BigQuery: native types (
INT64,FLOAT64,BYTES,STRUCT<...>,ARRAY<...>),UNNEST, backtick identifiers,QUALIFY;PARTITION BY/CLUSTER BYDDL;CALL,RAISE [USING MESSAGE = ...]andRETURN;THEN RETURNon DML;PIVOT/UNPIVOT;FOR SYSTEM_TIME AS OF; UDF, table-function and procedure DDL;LOAD DATA {INTO|OVERWRITE} ... FROM FILES (...);CREATE SNAPSHOT TABLE ... CLONE;SET OPTIONSacrossALTER, key constraints and collation. - Snowflake:
::cast and@stageas aFROMsource;SHOWandDESCRIBE;CLONE,UNDROP,CREATE/ALTER WAREHOUSE;CREATE FILE FORMATandCOPY INTOwith an inline subquery; stage DDL andLIST @stage;CALL;INSERT OVERWRITE INTO;CREATE EXTERNAL TABLE;ALTER TABLE ... CLUSTER BY/DROP CLUSTERING KEY;USE DATABASE/SCHEMA/WAREHOUSE/ROLE;RETURNINGon DML;START WITH ... CONNECT BY ... PRIOR;SELECT * [ILIKE] [EXCLUDE] [RENAME]; multi-tableINSERT ALL/INSERT FIRST; property lists on database, schema and warehouse DDL. - Redshift:
DISTKEY/SORTKEY/DISTSTYLE/ENCODE, external schemas and tables,COPY/UNLOAD;ALTER GROUP, diststyle and sortkey changes, sessionSET;PARTITIONED BYon external tables;GRANT ... ON ALL TABLES/FUNCTIONS/PROCEDURES IN SCHEMA; complete user-management DDL;ALTER TABLE ... APPEND FROM;CREATE EXTERNAL FUNCTION ... LAMBDA;CREATE MATERIALIZED VIEW ... [BACKUP|AUTO REFRESH];CREATE/ALTER DATASHARE;CREATE MODEL(Redshift ML);ALTER MATERIALIZED VIEWandALTER DATABASEactions. - SQLite:
INSERT OR REPLACE|IGNORE, UPSERT,AUTOINCREMENT,INDEXED BY/NOT INDEXED; generated columns;CREATE TRIGGER ... BEGIN stmt; ... END;GLOBandMATCH;RETURNINGonUPDATEandDELETE;UPDATE OR <action>;BEGINisolation modes. - DuckDB: FROM-first
SELECT,SELECT * EXCLUDE/REPLACE/RENAME, lambdas, struct/map/list literals,ASOF/POSITIONAL JOIN,ATTACH;COPY TO/FROMand file-reader table functions;CREATE MACRO,EXPORT/IMPORT DATABASE; a bare string literal as aFROMsource;RETURNINGon DML;UNION/EXCEPT/INTERSECT ... BY NAME;USING SAMPLE; open-ended list slicing (l[2:],l[:3]);DISTINCT ON;ATTACH IF NOT EXISTS/OR REPLACEandDETACH IF EXISTS. - Trino:
PREPARE/EXECUTE/DEALLOCATE,MATCH_RECOGNIZE,TABLESAMPLE,ARRAY/MAP/ROWtypes, lambdas;SHOW,DESCRIBE,ANALYZE;SELECT ... FOR UPDATE;CREATE VIEW ... SECURITY {DEFINER|INVOKER};ALTER TABLE ... EXECUTE proc(...);SET ROLE;SET TIME ZONE;DENY;SET PATH;SET SESSION AUTHORIZATION;SET AUTHORIZATION,SET PROPERTIESandALTER VIEW ... REFRESH. - Athena:
UNLOAD,MSCK REPAIR TABLE;CREATE EXTERNAL TABLEwith Hive storage syntax;VACUUM;ALTER TABLE ADD/DROP PARTITIONandSET LOCATION;OPTIMIZE ... REWRITE DATA USING BIN_PACKfor Iceberg compaction; managed IcebergCREATE TABLE ... TBLPROPERTIES ('table_type'='ICEBERG'). - ClickHouse:
ENGINE = MergeTree(), columnMATERIALIZED/ALIAS/EPHEMERAL/CODEC/TTL,PREWHERE,FINAL,ARRAY JOIN,LIMIT n BY,SAMPLE,WITH TOTALS,ORDER BY ... WITH FILL; mutations includingALTER UPDATE/DELETE ... IN PARTITION;KILL QUERY/MUTATIONand access control DDL;BACKUP/RESTORE;EXCHANGE TABLES;ALTER TABLE FREEZE/UNFREEZE;INSERT ... RETURNING;GLOBAL JOINandx GLOBAL [NOT] IN (...);SELECT *transformers (EXCEPT/APPLY/REPLACE);INSERT ... FORMAT fmtandINSERT INTO FUNCTION f(...);CHECK,DESCRIBE,EXISTS,MOVE,UNDROPand collection DDL; settings constraints on roles and profiles;OPTIMIZEoptions andPARTITION ID. - Flink: connector DDL (
WITH (...)),WATERMARK FOR, windowing TVFs, temporal joins,CREATE CATALOG,LOAD/UNLOAD MODULE, statement sets;LATERAL TABLE(func(...)) AS t(cols);MATCH_RECOGNIZE;REPLACE TABLE,DROP TEMPORARYandDROP DATABASEdrop behaviour. - Hive:
LOAD DATA [LOCAL] INPATH,INSERT OVERWRITE [LOCAL] DIRECTORY, multi-tableINSERT,CLUSTER/DISTRIBUTE/SORT BY;SELECT TRANSFORM(...) USING 'script' AS (...);SHOWandDESCRIBE [FORMATTED|EXTENDED];ALTER TABLE ... EXCHANGE PARTITION;CONCATENATE;EXPORT/IMPORT TABLE;CREATE TEMPORARY MACRO; role DDL. - Spark:
QUALIFY,PIVOT/UNPIVOT, query-levelCLUSTER/DISTRIBUTE/SORT BY,CREATE TABLE ... USING/OPTIONS; Spark 4.xVARIANT,MERGE ... BY SOURCE, collation andSET VAR; Iceberg DDL (CALL, partition transforms,WRITE ORDERED/DISTRIBUTED);GROUP BY ALL;INSERT {INTO|OVERWRITE} TABLEandINSERT INTO ... BY NAME; Delta time travel inFROM;CREATE [TEMPORARY] VIEW ... USING source [OPTIONS (...)]; database DDL options,DROP ... PURGEandDROP TEMPORARY FUNCTION; the inherited Hive role DDL. - Databricks:
CREATE STREAMING TABLE,LIVE TABLEand Unity Catalog objects;APPLY CHANGES INTO; Iceberg and Unity CatalogALTER TABLE(branches, tags, column position); liquid clustering (CLUSTER BY (...),CLUSTER BY NONE);CREATE MATERIALIZED VIEW ... [SCHEDULE ...];COPY INTO ... FILEFORMAT = .... - CockroachDB:
ALTER TABLE ... SPLIT AT/UNSPLIT AT/SCATTER; column families (FAMILY name (cols));SET LOCALITY;CONFIGURE ZONE USING; multi-region DDL andALTER INDEXactions. - Spanner: generated columns
col AS (expr) STORED;CREATE VIEW ... SQL SECURITY;CREATE SEQUENCE ... OPTIONS (...);ALTER DATABASE ... SET OPTIONS (...);ALTER TABLE ... {ADD|REPLACE|DROP} ROW DELETION POLICY; identity columns and synonym DDL. - Teradata:
[NOT] CASESPECIFIC,UPPERCASEandTITLEcolumn attributes;CREATE {JOIN|HASH} INDEX ... AS SELECT; atomic UPSERT (UPDATE ... SET ... ELSE INSERT);CREATE TABLE ... AS ... WITH [NO] DATA [AND [NO] STATISTICS];CALL,DUMP EXPLAIN,INSERT EXPLAIN,EXECUTE FUNCTION,SELECT AND CONSUME,USINGrequest modifiers, and index and partition analysis. - SAP HANA:
SELECT TOP n;ALTER TABLE ... ADD (col type, ...); SQLScript control flow (IF/ELSEIF/ELSE,WHILE ... DO,FOR ... IN a..b DO,BREAK/CONTINUE); SQLScript table-variable assignment (tabvar = SELECT ...);EXPORT,IMPORT,UNSETandDO; index rebuild, role groups, table groups and schema synonyms. - Upsert targets:
ON CONFLICT (col) [WHERE ...]andON CONSTRAINT namein PostgreSQL, SQLite, CockroachDB and DuckDB. GROUP BY ALLin Spark, Databricks, BigQuery and Snowflake.
Bug Fixes
- Lexer precedence across dialects. A dialect keyword declared as
token(prec(1, ...))beat a longer base keyword sharing its prefix, soMATCHEDlexed asMATCH+EDand brokeMERGE ... WHEN MATCHED. Audited and fixed across every dialect. - DuckDB: restored
MERGE INTO, removed on the belief that DuckDB has noMERGE. Version 1.4.0 added it. - T-SQL: restored
CREATE MATERIALIZED VIEW. Azure Synapse dedicated SQL pools support it, and this dialect covers Synapse. - Spark: restored
CREATE MATERIALIZED VIEW, which Spark 4.x documents under Declarative Pipelines. - Spanner: restored
SELECT ... FOR UPDATE, shadowed by the inherited BigQueryFOR SYSTEM_TIME AS OFclause. - MariaDB: restored the MySQL features its
_column_constraintoverride had dropped (AUTO_INCREMENT,STORED/VIRTUALgenerated columns, foreign keyON DELETE/UPDATE). - Databricks: restored
iceberg_write_orderandDISTRIBUTED BY PARTITION, dropped by the_alter_specificationsoverride. - Spark: restored the inherited Hive
SHOW/DESCRIBE/MSCK REPAIR/LOAD DATAstatements, dropped by the_ddl_statementoverride. - Base:
_decimal_numberno longer eats the first dot of Oracle's..range operator. - Base: a
CREATE FUNCTIONwith a bareRETURNbody no longer swallows its own terminator and breaks the following statement. - MySQL: dropped
LINES STARTING BY, which broke MariaDB'sSELECTpath. - Db2:
SET SCHEMAis reachable as a statement, andCREATE SECURITY LABEL's element list is unambiguous. - Teradata: request modifiers are prefixes rather than wrappers, and
KEEPis reserved inINITIATE INDEX ANALYSIS. - Oracle: flattened
ALTER INDEX REBUILD's option list. - BigQuery:
ADD's unnamed constraint form is restricted to the shapes that allow it. - ClickHouse: the operator table lists
ILIKErather thanSIMILAR TO, which ClickHouse does not have. - SAP HANA:
ALTER SYSTEMoption values are constrained to a scalar, and the rules duplicatinghana_object_statementwere removed. - Windows:
generate.jsusesfileURLToPath(), fixing parser generation on Windows paths. - Highlights: removed queries referencing node types that no longer exist.
Performance
- Resolved self-conflicts with
prec.rightoninterval,time/timestampand T-SQL'soutput_clauseinstead of GLR conflicts. - Merged T-SQL's bracket and temp-identifier tokens, and dropped MySQL's redundant backtick-identifier sequence.
- Dropped unnecessary conflict declarations across dialects, and
SIMILAR TOfrom SQLite. - The dollar-quote scanner keeps its tag size counter on the stack. It was one
malloc/freeper character of a dollar-quoted body.
Tooling and CI
tools/coverage.pyreplacesscorecard.py,corroborate.py,parse_rate.pyanddiff_parse.py. Every feature probe is parsed by this grammar and by independent reference parsers (SQLGlot, ANTLR grammars-v4, pglast, sqlfluff), so a feature counts as covered only when an outside parser agrees. The report surfaces suspect probes (we accept, no reference does) and confirmed gaps (we reject, a reference accepts), and scores the base grammar against ISO Core.tools/coverage-probes.ymlcarries a per-dialect statement inventory. Scoring one shared feature list against all 23 grammars had counted PostgreSQL-only statements as gaps in 20 engines that never had them.tools/glr_scan.pyranks grammars by parse-table size, state count, generation time and peak memory.tools/parse_bench.pymeasures parse throughput per dialect on a real workload and on shapes that provoke GLR stack splitting, reporting how time grows with input size.- Generated parsers are no longer committed. Generation is hash-cached, self-healing against poisoned caches, parallel with a memory cap, and pinned to tree-sitter CLI 0.26.3.
- CI shards the corpus tests, cancels superseded runs, and reuses the matrix's parsers in the coverage job.
- The docs site moved to VitePress, with the coverage page generated on every run.
mainnow requires a pull request, one code-owner approval, and a passingci-passedcheck; force-pushes and branch deletion are blocked (repo admins may still bypass in an emergency).- Added a
main+release/x.ybranch model, so releases and hotfixes route through a release branch rather than landing directly onmain;CODEOWNERS, a PR template, and arelease/**trigger onci.ymlback it. - npm, crates.io and PyPI publishing switched to OIDC trusted publishing, dropping the long-lived
NPM_TOKEN/CARGO_REGISTRY_TOKEN/PYPI_API_TOKENsecrets entirely; each publish job now runs under its own GitHub Environment for secret scoping. PyPI's publish step vendors its sdist/wheel build directly intopublish.ymlrather than calling a reusable workflow, since OIDC can't verify a trusted publisher through one. - Per-language binding tests were restructured: Go keeps the one full 23-dialect suite (Ubuntu only), while Node, Go, Python, Rust and C/CMake each get a lightweight base+postgres check across macOS/Ubuntu/Windows, catching an OS- or compiler-specific native-build break without paying to build all 22 dialects on every OS. Windows runners were also unified on
windows-2025(test_gohad drifted ontowindows-latest).
Bindings
- Rust, Node and Python bindings are now per-dialect instead of one bundle carrying all 22. Rust gets one Cargo feature per dialect (default
[],fullfor everything);build.rsonly compiles a dialect'sparser.cwhen its feature is on. Node and Python each register one native module per dialect and only load the one actually imported, instead of dlopening/importing all 22 up front. Each dialect's generatedparser.c/node-types.jsonis brotli-compressed into a committed.brblob and inflated at build time — the raw multi-dialect crate blew past crates.io's 10MB limit (17.8MB gzip-compressed); brotli gets the published crate down to 7.9MB. - Go and Swift bindings get the same per-dialect, lazily-loaded treatment, using each ecosystem's own native mechanism instead of a feature-flag system: one importable Go subpackage per dialect (
bindings/go/postgres, ...) with its own#cgodirective, so importing one never compiles the other 21's C sources; one SwiftPM target and library product per dialect inPackage.swift(TreeSitterSqlPostgres, ...). Both bindings previously exposed only the base grammar and had no CI coverage at all; Go now gets a full 23-dialect build+test matrix and Swift builds and tests on macOS in CI. - C/CMake now supports every dialect, not just base: one CMake option per dialect (
-DTREE_SITTER_SQL_<DIALECT>=ON, or-DTREE_SITTER_SQL_FULL=ONfor all 22 at once), mirroring Cargo's feature-flag shape.CMakeLists.txtandbindings/c/are now generated byscripts/generate-bindings.jsalongside the other four bindings, rather than hand-maintained and scoped to base only.
Documentation
README.md,AGENTS.mdandCONTRIBUTING.mdcover all 22 dialects and the current architecture.README.mdalso gained a plain, factual fork-history and attribution note explaining its lineage fromtree-sitter-sql/tree-sitter-sequelthroughtree-sitter-sql-extended.docs/usage.mdis a new page covering install/import for every registry this project publishes to (npm, crates.io, PyPI), later extended to document the per-dialect Cargo features and Node/Python lazy loading, and finally to cover all six binding targets: Rust/Node/Python/Go/Swift/CMake+C.
0.3.11 (2026-05-23)
Features
- Multi-dialect grammar architecture: an ANSI SQL base with independently compiled dialect extensions for Spark/Hive, Databricks/Unity Catalog, PostgreSQL and MySQL
- Hash-based grammar caching (
scripts/generate.js), which skipstree-sitter generatewhen the sources are unchanged - Per-dialect test corpora in
<dialect>/test/corpus/ scripts/bump-version.sh, which syncs the version across all 5 manifestsagents.md, an architecture guide for grammar composition and dialect extension