NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #427 most downloaded on PyPI
Python bindings to the Tree-sitter parsing library
Last release 3 months ago
30 Jun 2026
Release timing varies
gaps range from 8 days to 9 months
Some releases are documented
notes for 17 of 37 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
37 releases · first in 2019
Breaking changes are marked with ! .
Breaking changes are marked with !.
Point.edit()Point.__repr__()QueryCursor.set_containing_byte_range()QueryCursor.set_containing_point_range()Range.edit()tree_sitter.__version__Language.version: use Language.abi_version !Language.query(source): use Query(language, source) !Parser.timeout_micros: use the progress_callback in parse() !QueryCursor.timeout_micros: use the progress_callback in matches() or captures() !Point is a tuple subclass rather than a namedtuple objectci: bump actions/download-artifact from 4 to 5 in the actions group by @dependabot [bot] in #401
3624198 to 629093d by @dependabot[bot] in #405629093d to a467ea8 by @dependabot[bot] in #412a467ea8 to da6fe9b by @dependabot[bot] in #417Full Changelog: v0.25.1...v0.25.2
One column per quarter.
fix(docs): QueryCursor page was missing from index by @MisakaVan in #385
58edb3a to 3624198 by @dependabot[bot] in #397Full Changelog: v0.25.0...v0.25.1
Breaking changes are marked with ! .
Breaking changes are marked with !.
Language.name (getter)Language.abi_version (getter)Language.semantic_version (getter)Language.supertypes (getter)Language.subtypes(supertype)Node.first_child_for_byte(byte)Node.first_named_child_for_byte(byte)Query.string_count (getter)Query.capture_name(index)Query.capture_quantifier(pattern_index, capture_index)Query.string_value(index)QueryCursor(query)QueryCursor.match_limit (getter, setter, deleter)QueryCursor.timeout_micros (getter, setter, deleter)QueryCursor.did_exceed_match_limit (getter)QueryCursor.set_max_start_depth(depth)QueryCursor.set_byte_range(start, end)QueryCursor.set_point_range(start, end)QueryCursor.captures(node, predicate, progress_callback)QueryCursor.matches(node, predicate, progress_callback)LookaheadIterator.names()LookaheadIterator.symbols()Language.version: use Language.abi_versionLanguage.query(source): use Query(language, source)Parser.timeout_micros: use the progress_callback in parse()QueryCursor.timeout_micros: use the progress_callback in matches() or captures()Node.child_containing_descendant(descendant): use Node.child_with_descendant(descendant) !Query.match_limit: moved to QueryCursor.match_limit !Query.set_match_limit(limit): moved to QueryCursor.match_limit !Query.did_exceed_match_limit: moved to QueryCursor.did_exceed_match_limit !Query.timeout_micros: moved to QueryCursor.timeout_micros !Query.set_timeout_micros(timeout): moved to QueryCursor.timeout_micros !Query.set_max_start_depth(depth): moved to QueryCursor.set_max_start_depth(depth) !Query.set_byte_range(byte_range): moved to QueryCursor.set_byte_range(start, end) !Query.set_point_range(point_range): moved to QueryCursor.set_point_range(start, end) !Query.captures(node, predicate): moved to QueryCursor.captures(node, predicate, progress_callback) !Query.matches(node, predicate): moved to QueryCursor.matches(node, predicate, progress_callback) !LookaheadIterator.iter_names(): use LookaheadIterator.names() !Parser.parse(): encoding parameter also accepts "utf16le" & "utf16be"Parser.parse(): added progress_callback parameterLookaheadIterator.__next__(): yields tuple[int, str] !LookaheadIterator.reset(state, language): renamed from reset_state !Breaking changes are marked with ! .
Breaking changes are marked with !.
Language.copy()Language.node_kind_is_supertype(id)Language.__copy__()LogType (enum)Node.child_with_descendant(descendant)Node.field_name_for_named_child(descendant)Parser.print_dot_graphs(file)Parser.logger (getter + setter)Tree.copy()Tree.print_dot_graph(file)Tree.__copy__()Language(ptr: int)Node.child_containing_descendant(descendant): use Node.child_with_descendant(descendant)Update documentation on Query.captures() by @Bzero in #306
Query.captures() by @Bzero in #30646bdc14 to f629fd4 by @dependabot in #307Full Changelog: v0.23.1...v0.23.2
build: bump tree_sitter/core from 12fb318 to ee06325 by @dependabot in #286
12fb318 to ee06325 by @dependabot in #286Full Changelog: v0.23.0...v0.23.1
Node.child_containing_descendant(descendant)
Node.child_containing_descendant(descendant)Tree.language (getter)Query.pattern_count (getter)Query.capture_count (getter)Query.match_limit (getter)Query.did_exceed_match_limit (getter)Query.set_match_limit(match_limit): returns selfQuery.set_max_start_depth(max_start_depth): returns selfQuery.set_byte_range(byte_range): returns selfQuery.set_point_range(point_range): returns selfQuery.disable_pattern(index): returns selfQuery.disable_capture(capture): returns selfQuery.pattern_settings(index)Query.pattern_assertions(index)Query.start_byte_for_pattern(index)Query.end_byte_for_pattern(index)Query.is_pattern_rooted(index)Query.is_pattern_non_local(index)Query.is_pattern_guaranteed_at_step(offset)QueryError (exception class)QueryPredicate (typing protocol)Parser.set_language(language)Parser.set_included_ranges(ranges)Parser.set_timeout_micros(timeout)Node.sexp()Tree.text()TreeCursor.goto_first_child_for_point(row, column)LookaheadIterator.reset(language, state)Language() accepts a capsule as an argument.Parser.parse(...) no longer accepts a keep_text argument.Query.captures(...)
set_* instead).dict[str, list[Node]].Query.matches(...)
set_* instead).list[tuple[int, dict[str, list[Node]]]].TreeCursor.goto_first_child_for_byte(byte) returns int | None.TreeCursor.goto_first_child_for_point(point) returns int | None.Full Changelog : v0.22.2...v0.22.3
Full Changelog: v0.22.2...v0.22.3
Full Changelog : v0.22.1...v0.22.2
Full Changelog: v0.22.1...v0.22.2
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.22.0...v0.22.1
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.22.0...v0.22.1
_Breaking changes are marked with !._
Breaking changes are marked with !.
LANGUAGE_VERSIONMIN_COMPATIBLE_LANGUAGE_VERSIONPoint(row, column)Language.__repr__()Language.__eq__(): checks ptrLanguage.__int__(): returns ptrLanguage.__index__(): returns ptrLanguage.__hash__(): returns ptrNode.__str__(): returns the S-expressionTreeCursor.goto_first_child_for_point(point)TreeCursor.__copy__(): returns copy()Query(language, source)Parser(language, included_ranges, timeout_micros)Parser.language (getter + setter)Parser.included_ranges (getter + setter)Parser.timeout_micros (getter + setter)Range.__hash__()Node.sexp(): use str()Tree.text: use root_node.textTreeCursor.goto_first_child_for_point(row, column): use goto_first_child_for_point(point)LookaheadIterator.reset(language, state): use reset_state(state, language)Parser.set_language(language): use Parser(language) or language setterParser.set_included_ranges(ranges): use included_ranges setterParser.set_timeout_micros(timeout): use timeout_micros setterLanguage(path, name) !Language.build_library(...) !Language.name !Language.libLanguage.language_id: use int()Language() only accepts a single integer argument. !Parser.parse(...) accepts an optional encoding argument. !TreeCursor.descendant_index is changed to a property. !LookaheadIterator.language returns a Language instance. !LookaheadIterator.reset_state(...) accepts an optional language argument.Query.captures(...) arguments must be keywords (except for node).Query.matches(...) arguments must be keywords (except for node).Range.__repr__() prints attributes in the same order as the Range() arguments.Range() arguments are no longer considered optional.Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.21.2...v0.21.3
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.21.2...v0.21.3
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.21.1...v0.21.2
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.21.1...v0.21.2
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.21.0...v0.21.1
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.21.0...v0.21.1
Fix type of Tree.text property by @jhandley in https://github.com/tree-sitter/py-tree-sitter/pull/176
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.20.4...v0.21.0
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.20.3...v0.20.4
Full Changelog: https://github.com/tree-sitter/py-tree-sitter/compare/v0.20.3...v0.20.4
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →