SKILL.md
oxc-project/oxc-walker oxc-walker
Version: 0.7.0 (Jan 2026) Deps: magic-regexp@^0.10.0 Tags: latest: 0.7.0 (Jan 2026)
References: [package.json](./.skilld/pkg/package.json) — exports, entry points • [README](./.skilld/pkg/README.md) — setup, basic usage • [GitHub Issues](./.skilld/issues/INDEX.md) — bugs, workarounds, edge cases • [Releases](./.skilld/releases/INDEX.md) — changelog, breaking changes, new APIs
Search
Use skilld search instead of grepping .skilld/ directories — hybrid semantic + keyword search across all indexed docs, issues, and releases. If skilld is unavailable, use npx -y skilld search.
skilld search "query" -p oxc-walker
skilld search "issues:error handling" -p oxc-walker
skilld search "releases:deprecated" -p oxc-walker
Filters: docs:, issues:, releases: prefix narrows by source type.
API Changes
This section documents version-specific API changes -- prioritize recent major/minor releases.
- NEW:
ScopeTrackerVariable-- exported class in v0.7.0, enablesinstanceofchecks on results fromscopeTracker.getDeclaration(). Previously internal-only; LLMs will not know these classes are importable [source](./.skilld/releases/v0.7.0.md#features)
- NEW:
ScopeTrackerFunction-- exported class in v0.7.0, represents function declarations tracked byScopeTracker. Import directly fromoxc-walkerfor type narrowing [source](./.skilld/releases/v0.7.0.md#features)
- NEW:
ScopeTrackerImport-- exported class in v0.7.0, represents import declarations tracked byScopeTracker. Has.importNodeproperty for accessing the fullImportDeclaration[source](./.skilld/releases/v0.7.0.md#features)
- NEW:
ScopeTrackerFunctionParam-- exported class in v0.7.0, represents function parameters tracked byScopeTracker. Has.fnNodefor accessing the parent function node [source](./.skilld/releases/v0.7.0.md#features)
- NEW:
ScopeTrackerIdentifier-- exported class in v0.7.0, represents plain identifiers (e.g. class/enum names) tracked byScopeTracker[source](./.skilld/releases/v0.7.0.md#features)
- NEW:
ScopeTrackerCatchParam-- exported class in v0.7.0, represents catch clause parameters tracked byScopeTracker. Has.catchNodefor the parentCatchClause[source](./.skilld/releases/v0.7.0.md#features)
- NEW:
getUndeclaredIdentifiersInFunction(node)-- exported in v0.7.0, returnsstring[]of identifier names referenced but not declared within aFunctionorArrowFunctionExpressionnode [source](./.skilld/releases/v0.7.0.md#features)
- NEW:
isBindingIdentifier(node, parent)-- exported in v0.7.0, returnsbooleanindicating whether a node is a binding identifier given its parent context [source](./.skilld/releases/v0.7.0.md#features)
- DEPRECATED:
ScopeTrackerFunctionParam.start-- use.fnNode.startinstead. The representation of this position may change in future versions [source](./.skilld/pkg/dist/index.d.ts:L279)
- DEPRECATED:
ScopeTrackerFunctionParam.end-- use.fnNode.endinstead. The representation of this position may change in future versions [source](./.skilld/pkg/dist/index.d.ts:L283)
- NEW:
ScopeTrackerNodetype -- union type exported in v0.7.0:ScopeTrackerFunctionParam | ScopeTrackerFunction | ScopeTrackerVariable | ScopeTrackerIdentifier | ScopeTrackerImport | ScopeTrackerCatchParam. Use for typinggetDeclaration()results [source](./.skilld/releases/v0.7.0.md#features)
- BREAKING:
oxc-parserpeer dependency -- v0.6.0 requiresoxc-parserv0.98.0+. Older oxc-parser versions are no longer compatible [source](./.skilld/releases/v0.6.0.md#features)
Also changed: WalkOptions type exported v0.7.0 · WalkerEnter type exported v0.7.0 · WalkerLeave type exported v0.7.0 · WalkerCallbackContext type exported v0.7.0 · WalkerThisContextEnter type exported v0.7.0 · WalkerThisContextLeave type exported v0.7.0 · Identifier type exported v0.7.0 · ScopeTrackerOptions type exported v0.7.0
Best Practices
- Use regular function expressions (not arrow functions) for
enter/leavecallbacks --this.skip(),this.replace(), andthis.remove()are bound viathiscontext and won't work with arrow functions [source](./.skilld/pkg/dist/index.d.ts:L88:90)
// correct
walk(ast, { enter(node) { this.skip() } })
// broken -- this.skip is undefined
walk(ast, { enter: (node) => { this.skip() } })
- Use
parseAndWalkover separateparseSync+walkwhen you only need a single pass -- it returnsParseResult(includingprogram) so you can still re-walk the AST if needed later [source](./.skilld/pkg/README.md#parse-and-walk-directly)
- For hoisted declaration resolution, use the two-pass pattern: create
ScopeTracker({ preserveExitedScopes: true }), runparseAndWalkas a pre-pass to collect all declarations, callscopeTracker.freeze(), thenwalk(program, { scopeTracker })for analysis -- without this,getDeclaration()returnsnullfor identifiers declared after their usage in source order [source](./.skilld/pkg/README.md:L170:203)
- Do not use
this.replace()orthis.remove()when aScopeTrackeris attached -- the scope tracker will not update its internal declarations, leaving stale scope data [source](./.skilld/pkg/README.md#thisreplacenewnode)
this.remove()takes precedence overthis.replace()-- if both are called in the same callback, the node is removed regardless of replacement [source](./.skilld/pkg/README.md#thisremove)
this.skip()is only available inenter, notleave, and skipping a node also prevents itsleave()callback from firing -- this means ScopeTracker state can become inconsistent if you skip nodes that create scopes [source](./.skilld/issues/issue-106.md)
- Type-narrow
ScopeTrackerNodeusing the.typediscriminant orinstanceof(v0.7.0+) to access parent declaration nodes --ScopeTrackerVariableexposes.variableNode,ScopeTrackerImportexposes.importNode,ScopeTrackerCatchParamexposes.catchNode,ScopeTrackerFunctionParamexposes.fnNode[source](./.skilld/pkg/dist/index.d.ts:L268:311)
isCurrentScopeUnder(scope)uses strict child checking -- it returnsfalsewhen the current scope equals the given scope, onlytruefor descendants [source](./.skilld/pkg/dist/index.d.ts:L226:236)
- Use
getUndeclaredIdentifiersInFunction(node)to find free variables (closures) in a function or arrow function expression -- useful for tree-shaking analysis and determining if a function can be safely hoisted or moved [source](./.skilld/pkg/dist/index.d.ts:L246)
ScopeTrackerFunctionParam.startand.endare deprecated -- access the function's position via.fnNode.startand.fnNode.endinstead [source](./.skilld/pkg/dist/index.d.ts:L277:285)