faebryk
community[skill]
How Faebryk's TypeGraph works (GraphView + Zig edges), how to traverse/resolve references, and how FabLL types/traits map onto edge types. Use when working with TypeGraph traversal, edge types, or building type-aware queries.
$
/plugin install atopiledetails
Faebryk Core Module
The Faebryk core here is the TypeGraph + edge types implemented in Zig and exposed to Python via faebryk.core.faebrykpy.
Source-of-truth for API + behavior:
src/faebryk/core/faebrykpy.py(Python-facing wrapper + type-safeEdgeTrait.traverse)src/faebryk/core/zig/gen/faebryk/typegraph.pyi(public stubbed API surface)src/faebryk/core/zig/src/faebryk/*(Zig implementation)
Quick Start
import faebryk.core.faebrykpy as fbrk
import faebryk.core.graph as graph
g = graph.GraphView.create()
tg = fbrk.TypeGraph.create(g=g)
Relevant Files
src/faebryk/core/faebrykpy.py(re-exports +EdgeTraversal+ type-safeEdgeTrait.traverse)src/faebryk/core/zig/gen/faebryk/typegraph.pyi(TypeGraph stub)- Key edge types (imported by
faebrykpy.py):EdgeComposition(parent/child structure)EdgeTrait/Trait(trait attachment)EdgePointer(references)EdgeInterfaceConnection(interface connections)EdgeOperand(solver operand wiring)EdgeType/EdgeNext(type graph plumbing)
- Linker:
Linker(used by compiler/linking stages)
Dependants (Call Sites)
- FabLL:
src/faebryk/core/node.py(binds Python classes into the TypeGraph; uses composition/trait edges) - Compiler:
src/atopile/compiler/*(creates and links TypeGraphs) - Solver:
src/faebryk/core/solver/*(operand edges and instance traversal) - Build/export pipeline:
src/atopile/build_steps.py(visits type/instance edges for PCB/layout features)
How to Work With / Develop / Test
Core Concepts
- GraphView + TypeGraph: a
TypeGraphis created against aGraphView:import faebryk.core.graph as graph import faebryk.core.faebrykpy as fbrk g = graph.GraphView.create() tg = fbrk.TypeGraph.create(g=g) - Type nodes vs instance nodes:
- TypeGraph stores type definitions (“what exists structurally on a type”)
- GraphView also holds instances created from those types (“a concrete design graph”)
- EdgeTraversal:
TypeGraph.ensure_child_reference(..., path=[...])usesEdgeTraversalitems to walk references through the type graph.
Development Workflow
- Zig-side changes: edit
src/faebryk/core/zig/src/faebryk/*(edges, typegraph internals). - Rebuild bindings:
ato dev compile(importsfaebryk.core.zig). - Python ergonomics: add wrappers/helpers in
src/faebryk/core/faebrykpy.py(example: type-safeEdgeTrait.traverse).
Testing
- TypeGraph-heavy tests live in compiler/runtime suites:
ato dev test --llm test/compiler/test_typegraph.py -qato dev test --llm test/compiler/test_runtime.py -q
- Zig-backed traversal tests:
ato dev test --llm test/core/zig/test_interface_pathfinder.py -q
Best Practices
- Import edges/TypeGraph via
faebryk.core.faebrykpy(so callers get Python helpers, not just raw generated types). - Prefer type-safe trait traversal:
EdgeTrait.traverse(trait_type=SomeTrait)over stringly-typedtrait_type_name=....
- When building reference paths, be explicit about edge semantics (composition vs pointer vs trait) rather than relying on implicit string behavior.
technical
- github
- atopile/atopile
- stars
- 3177
- license
- MIT
- contributors
- 41
- last commit
- 2026-04-03T20:56:37Z
- file
- .claude/skills/faebryk/SKILL.md