Provides patterns and build helpers for Zig-Python interoperability and bindings.

Install

mkdir -p .claude/skills/pyzig && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/4577" && unzip -o skill.zip -d .claude/skills/pyzig && rm skill.zip

Installs to .claude/skills/pyzig

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

How the Zig↔Python binding layer works (pyzig), including build-on-import, wrapper generation patterns, ownership rules, and where to add new exported APIs. Use when adding Zig-Python bindings, modifying native extensions, or debugging C-API interactions.
255 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

Key capabilities

  • Manages C-API interaction surface between Zig and Python
  • Automates build-on-import wrapper generation
  • Handles global type-object registration for heap types
  • Provides utilities for stub (.pyi) generation

How it works

It hooks into the import lifecycle to trigger the Zig build system, which manages the CPython C-API translation and memory ownership of wrapper objects.

Inputs & outputs

You give it
Zig source file or binding definition
You get back
Compiled Python extension module

When to use pyzig

  • Create new Zig-Python binding
  • Debug C-API interaction errors
  • Rebuild native extension stubs

About this skill

Pyzig Module

pyzig is the Zig↔Python interoperability layer used by Faebryk’s native modules (graph, sexp, faebryk typegraph, …).

There are three distinct layers to keep straight:

  • Python loader/glue: src/faebryk/core/zig/__init__.py (build-on-import + .pyi syncing)
  • Zig build: src/faebryk/core/zig/build.zig (builds pyzig.so + pyzig_sexp.so, generates stubs)
  • Zig binding utilities: src/faebryk/core/zig/src/pyzig/* (wrapper generation + minimal C-API surface)

Quick Start

ato dev compile
python -c "import faebryk.core.zig; import faebryk.core.graph"

Relevant Files

  • Python-side loader/build glue:
    • src/faebryk/core/zig/__init__.py (ZIG_NORECOMPILE, ZIG_RELEASEMODE, lock, stub syncing)
  • Zig build + stub generation:
    • src/faebryk/core/zig/build.zig (builds extensions + runs .pyi generator)
  • Core pyzig utilities:
    • src/faebryk/core/zig/src/pyzig/pybindings.zig (minimal CPython C-API declarations)
    • src/faebryk/core/zig/src/pyzig/pyzig.zig (wrapper generation helpers)
    • src/faebryk/core/zig/src/pyzig/type_registry.zig (global type-object registry)
    • src/faebryk/core/zig/src/pyzig/pyi.zig (stub generation helpers)
  • Example consumers:
    • src/faebryk/core/zig/src/python/graph/graph_py.zig
    • src/faebryk/core/zig/src/python/sexp/sexp_py.zig

Dependants (Call Sites)

  • Graph bindings: src/faebryk/core/zig/src/python/graph/*
  • Sexp bindings: src/faebryk/core/zig/src/python/sexp/*
  • TypeGraph bindings: src/faebryk/core/zig/src/python/faebryk/* (and friends)

How to Work With / Develop / Test

Core Concepts

  • Direct binding: pyzig calls the CPython C-API directly (no cffi/ctypes).
  • Wrapper types: most exposed Zig structs become Python heap types via wrap_in_python(...) / wrap_in_python_simple(...).
  • Global type registry: prevents re-creating Python PyTypeObjects for the same Zig type (type_registry).
  • No direct __init__ (by default): many “reference” types are not meant to be user-constructed; pyzig often installs an init that raises.
  • Debug handle: generated wrappers include __zig_address__() to help debug pointer identity.

Development Workflow

  1. Edit Zig:
    • binding helpers: src/faebryk/core/zig/src/pyzig/*
    • module wrappers: src/faebryk/core/zig/src/python/**
  2. Rebuild native modules:
    • ato dev compile (imports faebryk.core.zig; editable installs compile-on-import)
    • set ZIG_RELEASEMODE=ReleaseFast|ReleaseSafe|Debug as needed
  3. If you changed stubs/output:
    • ensure src/faebryk/core/zig/gen/** gets updated (this is driven by src/faebryk/core/zig/__init__.py)

Testing

  • Smoke tests are usually through downstream modules:
    • python -m faebryk.core.graph (GraphView allocation/cleanup stress)
    • ato dev test --llm test/core/solver (heavy user of graph + bindings via many subsystems)

Best Practices

  • Assume mistakes segfault: treat changes here like unsafe systems programming.
  • Be explicit about ownership:
    • if a wrapper allocates Zig memory, define how it is freed (explicit .destroy() vs tp_dealloc calling .deinit()).
    • if you duplicate input buffers (sexp does), expose a free(...) path and document it.
  • Don’t rely on Python GC for Zig arenas unless you intentionally installed a tp_dealloc that calls deinit.
  • Stub hygiene matters: keep the .pyi surface accurate; many callers rely on types for navigation.

Build-on-import behavior (important)

src/faebryk/core/zig/__init__.py is responsible for:

  • compiling extensions in editable installs (unless ZIG_NORECOMPILE=1)
  • loading pyzig.so and pyzig_sexp.so from src/faebryk/core/zig/zig-out/lib/
  • copying + formatting generated .pyi files into src/faebryk/core/zig/gen/** (black + ruff)

When not to use it

  • Projects not requiring native performance bindings
  • When C-API complexity exceeds binding capabilities

Prerequisites

Zig toolchain installedPython development headers

Limitations

  • Requires knowledge of CPython memory management
  • Build-time overhead during development

How it compares

It eliminates the need for manual CFFI/ctypes definitions by using direct C-API bindings generated at build time.

Compared to similar skills

pyzig side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
pyzig (this skill)16moReviewAdvanced
python-pro234moNo flagsAdvanced
add-new-setting-field17moNo flagsIntermediate
generating-rest-apis027dReviewAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

python-pro

sickn33

Master Python 3.12+ with modern features, async programming, performance optimization, and production-ready practices. Expert in the latest Python ecosystem including uv, ruff, pydantic, and FastAPI. Use PROACTIVELY for Python development, optimization, or advanced Python patterns.

2358

add-new-setting-field

tsukumijima

【設定追加時は必ず参照】KonomiTV に新しい設定 (v-switch/v-select など) を追加する際の必須手順。SettingsStore.ts / Settings.ts / config.py / Settings/*.vue への追加が必要

12

generating-rest-apis

jeremylongshore

Generate complete REST API implementations from OpenAPI specifications or database schemas. Use when generating RESTful API implementations. Trigger with phrases like "generate REST API", "create RESTful API", or "build REST endpoints".

02

r-code

dslc-io

Guide for writing R code. Use when writing new functions, designing APIs, or reviewing/modifying existing R code.

00

jx

jpsca

Use this skill for anything Jx — the Python/Jinja2 component library. Covers BOTH (a) library mechanics and integration AND (b) authoring production-ready UI components. Trigger this skill on any mention of Jx, `.jx` files, "Jinja components" in a Python web app context, or requests to build/create

00

vyper-compiler

vyperlang

Vyper smart contract compiler internals. Use when working on the Vyper compiler codebase — compilation pipeline, Venom IR, semantic analysis, code generation, testing, or contributing. Triggers on vyper compiler development, Venom passes, AST/semantics changes, codegen work, or test writing.

00

Search skills

Search the agent skills registry