Skip to content

feat: add AST node storage, intraprocedural CFG, and expanded node/edge types#279

Merged
carlos-alm merged 36 commits intomainfrom
feat/ast-cfg-intraprocedural
Mar 3, 2026
Merged

feat: add AST node storage, intraprocedural CFG, and expanded node/edge types#279
carlos-alm merged 36 commits intomainfrom
feat/ast-cfg-intraprocedural

Conversation

@carlos-alm
Copy link
Contributor

Summary

Three interconnected features that expand codegraph's static analysis capabilities:

1. Expanded node types (parameter, property, constant)

  • New SYMBOL_KINDS entries: parameter, property, constant
  • All 9 language extractors (JS/TS, Python, Go, Rust, Java, C#, PHP, Ruby, HCL) updated
  • Rust native engine extractors updated in parallel
  • New test suite: tests/parsers/extended-kinds.test.js (504 lines)

2. Expanded edge types (contains, parameter_of, receiver)

  • contains: parent-child structural relationships (class→method, module→function)
  • parameter_of: parameter→function ownership edges
  • receiver: Go receiver→method binding
  • Builder integration for automatic edge creation during graph build

3. Stored queryable AST nodes (src/ast.js)

  • New ast_nodes DB table storing call sites, new expressions, string/regex literals, throw, await
  • codegraph ast-query CLI command with glob pattern matching
  • ast_query MCP tool
  • Collected during build via extractor collectAstNodes() functions across all languages
  • Tests: tests/integration/ast.test.js, tests/parsers/ast-nodes.test.js

4. Intraprocedural Control Flow Graph (src/cfg.js)

  • Builds per-function CFGs from tree-sitter AST
  • Supports: if/else, loops (for/while/do-while/for-in/for-of), switch/case, try/catch/finally, break/continue (labeled), return, throw, ternary, logical operators, optional chaining
  • Output formats: JSON, DOT, Mermaid
  • codegraph cfg CLI command, cfg MCP tool
  • Tests: tests/unit/cfg.test.js (457 lines), tests/integration/cfg.test.js (199 lines)

Files changed

  • New: src/ast.js (392), src/cfg.js (1,035)
  • Modified: src/builder.js, src/cli.js, src/db.js, src/mcp.js, src/queries.js, src/index.js, src/parser.js, src/structure.js, src/paginate.js, all 9 extractors, Rust crate extractors
  • Tests: 5 new test files (1,579 lines total), updates to 3 existing test files

Test plan

  • npm test passes all existing + new tests
  • codegraph build . succeeds with new node/edge types and AST collection
  • codegraph ast-query --kind call --pattern "build*" returns stored call sites
  • codegraph cfg <function-name> produces valid CFG in JSON/DOT/Mermaid
  • codegraph cfg <function-name> --format mermaid renders correctly
  • MCP tools ast_query and cfg respond correctly
  • Build parity between native and WASM engines for new node types

github-actions bot and others added 30 commits March 2, 2026 04:48
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* docs: add Contributor License Agreement (CLA)

* ci: add CLA Assistant workflow and fix CLA.md issues

- Add .github/workflows/cla.yml using contributor-assistant/github-action@v2.6.1
  with dedicated cla-signatures branch to avoid polluting main
- Fix CLA.md: section 7→6 reference, capitalization consistency,
  control definition formatting (Roman numerals → lettered list)
- Add Acceptance section documenting the CLA bot signing process
- Add Governing Law clause (Province of Alberta, Canada)
- Update CONTRIBUTING.md with CLA signing instructions

* docs: document CLA recheck command in CONTRIBUTING.md

Address Greptile review feedback on #244 — add note that contributors
can comment `recheck` on a PR to re-trigger the CLA signature check.
* feat: add dataflow analysis (flows_to, returns, mutates edges)

Track how data moves through functions with three new edge types:
- flows_to: parameter/variable flows into another function as argument
- returns: call return value is captured by the caller
- mutates: parameter-derived value is mutated in-place

Opt-in via `build --dataflow` (JS/TS only for MVP). Adds schema
migration v10 (dataflow table), extractDataflow() AST walker with
scope tracking and confidence scoring, query functions (dataflowData,
dataflowPathData, dataflowImpactData), CLI command with --path and
--impact modes, MCP tool, batch support, and programmatic API exports.

Impact: 29 functions changed, 33 affected

* fix: handle spread args, optional chaining, and reassignment in dataflow

Address review feedback from Greptile:
- Track spread arguments (foo(...args)) by unwrapping spread_element
- Handle optional chaining (foo?.bar()) in callee name resolution
- Track non-declaration assignments (x = foo() without const/let/var)
  as returns edges
- Add 3 tests covering these cases

Impact: 3 functions changed, 3 affected
Insert Phase 4 (TypeScript Migration) between the architectural
refactoring phase and the intelligent embeddings phase. Renumber
all subsequent phases (old 4-8 → new 5-9) including sub-section
headings, cross-references, dependency graph, and verification table.

The migration is planned after Phase 3 because the architectural
refactoring establishes clean module boundaries that serve as
natural type boundaries for incremental TS adoption.
* feat(watcher): add structured NDJSON change journal for watch mode

Write symbol-level change events to .codegraph/change-events.ndjson
during watch mode. Each line records added/removed/modified symbols
with node counts and edge data, enabling external tools to detect
rule staleness without polling. File is size-capped at 1 MB with
keep-last-half rotation.

Impact: 8 functions changed, 4 affected

* style: use template literals per biome lint

Impact: 1 functions changed, 1 affected

* feat(queries): expose file content hash in where and query JSON output

Add fileHash field to queryNameData, whereSymbolImpl, and whereFileImpl
return objects by looking up the file_hashes table. This lets consumers
(e.g. code-praxis) detect when a rule's target file has changed since
the rule was created, enabling staleness detection.

Impact: 4 functions changed, 16 affected

* style: use template literal in test fixture

* fix(change-journal): add debug/warn logging for observability

Address review feedback: debug log on successful append and rotation,
warn when a single oversized line prevents rotation.

Impact: 2 functions changed, 2 affected

* style: fix biome formatting in change-journal warn call

Impact: 1 functions changed, 1 affected

* fix(change-journal): use Buffer for byte-accurate rotation midpoint

stat.size returns bytes but String.length counts UTF-16 characters.
Read as Buffer and use buf.indexOf(0x0a) to find the newline at the
byte-level midpoint, ensuring consistent behavior with multi-byte UTF-8.

Impact: 1 functions changed, 1 affected
* feat: add batch-query command and multi-command batch mode

Add splitTargets() for comma-separated target expansion, multiBatchData()
for mixed-command orchestration, and a new batch-query CLI command that
defaults to 'where'. The existing batch command also gains comma splitting
and multi-command detection via --from-file/--stdin.

Impact: 5 functions changed, 3 affected

* fix: add try/catch around JSON.parse in batch and batch-query actions

Wrap --from-file and --stdin JSON parsing with error handling so malformed
input produces a clear error message instead of an unhandled exception.
* docs: add competitive deep-dive for Joern and reorganize competitive folder

Move COMPETITIVE_ANALYSIS.md into generated/competitive/ and add a
comprehensive feature-by-feature comparison against joernio/joern
(our #1-ranked competitor). Covers parsing, graph model, query language,
performance, installation, AI/MCP integration, security analysis,
developer productivity, and ecosystem across 100+ individual features.
Update FOUNDATION.md reference to the new path.

* fix: update broken links to moved COMPETITIVE_ANALYSIS.md

README.md and docs/roadmap/BACKLOG.md still referenced the old path
at generated/COMPETITIVE_ANALYSIS.md after the file was moved to
generated/competitive/COMPETITIVE_ANALYSIS.md in #260.
Reduce MCP tool surface from 32 to 29 by merging overlapping tools:

- Rename query_function → query with deps/path modes (absorbs fn_deps + symbol_path)
- Add list mode to execution_flow (absorbs list_entry_points)
- Remove path mode from dataflow tool (now edges + impact only)
- Merge fn and path CLI commands into query (--path flag for path mode)
- Remove --path option from dataflow CLI command
- Update batch commands: remove fn, add dataflow, query uses fnDepsData
- Update MCP_DEFAULTS pagination keys

BREAKING CHANGE: MCP tools fn_deps, symbol_path, list_entry_points removed.
CLI commands fn and path removed. Use query instead.

Impact: 1 functions changed, 1 affected
* docs: add competitive deep-dive for narsil-mcp

Comprehensive feature-by-feature analysis of narsil-mcp (postrv/narsil-mcp),
the closest head-to-head competitor to codegraph. Covers all 8 FOUNDATION.md
principles, 9 feature comparison sections with 130+ features, gap analysis,
and competitive positioning.

* fix: address Greptile review — scoring math and relative path

- Fix principle scoring from 6-0-2 to 7-0-1 (correct count from table)
- Fix relative link to COMPETITIVE_ANALYSIS.md (../ not ./)
* docs: add competitive deep-dive for Joern and reorganize competitive folder

Move COMPETITIVE_ANALYSIS.md into generated/competitive/ and add a
comprehensive feature-by-feature comparison against joernio/joern
(our #1-ranked competitor). Covers parsing, graph model, query language,
performance, installation, AI/MCP integration, security analysis,
developer productivity, and ecosystem across 100+ individual features.
Update FOUNDATION.md reference to the new path.

* fix: update broken links to moved COMPETITIVE_ANALYSIS.md

README.md and docs/roadmap/BACKLOG.md still referenced the old path
at generated/COMPETITIVE_ANALYSIS.md after the file was moved to
generated/competitive/COMPETITIVE_ANALYSIS.md in #260.

* docs: add Joern-inspired feature candidates with BACKLOG-style grading

Append a new "Joern-Inspired Feature Candidates" section to the Joern
competitive deep-dive. Lists 11 actionable features extracted from
Parsing & Language Support, Graph Model & Analysis Depth, and Query
Language & Interface sections — assessed with the same tier/grading
system used in BACKLOG.md (zero-dep, foundation-aligned, problem-fit,
breaking).

Tier 1 non-breaking: call-chain slicing, type-informed resolution,
error-tolerant parsing, regex filtering, Kotlin, Swift, script execution.
Tier 1 breaking: expanded node/edge types, intraprocedural CFG, stored AST.
Not adopted: 9 features with FOUNDATION.md reasoning.
Cross-references BACKLOG IDs 14 and 7.
Add normalizeSymbol(row, db, hashCache) that returns a consistent
7-field symbol shape (name, kind, file, line, endLine, role, fileHash)
across all query and search commands.

Update queryNameData, fnDepsData, fnImpactData, explainFunctionImpl,
listFunctionsData, rolesData, whereSymbolImpl in queries.js and
searchData, multiSearchData, ftsSearchData, hybridSearchData in
embedder.js to use normalizeSymbol. Update SQL in listFunctionsData,
rolesData, iterListFunctions, iterRoles, _prepareSearch, and
ftsSearchData to include end_line and role columns.

Export normalizeSymbol from index.js. Add docs/json-schema.md
documenting the stable schema. Add 8 unit tests and 7 integration
schema conformance tests.

Impact: 13 functions changed, 33 affected

Impact: 14 functions changed, 42 affected
Add normalizeSymbol(row, db, hashCache) that returns a consistent
7-field symbol shape (name, kind, file, line, endLine, role, fileHash)
across all query and search commands.

Update queryNameData, fnDepsData, fnImpactData, explainFunctionImpl,
listFunctionsData, rolesData, whereSymbolImpl in queries.js and
searchData, multiSearchData, ftsSearchData, hybridSearchData in
embedder.js to use normalizeSymbol. Update SQL in listFunctionsData,
rolesData, iterListFunctions, iterRoles, _prepareSearch, and
ftsSearchData to include end_line and role columns.

Export normalizeSymbol from index.js. Add docs/json-schema.md
documenting the stable schema. Add 8 unit tests and 7 integration
schema conformance tests.

Impact: 13 functions changed, 33 affected

Impact: 14 functions changed, 42 affected

Impact: 13 functions changed, 21 affected
Re-evaluate all architectural recommendations against the actual
codebase as it grew from v1.4.0 (5K lines, 12 modules) to v2.6.0
(17,830 lines, 35 modules).

Architecture audit:
- Reprioritize: dual-function anti-pattern across 15 modules is now #1
  (was analysis/formatting split at #3)
- Downgrade parser plugin system from #1 to #20 (parser.js shrank to
  404 lines after native engine took over)
- Add 3 new recommendations: decompose complexity.js (2,163 lines),
  unified graph model for structure/cochange/communities, pagination
  standardization
- Update all metrics and line counts to current state

Roadmap:
- Add Phase 2.5 (Analysis Expansion) documenting 18 modules shipped
  across v2.0.0-v2.6.0 (complexity, communities, structure, flow,
  cochange, manifesto, boundaries, check, audit, batch, triage,
  hybrid search, owners, snapshot, etc.)
- Mark Phase 5.3 (Hybrid Search) as completed early in Phase 2.5
- Update Phase 3 priorities based on revised architecture analysis
- Update version to 2.6.0, language count to 11, phase count to 10
- Add Phase 8 note referencing check command foundation from 2.5
)

* docs: add competitive deep-dive for Joern and reorganize competitive folder

Move COMPETITIVE_ANALYSIS.md into generated/competitive/ and add a
comprehensive feature-by-feature comparison against joernio/joern
(our #1-ranked competitor). Covers parsing, graph model, query language,
performance, installation, AI/MCP integration, security analysis,
developer productivity, and ecosystem across 100+ individual features.
Update FOUNDATION.md reference to the new path.

* fix: update broken links to moved COMPETITIVE_ANALYSIS.md

README.md and docs/roadmap/BACKLOG.md still referenced the old path
at generated/COMPETITIVE_ANALYSIS.md after the file was moved to
generated/competitive/COMPETITIVE_ANALYSIS.md in #260.

* docs: add Joern-inspired feature candidates with BACKLOG-style grading

Append a new "Joern-Inspired Feature Candidates" section to the Joern
competitive deep-dive. Lists 11 actionable features extracted from
Parsing & Language Support, Graph Model & Analysis Depth, and Query
Language & Interface sections — assessed with the same tier/grading
system used in BACKLOG.md (zero-dep, foundation-aligned, problem-fit,
breaking).

Tier 1 non-breaking: call-chain slicing, type-informed resolution,
error-tolerant parsing, regex filtering, Kotlin, Swift, script execution.
Tier 1 breaking: expanded node/edge types, intraprocedural CFG, stored AST.
Not adopted: 9 features with FOUNDATION.md reasoning.
Cross-references BACKLOG IDs 14 and 7.

* docs: add competitive deep-dive for Narsil-MCP with feature candidates

Comprehensive comparison across 10 dimensions: parsing (32 vs 11
languages), graph model (CFG/DFG/type inference vs complexity/roles/
communities), search (similarity/chunking vs RRF hybrid), security
(147 rules vs none), queries (90 tools vs 21 + compound commands),
performance (cold start vs incremental), install, MCP integration,
developer productivity, and ecosystem.

Feature candidates section covers all comparison sections:
- Tier 1 non-breaking (10): MCP presets, AST chunking, code similarity,
  git blame/symbol history, remote repo indexing, config wizard, Kotlin,
  Swift, Bash, Scala language support
- Tier 1 breaking (1): export map per module
- Tier 2 (2): interactive HTML viz, multiple embedding backends
- Tier 3 (2): OWASP patterns, SBOM generation
- Not adopted (10): taint, type inference, SPARQL/RDF, CCG, in-memory
  arch, 90-tool surface, browser WASM, Forgemax, LSP, license scanning
- Cross-references to BACKLOG IDs 7, 8, 10, 14 and Joern candidates
  J4, J5, J8, J9
…se 2)

Build file→definition and parent→child contains edges, parameter_of
inverse edges, and receiver edges for method-call dispatch. Add
CORE_EDGE_KINDS, STRUCTURAL_EDGE_KINDS, EVERY_EDGE_KIND constants.
Exclude structural edges from moduleMapData coupling counts. Scope
directory contains-edge cleanup to preserve symbol-level edges.

Impact: 3 functions changed, 22 affected
Add show-diff-impact.sh that automatically runs
`codegraph diff-impact --staged -T` before git commit commands.
The hook injects blast radius info as additionalContext —
informational only, never blocks commits.
…#268)

* feat(export): add GraphML, GraphSON, Neo4j CSV formats and interactive HTML viewer

Add three new export formats for graph database interoperability:
- GraphML (XML standard) with file-level and function-level modes
- GraphSON (TinkerPop v3) for Gremlin/JanusGraph compatibility
- Neo4j CSV (bulk import) with separate nodes/relationships files

Add interactive HTML viewer (`codegraph plot`) powered by vis-network:
- Hierarchical, force, and radial layouts with physics toggle
- Node coloring by kind or role, search/filter, legend panel
- Configurable via .plotDotCfg JSON file

Update CLI export command, MCP export_graph tool, and programmatic API
to support all six formats.

Impact: 12 functions changed, 6 affected

* feat(plot): add drill-down, clustering, complexity overlays, and detail panel

Evolve the plot command from a static viewer into an interactive
exploration tool with rich data overlays and navigation.

Data preparation:
- Extract prepareGraphData() with complexity, fan-in/fan-out, Louvain
  community detection, directory derivation, and risk flag computation
- Seed strategies: all (default), top-fanin, entry

Interactive features:
- Detail sidebar: metrics, callers/callees lists, risk badges
- Drill-down: click-to-expand / double-click-to-collapse neighbors
- Clustering: community and directory grouping via vis-network API
- Color by: kind, role, community, complexity (MI-based borders)
- Size by: uniform, fan-in, fan-out, complexity
- Risk overlay: dead-code (dashed), high-blast-radius (shadow), low-MI

CLI options:
- --cluster, --overlay, --seed, --seed-count, --size-by, --color-by

Tests expanded from 7 to 21 covering all new data enrichment, seed
strategies, risk flags, UI elements, and config backward compatibility.

Impact: 5 functions changed, 3 affected

* fix(test): update MCP export_graph enum to include new formats

The previous commit added graphml, graphson, and neo4j export formats
to the MCP tool definition but did not update the test assertion.

* style: format mcp test after enum update

* fix(security): escape config values in HTML template to prevent XSS

Use JSON.stringify() for cfg.layout.direction, effectiveColorBy, and
cfg.clusterBy when interpolated into inline JavaScript. Replace shell
exec() with execFile() for browser-open to avoid path injection.

Impact: 1 functions changed, 1 affected
* feat(export): add GraphML, GraphSON, Neo4j CSV formats and interactive HTML viewer

Add three new export formats for graph database interoperability:
- GraphML (XML standard) with file-level and function-level modes
- GraphSON (TinkerPop v3) for Gremlin/JanusGraph compatibility
- Neo4j CSV (bulk import) with separate nodes/relationships files

Add interactive HTML viewer (`codegraph plot`) powered by vis-network:
- Hierarchical, force, and radial layouts with physics toggle
- Node coloring by kind or role, search/filter, legend panel
- Configurable via .plotDotCfg JSON file

Update CLI export command, MCP export_graph tool, and programmatic API
to support all six formats.

Impact: 12 functions changed, 6 affected

* feat(plot): add drill-down, clustering, complexity overlays, and detail panel

Evolve the plot command from a static viewer into an interactive
exploration tool with rich data overlays and navigation.

Data preparation:
- Extract prepareGraphData() with complexity, fan-in/fan-out, Louvain
  community detection, directory derivation, and risk flag computation
- Seed strategies: all (default), top-fanin, entry

Interactive features:
- Detail sidebar: metrics, callers/callees lists, risk badges
- Drill-down: click-to-expand / double-click-to-collapse neighbors
- Clustering: community and directory grouping via vis-network API
- Color by: kind, role, community, complexity (MI-based borders)
- Size by: uniform, fan-in, fan-out, complexity
- Risk overlay: dead-code (dashed), high-blast-radius (shadow), low-MI

CLI options:
- --cluster, --overlay, --seed, --seed-count, --size-by, --color-by

Tests expanded from 7 to 21 covering all new data enrichment, seed
strategies, risk flags, UI elements, and config backward compatibility.

Impact: 5 functions changed, 3 affected

* fix(test): update MCP export_graph enum to include new formats

The previous commit added graphml, graphson, and neo4j export formats
to the MCP tool definition but did not update the test assertion.

* style: format mcp test after enum update

* fix(security): escape config values in HTML template to prevent XSS

Use JSON.stringify() for cfg.layout.direction, effectiveColorBy, and
cfg.clusterBy when interpolated into inline JavaScript. Replace shell
exec() with execFile() for browser-open to avoid path injection.

Impact: 1 functions changed, 1 affected

* docs: add check-readme hook to recommended practices and guides

Document the new check-readme.sh hook across all three doc locations:
recommended-practices.md, ai-agent-guide.md, and the hooks example
README. Adds settings.json examples, hook behavior descriptions, and
customization entries.
* docs: add competitive deep-dive for Joern and reorganize competitive folder

Move COMPETITIVE_ANALYSIS.md into generated/competitive/ and add a
comprehensive feature-by-feature comparison against joernio/joern
(our #1-ranked competitor). Covers parsing, graph model, query language,
performance, installation, AI/MCP integration, security analysis,
developer productivity, and ecosystem across 100+ individual features.
Update FOUNDATION.md reference to the new path.

* fix: update broken links to moved COMPETITIVE_ANALYSIS.md

README.md and docs/roadmap/BACKLOG.md still referenced the old path
at generated/COMPETITIVE_ANALYSIS.md after the file was moved to
generated/competitive/COMPETITIVE_ANALYSIS.md in #260.

* docs: add Joern-inspired feature candidates with BACKLOG-style grading

Append a new "Joern-Inspired Feature Candidates" section to the Joern
competitive deep-dive. Lists 11 actionable features extracted from
Parsing & Language Support, Graph Model & Analysis Depth, and Query
Language & Interface sections — assessed with the same tier/grading
system used in BACKLOG.md (zero-dep, foundation-aligned, problem-fit,
breaking).

Tier 1 non-breaking: call-chain slicing, type-informed resolution,
error-tolerant parsing, regex filtering, Kotlin, Swift, script execution.
Tier 1 breaking: expanded node/edge types, intraprocedural CFG, stored AST.
Not adopted: 9 features with FOUNDATION.md reasoning.
Cross-references BACKLOG IDs 14 and 7.

* docs: add competitive deep-dive for Narsil-MCP with feature candidates

Comprehensive comparison across 10 dimensions: parsing (32 vs 11
languages), graph model (CFG/DFG/type inference vs complexity/roles/
communities), search (similarity/chunking vs RRF hybrid), security
(147 rules vs none), queries (90 tools vs 21 + compound commands),
performance (cold start vs incremental), install, MCP integration,
developer productivity, and ecosystem.

Feature candidates section covers all comparison sections:
- Tier 1 non-breaking (10): MCP presets, AST chunking, code similarity,
  git blame/symbol history, remote repo indexing, config wizard, Kotlin,
  Swift, Bash, Scala language support
- Tier 1 breaking (1): export map per module
- Tier 2 (2): interactive HTML viz, multiple embedding backends
- Tier 3 (2): OWASP patterns, SBOM generation
- Not adopted (10): taint, type inference, SPARQL/RDF, CCG, in-memory
  arch, 90-tool surface, browser WASM, Forgemax, LSP, license scanning
- Cross-references to BACKLOG IDs 7, 8, 10, 14 and Joern candidates
  J4, J5, J8, J9

* feat: add dedicated `exports <file>` command with per-symbol consumers

Implements feature N11 from the Narsil competitive analysis. The new
command provides a focused export map showing which symbols a file
exports and who calls each one, filling the gap between `explain`
(public/internal split without consumers) and `where --file` (just
export names).

Adds exportsData/fileExports to queries.js, CLI command, MCP tool,
batch support, programmatic API, and integration tests.

Impact: 7 functions changed, 15 affected

* feat: add scoped rebuild for parallel agent rollback

Extract purgeFilesFromGraph() from the inline deletion cascade in
buildGraph() for reuse. Add opts.scope and opts.noReverseDeps to
buildGraph() so agents can surgically rebuild only their changed files
without nuking other agents' graph state.

- `--scope <files...>` on `build` skips collectFiles/getChangedFiles
- `--no-reverse-deps` skips reverse-dep cascade (safe when exports unchanged)
- New `scoped_rebuild` MCP tool for multi-agent orchestration
- purgeFilesFromGraph exported from programmatic API
- Unit tests for purge function, integration tests for scoped rebuild
- Documented agent-level rollback workflow in titan-paradigm.md

Impact: 3 functions changed, 20 affected

* fix: remove leaked scoped_rebuild changes from another session

Reverts purgeFilesFromGraph export, --scope/--no-reverse-deps CLI
options, scoped_rebuild MCP tool+handler, and test list entry that
were accidentally included from a concurrent session's dirty worktree.

Impact: 2 functions changed, 1 affected

* fix: remove stale scoped-rebuild docs from titan-paradigm

The scoped_rebuild feature (--scope, --no-reverse-deps CLI options and
scoped_rebuild MCP tool) was removed in 651ddb2 but the documentation
in titan-paradigm.md still referenced it. Addresses Greptile review
feedback on PR #269.
Add opt-in CFG analysis that builds basic-block control flow graphs
from tree-sitter AST for individual functions. Enables complexity-aware
impact analysis and opens the path to dataflow (def-use chains).

- DB migration v12: cfg_blocks + cfg_edges tables
- New src/cfg.js module: CFG_RULES, buildFunctionCFG, buildCFGData,
  cfgData, cfgToDOT, cfgToMermaid, cfg CLI printer
- Builder integration: --cfg flag triggers CFG after complexity pass
- CLI: `cfg <name>` command with --format text/dot/mermaid, -j, --ndjson
- MCP: cfg tool with name, format, file, kind, pagination props
- Exports findFunctionNode from complexity.js for reuse
- 24 unit tests + 11 integration tests (35 total)

Phase 1: JS/TS/TSX only. Handles if/else, for/while/do-while, switch,
try/catch/finally, break/continue (with labels), return/throw.

Impact: 27 functions changed, 36 affected
…w, await)

Persist selected AST nodes in a dedicated ast_nodes SQLite table during
build, queryable via CLI (codegraph ast), MCP (ast_query), and
programmatic API.

- DB migration v13: ast_nodes table with indexes on kind, name, file,
  parent, and (kind,name)
- New src/ast.js module: buildAstNodes (extraction), astQueryData/
  astQuery (query), AST_NODE_KINDS constant
- Builder integration: full-rebuild deletion, incremental cleanup,
  always-on post-parse extraction (before complexity to preserve _tree)
- CLI: codegraph ast [pattern] with -k, -f, -T, -j, --ndjson,
  --limit, --offset options
- MCP: ast_query tool with pattern, kind, file, no_tests, pagination
- JS/TS/TSX Phase 1: full AST walk for new/throw/await/string/regex;
  all languages get call nodes from symbols.calls
- Pattern matching uses SQL GLOB with auto-wrapping for substring search
- Parent node resolution via narrowest enclosing definition

Impact: 12 functions changed, 26 affected
The comment incorrectly suggested this code path handled break inside
switch cases. It actually handles break with no enclosing loop/switch
context (invalid syntax) as a no-op.

Impact: 2 functions changed, 9 affected
Update tool names and counts to match actual MCP server output:
- query_function → query, fn_deps/symbol_path removed (merged into query)
- list_entry_points removed (merged into execution_flow)
- Add missing tools: ast_query, cfg, dataflow, symbol_children
- Fix count: 31 tools (32 in multi-repo mode)
…eat/cfg-intraprocedural

Impact: 2 functions changed, 16 affected
* feat: expand node types with parameter, property, constant kinds (Phase 1)

Add sub-declaration node extraction to all 9 WASM language extractors,
enabling structural queries like "which functions take a Request param?"
or "which classes have a userId field?" without reading source code.

Schema: migration v11 adds nullable parent_id column with indexes.
Builder: insertNode links children to parent via parent_id FK.
Extractors: JS/TS, Python, Go, Rust, Java, C#, Ruby, PHP, HCL now
emit children arrays for parameters, properties, and constants.
Queries: new childrenData() function, children in contextData output.
CLI: new `children` command, EVERY_SYMBOL_KIND validation on --kind.
MCP: new `symbol_children` tool, extended kind enum on all kind fields.
Constants: CORE_SYMBOL_KINDS (10), EXTENDED_SYMBOL_KINDS (3),
EVERY_SYMBOL_KIND (13). ALL_SYMBOL_KINDS preserved for backward compat.

Native Rust engine: Definition struct gains children field but actual
extraction is deferred to Phase 2 — WASM fallback handles new kinds.

Impact: 63 functions changed, 62 affected

* feat: add expanded edge types — contains, parameter_of, receiver (Phase 2)

Build file→definition and parent→child contains edges, parameter_of
inverse edges, and receiver edges for method-call dispatch. Add
CORE_EDGE_KINDS, STRUCTURAL_EDGE_KINDS, EVERY_EDGE_KIND constants.
Exclude structural edges from moduleMapData coupling counts. Scope
directory contains-edge cleanup to preserve symbol-level edges.

Impact: 3 functions changed, 22 affected

* fix(native): add missing children field to all Rust extractors

The Definition struct gained a children field but no extractor was
updated to include it, causing 50 compilation errors. Add children: None
to every Definition initializer across all 9 language extractors.
Also fix unused variable warnings in parser_registry.rs and parallel.rs.

Impact: 13 functions changed, 10 affected

* ci: trigger workflow re-run
@claude
Copy link

claude bot commented Mar 3, 2026

Claude finished @carlos-alm's task —— View job


PR Review Complete ✅

Review Checklist:

  • Phase 1: Root cause analysis - understand problem being solved
  • Phase 2: Configuration change detection (HIGH SCRUTINY) ✅
  • Phase 3: Test integrity verification ✅
  • Phase 4: Code quality assessment ✅
  • Final assessment and rating

Root Cause Analysis ✅

Problem Being Solved: This PR adds significant static analysis capabilities to codegraph:

  1. Expanded node types (parameter, property, constant) - enables tracking of finer-grained symbols beyond just functions/classes
  2. Expanded edge types (contains, parameter_of, receiver) - enables modeling structural relationships
  3. Stored queryable AST nodes - enables querying specific syntactic constructs (calls, new, literals, throws, awaits)
  4. Intraprocedural CFG - enables control flow analysis within functions

Why This Approach: These are legitimate feature additions that expand the tool's analytical capabilities. The changes appear to be net-new functionality rather than fixes to existing problems.

Configuration Change Detection ✅

NO CONCERNING CHANGES DETECTED:

  • ✅ No linting rule changes in biome.json
  • ✅ Only version bump in package.json (2.5.1 → 2.6.0)
  • ✅ No test timeout/coverage threshold modifications
  • ✅ No TypeScript/build config changes
  • ✅ No eslint-disable or rule bypass additions

Test Integrity ✅

STRONG TEST COVERAGE:

  • ✅ 5 new test files (1,579+ lines total)
  • ✅ Comprehensive unit tests for CFG (457 lines in tests/unit/cfg.test.js)
  • ✅ Extended kinds tested across all 9 languages (504 lines in tests/parsers/extended-kinds.test.js)
  • ✅ Integration tests for AST queries and CFG functionality
  • ✅ No weakened assertions or disabled tests found
  • ✅ Tests follow proper patterns with beforeAll, proper cleanup

Code Quality Assessment ✅

SECURITY & PERFORMANCE:

  • ✅ No unsafe SQL concatenation - uses parameterized queries throughout
  • ✅ Proper transaction handling in database operations
  • ✅ No eval/exec/Function usage detected
  • ✅ File path validation with safePath() function
  • ✅ Input truncation (TEXT_MAX = 200) prevents excessive memory usage
  • ✅ Graceful fallbacks when tables don't exist

DATABASE DESIGN:

  • ✅ Proper schema migrations (versions 11-13) with foreign keys and indexes
  • DELETE operations are scoped and safe (file-based cleanup)
  • ✅ Transaction-wrapped bulk operations
  • ✅ Backward compatibility maintained with existing tables

CODE ORGANIZATION:

  • ✅ Well-structured modules with clear responsibilities
  • ✅ Comprehensive error handling and logging
  • ✅ Proper separation of build-time vs query-time functions
  • ✅ Export format support (JSON, DOT, Mermaid)

Minor Observations:

  1. Large PR scope (17 files, 2,771 additions) - could have been split into smaller PRs
  2. CFG currently JS/TS/TSX only - documented limitation for Phase 1
  3. AST node collection has language-specific limitations - only full AST walk for JS/TS/TSX

Root Cause Analysis

Problem Being Solved: Adding advanced static analysis capabilities (finer-grained symbol tracking, structural relationships, queryable AST nodes, control flow analysis)
Why This Approach: Legitimate feature expansion using established patterns and robust database design
Risk Assessment: Low risk - well-tested, secure implementation with proper fallbacks

Critical Concerns

None identified. This is a substantial but well-engineered feature addition.

Final Recommendation

  • Rating: ⭐⭐⭐⭐☆ (4/5)
  • Action: APPROVE WITH CONDITIONS
  • Reasoning: High-quality implementation with comprehensive test coverage and no security/configuration concerns. The large scope is the only significant concern - future similar PRs should be split into smaller chunks for easier review.

Approval Conditions:

  • Verify npm test passes before merge
  • Consider documenting the new CLI commands (ast-query, cfg) in user-facing documentation

@greptile-apps
Copy link

greptile-apps bot commented Mar 3, 2026

Greptile Summary

This PR adds three interconnected static analysis features to codegraph:

1. AST Node Storage (src/ast.js) - Always-on extraction of queryable AST nodes (calls, new, string/regex literals, throw, await) stored in the ast_nodes table. Accessible via codegraph ast CLI command and ast_query MCP tool with GLOB pattern matching.

2. Intraprocedural CFG (src/cfg.js) - Opt-in per-function control flow graph construction supporting if/else, loops, switch, try/catch/finally, and labeled break/continue. Outputs JSON/DOT/Mermaid formats via codegraph cfg CLI and cfg MCP tool.

3. Expanded Node Types - Added parameter, property, and constant symbol kinds plus new edge types (contains, parameter_of, receiver) for richer graph structure.

Implementation Quality:

  • Clean separation between build-time extraction and query-time retrieval
  • Proper SQL parameterization preventing injection
  • Safe memory management (AST extraction before complexity releases tree references)
  • Two new DB migrations (v12 for CFG, v13 for AST) with proper foreign keys and indexes
  • Comprehensive test suite: 1,579 lines across 5 new test files covering unit, integration, and parser levels
  • Previous cleanup issue (missing CFG table deletion in full rebuild) has been resolved

Integration:

  • CFG is opt-in via --cfg flag to avoid build overhead
  • AST extraction is always-on (minimal cost, high value)
  • Clean CLI/MCP tool additions matching existing patterns
  • Documentation updated for new tools and consolidated MCP reference

Confidence Score: 5/5

  • Safe to merge with no critical issues found
  • Well-architected implementation with comprehensive test coverage, proper SQL parameterization, safe memory management, and clean integration into existing codebase. Previous cleanup issue has been addressed. All 17 files reviewed show solid engineering practices
  • No files require special attention

Important Files Changed

Filename Overview
src/ast.js New file implementing AST node storage and querying. Well-structured with proper SQL parameterization, clean separation between build and query phases, and comprehensive extraction for JS/TS/TSX
src/cfg.js New intraprocedural CFG with solid algorithm design. Handles complex control flow correctly with proper block/edge creation and multiple output formats
src/builder.js Clean integration of AST and CFG into build pipeline. Proper cleanup in full rebuild and purge paths. Previous CFG cleanup issue resolved
src/db.js Added migrations v12 (CFG tables) and v13 (AST nodes) with proper schema, foreign keys, and indexes
src/cli.js Added cfg and ast commands with comprehensive options. Clean integration matching existing command patterns
src/mcp.js Added cfg and ast_query MCP tools with proper schemas, pagination limits, and format support
tests/unit/cfg.test.js Comprehensive CFG unit tests (457 lines) covering all control flow constructs with clear assertions
tests/integration/cfg.test.js Integration tests for CFG queries with fixture DB. Tests data retrieval and export formats
tests/integration/ast.test.js Integration tests for AST queries. Tests pattern matching, filtering, and pagination with fixture data

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    Start([Build Process Start]) --> Parse[Parse Files with tree-sitter]
    Parse --> Extract[Extract Symbols & Calls]
    Extract --> Resolve[Resolve Imports]
    Resolve --> StoreNodes[Store nodes & edges in DB]
    
    StoreNodes --> AST[AST Node Extraction]
    AST --> ASTWalk[Walk JS/TS/TSX ASTs]
    ASTWalk --> ASTStore[(Store in ast_nodes table)]
    ASTStore --> Complexity
    
    StoreNodes --> Complexity[Compute Complexity Metrics]
    Complexity --> CFGCheck{--cfg flag?}
    
    CFGCheck -->|Yes| CFGBuild[Build CFG per function]
    CFGCheck -->|No| DataflowCheck
    
    CFGBuild --> CFGAlgo[buildFunctionCFG algorithm]
    CFGAlgo --> CFGBlocks[Create blocks: entry, exit, conditions, loops]
    CFGBlocks --> CFGEdges[Create edges: fallthrough, branch, loop_back, return]
    CFGEdges --> CFGStore[(Store in cfg_blocks & cfg_edges)]
    CFGStore --> DataflowCheck
    
    DataflowCheck{--dataflow flag?} -->|Yes| Dataflow[Extract Data Flow]
    DataflowCheck -->|No| Complete
    Dataflow --> Complete([Build Complete])
    
    style AST fill:#e1f5ff
    style CFGBuild fill:#fff4e1
    style ASTStore fill:#d4edda
    style CFGStore fill:#d4edda
Loading

Last reviewed commit: 8a0b8cf

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

17 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

src/builder.js Outdated
if (isFullBuild) {
const deletions =
'PRAGMA foreign_keys = OFF; DELETE FROM node_metrics; DELETE FROM edges; DELETE FROM function_complexity; DELETE FROM dataflow; DELETE FROM nodes; PRAGMA foreign_keys = ON;';
'PRAGMA foreign_keys = OFF; DELETE FROM node_metrics; DELETE FROM edges; DELETE FROM function_complexity; DELETE FROM dataflow; DELETE FROM ast_nodes; DELETE FROM nodes; PRAGMA foreign_keys = ON;';
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing DELETE FROM cfg_edges and DELETE FROM cfg_blocks in full rebuild cleanup, which will leave orphaned CFG data in the database.

Suggested change
'PRAGMA foreign_keys = OFF; DELETE FROM node_metrics; DELETE FROM edges; DELETE FROM function_complexity; DELETE FROM dataflow; DELETE FROM ast_nodes; DELETE FROM nodes; PRAGMA foreign_keys = ON;';
'PRAGMA foreign_keys = OFF; DELETE FROM cfg_edges; DELETE FROM cfg_blocks; DELETE FROM node_metrics; DELETE FROM edges; DELETE FROM function_complexity; DELETE FROM dataflow; DELETE FROM ast_nodes; DELETE FROM nodes; PRAGMA foreign_keys = ON;';

The full rebuild DELETE chain was missing the two CFG tables,
which would leave orphaned CFG data after a fresh build.

Impact: 1 functions changed, 0 affected
@carlos-alm
Copy link
Contributor Author

Fixed the Greptile review comment in 8a0b8cf: added DELETE FROM cfg_edges and DELETE FROM cfg_blocks to the full rebuild cleanup chain in builder.js:560. The incremental rebuild path already handled per-file CFG cleanup correctly (lines 408, 416).

@greptileai

Keep cfg_edges and cfg_blocks in full rebuild cleanup (our fix
from Greptile review); main didn't have these yet.
@claude
Copy link

claude bot commented Mar 3, 2026

Claude finished @carlos-alm's task —— View job


PR Review Complete ✅

Review Checklist:

  • Phase 1: Root cause analysis - understand problem being solved
  • Phase 2: Configuration change detection (HIGH SCRUTINY) ✅
  • Phase 3: Test integrity verification ✅
  • Phase 4: Code quality assessment ✅
  • Final assessment and rating

Root Cause Analysis ✅

Problem Being Solved: This PR adds significant static analysis capabilities to codegraph:

  1. Expanded node types (parameter, property, constant) - enables tracking of finer-grained symbols beyond just functions/classes
  2. Expanded edge types (contains, parameter_of, receiver) - enables modeling structural relationships
  3. Stored queryable AST nodes - enables querying specific syntactic constructs (calls, new, literals, throws, awaits)
  4. Intraprocedural CFG - enables control flow analysis within functions

Why This Approach: These are legitimate feature additions that expand the tool's analytical capabilities. The changes appear to be net-new functionality rather than fixes to existing problems.

Configuration Change Detection ✅

NO CONCERNING CHANGES DETECTED:

  • ✅ No linting rule changes in biome.json
  • ✅ Only version bump in package.json (2.5.1 → 2.6.0)
  • ✅ No test timeout/coverage threshold modifications
  • ✅ No TypeScript/build config changes
  • ✅ No eslint-disable or rule bypass additions

Test Integrity ✅

STRONG TEST COVERAGE:

  • ✅ 5 new test files (1,579+ lines total)
  • ✅ Comprehensive unit tests for CFG (457 lines in tests/unit/cfg.test.js)
  • ✅ Extended kinds tested across all 9 languages (504 lines in tests/parsers/extended-kinds.test.js)
  • ✅ Integration tests for AST queries and CFG functionality
  • ✅ No weakened assertions or disabled tests found
  • ✅ Tests follow proper patterns with beforeAll, proper cleanup

Code Quality Assessment ✅

SECURITY & PERFORMANCE:

  • ✅ No unsafe SQL concatenation - uses parameterized queries throughout
  • ✅ Proper transaction handling in database operations
  • ✅ No eval/exec/Function usage detected
  • ✅ File path validation with safePath() function
  • ✅ Input truncation (TEXT_MAX = 200) prevents excessive memory usage
  • ✅ Graceful fallbacks when tables don't exist

DATABASE DESIGN:

  • ✅ Proper schema migrations (versions 11-13) with foreign keys and indexes
  • DELETE operations are scoped and safe (file-based cleanup)
  • ✅ Transaction-wrapped bulk operations
  • ✅ Backward compatibility maintained with existing tables

CODE ORGANIZATION:

  • ✅ Well-structured modules with clear responsibilities
  • ✅ Comprehensive error handling and logging
  • ✅ Proper separation of build-time vs query-time functions
  • ✅ Export format support (JSON, DOT, Mermaid)

Minor Observations:

  1. Large PR scope (17 files, 2,771 additions) - could have been split into smaller PRs
  2. CFG currently JS/TS/TSX only - documented limitation for Phase 1
  3. AST node collection has language-specific limitations - only full AST walk for JS/TS/TSX

Root Cause Analysis

Problem Being Solved: Adding advanced static analysis capabilities (finer-grained symbol tracking, structural relationships, queryable AST nodes, control flow analysis)
Why This Approach: Legitimate feature expansion using established patterns and robust database design
Risk Assessment: Low risk - well-tested, secure implementation with proper fallbacks

Critical Concerns

None identified. This is a substantial but well-engineered feature addition.

Final Recommendation

  • Rating: ⭐⭐⭐⭐☆ (4/5)
  • Action: APPROVE WITH CONDITIONS
  • Reasoning: High-quality implementation with comprehensive test coverage and no security/configuration concerns. The large scope is the only significant concern - future similar PRs should be split into smaller chunks for easier review.

Approval Conditions:

  • Verify npm test passes before merge
  • Consider documenting the new CLI commands (ast-query, cfg) in user-facing documentation

@carlos-alm carlos-alm force-pushed the feat/ast-cfg-intraprocedural branch from 14cebe5 to 0a631ae Compare March 3, 2026 06:04
@claude
Copy link

claude bot commented Mar 3, 2026

Claude finished @carlos-alm's task —— View job


PR Review Complete ✅

Review Checklist:

  • Phase 1: Root cause analysis - understand problem being solved
  • Phase 2: Configuration change detection (HIGH SCRUTINY) ✅
  • Phase 3: Test integrity verification ✅
  • Phase 4: Code quality assessment ✅
  • Final assessment and rating

Root Cause Analysis ✅

Problem Being Solved: This PR adds significant static analysis capabilities to codegraph:

  1. Expanded node types (parameter, property, constant) - enables tracking of finer-grained symbols beyond just functions/classes
  2. Expanded edge types (contains, parameter_of, receiver) - enables modeling structural relationships
  3. Stored queryable AST nodes - enables querying specific syntactic constructs (calls, new, literals, throws, awaits)
  4. Intraprocedural CFG - enables control flow analysis within functions

Why This Approach: These are legitimate feature additions that expand the tool's analytical capabilities. The changes appear to be net-new functionality rather than fixes to existing problems.

Configuration Change Detection ✅

NO CONCERNING CHANGES DETECTED:

  • ✅ No linting rule changes in biome.json
  • ✅ Only version bump in package.json (2.5.1 → 2.6.0)
  • ✅ No test timeout/coverage threshold modifications
  • ✅ No TypeScript/build config changes
  • ✅ No eslint-disable or rule bypass additions

Test Integrity ✅

STRONG TEST COVERAGE:

  • ✅ 5 new test files (1,579+ lines total)
  • ✅ Comprehensive unit tests for CFG (457 lines in tests/unit/cfg.test.js)
  • ✅ Extended kinds tested across all 9 languages (504 lines in tests/parsers/extended-kinds.test.js)
  • ✅ Integration tests for AST queries and CFG functionality
  • ✅ No weakened assertions or disabled tests found
  • ✅ Tests follow proper patterns with beforeAll, proper cleanup

Code Quality Assessment ✅

SECURITY & PERFORMANCE:

  • ✅ No unsafe SQL concatenation - uses parameterized queries throughout
  • ✅ Proper transaction handling in database operations
  • ✅ No eval/exec/Function usage detected
  • ✅ File path validation with safePath() function
  • ✅ Input truncation (TEXT_MAX = 200) prevents excessive memory usage
  • ✅ Graceful fallbacks when tables don't exist

DATABASE DESIGN:

  • ✅ Proper schema migrations (versions 11-13) with foreign keys and indexes
  • DELETE operations are scoped and safe (file-based cleanup)
  • ✅ Transaction-wrapped bulk operations
  • ✅ Backward compatibility maintained with existing tables

CODE ORGANIZATION:

  • ✅ Well-structured modules with clear responsibilities
  • ✅ Comprehensive error handling and logging
  • ✅ Proper separation of build-time vs query-time functions
  • ✅ Export format support (JSON, DOT, Mermaid)

Minor Observations:

  1. Large PR scope (17 files, 2,771 additions) - could have been split into smaller PRs
  2. CFG currently JS/TS/TSX only - documented limitation for Phase 1
  3. AST node collection has language-specific limitations - only full AST walk for JS/TS/TSX

Root Cause Analysis

Problem Being Solved: Adding advanced static analysis capabilities (finer-grained symbol tracking, structural relationships, queryable AST nodes, control flow analysis)
Why This Approach: Legitimate feature expansion using established patterns and robust database design
Risk Assessment: Low risk - well-tested, secure implementation with proper fallbacks

Critical Concerns

None identified. This is a substantial but well-engineered feature addition.

Final Recommendation

  • Rating: ⭐⭐⭐⭐☆ (4/5)
  • Action: APPROVE WITH CONDITIONS
  • Reasoning: High-quality implementation with comprehensive test coverage and no security/configuration concerns. The large scope is the only significant concern - future similar PRs should be split into smaller chunks for easier review.

Approval Conditions:

  • Verify npm test passes before merge
  • Consider documenting the new CLI commands (ast-query, cfg) in user-facing documentation

@carlos-alm carlos-alm merged commit 0a38eac into main Mar 3, 2026
16 checks passed
@carlos-alm carlos-alm deleted the feat/ast-cfg-intraprocedural branch March 3, 2026 06:23
@github-actions github-actions bot locked and limited conversation to collaborators Mar 3, 2026
Keep normalizeSymbol spread usage from feature branch;
main had inlined the same fields that normalizeSymbol produces.

Impact: 43 functions changed, 42 affected
…se 1)

Add sub-declaration node extraction to all 9 WASM language extractors,
enabling structural queries like "which functions take a Request param?"
or "which classes have a userId field?" without reading source code.

Schema: migration v11 adds nullable parent_id column with indexes.
Builder: insertNode links children to parent via parent_id FK.
Extractors: JS/TS, Python, Go, Rust, Java, C#, Ruby, PHP, HCL now
emit children arrays for parameters, properties, and constants.
Queries: new childrenData() function, children in contextData output.
CLI: new `children` command, EVERY_SYMBOL_KIND validation on --kind.
MCP: new `symbol_children` tool, extended kind enum on all kind fields.
Constants: CORE_SYMBOL_KINDS (10), EXTENDED_SYMBOL_KINDS (3),
EVERY_SYMBOL_KIND (13). ALL_SYMBOL_KINDS preserved for backward compat.

Native Rust engine: Definition struct gains children field but actual
extraction is deferred to Phase 2 — WASM fallback handles new kinds.

Impact: 63 functions changed, 62 affected
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant