NoWreck v0.9.0 – Rust and Go Language Support

AstralXVoid1 pts0 comments

Release NoWreck v0.9.0 — Rust + Go Language Support · AstralXVoid/NoWreck · GitHub

//releases/show" data-turbo-transient="true" />

Skip to content

Search/

Sign in<br>Sign upAppearance settings

You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

{{ message }}

AstralXVoid

NoWreck

Public

Notifications<br>You must be signed in to change notification settings

Fork

Star

NoWreck v0.9.0 — Rust + Go Language Support

Latest

Latest

Compare

Choose a tag to compare

Sorry, something went wrong.

Filter

Loading

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

No results found

View all tags

AstralXVoid

released this

19 Aug 11:03

v0.9.0

0f67d20

NoWreck v0.9.0 — Rust + Go Language Support

Release date: August 2026

Previous release: v0.8.0 (Type-Level Claim Types)

Focus: Rust and Go language support via tree-sitter grammars. Two new scanner modules, extended repository scanner, change detector, and symbol index — all following the existing architecture pattern exactly. Zero new claim types, zero changes to the verification engine, reporter, or JSON schema.

What's new in v0.9.0

Rust scanning ✅

Rust source files (.rs) are now parsed with the tree-sitter-rust grammar. The scanner extracts:

i32 { a + b } → FUNCTION "add"<br>pub fn connect(addr: &str) -> Result { ... } → FUNCTION "connect"<br>struct User { name: String, age: u32 } → CLASS "User"<br>impl User { fn display(&self) { ... } } → METHOD "display" (parent_class: "User")<br>trait Display { fn fmt(&self); } → INTERFACE "Display"<br>impl Display for User { fn fmt(&self) { ... } } → METHOD "fmt" (parent_class: "User")<br>enum Role { Admin, Member, Guest } → ENUM "Role"<br>type Result = std::result::Result → TYPE_ALIAS "Result"">fn add(a: i32, b: i32) -> i32 { a + b } → FUNCTION "add"<br>pub fn connect(addr: &str) -> Result()> { ... } → FUNCTION "connect"<br>struct User { name: String, age: u32 } → CLASS "User"<br>impl User { fn display(&self) { ... } } → METHOD "display" (parent_class: "User")<br>trait Display { fn fmt(&self); } → INTERFACE "Display"<br>impl Display for User { fn fmt(&self) { ... } } → METHOD "fmt" (parent_class: "User")<br>enum Role { Admin, Member, Guest } → ENUM "Role"<br>type ResultT> = std::result::ResultT, Error> → TYPE_ALIAS "Result"

pub/pub(crate) visibility modifiers are unwrapped (like export in TS)

mod declarations are skipped (structural namespaces, not symbols)

impl block methods are extracted with parent_class set to the impl target

trait methods are NOT extracted as METHOD symbols (same one-level-deep philosophy)

Macro invocations (println!, format!) are NOT treated as function calls

Go scanning ✅

Go source files (.go) are parsed with the tree-sitter-go grammar:

func Add(a, b int) int { return a + b } → FUNCTION "Add"<br>func (u *User) Display() { fmt.Println(u.Name) } → METHOD "Display" (parent_class: "User")<br>type User struct { Name string; Age int } → CLASS "User"<br>type Reader interface { Read(p []byte) (n int, err error) } → INTERFACE "Reader"<br>type Status string → TYPE_ALIAS "Status"

type X struct → CLASS (structs are Go's primary data-carrying type)

type X interface → INTERFACE (method sets)

type X string → TYPE_ALIAS (type renames)

Receiver types extracted from method declarations for parent_class

const and var declarations are skipped (value bindings, not symbols)

Selector expressions (fmt.Println()) are NOT treated as simple function calls

Architecture

Both scanners follow the exact same pattern as the TypeScript scanner:

Lazy-load grammar on first call (per-process singleton)

Parse file with tree-sitter

Walk CST, collect top-level declarations

Return Symbol objects compatible with the shared pipeline

Call detection via call_expression with simple identifier targets

The repository scanner discovers .rs and .go files alongside .py, .js, .ts, and .tsx. The symbol index, change detector, and verification engine all work unchanged — they see Symbol objects and DetectedChange objects, never knowing which language produced them.

Scope boundary

.py/.js/.ts/.tsx existing behaviour — byte-identical to v0.8.0 (hard gate)

Same 13 claim types — Rust/Go use the existing types

No new SymbolType, ChangeType, or ClaimType members

Verifier, reporter, prompts — zero changes

JSON schema — zero changes (additive language support)

2 new dependencies: tree-sitter-rust, tree-sitter-go

Test suite

Suite<br>v0.8.0<br>v0.9.0<br>Growth

pytest (project unit tests)<br>453<br>453

Milestone 1 checkpoint<br>60 tests<br>80 tests<br>+20

Change detector<br>57 tests<br>57 tests

Verifier<br>55 tests<br>55 tests

Terminal reporter<br>45 tests<br>45 tests

ruff<br>0 issues<br>0 issues

basedpyright<br>0 errors<br>0 errors

+20 new milestone tests:

TestPureRustRepo (9 tests): file discovery, greeter symbols, calculator class+methods, models types (struct, trait, enum, type...

user type display tests rust result

Related Articles