This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
Build & Development:
bun run build- Build package using tsup (ESM format with TypeScript declarations)bun run format- Format code using Biomebun test- Run tests using Bun's built-in test runnerbun test <file-pattern>- Run specific testsbunx tsc --noEmit- Typecheck the project
@tscircuit/core is a React-based circuit design system that converts React components into Circuit JSON, which renders as PCB layouts, schematic diagrams, and 3D models.
- Normal Components: Electronic components (resistors, capacitors, chips, etc.) in
lib/components/normal-components/ - Primitive Components: Low-level elements (traces, holes, ports, silkscreen, etc.) in
lib/components/primitive-components/ - Base Components: Abstract classes
RenderableandNormalComponentinlib/components/base-components/
The system uses a 42-phase rendering pipeline:
- React subtree rendering
- Source component creation
- Schematic layout and rendering
- PCB layout and routing
- 3D CAD model generation
Components implement specific phase methods like doInitialSourceRender(), doInitialSchematicComponentRender(), doInitialPcbComponentRender().
lib/fiber/- React reconciler integration for JSX-to-class-instance conversionlib/utils/autorouting/- PCB trace routing algorithmslib/utils/schematic/- Schematic layout utilitieslib/utils/edit-events/- Manual editing systemlib/sel/- CSS-like selector system for component querying
Uses Bun's native test runner with extensive snapshot testing:
const { circuit } = getTestFixture()
circuit.add(
<board>
<resistor name="R1" />
</board>
)
circuit.render()
expect(circuit).toMatchPcbSnapshot(import.meta.path)Test Structure:
- Tests in
tests/organized by component type - Generates
.snap.svgfiles for visual regression testing - Supports both PCB and schematic view snapshots
- Special categories: examples, features, repros, subcircuits
BUN_UPDATE_SNAPSHOTS=1 bun test path/to/file.test.tsto update snapshots- Only one test per file, otherwise split into multiple enumerated files e.g.
fn1.test.ts,fn2.test.ts, etc.
Creating New Components:
- Define props using @tscircuit/props package
- Extend
NormalComponentorPrimitiveComponent - Implement required render phase methods
- Add to component catalogue in
lib/fiber/catalogue.ts - Write comprehensive tests with snapshot comparisons
Selector System:
circuit.selectAll(".R1 > .pin1") // Find pin1 of resistor R1
circuit.selectOne("resistor") // Find first resistorBreaking up class files:
- If a class function is too long, create a file
ClassName_fnName.tsand call the function from the class file
- React + custom React Reconciler
- TypeScript (strict mode, ESNext target)
- Zod for prop validation
- circuit-json ecosystem for data interchange
- Biome for formatting/linting
- External services: @tscircuit/footprinter, @tscircuit/capacity-autorouter
- ESM output with TypeScript declarations
- Path mapping for
lib/*imports - Biome enforces kebab-case file naming, space indentation, double quotes for JSX