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...